Rust SDK#
The seesaw-sdk crate provides a full client SDK for interacting with the Seesaw binary prediction market protocol on Solana.
Installation#
Add to your Cargo.toml:
[dependencies]
seesaw-sdk = { path = "packages/sdk-rust" } # or git URL
solana-sdk = "2.2"
Quick Start#
use seesaw_sdk::constants::PROGRAM_ID;
use seesaw_sdk::pda::derive_market_pda;
use seesaw_sdk::instructions::{PlaceOrderAccounts, place_order};
use seesaw_sdk::types::{PlaceOrderParams, OrderSide, OrderType};
use seesaw_sdk::codecs::decode_market;
// 1. Derive a market PDA
let feed_id = [0xAB_u8; 32];
let (market_pda, _bump) = derive_market_pda(&feed_id, 900, 1, &creator, &PROGRAM_ID);
// 2. Decode a market account from raw bytes
let market = decode_market(&account_data)?;
println!("Market state: {:?}, outcome: {:?}", market.state, market.outcome);
// 3. Build a PlaceOrder instruction
let params = PlaceOrderParams {
side: OrderSide::BuyYes,
price_bps: 5000, // 50%
quantity: 100_000_000, // 100 USDC (6 decimals)
order_type: OrderType::Limit,
};
let accounts = PlaceOrderAccounts {
market: market_pda,
orderbook: orderbook_pda,
user_position: position_pda,
// ... all required accounts
};
let ix = place_order(&accounts, ¶ms, &PROGRAM_ID);
// Add ix to a transaction and send
API Reference#
PDA Derivation (seesaw_sdk::pda)#
| Function | Seeds | Returns |
|---|---|---|
derive_config_pda | ["seesaw", "config"] | (Pubkey, u8) |
derive_market_pda | ["seesaw", "market", feed_id, duration, market_id, creator] | (Pubkey, u8) |
derive_orderbook_pda | ["seesaw", "orderbook", market] | (Pubkey, u8) |
derive_vault_pda | ["seesaw", "vault", market] | (Pubkey, u8) |
derive_position_pda | ["seesaw", "position", market, user] | (Pubkey, u8) |
derive_asset_pda | ["seesaw", "asset", feed_id] | (Pubkey, u8) |
derive_yes_mint_pda | ["seesaw", "yes_mint", market] | (Pubkey, u8) |
derive_no_mint_pda | ["seesaw", "no_mint", market] | (Pubkey, u8) |
derive_yes_escrow_pda | ["seesaw", "escrow_yes", market] | (Pubkey, u8) |
derive_no_escrow_pda | ["seesaw", "escrow_no", market] | (Pubkey, u8) |
Instruction Builders (seesaw_sdk::instructions)#
All 16 on-chain instructions are supported:
| Function | Discriminator | Data Size |
|---|---|---|
initialize_config | 0x00 | 7 bytes |
create_market | 0x01 | 11 bytes |
snapshot_end | 0x02 | 1 byte |
resolve_market | 0x03 | 1 byte |
expire_market | 0x04 | 1 byte |
place_order | 0x05 | 13 bytes |
cancel_order | 0x06 | 9 bytes |
mint_shares | 0x07 | 9 bytes |
redeem | 0x08 | 10 bytes |
withdraw_shares | 0x09 | 10 bytes |
pause | 0x0A | 1 byte |
unpause | 0x0B | 1 byte |
update_fees | 0x0C | 7 bytes |
update_tick_size | 0x0D | 3 bytes |
force_close | 0x0E | 1 byte |
close_market | 0x0F | 1 byte |
Account Decoders (seesaw_sdk::codecs)#
| Function | Account Size | Returns |
|---|---|---|
decode_config | 256 bytes | Result<ConfigAccount, SdkError> |
decode_market | 512 bytes | Result<MarketAccount, SdkError> |
decode_orderbook | 10,240 bytes | Result<OrderbookAccount, SdkError> |
decode_position | 256 bytes | Result<UserPositionAccount, SdkError> |
decode_asset_state | 128 bytes | Result<AssetState, SdkError> |
Types (seesaw_sdk::types)#
Enums: MarketState, Outcome, OrderSide, OrderType, TokenType
Account structs: ConfigAccount, MarketAccount, OrderbookAccount, Order, UserPositionAccount, AssetState
Param structs: InitializeConfigParams, CreateMarketParams, PlaceOrderParams, CancelOrderParams, MintSharesParams, RedeemParams, WithdrawSharesParams, UpdateFeesParams, UpdateTickSizeParams
Error Codes (seesaw_sdk::errors)#
All 50+ on-chain error codes are available via SdkError. Use SdkError::try_from(code) to convert a u32 error code.
Cross-Language Validation#
The Rust SDK validates against the same golden test vectors used by the TypeScript and Python SDKs. Run:
cd packages/sdk-rust
cargo test