TBD
# Installing dependencies
forge install
# Testing
forge test
This project centers around 1 key smart contract and three types of smart contracts: PredyPool, Settlement, Market, and Order Validator. The Settlement contract defines how to swap tokens, while the Market and Order Validator contracts define financial products and order types. Markets can leverage positions by utilizing PredyPool for token lending and borrowing.
This architecture is very scalable. For example, developers can create new futures exchanges with minimal code. Specifically, they gain leverage by connecting to PredyPool. By leveraging existing settlement contracts, they can access many liquidity sources and support multiple order types through order validators.
Short ETH(Base token) flow.
sequenceDiagram
autonumber
Market->>PredyPool: trade(tradeParams, settlementData)
activate PredyPool
PredyPool->>Market: predySettlementCallback(data, baseAmount)
activate Market
Market->>PredyPool: take(to, baseAmount)
activate PredyPool
PredyPool-->>Market:
deactivate PredyPool
Market->>UniswapSettlement: swapExactIn(data, baseAmount)
activate UniswapSettlement
UniswapSettlement ->> SwapRouter: exactInput(baseAmount)
SwapRouter -->> UniswapSettlement: quoteAmountOut
UniswapSettlement ->> USDC: transfer(to=PredyPool, quoteAmountOut)
USDC -->> UniswapSettlement:
UniswapSettlement-->>Market:
deactivate UniswapSettlement
Market -->> PredyPool:
deactivate Market
PredyPool->>Market: predyTradeAfterCallback(tradeParams, tradeResult)
activate Market
Market-->>PredyPool:
deactivate Market
PredyPool-->>Market:
deactivate PredyPool
Limit order flow of PerpMarket.
sequenceDiagram
autonumber
actor Trader
actor Filler
Trader->>Filler: eip712 signedOrder
Filler->>PerpMarket: executeOrder(signedOrder, settlementData)
activate PerpMarket
PerpMarket->>Permit2: permitWitnessTransferFrom
Permit2-->>PerpMarket:
PerpMarket->>PredyPool: trade(tradeParams, settlementData)
activate PredyPool
PredyPool-->>PerpMarket: returns tradeResult
deactivate PredyPool
PerpMarket->>LimitOrderValidator: validate(tradeAmount, tradeAmountSqrt, tradeResult)
activate LimitOrderValidator
LimitOrderValidator-->>PerpMarket:
deactivate LimitOrderValidator
PerpMarket-->>Filler: tradeResult
deactivate PerpMarket
Filler-->>Trader:
Market order flow of SpotMarket.
sequenceDiagram
autonumber
actor Trader
actor Filler
Trader->>Filler: eip712 signedOrder
Filler ->> SpotMarket: executeOrder(signedOrder, settlementData)
activate SpotMarket
SpotMarket ->> Permit2: permitWitnessTransferFrom
activate Permit2
Permit2 -->> SpotMarket:
deactivate Permit2
SpotMarket ->> Settlement: swapExactIn(settlementData, baseTokenAmount)
activate Settlement
Settlement -->> SpotMarket:
deactivate Settlement
SpotMarket ->> DutchOrderValidator: validate(baseTradeAmount, quoteTokenAmount, validationData)
activate DutchOrderValidator
DutchOrderValidator -->> SpotMarket:
deactivate DutchOrderValidator
SpotMarket -->> Filler:
deactivate SpotMarket
Filler-->>Trader: