Key Structs
Definition - all structs used are defined in the Fermi-v1 Repo. We utilize zero-copy for memory efficient storage of large data structures.
Market State
pub struct Market {
/// PDA bump
pub bump: u8,
/// Number of decimals used for the base token.
///
/// Used to convert the oracle's price into a native/native price.
pub base_decimals: u8,
pub quote_decimals: u8,
pub padding1: [u8; 5],
// Pda for signing vault txs
pub market_authority: Pubkey,
/// No expiry = 0. Market will expire and no trading allowed after time_expiry
pub time_expiry: i64,
/// Admin who can collect fees from the market
pub collect_fee_admin: Pubkey,
/// Admin who must sign off on all order creations
pub open_orders_admin: NonZeroPubkeyOption,
/// Admin who must sign off on all event consumptions
pub consume_events_admin: NonZeroPubkeyOption,
/// Admin who can set market expired, prune orders and close the market
pub close_market_admin: NonZeroPubkeyOption,
/// Name. Trailing zero bytes are ignored.
pub name: [u8; 16],
/// Address of the BookSide account for bids
pub bids: Pubkey,
/// Address of the BookSide account for asks
pub asks: Pubkey,
/// Address of the EventHeap account
pub event_heap: Pubkey,
/// Oracles account address
pub oracle_a: NonZeroPubkeyOption,
pub oracle_b: NonZeroPubkeyOption,
/// Oracle configuration
pub oracle_config: OracleConfig,
/// Number of quote native in a quote lot. Must be a power of 10.
///
/// Primarily useful for increasing the tick size on the market: A lot price
/// of 1 becomes a native price of quote_lot_size/base_lot_size becomes a
/// ui price of quote_lot_size*base_decimals/base_lot_size/quote_decimals.
pub quote_lot_size: i64,
/// Number of base native in a base lot. Must be a power of 10.
///
/// Example: If base decimals for the underlying asset is 6, base lot size
/// is 100 and and base position lots is 10_000 then base position native is
/// 1_000_000 and base position ui is 1.
pub base_lot_size: i64,
/// Total number of orders seen
pub seq_num: u64,
/// Timestamp in seconds that the market was registered at.
pub registration_time: i64,
/// Fees
///
/// Fee (in 10^-6) when matching maker orders.
/// maker_fee < 0 it means some of the taker_fees goes to the maker
/// maker_fee > 0, it means no taker_fee to the maker, and maker fee goes to the referral
pub maker_fee: i64,
/// Fee (in 10^-6) for taker orders, always >= 0.
pub taker_fee: i64,
/// Total fees accrued in native quote
pub fees_accrued: u128,
/// Total fees settled in native quote
pub fees_to_referrers: u128,
/// Referrer rebates to be distributed
pub referrer_rebates_accrued: u64,
/// Fees generated and available to withdraw via sweep_fees
pub fees_available: u64,
/// Cumulative maker volume (same as taker volume) in quote native units
pub maker_volume: u128,
/// Cumulative taker volume in quote native units due to place take orders
pub taker_volume_wo_oo: u128,
pub base_mint: Pubkey,
pub quote_mint: Pubkey,
pub market_base_vault: Pubkey,
pub base_deposit_total: u64,
pub market_quote_vault: Pubkey,
pub quote_deposit_total: u64,
pub reserved: [u8; 128],
}
Orderbook State
We utilise a custom Binary Tree data structure to store the orderbook state, for efficient insertion and retrieval of the best quote on a particular bookside.
pub struct Orderbook<'a> {
pub bids: RefMut<'a, BookSide>,
pub asks: RefMut<'a, BookSide>,
}
#[account(zero_copy)]
pub struct BookSide {
pub roots: [OrderTreeRoot; 2],
pub reserved_roots: [OrderTreeRoot; 4],
pub reserved: [u8; 256],
pub nodes: OrderTreeNodes,
pub struct OrderTreeNodes {
pub order_tree_type: u8, // OrderTreeType, but that's not POD
pub padding: [u8; 3],
pub bump_index: u32,
pub free_list_len: u32,
pub free_list_head: NodeHandle,
pub reserved: [u8; 512],
pub nodes: [AnyNode; MAX_ORDERTREE_NODE
pub struct OrderTreeIter<'a> {
order_tree: &'a OrderTreeNodes,
/// InnerNodes where the right side still needs to be iterated on
stack: Vec<&'a InnerNode>,
/// To be returned on `next()`
next_leaf: Option<(NodeHandle, &'a LeafNode)>,
/// either 0, 1 to iterate low-to-high, or 1, 0 to iterate high-to-low
left: usize,
right: usize,
}
pub struct Order {
pub side: Side,
/// Max base lots to buy/sell.
pub max_base_lots: i64,
/// Max quote lots to pay/receive including fees.
pub max_quote_lots_including_fees: i64,
/// Arbitrary user-controlled order id.
pub client_order_id: u64,
/// Number of seconds the order shall live, 0 meaning forever
pub time_in_force: u16,
/// Configure how matches with order of the same owner are handled
pub self_trade_behavior: SelfTradeBehavior,
/// Order type specific params
pub params: OrderParams,
}
pub struct OrderWithAmounts {
pub order_id: Option<u128>,
pub posted_base_native: u64,
pub posted_quote_native: u64,
pub total_base_taken_native: u64,
pub total_quote_taken_native: u64,
pub taker_fees: u64,
pub maker_fees: u64,
pub referrer_amount: u64,
}
#[repr(C)]
pub struct LeafNode {
/// NodeTag
pub tag: u8,
/// Index into the owning OpenOrdersAccount's OpenOrders
pub owner_slot: u8,
/// Time in seconds after `timestamp` at which the order expires.
/// A value of 0 means no expiry.
pub time_in_force: u16,
pub padding: [u8; 4],
/// The binary tree key, see new_node_key()
pub key: u128,
/// Address of the owning OpenOrdersAccount
pub owner: Pubkey,
/// Number of base lots to buy or sell, always >=1
pub quantity: i64,
/// The time the order was placed
pub timestamp: u64,
/// If the effective price of an oracle pegged order exceeds this limit,
/// it will be considered invalid and may be removed.
///
/// Only applicable in the oracle_pegged OrderTree
pub peg_limit: i64,
/// User defined id for this order, used in FillEvents
pub client_order_id: u64,
}
Openorders State
#[account(zero_copy)]
#[derive(Debug)]
pub struct OpenOrdersAccount {
pub owner: Pubkey,
pub market: Pubkey,
pub name: [u8; 32],
// Alternative authority/signer of transactions for a openbook account
pub delegate: NonZeroPubkeyOption,
pub account_num: u32,
pub bump: u8,
// Introducing a version as we are adding a new field bids_quote_lots
pub version: u8,
pub padding: [u8; 2],
pub position: Position,
pub total_approved_base: u64,
pub total_approved_quote: u64,
pub open_orders: [OpenOrder; MAX_OPEN_ORDERS],
}
EventHeap
#[account(zero_copy)]
pub struct EventHeap {
pub header: EventHeapHeader,
pub nodes: [EventNode; MAX_NUM_EVENTS as usize],
pub reserved: [u8; 64],
}
Last updated