Order book

OpenBook v2 historical data as Parquet

Every OpenBook v2 instruction and event in Solana history, decoded with an Anchor IDL that we checked against real transactions. Trawl gives you 8 event tables and 29 instruction tables, with a column for each account, argument and field. Calls from other programs (CPI) are in the result too.

Updated

The preset

Program
opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb
Preset
openbook-v2
Tables
8 event tables and 29 instruction tables, and part-* with the raw bytes of each match
Price
$4 for one recent epoch, $8.68 for one week of chain

The price is the same for every program: you pay for the archive the scan reads, not for the rows. Pricing.

# ask for a price: a 402 with the quote, no payment yet
curl -X POST https://trawl.run/scan \
  -H 'Content-Type: application/json' \
  -d '{"preset":"openbook-v2","start_epoch":1058,"end_epoch":1058}'

-- then, in DuckDB, on the files of the job
SELECT slot, signature, openOrdersAccount, signer, baseAmount
FROM 'ev-deposit_log-*.parquet'
ORDER BY slot
LIMIT 10;

Add "filter": {"accounts": ["<wallet>"]} to keep only the transactions that touch one wallet. How a filter changes a preset.

Event tables

One table for each event in the IDL. Each row also has log_index and the context columns. An event that the program writes two ways gives one row.

ev-deposit_log
fields: openOrdersAccount base58 string, signer base58 string, baseAmount u64, quoteAmount u64
ev-fill_log
fields: market base58 string, takerSide u8, makerSlot u8, makerOut bool, timestamp u64, seqNum u64, maker base58 string, makerClientOrderId u64, makerFee u64, makerTimestamp u64, taker base58 string, takerClientOrderId u64, takerFeeCeil u64, price i64, quantity i64
ev-market_meta_data_log
fields: market base58 string, name string, baseMint base58 string, quoteMint base58 string, baseDecimals u8, quoteDecimals u8, baseLotSize i64, quoteLotSize i64
ev-total_order_fill_event
fields: side u8, taker base58 string, totalQuantityPaid u64, totalQuantityReceived u64, fees u64
ev-set_delegate_log
fields: openOrdersAccount base58 string, delegate base58 string
ev-settle_funds_log
fields: openOrdersAccount base58 string, baseNative u64, quoteNative u64, referrerRebate u64, referrer base58 string
ev-sweep_fees_log
fields: market base58 string, amount u64, receiver base58 string
ev-open_orders_position_log
fields: owner base58 string, openOrdersAccountNum u32, market base58 string, bidsBaseLots i64, bidsQuoteLots i64, asksBaseLots i64, baseFreeNative u64, quoteFreeNative u64, lockedMakerFees u64, referrerRebatesAvailable u64, makerVolume decimal string, takerVolume decimal string

Instruction tables

One table for each instruction in the IDL: the named accounts, then the arguments. Each row also has the context columns: slot, tx_index, signature, success, fee, program_id, ix_index, is_inner, inner_index, stack_height, accounts. What each one holds.

ix-create_market
accounts: market, marketAuthority, bids, asks, eventHeap, payer, marketBaseVault, marketQuoteVault, baseMint, quoteMint, systemProgram, tokenProgram, associatedTokenProgram, oracleA, oracleB, collectFeeAdmin, openOrdersAdmin, consumeEventsAdmin, closeMarketAdmin, eventAuthority, program
args: name string, oracleConfig JSON string, quoteLotSize i64, baseLotSize i64, makerFee i64, takerFee i64, timeExpiry i64
ix-close_market
accounts: closeMarketAdmin, market, bids, asks, eventHeap, solDestination, tokenProgram
ix-create_open_orders_indexer
accounts: payer, owner, openOrdersIndexer, systemProgram
ix-close_open_orders_indexer
accounts: owner, openOrdersIndexer, solDestination, tokenProgram
ix-create_open_orders_account
accounts: payer, owner, delegateAccount, openOrdersIndexer, openOrdersAccount, market, systemProgram
args: name string
ix-close_open_orders_account
accounts: owner, openOrdersIndexer, openOrdersAccount, solDestination, systemProgram
ix-place_order
accounts: signer, openOrdersAccount, openOrdersAdmin, userTokenAccount, market, bids, asks, eventHeap, marketVault, oracleA, oracleB, tokenProgram
args: args JSON string
ix-edit_order
accounts: signer, openOrdersAccount, openOrdersAdmin, userTokenAccount, market, bids, asks, eventHeap, marketVault, oracleA, oracleB, tokenProgram
args: clientOrderId u64, expectedCancelSize i64, placeOrder JSON string
ix-edit_order_pegged
accounts: signer, openOrdersAccount, openOrdersAdmin, userTokenAccount, market, bids, asks, eventHeap, marketVault, oracleA, oracleB, tokenProgram
args: clientOrderId u64, expectedCancelSize i64, placeOrder JSON string
ix-place_orders
accounts: signer, openOrdersAccount, openOrdersAdmin, userQuoteAccount, userBaseAccount, market, bids, asks, eventHeap, marketQuoteVault, marketBaseVault, oracleA, oracleB, tokenProgram
args: ordersType variant name, arg_bids JSON string, arg_asks JSON string, limit u8
ix-cancel_all_and_place_orders
accounts: signer, openOrdersAccount, openOrdersAdmin, userQuoteAccount, userBaseAccount, market, bids, asks, eventHeap, marketQuoteVault, marketBaseVault, oracleA, oracleB, tokenProgram
args: ordersType variant name, arg_bids JSON string, arg_asks JSON string, limit u8
ix-place_order_pegged
accounts: signer, openOrdersAccount, openOrdersAdmin, userTokenAccount, market, bids, asks, eventHeap, marketVault, oracleA, oracleB, tokenProgram
args: args JSON string
ix-place_take_order
accounts: signer, penaltyPayer, market, marketAuthority, bids, asks, marketBaseVault, marketQuoteVault, eventHeap, userBaseAccount, userQuoteAccount, oracleA, oracleB, tokenProgram, systemProgram, openOrdersAdmin
args: args JSON string
ix-consume_events
accounts: consumeEventsAdmin, market, eventHeap
args: limit u64
ix-consume_given_events
accounts: consumeEventsAdmin, market, eventHeap
args: slots JSON string
ix-cancel_order
accounts: signer, openOrdersAccount, market, bids, asks
args: orderId decimal string
ix-cancel_order_by_client_order_id
accounts: signer, openOrdersAccount, market, bids, asks
args: clientOrderId u64
ix-cancel_all_orders
accounts: signer, openOrdersAccount, market, bids, asks
args: sideOption variant name, limit u8
ix-deposit
accounts: owner, userBaseAccount, userQuoteAccount, openOrdersAccount, market, marketBaseVault, marketQuoteVault, tokenProgram
args: baseAmount u64, quoteAmount u64
ix-refill
accounts: owner, userBaseAccount, userQuoteAccount, openOrdersAccount, market, marketBaseVault, marketQuoteVault, tokenProgram
args: baseAmount u64, quoteAmount u64
ix-settle_funds
accounts: owner, penaltyPayer, openOrdersAccount, market, marketAuthority, marketBaseVault, marketQuoteVault, userBaseAccount, userQuoteAccount, referrerAccount, tokenProgram, systemProgram
ix-settle_funds_expired
accounts: closeMarketAdmin, owner, penaltyPayer, openOrdersAccount, market, marketAuthority, marketBaseVault, marketQuoteVault, userBaseAccount, userQuoteAccount, referrerAccount, tokenProgram, systemProgram
ix-sweep_fees
accounts: collectFeeAdmin, market, marketAuthority, marketQuoteVault, tokenReceiverAccount, tokenProgram
ix-set_delegate
accounts: owner, openOrdersAccount, delegateAccount
ix-set_market_expired
accounts: closeMarketAdmin, market
ix-prune_orders
accounts: closeMarketAdmin, openOrdersAccount, market, bids, asks
args: limit u8
ix-stub_oracle_create
accounts: payer, owner, oracle, mint, systemProgram
args: price f64
ix-stub_oracle_close
accounts: owner, oracle, solDestination, tokenProgram
ix-stub_oracle_set
accounts: owner, oracle
args: price f64

Files are split at 2 GB: ix-<name>-tNN-SSSS.parquet. Large integers stay exact: u128 is a decimal string. All decoded types.

Get OpenBook v2 data for your range.

Select an epoch range and get a firm price. You pay only when you send the job.

Get a price