solana-rpc-testing/configure/openbook-v2/openbook_v2.ts

5858 lines
127 KiB
TypeScript

export type OpenbookV2 = {
"version": "0.1.0",
"name": "openbook_v2",
"instructions": [
{
"name": "createMarket",
"docs": [
"Create a [`Market`](crate::state::Market) for a given token pair."
],
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false,
"docs": [
"Accounts are initialised by client,",
"anchor discriminator is set first when ix exits,"
]
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "baseMint",
"isMut": false,
"isSigner": false
},
{
"name": "quoteMint",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "marketIndex",
"type": "u32"
},
{
"name": "name",
"type": "string"
},
{
"name": "oracleConfig",
"type": {
"defined": "OracleConfigParams"
}
},
{
"name": "quoteLotSize",
"type": "i64"
},
{
"name": "baseLotSize",
"type": "i64"
},
{
"name": "makerFee",
"type": "f32"
},
{
"name": "takerFee",
"type": "f32"
},
{
"name": "feePenalty",
"type": "f32"
}
]
},
{
"name": "initOpenOrders",
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": true,
"isSigner": true
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "accountNum",
"type": "u32"
},
{
"name": "openOrdersCount",
"type": "u8"
}
]
},
{
"name": "placeOrder",
"docs": [
"Place an order.",
"",
"Different types of orders have different effects on the order book,",
"as described in [`PlaceOrderType`](crate::state::PlaceOrderType).",
"",
"`price_lots` refers to the price in lots: the number of quote lots",
"per base lot. It is ignored for `PlaceOrderType::Market` orders.",
"",
"`expiry_timestamp` is a unix timestamp for when this order should",
"expire. If 0 is passed in, the order will never expire. If the time",
"is in the past, the instruction is skipped. Timestamps in the future",
"are reduced to now + 65,535s.",
"",
"`limit` determines the maximum number of orders from the book to fill,",
"and can be used to limit CU spent. When the limit is reached, processing",
"stops and the instruction succeeds."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceLots",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "expiryTimestamp",
"type": "u64"
},
{
"name": "limit",
"type": "u8"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "placeOrderPegged",
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceOffsetLots",
"type": "i64"
},
{
"name": "pegLimit",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "expiryTimestamp",
"type": "u64"
},
{
"name": "limit",
"type": "u8"
},
{
"name": "maxOracleStalenessSlots",
"type": "i32"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "placeTakeOrder",
"docs": [
"Place an order that shall take existing liquidity off of the book, not",
"add a new order off the book.",
"",
"This type of order allows for instant token settlement for the taker."
],
"accounts": [
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "receiver",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceLots",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "limit",
"type": "u8"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "consumeEvents",
"docs": [
"Process up to `limit` [events](crate::state::AnyEvent).",
"",
"When a user places a 'take' order, they do not know beforehand which",
"market maker will have placed the 'make' order that they get executed",
"against. This prevents them from passing in a market maker's",
"[`OpenOrdersAccount`](crate::state::OpenOrdersAccount), which is needed",
"to credit/debit the relevant tokens to/from the maker. As such, Openbook",
"uses a 'crank' system, where `place_order` only emits events, and",
"`consume_events` handles token settlement.",
"",
"Currently, there are two types of events: [`FillEvent`](crate::state::FillEvent)s",
"and [`OutEvent`](crate::state::OutEvent)s.",
"",
"A `FillEvent` is emitted when an order is filled, and it is handled by",
"debiting whatever the taker is selling from the taker and crediting",
"it to the maker, and debiting whatever the taker is buying from the",
"maker and crediting it to the taker. Note that *no tokens are moved*,",
"these are just debits and credits to each party's [`Position`](crate::state::Position).",
"",
"An `OutEvent` is emitted when a limit order needs to be removed from",
"the book during a `place_order` invocation, and it is handled by",
"crediting whatever the maker would have sold (quote token in a bid,",
"base token in an ask) back to the maker."
],
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "limit",
"type": "u64"
}
]
},
{
"name": "cancelOrder",
"docs": [
"Cancel an order by its `order_id`.",
"",
"Note that this doesn't emit an [`OutEvent`](crate::state::OutEvent) because a",
"maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount)."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "orderId",
"type": "u128"
}
]
},
{
"name": "cancelOrderByClientOrderId",
"docs": [
"Cancel an order by its `client_order_id`.",
"",
"Note that this doesn't emit an [`OutEvent`](crate::state::OutEvent) because a",
"maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount)."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "clientOrderId",
"type": "u64"
}
]
},
{
"name": "cancelAllOrders",
"docs": [
"Cancel up to `limit` orders."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "limit",
"type": "u8"
}
]
},
{
"name": "cancelAllOrdersBySide",
"docs": [
"Cancel up to `limit` orders on a single side of the book."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "sideOption",
"type": {
"option": {
"defined": "Side"
}
}
},
{
"name": "limit",
"type": "u8"
}
]
},
{
"name": "deposit",
"docs": [
"Desposit a certain amount of `base_amount_lots` and `quote_amount_lots`",
"into one's [`Position`](crate::state::Position).",
"",
"Makers might wish to `deposit`, rather than have actual tokens moved for",
"each trade, in order to reduce CUs."
],
"accounts": [
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "payerBase",
"isMut": true,
"isSigner": false
},
{
"name": "payerQuote",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "baseAmountLots",
"type": "u64"
},
{
"name": "quoteAmountLots",
"type": "u64"
}
]
},
{
"name": "settleFunds",
"docs": [
"Withdraw any available tokens."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "payerBase",
"isMut": true,
"isSigner": false
},
{
"name": "payerQuote",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "sweepFees",
"docs": [
"Sweep fees, as a [`Market`](crate::state::Market)'s admin."
],
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "receiver",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "closeMarket",
"docs": [
"Close a [`Market`](crate::state::Market)."
],
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "solDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "stubOracleCreate",
"accounts": [
{
"name": "oracle",
"isMut": true,
"isSigner": false
},
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "mint",
"isMut": false,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "price",
"type": {
"defined": "I80F48"
}
}
]
},
{
"name": "stubOracleClose",
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "oracle",
"isMut": true,
"isSigner": false
},
{
"name": "solDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "stubOracleSet",
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "oracle",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "price",
"type": {
"defined": "I80F48"
}
}
]
}
],
"accounts": [
{
"name": "market",
"type": {
"kind": "struct",
"fields": [
{
"name": "admin",
"docs": [
"Admin who can close this market"
],
"type": "publicKey"
},
{
"name": "marketIndex",
"docs": [
"Index of this market"
],
"type": "u32"
},
{
"name": "bump",
"docs": [
"PDA bump"
],
"type": "u8"
},
{
"name": "baseDecimals",
"docs": [
"Number of decimals used for the base token.",
"",
"Used to convert the oracle's price into a native/native price."
],
"type": "u8"
},
{
"name": "quoteDecimals",
"type": "u8"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
1
]
}
},
{
"name": "name",
"docs": [
"Name. Trailing zero bytes are ignored."
],
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "bids",
"docs": [
"Address of the BookSide account for bids"
],
"type": "publicKey"
},
{
"name": "asks",
"docs": [
"Address of the BookSide account for asks"
],
"type": "publicKey"
},
{
"name": "eventQueue",
"docs": [
"Address of the EventQueue account"
],
"type": "publicKey"
},
{
"name": "oracle",
"docs": [
"Oracle account address"
],
"type": "publicKey"
},
{
"name": "oracleConfig",
"docs": [
"Oracle configuration"
],
"type": {
"defined": "OracleConfig"
}
},
{
"name": "stablePriceModel",
"docs": [
"Maintains a stable price based on the oracle price that is less volatile."
],
"type": {
"defined": "StablePriceModel"
}
},
{
"name": "quoteLotSize",
"docs": [
"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."
],
"type": "i64"
},
{
"name": "baseLotSize",
"docs": [
"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."
],
"type": "i64"
},
{
"name": "seqNum",
"docs": [
"Total number of orders seen"
],
"type": "u64"
},
{
"name": "registrationTime",
"docs": [
"Timestamp in seconds that the market was registered at."
],
"type": "u64"
},
{
"name": "makerFee",
"docs": [
"Fees",
"Fee when matching maker orders. May be negative."
],
"type": {
"defined": "I80F48"
}
},
{
"name": "takerFee",
"docs": [
"Fee for taker orders, may not be negative."
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feesAccrued",
"docs": [
"Fees accrued in native quote currency"
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feesSettled",
"docs": [
"Fees settled in native quote currency"
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feePenalty",
"docs": [
"Fee (in quote native) to charge for ioc orders"
],
"type": "f32"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
4
]
}
},
{
"name": "buybackFeesExpiryInterval",
"type": "u64"
},
{
"name": "vaultSignerNonce",
"type": "u64"
},
{
"name": "baseMint",
"type": "publicKey"
},
{
"name": "quoteMint",
"type": "publicKey"
},
{
"name": "baseVault",
"type": "publicKey"
},
{
"name": "baseDepositTotal",
"type": "u64"
},
{
"name": "baseFeesAccrued",
"type": "u64"
},
{
"name": "quoteVault",
"type": "publicKey"
},
{
"name": "quoteDepositTotal",
"type": "u64"
},
{
"name": "quoteFeesAccrued",
"type": "u64"
},
{
"name": "referrerRebatesAccrued",
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
1888
]
}
}
]
}
},
{
"name": "openOrdersAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "name",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "delegate",
"type": "publicKey"
},
{
"name": "accountNum",
"type": "u32"
},
{
"name": "bump",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "buybackFeesAccruedCurrent",
"docs": [
"Fees usable with the \"fees buyback\" feature.",
"This tracks the ones that accrued in the current expiry interval."
],
"type": "u64"
},
{
"name": "buybackFeesAccruedPrevious",
"docs": [
"Fees buyback amount from the previous expiry interval."
],
"type": "u64"
},
{
"name": "buybackFeesExpiryTimestamp",
"docs": [
"End timestamp of the current expiry interval of the buyback fees amount."
],
"type": "u64"
},
{
"name": "position",
"type": {
"defined": "Position"
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
208
]
}
},
{
"name": "headerVersion",
"type": "u8"
},
{
"name": "padding3",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "padding4",
"type": "u32"
},
{
"name": "openOrders",
"type": {
"vec": {
"defined": "OpenOrder"
}
}
}
]
}
},
{
"name": "stubOracle",
"type": {
"kind": "struct",
"fields": [
{
"name": "group",
"type": "publicKey"
},
{
"name": "mint",
"type": "publicKey"
},
{
"name": "price",
"type": {
"defined": "I80F48"
}
},
{
"name": "lastUpdated",
"type": "i64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
128
]
}
}
]
}
},
{
"name": "bookSide",
"type": {
"kind": "struct",
"fields": [
{
"name": "roots",
"type": {
"array": [
{
"defined": "OrderTreeRoot"
},
2
]
}
},
{
"name": "reservedRoots",
"type": {
"array": [
{
"defined": "OrderTreeRoot"
},
4
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
256
]
}
},
{
"name": "nodes",
"type": {
"defined": "OrderTreeNodes"
}
}
]
}
},
{
"name": "eventQueue",
"type": {
"kind": "struct",
"fields": [
{
"name": "header",
"type": {
"defined": "EventQueueHeader"
}
},
{
"name": "buf",
"type": {
"array": [
{
"defined": "AnyEvent"
},
488
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
64
]
}
}
]
}
}
],
"types": [
{
"name": "OpenOrdersAccountFixed",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "name",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "delegate",
"type": "publicKey"
},
{
"name": "accountNum",
"type": "u32"
},
{
"name": "bump",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "buybackFeesAccruedCurrent",
"type": "u64"
},
{
"name": "buybackFeesAccruedPrevious",
"type": "u64"
},
{
"name": "buybackFeesExpiryTimestamp",
"type": "u64"
},
{
"name": "position",
"type": {
"defined": "Position"
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
208
]
}
}
]
}
},
{
"name": "Position",
"type": {
"kind": "struct",
"fields": [
{
"name": "quoteRunningNative",
"docs": [
"Tracks what the position is to calculate average entry & break even price"
],
"type": "i64"
},
{
"name": "bidsBaseLots",
"docs": [
"Base lots in open bids"
],
"type": "i64"
},
{
"name": "asksBaseLots",
"docs": [
"Base lots in open asks"
],
"type": "i64"
},
{
"name": "baseFreeNative",
"type": {
"defined": "I80F48"
}
},
{
"name": "quoteFreeNative",
"type": {
"defined": "I80F48"
}
},
{
"name": "referrerRebatesAccrued",
"type": "u64"
},
{
"name": "makerVolume",
"docs": [
"Cumulative maker volume in quote native units",
"",
"(Display only)"
],
"type": "u64"
},
{
"name": "takerVolume",
"docs": [
"Cumulative taker volume in quote native units",
"",
"(Display only)"
],
"type": "u64"
},
{
"name": "avgEntryPricePerBaseLot",
"docs": [
"The native average entry price for the base lots of the current position.",
"Reset to 0 when the base position reaches or crosses 0."
],
"type": "f64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
88
]
}
}
]
}
},
{
"name": "OpenOrder",
"type": {
"kind": "struct",
"fields": [
{
"name": "sideAndTree",
"type": "u8"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "clientId",
"type": "u64"
},
{
"name": "pegLimit",
"type": "i64"
},
{
"name": "id",
"type": "u128"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
64
]
}
}
]
}
},
{
"name": "OracleConfig",
"type": {
"kind": "struct",
"fields": [
{
"name": "confFilter",
"type": {
"defined": "I80F48"
}
},
{
"name": "maxStalenessSlots",
"type": "i64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
72
]
}
}
]
}
},
{
"name": "OracleConfigParams",
"type": {
"kind": "struct",
"fields": [
{
"name": "confFilter",
"type": "f32"
},
{
"name": "maxStalenessSlots",
"type": {
"option": "u32"
}
}
]
}
},
{
"name": "InnerNode",
"docs": [
"InnerNodes and LeafNodes compose the binary tree of orders.",
"",
"Each InnerNode has exactly two children, which are either InnerNodes themselves,",
"or LeafNodes. The children share the top `prefix_len` bits of `key`. The left",
"child has a 0 in the next bit, and the right a 1."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "prefixLen",
"docs": [
"number of highest `key` bits that all children share",
"e.g. if it's 2, the two highest bits of `key` will be the same on all children"
],
"type": "u32"
},
{
"name": "key",
"docs": [
"only the top `prefix_len` bits of `key` are relevant"
],
"type": "u128"
},
{
"name": "children",
"docs": [
"indexes into `BookSide::nodes`"
],
"type": {
"array": [
"u32",
2
]
}
},
{
"name": "childEarliestExpiry",
"docs": [
"The earliest expiry timestamp for the left and right subtrees.",
"",
"Needed to be able to find and remove expired orders without having to",
"iterate through the whole bookside."
],
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
72
]
}
}
]
}
},
{
"name": "LeafNode",
"docs": [
"LeafNodes represent an order in the binary tree"
],
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"docs": [
"NodeTag"
],
"type": "u8"
},
{
"name": "ownerSlot",
"docs": [
"Index into the owning OpenOrdersAccount's OpenOrders"
],
"type": "u8"
},
{
"name": "orderType",
"docs": [
"PostOrderType, this was added for TradingView move order"
],
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
1
]
}
},
{
"name": "timeInForce",
"docs": [
"Time in seconds after `timestamp` at which the order expires.",
"A value of 0 means no expiry."
],
"type": "u16"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
2
]
}
},
{
"name": "key",
"docs": [
"The binary tree key, see new_node_key()"
],
"type": "u128"
},
{
"name": "owner",
"docs": [
"Address of the owning OpenOrdersAccount"
],
"type": "publicKey"
},
{
"name": "quantity",
"docs": [
"Number of base lots to buy or sell, always >=1"
],
"type": "i64"
},
{
"name": "timestamp",
"docs": [
"The time the order was placed"
],
"type": "u64"
},
{
"name": "pegLimit",
"docs": [
"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"
],
"type": "i64"
},
{
"name": "clientOrderId",
"docs": [
"User defined id for this order, used in FillEvents"
],
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
32
]
}
}
]
}
},
{
"name": "AnyNode",
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"type": "u8"
},
{
"name": "data",
"type": {
"array": [
"u8",
119
]
}
}
]
}
},
{
"name": "OrderTreeRoot",
"type": {
"kind": "struct",
"fields": [
{
"name": "maybeNode",
"type": "u32"
},
{
"name": "leafCount",
"type": "u32"
}
]
}
},
{
"name": "OrderTreeNodes",
"docs": [
"A binary tree on AnyNode::key()",
"",
"The key encodes the price in the top 64 bits."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "orderTreeType",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "bumpIndex",
"type": "u32"
},
{
"name": "freeListLen",
"type": "u32"
},
{
"name": "freeListHead",
"type": "u32"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
512
]
}
},
{
"name": "nodes",
"type": {
"array": [
{
"defined": "AnyNode"
},
1024
]
}
}
]
}
},
{
"name": "EventQueueHeader",
"type": {
"kind": "struct",
"fields": [
{
"name": "head",
"type": "u32"
},
{
"name": "count",
"type": "u32"
},
{
"name": "seqNum",
"type": "u64"
}
]
}
},
{
"name": "AnyEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
199
]
}
}
]
}
},
{
"name": "FillEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "takerSide",
"type": "u8"
},
{
"name": "makerOut",
"type": "u8"
},
{
"name": "makerSlot",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
4
]
}
},
{
"name": "timestamp",
"type": "u64"
},
{
"name": "seqNum",
"type": "u64"
},
{
"name": "maker",
"type": "publicKey"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "makerTimestamp",
"type": "u64"
},
{
"name": "taker",
"type": "publicKey"
},
{
"name": "padding3",
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "takerClientOrderId",
"type": "u64"
},
{
"name": "padding4",
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "price",
"type": "i64"
},
{
"name": "quantity",
"type": "i64"
},
{
"name": "makerClientOrderId",
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
8
]
}
}
]
}
},
{
"name": "OutEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "side",
"type": "u8"
},
{
"name": "ownerSlot",
"type": "u8"
},
{
"name": "padding0",
"type": {
"array": [
"u8",
5
]
}
},
{
"name": "timestamp",
"type": "u64"
},
{
"name": "seqNum",
"type": "u64"
},
{
"name": "owner",
"type": "publicKey"
},
{
"name": "quantity",
"type": "i64"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
136
]
}
}
]
}
},
{
"name": "StablePriceModel",
"docs": [
"Maintains a \"stable_price\" based on the oracle price.",
"",
"The stable price follows the oracle price, but its relative rate of",
"change is limited (to `stable_growth_limit`) and futher reduced if",
"the oracle price is far from the `delay_price`.",
"",
"Conceptually the `delay_price` is itself a time delayed",
"(`24 * delay_interval_seconds`, assume 24h) and relative rate of change limited",
"function of the oracle price. It is implemented as averaging the oracle",
"price over every `delay_interval_seconds` (assume 1h) and then applying the",
"`delay_growth_limit` between intervals."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "stablePrice",
"docs": [
"Current stable price to use in health"
],
"type": "f64"
},
{
"name": "lastUpdateTimestamp",
"type": "u64"
},
{
"name": "delayPrices",
"docs": [
"Stored delay_price for each delay_interval.",
"If we want the delay_price to be 24h delayed, we would store one for each hour.",
"This is used in a cyclical way: We use the maximally-delayed value at delay_interval_index",
"and once enough time passes to move to the next delay interval, that gets overwritten and",
"we use the next one."
],
"type": {
"array": [
"f64",
24
]
}
},
{
"name": "delayAccumulatorPrice",
"docs": [
"The delay price is based on an average over each delay_interval. The contributions",
"to the average are summed up here."
],
"type": "f64"
},
{
"name": "delayAccumulatorTime",
"docs": [
"Accumulating the total time for the above average."
],
"type": "u32"
},
{
"name": "delayIntervalSeconds",
"docs": [
"Length of a delay_interval"
],
"type": "u32"
},
{
"name": "delayGrowthLimit",
"docs": [
"Maximal relative difference between two delay_price in consecutive intervals."
],
"type": "f32"
},
{
"name": "stableGrowthLimit",
"docs": [
"Maximal per-second relative difference of the stable price.",
"It gets further reduced if stable and delay price disagree."
],
"type": "f32"
},
{
"name": "lastDelayIntervalIndex",
"docs": [
"The delay_interval_index that update() was last called on."
],
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
48
]
}
}
]
}
},
{
"name": "MarketIndex",
"docs": [
"Nothing in Rust shall use these types. They only exist so that the Anchor IDL",
"knows about them and typescript can deserialize it."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "val",
"type": "u32"
}
]
}
},
{
"name": "I80F48",
"type": {
"kind": "struct",
"fields": [
{
"name": "val",
"type": "i128"
}
]
}
},
{
"name": "OracleType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Pyth"
},
{
"name": "Stub"
},
{
"name": "SwitchboardV1"
},
{
"name": "SwitchboardV2"
}
]
}
},
{
"name": "OrderState",
"type": {
"kind": "enum",
"variants": [
{
"name": "Valid"
},
{
"name": "Invalid"
},
{
"name": "Skipped"
}
]
}
},
{
"name": "BookSideOrderTree",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fixed"
},
{
"name": "OraclePegged"
}
]
}
},
{
"name": "NodeTag",
"type": {
"kind": "enum",
"variants": [
{
"name": "Uninitialized"
},
{
"name": "InnerNode"
},
{
"name": "LeafNode"
},
{
"name": "FreeNode"
},
{
"name": "LastFreeNode"
}
]
}
},
{
"name": "PlaceOrderType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Limit"
},
{
"name": "ImmediateOrCancel"
},
{
"name": "PostOnly"
},
{
"name": "Market"
},
{
"name": "PostOnlySlide"
}
]
}
},
{
"name": "PostOrderType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Limit"
},
{
"name": "PostOnly"
},
{
"name": "PostOnlySlide"
}
]
}
},
{
"name": "Side",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bid"
},
{
"name": "Ask"
}
]
}
},
{
"name": "SideAndOrderTree",
"docs": [
"SideAndOrderTree is a storage optimization, so we don't need two bytes for the data"
],
"type": {
"kind": "enum",
"variants": [
{
"name": "BidFixed"
},
{
"name": "AskFixed"
},
{
"name": "BidOraclePegged"
},
{
"name": "AskOraclePegged"
}
]
}
},
{
"name": "OrderParams",
"type": {
"kind": "enum",
"variants": [
{
"name": "Market"
},
{
"name": "ImmediateOrCancel",
"fields": [
{
"name": "price_lots",
"type": "i64"
}
]
},
{
"name": "Fixed",
"fields": [
{
"name": "price_lots",
"type": "i64"
},
{
"name": "order_type",
"type": {
"defined": "PostOrderType"
}
}
]
},
{
"name": "OraclePegged",
"fields": [
{
"name": "price_offset_lots",
"type": "i64"
},
{
"name": "order_type",
"type": {
"defined": "PostOrderType"
}
},
{
"name": "peg_limit",
"type": "i64"
},
{
"name": "max_oracle_staleness_slots",
"type": "i32"
}
]
}
]
}
},
{
"name": "OrderTreeType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bids"
},
{
"name": "Asks"
}
]
}
},
{
"name": "EventType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fill"
},
{
"name": "Out"
}
]
}
}
],
"events": [
{
"name": "BalanceLog",
"fields": [
{
"name": "openOrdersAcc",
"type": "publicKey",
"index": false
},
{
"name": "basePosition",
"type": "i64",
"index": false
},
{
"name": "quotePosition",
"type": "i128",
"index": false
}
]
},
{
"name": "DepositLog",
"fields": [
{
"name": "openOrdersAcc",
"type": "publicKey",
"index": false
},
{
"name": "signer",
"type": "publicKey",
"index": false
},
{
"name": "quantity",
"type": "u64",
"index": false
}
]
},
{
"name": "FillLog",
"fields": [
{
"name": "takerSide",
"type": "u8",
"index": false
},
{
"name": "makerSlot",
"type": "u8",
"index": false
},
{
"name": "makerOut",
"type": "bool",
"index": false
},
{
"name": "timestamp",
"type": "u64",
"index": false
},
{
"name": "seqNum",
"type": "u64",
"index": false
},
{
"name": "maker",
"type": "publicKey",
"index": false
},
{
"name": "makerClientOrderId",
"type": "u64",
"index": false
},
{
"name": "makerFee",
"type": "f32",
"index": false
},
{
"name": "makerTimestamp",
"type": "u64",
"index": false
},
{
"name": "taker",
"type": "publicKey",
"index": false
},
{
"name": "takerClientOrderId",
"type": "u64",
"index": false
},
{
"name": "takerFee",
"type": "f32",
"index": false
},
{
"name": "price",
"type": "i64",
"index": false
},
{
"name": "quantity",
"type": "i64",
"index": false
}
]
},
{
"name": "MarketMetaDataLog",
"fields": [
{
"name": "market",
"type": "publicKey",
"index": false
},
{
"name": "marketIndex",
"type": "u32",
"index": false
},
{
"name": "baseDecimals",
"type": "u8",
"index": false
},
{
"name": "quoteDecimals",
"type": "u8",
"index": false
},
{
"name": "baseLotSize",
"type": "i64",
"index": false
},
{
"name": "quoteLotSize",
"type": "i64",
"index": false
},
{
"name": "oracle",
"type": "publicKey",
"index": false
}
]
}
],
"errors": [
{
"code": 6000,
"name": "SomeError",
"msg": ""
},
{
"code": 6001,
"name": "NotImplementedError",
"msg": ""
},
{
"code": 6002,
"name": "MathError",
"msg": "checked math error"
},
{
"code": 6003,
"name": "UnexpectedOracle",
"msg": ""
},
{
"code": 6004,
"name": "UnknownOracleType",
"msg": "oracle type cannot be determined"
},
{
"code": 6005,
"name": "InvalidBank",
"msg": "invalid bank"
},
{
"code": 6006,
"name": "ProfitabilityMismatch",
"msg": "account profitability is mismatched"
},
{
"code": 6007,
"name": "CannotSettleWithSelf",
"msg": "cannot settle with self"
},
{
"code": 6008,
"name": "PositionDoesNotExist",
"msg": "perp position does not exist"
},
{
"code": 6009,
"name": "MaxSettleAmountMustBeGreaterThanZero",
"msg": "max settle amount must be greater than zero"
},
{
"code": 6010,
"name": "HasOpenOrders",
"msg": "the perp position has open orders or unprocessed fill events"
},
{
"code": 6011,
"name": "OracleConfidence",
"msg": "an oracle does not reach the confidence threshold"
},
{
"code": 6012,
"name": "OracleStale",
"msg": "an oracle is stale"
},
{
"code": 6013,
"name": "SettlementAmountMustBePositive",
"msg": "settlement amount must always be positive"
},
{
"code": 6014,
"name": "BankBorrowLimitReached",
"msg": "bank utilization has reached limit"
},
{
"code": 6015,
"name": "BankNetBorrowsLimitReached",
"msg": "bank net borrows has reached limit - this is an intermittent error - the limit will reset regularly"
},
{
"code": 6016,
"name": "TokenPositionDoesNotExist",
"msg": "token position does not exist"
},
{
"code": 6017,
"name": "DepositsIntoLiquidatingMustRecover",
"msg": "token deposits into accounts that are being liquidated must bring their health above the init threshold"
},
{
"code": 6018,
"name": "TokenInReduceOnlyMode",
"msg": "token is in reduce only mode"
},
{
"code": 6019,
"name": "MarketInReduceOnlyMode",
"msg": "market is in reduce only mode"
},
{
"code": 6020,
"name": "GroupIsHalted",
"msg": "group is halted"
},
{
"code": 6021,
"name": "HasBaseLots",
"msg": "the perp position has non-zero base lots"
},
{
"code": 6022,
"name": "HasOpenOrUnsettledSerum3Orders",
"msg": "there are open or unsettled serum3 orders"
},
{
"code": 6023,
"name": "HasLiquidatableTokenPosition",
"msg": "has liquidatable token position"
},
{
"code": 6024,
"name": "HasLiquidatableBasePosition",
"msg": "has liquidatable perp base position"
},
{
"code": 6025,
"name": "HasLiquidatablePositivePnl",
"msg": "has liquidatable positive perp pnl"
},
{
"code": 6026,
"name": "AccountIsFrozen",
"msg": "account is frozen"
},
{
"code": 6027,
"name": "InitAssetWeightCantBeNegative",
"msg": "Init Asset Weight can't be negative"
},
{
"code": 6028,
"name": "HasOpenTakerFills",
"msg": "has open perp taker fills"
},
{
"code": 6029,
"name": "DepositLimit",
"msg": "deposit crosses the current group deposit limit"
},
{
"code": 6030,
"name": "IxIsDisabled",
"msg": "instruction is disabled"
},
{
"code": 6031,
"name": "NoLiquidatableBasePosition",
"msg": "no liquidatable perp base position"
},
{
"code": 6032,
"name": "OrderIdNotFound",
"msg": "perp order id not found on the orderbook"
},
{
"code": 6033,
"name": "HealthRegionBadInnerInstruction",
"msg": "HealthRegions allow only specific instructions between Begin and End"
},
{
"code": 6034,
"name": "EventQueueContainsElements",
"msg": "Event queue contains elements and market can't be closed"
},
{
"code": 6035,
"name": "InvalidFeesError",
"msg": "Taker fees should be >= maker fees"
},
{
"code": 6036,
"name": "InvalidOrderType",
"msg": "The order type is invalid. A taker order must be Market or ImmediateOrCancel"
},
{
"code": 6037,
"name": "InvalidFundsReceiver",
"msg": "The receiver is invalid. Makes sure the receiver's owner is the market admin"
}
]
};
export const IDL: OpenbookV2 = {
"version": "0.1.0",
"name": "openbook_v2",
"instructions": [
{
"name": "createMarket",
"docs": [
"Create a [`Market`](crate::state::Market) for a given token pair."
],
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false,
"docs": [
"Accounts are initialised by client,",
"anchor discriminator is set first when ix exits,"
]
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "baseMint",
"isMut": false,
"isSigner": false
},
{
"name": "quoteMint",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "marketIndex",
"type": "u32"
},
{
"name": "name",
"type": "string"
},
{
"name": "oracleConfig",
"type": {
"defined": "OracleConfigParams"
}
},
{
"name": "quoteLotSize",
"type": "i64"
},
{
"name": "baseLotSize",
"type": "i64"
},
{
"name": "makerFee",
"type": "f32"
},
{
"name": "takerFee",
"type": "f32"
},
{
"name": "feePenalty",
"type": "f32"
}
]
},
{
"name": "initOpenOrders",
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": true,
"isSigner": true
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "accountNum",
"type": "u32"
},
{
"name": "openOrdersCount",
"type": "u8"
}
]
},
{
"name": "placeOrder",
"docs": [
"Place an order.",
"",
"Different types of orders have different effects on the order book,",
"as described in [`PlaceOrderType`](crate::state::PlaceOrderType).",
"",
"`price_lots` refers to the price in lots: the number of quote lots",
"per base lot. It is ignored for `PlaceOrderType::Market` orders.",
"",
"`expiry_timestamp` is a unix timestamp for when this order should",
"expire. If 0 is passed in, the order will never expire. If the time",
"is in the past, the instruction is skipped. Timestamps in the future",
"are reduced to now + 65,535s.",
"",
"`limit` determines the maximum number of orders from the book to fill,",
"and can be used to limit CU spent. When the limit is reached, processing",
"stops and the instruction succeeds."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceLots",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "expiryTimestamp",
"type": "u64"
},
{
"name": "limit",
"type": "u8"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "placeOrderPegged",
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceOffsetLots",
"type": "i64"
},
{
"name": "pegLimit",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "expiryTimestamp",
"type": "u64"
},
{
"name": "limit",
"type": "u8"
},
{
"name": "maxOracleStalenessSlots",
"type": "i32"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "placeTakeOrder",
"docs": [
"Place an order that shall take existing liquidity off of the book, not",
"add a new order off the book.",
"",
"This type of order allows for instant token settlement for the taker."
],
"accounts": [
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": false
},
{
"name": "receiver",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "priceLots",
"type": "i64"
},
{
"name": "maxBaseLots",
"type": "i64"
},
{
"name": "maxQuoteLotsIncludingFees",
"type": "i64"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "orderType",
"type": {
"defined": "PlaceOrderType"
}
},
{
"name": "reduceOnly",
"type": "bool"
},
{
"name": "limit",
"type": "u8"
}
],
"returns": {
"option": "u128"
}
},
{
"name": "consumeEvents",
"docs": [
"Process up to `limit` [events](crate::state::AnyEvent).",
"",
"When a user places a 'take' order, they do not know beforehand which",
"market maker will have placed the 'make' order that they get executed",
"against. This prevents them from passing in a market maker's",
"[`OpenOrdersAccount`](crate::state::OpenOrdersAccount), which is needed",
"to credit/debit the relevant tokens to/from the maker. As such, Openbook",
"uses a 'crank' system, where `place_order` only emits events, and",
"`consume_events` handles token settlement.",
"",
"Currently, there are two types of events: [`FillEvent`](crate::state::FillEvent)s",
"and [`OutEvent`](crate::state::OutEvent)s.",
"",
"A `FillEvent` is emitted when an order is filled, and it is handled by",
"debiting whatever the taker is selling from the taker and crediting",
"it to the maker, and debiting whatever the taker is buying from the",
"maker and crediting it to the taker. Note that *no tokens are moved*,",
"these are just debits and credits to each party's [`Position`](crate::state::Position).",
"",
"An `OutEvent` is emitted when a limit order needs to be removed from",
"the book during a `place_order` invocation, and it is handled by",
"crediting whatever the maker would have sold (quote token in a bid,",
"base token in an ask) back to the maker."
],
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "limit",
"type": "u64"
}
]
},
{
"name": "cancelOrder",
"docs": [
"Cancel an order by its `order_id`.",
"",
"Note that this doesn't emit an [`OutEvent`](crate::state::OutEvent) because a",
"maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount)."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "orderId",
"type": "u128"
}
]
},
{
"name": "cancelOrderByClientOrderId",
"docs": [
"Cancel an order by its `client_order_id`.",
"",
"Note that this doesn't emit an [`OutEvent`](crate::state::OutEvent) because a",
"maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount)."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "clientOrderId",
"type": "u64"
}
]
},
{
"name": "cancelAllOrders",
"docs": [
"Cancel up to `limit` orders."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "limit",
"type": "u8"
}
]
},
{
"name": "cancelAllOrdersBySide",
"docs": [
"Cancel up to `limit` orders on a single side of the book."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": false,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "sideOption",
"type": {
"option": {
"defined": "Side"
}
}
},
{
"name": "limit",
"type": "u8"
}
]
},
{
"name": "deposit",
"docs": [
"Desposit a certain amount of `base_amount_lots` and `quote_amount_lots`",
"into one's [`Position`](crate::state::Position).",
"",
"Makers might wish to `deposit`, rather than have actual tokens moved for",
"each trade, in order to reduce CUs."
],
"accounts": [
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "payerBase",
"isMut": true,
"isSigner": false
},
{
"name": "payerQuote",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "baseAmountLots",
"type": "u64"
},
{
"name": "quoteAmountLots",
"type": "u64"
}
]
},
{
"name": "settleFunds",
"docs": [
"Withdraw any available tokens."
],
"accounts": [
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "baseVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "payerBase",
"isMut": true,
"isSigner": false
},
{
"name": "payerQuote",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "sweepFees",
"docs": [
"Sweep fees, as a [`Market`](crate::state::Market)'s admin."
],
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "receiver",
"isMut": true,
"isSigner": false
},
{
"name": "quoteVault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "closeMarket",
"docs": [
"Close a [`Market`](crate::state::Market)."
],
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "solDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "stubOracleCreate",
"accounts": [
{
"name": "oracle",
"isMut": true,
"isSigner": false
},
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "mint",
"isMut": false,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "price",
"type": {
"defined": "I80F48"
}
}
]
},
{
"name": "stubOracleClose",
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "oracle",
"isMut": true,
"isSigner": false
},
{
"name": "solDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "stubOracleSet",
"accounts": [
{
"name": "admin",
"isMut": false,
"isSigner": true
},
{
"name": "oracle",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "price",
"type": {
"defined": "I80F48"
}
}
]
}
],
"accounts": [
{
"name": "market",
"type": {
"kind": "struct",
"fields": [
{
"name": "admin",
"docs": [
"Admin who can close this market"
],
"type": "publicKey"
},
{
"name": "marketIndex",
"docs": [
"Index of this market"
],
"type": "u32"
},
{
"name": "bump",
"docs": [
"PDA bump"
],
"type": "u8"
},
{
"name": "baseDecimals",
"docs": [
"Number of decimals used for the base token.",
"",
"Used to convert the oracle's price into a native/native price."
],
"type": "u8"
},
{
"name": "quoteDecimals",
"type": "u8"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
1
]
}
},
{
"name": "name",
"docs": [
"Name. Trailing zero bytes are ignored."
],
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "bids",
"docs": [
"Address of the BookSide account for bids"
],
"type": "publicKey"
},
{
"name": "asks",
"docs": [
"Address of the BookSide account for asks"
],
"type": "publicKey"
},
{
"name": "eventQueue",
"docs": [
"Address of the EventQueue account"
],
"type": "publicKey"
},
{
"name": "oracle",
"docs": [
"Oracle account address"
],
"type": "publicKey"
},
{
"name": "oracleConfig",
"docs": [
"Oracle configuration"
],
"type": {
"defined": "OracleConfig"
}
},
{
"name": "stablePriceModel",
"docs": [
"Maintains a stable price based on the oracle price that is less volatile."
],
"type": {
"defined": "StablePriceModel"
}
},
{
"name": "quoteLotSize",
"docs": [
"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."
],
"type": "i64"
},
{
"name": "baseLotSize",
"docs": [
"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."
],
"type": "i64"
},
{
"name": "seqNum",
"docs": [
"Total number of orders seen"
],
"type": "u64"
},
{
"name": "registrationTime",
"docs": [
"Timestamp in seconds that the market was registered at."
],
"type": "u64"
},
{
"name": "makerFee",
"docs": [
"Fees",
"Fee when matching maker orders. May be negative."
],
"type": {
"defined": "I80F48"
}
},
{
"name": "takerFee",
"docs": [
"Fee for taker orders, may not be negative."
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feesAccrued",
"docs": [
"Fees accrued in native quote currency"
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feesSettled",
"docs": [
"Fees settled in native quote currency"
],
"type": {
"defined": "I80F48"
}
},
{
"name": "feePenalty",
"docs": [
"Fee (in quote native) to charge for ioc orders"
],
"type": "f32"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
4
]
}
},
{
"name": "buybackFeesExpiryInterval",
"type": "u64"
},
{
"name": "vaultSignerNonce",
"type": "u64"
},
{
"name": "baseMint",
"type": "publicKey"
},
{
"name": "quoteMint",
"type": "publicKey"
},
{
"name": "baseVault",
"type": "publicKey"
},
{
"name": "baseDepositTotal",
"type": "u64"
},
{
"name": "baseFeesAccrued",
"type": "u64"
},
{
"name": "quoteVault",
"type": "publicKey"
},
{
"name": "quoteDepositTotal",
"type": "u64"
},
{
"name": "quoteFeesAccrued",
"type": "u64"
},
{
"name": "referrerRebatesAccrued",
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
1888
]
}
}
]
}
},
{
"name": "openOrdersAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "name",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "delegate",
"type": "publicKey"
},
{
"name": "accountNum",
"type": "u32"
},
{
"name": "bump",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "buybackFeesAccruedCurrent",
"docs": [
"Fees usable with the \"fees buyback\" feature.",
"This tracks the ones that accrued in the current expiry interval."
],
"type": "u64"
},
{
"name": "buybackFeesAccruedPrevious",
"docs": [
"Fees buyback amount from the previous expiry interval."
],
"type": "u64"
},
{
"name": "buybackFeesExpiryTimestamp",
"docs": [
"End timestamp of the current expiry interval of the buyback fees amount."
],
"type": "u64"
},
{
"name": "position",
"type": {
"defined": "Position"
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
208
]
}
},
{
"name": "headerVersion",
"type": "u8"
},
{
"name": "padding3",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "padding4",
"type": "u32"
},
{
"name": "openOrders",
"type": {
"vec": {
"defined": "OpenOrder"
}
}
}
]
}
},
{
"name": "stubOracle",
"type": {
"kind": "struct",
"fields": [
{
"name": "group",
"type": "publicKey"
},
{
"name": "mint",
"type": "publicKey"
},
{
"name": "price",
"type": {
"defined": "I80F48"
}
},
{
"name": "lastUpdated",
"type": "i64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
128
]
}
}
]
}
},
{
"name": "bookSide",
"type": {
"kind": "struct",
"fields": [
{
"name": "roots",
"type": {
"array": [
{
"defined": "OrderTreeRoot"
},
2
]
}
},
{
"name": "reservedRoots",
"type": {
"array": [
{
"defined": "OrderTreeRoot"
},
4
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
256
]
}
},
{
"name": "nodes",
"type": {
"defined": "OrderTreeNodes"
}
}
]
}
},
{
"name": "eventQueue",
"type": {
"kind": "struct",
"fields": [
{
"name": "header",
"type": {
"defined": "EventQueueHeader"
}
},
{
"name": "buf",
"type": {
"array": [
{
"defined": "AnyEvent"
},
488
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
64
]
}
}
]
}
}
],
"types": [
{
"name": "OpenOrdersAccountFixed",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "name",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "delegate",
"type": "publicKey"
},
{
"name": "accountNum",
"type": "u32"
},
{
"name": "bump",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "buybackFeesAccruedCurrent",
"type": "u64"
},
{
"name": "buybackFeesAccruedPrevious",
"type": "u64"
},
{
"name": "buybackFeesExpiryTimestamp",
"type": "u64"
},
{
"name": "position",
"type": {
"defined": "Position"
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
208
]
}
}
]
}
},
{
"name": "Position",
"type": {
"kind": "struct",
"fields": [
{
"name": "quoteRunningNative",
"docs": [
"Tracks what the position is to calculate average entry & break even price"
],
"type": "i64"
},
{
"name": "bidsBaseLots",
"docs": [
"Base lots in open bids"
],
"type": "i64"
},
{
"name": "asksBaseLots",
"docs": [
"Base lots in open asks"
],
"type": "i64"
},
{
"name": "baseFreeNative",
"type": {
"defined": "I80F48"
}
},
{
"name": "quoteFreeNative",
"type": {
"defined": "I80F48"
}
},
{
"name": "referrerRebatesAccrued",
"type": "u64"
},
{
"name": "makerVolume",
"docs": [
"Cumulative maker volume in quote native units",
"",
"(Display only)"
],
"type": "u64"
},
{
"name": "takerVolume",
"docs": [
"Cumulative taker volume in quote native units",
"",
"(Display only)"
],
"type": "u64"
},
{
"name": "avgEntryPricePerBaseLot",
"docs": [
"The native average entry price for the base lots of the current position.",
"Reset to 0 when the base position reaches or crosses 0."
],
"type": "f64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
88
]
}
}
]
}
},
{
"name": "OpenOrder",
"type": {
"kind": "struct",
"fields": [
{
"name": "sideAndTree",
"type": "u8"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "clientId",
"type": "u64"
},
{
"name": "pegLimit",
"type": "i64"
},
{
"name": "id",
"type": "u128"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
64
]
}
}
]
}
},
{
"name": "OracleConfig",
"type": {
"kind": "struct",
"fields": [
{
"name": "confFilter",
"type": {
"defined": "I80F48"
}
},
{
"name": "maxStalenessSlots",
"type": "i64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
72
]
}
}
]
}
},
{
"name": "OracleConfigParams",
"type": {
"kind": "struct",
"fields": [
{
"name": "confFilter",
"type": "f32"
},
{
"name": "maxStalenessSlots",
"type": {
"option": "u32"
}
}
]
}
},
{
"name": "InnerNode",
"docs": [
"InnerNodes and LeafNodes compose the binary tree of orders.",
"",
"Each InnerNode has exactly two children, which are either InnerNodes themselves,",
"or LeafNodes. The children share the top `prefix_len` bits of `key`. The left",
"child has a 0 in the next bit, and the right a 1."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "prefixLen",
"docs": [
"number of highest `key` bits that all children share",
"e.g. if it's 2, the two highest bits of `key` will be the same on all children"
],
"type": "u32"
},
{
"name": "key",
"docs": [
"only the top `prefix_len` bits of `key` are relevant"
],
"type": "u128"
},
{
"name": "children",
"docs": [
"indexes into `BookSide::nodes`"
],
"type": {
"array": [
"u32",
2
]
}
},
{
"name": "childEarliestExpiry",
"docs": [
"The earliest expiry timestamp for the left and right subtrees.",
"",
"Needed to be able to find and remove expired orders without having to",
"iterate through the whole bookside."
],
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
72
]
}
}
]
}
},
{
"name": "LeafNode",
"docs": [
"LeafNodes represent an order in the binary tree"
],
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"docs": [
"NodeTag"
],
"type": "u8"
},
{
"name": "ownerSlot",
"docs": [
"Index into the owning OpenOrdersAccount's OpenOrders"
],
"type": "u8"
},
{
"name": "orderType",
"docs": [
"PostOrderType, this was added for TradingView move order"
],
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
1
]
}
},
{
"name": "timeInForce",
"docs": [
"Time in seconds after `timestamp` at which the order expires.",
"A value of 0 means no expiry."
],
"type": "u16"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
2
]
}
},
{
"name": "key",
"docs": [
"The binary tree key, see new_node_key()"
],
"type": "u128"
},
{
"name": "owner",
"docs": [
"Address of the owning OpenOrdersAccount"
],
"type": "publicKey"
},
{
"name": "quantity",
"docs": [
"Number of base lots to buy or sell, always >=1"
],
"type": "i64"
},
{
"name": "timestamp",
"docs": [
"The time the order was placed"
],
"type": "u64"
},
{
"name": "pegLimit",
"docs": [
"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"
],
"type": "i64"
},
{
"name": "clientOrderId",
"docs": [
"User defined id for this order, used in FillEvents"
],
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
32
]
}
}
]
}
},
{
"name": "AnyNode",
"type": {
"kind": "struct",
"fields": [
{
"name": "tag",
"type": "u8"
},
{
"name": "data",
"type": {
"array": [
"u8",
119
]
}
}
]
}
},
{
"name": "OrderTreeRoot",
"type": {
"kind": "struct",
"fields": [
{
"name": "maybeNode",
"type": "u32"
},
{
"name": "leafCount",
"type": "u32"
}
]
}
},
{
"name": "OrderTreeNodes",
"docs": [
"A binary tree on AnyNode::key()",
"",
"The key encodes the price in the top 64 bits."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "orderTreeType",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
3
]
}
},
{
"name": "bumpIndex",
"type": "u32"
},
{
"name": "freeListLen",
"type": "u32"
},
{
"name": "freeListHead",
"type": "u32"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
512
]
}
},
{
"name": "nodes",
"type": {
"array": [
{
"defined": "AnyNode"
},
1024
]
}
}
]
}
},
{
"name": "EventQueueHeader",
"type": {
"kind": "struct",
"fields": [
{
"name": "head",
"type": "u32"
},
{
"name": "count",
"type": "u32"
},
{
"name": "seqNum",
"type": "u64"
}
]
}
},
{
"name": "AnyEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
199
]
}
}
]
}
},
{
"name": "FillEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "takerSide",
"type": "u8"
},
{
"name": "makerOut",
"type": "u8"
},
{
"name": "makerSlot",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
4
]
}
},
{
"name": "timestamp",
"type": "u64"
},
{
"name": "seqNum",
"type": "u64"
},
{
"name": "maker",
"type": "publicKey"
},
{
"name": "padding2",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "makerTimestamp",
"type": "u64"
},
{
"name": "taker",
"type": "publicKey"
},
{
"name": "padding3",
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "takerClientOrderId",
"type": "u64"
},
{
"name": "padding4",
"type": {
"array": [
"u8",
16
]
}
},
{
"name": "price",
"type": "i64"
},
{
"name": "quantity",
"type": "i64"
},
{
"name": "makerClientOrderId",
"type": "u64"
},
{
"name": "reserved",
"type": {
"array": [
"u8",
8
]
}
}
]
}
},
{
"name": "OutEvent",
"type": {
"kind": "struct",
"fields": [
{
"name": "eventType",
"type": "u8"
},
{
"name": "side",
"type": "u8"
},
{
"name": "ownerSlot",
"type": "u8"
},
{
"name": "padding0",
"type": {
"array": [
"u8",
5
]
}
},
{
"name": "timestamp",
"type": "u64"
},
{
"name": "seqNum",
"type": "u64"
},
{
"name": "owner",
"type": "publicKey"
},
{
"name": "quantity",
"type": "i64"
},
{
"name": "padding1",
"type": {
"array": [
"u8",
136
]
}
}
]
}
},
{
"name": "StablePriceModel",
"docs": [
"Maintains a \"stable_price\" based on the oracle price.",
"",
"The stable price follows the oracle price, but its relative rate of",
"change is limited (to `stable_growth_limit`) and futher reduced if",
"the oracle price is far from the `delay_price`.",
"",
"Conceptually the `delay_price` is itself a time delayed",
"(`24 * delay_interval_seconds`, assume 24h) and relative rate of change limited",
"function of the oracle price. It is implemented as averaging the oracle",
"price over every `delay_interval_seconds` (assume 1h) and then applying the",
"`delay_growth_limit` between intervals."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "stablePrice",
"docs": [
"Current stable price to use in health"
],
"type": "f64"
},
{
"name": "lastUpdateTimestamp",
"type": "u64"
},
{
"name": "delayPrices",
"docs": [
"Stored delay_price for each delay_interval.",
"If we want the delay_price to be 24h delayed, we would store one for each hour.",
"This is used in a cyclical way: We use the maximally-delayed value at delay_interval_index",
"and once enough time passes to move to the next delay interval, that gets overwritten and",
"we use the next one."
],
"type": {
"array": [
"f64",
24
]
}
},
{
"name": "delayAccumulatorPrice",
"docs": [
"The delay price is based on an average over each delay_interval. The contributions",
"to the average are summed up here."
],
"type": "f64"
},
{
"name": "delayAccumulatorTime",
"docs": [
"Accumulating the total time for the above average."
],
"type": "u32"
},
{
"name": "delayIntervalSeconds",
"docs": [
"Length of a delay_interval"
],
"type": "u32"
},
{
"name": "delayGrowthLimit",
"docs": [
"Maximal relative difference between two delay_price in consecutive intervals."
],
"type": "f32"
},
{
"name": "stableGrowthLimit",
"docs": [
"Maximal per-second relative difference of the stable price.",
"It gets further reduced if stable and delay price disagree."
],
"type": "f32"
},
{
"name": "lastDelayIntervalIndex",
"docs": [
"The delay_interval_index that update() was last called on."
],
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "reserved",
"type": {
"array": [
"u8",
48
]
}
}
]
}
},
{
"name": "MarketIndex",
"docs": [
"Nothing in Rust shall use these types. They only exist so that the Anchor IDL",
"knows about them and typescript can deserialize it."
],
"type": {
"kind": "struct",
"fields": [
{
"name": "val",
"type": "u32"
}
]
}
},
{
"name": "I80F48",
"type": {
"kind": "struct",
"fields": [
{
"name": "val",
"type": "i128"
}
]
}
},
{
"name": "OracleType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Pyth"
},
{
"name": "Stub"
},
{
"name": "SwitchboardV1"
},
{
"name": "SwitchboardV2"
}
]
}
},
{
"name": "OrderState",
"type": {
"kind": "enum",
"variants": [
{
"name": "Valid"
},
{
"name": "Invalid"
},
{
"name": "Skipped"
}
]
}
},
{
"name": "BookSideOrderTree",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fixed"
},
{
"name": "OraclePegged"
}
]
}
},
{
"name": "NodeTag",
"type": {
"kind": "enum",
"variants": [
{
"name": "Uninitialized"
},
{
"name": "InnerNode"
},
{
"name": "LeafNode"
},
{
"name": "FreeNode"
},
{
"name": "LastFreeNode"
}
]
}
},
{
"name": "PlaceOrderType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Limit"
},
{
"name": "ImmediateOrCancel"
},
{
"name": "PostOnly"
},
{
"name": "Market"
},
{
"name": "PostOnlySlide"
}
]
}
},
{
"name": "PostOrderType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Limit"
},
{
"name": "PostOnly"
},
{
"name": "PostOnlySlide"
}
]
}
},
{
"name": "Side",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bid"
},
{
"name": "Ask"
}
]
}
},
{
"name": "SideAndOrderTree",
"docs": [
"SideAndOrderTree is a storage optimization, so we don't need two bytes for the data"
],
"type": {
"kind": "enum",
"variants": [
{
"name": "BidFixed"
},
{
"name": "AskFixed"
},
{
"name": "BidOraclePegged"
},
{
"name": "AskOraclePegged"
}
]
}
},
{
"name": "OrderParams",
"type": {
"kind": "enum",
"variants": [
{
"name": "Market"
},
{
"name": "ImmediateOrCancel",
"fields": [
{
"name": "price_lots",
"type": "i64"
}
]
},
{
"name": "Fixed",
"fields": [
{
"name": "price_lots",
"type": "i64"
},
{
"name": "order_type",
"type": {
"defined": "PostOrderType"
}
}
]
},
{
"name": "OraclePegged",
"fields": [
{
"name": "price_offset_lots",
"type": "i64"
},
{
"name": "order_type",
"type": {
"defined": "PostOrderType"
}
},
{
"name": "peg_limit",
"type": "i64"
},
{
"name": "max_oracle_staleness_slots",
"type": "i32"
}
]
}
]
}
},
{
"name": "OrderTreeType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bids"
},
{
"name": "Asks"
}
]
}
},
{
"name": "EventType",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fill"
},
{
"name": "Out"
}
]
}
}
],
"events": [
{
"name": "BalanceLog",
"fields": [
{
"name": "openOrdersAcc",
"type": "publicKey",
"index": false
},
{
"name": "basePosition",
"type": "i64",
"index": false
},
{
"name": "quotePosition",
"type": "i128",
"index": false
}
]
},
{
"name": "DepositLog",
"fields": [
{
"name": "openOrdersAcc",
"type": "publicKey",
"index": false
},
{
"name": "signer",
"type": "publicKey",
"index": false
},
{
"name": "quantity",
"type": "u64",
"index": false
}
]
},
{
"name": "FillLog",
"fields": [
{
"name": "takerSide",
"type": "u8",
"index": false
},
{
"name": "makerSlot",
"type": "u8",
"index": false
},
{
"name": "makerOut",
"type": "bool",
"index": false
},
{
"name": "timestamp",
"type": "u64",
"index": false
},
{
"name": "seqNum",
"type": "u64",
"index": false
},
{
"name": "maker",
"type": "publicKey",
"index": false
},
{
"name": "makerClientOrderId",
"type": "u64",
"index": false
},
{
"name": "makerFee",
"type": "f32",
"index": false
},
{
"name": "makerTimestamp",
"type": "u64",
"index": false
},
{
"name": "taker",
"type": "publicKey",
"index": false
},
{
"name": "takerClientOrderId",
"type": "u64",
"index": false
},
{
"name": "takerFee",
"type": "f32",
"index": false
},
{
"name": "price",
"type": "i64",
"index": false
},
{
"name": "quantity",
"type": "i64",
"index": false
}
]
},
{
"name": "MarketMetaDataLog",
"fields": [
{
"name": "market",
"type": "publicKey",
"index": false
},
{
"name": "marketIndex",
"type": "u32",
"index": false
},
{
"name": "baseDecimals",
"type": "u8",
"index": false
},
{
"name": "quoteDecimals",
"type": "u8",
"index": false
},
{
"name": "baseLotSize",
"type": "i64",
"index": false
},
{
"name": "quoteLotSize",
"type": "i64",
"index": false
},
{
"name": "oracle",
"type": "publicKey",
"index": false
}
]
}
],
"errors": [
{
"code": 6000,
"name": "SomeError",
"msg": ""
},
{
"code": 6001,
"name": "NotImplementedError",
"msg": ""
},
{
"code": 6002,
"name": "MathError",
"msg": "checked math error"
},
{
"code": 6003,
"name": "UnexpectedOracle",
"msg": ""
},
{
"code": 6004,
"name": "UnknownOracleType",
"msg": "oracle type cannot be determined"
},
{
"code": 6005,
"name": "InvalidBank",
"msg": "invalid bank"
},
{
"code": 6006,
"name": "ProfitabilityMismatch",
"msg": "account profitability is mismatched"
},
{
"code": 6007,
"name": "CannotSettleWithSelf",
"msg": "cannot settle with self"
},
{
"code": 6008,
"name": "PositionDoesNotExist",
"msg": "perp position does not exist"
},
{
"code": 6009,
"name": "MaxSettleAmountMustBeGreaterThanZero",
"msg": "max settle amount must be greater than zero"
},
{
"code": 6010,
"name": "HasOpenOrders",
"msg": "the perp position has open orders or unprocessed fill events"
},
{
"code": 6011,
"name": "OracleConfidence",
"msg": "an oracle does not reach the confidence threshold"
},
{
"code": 6012,
"name": "OracleStale",
"msg": "an oracle is stale"
},
{
"code": 6013,
"name": "SettlementAmountMustBePositive",
"msg": "settlement amount must always be positive"
},
{
"code": 6014,
"name": "BankBorrowLimitReached",
"msg": "bank utilization has reached limit"
},
{
"code": 6015,
"name": "BankNetBorrowsLimitReached",
"msg": "bank net borrows has reached limit - this is an intermittent error - the limit will reset regularly"
},
{
"code": 6016,
"name": "TokenPositionDoesNotExist",
"msg": "token position does not exist"
},
{
"code": 6017,
"name": "DepositsIntoLiquidatingMustRecover",
"msg": "token deposits into accounts that are being liquidated must bring their health above the init threshold"
},
{
"code": 6018,
"name": "TokenInReduceOnlyMode",
"msg": "token is in reduce only mode"
},
{
"code": 6019,
"name": "MarketInReduceOnlyMode",
"msg": "market is in reduce only mode"
},
{
"code": 6020,
"name": "GroupIsHalted",
"msg": "group is halted"
},
{
"code": 6021,
"name": "HasBaseLots",
"msg": "the perp position has non-zero base lots"
},
{
"code": 6022,
"name": "HasOpenOrUnsettledSerum3Orders",
"msg": "there are open or unsettled serum3 orders"
},
{
"code": 6023,
"name": "HasLiquidatableTokenPosition",
"msg": "has liquidatable token position"
},
{
"code": 6024,
"name": "HasLiquidatableBasePosition",
"msg": "has liquidatable perp base position"
},
{
"code": 6025,
"name": "HasLiquidatablePositivePnl",
"msg": "has liquidatable positive perp pnl"
},
{
"code": 6026,
"name": "AccountIsFrozen",
"msg": "account is frozen"
},
{
"code": 6027,
"name": "InitAssetWeightCantBeNegative",
"msg": "Init Asset Weight can't be negative"
},
{
"code": 6028,
"name": "HasOpenTakerFills",
"msg": "has open perp taker fills"
},
{
"code": 6029,
"name": "DepositLimit",
"msg": "deposit crosses the current group deposit limit"
},
{
"code": 6030,
"name": "IxIsDisabled",
"msg": "instruction is disabled"
},
{
"code": 6031,
"name": "NoLiquidatableBasePosition",
"msg": "no liquidatable perp base position"
},
{
"code": 6032,
"name": "OrderIdNotFound",
"msg": "perp order id not found on the orderbook"
},
{
"code": 6033,
"name": "HealthRegionBadInnerInstruction",
"msg": "HealthRegions allow only specific instructions between Begin and End"
},
{
"code": 6034,
"name": "EventQueueContainsElements",
"msg": "Event queue contains elements and market can't be closed"
},
{
"code": 6035,
"name": "InvalidFeesError",
"msg": "Taker fees should be >= maker fees"
},
{
"code": 6036,
"name": "InvalidOrderType",
"msg": "The order type is invalid. A taker order must be Market or ImmediateOrCancel"
},
{
"code": 6037,
"name": "InvalidFundsReceiver",
"msg": "The receiver is invalid. Makes sure the receiver's owner is the market admin"
}
]
};