From 6fc642d491fa4b7767f224d703808e5f450ce4cb Mon Sep 17 00:00:00 2001 From: Maximilian Schneider Date: Sun, 14 May 2023 21:44:25 +0200 Subject: [PATCH] refactor to run from root and format --- .gitignore | 2 +- README.md | 4 +- configure/anchor_utils.ts | 39 +- configure/common_utils.ts | 15 +- configure/configure_all.ts | 229 - configure/deploy_programs.ts | 60 +- configure/general/accounts.ts | 96 +- configure/general/create_users.ts | 92 +- configure/general/mint_utils.ts | 100 +- configure/general/solana_utils.ts | 61 +- configure/main.ts | 282 + configure/openbook-v2/configure_openbook.ts | 324 +- configure/openbook-v2/create_markets.ts | 198 +- configure/openbook-v2/openbook_v2.ts | 7036 +++++++++---------- configure/output_file.ts | 22 +- configure/programs.json | 24 +- configure/programs/openbook_v2-keypair.json | 7 +- configure/programs/openbook_v2.json | 341 +- configure/programs/pyth_mock.json | 7 +- package.json | 3 + 20 files changed, 4305 insertions(+), 4637 deletions(-) delete mode 100644 configure/configure_all.ts create mode 100644 configure/main.ts diff --git a/.gitignore b/.gitignore index aa85b93..343c797 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /target node_modules -/configure/config.json package-lock.json +**/config.json diff --git a/README.md b/README.md index 6d9055e..210d447 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Here are arguments required by the script, all the arguments are optional: --authority, -a - a string [optional][default: ~/.config/solana/id.json] --number-of-payers, -p - Number of payers used for testing [optional][default: 10] --payer-balance, -b - Balance of payer in SOLs [optional][default: 1 SOLs] ---output-file, -o - a string [optional][default: config.json] +--output-file, -o - a string [optional][default: configure/config.json] ``` Once the cluster configuration is successfully done we create a json file `config.json` @@ -39,7 +39,7 @@ To configure cluster: ```sh cd configure -ts-node configure_all.ts -a /home/user/.config/solana/id.json +yarn configure -a ../solana_configure_local_cluster/faucet.json cd .. ``` diff --git a/configure/anchor_utils.ts b/configure/anchor_utils.ts index c447fa0..d3ee3a4 100644 --- a/configure/anchor_utils.ts +++ b/configure/anchor_utils.ts @@ -1,6 +1,21 @@ -import { AnchorProvider, BN, Program, Provider, web3 } from "@project-serum/anchor"; +import { + AnchorProvider, + BN, + Program, + Provider, + web3, +} from "@project-serum/anchor"; import { SuccessfulTxSimulationResponse } from "@project-serum/anchor/dist/cjs/utils/rpc"; -import { Connection, PublicKey, Transaction, Signer, SendOptions, ConfirmOptions, Commitment, Keypair } from "@solana/web3.js"; +import { + Connection, + PublicKey, + Transaction, + Signer, + SendOptions, + ConfirmOptions, + Commitment, + Keypair, +} from "@solana/web3.js"; import { Command } from "./output_file"; import { IDL, OpenbookV2 } from "./openbook-v2/openbook_v2"; import { U64_MAX_BN } from "@blockworks-foundation/mango-v4"; @@ -12,26 +27,26 @@ export class TestProvider extends AnchorProvider { constructor(connection: Connection, keypair: Keypair) { let txSigner = async (tx: Transaction) => { tx.partialSign(this.keypair); - return tx + return tx; }; - let allSigner = async (txs : Transaction[]) => { - txs.forEach(x=> x.partialSign(this.keypair)); + let allSigner = async (txs: Transaction[]) => { + txs.forEach((x) => x.partialSign(this.keypair)); return txs; }; super( - connection, + connection, { signTransaction: txSigner, signAllTransactions: allSigner, - publicKey : keypair.publicKey, + publicKey: keypair.publicKey, }, - {commitment: 'confirmed'} - ) + { commitment: "confirmed" } + ); this.keypair = keypair; } - getKeypair() : Keypair { - return this.keypair + getKeypair(): Keypair { + return this.keypair; } -} \ No newline at end of file +} diff --git a/configure/common_utils.ts b/configure/common_utils.ts index bccb356..0a40875 100644 --- a/configure/common_utils.ts +++ b/configure/common_utils.ts @@ -1,13 +1,12 @@ import { Keypair } from "@solana/web3.js"; -import * as fs from 'fs'; +import * as fs from "fs"; export function getKeypairFromFile(filePath: String): Keypair { - return Keypair.fromSecretKey( - Uint8Array.from( - JSON.parse( - process.env.KEYPAIR || - fs.readFileSync(filePath.toString(), 'utf-8'), - ), - ), + return Keypair.fromSecretKey( + Uint8Array.from( + JSON.parse( + process.env.KEYPAIR || fs.readFileSync(filePath.toString(), "utf-8") + ) ) + ); } diff --git a/configure/configure_all.ts b/configure/configure_all.ts deleted file mode 100644 index ece3553..0000000 --- a/configure/configure_all.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { command, number, option, string, run, boolean, flag } from 'cmd-ts'; - -import * as fs from 'fs'; - -import programs from './programs.json'; -import { Commitment, Connection, Keypair, LAMPORTS_PER_SOL, Transaction } from '@solana/web3.js'; -import { getKeypairFromFile } from './common_utils'; -import { deploy_programs } from './deploy_programs'; -import { User, createUser, mintUser } from './general/create_users'; -import { configure_accounts } from './general/accounts'; -import { Command, OutputFile } from './output_file'; -import { MintUtils } from './general/mint_utils'; -import { OpenbookConfigurator } from './openbook-v2/configure_openbook'; - -const numberOfAccountsToBeCreated = option({ - type: number, - defaultValue: () => 256, - long: 'number-of-accounts', -}); - -const endpoint = option({ - type: string, - defaultValue: () => "http://127.0.0.1:8899", - long: 'url', - short: 'u', - description: "RPC url", -}); - -const authority = option({ - type: string, - defaultValue: () => "~/.config/solana/id.json", - long: 'authority', - short: 'a' -}); - -const nbPayers = option({ - type: number, - defaultValue: () => 10, - long: 'number-of-payers', - short: 'p', - description: "Number of payers used for testing" -}); - -const balancePerPayer = option({ - type: number, - defaultValue: () => 1, - long: 'payer-balance', - short: 'b', - description: "Balance of payer in SOLs" -}); - -const nbMints = option({ - type: number, - defaultValue: () => 10, - long: 'number-of-mints', - short: 'm', - description: "Number of mints" -}); - -const skipProgramDeployment = flag({ - type: boolean, - defaultValue: () => false, - long: 'skip-program-deployment', - short: 's', - description: "Skip deploying programs" - }); - -const outFile = option({ - type: string, - defaultValue: () => "config.json", - long: 'output-file', - short: 'o' -}); - -const app = command( - { - name: "configure", - args: { - endpoint, - numberOfAccountsToBeCreated, - authority, - nbPayers, - balancePerPayer, - nbMints, - skipProgramDeployment, - outFile, - }, - handler: ({ - endpoint, - numberOfAccountsToBeCreated, - authority, - nbPayers, - balancePerPayer, - nbMints, - skipProgramDeployment, - outFile, - }) => { - console.log("configuring a new test instance"); - configure( - endpoint, - numberOfAccountsToBeCreated, - authority, - nbPayers, - balancePerPayer, - nbMints, - skipProgramDeployment, - outFile, - ).then(_ => { - console.log("configuration finished"); - }); - }, - } -) - -run(app, process.argv.slice(2)) - -// configure part -async function configure( - endpoint: String, - numberOfAccountsToBeCreated: number, - authorityFile: String, - nbPayers: number, - balancePerPayer: number, - nbMints: number, - skipProgramDeployment: boolean, - outFile: String, -) { - // create connections - const connection = new Connection( - endpoint.toString(), - 'confirmed' as Commitment, - ); - - // configure authority - const authority = getKeypairFromFile(authorityFile); - const authorityBalance = await connection.getBalance(authority.publicKey); - const requiredBalance = nbPayers * (balancePerPayer * LAMPORTS_PER_SOL) + 100 * LAMPORTS_PER_SOL; - if (authorityBalance < requiredBalance) { - console.log("authority may have low balance balance " + authorityBalance + " required balance " + requiredBalance); - } - - let programOutputData = programs.map(x => { - - let kp = getKeypairFromFile(x.programKeyPath); - let emptyCommands : Command[] = []; - return { - name: x.name, - program_id: kp.publicKey, - commands: emptyCommands, - } - }) - - let programIds = programOutputData.map(x => { - return x.program_id - }); - if (!skipProgramDeployment) { - console.log("starting program deployment"); - await deploy_programs(endpoint, authorityFile.toString(), programs); - console.log("programs deployed"); - } - - console.log("Creating Mints"); - let mintUtils = new MintUtils(connection, authority); - let mints = await mintUtils.createMints(nbMints); - console.log("Mints created") - - console.log("Configuring openbook-v2") - let index = programs.findIndex(x => x.name === "openbook_v2"); - let openbookProgramId = programOutputData[index].program_id; - let openbookConfigurator = new OpenbookConfigurator(connection, authority, mintUtils, openbookProgramId); - let markets = await openbookConfigurator.configureOpenbookV2(mints); - programOutputData[index].commands = await openbookConfigurator.getCommands(); - console.log("Finished configuring openbook") - - console.log("Creating users"); - let users = await Promise.all(Array.from(Array(nbPayers).keys()).map(_ => createUser(connection, authority, balancePerPayer))); - let tokenAccounts = await Promise.all(users.map( - /// user is richer than bill gates, but not as rich as certain world leaders - async(user) => await mintUser(connection, authority, mints, mintUtils, user.publicKey, 100_000_000_000_000_000) - )) - - let userOpenOrders = await Promise.all(users.map( - /// user is crazy betting all his money in crypto market - async(user) => await openbookConfigurator.configureMarketForUser(user, markets) - )) - - let userData: User [] = users.map((user, i) => { - return { - secret: Array.from(user.secretKey), - open_orders: userOpenOrders[i], - token_data: tokenAccounts[i], - } - }) - - console.log("Users created"); - - console.log("Filling up orderbook"); - await Promise.all( userData.map( async(user, i) => { - for (const market of markets) { - await openbookConfigurator.fillOrderBook(user, users[i], market, 32); - } - }) ) - console.log("Orderbook filled"); - - console.log("Creating accounts") - let accounts = await configure_accounts(connection, authority, numberOfAccountsToBeCreated, programIds); - - // adding known accounts - const marketAccountsList = markets.map(market => [market.asks, market.bids, market.market_pk, market.oracle, market.quote_vault, market.base_vault, market.base_mint, market.quote_mint] ).flat(); - const userAccountsList = userData.map(user => { - const allOpenOrdersAccounts = user.open_orders.map(x=>x.open_orders).flat(); - const allTokenAccounts = user.token_data.map(x => x.token_account); - return allOpenOrdersAccounts.concat(allTokenAccounts) - }).flat() - accounts = accounts.concat(marketAccountsList).concat(userAccountsList); - - console.log("Accounts created") - - let outputFile: OutputFile = { - programs: programOutputData, - known_accounts: accounts, - users: userData, - mints, - markets, - } - - console.log("creating output file") - fs.writeFileSync(outFile.toString(), JSON.stringify(outputFile)); -} diff --git a/configure/deploy_programs.ts b/configure/deploy_programs.ts index 9bdc4c5..7c65afc 100644 --- a/configure/deploy_programs.ts +++ b/configure/deploy_programs.ts @@ -1,31 +1,52 @@ -import { Connection, Keypair, LAMPORTS_PER_SOL, SystemProgram, PublicKey, Transaction, sendAndConfirmTransaction } from "@solana/web3.js"; +import { + Connection, + Keypair, + LAMPORTS_PER_SOL, + SystemProgram, + PublicKey, + Transaction, + sendAndConfirmTransaction, +} from "@solana/web3.js"; import * as web3 from "@solana/web3.js"; import { exec } from "child_process"; -import * as fs from "fs" +import * as fs from "fs"; import { promisify } from "util"; import { getKeypairFromFile } from "./common_utils"; export interface ProgramData { - name: string, - programPath: string, - programKeyPath: string, - idl: string, + name: string; + programPath: string; + programKeyPath: string; + idl: string; } -export async function deploy_programs(url: String, payer: string, programs: ProgramData[]) { - for (const program of programs) { - let cmd = 'solana program deploy --program-id ' + program.programKeyPath + ' --keypair ' + payer + ' --url ' + url + ' ' + program.programPath; - let execPromise = promisify(exec) - // wait for exec to complete - const {stdout, stderr} = await execPromise(cmd); - if (stdout.length > 0) { - console.log(stdout); - } +export async function deploy_programs( + url: String, + payer: string, + programs: ProgramData[] +) { + for (const program of programs) { + let cmd = + "solana program deploy --program-id " + + program.programKeyPath + + " --keypair " + + payer + + " --url " + + url + + " " + + program.programPath; + let execPromise = promisify(exec); + // wait for exec to complete + const { stdout, stderr } = await execPromise(cmd); + if (stdout.length > 0) { + console.log(stdout); + } - if (stderr.length > 0) { - console.log(stderr); - } + if (stderr.length > 0) { + console.log(stderr); + } + /** TODO: this is not working yet bc. anchor wants a workspace if (program.idl.length > 0) { let programId = getKeypairFromFile(program.programKeyPath); console.log("deploying idl file for program " + programId.publicKey); @@ -44,5 +65,6 @@ export async function deploy_programs(url: String, payer: string, programs: Prog } } } - } + */ + } } diff --git a/configure/general/accounts.ts b/configure/general/accounts.ts index 7aa013f..50a2ac2 100644 --- a/configure/general/accounts.ts +++ b/configure/general/accounts.ts @@ -1,46 +1,62 @@ -import { Connection, Keypair, SystemProgram, PublicKey, Transaction, sendAndConfirmTransaction } from "@solana/web3.js"; +import { + Connection, + Keypair, + SystemProgram, + PublicKey, + Transaction, + sendAndConfirmTransaction, +} from "@solana/web3.js"; -export async function configure_accounts(connection: Connection, authority: Keypair, count: number, programs: PublicKey[]): Promise { +export async function configure_accounts( + connection: Connection, + authority: Keypair, + count: number, + programs: PublicKey[] +): Promise { + let all_accounts: PublicKey[] = []; + // create accounts in batches of 16 + for (let i = 0; i < count; i += 16) { + let end = Math.min(i + 16, count); + let nbOfAccs = end - i; + let accounts = await Promise.all( + Array.from(Array(nbOfAccs).keys()).map(async (_) => { + let size = Math.random() * 10_000_000; + if (size < 100) { + size = 100; + } + size = Math.floor(size); - let all_accounts: PublicKey[] = []; - // create accounts in batches of 16 - for (let i = 0; i < count; i += 16) { - let end = Math.min(i + 16, count); - let nbOfAccs = end - i; - let accounts = await Promise.all(Array.from(Array(nbOfAccs).keys()).map(async _ => { - let size = Math.random() * 10_000_000; - if (size < 100) { - size = 100; - } - size = Math.floor(size); + const lamports = await connection.getMinimumBalanceForRentExemption( + size + ); + let kp = Keypair.generate(); + const program = programs[Math.floor(Math.random() * programs.length)]; - const lamports = await connection.getMinimumBalanceForRentExemption(size); - let kp = Keypair.generate(); - const program = programs[Math.floor(Math.random() * programs.length)]; + const transaction = new Transaction().add( + SystemProgram.createAccount({ + fromPubkey: authority.publicKey, + newAccountPubkey: kp.publicKey, + lamports, + space: size, + programId: program, + }) + ); - const transaction = new Transaction().add( - SystemProgram.createAccount({ - fromPubkey: authority.publicKey, - newAccountPubkey: kp.publicKey, - lamports, - space: size, - programId: program, - })) + transaction.feePayer = authority.publicKey; + let hash = await connection.getRecentBlockhash(); + transaction.recentBlockhash = hash.blockhash; + // Sign transaction, broadcast, and confirm + await sendAndConfirmTransaction( + connection, + transaction, + [authority, kp], + { commitment: "confirmed" } + ); - transaction.feePayer = authority.publicKey; - let hash = await connection.getRecentBlockhash(); - transaction.recentBlockhash = hash.blockhash; - // Sign transaction, broadcast, and confirm - await sendAndConfirmTransaction( - connection, - transaction, - [authority, kp], - { commitment: 'confirmed' }, - ); - - return kp.publicKey - })) - all_accounts = all_accounts.concat(accounts); - } - return all_accounts + return kp.publicKey; + }) + ); + all_accounts = all_accounts.concat(accounts); + } + return all_accounts; } diff --git a/configure/general/create_users.ts b/configure/general/create_users.ts index 8fd2d9a..f66d413 100644 --- a/configure/general/create_users.ts +++ b/configure/general/create_users.ts @@ -1,44 +1,74 @@ -import { Connection, Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, sendAndConfirmTransaction } from "@solana/web3.js"; +import { + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + sendAndConfirmTransaction, +} from "@solana/web3.js"; import { Market } from "../openbook-v2/create_markets"; import { MintUtils } from "./mint_utils"; -import * as splToken from '@solana/spl-token' +import * as splToken from "@solana/spl-token"; import { OpenOrders } from "../openbook-v2/configure_openbook"; export interface User { - secret: number[], - token_data : TokenAccountData[], - open_orders: OpenOrders[], + secret: number[]; + token_data: TokenAccountData[]; + open_orders: OpenOrders[]; } -export async function createUser(connection: Connection, authority: Keypair, balancePerPayer: number): Promise { - let payer = Keypair.generate(); - let transfer_ix = SystemProgram.transfer({ - fromPubkey: authority.publicKey, - toPubkey: payer.publicKey, - lamports: balancePerPayer * LAMPORTS_PER_SOL, - }); - let tx = new Transaction().add(transfer_ix); - tx.feePayer = authority.publicKey; - const bh = await connection.getLatestBlockhash(); - tx.recentBlockhash = bh.blockhash; - sendAndConfirmTransaction(connection, tx, [authority]); - return payer +export async function createUser( + connection: Connection, + authority: Keypair, + balancePerPayer: number +): Promise { + let payer = Keypair.generate(); + let transfer_ix = SystemProgram.transfer({ + fromPubkey: authority.publicKey, + toPubkey: payer.publicKey, + lamports: balancePerPayer * LAMPORTS_PER_SOL, + }); + let tx = new Transaction().add(transfer_ix); + tx.feePayer = authority.publicKey; + const bh = await connection.getLatestBlockhash(); + tx.recentBlockhash = bh.blockhash; + sendAndConfirmTransaction(connection, tx, [authority]); + return payer; } interface TokenAccountData { - mint: PublicKey, - token_account: PublicKey + mint: PublicKey; + token_account: PublicKey; } -export async function mintUser(connection: Connection, authority: Keypair, mints: PublicKey[], mintUtils: MintUtils, user: PublicKey, amount: number) : Promise { - return await Promise.all( - mints.map(async(mint)=> { - const tokenAccount = await mintUtils.createTokenAccount(mint, authority, user); - await splToken.mintTo(connection, authority, mint, tokenAccount, authority, amount); - return { - mint: mint, - token_account: tokenAccount - } - }) - ) +export async function mintUser( + connection: Connection, + authority: Keypair, + mints: PublicKey[], + mintUtils: MintUtils, + user: PublicKey, + amount: number +): Promise { + return await Promise.all( + mints.map(async (mint) => { + const tokenAccount = await mintUtils.createTokenAccount( + mint, + authority, + user + ); + await splToken.mintTo( + connection, + authority, + mint, + tokenAccount, + authority, + amount + ); + return { + mint: mint, + token_account: tokenAccount, + }; + }) + ); } diff --git a/configure/general/mint_utils.ts b/configure/general/mint_utils.ts index aea8442..a170119 100644 --- a/configure/general/mint_utils.ts +++ b/configure/general/mint_utils.ts @@ -1,63 +1,59 @@ import * as splToken from "@solana/spl-token"; -import { - PublicKey, - Connection, - Keypair, -} from "@solana/web3.js"; +import { PublicKey, Connection, Keypair } from "@solana/web3.js"; export interface TokenData { - mint : PublicKey, - startingPrice : number, - nbDecimals: number, - priceOracle: Keypair | undefined, + mint: PublicKey; + startingPrice: number; + nbDecimals: number; + priceOracle: Keypair | undefined; } export class MintUtils { + private conn: Connection; + private authority: Keypair; - private conn: Connection; - private authority: Keypair; + constructor(conn: Connection, authority: Keypair) { + this.conn = conn; + this.authority = authority; + } + async createMint(nb_decimals = 6): Promise { + const kp = Keypair.generate(); + return await splToken.createMint( + this.conn, + this.authority, + this.authority.publicKey, + this.authority.publicKey, + nb_decimals, + kp + ); + } - constructor(conn: Connection, authority: Keypair) { - this.conn = conn; - this.authority = authority; - } + public async createMints(nbMints: number): Promise { + return await Promise.all( + Array.from(Array(nbMints).keys()).map((_) => { + return this.createMint(); + }) + ); + } - async createMint(nb_decimals = 6) : Promise { - const kp = Keypair.generate(); - return await splToken.createMint(this.conn, - this.authority, - this.authority.publicKey, - this.authority.publicKey, - nb_decimals, - kp) - } + public async createNewToken(nbDecimals = 6, startingPrice = 1_000_000) { + const mint = await this.createMint(nbDecimals); + const tokenData: TokenData = { + mint: mint, + startingPrice: startingPrice, + nbDecimals: nbDecimals, + priceOracle: undefined, + }; + return tokenData; + } - public async createMints(nbMints: number) : Promise { - return await Promise.all(Array.from(Array(nbMints).keys()).map(_ => { - return this.createMint() - })) - } - - public async createNewToken(nbDecimals = 6, startingPrice = 1_000_000) { - const mint = await this.createMint(nbDecimals); - const tokenData : TokenData = { - mint: mint, - startingPrice : startingPrice, - nbDecimals: nbDecimals, - priceOracle : undefined, - }; - return tokenData; - } - - public async createTokenAccount(mint: PublicKey, payer: Keypair, owner: PublicKey) { - const account = Keypair.generate(); - return splToken.createAccount( - this.conn, - payer, - mint, - owner, - account - ) - } -} \ No newline at end of file + public async createTokenAccount( + mint: PublicKey, + payer: Keypair, + owner: PublicKey + ) { + const account = Keypair.generate(); + return splToken.createAccount(this.conn, payer, mint, owner, account); + } +} diff --git a/configure/general/solana_utils.ts b/configure/general/solana_utils.ts index dd7304b..226560f 100644 --- a/configure/general/solana_utils.ts +++ b/configure/general/solana_utils.ts @@ -1,27 +1,40 @@ -import { Connection, Keypair, PublicKey, SystemProgram, Transaction, sendAndConfirmTransaction } from "@solana/web3.js"; +import { + Connection, + Keypair, + PublicKey, + SystemProgram, + Transaction, + sendAndConfirmTransaction, +} from "@solana/web3.js"; -export async function createAccount(connection: Connection, authority: Keypair, size: number, owner: PublicKey): Promise { - const lamports = await connection.getMinimumBalanceForRentExemption(size); - let address = Keypair.generate(); +export async function createAccount( + connection: Connection, + authority: Keypair, + size: number, + owner: PublicKey +): Promise { + const lamports = await connection.getMinimumBalanceForRentExemption(size); + let address = Keypair.generate(); - const transaction = new Transaction().add( - SystemProgram.createAccount({ - fromPubkey: authority.publicKey, - newAccountPubkey: address.publicKey, - lamports, - space: size, - programId: owner, - })) + const transaction = new Transaction().add( + SystemProgram.createAccount({ + fromPubkey: authority.publicKey, + newAccountPubkey: address.publicKey, + lamports, + space: size, + programId: owner, + }) + ); - transaction.feePayer = authority.publicKey; - let hash = await connection.getRecentBlockhash(); - transaction.recentBlockhash = hash.blockhash; - // Sign transaction, broadcast, and confirm - await sendAndConfirmTransaction( - connection, - transaction, - [authority, address], - { commitment: 'confirmed' }, - ); - return address.publicKey; -} \ No newline at end of file + transaction.feePayer = authority.publicKey; + let hash = await connection.getRecentBlockhash(); + transaction.recentBlockhash = hash.blockhash; + // Sign transaction, broadcast, and confirm + await sendAndConfirmTransaction( + connection, + transaction, + [authority, address], + { commitment: "confirmed" } + ); + return address.publicKey; +} diff --git a/configure/main.ts b/configure/main.ts new file mode 100644 index 0000000..1c51859 --- /dev/null +++ b/configure/main.ts @@ -0,0 +1,282 @@ +import { command, number, option, string, run, boolean, flag } from "cmd-ts"; + +import * as fs from "fs"; + +import programs from "./programs.json"; +import { + Commitment, + Connection, + Keypair, + LAMPORTS_PER_SOL, + Transaction, +} from "@solana/web3.js"; +import { getKeypairFromFile } from "./common_utils"; +import { deploy_programs } from "./deploy_programs"; +import { User, createUser, mintUser } from "./general/create_users"; +import { configure_accounts } from "./general/accounts"; +import { Command, OutputFile } from "./output_file"; +import { MintUtils } from "./general/mint_utils"; +import { OpenbookConfigurator } from "./openbook-v2/configure_openbook"; + +const numberOfAccountsToBeCreated = option({ + type: number, + defaultValue: () => 256, + long: "number-of-accounts", +}); + +const endpoint = option({ + type: string, + defaultValue: () => "http://127.0.0.1:8899", + long: "url", + short: "u", + description: "RPC url", +}); + +const authority = option({ + type: string, + defaultValue: () => "~/.config/solana/id.json", + long: "authority", + short: "a", +}); + +const nbPayers = option({ + type: number, + defaultValue: () => 10, + long: "number-of-payers", + short: "p", + description: "Number of payers used for testing", +}); + +const balancePerPayer = option({ + type: number, + defaultValue: () => 1, + long: "payer-balance", + short: "b", + description: "Balance of payer in SOLs", +}); + +const nbMints = option({ + type: number, + defaultValue: () => 10, + long: "number-of-mints", + short: "m", + description: "Number of mints", +}); + +const skipProgramDeployment = flag({ + type: boolean, + defaultValue: () => false, + long: "skip-program-deployment", + short: "s", + description: "Skip deploying programs", +}); + +const outFile = option({ + type: string, + defaultValue: () => "cofigure/config.json", + long: "output-file", + short: "o", +}); + +const app = command({ + name: "configure", + args: { + endpoint, + numberOfAccountsToBeCreated, + authority, + nbPayers, + balancePerPayer, + nbMints, + skipProgramDeployment, + outFile, + }, + handler: ({ + endpoint, + numberOfAccountsToBeCreated, + authority, + nbPayers, + balancePerPayer, + nbMints, + skipProgramDeployment, + outFile, + }) => { + console.log("configuring a new test instance"); + configure( + endpoint, + numberOfAccountsToBeCreated, + authority, + nbPayers, + balancePerPayer, + nbMints, + skipProgramDeployment, + outFile + ).then((_) => { + console.log("configuration finished"); + }); + }, +}); + +run(app, process.argv.slice(2)); + +// configure part +async function configure( + endpoint: String, + numberOfAccountsToBeCreated: number, + authorityFile: String, + nbPayers: number, + balancePerPayer: number, + nbMints: number, + skipProgramDeployment: boolean, + outFile: String +) { + // create connections + const connection = new Connection( + endpoint.toString(), + "confirmed" as Commitment + ); + + // configure authority + const authority = getKeypairFromFile(authorityFile); + const authorityBalance = await connection.getBalance(authority.publicKey); + const requiredBalance = + nbPayers * (balancePerPayer * LAMPORTS_PER_SOL) + 100 * LAMPORTS_PER_SOL; + if (authorityBalance < requiredBalance) { + console.log( + "authority may have low balance balance " + + authorityBalance + + " required balance " + + requiredBalance + ); + } + + let programOutputData = programs.map((x) => { + let kp = getKeypairFromFile(x.programKeyPath); + let emptyCommands: Command[] = []; + return { + name: x.name, + program_id: kp.publicKey, + commands: emptyCommands, + }; + }); + + let programIds = programOutputData.map((x) => { + return x.program_id; + }); + if (!skipProgramDeployment) { + console.log("starting program deployment"); + await deploy_programs(endpoint, authorityFile.toString(), programs); + console.log("programs deployed"); + } + + console.log("Creating Mints"); + let mintUtils = new MintUtils(connection, authority); + let mints = await mintUtils.createMints(nbMints); + console.log("Mints created"); + + console.log("Configuring openbook-v2"); + let index = programs.findIndex((x) => x.name === "openbook_v2"); + let openbookProgramId = programOutputData[index].program_id; + let openbookConfigurator = new OpenbookConfigurator( + connection, + authority, + mintUtils, + openbookProgramId + ); + let markets = await openbookConfigurator.configureOpenbookV2(mints); + programOutputData[index].commands = await openbookConfigurator.getCommands(); + console.log("Finished configuring openbook"); + + console.log("Creating users"); + let users = await Promise.all( + Array.from(Array(nbPayers).keys()).map((_) => + createUser(connection, authority, balancePerPayer) + ) + ); + let tokenAccounts = await Promise.all( + users.map( + /// user is richer than bill gates, but not as rich as certain world leaders + async (user) => + await mintUser( + connection, + authority, + mints, + mintUtils, + user.publicKey, + 100_000_000_000_000_000 + ) + ) + ); + + let userOpenOrders = await Promise.all( + users.map( + /// user is crazy betting all his money in crypto market + async (user) => + await openbookConfigurator.configureMarketForUser(user, markets) + ) + ); + + let userData: User[] = users.map((user, i) => { + return { + secret: Array.from(user.secretKey), + open_orders: userOpenOrders[i], + token_data: tokenAccounts[i], + }; + }); + + console.log("Users created"); + + console.log("Filling up orderbook"); + await Promise.all( + userData.map(async (user, i) => { + for (const market of markets) { + await openbookConfigurator.fillOrderBook(user, users[i], market, 32); + } + }) + ); + console.log("Orderbook filled"); + + console.log("Creating accounts"); + let accounts = await configure_accounts( + connection, + authority, + numberOfAccountsToBeCreated, + programIds + ); + + // adding known accounts + const marketAccountsList = markets + .map((market) => [ + market.asks, + market.bids, + market.market_pk, + market.oracle, + market.quote_vault, + market.base_vault, + market.base_mint, + market.quote_mint, + ]) + .flat(); + const userAccountsList = userData + .map((user) => { + const allOpenOrdersAccounts = user.open_orders + .map((x) => x.open_orders) + .flat(); + const allTokenAccounts = user.token_data.map((x) => x.token_account); + return allOpenOrdersAccounts.concat(allTokenAccounts); + }) + .flat(); + accounts = accounts.concat(marketAccountsList).concat(userAccountsList); + + console.log("Accounts created"); + + let outputFile: OutputFile = { + programs: programOutputData, + known_accounts: accounts, + users: userData, + mints, + markets, + }; + + console.log("creating output file"); + fs.writeFileSync(outFile.toString(), JSON.stringify(outputFile)); +} diff --git a/configure/openbook-v2/configure_openbook.ts b/configure/openbook-v2/configure_openbook.ts index 7b34409..b847744 100644 --- a/configure/openbook-v2/configure_openbook.ts +++ b/configure/openbook-v2/configure_openbook.ts @@ -3,7 +3,7 @@ import { TestProvider } from "../anchor_utils"; import { Market, createMarket } from "./create_markets"; import { MintUtils } from "../general/mint_utils"; import { OpenbookV2 } from "./openbook_v2"; -import IDL from '../programs/openbook_v2.json' +import IDL from "../programs/openbook_v2.json"; import { BN, Program, web3, IdlTypes } from "@project-serum/anchor"; import { User } from "../general/create_users"; import { U64_MAX_BN } from "@blockworks-foundation/mango-v4"; @@ -12,136 +12,176 @@ import { Command } from "../output_file"; import assert from "assert"; export interface OpenOrders { - market: PublicKey, - open_orders: PublicKey + market: PublicKey; + open_orders: PublicKey; } export class OpenbookConfigurator { + anchorProvider: TestProvider; + mintUtils: MintUtils; + openbookProgramId: PublicKey; + program: Program; - anchorProvider: TestProvider; - mintUtils: MintUtils; - openbookProgramId: PublicKey; - program: Program; + constructor( + connection: Connection, + authority: Keypair, + mintUtils: MintUtils, + openbookProgramId: PublicKey + ) { + this.anchorProvider = new TestProvider(connection, authority); + this.mintUtils = mintUtils; + this.openbookProgramId = openbookProgramId; + this.program = new Program( + IDL as OpenbookV2, + this.openbookProgramId, + this.anchorProvider + ); + } - constructor(connection: Connection, authority: Keypair, mintUtils: MintUtils, openbookProgramId: PublicKey) { - this.anchorProvider = new TestProvider(connection, authority); - this.mintUtils = mintUtils; - this.openbookProgramId = openbookProgramId; - this.program = new Program( - IDL as OpenbookV2, - this.openbookProgramId, + public async configureOpenbookV2(mints: PublicKey[]): Promise { + let quoteMint = mints[0]; + let admin = Keypair.generate(); + return await Promise.all( + mints + .slice(1) + .map((mint, index) => + createMarket( + this.program, this.anchorProvider, - ); - } - - public async configureOpenbookV2(mints: PublicKey[]): Promise { - let quoteMint = mints[0]; - let admin = Keypair.generate(); - return await Promise.all(mints.slice(1).map((mint, index) => createMarket(this.program, this.anchorProvider, this.mintUtils, admin, this.openbookProgramId, mint, quoteMint, index))) - } - - public async configureMarketForUser(user: Keypair, markets: Market[],) : Promise { - - const openOrders = await Promise.all( - markets.map(async(market) => { - let accountIndex = new BN(0); - let [openOrders, _tmp] = PublicKey.findProgramAddressSync([Buffer.from("OpenOrders"), user.publicKey.toBuffer(), market.market_pk.toBuffer(), accountIndex.toBuffer("le", 4)], this.openbookProgramId) - - await this.program.methods.initOpenOrders( - 0, - 64 - ).accounts({ - openOrdersAccount: openOrders, - market: market.market_pk, - owner: user.publicKey, - payer: this.anchorProvider.publicKey, - systemProgram: web3.SystemProgram.programId, - }).signers([user]).rpc(); - return [market.market_pk, openOrders] - }) + this.mintUtils, + admin, + this.openbookProgramId, + mint, + quoteMint, + index + ) ) + ); + } - return openOrders.map(x=> { - return { - market : x[0], - open_orders : x[1], - } + public async configureMarketForUser( + user: Keypair, + markets: Market[] + ): Promise { + const openOrders = await Promise.all( + markets.map(async (market) => { + let accountIndex = new BN(0); + let [openOrders, _tmp] = PublicKey.findProgramAddressSync( + [ + Buffer.from("OpenOrders"), + user.publicKey.toBuffer(), + market.market_pk.toBuffer(), + accountIndex.toBuffer("le", 4), + ], + this.openbookProgramId + ); + + await this.program.methods + .initOpenOrders(0, 64) + .accounts({ + openOrdersAccount: openOrders, + market: market.market_pk, + owner: user.publicKey, + payer: this.anchorProvider.publicKey, + systemProgram: web3.SystemProgram.programId, + }) + .signers([user]) + .rpc(); + return [market.market_pk, openOrders]; + }) + ); + + return openOrders.map((x) => { + return { + market: x[0], + open_orders: x[1], + }; + }); + } + + public async fillOrderBook( + user: User, + userKp: Keypair, + market: Market, + nbOrders: number + ) { + for (let i = 0; i < nbOrders; ++i) { + let side = { bid: {} }; + let placeOrder = { limit: {} }; + + await this.program.methods + .placeOrder( + side, + new BN(1000 - 1 - i), + new BN(10), + new BN(1000000), + new BN(i), + placeOrder, + false, + U64_MAX_BN, + 255 + ) + .accounts({ + asks: market.asks, + baseVault: market.base_vault, + bids: market.bids, + eventQueue: market.event_queue, + market: market.market_pk, + openOrdersAccount: user.open_orders[market.market_index].open_orders, + oracle: market.oracle, + owner: userKp.publicKey, + payer: user.token_data[0].token_account, + quoteVault: market.quote_vault, + systemProgram: web3.SystemProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, }) + .signers([userKp]) + .rpc(); } - public async fillOrderBook(user: User, userKp: Keypair, market: Market, nbOrders: number) { + for (let i = 0; i < nbOrders; ++i) { + let side = { ask: {} }; + let placeOrder = { limit: {} }; - for( let i=0; i { - let side = {bid:{}} ; - let placeOrder = {limit:{}}; - let placeOrderIx = await this.program.methods.placeOrder( + /// this is a special method. + /// It is pain to create an anchor instruction in rust + /// so this method will create the instruction in typescript and serialize into bytes and store it into command type + public async getCommands(): Promise { + let side = { bid: {} }; + let placeOrder = { limit: {} }; + let placeOrderIx = await this.program.methods + .placeOrder( side, new BN(0), new BN(0), @@ -150,8 +190,9 @@ export class OpenbookConfigurator { placeOrder, false, U64_MAX_BN, - 255, - ).accounts({ + 255 + ) + .accounts({ asks: PublicKey.default, baseVault: PublicKey.default, bids: PublicKey.default, @@ -164,31 +205,34 @@ export class OpenbookConfigurator { quoteVault: PublicKey.default, systemProgram: web3.SystemProgram.programId, tokenProgram: TOKEN_PROGRAM_ID, - }).instruction(); + }) + .instruction(); let argument_sizes = [8, 1, 8, 8, 8, 8, 1, 1, 8, 1]; - assert(argument_sizes.reduce( (sum, current) => sum + current, 0 ) === placeOrderIx.data.length); - let placeOrderCommand : Command = { - name: "placeOrder", - instruction: Array.from(placeOrderIx.data), - argument_sizes, + assert( + argument_sizes.reduce((sum, current) => sum + current, 0) === + placeOrderIx.data.length + ); + let placeOrderCommand: Command = { + name: "placeOrder", + instruction: Array.from(placeOrderIx.data), + argument_sizes, }; - let consumeEvents = await this.program.methods.consumeEvents( - new BN(0), - ).accounts( - { - eventQueue: PublicKey.default, - market: PublicKey.default, - } - ).instruction(); + let consumeEvents = await this.program.methods + .consumeEvents(new BN(0)) + .accounts({ + eventQueue: PublicKey.default, + market: PublicKey.default, + }) + .instruction(); - let consumeEventsCommand : Command = { - instruction: Array.from(consumeEvents.data), - name: "consumeEvents", - argument_sizes: [8, 1] - } + let consumeEventsCommand: Command = { + instruction: Array.from(consumeEvents.data), + name: "consumeEvents", + argument_sizes: [8, 1], + }; - return [placeOrderCommand, consumeEventsCommand] + return [placeOrderCommand, consumeEventsCommand]; } -} \ No newline at end of file +} diff --git a/configure/openbook-v2/create_markets.ts b/configure/openbook-v2/create_markets.ts index 190a74c..fce2fcf 100644 --- a/configure/openbook-v2/create_markets.ts +++ b/configure/openbook-v2/create_markets.ts @@ -1,92 +1,136 @@ -import { Connection, Keypair, PublicKey } from '@solana/web3.js'; -import IDL from '../programs/openbook_v2.json' -import { Program, web3, BN } from '@project-serum/anchor'; -import { createAccount } from '../general/solana_utils'; -import { MintUtils } from '../general/mint_utils'; -import { I80F48, I80F48Dto } from '@blockworks-foundation/mango-v4'; -import { OpenbookV2 } from './openbook_v2'; -import { TestProvider } from '../anchor_utils'; +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; +import IDL from "../programs/openbook_v2.json"; +import { Program, web3, BN } from "@project-serum/anchor"; +import { createAccount } from "../general/solana_utils"; +import { MintUtils } from "../general/mint_utils"; +import { I80F48, I80F48Dto } from "@blockworks-foundation/mango-v4"; +import { OpenbookV2 } from "./openbook_v2"; +import { TestProvider } from "../anchor_utils"; export interface Market { - name: string, - admin : number[], - market_pk: PublicKey - oracle: PublicKey, - asks: PublicKey, - bids: PublicKey, - event_queue: PublicKey, - base_vault: PublicKey, - quote_vault: PublicKey, - base_mint: PublicKey, - quote_mint: PublicKey, - market_index: number, + name: string; + admin: number[]; + market_pk: PublicKey; + oracle: PublicKey; + asks: PublicKey; + bids: PublicKey; + event_queue: PublicKey; + base_vault: PublicKey; + quote_vault: PublicKey; + base_mint: PublicKey; + quote_mint: PublicKey; + market_index: number; } -export async function createMarket(program:Program, anchorProvider: TestProvider, mintUtils: MintUtils, adminKp: Keypair, openbookProgramId: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, index: number): Promise { - let [oracleId, _tmp] = PublicKey.findProgramAddressSync([Buffer.from("StubOracle"), baseMint.toBytes()], openbookProgramId) - const admin:PublicKey = adminKp.publicKey; +export async function createMarket( + program: Program, + anchorProvider: TestProvider, + mintUtils: MintUtils, + adminKp: Keypair, + openbookProgramId: PublicKey, + baseMint: PublicKey, + quoteMint: PublicKey, + index: number +): Promise { + let [oracleId, _tmp] = PublicKey.findProgramAddressSync( + [Buffer.from("StubOracle"), baseMint.toBytes()], + openbookProgramId + ); + const admin: PublicKey = adminKp.publicKey; - await program.methods.stubOracleCreate({ val: I80F48.fromNumber(1.0).getData() }) + await program.methods + .stubOracleCreate({ val: I80F48.fromNumber(1.0).getData() }) .accounts({ - oracle: oracleId, - admin, - mint: baseMint, - payer: anchorProvider.wallet.publicKey, - systemProgram: web3.SystemProgram.programId, + oracle: oracleId, + admin, + mint: baseMint, + payer: anchorProvider.wallet.publicKey, + systemProgram: web3.SystemProgram.programId, }) .signers([adminKp]) .rpc(); - // bookside size = 123720 - let asks = await createAccount(anchorProvider.connection, anchorProvider.keypair, 123720, openbookProgramId); - let bids = await createAccount(anchorProvider.connection, anchorProvider.keypair, 123720, openbookProgramId); - let eventQueue = await createAccount(anchorProvider.connection, anchorProvider.keypair, 97688, openbookProgramId); - let marketIndex : BN = new BN(index); + // bookside size = 123720 + let asks = await createAccount( + anchorProvider.connection, + anchorProvider.keypair, + 123720, + openbookProgramId + ); + let bids = await createAccount( + anchorProvider.connection, + anchorProvider.keypair, + 123720, + openbookProgramId + ); + let eventQueue = await createAccount( + anchorProvider.connection, + anchorProvider.keypair, + 97688, + openbookProgramId + ); + let marketIndex: BN = new BN(index); - let [marketPk, _tmp2] = PublicKey.findProgramAddressSync([Buffer.from("Market"), admin.toBuffer(), marketIndex.toBuffer("le", 4)], openbookProgramId) + let [marketPk, _tmp2] = PublicKey.findProgramAddressSync( + [Buffer.from("Market"), admin.toBuffer(), marketIndex.toBuffer("le", 4)], + openbookProgramId + ); - let baseVault = await mintUtils.createTokenAccount(baseMint, anchorProvider.keypair, marketPk); - let quoteVault = await mintUtils.createTokenAccount(quoteMint, anchorProvider.keypair, marketPk); - let name = 'index ' + index.toString() + ' wrt 0'; + let baseVault = await mintUtils.createTokenAccount( + baseMint, + anchorProvider.keypair, + marketPk + ); + let quoteVault = await mintUtils.createTokenAccount( + quoteMint, + anchorProvider.keypair, + marketPk + ); + let name = "index " + index.toString() + " wrt 0"; - await program.methods.createMarket( - marketIndex, - name, - { - confFilter: 0, - maxStalenessSlots: 100, - }, - new BN(1), new BN(1), 0, 0, 0 - ).accounts( - { - admin, - market: marketPk, - bids, - asks, - eventQueue, - payer: anchorProvider.publicKey, - baseVault, - quoteVault, - baseMint, - quoteMint, - systemProgram: web3.SystemProgram.programId, - oracle: oracleId, - } - ).signers([adminKp]) + await program.methods + .createMarket( + marketIndex, + name, + { + confFilter: 0, + maxStalenessSlots: 100, + }, + new BN(1), + new BN(1), + 0, + 0, + 0 + ) + .accounts({ + admin, + market: marketPk, + bids, + asks, + eventQueue, + payer: anchorProvider.publicKey, + baseVault, + quoteVault, + baseMint, + quoteMint, + systemProgram: web3.SystemProgram.programId, + oracle: oracleId, + }) + .signers([adminKp]) .rpc(); - return { - admin: Array.from(adminKp.secretKey), - name, - bids, - asks, - event_queue: eventQueue, - base_mint: baseMint, - base_vault: baseVault, - market_index: index, - market_pk: marketPk, - oracle: oracleId, - quote_mint: quoteMint, - quote_vault: quoteVault, - } -} \ No newline at end of file + return { + admin: Array.from(adminKp.secretKey), + name, + bids, + asks, + event_queue: eventQueue, + base_mint: baseMint, + base_vault: baseVault, + market_index: index, + market_pk: marketPk, + oracle: oracleId, + quote_mint: quoteMint, + quote_vault: quoteVault, + }; +} diff --git a/configure/openbook-v2/openbook_v2.ts b/configure/openbook-v2/openbook_v2.ts index 0fbf13f..d1ec180 100644 --- a/configure/openbook-v2/openbook_v2.ts +++ b/configure/openbook-v2/openbook_v2.ts @@ -1,158 +1,158 @@ export type OpenbookV2 = { - "version": "0.1.0", - "name": "openbook_v2", - "instructions": [ + version: "0.1.0"; + name: "openbook_v2"; + instructions: [ { - "name": "createMarket", - "docs": [ + name: "createMarket"; + docs: [ "Create a [`Market`](crate::state::Market) for a given token pair." - ], - "accounts": [ + ]; + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false, - "docs": [ + 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: "asks"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "baseMint", - "isMut": false, - "isSigner": false + name: "baseMint"; + isMut: false; + isSigner: false; }, { - "name": "quoteMint", - "isMut": false, - "isSigner": false + name: "quoteMint"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "marketIndex", - "type": "u32" + name: "marketIndex"; + type: "u32"; }, { - "name": "name", - "type": "string" + name: "name"; + type: "string"; }, { - "name": "oracleConfig", - "type": { - "defined": "OracleConfigParams" - } + name: "oracleConfig"; + type: { + defined: "OracleConfigParams"; + }; }, { - "name": "quoteLotSize", - "type": "i64" + name: "quoteLotSize"; + type: "i64"; }, { - "name": "baseLotSize", - "type": "i64" + name: "baseLotSize"; + type: "i64"; }, { - "name": "makerFee", - "type": "f32" + name: "makerFee"; + type: "f32"; }, { - "name": "takerFee", - "type": "f32" + name: "takerFee"; + type: "f32"; }, { - "name": "feePenalty", - "type": "f32" + name: "feePenalty"; + type: "f32"; } - ] + ]; }, { - "name": "initOpenOrders", - "accounts": [ + name: "initOpenOrders"; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": true, - "isSigner": true + name: "owner"; + isMut: true; + isSigner: true; }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "accountNum", - "type": "u32" + name: "accountNum"; + type: "u32"; }, { - "name": "openOrdersCount", - "type": "u8" + name: "openOrdersCount"; + type: "u8"; } - ] + ]; }, { - "name": "placeOrder", - "docs": [ + name: "placeOrder"; + docs: [ "Place an order.", "", "Different types of orders have different effects on the order book,", @@ -169,348 +169,348 @@ export type OpenbookV2 = { "`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": [ + ]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer"; + isMut: true; + isSigner: false; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle"; + isMut: false; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side"; + type: { + defined: "Side"; + }; }, { - "name": "priceLots", - "type": "i64" + name: "priceLots"; + type: "i64"; }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots"; + type: "i64"; }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees"; + type: "i64"; }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId"; + type: "u64"; }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType"; + type: { + defined: "PlaceOrderType"; + }; }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly"; + type: "bool"; }, { - "name": "expiryTimestamp", - "type": "u64" + name: "expiryTimestamp"; + type: "u64"; }, { - "name": "limit", - "type": "u8" + name: "limit"; + type: "u8"; } - ], - "returns": { - "option": "u128" - } + ]; + returns: { + option: "u128"; + }; }, { - "name": "placeOrderPegged", - "accounts": [ + name: "placeOrderPegged"; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer"; + isMut: true; + isSigner: false; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle"; + isMut: false; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side"; + type: { + defined: "Side"; + }; }, { - "name": "priceOffsetLots", - "type": "i64" + name: "priceOffsetLots"; + type: "i64"; }, { - "name": "pegLimit", - "type": "i64" + name: "pegLimit"; + type: "i64"; }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots"; + type: "i64"; }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees"; + type: "i64"; }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId"; + type: "u64"; }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType"; + type: { + defined: "PlaceOrderType"; + }; }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly"; + type: "bool"; }, { - "name": "expiryTimestamp", - "type": "u64" + name: "expiryTimestamp"; + type: "u64"; }, { - "name": "limit", - "type": "u8" + name: "limit"; + type: "u8"; }, { - "name": "maxOracleStalenessSlots", - "type": "i32" + name: "maxOracleStalenessSlots"; + type: "i32"; } - ], - "returns": { - "option": "u128" - } + ]; + returns: { + option: "u128"; + }; }, { - "name": "placeTakeOrder", - "docs": [ + 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": [ + ]; + accounts: [ { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer"; + isMut: true; + isSigner: false; }, { - "name": "receiver", - "isMut": true, - "isSigner": false + name: "receiver"; + isMut: true; + isSigner: false; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle"; + isMut: false; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side"; + type: { + defined: "Side"; + }; }, { - "name": "priceLots", - "type": "i64" + name: "priceLots"; + type: "i64"; }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots"; + type: "i64"; }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees"; + type: "i64"; }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId"; + type: "u64"; }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType"; + type: { + defined: "PlaceOrderType"; + }; }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly"; + type: "bool"; }, { - "name": "limit", - "type": "u8" + name: "limit"; + type: "u8"; } - ], - "returns": { - "option": "u128" - } + ]; + returns: { + option: "u128"; + }; }, { - "name": "consumeEvents", - "docs": [ + name: "consumeEvents"; + docs: [ "Process up to `limit` [events](crate::state::AnyEvent).", "", "When a user places a 'take' order, they do not know beforehand which", @@ -534,1676 +534,1497 @@ export type OpenbookV2 = { "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": [ + ]; + accounts: [ { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "limit", - "type": "u64" + name: "limit"; + type: "u64"; } - ] + ]; }, { - "name": "cancelOrder", - "docs": [ + 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": [ + ]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "orderId", - "type": "u128" + name: "orderId"; + type: "u128"; } - ] + ]; }, { - "name": "cancelOrderByClientOrderId", - "docs": [ + 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": [ + ]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": false, - "isSigner": false + name: "market"; + isMut: false; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId"; + type: "u64"; } - ] + ]; }, { - "name": "cancelAllOrders", - "docs": [ - "Cancel up to `limit` orders." - ], - "accounts": [ + name: "cancelAllOrders"; + docs: ["Cancel up to `limit` orders."]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": false, - "isSigner": false + name: "market"; + isMut: false; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "limit", - "type": "u8" + name: "limit"; + type: "u8"; } - ] + ]; }, { - "name": "cancelAllOrdersBySide", - "docs": [ - "Cancel up to `limit` orders on a single side of the book." - ], - "accounts": [ + name: "cancelAllOrdersBySide"; + docs: ["Cancel up to `limit` orders on a single side of the book."]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": false, - "isSigner": false + name: "market"; + isMut: false; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "sideOption", - "type": { - "option": { - "defined": "Side" - } - } + name: "sideOption"; + type: { + option: { + defined: "Side"; + }; + }; }, { - "name": "limit", - "type": "u8" + name: "limit"; + type: "u8"; } - ] + ]; }, { - "name": "deposit", - "docs": [ + 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": [ + ]; + accounts: [ { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner"; + isMut: false; + isSigner: true; }, { - "name": "payerBase", - "isMut": true, - "isSigner": false + name: "payerBase"; + isMut: true; + isSigner: false; }, { - "name": "payerQuote", - "isMut": true, - "isSigner": false + name: "payerQuote"; + isMut: true; + isSigner: false; }, { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "baseAmountLots", - "type": "u64" + name: "baseAmountLots"; + type: "u64"; }, { - "name": "quoteAmountLots", - "type": "u64" + name: "quoteAmountLots"; + type: "u64"; } - ] + ]; }, { - "name": "settleFunds", - "docs": [ - "Withdraw any available tokens." - ], - "accounts": [ + name: "settleFunds"; + docs: ["Withdraw any available tokens."]; + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount"; + isMut: true; + isSigner: false; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "payerBase", - "isMut": true, - "isSigner": false + name: "payerBase"; + isMut: true; + isSigner: false; }, { - "name": "payerQuote", - "isMut": true, - "isSigner": false + name: "payerQuote"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "sweepFees", - "docs": [ - "Sweep fees, as a [`Market`](crate::state::Market)'s admin." - ], - "accounts": [ + name: "sweepFees"; + docs: ["Sweep fees, as a [`Market`](crate::state::Market)'s admin."]; + accounts: [ { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "receiver", - "isMut": true, - "isSigner": false + name: "receiver"; + isMut: true; + isSigner: false; }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "closeMarket", - "docs": [ - "Close a [`Market`](crate::state::Market)." - ], - "accounts": [ + name: "closeMarket"; + docs: ["Close a [`Market`](crate::state::Market)."]; + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market"; + isMut: true; + isSigner: false; }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids"; + isMut: true; + isSigner: false; }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks"; + isMut: true; + isSigner: false; }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue"; + isMut: true; + isSigner: false; }, { - "name": "solDestination", - "isMut": true, - "isSigner": false + name: "solDestination"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "stubOracleCreate", - "accounts": [ + name: "stubOracleCreate"; + accounts: [ { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "mint", - "isMut": false, - "isSigner": false + name: "mint"; + isMut: false; + isSigner: false; }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer"; + isMut: true; + isSigner: true; }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram"; + isMut: false; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "price", - "type": { - "defined": "I80F48" - } + name: "price"; + type: { + defined: "I80F48"; + }; } - ] + ]; }, { - "name": "stubOracleClose", - "accounts": [ + name: "stubOracleClose"; + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; }, { - "name": "solDestination", - "isMut": true, - "isSigner": false + name: "solDestination"; + isMut: true; + isSigner: false; }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram"; + isMut: false; + isSigner: false; } - ], - "args": [] + ]; + args: []; }, { - "name": "stubOracleSet", - "accounts": [ + name: "stubOracleSet"; + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin"; + isMut: false; + isSigner: true; }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle"; + isMut: true; + isSigner: false; } - ], - "args": [ + ]; + args: [ { - "name": "price", - "type": { - "defined": "I80F48" - } + name: "price"; + type: { + defined: "I80F48"; + }; } - ] + ]; } - ], - "accounts": [ + ]; + accounts: [ { - "name": "market", - "type": { - "kind": "struct", - "fields": [ + name: "market"; + type: { + kind: "struct"; + fields: [ { - "name": "admin", - "docs": [ - "Admin who can close this market" - ], - "type": "publicKey" + name: "admin"; + docs: ["Admin who can close this market"]; + type: "publicKey"; }, { - "name": "marketIndex", - "docs": [ - "Index of this market" - ], - "type": "u32" + name: "marketIndex"; + docs: ["Index of this market"]; + type: "u32"; }, { - "name": "bump", - "docs": [ - "PDA bump" - ], - "type": "u8" + name: "bump"; + docs: ["PDA bump"]; + type: "u8"; }, { - "name": "baseDecimals", - "docs": [ + 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" + ]; + type: "u8"; }, { - "name": "quoteDecimals", - "type": "u8" + name: "quoteDecimals"; + type: "u8"; }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "padding1"; + type: { + array: ["u8", 1]; + }; }, { - "name": "name", - "docs": [ - "Name. Trailing zero bytes are ignored." - ], - "type": { - "array": [ - "u8", - 16 - ] - } + 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: "bids"; + docs: ["Address of the BookSide account for bids"]; + type: "publicKey"; }, { - "name": "asks", - "docs": [ - "Address of the BookSide account for asks" - ], - "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: "eventQueue"; + docs: ["Address of the EventQueue account"]; + type: "publicKey"; }, { - "name": "oracle", - "docs": [ - "Oracle account address" - ], - "type": "publicKey" + name: "oracle"; + docs: ["Oracle account address"]; + type: "publicKey"; }, { - "name": "oracleConfig", - "docs": [ - "Oracle configuration" - ], - "type": { - "defined": "OracleConfig" - } + name: "oracleConfig"; + docs: ["Oracle configuration"]; + type: { + defined: "OracleConfig"; + }; }, { - "name": "stablePriceModel", - "docs": [ + name: "stablePriceModel"; + docs: [ "Maintains a stable price based on the oracle price that is less volatile." - ], - "type": { - "defined": "StablePriceModel" - } + ]; + type: { + defined: "StablePriceModel"; + }; }, { - "name": "quoteLotSize", - "docs": [ + 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" + ]; + type: "i64"; }, { - "name": "baseLotSize", - "docs": [ + 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" + ]; + type: "i64"; }, { - "name": "seqNum", - "docs": [ - "Total number of orders seen" - ], - "type": "u64" + 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: "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: "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: "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: "feesAccrued"; + docs: ["Fees accrued in native quote currency"]; + type: { + defined: "I80F48"; + }; }, { - "name": "feesSettled", - "docs": [ - "Fees settled 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: "feePenalty"; + docs: ["Fee (in quote native) to charge for ioc orders"]; + type: "f32"; }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding2"; + type: { + array: ["u8", 4]; + }; }, { - "name": "buybackFeesExpiryInterval", - "type": "u64" + name: "buybackFeesExpiryInterval"; + type: "u64"; }, { - "name": "vaultSignerNonce", - "type": "u64" + name: "vaultSignerNonce"; + type: "u64"; }, { - "name": "baseMint", - "type": "publicKey" + name: "baseMint"; + type: "publicKey"; }, { - "name": "quoteMint", - "type": "publicKey" + name: "quoteMint"; + type: "publicKey"; }, { - "name": "baseVault", - "type": "publicKey" + name: "baseVault"; + type: "publicKey"; }, { - "name": "baseDepositTotal", - "type": "u64" + name: "baseDepositTotal"; + type: "u64"; }, { - "name": "baseFeesAccrued", - "type": "u64" + name: "baseFeesAccrued"; + type: "u64"; }, { - "name": "quoteVault", - "type": "publicKey" + name: "quoteVault"; + type: "publicKey"; }, { - "name": "quoteDepositTotal", - "type": "u64" + name: "quoteDepositTotal"; + type: "u64"; }, { - "name": "quoteFeesAccrued", - "type": "u64" + name: "quoteFeesAccrued"; + type: "u64"; }, { - "name": "referrerRebatesAccrued", - "type": "u64" + name: "referrerRebatesAccrued"; + type: "u64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 1888 - ] - } + name: "reserved"; + type: { + array: ["u8", 1888]; + }; } - ] - } + ]; + }; }, { - "name": "openOrdersAccount", - "type": { - "kind": "struct", - "fields": [ + name: "openOrdersAccount"; + type: { + kind: "struct"; + fields: [ { - "name": "owner", - "type": "publicKey" + name: "owner"; + type: "publicKey"; }, { - "name": "name", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "name"; + type: { + array: ["u8", 32]; + }; }, { - "name": "delegate", - "type": "publicKey" + name: "delegate"; + type: "publicKey"; }, { - "name": "accountNum", - "type": "u32" + name: "accountNum"; + type: "u32"; }, { - "name": "bump", - "type": "u8" + name: "bump"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding"; + type: { + array: ["u8", 3]; + }; }, { - "name": "buybackFeesAccruedCurrent", - "docs": [ - "Fees usable with the \"fees buyback\" feature.", + name: "buybackFeesAccruedCurrent"; + docs: [ + 'Fees usable with the "fees buyback" feature.', "This tracks the ones that accrued in the current expiry interval." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "buybackFeesAccruedPrevious", - "docs": [ - "Fees buyback amount from the previous expiry interval." - ], - "type": "u64" + name: "buybackFeesAccruedPrevious"; + docs: ["Fees buyback amount from the previous expiry interval."]; + type: "u64"; }, { - "name": "buybackFeesExpiryTimestamp", - "docs": [ + name: "buybackFeesExpiryTimestamp"; + docs: [ "End timestamp of the current expiry interval of the buyback fees amount." - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "position", - "type": { - "defined": "Position" - } + name: "position"; + type: { + defined: "Position"; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 208 - ] - } + name: "reserved"; + type: { + array: ["u8", 208]; + }; }, { - "name": "headerVersion", - "type": "u8" + name: "headerVersion"; + type: "u8"; }, { - "name": "padding3", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding3"; + type: { + array: ["u8", 7]; + }; }, { - "name": "padding4", - "type": "u32" + name: "padding4"; + type: "u32"; }, { - "name": "openOrders", - "type": { - "vec": { - "defined": "OpenOrder" - } - } + name: "openOrders"; + type: { + vec: { + defined: "OpenOrder"; + }; + }; } - ] - } + ]; + }; }, { - "name": "stubOracle", - "type": { - "kind": "struct", - "fields": [ + name: "stubOracle"; + type: { + kind: "struct"; + fields: [ { - "name": "group", - "type": "publicKey" + name: "group"; + type: "publicKey"; }, { - "name": "mint", - "type": "publicKey" + name: "mint"; + type: "publicKey"; }, { - "name": "price", - "type": { - "defined": "I80F48" - } + name: "price"; + type: { + defined: "I80F48"; + }; }, { - "name": "lastUpdated", - "type": "i64" + name: "lastUpdated"; + type: "i64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 128 - ] - } + name: "reserved"; + type: { + array: ["u8", 128]; + }; } - ] - } + ]; + }; }, { - "name": "bookSide", - "type": { - "kind": "struct", - "fields": [ + name: "bookSide"; + type: { + kind: "struct"; + fields: [ { - "name": "roots", - "type": { - "array": [ + name: "roots"; + type: { + array: [ { - "defined": "OrderTreeRoot" + defined: "OrderTreeRoot"; }, 2 - ] - } + ]; + }; }, { - "name": "reservedRoots", - "type": { - "array": [ + name: "reservedRoots"; + type: { + array: [ { - "defined": "OrderTreeRoot" + defined: "OrderTreeRoot"; }, 4 - ] - } + ]; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 256 - ] - } + name: "reserved"; + type: { + array: ["u8", 256]; + }; }, { - "name": "nodes", - "type": { - "defined": "OrderTreeNodes" - } + name: "nodes"; + type: { + defined: "OrderTreeNodes"; + }; } - ] - } + ]; + }; }, { - "name": "eventQueue", - "type": { - "kind": "struct", - "fields": [ + name: "eventQueue"; + type: { + kind: "struct"; + fields: [ { - "name": "header", - "type": { - "defined": "EventQueueHeader" - } + name: "header"; + type: { + defined: "EventQueueHeader"; + }; }, { - "name": "buf", - "type": { - "array": [ + name: "buf"; + type: { + array: [ { - "defined": "AnyEvent" + defined: "AnyEvent"; }, 488 - ] - } + ]; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 64 - ] - } + name: "reserved"; + type: { + array: ["u8", 64]; + }; } - ] - } + ]; + }; } - ], - "types": [ + ]; + types: [ { - "name": "OpenOrdersAccountFixed", - "type": { - "kind": "struct", - "fields": [ + name: "OpenOrdersAccountFixed"; + type: { + kind: "struct"; + fields: [ { - "name": "owner", - "type": "publicKey" + name: "owner"; + type: "publicKey"; }, { - "name": "name", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "name"; + type: { + array: ["u8", 32]; + }; }, { - "name": "delegate", - "type": "publicKey" + name: "delegate"; + type: "publicKey"; }, { - "name": "accountNum", - "type": "u32" + name: "accountNum"; + type: "u32"; }, { - "name": "bump", - "type": "u8" + name: "bump"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding"; + type: { + array: ["u8", 3]; + }; }, { - "name": "buybackFeesAccruedCurrent", - "type": "u64" + name: "buybackFeesAccruedCurrent"; + type: "u64"; }, { - "name": "buybackFeesAccruedPrevious", - "type": "u64" + name: "buybackFeesAccruedPrevious"; + type: "u64"; }, { - "name": "buybackFeesExpiryTimestamp", - "type": "u64" + name: "buybackFeesExpiryTimestamp"; + type: "u64"; }, { - "name": "position", - "type": { - "defined": "Position" - } + name: "position"; + type: { + defined: "Position"; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 208 - ] - } + name: "reserved"; + type: { + array: ["u8", 208]; + }; } - ] - } + ]; + }; }, { - "name": "Position", - "type": { - "kind": "struct", - "fields": [ + name: "Position"; + type: { + kind: "struct"; + fields: [ { - "name": "quoteRunningNative", - "docs": [ + name: "quoteRunningNative"; + docs: [ "Tracks what the position is to calculate average entry & break even price" - ], - "type": "i64" + ]; + type: "i64"; }, { - "name": "bidsBaseLots", - "docs": [ - "Base lots in open bids" - ], - "type": "i64" + name: "bidsBaseLots"; + docs: ["Base lots in open bids"]; + type: "i64"; }, { - "name": "asksBaseLots", - "docs": [ - "Base lots in open asks" - ], - "type": "i64" + name: "asksBaseLots"; + docs: ["Base lots in open asks"]; + type: "i64"; }, { - "name": "baseFreeNative", - "type": { - "defined": "I80F48" - } + name: "baseFreeNative"; + type: { + defined: "I80F48"; + }; }, { - "name": "quoteFreeNative", - "type": { - "defined": "I80F48" - } + name: "quoteFreeNative"; + type: { + defined: "I80F48"; + }; }, { - "name": "referrerRebatesAccrued", - "type": "u64" + name: "referrerRebatesAccrued"; + type: "u64"; }, { - "name": "makerVolume", - "docs": [ + name: "makerVolume"; + docs: [ "Cumulative maker volume in quote native units", "", "(Display only)" - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "takerVolume", - "docs": [ + name: "takerVolume"; + docs: [ "Cumulative taker volume in quote native units", "", "(Display only)" - ], - "type": "u64" + ]; + type: "u64"; }, { - "name": "avgEntryPricePerBaseLot", - "docs": [ + 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" + ]; + type: "f64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 88 - ] - } + name: "reserved"; + type: { + array: ["u8", 88]; + }; } - ] - } + ]; + }; }, { - "name": "OpenOrder", - "type": { - "kind": "struct", - "fields": [ + name: "OpenOrder"; + type: { + kind: "struct"; + fields: [ { - "name": "sideAndTree", - "type": "u8" + name: "sideAndTree"; + type: "u8"; }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding1"; + type: { + array: ["u8", 7]; + }; }, { - "name": "clientId", - "type": "u64" + name: "clientId"; + type: "u64"; }, { - "name": "pegLimit", - "type": "i64" + name: "pegLimit"; + type: "i64"; }, { - "name": "id", - "type": "u128" + name: "id"; + type: "u128"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 64 - ] - } + name: "reserved"; + type: { + array: ["u8", 64]; + }; } - ] - } + ]; + }; }, { - "name": "OracleConfig", - "type": { - "kind": "struct", - "fields": [ + name: "OracleConfig"; + type: { + kind: "struct"; + fields: [ { - "name": "confFilter", - "type": { - "defined": "I80F48" - } + name: "confFilter"; + type: { + defined: "I80F48"; + }; }, { - "name": "maxStalenessSlots", - "type": "i64" + name: "maxStalenessSlots"; + type: "i64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 72 - ] - } + name: "reserved"; + type: { + array: ["u8", 72]; + }; } - ] - } + ]; + }; }, { - "name": "OracleConfigParams", - "type": { - "kind": "struct", - "fields": [ + name: "OracleConfigParams"; + type: { + kind: "struct"; + fields: [ { - "name": "confFilter", - "type": "f32" + name: "confFilter"; + type: "f32"; }, { - "name": "maxStalenessSlots", - "type": { - "option": "u32" - } + name: "maxStalenessSlots"; + type: { + option: "u32"; + }; } - ] - } + ]; + }; }, { - "name": "InnerNode", - "docs": [ + 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": [ + ]; + type: { + kind: "struct"; + fields: [ { - "name": "tag", - "type": "u8" + name: "tag"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding"; + type: { + array: ["u8", 3]; + }; }, { - "name": "prefixLen", - "docs": [ + 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" + ]; + type: "u32"; }, { - "name": "key", - "docs": [ - "only the top `prefix_len` bits of `key` are relevant" - ], - "type": "u128" + 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: "children"; + docs: ["indexes into `BookSide::nodes`"]; + type: { + array: ["u32", 2]; + }; }, { - "name": "childEarliestExpiry", - "docs": [ + 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 - ] - } + ]; + type: { + array: ["u64", 2]; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 72 - ] - } + name: "reserved"; + type: { + array: ["u8", 72]; + }; } - ] - } + ]; + }; }, { - "name": "LeafNode", - "docs": [ - "LeafNodes represent an order in the binary tree" - ], - "type": { - "kind": "struct", - "fields": [ + name: "LeafNode"; + docs: ["LeafNodes represent an order in the binary tree"]; + type: { + kind: "struct"; + fields: [ { - "name": "tag", - "docs": [ - "NodeTag" - ], - "type": "u8" + name: "tag"; + docs: ["NodeTag"]; + type: "u8"; }, { - "name": "ownerSlot", - "docs": [ - "Index into the owning OpenOrdersAccount's OpenOrders" - ], - "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: "orderType"; + docs: ["PostOrderType, this was added for TradingView move order"]; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "padding"; + type: { + array: ["u8", 1]; + }; }, { - "name": "timeInForce", - "docs": [ + name: "timeInForce"; + docs: [ "Time in seconds after `timestamp` at which the order expires.", "A value of 0 means no expiry." - ], - "type": "u16" + ]; + type: "u16"; }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 2 - ] - } + name: "padding2"; + type: { + array: ["u8", 2]; + }; }, { - "name": "key", - "docs": [ - "The binary tree key, see new_node_key()" - ], - "type": "u128" + name: "key"; + docs: ["The binary tree key, see new_node_key()"]; + type: "u128"; }, { - "name": "owner", - "docs": [ - "Address of the owning OpenOrdersAccount" - ], - "type": "publicKey" + 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: "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: "timestamp"; + docs: ["The time the order was placed"]; + type: "u64"; }, { - "name": "pegLimit", - "docs": [ + 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" + ]; + type: "i64"; }, { - "name": "clientOrderId", - "docs": [ - "User defined id for this order, used in FillEvents" - ], - "type": "u64" + name: "clientOrderId"; + docs: ["User defined id for this order, used in FillEvents"]; + type: "u64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "reserved"; + type: { + array: ["u8", 32]; + }; } - ] - } + ]; + }; }, { - "name": "AnyNode", - "type": { - "kind": "struct", - "fields": [ + name: "AnyNode"; + type: { + kind: "struct"; + fields: [ { - "name": "tag", - "type": "u8" + name: "tag"; + type: "u8"; }, { - "name": "data", - "type": { - "array": [ - "u8", - 119 - ] - } + name: "data"; + type: { + array: ["u8", 119]; + }; } - ] - } + ]; + }; }, { - "name": "OrderTreeRoot", - "type": { - "kind": "struct", - "fields": [ + name: "OrderTreeRoot"; + type: { + kind: "struct"; + fields: [ { - "name": "maybeNode", - "type": "u32" + name: "maybeNode"; + type: "u32"; }, { - "name": "leafCount", - "type": "u32" + name: "leafCount"; + type: "u32"; } - ] - } + ]; + }; }, { - "name": "OrderTreeNodes", - "docs": [ + name: "OrderTreeNodes"; + docs: [ "A binary tree on AnyNode::key()", "", "The key encodes the price in the top 64 bits." - ], - "type": { - "kind": "struct", - "fields": [ + ]; + type: { + kind: "struct"; + fields: [ { - "name": "orderTreeType", - "type": "u8" + name: "orderTreeType"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding"; + type: { + array: ["u8", 3]; + }; }, { - "name": "bumpIndex", - "type": "u32" + name: "bumpIndex"; + type: "u32"; }, { - "name": "freeListLen", - "type": "u32" + name: "freeListLen"; + type: "u32"; }, { - "name": "freeListHead", - "type": "u32" + name: "freeListHead"; + type: "u32"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 512 - ] - } + name: "reserved"; + type: { + array: ["u8", 512]; + }; }, { - "name": "nodes", - "type": { - "array": [ + name: "nodes"; + type: { + array: [ { - "defined": "AnyNode" + defined: "AnyNode"; }, 1024 - ] - } + ]; + }; } - ] - } + ]; + }; }, { - "name": "EventQueueHeader", - "type": { - "kind": "struct", - "fields": [ + name: "EventQueueHeader"; + type: { + kind: "struct"; + fields: [ { - "name": "head", - "type": "u32" + name: "head"; + type: "u32"; }, { - "name": "count", - "type": "u32" + name: "count"; + type: "u32"; }, { - "name": "seqNum", - "type": "u64" + name: "seqNum"; + type: "u64"; } - ] - } + ]; + }; }, { - "name": "AnyEvent", - "type": { - "kind": "struct", - "fields": [ + name: "AnyEvent"; + type: { + kind: "struct"; + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 199 - ] - } + name: "padding"; + type: { + array: ["u8", 199]; + }; } - ] - } + ]; + }; }, { - "name": "FillEvent", - "type": { - "kind": "struct", - "fields": [ + name: "FillEvent"; + type: { + kind: "struct"; + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType"; + type: "u8"; }, { - "name": "takerSide", - "type": "u8" + name: "takerSide"; + type: "u8"; }, { - "name": "makerOut", - "type": "u8" + name: "makerOut"; + type: "u8"; }, { - "name": "makerSlot", - "type": "u8" + name: "makerSlot"; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding"; + type: { + array: ["u8", 4]; + }; }, { - "name": "timestamp", - "type": "u64" + name: "timestamp"; + type: "u64"; }, { - "name": "seqNum", - "type": "u64" + name: "seqNum"; + type: "u64"; }, { - "name": "maker", - "type": "publicKey" + name: "maker"; + type: "publicKey"; }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "padding2"; + type: { + array: ["u8", 32]; + }; }, { - "name": "makerTimestamp", - "type": "u64" + name: "makerTimestamp"; + type: "u64"; }, { - "name": "taker", - "type": "publicKey" + name: "taker"; + type: "publicKey"; }, { - "name": "padding3", - "type": { - "array": [ - "u8", - 16 - ] - } + name: "padding3"; + type: { + array: ["u8", 16]; + }; }, { - "name": "takerClientOrderId", - "type": "u64" + name: "takerClientOrderId"; + type: "u64"; }, { - "name": "padding4", - "type": { - "array": [ - "u8", - 16 - ] - } + name: "padding4"; + type: { + array: ["u8", 16]; + }; }, { - "name": "price", - "type": "i64" + name: "price"; + type: "i64"; }, { - "name": "quantity", - "type": "i64" + name: "quantity"; + type: "i64"; }, { - "name": "makerClientOrderId", - "type": "u64" + name: "makerClientOrderId"; + type: "u64"; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 8 - ] - } + name: "reserved"; + type: { + array: ["u8", 8]; + }; } - ] - } + ]; + }; }, { - "name": "OutEvent", - "type": { - "kind": "struct", - "fields": [ + name: "OutEvent"; + type: { + kind: "struct"; + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType"; + type: "u8"; }, { - "name": "side", - "type": "u8" + name: "side"; + type: "u8"; }, { - "name": "ownerSlot", - "type": "u8" + name: "ownerSlot"; + type: "u8"; }, { - "name": "padding0", - "type": { - "array": [ - "u8", - 5 - ] - } + name: "padding0"; + type: { + array: ["u8", 5]; + }; }, { - "name": "timestamp", - "type": "u64" + name: "timestamp"; + type: "u64"; }, { - "name": "seqNum", - "type": "u64" + name: "seqNum"; + type: "u64"; }, { - "name": "owner", - "type": "publicKey" + name: "owner"; + type: "publicKey"; }, { - "name": "quantity", - "type": "i64" + name: "quantity"; + type: "i64"; }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 136 - ] - } + name: "padding1"; + type: { + array: ["u8", 136]; + }; } - ] - } + ]; + }; }, { - "name": "StablePriceModel", - "docs": [ - "Maintains a \"stable_price\" based on the oracle price.", + 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", @@ -2214,874 +2035,859 @@ export type OpenbookV2 = { "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": [ + ]; + type: { + kind: "struct"; + fields: [ { - "name": "stablePrice", - "docs": [ - "Current stable price to use in health" - ], - "type": "f64" + name: "stablePrice"; + docs: ["Current stable price to use in health"]; + type: "f64"; }, { - "name": "lastUpdateTimestamp", - "type": "u64" + name: "lastUpdateTimestamp"; + type: "u64"; }, { - "name": "delayPrices", - "docs": [ + 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 - ] - } + ]; + type: { + array: ["f64", 24]; + }; }, { - "name": "delayAccumulatorPrice", - "docs": [ + 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" + ]; + type: "f64"; }, { - "name": "delayAccumulatorTime", - "docs": [ - "Accumulating the total time for the above average." - ], - "type": "u32" + name: "delayAccumulatorTime"; + docs: ["Accumulating the total time for the above average."]; + type: "u32"; }, { - "name": "delayIntervalSeconds", - "docs": [ - "Length of a delay_interval" - ], - "type": "u32" + name: "delayIntervalSeconds"; + docs: ["Length of a delay_interval"]; + type: "u32"; }, { - "name": "delayGrowthLimit", - "docs": [ + name: "delayGrowthLimit"; + docs: [ "Maximal relative difference between two delay_price in consecutive intervals." - ], - "type": "f32" + ]; + type: "f32"; }, { - "name": "stableGrowthLimit", - "docs": [ + name: "stableGrowthLimit"; + docs: [ "Maximal per-second relative difference of the stable price.", "It gets further reduced if stable and delay price disagree." - ], - "type": "f32" + ]; + type: "f32"; }, { - "name": "lastDelayIntervalIndex", - "docs": [ + name: "lastDelayIntervalIndex"; + docs: [ "The delay_interval_index that update() was last called on." - ], - "type": "u8" + ]; + type: "u8"; }, { - "name": "padding", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding"; + type: { + array: ["u8", 7]; + }; }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 48 - ] - } + name: "reserved"; + type: { + array: ["u8", 48]; + }; } - ] - } + ]; + }; }, { - "name": "MarketIndex", - "docs": [ + 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": [ + ]; + type: { + kind: "struct"; + fields: [ { - "name": "val", - "type": "u32" + name: "val"; + type: "u32"; } - ] - } + ]; + }; }, { - "name": "I80F48", - "type": { - "kind": "struct", - "fields": [ + name: "I80F48"; + type: { + kind: "struct"; + fields: [ { - "name": "val", - "type": "i128" + name: "val"; + type: "i128"; } - ] - } + ]; + }; }, { - "name": "OracleType", - "type": { - "kind": "enum", - "variants": [ + name: "OracleType"; + type: { + kind: "enum"; + variants: [ { - "name": "Pyth" + name: "Pyth"; }, { - "name": "Stub" + name: "Stub"; }, { - "name": "SwitchboardV1" + name: "SwitchboardV1"; }, { - "name": "SwitchboardV2" + name: "SwitchboardV2"; } - ] - } + ]; + }; }, { - "name": "OrderState", - "type": { - "kind": "enum", - "variants": [ + name: "OrderState"; + type: { + kind: "enum"; + variants: [ { - "name": "Valid" + name: "Valid"; }, { - "name": "Invalid" + name: "Invalid"; }, { - "name": "Skipped" + name: "Skipped"; } - ] - } + ]; + }; }, { - "name": "BookSideOrderTree", - "type": { - "kind": "enum", - "variants": [ + name: "BookSideOrderTree"; + type: { + kind: "enum"; + variants: [ { - "name": "Fixed" + name: "Fixed"; }, { - "name": "OraclePegged" + name: "OraclePegged"; } - ] - } + ]; + }; }, { - "name": "NodeTag", - "type": { - "kind": "enum", - "variants": [ + name: "NodeTag"; + type: { + kind: "enum"; + variants: [ { - "name": "Uninitialized" + name: "Uninitialized"; }, { - "name": "InnerNode" + name: "InnerNode"; }, { - "name": "LeafNode" + name: "LeafNode"; }, { - "name": "FreeNode" + name: "FreeNode"; }, { - "name": "LastFreeNode" + name: "LastFreeNode"; } - ] - } + ]; + }; }, { - "name": "PlaceOrderType", - "type": { - "kind": "enum", - "variants": [ + name: "PlaceOrderType"; + type: { + kind: "enum"; + variants: [ { - "name": "Limit" + name: "Limit"; }, { - "name": "ImmediateOrCancel" + name: "ImmediateOrCancel"; }, { - "name": "PostOnly" + name: "PostOnly"; }, { - "name": "Market" + name: "Market"; }, { - "name": "PostOnlySlide" + name: "PostOnlySlide"; } - ] - } + ]; + }; }, { - "name": "PostOrderType", - "type": { - "kind": "enum", - "variants": [ + name: "PostOrderType"; + type: { + kind: "enum"; + variants: [ { - "name": "Limit" + name: "Limit"; }, { - "name": "PostOnly" + name: "PostOnly"; }, { - "name": "PostOnlySlide" + name: "PostOnlySlide"; } - ] - } + ]; + }; }, { - "name": "Side", - "type": { - "kind": "enum", - "variants": [ + name: "Side"; + type: { + kind: "enum"; + variants: [ { - "name": "Bid" + name: "Bid"; }, { - "name": "Ask" + name: "Ask"; } - ] - } + ]; + }; }, { - "name": "SideAndOrderTree", - "docs": [ + name: "SideAndOrderTree"; + docs: [ "SideAndOrderTree is a storage optimization, so we don't need two bytes for the data" - ], - "type": { - "kind": "enum", - "variants": [ + ]; + type: { + kind: "enum"; + variants: [ { - "name": "BidFixed" + name: "BidFixed"; }, { - "name": "AskFixed" + name: "AskFixed"; }, { - "name": "BidOraclePegged" + name: "BidOraclePegged"; }, { - "name": "AskOraclePegged" + name: "AskOraclePegged"; } - ] - } + ]; + }; }, { - "name": "OrderParams", - "type": { - "kind": "enum", - "variants": [ + name: "OrderParams"; + type: { + kind: "enum"; + variants: [ { - "name": "Market" + name: "Market"; }, { - "name": "ImmediateOrCancel", - "fields": [ + name: "ImmediateOrCancel"; + fields: [ { - "name": "price_lots", - "type": "i64" + name: "price_lots"; + type: "i64"; } - ] + ]; }, { - "name": "Fixed", - "fields": [ + name: "Fixed"; + fields: [ { - "name": "price_lots", - "type": "i64" + name: "price_lots"; + type: "i64"; }, { - "name": "order_type", - "type": { - "defined": "PostOrderType" - } + name: "order_type"; + type: { + defined: "PostOrderType"; + }; } - ] + ]; }, { - "name": "OraclePegged", - "fields": [ + name: "OraclePegged"; + fields: [ { - "name": "price_offset_lots", - "type": "i64" + name: "price_offset_lots"; + type: "i64"; }, { - "name": "order_type", - "type": { - "defined": "PostOrderType" - } + name: "order_type"; + type: { + defined: "PostOrderType"; + }; }, { - "name": "peg_limit", - "type": "i64" + name: "peg_limit"; + type: "i64"; }, { - "name": "max_oracle_staleness_slots", - "type": "i32" + name: "max_oracle_staleness_slots"; + type: "i32"; } - ] + ]; } - ] - } + ]; + }; }, { - "name": "OrderTreeType", - "type": { - "kind": "enum", - "variants": [ + name: "OrderTreeType"; + type: { + kind: "enum"; + variants: [ { - "name": "Bids" + name: "Bids"; }, { - "name": "Asks" + name: "Asks"; } - ] - } + ]; + }; }, { - "name": "EventType", - "type": { - "kind": "enum", - "variants": [ + name: "EventType"; + type: { + kind: "enum"; + variants: [ { - "name": "Fill" + name: "Fill"; }, { - "name": "Out" + name: "Out"; } - ] - } + ]; + }; } - ], - "events": [ + ]; + events: [ { - "name": "BalanceLog", - "fields": [ + name: "BalanceLog"; + fields: [ { - "name": "openOrdersAcc", - "type": "publicKey", - "index": false + name: "openOrdersAcc"; + type: "publicKey"; + index: false; }, { - "name": "basePosition", - "type": "i64", - "index": false + name: "basePosition"; + type: "i64"; + index: false; }, { - "name": "quotePosition", - "type": "i128", - "index": false + name: "quotePosition"; + type: "i128"; + index: false; } - ] + ]; }, { - "name": "DepositLog", - "fields": [ + name: "DepositLog"; + fields: [ { - "name": "openOrdersAcc", - "type": "publicKey", - "index": false + name: "openOrdersAcc"; + type: "publicKey"; + index: false; }, { - "name": "signer", - "type": "publicKey", - "index": false + name: "signer"; + type: "publicKey"; + index: false; }, { - "name": "quantity", - "type": "u64", - "index": false + name: "quantity"; + type: "u64"; + index: false; } - ] + ]; }, { - "name": "FillLog", - "fields": [ + name: "FillLog"; + fields: [ { - "name": "takerSide", - "type": "u8", - "index": false + name: "takerSide"; + type: "u8"; + index: false; }, { - "name": "makerSlot", - "type": "u8", - "index": false + name: "makerSlot"; + type: "u8"; + index: false; }, { - "name": "makerOut", - "type": "bool", - "index": false + name: "makerOut"; + type: "bool"; + index: false; }, { - "name": "timestamp", - "type": "u64", - "index": false + name: "timestamp"; + type: "u64"; + index: false; }, { - "name": "seqNum", - "type": "u64", - "index": false + name: "seqNum"; + type: "u64"; + index: false; }, { - "name": "maker", - "type": "publicKey", - "index": false + name: "maker"; + type: "publicKey"; + index: false; }, { - "name": "makerClientOrderId", - "type": "u64", - "index": false + name: "makerClientOrderId"; + type: "u64"; + index: false; }, { - "name": "makerFee", - "type": "f32", - "index": false + name: "makerFee"; + type: "f32"; + index: false; }, { - "name": "makerTimestamp", - "type": "u64", - "index": false + name: "makerTimestamp"; + type: "u64"; + index: false; }, { - "name": "taker", - "type": "publicKey", - "index": false + name: "taker"; + type: "publicKey"; + index: false; }, { - "name": "takerClientOrderId", - "type": "u64", - "index": false + name: "takerClientOrderId"; + type: "u64"; + index: false; }, { - "name": "takerFee", - "type": "f32", - "index": false + name: "takerFee"; + type: "f32"; + index: false; }, { - "name": "price", - "type": "i64", - "index": false + name: "price"; + type: "i64"; + index: false; }, { - "name": "quantity", - "type": "i64", - "index": false + name: "quantity"; + type: "i64"; + index: false; } - ] + ]; }, { - "name": "MarketMetaDataLog", - "fields": [ + name: "MarketMetaDataLog"; + fields: [ { - "name": "market", - "type": "publicKey", - "index": false + name: "market"; + type: "publicKey"; + index: false; }, { - "name": "marketIndex", - "type": "u32", - "index": false + name: "marketIndex"; + type: "u32"; + index: false; }, { - "name": "baseDecimals", - "type": "u8", - "index": false + name: "baseDecimals"; + type: "u8"; + index: false; }, { - "name": "quoteDecimals", - "type": "u8", - "index": false + name: "quoteDecimals"; + type: "u8"; + index: false; }, { - "name": "baseLotSize", - "type": "i64", - "index": false + name: "baseLotSize"; + type: "i64"; + index: false; }, { - "name": "quoteLotSize", - "type": "i64", - "index": false + name: "quoteLotSize"; + type: "i64"; + index: false; }, { - "name": "oracle", - "type": "publicKey", - "index": false + name: "oracle"; + type: "publicKey"; + index: false; } - ] + ]; } - ], - "errors": [ + ]; + errors: [ { - "code": 6000, - "name": "SomeError", - "msg": "" + code: 6000; + name: "SomeError"; + msg: ""; }, { - "code": 6001, - "name": "NotImplementedError", - "msg": "" + code: 6001; + name: "NotImplementedError"; + msg: ""; }, { - "code": 6002, - "name": "MathError", - "msg": "checked math error" + code: 6002; + name: "MathError"; + msg: "checked math error"; }, { - "code": 6003, - "name": "UnexpectedOracle", - "msg": "" + code: 6003; + name: "UnexpectedOracle"; + msg: ""; }, { - "code": 6004, - "name": "UnknownOracleType", - "msg": "oracle type cannot be determined" + code: 6004; + name: "UnknownOracleType"; + msg: "oracle type cannot be determined"; }, { - "code": 6005, - "name": "InvalidBank", - "msg": "invalid bank" + code: 6005; + name: "InvalidBank"; + msg: "invalid bank"; }, { - "code": 6006, - "name": "ProfitabilityMismatch", - "msg": "account profitability is mismatched" + code: 6006; + name: "ProfitabilityMismatch"; + msg: "account profitability is mismatched"; }, { - "code": 6007, - "name": "CannotSettleWithSelf", - "msg": "cannot settle with self" + code: 6007; + name: "CannotSettleWithSelf"; + msg: "cannot settle with self"; }, { - "code": 6008, - "name": "PositionDoesNotExist", - "msg": "perp position does not exist" + code: 6008; + name: "PositionDoesNotExist"; + msg: "perp position does not exist"; }, { - "code": 6009, - "name": "MaxSettleAmountMustBeGreaterThanZero", - "msg": "max settle amount must be greater than zero" + 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: 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: 6011; + name: "OracleConfidence"; + msg: "an oracle does not reach the confidence threshold"; }, { - "code": 6012, - "name": "OracleStale", - "msg": "an oracle is stale" + code: 6012; + name: "OracleStale"; + msg: "an oracle is stale"; }, { - "code": 6013, - "name": "SettlementAmountMustBePositive", - "msg": "settlement amount must always be positive" + code: 6013; + name: "SettlementAmountMustBePositive"; + msg: "settlement amount must always be positive"; }, { - "code": 6014, - "name": "BankBorrowLimitReached", - "msg": "bank utilization has reached limit" + 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: 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: 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: 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: 6018; + name: "TokenInReduceOnlyMode"; + msg: "token is in reduce only mode"; }, { - "code": 6019, - "name": "MarketInReduceOnlyMode", - "msg": "market 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: 6020; + name: "GroupIsHalted"; + msg: "group is halted"; }, { - "code": 6021, - "name": "HasBaseLots", - "msg": "the perp position has non-zero base lots" + 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: 6022; + name: "HasOpenOrUnsettledSerum3Orders"; + msg: "there are open or unsettled serum3 orders"; }, { - "code": 6023, - "name": "HasLiquidatableTokenPosition", - "msg": "has liquidatable token position" + code: 6023; + name: "HasLiquidatableTokenPosition"; + msg: "has liquidatable token position"; }, { - "code": 6024, - "name": "HasLiquidatableBasePosition", - "msg": "has liquidatable perp base position" + code: 6024; + name: "HasLiquidatableBasePosition"; + msg: "has liquidatable perp base position"; }, { - "code": 6025, - "name": "HasLiquidatablePositivePnl", - "msg": "has liquidatable positive perp pnl" + code: 6025; + name: "HasLiquidatablePositivePnl"; + msg: "has liquidatable positive perp pnl"; }, { - "code": 6026, - "name": "AccountIsFrozen", - "msg": "account is frozen" + code: 6026; + name: "AccountIsFrozen"; + msg: "account is frozen"; }, { - "code": 6027, - "name": "InitAssetWeightCantBeNegative", - "msg": "Init Asset Weight can't be negative" + code: 6027; + name: "InitAssetWeightCantBeNegative"; + msg: "Init Asset Weight can't be negative"; }, { - "code": 6028, - "name": "HasOpenTakerFills", - "msg": "has open perp taker fills" + code: 6028; + name: "HasOpenTakerFills"; + msg: "has open perp taker fills"; }, { - "code": 6029, - "name": "DepositLimit", - "msg": "deposit crosses the current group deposit limit" + code: 6029; + name: "DepositLimit"; + msg: "deposit crosses the current group deposit limit"; }, { - "code": 6030, - "name": "IxIsDisabled", - "msg": "instruction is disabled" + code: 6030; + name: "IxIsDisabled"; + msg: "instruction is disabled"; }, { - "code": 6031, - "name": "NoLiquidatableBasePosition", - "msg": "no liquidatable perp base position" + code: 6031; + name: "NoLiquidatableBasePosition"; + msg: "no liquidatable perp base position"; }, { - "code": 6032, - "name": "OrderIdNotFound", - "msg": "perp order id not found on the orderbook" + 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: 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: 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: 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: 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" + 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": [ + version: "0.1.0", + name: "openbook_v2", + instructions: [ { - "name": "createMarket", - "docs": [ - "Create a [`Market`](crate::state::Market) for a given token pair." + name: "createMarket", + docs: [ + "Create a [`Market`](crate::state::Market) for a given token pair.", ], - "accounts": [ + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false, - "docs": [ + name: "bids", + isMut: true, + isSigner: false, + docs: [ "Accounts are initialised by client,", - "anchor discriminator is set first when ix exits," - ] + "anchor discriminator is set first when ix exits,", + ], }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks", + isMut: true, + isSigner: false, }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue", + isMut: true, + isSigner: false, }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault", + isMut: true, + isSigner: false, }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault", + isMut: true, + isSigner: false, }, { - "name": "baseMint", - "isMut": false, - "isSigner": false + name: "baseMint", + isMut: false, + isSigner: false, }, { - "name": "quoteMint", - "isMut": false, - "isSigner": false + name: "quoteMint", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false + name: "systemProgram", + isMut: false, + isSigner: false, }, { - "name": "oracle", - "isMut": false, - "isSigner": false - } + name: "oracle", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "marketIndex", - "type": "u32" + name: "marketIndex", + type: "u32", }, { - "name": "name", - "type": "string" + name: "name", + type: "string", }, { - "name": "oracleConfig", - "type": { - "defined": "OracleConfigParams" - } + name: "oracleConfig", + type: { + defined: "OracleConfigParams", + }, }, { - "name": "quoteLotSize", - "type": "i64" + name: "quoteLotSize", + type: "i64", }, { - "name": "baseLotSize", - "type": "i64" + name: "baseLotSize", + type: "i64", }, { - "name": "makerFee", - "type": "f32" + name: "makerFee", + type: "f32", }, { - "name": "takerFee", - "type": "f32" + name: "takerFee", + type: "f32", }, { - "name": "feePenalty", - "type": "f32" - } - ] + name: "feePenalty", + type: "f32", + }, + ], }, { - "name": "initOpenOrders", - "accounts": [ + name: "initOpenOrders", + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": true, - "isSigner": true + name: "owner", + isMut: true, + isSigner: true, }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "accountNum", - "type": "u32" + name: "accountNum", + type: "u32", }, { - "name": "openOrdersCount", - "type": "u8" - } - ] + name: "openOrdersCount", + type: "u8", + }, + ], }, { - "name": "placeOrder", - "docs": [ + name: "placeOrder", + docs: [ "Place an order.", "", "Different types of orders have different effects on the order book,", @@ -3097,349 +2903,349 @@ export const IDL: OpenbookV2 = { "", "`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." + "stops and the instruction succeeds.", ], - "accounts": [ + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids", + isMut: true, + isSigner: false, }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks", + isMut: true, + isSigner: false, }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer", + isMut: true, + isSigner: false, }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault", + isMut: true, + isSigner: false, }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault", + isMut: true, + isSigner: false, }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue", + isMut: true, + isSigner: false, }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle", + isMut: false, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side", + type: { + defined: "Side", + }, }, { - "name": "priceLots", - "type": "i64" + name: "priceLots", + type: "i64", }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots", + type: "i64", }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees", + type: "i64", }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId", + type: "u64", }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType", + type: { + defined: "PlaceOrderType", + }, }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly", + type: "bool", }, { - "name": "expiryTimestamp", - "type": "u64" + name: "expiryTimestamp", + type: "u64", }, { - "name": "limit", - "type": "u8" - } + name: "limit", + type: "u8", + }, ], - "returns": { - "option": "u128" - } + returns: { + option: "u128", + }, }, { - "name": "placeOrderPegged", - "accounts": [ + name: "placeOrderPegged", + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids", + isMut: true, + isSigner: false, }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks", + isMut: true, + isSigner: false, }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer", + isMut: true, + isSigner: false, }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault", + isMut: true, + isSigner: false, }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault", + isMut: true, + isSigner: false, }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue", + isMut: true, + isSigner: false, }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle", + isMut: false, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side", + type: { + defined: "Side", + }, }, { - "name": "priceOffsetLots", - "type": "i64" + name: "priceOffsetLots", + type: "i64", }, { - "name": "pegLimit", - "type": "i64" + name: "pegLimit", + type: "i64", }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots", + type: "i64", }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees", + type: "i64", }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId", + type: "u64", }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType", + type: { + defined: "PlaceOrderType", + }, }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly", + type: "bool", }, { - "name": "expiryTimestamp", - "type": "u64" + name: "expiryTimestamp", + type: "u64", }, { - "name": "limit", - "type": "u8" + name: "limit", + type: "u8", }, { - "name": "maxOracleStalenessSlots", - "type": "i32" - } + name: "maxOracleStalenessSlots", + type: "i32", + }, ], - "returns": { - "option": "u128" - } + returns: { + option: "u128", + }, }, { - "name": "placeTakeOrder", - "docs": [ + 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." + "This type of order allows for instant token settlement for the taker.", ], - "accounts": [ + accounts: [ { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids", + isMut: true, + isSigner: false, }, { - "name": "asks", - "isMut": true, - "isSigner": false + name: "asks", + isMut: true, + isSigner: false, }, { - "name": "payer", - "isMut": true, - "isSigner": false + name: "payer", + isMut: true, + isSigner: false, }, { - "name": "receiver", - "isMut": true, - "isSigner": false + name: "receiver", + isMut: true, + isSigner: false, }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault", + isMut: true, + isSigner: false, }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault", + isMut: true, + isSigner: false, }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false + name: "eventQueue", + isMut: true, + isSigner: false, }, { - "name": "oracle", - "isMut": false, - "isSigner": false + name: "oracle", + isMut: false, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "side", - "type": { - "defined": "Side" - } + name: "side", + type: { + defined: "Side", + }, }, { - "name": "priceLots", - "type": "i64" + name: "priceLots", + type: "i64", }, { - "name": "maxBaseLots", - "type": "i64" + name: "maxBaseLots", + type: "i64", }, { - "name": "maxQuoteLotsIncludingFees", - "type": "i64" + name: "maxQuoteLotsIncludingFees", + type: "i64", }, { - "name": "clientOrderId", - "type": "u64" + name: "clientOrderId", + type: "u64", }, { - "name": "orderType", - "type": { - "defined": "PlaceOrderType" - } + name: "orderType", + type: { + defined: "PlaceOrderType", + }, }, { - "name": "reduceOnly", - "type": "bool" + name: "reduceOnly", + type: "bool", }, { - "name": "limit", - "type": "u8" - } + name: "limit", + type: "u8", + }, ], - "returns": { - "option": "u128" - } + returns: { + option: "u128", + }, }, { - "name": "consumeEvents", - "docs": [ + name: "consumeEvents", + docs: [ "Process up to `limit` [events](crate::state::AnyEvent).", "", "When a user places a 'take' order, they do not know beforehand which", @@ -3462,1677 +3268,1498 @@ export const IDL: OpenbookV2 = { "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." + "base token in an ask) back to the maker.", ], - "accounts": [ + accounts: [ { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "eventQueue", - "isMut": true, - "isSigner": false - } + name: "eventQueue", + isMut: true, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "limit", - "type": "u64" - } - ] + name: "limit", + type: "u64", + }, + ], }, { - "name": "cancelOrder", - "docs": [ + 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)." + "maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount).", ], - "accounts": [ + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids", + isMut: true, + isSigner: false, }, { - "name": "asks", - "isMut": true, - "isSigner": false - } + name: "asks", + isMut: true, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "orderId", - "type": "u128" - } - ] + name: "orderId", + type: "u128", + }, + ], }, { - "name": "cancelOrderByClientOrderId", - "docs": [ + 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)." + "maker knows that they will be passing in their own [`OpenOrdersAccount`](crate::state::OpenOrdersAccount).", ], - "accounts": [ + accounts: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "market", - "isMut": false, - "isSigner": false + name: "market", + isMut: false, + isSigner: false, }, { - "name": "bids", - "isMut": true, - "isSigner": false + name: "bids", + isMut: true, + isSigner: false, }, { - "name": "asks", - "isMut": true, - "isSigner": false - } + name: "asks", + isMut: true, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "clientOrderId", - "type": "u64" - } - ] + name: "clientOrderId", + type: "u64", + }, + ], }, { - "name": "cancelAllOrders", - "docs": [ - "Cancel up to `limit` orders." + 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, + }, ], - "accounts": [ + args: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "limit", + type: "u8", }, - { - "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." + 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, + }, ], - "accounts": [ + args: [ { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "sideOption", + type: { + option: { + defined: "Side", + }, + }, }, { - "name": "owner", - "isMut": false, - "isSigner": true + name: "limit", + type: "u8", }, - { - "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": [ + 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." + "each trade, in order to reduce CUs.", ], - "accounts": [ + accounts: [ { - "name": "owner", - "isMut": false, - "isSigner": true + name: "owner", + isMut: false, + isSigner: true, }, { - "name": "payerBase", - "isMut": true, - "isSigner": false + name: "payerBase", + isMut: true, + isSigner: false, }, { - "name": "payerQuote", - "isMut": true, - "isSigner": false + name: "payerQuote", + isMut: true, + isSigner: false, }, { - "name": "openOrdersAccount", - "isMut": true, - "isSigner": false + name: "openOrdersAccount", + isMut: true, + isSigner: false, }, { - "name": "market", - "isMut": true, - "isSigner": false + name: "market", + isMut: true, + isSigner: false, }, { - "name": "baseVault", - "isMut": true, - "isSigner": false + name: "baseVault", + isMut: true, + isSigner: false, }, { - "name": "quoteVault", - "isMut": true, - "isSigner": false + name: "quoteVault", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false + name: "tokenProgram", + isMut: false, + isSigner: false, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "baseAmountLots", - "type": "u64" + name: "baseAmountLots", + type: "u64", }, { - "name": "quoteAmountLots", - "type": "u64" - } - ] + name: "quoteAmountLots", + type: "u64", + }, + ], }, { - "name": "settleFunds", - "docs": [ - "Withdraw any available tokens." + 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, + }, ], - "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": [] + args: [], }, { - "name": "sweepFees", - "docs": [ - "Sweep fees, as a [`Market`](crate::state::Market)'s admin." + 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, + }, ], - "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": [] + args: [], }, { - "name": "closeMarket", - "docs": [ - "Close a [`Market`](crate::state::Market)." + 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, + }, ], - "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": [] + args: [], }, { - "name": "stubOracleCreate", - "accounts": [ + name: "stubOracleCreate", + accounts: [ { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "mint", - "isMut": false, - "isSigner": false + name: "mint", + isMut: false, + isSigner: false, }, { - "name": "payer", - "isMut": true, - "isSigner": true + name: "payer", + isMut: true, + isSigner: true, }, { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } + name: "systemProgram", + isMut: false, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "price", - "type": { - "defined": "I80F48" - } - } - ] + name: "price", + type: { + defined: "I80F48", + }, + }, + ], }, { - "name": "stubOracleClose", - "accounts": [ + name: "stubOracleClose", + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "oracle", - "isMut": true, - "isSigner": false + name: "oracle", + isMut: true, + isSigner: false, }, { - "name": "solDestination", - "isMut": true, - "isSigner": false + name: "solDestination", + isMut: true, + isSigner: false, }, { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } + name: "tokenProgram", + isMut: false, + isSigner: false, + }, ], - "args": [] + args: [], }, { - "name": "stubOracleSet", - "accounts": [ + name: "stubOracleSet", + accounts: [ { - "name": "admin", - "isMut": false, - "isSigner": true + name: "admin", + isMut: false, + isSigner: true, }, { - "name": "oracle", - "isMut": true, - "isSigner": false - } + name: "oracle", + isMut: true, + isSigner: false, + }, ], - "args": [ + args: [ { - "name": "price", - "type": { - "defined": "I80F48" - } - } - ] - } + name: "price", + type: { + defined: "I80F48", + }, + }, + ], + }, ], - "accounts": [ + accounts: [ { - "name": "market", - "type": { - "kind": "struct", - "fields": [ + name: "market", + type: { + kind: "struct", + fields: [ { - "name": "admin", - "docs": [ - "Admin who can close this market" - ], - "type": "publicKey" + name: "admin", + docs: ["Admin who can close this market"], + type: "publicKey", }, { - "name": "marketIndex", - "docs": [ - "Index of this market" - ], - "type": "u32" + name: "marketIndex", + docs: ["Index of this market"], + type: "u32", }, { - "name": "bump", - "docs": [ - "PDA bump" - ], - "type": "u8" + name: "bump", + docs: ["PDA bump"], + type: "u8", }, { - "name": "baseDecimals", - "docs": [ + name: "baseDecimals", + docs: [ "Number of decimals used for the base token.", "", - "Used to convert the oracle's price into a native/native price." + "Used to convert the oracle's price into a native/native price.", ], - "type": "u8" + type: "u8", }, { - "name": "quoteDecimals", - "type": "u8" + name: "quoteDecimals", + type: "u8", }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "padding1", + type: { + array: ["u8", 1], + }, }, { - "name": "name", - "docs": [ - "Name. Trailing zero bytes are ignored." + 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": { - "array": [ - "u8", - 16 - ] - } + type: { + defined: "StablePriceModel", + }, }, { - "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": [ + 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." + "ui price of quote_lot_size*base_decimals/base_lot_size/quote_decimals.", ], - "type": "i64" + type: "i64", }, { - "name": "baseLotSize", - "docs": [ + 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." + "1_000_000 and base position ui is 1.", ], - "type": "i64" + type: "i64", }, { - "name": "seqNum", - "docs": [ - "Total number of orders seen" - ], - "type": "u64" + 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: "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: "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: "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: "feesAccrued", + docs: ["Fees accrued in native quote currency"], + type: { + defined: "I80F48", + }, }, { - "name": "feesSettled", - "docs": [ - "Fees settled 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: "feePenalty", + docs: ["Fee (in quote native) to charge for ioc orders"], + type: "f32", }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding2", + type: { + array: ["u8", 4], + }, }, { - "name": "buybackFeesExpiryInterval", - "type": "u64" + name: "buybackFeesExpiryInterval", + type: "u64", }, { - "name": "vaultSignerNonce", - "type": "u64" + name: "vaultSignerNonce", + type: "u64", }, { - "name": "baseMint", - "type": "publicKey" + name: "baseMint", + type: "publicKey", }, { - "name": "quoteMint", - "type": "publicKey" + name: "quoteMint", + type: "publicKey", }, { - "name": "baseVault", - "type": "publicKey" + name: "baseVault", + type: "publicKey", }, { - "name": "baseDepositTotal", - "type": "u64" + name: "baseDepositTotal", + type: "u64", }, { - "name": "baseFeesAccrued", - "type": "u64" + name: "baseFeesAccrued", + type: "u64", }, { - "name": "quoteVault", - "type": "publicKey" + name: "quoteVault", + type: "publicKey", }, { - "name": "quoteDepositTotal", - "type": "u64" + name: "quoteDepositTotal", + type: "u64", }, { - "name": "quoteFeesAccrued", - "type": "u64" + name: "quoteFeesAccrued", + type: "u64", }, { - "name": "referrerRebatesAccrued", - "type": "u64" + name: "referrerRebatesAccrued", + type: "u64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 1888 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 1888], + }, + }, + ], + }, }, { - "name": "openOrdersAccount", - "type": { - "kind": "struct", - "fields": [ + name: "openOrdersAccount", + type: { + kind: "struct", + fields: [ { - "name": "owner", - "type": "publicKey" + name: "owner", + type: "publicKey", }, { - "name": "name", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "name", + type: { + array: ["u8", 32], + }, }, { - "name": "delegate", - "type": "publicKey" + name: "delegate", + type: "publicKey", }, { - "name": "accountNum", - "type": "u32" + name: "accountNum", + type: "u32", }, { - "name": "bump", - "type": "u8" + name: "bump", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + 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." + name: "buybackFeesAccruedCurrent", + docs: [ + 'Fees usable with the "fees buyback" feature.', + "This tracks the ones that accrued in the current expiry interval.", ], - "type": "u64" + type: "u64", }, { - "name": "buybackFeesAccruedPrevious", - "docs": [ - "Fees buyback amount from the previous expiry interval." + 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" + 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": "position", - "type": { - "defined": "Position" - } + name: "reserved", + type: { + array: ["u8", 208], + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 208 - ] - } + name: "headerVersion", + type: "u8", }, { - "name": "headerVersion", - "type": "u8" + name: "padding3", + type: { + array: ["u8", 7], + }, }, { - "name": "padding3", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding4", + type: "u32", }, { - "name": "padding4", - "type": "u32" + name: "openOrders", + type: { + vec: { + defined: "OpenOrder", + }, + }, }, - { - "name": "openOrders", - "type": { - "vec": { - "defined": "OpenOrder" - } - } - } - ] - } + ], + }, }, { - "name": "stubOracle", - "type": { - "kind": "struct", - "fields": [ + name: "stubOracle", + type: { + kind: "struct", + fields: [ { - "name": "group", - "type": "publicKey" + name: "group", + type: "publicKey", }, { - "name": "mint", - "type": "publicKey" + name: "mint", + type: "publicKey", }, { - "name": "price", - "type": { - "defined": "I80F48" - } + name: "price", + type: { + defined: "I80F48", + }, }, { - "name": "lastUpdated", - "type": "i64" + name: "lastUpdated", + type: "i64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 128 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 128], + }, + }, + ], + }, }, { - "name": "bookSide", - "type": { - "kind": "struct", - "fields": [ + name: "bookSide", + type: { + kind: "struct", + fields: [ { - "name": "roots", - "type": { - "array": [ + name: "roots", + type: { + array: [ { - "defined": "OrderTreeRoot" + defined: "OrderTreeRoot", }, - 2 - ] - } + 2, + ], + }, }, { - "name": "reservedRoots", - "type": { - "array": [ + name: "reservedRoots", + type: { + array: [ { - "defined": "OrderTreeRoot" + defined: "OrderTreeRoot", }, - 4 - ] - } + 4, + ], + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 256 - ] - } + name: "reserved", + type: { + array: ["u8", 256], + }, }, { - "name": "nodes", - "type": { - "defined": "OrderTreeNodes" - } - } - ] - } + name: "nodes", + type: { + defined: "OrderTreeNodes", + }, + }, + ], + }, }, { - "name": "eventQueue", - "type": { - "kind": "struct", - "fields": [ + name: "eventQueue", + type: { + kind: "struct", + fields: [ { - "name": "header", - "type": { - "defined": "EventQueueHeader" - } + name: "header", + type: { + defined: "EventQueueHeader", + }, }, { - "name": "buf", - "type": { - "array": [ + name: "buf", + type: { + array: [ { - "defined": "AnyEvent" + defined: "AnyEvent", }, - 488 - ] - } + 488, + ], + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 64 - ] - } - } - ] - } - } + name: "reserved", + type: { + array: ["u8", 64], + }, + }, + ], + }, + }, ], - "types": [ + types: [ { - "name": "OpenOrdersAccountFixed", - "type": { - "kind": "struct", - "fields": [ + name: "OpenOrdersAccountFixed", + type: { + kind: "struct", + fields: [ { - "name": "owner", - "type": "publicKey" + name: "owner", + type: "publicKey", }, { - "name": "name", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "name", + type: { + array: ["u8", 32], + }, }, { - "name": "delegate", - "type": "publicKey" + name: "delegate", + type: "publicKey", }, { - "name": "accountNum", - "type": "u32" + name: "accountNum", + type: "u32", }, { - "name": "bump", - "type": "u8" + name: "bump", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding", + type: { + array: ["u8", 3], + }, }, { - "name": "buybackFeesAccruedCurrent", - "type": "u64" + name: "buybackFeesAccruedCurrent", + type: "u64", }, { - "name": "buybackFeesAccruedPrevious", - "type": "u64" + name: "buybackFeesAccruedPrevious", + type: "u64", }, { - "name": "buybackFeesExpiryTimestamp", - "type": "u64" + name: "buybackFeesExpiryTimestamp", + type: "u64", }, { - "name": "position", - "type": { - "defined": "Position" - } + name: "position", + type: { + defined: "Position", + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 208 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 208], + }, + }, + ], + }, }, { - "name": "Position", - "type": { - "kind": "struct", - "fields": [ + name: "Position", + type: { + kind: "struct", + fields: [ { - "name": "quoteRunningNative", - "docs": [ - "Tracks what the position is to calculate average entry & break even price" + name: "quoteRunningNative", + docs: [ + "Tracks what the position is to calculate average entry & break even price", ], - "type": "i64" + type: "i64", }, { - "name": "bidsBaseLots", - "docs": [ - "Base lots in open bids" - ], - "type": "i64" + name: "bidsBaseLots", + docs: ["Base lots in open bids"], + type: "i64", }, { - "name": "asksBaseLots", - "docs": [ - "Base lots in open asks" - ], - "type": "i64" + name: "asksBaseLots", + docs: ["Base lots in open asks"], + type: "i64", }, { - "name": "baseFreeNative", - "type": { - "defined": "I80F48" - } + name: "baseFreeNative", + type: { + defined: "I80F48", + }, }, { - "name": "quoteFreeNative", - "type": { - "defined": "I80F48" - } + name: "quoteFreeNative", + type: { + defined: "I80F48", + }, }, { - "name": "referrerRebatesAccrued", - "type": "u64" + name: "referrerRebatesAccrued", + type: "u64", }, { - "name": "makerVolume", - "docs": [ + name: "makerVolume", + docs: [ "Cumulative maker volume in quote native units", "", - "(Display only)" + "(Display only)", ], - "type": "u64" + type: "u64", }, { - "name": "takerVolume", - "docs": [ + name: "takerVolume", + docs: [ "Cumulative taker volume in quote native units", "", - "(Display only)" + "(Display only)", ], - "type": "u64" + type: "u64", }, { - "name": "avgEntryPricePerBaseLot", - "docs": [ + 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." + "Reset to 0 when the base position reaches or crosses 0.", ], - "type": "f64" + type: "f64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 88 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 88], + }, + }, + ], + }, }, { - "name": "OpenOrder", - "type": { - "kind": "struct", - "fields": [ + name: "OpenOrder", + type: { + kind: "struct", + fields: [ { - "name": "sideAndTree", - "type": "u8" + name: "sideAndTree", + type: "u8", }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding1", + type: { + array: ["u8", 7], + }, }, { - "name": "clientId", - "type": "u64" + name: "clientId", + type: "u64", }, { - "name": "pegLimit", - "type": "i64" + name: "pegLimit", + type: "i64", }, { - "name": "id", - "type": "u128" + name: "id", + type: "u128", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 64 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 64], + }, + }, + ], + }, }, { - "name": "OracleConfig", - "type": { - "kind": "struct", - "fields": [ + name: "OracleConfig", + type: { + kind: "struct", + fields: [ { - "name": "confFilter", - "type": { - "defined": "I80F48" - } + name: "confFilter", + type: { + defined: "I80F48", + }, }, { - "name": "maxStalenessSlots", - "type": "i64" + name: "maxStalenessSlots", + type: "i64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 72 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 72], + }, + }, + ], + }, }, { - "name": "OracleConfigParams", - "type": { - "kind": "struct", - "fields": [ + name: "OracleConfigParams", + type: { + kind: "struct", + fields: [ { - "name": "confFilter", - "type": "f32" + name: "confFilter", + type: "f32", }, { - "name": "maxStalenessSlots", - "type": { - "option": "u32" - } - } - ] - } + name: "maxStalenessSlots", + type: { + option: "u32", + }, + }, + ], + }, }, { - "name": "InnerNode", - "docs": [ + 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." + "child has a 0 in the next bit, and the right a 1.", ], - "type": { - "kind": "struct", - "fields": [ + type: { + kind: "struct", + fields: [ { - "name": "tag", - "type": "u8" + name: "tag", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding", + type: { + array: ["u8", 3], + }, }, { - "name": "prefixLen", - "docs": [ + 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" + "e.g. if it's 2, the two highest bits of `key` will be the same on all children", ], - "type": "u32" + type: "u32", }, { - "name": "key", - "docs": [ - "only the top `prefix_len` bits of `key` are relevant" - ], - "type": "u128" + 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: "children", + docs: ["indexes into `BookSide::nodes`"], + type: { + array: ["u32", 2], + }, }, { - "name": "childEarliestExpiry", - "docs": [ + 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." + "iterate through the whole bookside.", ], - "type": { - "array": [ - "u64", - 2 - ] - } + type: { + array: ["u64", 2], + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 72 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 72], + }, + }, + ], + }, }, { - "name": "LeafNode", - "docs": [ - "LeafNodes represent an order in the binary tree" - ], - "type": { - "kind": "struct", - "fields": [ + name: "LeafNode", + docs: ["LeafNodes represent an order in the binary tree"], + type: { + kind: "struct", + fields: [ { - "name": "tag", - "docs": [ - "NodeTag" - ], - "type": "u8" + name: "tag", + docs: ["NodeTag"], + type: "u8", }, { - "name": "ownerSlot", - "docs": [ - "Index into the owning OpenOrdersAccount's OpenOrders" - ], - "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: "orderType", + docs: ["PostOrderType, this was added for TradingView move order"], + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 1 - ] - } + name: "padding", + type: { + array: ["u8", 1], + }, }, { - "name": "timeInForce", - "docs": [ + name: "timeInForce", + docs: [ "Time in seconds after `timestamp` at which the order expires.", - "A value of 0 means no expiry." + "A value of 0 means no expiry.", ], - "type": "u16" + type: "u16", }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 2 - ] - } + name: "padding2", + type: { + array: ["u8", 2], + }, }, { - "name": "key", - "docs": [ - "The binary tree key, see new_node_key()" - ], - "type": "u128" + name: "key", + docs: ["The binary tree key, see new_node_key()"], + type: "u128", }, { - "name": "owner", - "docs": [ - "Address of the owning OpenOrdersAccount" - ], - "type": "publicKey" + 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: "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: "timestamp", + docs: ["The time the order was placed"], + type: "u64", }, { - "name": "pegLimit", - "docs": [ + 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" + "Only applicable in the oracle_pegged OrderTree", ], - "type": "i64" + type: "i64", }, { - "name": "clientOrderId", - "docs": [ - "User defined id for this order, used in FillEvents" - ], - "type": "u64" + name: "clientOrderId", + docs: ["User defined id for this order, used in FillEvents"], + type: "u64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 32 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 32], + }, + }, + ], + }, }, { - "name": "AnyNode", - "type": { - "kind": "struct", - "fields": [ + name: "AnyNode", + type: { + kind: "struct", + fields: [ { - "name": "tag", - "type": "u8" + name: "tag", + type: "u8", }, { - "name": "data", - "type": { - "array": [ - "u8", - 119 - ] - } - } - ] - } + name: "data", + type: { + array: ["u8", 119], + }, + }, + ], + }, }, { - "name": "OrderTreeRoot", - "type": { - "kind": "struct", - "fields": [ + name: "OrderTreeRoot", + type: { + kind: "struct", + fields: [ { - "name": "maybeNode", - "type": "u32" + name: "maybeNode", + type: "u32", }, { - "name": "leafCount", - "type": "u32" - } - ] - } + name: "leafCount", + type: "u32", + }, + ], + }, }, { - "name": "OrderTreeNodes", - "docs": [ + name: "OrderTreeNodes", + docs: [ "A binary tree on AnyNode::key()", "", - "The key encodes the price in the top 64 bits." + "The key encodes the price in the top 64 bits.", ], - "type": { - "kind": "struct", - "fields": [ + type: { + kind: "struct", + fields: [ { - "name": "orderTreeType", - "type": "u8" + name: "orderTreeType", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 3 - ] - } + name: "padding", + type: { + array: ["u8", 3], + }, }, { - "name": "bumpIndex", - "type": "u32" + name: "bumpIndex", + type: "u32", }, { - "name": "freeListLen", - "type": "u32" + name: "freeListLen", + type: "u32", }, { - "name": "freeListHead", - "type": "u32" + name: "freeListHead", + type: "u32", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 512 - ] - } + name: "reserved", + type: { + array: ["u8", 512], + }, }, { - "name": "nodes", - "type": { - "array": [ + name: "nodes", + type: { + array: [ { - "defined": "AnyNode" + defined: "AnyNode", }, - 1024 - ] - } - } - ] - } + 1024, + ], + }, + }, + ], + }, }, { - "name": "EventQueueHeader", - "type": { - "kind": "struct", - "fields": [ + name: "EventQueueHeader", + type: { + kind: "struct", + fields: [ { - "name": "head", - "type": "u32" + name: "head", + type: "u32", }, { - "name": "count", - "type": "u32" + name: "count", + type: "u32", }, { - "name": "seqNum", - "type": "u64" - } - ] - } + name: "seqNum", + type: "u64", + }, + ], + }, }, { - "name": "AnyEvent", - "type": { - "kind": "struct", - "fields": [ + name: "AnyEvent", + type: { + kind: "struct", + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 199 - ] - } - } - ] - } + name: "padding", + type: { + array: ["u8", 199], + }, + }, + ], + }, }, { - "name": "FillEvent", - "type": { - "kind": "struct", - "fields": [ + name: "FillEvent", + type: { + kind: "struct", + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType", + type: "u8", }, { - "name": "takerSide", - "type": "u8" + name: "takerSide", + type: "u8", }, { - "name": "makerOut", - "type": "u8" + name: "makerOut", + type: "u8", }, { - "name": "makerSlot", - "type": "u8" + name: "makerSlot", + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 4 - ] - } + name: "padding", + type: { + array: ["u8", 4], + }, }, { - "name": "timestamp", - "type": "u64" + name: "timestamp", + type: "u64", }, { - "name": "seqNum", - "type": "u64" + name: "seqNum", + type: "u64", }, { - "name": "maker", - "type": "publicKey" + name: "maker", + type: "publicKey", }, { - "name": "padding2", - "type": { - "array": [ - "u8", - 32 - ] - } + name: "padding2", + type: { + array: ["u8", 32], + }, }, { - "name": "makerTimestamp", - "type": "u64" + name: "makerTimestamp", + type: "u64", }, { - "name": "taker", - "type": "publicKey" + name: "taker", + type: "publicKey", }, { - "name": "padding3", - "type": { - "array": [ - "u8", - 16 - ] - } + name: "padding3", + type: { + array: ["u8", 16], + }, }, { - "name": "takerClientOrderId", - "type": "u64" + name: "takerClientOrderId", + type: "u64", }, { - "name": "padding4", - "type": { - "array": [ - "u8", - 16 - ] - } + name: "padding4", + type: { + array: ["u8", 16], + }, }, { - "name": "price", - "type": "i64" + name: "price", + type: "i64", }, { - "name": "quantity", - "type": "i64" + name: "quantity", + type: "i64", }, { - "name": "makerClientOrderId", - "type": "u64" + name: "makerClientOrderId", + type: "u64", }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 8 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 8], + }, + }, + ], + }, }, { - "name": "OutEvent", - "type": { - "kind": "struct", - "fields": [ + name: "OutEvent", + type: { + kind: "struct", + fields: [ { - "name": "eventType", - "type": "u8" + name: "eventType", + type: "u8", }, { - "name": "side", - "type": "u8" + name: "side", + type: "u8", }, { - "name": "ownerSlot", - "type": "u8" + name: "ownerSlot", + type: "u8", }, { - "name": "padding0", - "type": { - "array": [ - "u8", - 5 - ] - } + name: "padding0", + type: { + array: ["u8", 5], + }, }, { - "name": "timestamp", - "type": "u64" + name: "timestamp", + type: "u64", }, { - "name": "seqNum", - "type": "u64" + name: "seqNum", + type: "u64", }, { - "name": "owner", - "type": "publicKey" + name: "owner", + type: "publicKey", }, { - "name": "quantity", - "type": "i64" + name: "quantity", + type: "i64", }, { - "name": "padding1", - "type": { - "array": [ - "u8", - 136 - ] - } - } - ] - } + name: "padding1", + type: { + array: ["u8", 136], + }, + }, + ], + }, }, { - "name": "StablePriceModel", - "docs": [ - "Maintains a \"stable_price\" based on the oracle price.", + 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", @@ -5142,716 +4769,701 @@ export const IDL: OpenbookV2 = { "(`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." + "`delay_growth_limit` between intervals.", ], - "type": { - "kind": "struct", - "fields": [ + type: { + kind: "struct", + fields: [ { - "name": "stablePrice", - "docs": [ - "Current stable price to use in health" - ], - "type": "f64" + name: "stablePrice", + docs: ["Current stable price to use in health"], + type: "f64", }, { - "name": "lastUpdateTimestamp", - "type": "u64" + name: "lastUpdateTimestamp", + type: "u64", }, { - "name": "delayPrices", - "docs": [ + 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." + "we use the next one.", ], - "type": { - "array": [ - "f64", - 24 - ] - } + type: { + array: ["f64", 24], + }, }, { - "name": "delayAccumulatorPrice", - "docs": [ + name: "delayAccumulatorPrice", + docs: [ "The delay price is based on an average over each delay_interval. The contributions", - "to the average are summed up here." + "to the average are summed up here.", ], - "type": "f64" + type: "f64", }, { - "name": "delayAccumulatorTime", - "docs": [ - "Accumulating the total time for the above average." - ], - "type": "u32" + name: "delayAccumulatorTime", + docs: ["Accumulating the total time for the above average."], + type: "u32", }, { - "name": "delayIntervalSeconds", - "docs": [ - "Length of a delay_interval" - ], - "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." + name: "delayGrowthLimit", + docs: [ + "Maximal relative difference between two delay_price in consecutive intervals.", ], - "type": "f32" + type: "f32", }, { - "name": "stableGrowthLimit", - "docs": [ + name: "stableGrowthLimit", + docs: [ "Maximal per-second relative difference of the stable price.", - "It gets further reduced if stable and delay price disagree." + "It gets further reduced if stable and delay price disagree.", ], - "type": "f32" + type: "f32", }, { - "name": "lastDelayIntervalIndex", - "docs": [ - "The delay_interval_index that update() was last called on." + name: "lastDelayIntervalIndex", + docs: [ + "The delay_interval_index that update() was last called on.", ], - "type": "u8" + type: "u8", }, { - "name": "padding", - "type": { - "array": [ - "u8", - 7 - ] - } + name: "padding", + type: { + array: ["u8", 7], + }, }, { - "name": "reserved", - "type": { - "array": [ - "u8", - 48 - ] - } - } - ] - } + name: "reserved", + type: { + array: ["u8", 48], + }, + }, + ], + }, }, { - "name": "MarketIndex", - "docs": [ + 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." + "knows about them and typescript can deserialize it.", ], - "type": { - "kind": "struct", - "fields": [ + type: { + kind: "struct", + fields: [ { - "name": "val", - "type": "u32" - } - ] - } + name: "val", + type: "u32", + }, + ], + }, }, { - "name": "I80F48", - "type": { - "kind": "struct", - "fields": [ + name: "I80F48", + type: { + kind: "struct", + fields: [ { - "name": "val", - "type": "i128" - } - ] - } + name: "val", + type: "i128", + }, + ], + }, }, { - "name": "OracleType", - "type": { - "kind": "enum", - "variants": [ + name: "OracleType", + type: { + kind: "enum", + variants: [ { - "name": "Pyth" + name: "Pyth", }, { - "name": "Stub" + name: "Stub", }, { - "name": "SwitchboardV1" + name: "SwitchboardV1", }, { - "name": "SwitchboardV2" - } - ] - } + name: "SwitchboardV2", + }, + ], + }, }, { - "name": "OrderState", - "type": { - "kind": "enum", - "variants": [ + name: "OrderState", + type: { + kind: "enum", + variants: [ { - "name": "Valid" + name: "Valid", }, { - "name": "Invalid" + name: "Invalid", }, { - "name": "Skipped" - } - ] - } + name: "Skipped", + }, + ], + }, }, { - "name": "BookSideOrderTree", - "type": { - "kind": "enum", - "variants": [ + name: "BookSideOrderTree", + type: { + kind: "enum", + variants: [ { - "name": "Fixed" + name: "Fixed", }, { - "name": "OraclePegged" - } - ] - } + name: "OraclePegged", + }, + ], + }, }, { - "name": "NodeTag", - "type": { - "kind": "enum", - "variants": [ + name: "NodeTag", + type: { + kind: "enum", + variants: [ { - "name": "Uninitialized" + name: "Uninitialized", }, { - "name": "InnerNode" + name: "InnerNode", }, { - "name": "LeafNode" + name: "LeafNode", }, { - "name": "FreeNode" + name: "FreeNode", }, { - "name": "LastFreeNode" - } - ] - } + name: "LastFreeNode", + }, + ], + }, }, { - "name": "PlaceOrderType", - "type": { - "kind": "enum", - "variants": [ + name: "PlaceOrderType", + type: { + kind: "enum", + variants: [ { - "name": "Limit" + name: "Limit", }, { - "name": "ImmediateOrCancel" + name: "ImmediateOrCancel", }, { - "name": "PostOnly" + name: "PostOnly", }, { - "name": "Market" + name: "Market", }, { - "name": "PostOnlySlide" - } - ] - } + name: "PostOnlySlide", + }, + ], + }, }, { - "name": "PostOrderType", - "type": { - "kind": "enum", - "variants": [ + name: "PostOrderType", + type: { + kind: "enum", + variants: [ { - "name": "Limit" + name: "Limit", }, { - "name": "PostOnly" + name: "PostOnly", }, { - "name": "PostOnlySlide" - } - ] - } + name: "PostOnlySlide", + }, + ], + }, }, { - "name": "Side", - "type": { - "kind": "enum", - "variants": [ + name: "Side", + type: { + kind: "enum", + variants: [ { - "name": "Bid" + name: "Bid", }, { - "name": "Ask" - } - ] - } + name: "Ask", + }, + ], + }, }, { - "name": "SideAndOrderTree", - "docs": [ - "SideAndOrderTree is a storage optimization, so we don't need two bytes for the data" + name: "SideAndOrderTree", + docs: [ + "SideAndOrderTree is a storage optimization, so we don't need two bytes for the data", ], - "type": { - "kind": "enum", - "variants": [ + type: { + kind: "enum", + variants: [ { - "name": "BidFixed" + name: "BidFixed", }, { - "name": "AskFixed" + name: "AskFixed", }, { - "name": "BidOraclePegged" + name: "BidOraclePegged", }, { - "name": "AskOraclePegged" - } - ] - } + name: "AskOraclePegged", + }, + ], + }, }, { - "name": "OrderParams", - "type": { - "kind": "enum", - "variants": [ + name: "OrderParams", + type: { + kind: "enum", + variants: [ { - "name": "Market" + name: "Market", }, { - "name": "ImmediateOrCancel", - "fields": [ + name: "ImmediateOrCancel", + fields: [ { - "name": "price_lots", - "type": "i64" - } - ] + name: "price_lots", + type: "i64", + }, + ], }, { - "name": "Fixed", - "fields": [ + name: "Fixed", + fields: [ { - "name": "price_lots", - "type": "i64" + name: "price_lots", + type: "i64", }, { - "name": "order_type", - "type": { - "defined": "PostOrderType" - } - } - ] + name: "order_type", + type: { + defined: "PostOrderType", + }, + }, + ], }, { - "name": "OraclePegged", - "fields": [ + name: "OraclePegged", + fields: [ { - "name": "price_offset_lots", - "type": "i64" + name: "price_offset_lots", + type: "i64", }, { - "name": "order_type", - "type": { - "defined": "PostOrderType" - } + name: "order_type", + type: { + defined: "PostOrderType", + }, }, { - "name": "peg_limit", - "type": "i64" + name: "peg_limit", + type: "i64", }, { - "name": "max_oracle_staleness_slots", - "type": "i32" - } - ] - } - ] - } + name: "max_oracle_staleness_slots", + type: "i32", + }, + ], + }, + ], + }, }, { - "name": "OrderTreeType", - "type": { - "kind": "enum", - "variants": [ + name: "OrderTreeType", + type: { + kind: "enum", + variants: [ { - "name": "Bids" + name: "Bids", }, { - "name": "Asks" - } - ] - } + name: "Asks", + }, + ], + }, }, { - "name": "EventType", - "type": { - "kind": "enum", - "variants": [ + name: "EventType", + type: { + kind: "enum", + variants: [ { - "name": "Fill" + name: "Fill", }, { - "name": "Out" - } - ] - } - } + name: "Out", + }, + ], + }, + }, ], - "events": [ + events: [ { - "name": "BalanceLog", - "fields": [ + name: "BalanceLog", + fields: [ { - "name": "openOrdersAcc", - "type": "publicKey", - "index": false + name: "openOrdersAcc", + type: "publicKey", + index: false, }, { - "name": "basePosition", - "type": "i64", - "index": false + name: "basePosition", + type: "i64", + index: false, }, { - "name": "quotePosition", - "type": "i128", - "index": false - } - ] + name: "quotePosition", + type: "i128", + index: false, + }, + ], }, { - "name": "DepositLog", - "fields": [ + name: "DepositLog", + fields: [ { - "name": "openOrdersAcc", - "type": "publicKey", - "index": false + name: "openOrdersAcc", + type: "publicKey", + index: false, }, { - "name": "signer", - "type": "publicKey", - "index": false + name: "signer", + type: "publicKey", + index: false, }, { - "name": "quantity", - "type": "u64", - "index": false - } - ] + name: "quantity", + type: "u64", + index: false, + }, + ], }, { - "name": "FillLog", - "fields": [ + name: "FillLog", + fields: [ { - "name": "takerSide", - "type": "u8", - "index": false + name: "takerSide", + type: "u8", + index: false, }, { - "name": "makerSlot", - "type": "u8", - "index": false + name: "makerSlot", + type: "u8", + index: false, }, { - "name": "makerOut", - "type": "bool", - "index": false + name: "makerOut", + type: "bool", + index: false, }, { - "name": "timestamp", - "type": "u64", - "index": false + name: "timestamp", + type: "u64", + index: false, }, { - "name": "seqNum", - "type": "u64", - "index": false + name: "seqNum", + type: "u64", + index: false, }, { - "name": "maker", - "type": "publicKey", - "index": false + name: "maker", + type: "publicKey", + index: false, }, { - "name": "makerClientOrderId", - "type": "u64", - "index": false + name: "makerClientOrderId", + type: "u64", + index: false, }, { - "name": "makerFee", - "type": "f32", - "index": false + name: "makerFee", + type: "f32", + index: false, }, { - "name": "makerTimestamp", - "type": "u64", - "index": false + name: "makerTimestamp", + type: "u64", + index: false, }, { - "name": "taker", - "type": "publicKey", - "index": false + name: "taker", + type: "publicKey", + index: false, }, { - "name": "takerClientOrderId", - "type": "u64", - "index": false + name: "takerClientOrderId", + type: "u64", + index: false, }, { - "name": "takerFee", - "type": "f32", - "index": false + name: "takerFee", + type: "f32", + index: false, }, { - "name": "price", - "type": "i64", - "index": false + name: "price", + type: "i64", + index: false, }, { - "name": "quantity", - "type": "i64", - "index": false - } - ] + name: "quantity", + type: "i64", + index: false, + }, + ], }, { - "name": "MarketMetaDataLog", - "fields": [ + name: "MarketMetaDataLog", + fields: [ { - "name": "market", - "type": "publicKey", - "index": false + name: "market", + type: "publicKey", + index: false, }, { - "name": "marketIndex", - "type": "u32", - "index": false + name: "marketIndex", + type: "u32", + index: false, }, { - "name": "baseDecimals", - "type": "u8", - "index": false + name: "baseDecimals", + type: "u8", + index: false, }, { - "name": "quoteDecimals", - "type": "u8", - "index": false + name: "quoteDecimals", + type: "u8", + index: false, }, { - "name": "baseLotSize", - "type": "i64", - "index": false + name: "baseLotSize", + type: "i64", + index: false, }, { - "name": "quoteLotSize", - "type": "i64", - "index": false + name: "quoteLotSize", + type: "i64", + index: false, }, { - "name": "oracle", - "type": "publicKey", - "index": false - } - ] - } + name: "oracle", + type: "publicKey", + index: false, + }, + ], + }, ], - "errors": [ + errors: [ { - "code": 6000, - "name": "SomeError", - "msg": "" + code: 6000, + name: "SomeError", + msg: "", }, { - "code": 6001, - "name": "NotImplementedError", - "msg": "" + code: 6001, + name: "NotImplementedError", + msg: "", }, { - "code": 6002, - "name": "MathError", - "msg": "checked math error" + code: 6002, + name: "MathError", + msg: "checked math error", }, { - "code": 6003, - "name": "UnexpectedOracle", - "msg": "" + code: 6003, + name: "UnexpectedOracle", + msg: "", }, { - "code": 6004, - "name": "UnknownOracleType", - "msg": "oracle type cannot be determined" + code: 6004, + name: "UnknownOracleType", + msg: "oracle type cannot be determined", }, { - "code": 6005, - "name": "InvalidBank", - "msg": "invalid bank" + code: 6005, + name: "InvalidBank", + msg: "invalid bank", }, { - "code": 6006, - "name": "ProfitabilityMismatch", - "msg": "account profitability is mismatched" + code: 6006, + name: "ProfitabilityMismatch", + msg: "account profitability is mismatched", }, { - "code": 6007, - "name": "CannotSettleWithSelf", - "msg": "cannot settle with self" + code: 6007, + name: "CannotSettleWithSelf", + msg: "cannot settle with self", }, { - "code": 6008, - "name": "PositionDoesNotExist", - "msg": "perp position does not exist" + code: 6008, + name: "PositionDoesNotExist", + msg: "perp position does not exist", }, { - "code": 6009, - "name": "MaxSettleAmountMustBeGreaterThanZero", - "msg": "max settle amount must be greater than zero" + 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: 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: 6011, + name: "OracleConfidence", + msg: "an oracle does not reach the confidence threshold", }, { - "code": 6012, - "name": "OracleStale", - "msg": "an oracle is stale" + code: 6012, + name: "OracleStale", + msg: "an oracle is stale", }, { - "code": 6013, - "name": "SettlementAmountMustBePositive", - "msg": "settlement amount must always be positive" + code: 6013, + name: "SettlementAmountMustBePositive", + msg: "settlement amount must always be positive", }, { - "code": 6014, - "name": "BankBorrowLimitReached", - "msg": "bank utilization has reached limit" + 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: 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: 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: 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: 6018, + name: "TokenInReduceOnlyMode", + msg: "token is in reduce only mode", }, { - "code": 6019, - "name": "MarketInReduceOnlyMode", - "msg": "market 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: 6020, + name: "GroupIsHalted", + msg: "group is halted", }, { - "code": 6021, - "name": "HasBaseLots", - "msg": "the perp position has non-zero base lots" + 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: 6022, + name: "HasOpenOrUnsettledSerum3Orders", + msg: "there are open or unsettled serum3 orders", }, { - "code": 6023, - "name": "HasLiquidatableTokenPosition", - "msg": "has liquidatable token position" + code: 6023, + name: "HasLiquidatableTokenPosition", + msg: "has liquidatable token position", }, { - "code": 6024, - "name": "HasLiquidatableBasePosition", - "msg": "has liquidatable perp base position" + code: 6024, + name: "HasLiquidatableBasePosition", + msg: "has liquidatable perp base position", }, { - "code": 6025, - "name": "HasLiquidatablePositivePnl", - "msg": "has liquidatable positive perp pnl" + code: 6025, + name: "HasLiquidatablePositivePnl", + msg: "has liquidatable positive perp pnl", }, { - "code": 6026, - "name": "AccountIsFrozen", - "msg": "account is frozen" + code: 6026, + name: "AccountIsFrozen", + msg: "account is frozen", }, { - "code": 6027, - "name": "InitAssetWeightCantBeNegative", - "msg": "Init Asset Weight can't be negative" + code: 6027, + name: "InitAssetWeightCantBeNegative", + msg: "Init Asset Weight can't be negative", }, { - "code": 6028, - "name": "HasOpenTakerFills", - "msg": "has open perp taker fills" + code: 6028, + name: "HasOpenTakerFills", + msg: "has open perp taker fills", }, { - "code": 6029, - "name": "DepositLimit", - "msg": "deposit crosses the current group deposit limit" + code: 6029, + name: "DepositLimit", + msg: "deposit crosses the current group deposit limit", }, { - "code": 6030, - "name": "IxIsDisabled", - "msg": "instruction is disabled" + code: 6030, + name: "IxIsDisabled", + msg: "instruction is disabled", }, { - "code": 6031, - "name": "NoLiquidatableBasePosition", - "msg": "no liquidatable perp base position" + code: 6031, + name: "NoLiquidatableBasePosition", + msg: "no liquidatable perp base position", }, { - "code": 6032, - "name": "OrderIdNotFound", - "msg": "perp order id not found on the orderbook" + 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: 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: 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: 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: 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" - } - ] + code: 6037, + name: "InvalidFundsReceiver", + msg: "The receiver is invalid. Makes sure the receiver's owner is the market admin", + }, + ], }; diff --git a/configure/output_file.ts b/configure/output_file.ts index d92072b..83a21d3 100644 --- a/configure/output_file.ts +++ b/configure/output_file.ts @@ -3,21 +3,21 @@ import { Market } from "./openbook-v2/create_markets"; import { User } from "./general/create_users"; export interface Command { - name: String, - instruction: number[], - argument_sizes: number[], + name: String; + instruction: number[]; + argument_sizes: number[]; } export interface ProgramOutputData { - name: String, - program_id: PublicKey, - commands: Command [], + name: String; + program_id: PublicKey; + commands: Command[]; } export interface OutputFile { - users: User[], - programs: ProgramOutputData[], - known_accounts: PublicKey[], - mints: PublicKey[], - markets: Market[], + users: User[]; + programs: ProgramOutputData[]; + known_accounts: PublicKey[]; + mints: PublicKey[]; + markets: Market[]; } diff --git a/configure/programs.json b/configure/programs.json index d2e6754..f2ce836 100644 --- a/configure/programs.json +++ b/configure/programs.json @@ -1,14 +1,14 @@ [ - { - "name": "pyth_mock", - "programPath": "programs/pyth_mock.so", - "programKeyPath": "programs/pyth_mock.json", - "idl": "" - }, - { - "name": "openbook_v2", - "programPath": "programs/openbook_v2.so", - "programKeyPath": "programs/openbook_v2-keypair.json", - "idl": "programs/openbook_v2.json" - } + { + "name": "pyth_mock", + "programPath": "configure/programs/pyth_mock.so", + "programKeyPath": "configure/programs/pyth_mock.json", + "idl": "" + }, + { + "name": "openbook_v2", + "programPath": "configure/programs/openbook_v2.so", + "programKeyPath": "configure/programs/openbook_v2-keypair.json", + "idl": "" + } ] diff --git a/configure/programs/openbook_v2-keypair.json b/configure/programs/openbook_v2-keypair.json index 5f95305..a20d231 100644 --- a/configure/programs/openbook_v2-keypair.json +++ b/configure/programs/openbook_v2-keypair.json @@ -1 +1,6 @@ -[171,85,64,152,85,43,106,98,158,185,190,190,234,79,138,30,140,60,95,30,192,14,16,22,82,32,87,208,65,91,89,245,57,63,214,97,128,249,112,13,187,5,224,38,17,8,25,178,88,226,115,45,80,88,164,168,139,142,172,189,196,225,156,28] \ No newline at end of file +[ + 171, 85, 64, 152, 85, 43, 106, 98, 158, 185, 190, 190, 234, 79, 138, 30, 140, + 60, 95, 30, 192, 14, 16, 22, 82, 32, 87, 208, 65, 91, 89, 245, 57, 63, 214, + 97, 128, 249, 112, 13, 187, 5, 224, 38, 17, 8, 25, 178, 88, 226, 115, 45, 80, + 88, 164, 168, 139, 142, 172, 189, 196, 225, 156, 28 +] diff --git a/configure/programs/openbook_v2.json b/configure/programs/openbook_v2.json index 982ce57..4c65303 100644 --- a/configure/programs/openbook_v2.json +++ b/configure/programs/openbook_v2.json @@ -640,9 +640,7 @@ }, { "name": "cancelAllOrders", - "docs": [ - "Cancel up to `limit` orders." - ], + "docs": ["Cancel up to `limit` orders."], "accounts": [ { "name": "openOrdersAccount", @@ -679,9 +677,7 @@ }, { "name": "cancelAllOrdersBySide", - "docs": [ - "Cancel up to `limit` orders on a single side of the book." - ], + "docs": ["Cancel up to `limit` orders on a single side of the book."], "accounts": [ { "name": "openOrdersAccount", @@ -793,9 +789,7 @@ }, { "name": "settleFunds", - "docs": [ - "Withdraw any available tokens." - ], + "docs": ["Withdraw any available tokens."], "accounts": [ { "name": "openOrdersAccount", @@ -842,9 +836,7 @@ }, { "name": "sweepFees", - "docs": [ - "Sweep fees, as a [`Market`](crate::state::Market)'s admin." - ], + "docs": ["Sweep fees, as a [`Market`](crate::state::Market)'s admin."], "accounts": [ { "name": "market", @@ -876,9 +868,7 @@ }, { "name": "closeMarket", - "docs": [ - "Close a [`Market`](crate::state::Market)." - ], + "docs": ["Close a [`Market`](crate::state::Market)."], "accounts": [ { "name": "admin", @@ -1014,23 +1004,17 @@ "fields": [ { "name": "admin", - "docs": [ - "Admin who can close this market" - ], + "docs": ["Admin who can close this market"], "type": "publicKey" }, { "name": "marketIndex", - "docs": [ - "Index of this market" - ], + "docs": ["Index of this market"], "type": "u32" }, { "name": "bump", - "docs": [ - "PDA bump" - ], + "docs": ["PDA bump"], "type": "u8" }, { @@ -1049,57 +1033,39 @@ { "name": "padding1", "type": { - "array": [ - "u8", - 1 - ] + "array": ["u8", 1] } }, { "name": "name", - "docs": [ - "Name. Trailing zero bytes are ignored." - ], + "docs": ["Name. Trailing zero bytes are ignored."], "type": { - "array": [ - "u8", - 16 - ] + "array": ["u8", 16] } }, { "name": "bids", - "docs": [ - "Address of the BookSide account for bids" - ], + "docs": ["Address of the BookSide account for bids"], "type": "publicKey" }, { "name": "asks", - "docs": [ - "Address of the BookSide account for asks" - ], + "docs": ["Address of the BookSide account for asks"], "type": "publicKey" }, { "name": "eventQueue", - "docs": [ - "Address of the EventQueue account" - ], + "docs": ["Address of the EventQueue account"], "type": "publicKey" }, { "name": "oracle", - "docs": [ - "Oracle account address" - ], + "docs": ["Oracle account address"], "type": "publicKey" }, { "name": "oracleConfig", - "docs": [ - "Oracle configuration" - ], + "docs": ["Oracle configuration"], "type": { "defined": "OracleConfig" } @@ -1137,16 +1103,12 @@ }, { "name": "seqNum", - "docs": [ - "Total number of orders seen" - ], + "docs": ["Total number of orders seen"], "type": "u64" }, { "name": "registrationTime", - "docs": [ - "Timestamp in seconds that the market was registered at." - ], + "docs": ["Timestamp in seconds that the market was registered at."], "type": "u64" }, { @@ -1161,45 +1123,34 @@ }, { "name": "takerFee", - "docs": [ - "Fee for taker orders, may not be negative." - ], + "docs": ["Fee for taker orders, may not be negative."], "type": { "defined": "I80F48" } }, { "name": "feesAccrued", - "docs": [ - "Fees accrued in native quote currency" - ], + "docs": ["Fees accrued in native quote currency"], "type": { "defined": "I80F48" } }, { "name": "feesSettled", - "docs": [ - "Fees settled in native quote currency" - ], + "docs": ["Fees settled in native quote currency"], "type": { "defined": "I80F48" } }, { "name": "feePenalty", - "docs": [ - "Fee (in quote native) to charge for ioc orders" - ], + "docs": ["Fee (in quote native) to charge for ioc orders"], "type": "f32" }, { "name": "padding2", "type": { - "array": [ - "u8", - 4 - ] + "array": ["u8", 4] } }, { @@ -1249,10 +1200,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 1888 - ] + "array": ["u8", 1888] } } ] @@ -1270,10 +1218,7 @@ { "name": "name", "type": { - "array": [ - "u8", - 32 - ] + "array": ["u8", 32] } }, { @@ -1291,10 +1236,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 3 - ] + "array": ["u8", 3] } }, { @@ -1307,9 +1249,7 @@ }, { "name": "buybackFeesAccruedPrevious", - "docs": [ - "Fees buyback amount from the previous expiry interval." - ], + "docs": ["Fees buyback amount from the previous expiry interval."], "type": "u64" }, { @@ -1328,10 +1268,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 208 - ] + "array": ["u8", 208] } }, { @@ -1341,10 +1278,7 @@ { "name": "padding3", "type": { - "array": [ - "u8", - 7 - ] + "array": ["u8", 7] } }, { @@ -1388,10 +1322,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 128 - ] + "array": ["u8", 128] } } ] @@ -1427,10 +1358,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 256 - ] + "array": ["u8", 256] } }, { @@ -1467,10 +1395,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 64 - ] + "array": ["u8", 64] } } ] @@ -1490,10 +1415,7 @@ { "name": "name", "type": { - "array": [ - "u8", - 32 - ] + "array": ["u8", 32] } }, { @@ -1511,10 +1433,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 3 - ] + "array": ["u8", 3] } }, { @@ -1538,10 +1457,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 208 - ] + "array": ["u8", 208] } } ] @@ -1561,16 +1477,12 @@ }, { "name": "bidsBaseLots", - "docs": [ - "Base lots in open bids" - ], + "docs": ["Base lots in open bids"], "type": "i64" }, { "name": "asksBaseLots", - "docs": [ - "Base lots in open asks" - ], + "docs": ["Base lots in open asks"], "type": "i64" }, { @@ -1618,10 +1530,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 88 - ] + "array": ["u8", 88] } } ] @@ -1639,10 +1548,7 @@ { "name": "padding1", "type": { - "array": [ - "u8", - 7 - ] + "array": ["u8", 7] } }, { @@ -1660,10 +1566,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 64 - ] + "array": ["u8", 64] } } ] @@ -1687,10 +1590,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 72 - ] + "array": ["u8", 72] } } ] @@ -1733,10 +1633,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 3 - ] + "array": ["u8", 3] } }, { @@ -1749,21 +1646,14 @@ }, { "name": "key", - "docs": [ - "only the top `prefix_len` bits of `key` are relevant" - ], + "docs": ["only the top `prefix_len` bits of `key` are relevant"], "type": "u128" }, { "name": "children", - "docs": [ - "indexes into `BookSide::nodes`" - ], + "docs": ["indexes into `BookSide::nodes`"], "type": { - "array": [ - "u32", - 2 - ] + "array": ["u32", 2] } }, { @@ -1775,19 +1665,13 @@ "iterate through the whole bookside." ], "type": { - "array": [ - "u64", - 2 - ] + "array": ["u64", 2] } }, { "name": "reserved", "type": { - "array": [ - "u8", - 72 - ] + "array": ["u8", 72] } } ] @@ -1795,24 +1679,18 @@ }, { "name": "LeafNode", - "docs": [ - "LeafNodes represent an order in the binary tree" - ], + "docs": ["LeafNodes represent an order in the binary tree"], "type": { "kind": "struct", "fields": [ { "name": "tag", - "docs": [ - "NodeTag" - ], + "docs": ["NodeTag"], "type": "u8" }, { "name": "ownerSlot", - "docs": [ - "Index into the owning OpenOrdersAccount's OpenOrders" - ], + "docs": ["Index into the owning OpenOrdersAccount's OpenOrders"], "type": "u8" }, { @@ -1825,10 +1703,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 1 - ] + "array": ["u8", 1] } }, { @@ -1842,38 +1717,27 @@ { "name": "padding2", "type": { - "array": [ - "u8", - 2 - ] + "array": ["u8", 2] } }, { "name": "key", - "docs": [ - "The binary tree key, see new_node_key()" - ], + "docs": ["The binary tree key, see new_node_key()"], "type": "u128" }, { "name": "owner", - "docs": [ - "Address of the owning OpenOrdersAccount" - ], + "docs": ["Address of the owning OpenOrdersAccount"], "type": "publicKey" }, { "name": "quantity", - "docs": [ - "Number of base lots to buy or sell, always >=1" - ], + "docs": ["Number of base lots to buy or sell, always >=1"], "type": "i64" }, { "name": "timestamp", - "docs": [ - "The time the order was placed" - ], + "docs": ["The time the order was placed"], "type": "u64" }, { @@ -1888,18 +1752,13 @@ }, { "name": "clientOrderId", - "docs": [ - "User defined id for this order, used in FillEvents" - ], + "docs": ["User defined id for this order, used in FillEvents"], "type": "u64" }, { "name": "reserved", "type": { - "array": [ - "u8", - 32 - ] + "array": ["u8", 32] } } ] @@ -1917,10 +1776,7 @@ { "name": "data", "type": { - "array": [ - "u8", - 119 - ] + "array": ["u8", 119] } } ] @@ -1959,10 +1815,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 3 - ] + "array": ["u8", 3] } }, { @@ -1980,10 +1833,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 512 - ] + "array": ["u8", 512] } }, { @@ -2032,10 +1882,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 199 - ] + "array": ["u8", 199] } } ] @@ -2065,10 +1912,7 @@ { "name": "padding", "type": { - "array": [ - "u8", - 4 - ] + "array": ["u8", 4] } }, { @@ -2086,10 +1930,7 @@ { "name": "padding2", "type": { - "array": [ - "u8", - 32 - ] + "array": ["u8", 32] } }, { @@ -2103,10 +1944,7 @@ { "name": "padding3", "type": { - "array": [ - "u8", - 16 - ] + "array": ["u8", 16] } }, { @@ -2116,10 +1954,7 @@ { "name": "padding4", "type": { - "array": [ - "u8", - 16 - ] + "array": ["u8", 16] } }, { @@ -2137,10 +1972,7 @@ { "name": "reserved", "type": { - "array": [ - "u8", - 8 - ] + "array": ["u8", 8] } } ] @@ -2166,10 +1998,7 @@ { "name": "padding0", "type": { - "array": [ - "u8", - 5 - ] + "array": ["u8", 5] } }, { @@ -2191,10 +2020,7 @@ { "name": "padding1", "type": { - "array": [ - "u8", - 136 - ] + "array": ["u8", 136] } } ] @@ -2220,9 +2046,7 @@ "fields": [ { "name": "stablePrice", - "docs": [ - "Current stable price to use in health" - ], + "docs": ["Current stable price to use in health"], "type": "f64" }, { @@ -2239,10 +2063,7 @@ "we use the next one." ], "type": { - "array": [ - "f64", - 24 - ] + "array": ["f64", 24] } }, { @@ -2255,16 +2076,12 @@ }, { "name": "delayAccumulatorTime", - "docs": [ - "Accumulating the total time for the above average." - ], + "docs": ["Accumulating the total time for the above average."], "type": "u32" }, { "name": "delayIntervalSeconds", - "docs": [ - "Length of a delay_interval" - ], + "docs": ["Length of a delay_interval"], "type": "u32" }, { @@ -2292,19 +2109,13 @@ { "name": "padding", "type": { - "array": [ - "u8", - 7 - ] + "array": ["u8", 7] } }, { "name": "reserved", "type": { - "array": [ - "u8", - 48 - ] + "array": ["u8", 48] } } ] @@ -2925,4 +2736,4 @@ "msg": "The receiver is invalid. Makes sure the receiver's owner is the market admin" } ] -} \ No newline at end of file +} diff --git a/configure/programs/pyth_mock.json b/configure/programs/pyth_mock.json index 751b528..c0a06ce 100644 --- a/configure/programs/pyth_mock.json +++ b/configure/programs/pyth_mock.json @@ -1 +1,6 @@ -[247,81,41,82,59,37,100,159,77,210,53,136,212,197,48,156,35,235,118,52,60,249,192,135,247,217,123,52,53,60,223,78,205,15,251,191,21,149,104,160,69,71,75,237,133,4,137,222,132,215,169,167,197,234,74,145,175,129,228,68,34,166,170,187] \ No newline at end of file +[ + 247, 81, 41, 82, 59, 37, 100, 159, 77, 210, 53, 136, 212, 197, 48, 156, 35, + 235, 118, 52, 60, 249, 192, 135, 247, 217, 123, 52, 53, 60, 223, 78, 205, 15, + 251, 191, 21, 149, 104, 160, 69, 71, 75, 237, 133, 4, 137, 222, 132, 215, 169, + 167, 197, 234, 74, 145, 175, 129, 228, 68, 34, 166, 170, 187 +] diff --git a/package.json b/package.json index 23296c4..93ed527 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "main": "index.js", "repository": "https://github.com/blockworks-foundation/solana-rpc-testing.git", "license": "MIT", + "scripts": { + "configure": "ts-node configure/main.ts" + }, "devDependencies": { "@types/node": "^20.1.0", "ts-node": "^10.9.1",