Structures

Cairo structures map for the exchange entities

Fees

Gas fee

struct GasFee {
    gas_per_action: u32,
    fee_token: ContractAddress,
    max_gas_price: u256,
    conversion_rate: (u256, u256), # in case of chain base currency it will be (1,1)
}

Fixed fee

struct FixedFee {
    recipient: ContractAddress, # the one who will recieve specified amount of fees of trade
    maker_pbips: u32, #0.01pct = 1bps = 100pbips
    taker_pbips: u32,
    apply_to_receipt_amount: bool
}

Order fee

struct OrderFee {
    trade_fee: FixedFee,
    router_fee: FixedFee,
    gas_fee: GasFee,
}

Order

Onchain fills info

struct OrderTradeInfo {
    filled_base_amount: u256, #base token amount filled
    filled_quote_amount: u256, #quote token amount filled
    last_traded_px: u256, #last traded price
    num_trades_happened: u8,
    as_taker_completed: bool, takers order marks as completed so not fulfillable 
}

STP modes

enum TakerSelfTradePreventionMode {
    NONE, // allow self trading
    EXPIRE_TAKER, // won't allow orders to match if they have the same order signer, 
    EXPIRE_MAKER, // won't allow orders to match if they have the same order signer
    EXPIRE_BOTH, //  won't allow orders to match
} // semantic take place only depending on takers' order mode

Quantity

struct Quantity {
    base_qty: u256, // qunatity in base asset raw amount
    quote_qty: u256, // quantity in quote asset raw amount
    base_asset: u256 // raw amount of base asset representing 1, eg 1 eth is 10**18
}

Constraints

struct Constraints {
    number_of_swaps_allowed: u16, // if order is taker, one can limit maximum number of trades can happens with this taker order (necesasry becase taker order incur gas fees)
    duration_valid: u32, // epoch tine in seconds, time when order becomes invalid
    created_at: u32, // epoch time in seconds, time when order was created by user
    stp: TakerSelfTradePreventionMode,
    nonce: u32, // maker nonce, for order be valid this nonce must be >= in Nonce component
    min_receive_amount: u256, // minimal amount that user willing to receive from the full matching of order, default value 0, for now defined for router takers, serves as slippage that filtered on exchange, no restrictions onchain
    router_signer: ContractAddress, // if taker order is router aka trader outside of our ecosystem then this is router that router this trader to us
}

OrderFlags

struct OrderFlags {
    full_fill_only: bool, 
    best_level_only: bool,
    post_only: bool,
    is_sell_side: bool,
    is_market_order: bool,
    to_ecosystem_book: bool,
    external_funds: bool
}

Order

struct Order {
    maker: ContractAddress, // trading account that created order
    price: u256, // price in quote asset raw amount, for taker order serves as protection price, for passive order executoin price
    qty: Quantity,
    constraints:Constraints,
    salt: felt252, // random salt for security
    ticker: (ContractAddress, ContractAddress), // (base asset address, quote asset address) eg ETH/USDC
    fee: OrderFee, // order fees that user must fulfill once trade happens
    flags: OrderFlags, // various order flags of order
    source: felt252, // from where order originate, e.g. layerakira
}   

Signed entity of order

struct SignedOrder {
    order: Order,
    sign: Span<felt252>, // makers' signer signature of type order,
    router_sign: (felt252,felt252) // router_signer signature of poseidon hash of order in case of router taker order, else (0, 0)
}

Nonce

Increase nonce

struct IncreaseNonce {
    maker: ContractAddress,
    new_nonce: u32,
    gas_fee: GasFee,
    salt: felt252,
}

Signed entity of increase nonce

struct SignedIncreaseNonce {
    increase_nonce: IncreaseNonce,
    sign: (felt252, felt252),
}

Withdraw

Withdraw

struct Withdraw {
    maker: ContractAddress, // trading account that want to withdraw
    token: ContractAddress, // address of erc20 token of interest, 
    amount: u256, // amount of token, at the end user will receive amount of token diff from gas fee or amount - gas_fee, so user can always withdraw all his balances 
    salt: felt252, // random salt
    gas_fee: GasFee, // for some paths, this activity to be executed requires gasfee
    receiver: ContractAddress // receiver of withdrawal tokens
}

Signed entity of withdraw

struct SignedWithdraw {
    withdraw: Withdraw,
    sign: (felt252, felt252)
}

Utils

struct SlowModeDelay {
    block: u64, #block number
    ts: u64, # timstamp in epoch seconds
}

Last updated