Command Reference#
All commands follow the pattern seesaw <group> <command> [options]. By default, output is JSON wrapped in a standard envelope. Use --human for human-readable output.
JSON Envelope Format#
Every JSON response uses this envelope:
{
"success": true,
"data": { ... },
"error": null,
"meta": {
"command": "market get",
"duration_ms": 142,
"slot": 312456789,
"signature": "5Uj..."
}
}
The slot and signature fields are present only for commands that submit transactions.
config#
Protocol configuration and CLI settings.
config get#
Fetch and decode the on-chain config account.
| Option | Description |
|---|---|
| (none) | Uses resolved RPC endpoint |
seesaw config get
{
"success": true,
"data": {
"address": "CfgXx...",
"authority": "Auth1...",
"treasuryRecipients": [
"TreasuryShard1...",
"TreasuryShard2...",
"TreasuryShard3...",
"TreasuryShard4...",
"TreasuryShard5...",
"TreasuryShard6...",
"TreasuryShard7...",
"TreasuryShard8..."
],
"defaultSettlementMint": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
"takerFeeBps": 30,
"tickSizeBps": 100,
"marketsCreated": 1547,
"version": 1,
"lastTreasuryUpdateAt": "2026-01-01T00:00:00.000Z"
},
"error": null,
"meta": { "command": "config get", "duration_ms": 89 }
}
config init-file#
Create default config file at ~/.seesaw/config.yaml.
| Option | Description |
|---|---|
| (none) | Creates config with default values |
seesaw config init-file
{
"success": true,
"data": {
"path": "/Users/you/.seesaw/config.yaml"
},
"error": null,
"meta": { "command": "config init-file", "duration_ms": 2 }
}
config show#
Show current resolved configuration (file + env + flags merged).
| Option | Description |
|---|---|
| (none) | Displays merged config |
seesaw config show
{
"success": true,
"data": {
"rpc_url": "https://api.mainnet-beta.solana.com",
"keypair": "/Users/you/.config/solana/id.json",
"api_url": "https://api.seesaw.markets",
"output": "json",
"config_file": "/Users/you/.seesaw/config.yaml"
},
"error": null,
"meta": { "command": "config show", "duration_ms": 1 }
}
market#
Market lifecycle commands.
market get#
Fetch and decode a market account, including orderbook summary.
| Option | Description |
|---|---|
<address> | Market account address (positional argument) |
seesaw market get Mkt1abc123def456ghi789jkl012mno345pqr678stu
{
"success": true,
"data": {
"address": "Mkt1abc123def456ghi789jkl012mno345pqr678stu",
"marketId": "112640",
"state": "TRADING",
"outcome": "NONE",
"pythFeedId": "ef0d8b6f...",
"tStart": "2026-03-04T12:00:00.000Z",
"tEnd": "2026-03-04T12:15:00.000Z",
"startPrice": "14250000000",
"endPrice": "0",
"totalYesShares": "5000000",
"totalNoShares": "5000000",
"totalCollateral": "5000000",
"totalVolume": "12000000",
"totalTrades": 24,
"totalPositions": 8,
"creator": "Cre8or...",
"orderbook": {
"bestBid": 4800,
"bestAsk": 5200,
"spread": 400,
"bidLevels": 3,
"askLevels": 4
}
},
"error": null,
"meta": { "command": "market get", "duration_ms": 156 }
}
market create#
Create a new prediction market. For the difference between push and pull oracle modes see Oracle.
| Option | Required | Description |
|---|---|---|
--pyth-feed <address> | Yes | Push: Receiver-owned Pyth push-feed account. Pull: Receiver-owned PriceUpdateV2 account supplied for the create snapshot. |
--pyth-feed-id <hex> | Yes | Pyth feed ID (32 bytes hex). This identifies the asset and is not a Solana account. |
--settlement-mint <address> | Yes | Settlement token mint address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
--max-confidence-ratio <bps> | No | Max confidence ratio in basis points (default: 0) |
--capacity <tier> | No | Capacity tier: small (128, default), standard (1025), large (4097), max (8321) |
--seats <count> | No | Advanced: exact seat count from the on-chain table (128, 1025, 1153, 2049, 2177, 4097, 4225, 8193, 8321). Mutually exclusive with --capacity. |
--oracle-mode <mode> | No | Oracle mode: push (default, classic Pyth push-oracle) or pull (Pyth pull-oracle; requires pyth_receiver_program_id set in config). |
seesaw market create \
--pyth-feed Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--duration 900 \
--oracle-mode push
For Pull creation, pass --oracle-mode pull and a Receiver-owned
PriceUpdateV2 account for --pyth-feed. Fetching/posting arbitrary Pull
updates requires a server-side Hermes relay configured with PYTH_API_KEY.
{
"success": true,
"data": {
"market": "Mkt1abc...",
"orderbook": "OB1abc...",
"vault": "Vlt1abc...",
"marketId": "112640"
},
"error": null,
"meta": {
"command": "market create",
"duration_ms": 1250,
"signature": "5UjR4w...",
"slot": 312456789
}
}
Capacity controls how many distinct traders the market can hold. The CLI auto-bundles the required
EnsureTraderLedgerSpaceprelude (0x2E) beforeCreateMarket, so larger tiers simply produce more prelude instructions. Ledger rent is refunded to the creator when the market is closed.
market snapshot#
Record end price snapshot from the Pyth oracle.
| Option | Required | Description |
|---|---|---|
--market-id <id> | Yes | Market epoch ID |
--pyth-feed <address> | Yes | Pyth price feed account |
--pyth-feed-id <hex> | Yes | Pyth feed ID (32 bytes hex) |
--creator <address> | Yes | Market creator address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
seesaw market snapshot \
--market-id 112640 \
--pyth-feed Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv
{
"success": true,
"data": {
"market": "Mkt1abc..."
},
"error": null,
"meta": {
"command": "market snapshot",
"duration_ms": 980,
"signature": "3kPq1x...",
"slot": 312456800
}
}
market resolve#
Resolve market outcome from price snapshots.
| Option | Required | Description |
|---|---|---|
--market-id <id> | Yes | Market epoch ID |
--pyth-feed-id <hex> | Yes | Pyth feed ID (32 bytes hex) |
--creator <address> | Yes | Market creator address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
seesaw market resolve \
--market-id 112640 \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv
{
"success": true,
"data": {
"market": "Mkt1abc..."
},
"error": null,
"meta": {
"command": "market resolve",
"duration_ms": 870,
"signature": "2yNm8v...",
"slot": 312456810
}
}
market expire#
Expire a market if no resolution occurs within the expiration grace window
after market end (protocol default: 7 days; configurable via
admin operational-params). For the full expiration timeline and teardown
sequence see Settlement.
| Option | Required | Description |
|---|---|---|
--market-id <id> | Yes | Market epoch ID |
--pyth-feed-id <hex> | Yes | Pyth feed ID (32 bytes hex) |
--creator <address> | Yes | Market creator address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
seesaw market expire \
--market-id 112640 \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv
{
"success": true,
"data": {
"market": "Mkt1abc..."
},
"error": null,
"meta": {
"command": "market expire",
"duration_ms": 910,
"signature": "4fRt2p...",
"slot": 312456820
}
}
market force-close#
Force-close a position on a resolved or expired market. This is a permissionless operation that anyone can call to settle a position and reclaim associated account rent.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--position-owner <address> | Yes | Position owner address |
--user-stablecoin-ata <address> | Yes | Position owner's USDT token account |
--settlement-mint <address> | Yes | Settlement mint address |
seesaw market force-close \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--position-owner User1abc123def456ghi789jkl012mno345pqr678s \
--user-stablecoin-ata ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{
"success": true,
"data": {
"market": "Mkt1abc...",
"position": "Pos1abc...",
"vault": "Vlt1abc..."
},
"error": null,
"meta": {
"command": "market force-close",
"duration_ms": 1100,
"signature": "7hYt3q...",
"slot": 312456830
}
}
market close#
Close a market account and reclaim rent to the creator. All positions must be settled first.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--creator <address> | Yes | Market creator address |
seesaw market close \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv
{
"success": true,
"data": {
"market": "Mkt1abc..."
},
"error": null,
"meta": {
"command": "market close",
"duration_ms": 850,
"signature": "9pWx4r...",
"slot": 312456840
}
}
market claim-creator-fees#
Claim deferred creator fees from a resolved or expired market. Use this when resolve_market / expire_market could not disburse fees inline (e.g., the creator's ATA was missing or frozen). Permissionless — anyone can call it, but the fees always go to the market creator.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--creator-ata <address> | Yes | Creator's token account for the settle mint |
--settlement-mint <address> | Yes | Settlement mint address |
seesaw market claim-creator-fees \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--creator-ata CreatorAtaAddr123456789abcdefghijklmnopqrs \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{
"success": true,
"data": { "market": "Mkt1abc…", "vault": "Vlt1abc…" },
"error": null,
"meta": {
"command": "market claim-creator-fees",
"duration_ms": 830,
"signature": "9xYa4k…",
"slot": 312456900
}
}
order#
Order management commands. The CLI exposes single-order trading, quote free-funds custody, bulk/range cancel and reduce, and post-only maker ladders.
order place#
Place a limit order on the order book.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--side <side> | Yes | Order side: buy-yes, sell-yes, buy-no, sell-no |
--price <bps> | Yes | Price in basis points [1-9999] |
--quantity <amount> | Yes | Number of shares (in base units) |
--token-account <address> | Yes | User's settlement token account |
--treasury-token-account <address> | Yes | Protocol treasury token account matching --protocol-treasury-index |
--settlement-mint <address> | Yes | Settlement mint address |
--user-yes-ata <address> | Yes | User's YES mint token account |
--user-no-ata <address> | Yes | User's NO mint token account |
--order-type <type> | No | Order type: limit, post-only, ioc (default: limit) |
--protocol-treasury-index <n> | No | Protocol treasury shard index [0-7] (default: 0) |
--referrer <addr> | No | Attribute the trade to the given Solana referrer address |
--referrer-treasury-index <n> | Required with --referrer | Referrer earnings treasury shard |
seesaw order place \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--side buy-yes \
--price 5000 \
--quantity 1000000 \
--token-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--treasury-token-account TreasuryShard111111111111111111111111111 \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--user-yes-ata YesATA1abc123def456ghi789jkl012mno345pqr6 \
--user-no-ata NoATA1abc123def456ghi789jkl012mno345pqr67
{
"success": true,
"data": {
"market": "Mkt1abc...",
"orderbook": "OB1abc...",
"position": "Pos1abc..."
},
"error": null,
"meta": {
"command": "order place",
"duration_ms": 1050,
"signature": "6nKm5s...",
"slot": 312456850
}
}
order cancel#
Cancel an existing order.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--order-id <id> | Yes | Order ID to cancel |
--token-account <address> | Yes | User's settlement token account |
--settlement-mint <addr> | Yes | Settlement mint |
--user-yes-ata <address> | Yes | User's YES token account |
--user-no-ata <address> | Yes | User's NO token account |
seesaw order cancel \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--order-id 42 \
--token-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--user-yes-ata YesATA1abc123def456ghi789jkl012mno345pqr6 \
--user-no-ata NoATA1abc123def456ghi789jkl012mno345pqr67
{
"success": true,
"data": {
"market": "Mkt1abc...",
"orderbook": "OB1abc...",
"position": "Pos1abc...",
"cancelledOrderId": "42"
},
"error": null,
"meta": {
"command": "order cancel",
"duration_ms": 920,
"signature": "8wLp6t...",
"slot": 312456860
}
}
order deposit-funds#
Deposit quote free funds into the market trader ledger. These funds can be used by free-funds order-management variants.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--user-stablecoin-ata <addr> | Yes | User's settlement token account |
--settlement-mint <address> | Yes | Settlement mint |
--amount <u64> | Yes | Amount in settlement-mint base units |
seesaw order deposit-funds \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--user-stablecoin-ata ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--amount 1000000
order withdraw-funds#
Withdraw quote free funds from the market trader ledger.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--user-stablecoin-ata <addr> | Yes | User's settlement token account |
--settlement-mint <address> | Yes | Settlement mint |
--amount <u64> | Yes | Amount in settlement-mint base units |
seesaw order withdraw-funds \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--user-stablecoin-ata ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--amount 1000000
order cancel-multi#
Cancel multiple orders by ID. Add --free-funds to use the lean with-free-funds account set.
seesaw order cancel-multi \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--order-ids 42,43,44 \
--free-funds
Without --free-funds, also pass --token-account, --settlement-mint, --user-yes-ata, and --user-no-ata.
order cancel-all#
Cancel every active order for the configured wallet in a market.
seesaw order cancel-all \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--free-funds
Without --free-funds, also pass --token-account, --settlement-mint, --user-yes-ata, and --user-no-ata.
order cancel-up-to#
Cancel orders up to a canonical side, tick, and count limit.
seesaw order cancel-up-to \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--side bid \
--tick-limit-bps 4900 \
--max-orders 8 \
--free-funds
order reduce#
Reduce an active order's remaining quantity.
seesaw order reduce \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--order-id 42 \
--reduce-qty 100000 \
--free-funds
order place-ladder#
Place multiple post-only bid and ask levels in one maker instruction. Each level is priceBps:quantity.
seesaw order place-ladder \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--bids 4900:100000,4800:200000 \
--asks 5100:100000,5200:200000 \
--token-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--treasury-token-account TreasuryShard111111111111111111111111111 \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--user-yes-ata YesATA1abc123def456ghi789jkl012mno345pqr6 \
--user-no-ata NoATA1abc123def456ghi789jkl012mno345pqr67 \
--reject-post-only-on-cross 1 \
--protocol-treasury-index 3
order list#
List orders on a market's order book. Optionally filter by owner.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--owner <address> | No | Filter by owner address |
# List aggregated orderbook
seesaw order list --market Mkt1abc123def456ghi789jkl012mno345pqr678stu
# List orders for a specific owner
seesaw order list \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--owner User1abc123def456ghi789jkl012mno345pqr678s
Aggregated orderbook output:
{
"success": true,
"data": {
"bids": [
{ "price": 4800, "quantity": "500000", "orders": 3 },
{ "price": 4700, "quantity": "250000", "orders": 1 }
],
"asks": [
{ "price": 5200, "quantity": "300000", "orders": 2 },
{ "price": 5500, "quantity": "1000000", "orders": 5 }
]
},
"error": null,
"meta": { "command": "order list", "duration_ms": 120 }
}
Filtered by owner:
{
"success": true,
"data": [
{
"orderId": "42",
"owner": "User1abc...",
"priceBps": 4800,
"quantity": "100000",
"originalQuantity": "200000",
"side": 0,
"isActive": true
}
],
"error": null,
"meta": { "command": "order list", "duration_ms": 115 }
}
order reclaim-expired#
Permissionlessly reclaim an expired resting order. If --caller-stablecoin-ata is provided, the caller can collect the configured bounty.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--maker <address> | Yes | Original order owner, not necessarily the caller |
--maker-token-account <address> | Yes | Maker's settlement token account |
--maker-yes-ata <address> | Yes | Maker's YES share token account |
--maker-no-ata <address> | Yes | Maker's NO share token account |
--settlement-mint <address> | Yes | Settlement mint |
--order-id <u64> | Yes | Order ID to reclaim |
--caller-stablecoin-ata <addr> | No | Caller token account for the optional bounty |
seesaw order reclaim-expired \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--maker Maker1abc123def456ghi789jkl012mno345pqr67 \
--maker-token-account MakerStableAta123456789abcdefghijk \
--maker-yes-ata MakerYesAta123456789abcdefghijklmnop \
--maker-no-ata MakerNoAta123456789abcdefghijklmnopq \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--order-id 42 \
--caller-stablecoin-ata CallerStableAta123456789abcdefghi
position#
Position management commands.
position get#
Fetch and decode a position account.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--user <address> | No | User address (defaults to wallet) |
seesaw position get --market Mkt1abc123def456ghi789jkl012mno345pqr678stu
{
"success": true,
"data": {
"address": "Pos1abc...",
"market": "Mkt1abc...",
"owner": "User1abc...",
"yesShares": "500000",
"noShares": "0",
"lockedYesShares": "100000",
"lockedNoShares": "0",
"collateralDeposited": "500000",
"collateralLocked": "100000",
"payout": "0",
"totalBought": "500000",
"totalSold": "0",
"totalFeesPaid": "10000",
"orderCount": 2,
"settled": false
},
"error": null,
"meta": { "command": "position get", "duration_ms": 98 }
}
position mint#
Mint YES/NO share pairs by depositing settlement tokens (USDT).
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--amount <lamports> | Yes | Amount in base units |
--stablecoin-account <address> | Yes | User's settlement token account |
--yes-account <address> | Yes | User's YES mint token account |
--no-account <address> | Yes | User's NO mint token account |
--settlement-mint <address> | Yes | Settlement mint address |
seesaw position mint \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--amount 1000000 \
--stablecoin-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--yes-account YesATA1abc123def456ghi789jkl012mno345pqr6 \
--no-account NoATA1abc123def456ghi789jkl012mno345pqr67 \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{
"success": true,
"data": {
"market": "Mkt1abc...",
"position": "Pos1abc...",
"amount": "1000000"
},
"error": null,
"meta": {
"command": "position mint",
"duration_ms": 1080,
"signature": "4rNx7u...",
"slot": 312456870
}
}
position redeem#
Redeem winning shares for settlement tokens after market resolution.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--amount <lamports> | Yes | Amount to redeem in base units |
--token-type <type> | Yes | Token type: yes or no |
--stablecoin-account <address> | Yes | User's settlement token account |
--yes-account <address> | Yes | User's YES mint token account |
--no-account <address> | Yes | User's NO mint token account |
--settlement-mint <address> | Yes | Settlement mint address |
seesaw position redeem \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--amount 500000 \
--token-type yes \
--stablecoin-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--yes-account YesATA1abc123def456ghi789jkl012mno345pqr6 \
--no-account NoATA1abc123def456ghi789jkl012mno345pqr67 \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{
"success": true,
"data": {
"market": "Mkt1abc...",
"position": "Pos1abc...",
"amount": "500000",
"tokenType": "yes"
},
"error": null,
"meta": {
"command": "position redeem",
"duration_ms": 1020,
"signature": "1mTy8v...",
"slot": 312456880
}
}
position withdraw#
Withdraw trader-ledger free YES/NO share credits as SPL tokens.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--amount <lamports> | Yes | Amount to withdraw in base units |
--token-type <type> | Yes | Token type: yes or no |
--mint <address> | Yes | YES or NO mint address for the given type |
--token-account <address> | Yes | User's token account for the withdrawn type |
seesaw position withdraw \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--amount 200000 \
--token-type yes \
--mint YesMint1abc123def456ghi789jkl012mno345pqr6 \
--token-account YesATA1abc123def456ghi789jkl012mno345pqr678
{
"success": true,
"data": {
"market": "Mkt1abc...",
"position": "Pos1abc...",
"amount": "200000",
"tokenType": "yes"
},
"error": null,
"meta": {
"command": "position withdraw",
"duration_ms": 990,
"signature": "5kHz9w...",
"slot": 312456890
}
}
position mark-settled#
Permissionlessly settle and pay an abandoned resolved position after the post-grace window.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--owner <address> | Yes | Recorded position owner |
--owner-settlement-ata <addr> | Yes | Owner's settlement-token payout account |
--settlement-mint <address> | Yes | Settlement mint for the TransferChecked CPI |
seesaw position mark-settled \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--owner User1abc123def456ghi789jkl012mno345pqr678s \
--owner-settlement-ata UserStableAta123456789abcdefghijkl \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
position close#
Permissionlessly close a settled position account. Rent is returned to the recorded position owner, not the caller.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--owner <address> | Yes | Position owner and rent receiver |
seesaw position close \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--owner User1abc123def456ghi789jkl012mno345pqr678s
admin#
Protocol admin commands. These require the protocol authority keypair.
admin init#
Initialize protocol configuration. This is a one-time operation. The current multi-fee-recipient layout requires all 8 protocol treasury token accounts up front, encoded as a JSON array in shard order.
| Option | Required | Description |
|---|---|---|
--treasury-recipients <json> | Yes | JSON array of exactly 8 SPL token-account addresses |
--settlement-mint <address> | Yes | Default settlement mint address |
--program-data <address> | Yes | BPF upgradeable loader program-data account |
--taker-fee <bps> | No | Legacy display taker fee field (default: 30) |
--tick-size <bps> | No | Tick size in basis points (default: 100) |
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
seesaw admin init \
--treasury-recipients '[
"TreasuryShard111111111111111111111111111",
"TreasuryShard222222222222222222222222222",
"TreasuryShard333333333333333333333333333",
"TreasuryShard444444444444444444444444444",
"TreasuryShard555555555555555555555555555",
"TreasuryShard666666666666666666666666666",
"TreasuryShard777777777777777777777777777",
"TreasuryShard888888888888888888888888888"
]' \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--program-data ProgramDataAddr123456789abcdefghijklmnop
{
"success": true,
"data": {
"config": "CfgXx..."
},
"error": null,
"meta": {
"command": "admin init",
"duration_ms": 1200,
"signature": "2bGk0x...",
"slot": 312456900
}
}
admin pause#
Pause all protocol trading activity. No new orders or markets can be created while paused.
| Option | Description |
|---|---|
| (none) | Uses authority keypair |
seesaw admin pause
{
"success": true,
"data": {
"config": "CfgXx...",
"paused": true
},
"error": null,
"meta": {
"command": "admin pause",
"duration_ms": 890,
"signature": "3cHl1y...",
"slot": 312456910
}
}
admin unpause#
Resume protocol trading activity.
| Option | Description |
|---|---|
| (none) | Uses authority keypair |
seesaw admin unpause
{
"success": true,
"data": {
"config": "CfgXx...",
"paused": false
},
"error": null,
"meta": {
"command": "admin unpause",
"duration_ms": 870,
"signature": "4dIm2z...",
"slot": 312456920
}
}
admin update-fee-config#
Retune the capped-linear-decay curve and the three-way split (instruction 0x1F UpdateFeeConfig). The three shares are bps of the fee and MUST sum to 10_000. --fee-cap is bounded at 500 (5.00% hard ceiling). For the full fee model and split rationale see Treasury and fee split.
| Option | Required | Description |
|---|---|---|
--fee-cap <bps> | Yes | Curve ceiling in bps of notional (max 500) |
--decay-rate <bps> | Yes | Curve slope in bps of notional |
--protocol-share <bps> | Yes | Protocol share in bps of fee |
--creator-share <bps> | Yes | Creator share in bps of fee |
--referral-share <bps> | Yes | Referral share in bps of fee |
seesaw admin update-fee-config \
--fee-cap 200 \
--decay-rate 600 \
--protocol-share 5000 \
--creator-share 1000 \
--referral-share 4000
{
"success": true,
"data": {
"config": "CfgXx...",
"feeCapBps": 200,
"decayRateBps": 600,
"protocolFeeBps": 5000,
"defaultCreatorFeeBps": 1000,
"referralShareBpsOfFee": 4000
},
"error": null,
"meta": {
"command": "admin update-fee-config",
"duration_ms": 910,
"signature": "5eJn3a...",
"slot": 312456930
}
}
admin update-tick-size#
Update the order book tick size (minimum price increment).
| Option | Required | Description |
|---|---|---|
--tick-size <bps> | Yes | New tick size in basis points (1-1000) |
seesaw admin update-tick-size --tick-size 50
{
"success": true,
"data": {
"config": "CfgXx...",
"tickSizeBps": 50
},
"error": null,
"meta": {
"command": "admin update-tick-size",
"duration_ms": 880,
"signature": "6fKo4b...",
"slot": 312456940
}
}
admin update-treasury-recipients#
Atomically rotate all 8 protocol treasury recipient token accounts. Pass the full array: to replace one slot, keep the other 7 addresses unchanged. The on-chain instruction is authority-signed and rate-limited.
| Option | Required | Description |
|---|---|---|
--treasury-recipients <json> | Yes | JSON array of exactly 8 SPL token-account addresses |
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
seesaw admin update-treasury-recipients \
--treasury-recipients '[
"TreasuryShard111111111111111111111111111",
"TreasuryShard222222222222222222222222222",
"TreasuryShard333333333333333333333333333",
"TreasuryShard444444444444444444444444444",
"TreasuryShard555555555555555555555555555",
"TreasuryShard666666666666666666666666666",
"TreasuryShard777777777777777777777777777",
"TreasuryShard888888888888888888888888888"
]'
admin update-min-resting-notional#
Update the minimum quote notional required for a resting remainder.
| Option | Required | Description |
|---|---|---|
--min-resting-notional <u64> | Yes | New floor in settlement-token units |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin update-min-resting-notional --min-resting-notional 1000000
admin update-market-cap#
Update a market's YES/NO supply cap. This is accepted from the market creator or protocol authority on-chain.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--max-total-shares <u64> | Yes | Zero disables the cap |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin update-market-cap \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--max-total-shares 1000000000
admin set-market-emergency-status#
Set a single market's emergency status without changing global protocol pause state.
| Option | Required | Description |
| -------------------- | -------- | -------------------------------- | --- | --- | ------------------------------------------------------- |
| --market <address> | Yes | Market PDA |
| --status <0 | 1 | 2 | 3> | Yes | 0=None, 1=PostOnly, 2=Paused, 3=ForceCancelOnly |
| --reason <utf8> | No | Operator-visible reason tag |
| -y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin set-market-emergency-status \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--status 3 \
--reason incident-2026-05-22
admin force-cancel-market-orders#
Force-cancel one resting order while the market is in ForceCancelOnly mode.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--maker <address> | Yes | Original order owner |
--maker-token-account <address> | Yes | Maker's settlement token account |
--maker-yes-ata <address> | Yes | Maker's YES share token account |
--maker-no-ata <address> | Yes | Maker's NO share token account |
--settlement-mint <address> | Yes | Settlement mint |
--order-id <u64> | Yes | Resting order to force-cancel |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin force-cancel-market-orders \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--maker Maker1abc123def456ghi789jkl012mno345pqr67 \
--maker-token-account MakerStableAta123456789abcdefghijk \
--maker-yes-ata MakerYesAta123456789abcdefghijklmnop \
--maker-no-ata MakerNoAta123456789abcdefghijklmnopq \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--order-id 42
admin operational-params#
Tune the post-deploy operational bounds exposed by UpdateOperationalParams.
| Option | Required | Description |
|---|---|---|
--closer-reward-lamports <u64> | Yes | Lifecycle closer reward, zero disables the bounty |
--max-price-staleness-seconds <u64> | Yes | Maximum oracle price age, zero selects protocol default |
--market-expiration-window-seconds <u64> | Yes | Expiration grace window, zero selects protocol default |
--min-market-duration-seconds <u64> | Yes | Minimum market duration, zero selects protocol default |
--max-market-duration-seconds <u64> | Yes | Maximum market duration, zero selects protocol default |
--max-order-size <u64> | Yes | Maximum order size; must be nonzero |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin operational-params \
--closer-reward-lamports 1000000 \
--max-price-staleness-seconds 60 \
--market-expiration-window-seconds 86400 \
--min-market-duration-seconds 60 \
--max-market-duration-seconds 604800 \
--max-order-size 1000000000
admin propose-pyth-program#
Stage a Pyth program-id swap under a mandatory 48-hour timelock (ProposePythProgramId, 0x30). Pass --cancel to abort any pending swap instead of staging a new one. See Oracle for the Pyth program upgrade context and the 2026-07-31 cutover details.
| Option | Required | Description |
|---|---|---|
--program-id <base58> | No* | New Pyth program-id as a base58 pubkey. Mutually exclusive with --cancel. |
--cancel | No* | Cancel the pending swap (sends [0;32] as new_pyth_program_id). Mutually exclusive with --program-id. |
--target <slot> | No | Which oracle program slot to update: push (default, config.pyth_program_id) or receiver (config.pyth_receiver_program_id for the pull-oracle path). |
-y, --yes | No | Skip mainnet confirmation prompt |
* Exactly one of --program-id or --cancel is required.
# Stage a new Pyth program-id (48-hour timelock begins)
seesaw admin propose-pyth-program \
--program-id pyt2F414BA6dPttK6RddPZUdHfapoBN24GL5wbrPCou
# Cancel an in-progress swap
seesaw admin propose-pyth-program --cancel
{
"success": true,
"data": {
"config": "CfgXx...",
"programId": "pyt2F414BA6dPttK6RddPZUdHfapoBN24GL5wbrPCou",
"cancelled": false
},
"error": null,
"meta": {
"command": "admin propose-pyth-program",
"duration_ms": 890,
"signature": "3xKp9m...",
"slot": 312457100
}
}
admin apply-pyth-program#
Promote a staged Pyth program-id swap after the 48-hour timelock has elapsed (ApplyPythProgramId, 0x31). Fails with NoPendingOracleUpdate if no swap is staged, or OracleTimelockNotElapsed if the timelock has not yet passed.
| Option | Required | Description |
|---|---|---|
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin apply-pyth-program
{
"success": true,
"data": {
"config": "CfgXx..."
},
"error": null,
"meta": {
"command": "admin apply-pyth-program",
"duration_ms": 870,
"signature": "7mRt2n...",
"slot": 312457820
}
}
admin update-market-defaults#
Update config.taker_fee_bps (UpdateMarketDefaults, 0x32). Settlement-mint rotation is disabled after initialization because it is coupled to protocol treasury recipients and referrer treasury state.
| Option | Required | Description |
|---|---|---|
--settlement-mint <base58> | No | Unsupported; rejected client-side until a future migration instruction exists. |
--taker-fee-bps <u16> | Yes | New taker fee in basis points (0–MAX_TAKER_FEE_BPS). Cannot be 65535 (sentinel). |
-y, --yes | No | Skip mainnet confirmation prompt |
# Update the taker fee
seesaw admin update-market-defaults --taker-fee-bps 20
{
"success": true,
"data": {
"config": "CfgXx...",
"takerFeeBps": 20
},
"error": null,
"meta": {
"command": "admin update-market-defaults",
"duration_ms": 920,
"signature": "9pXz5k...",
"slot": 312457950
}
}
api#
Indexer API commands. These query the Seesaw indexer for aggregated protocol data. No keypair is required for public endpoints.
api markets#
List all markets from the indexer.
| Option | Description |
|---|---|
| (none) | Fetches all markets |
seesaw api markets
{
"success": true,
"data": [
{
"id": "Mkt1abc...",
"pair": "SOL/USD",
"state": "TRADING",
"yesPrice": 0.52,
"noPrice": 0.48,
"volume": 15200.5,
"timeRemaining": "8m 32s"
}
],
"error": null,
"meta": { "command": "api markets", "duration_ms": 210 }
}
api market#
Get detailed market info from the indexer.
| Option | Description |
|---|---|
<id> | Market ID (positional argument) |
seesaw api market Mkt1abc123def456ghi789jkl012mno345pqr678stu
{
"success": true,
"data": {
"id": "Mkt1abc...",
"pair": "SOL/USD",
"state": "TRADING",
"startPrice": 142.5,
"currentPrice": 143.1,
"yesPrice": 0.62,
"noPrice": 0.38,
"volume": 15200.5,
"totalTrades": 48,
"totalPositions": 12,
"timeRemaining": "8m 32s",
"createdAt": "2026-03-04T12:00:00.000Z"
},
"error": null,
"meta": { "command": "api market", "duration_ms": 180 }
}
api leaderboard#
Get the leaderboard from the indexer.
| Option | Required | Description |
|---|---|---|
--period <period> | No | Time period: daily, weekly, monthly, all_time (default: weekly) |
--metric <metric> | No | Sort metric: pnl, volume, winRate, trades (default: pnl) |
seesaw api leaderboard --period weekly --metric pnl
{
"success": true,
"data": [
{
"rank": 1,
"address": "Top1abc...",
"stats": {
"totalPnl": 4250.0,
"winRate": 0.72,
"totalTrades": 156,
"totalVolume": 52000.0
}
}
],
"error": null,
"meta": { "command": "api leaderboard", "duration_ms": 195 }
}
api stats#
Get protocol-wide statistics from the indexer.
| Option | Description |
|---|---|
| (none) | Fetches global protocol stats |
seesaw api stats
{
"success": true,
"data": {
"totalMarkets": 15470,
"totalVolume": 2450000.0,
"totalTrades": 89200,
"activeMarkets": 12,
"totalUsers": 3400
},
"error": null,
"meta": { "command": "api stats", "duration_ms": 150 }
}
api stats-personal#
Get personal trading statistics. Requires authentication.
| Option | Required | Description |
|---|---|---|
--token <jwt> | No | Auth token (or set SEESAW_API_TOKEN env var) |
seesaw api stats-personal --token eyJhbGci...
{
"success": true,
"data": {
"totalPnl": 1250.0,
"winRate": 0.65,
"totalTrades": 42,
"totalVolume": 8500.0,
"marketsParticipated": 28
},
"error": null,
"meta": { "command": "api stats-personal", "duration_ms": 175 }
}
api achievements#
Get user achievements. Requires authentication.
| Option | Required | Description |
|---|---|---|
--token <jwt> | No | Auth token (or set SEESAW_API_TOKEN env var) |
seesaw api achievements --token eyJhbGci...
{
"success": true,
"data": [
{
"id": "first_trade",
"name": "First Trade",
"description": "Place your first order",
"unlockedAt": "2026-02-15T09:30:00.000Z"
},
{
"id": "winning_streak_5",
"name": "Hot Streak",
"description": "Win 5 markets in a row",
"unlockedAt": null
}
],
"error": null,
"meta": { "command": "api achievements", "duration_ms": 160 }
}
api compliance-check#
Run a compliance check on a wallet address. Requires authentication.
| Option | Required | Description |
|---|---|---|
--address <address> | Yes | Wallet address to check |
--token <jwt> | No | Auth token (or set SEESAW_API_TOKEN env var) |
seesaw api compliance-check \
--address User1abc123def456ghi789jkl012mno345pqr678s \
--token eyJhbGci...
{
"success": true,
"data": {
"address": "User1abc...",
"compliant": true,
"restricted": false,
"checkedAt": "2026-03-04T12:05:00.000Z"
},
"error": null,
"meta": { "command": "api compliance-check", "duration_ms": 320 }
}
fee#
Fee-model and referral commands. The old referral command group was folded into fee; use these names in scripts and runbooks.
fee preview#
Preview the capped-linear-decay fee and current default split locally without RPC.
| Option | Required | Description |
|---|---|---|
--price-bps <n> | Yes | Canonical YES price in bps, 0 through 10000 |
--notional <base> | Yes | Trade notional in settlement-token base units |
--cap-bps <n> | No | Fee cap bps, default 200 |
--decay-bps <n> | No | Decay-rate bps, default 600 |
seesaw fee preview --price-bps 5000 --notional 1000000
fee init-referral-account#
Initialize the signer's ReferrerEarningsAccount PDA and bind it to a stable treasury shard index.
| Option | Required | Description |
|---|---|---|
--treasury-index <n> | Yes | Treasury shard index, 0 through 7 |
--mint <address> | Yes | Settlement mint |
seesaw fee init-referral-account \
--treasury-index 3 \
--mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
fee claim-referral#
Claim accumulated referral earnings to the signer's settlement-token account.
| Option | Required | Description |
|---|---|---|
--ata <address> | Yes | Referrer's settlement-token account |
--mint <address> | Yes | Settlement mint |
--treasury-index <n> | Yes | Shard index stored on the ReferrerEarningsAccount |
seesaw fee claim-referral \
--ata ReferrerStableAta123456789abcdefghijkl \
--mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \
--treasury-index 3
fee set-referrer#
Set the signer's immutable first-touch referrer. The CLI rejects self-referral before building the transaction.
| Option | Required | Description |
|---|---|---|
--referrer <address> | Yes | Referrer wallet address, must not self |
seesaw fee set-referrer --referrer RefAddr123456789abcdefghijklmnopqrstuvwxyz
treasury#
Treasury shard operations for the multi-fee-recipient layout.
treasury list#
Show the 8 protocol treasury token accounts from config plus the 8 referrer treasury PDAs and their token balances.
| Option | Description |
|---|---|
| (none) | Uses resolved RPC URL |
seesaw treasury list
treasury update-recipients#
Atomically replace config.treasuryRecipients with 8 new SPL token-account addresses. This is equivalent to admin update-treasury-recipients with a shorter flag name.
| Option | Required | Description |
|---|---|---|
--recipients <json> | Yes | JSON array of exactly 8 SPL token-account addresses |
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
seesaw treasury update-recipients \
--recipients '[
"TreasuryShard111111111111111111111111111",
"TreasuryShard222222222222222222222222222",
"TreasuryShard333333333333333333333333333",
"TreasuryShard444444444444444444444444444",
"TreasuryShard555555555555555555555555555",
"TreasuryShard666666666666666666666666666",
"TreasuryShard777777777777777777777777777",
"TreasuryShard888888888888888888888888888"
]'
creator#
Creator-market and creator-fee commands.
creator list#
List markets created by the configured wallet, including accumulated and currently claimable creator fees.
| Option | Description |
|---|---|
| (none) | Uses resolved API URL |
seesaw creator list
creator claim#
Claim deferred creator fees for one market.
| Option | Required | Description |
|---|---|---|
<marketAddress> | Yes | Market address positional argument |
--creator-ata <address> | Yes | Creator's token account for the settlement mint |
--settlement-mint <address> | Yes | Settlement mint |
seesaw creator claim Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--creator-ata CreatorAtaAddr123456789abcdefghijklmnopqrs \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
creator claim-all#
Claim creator fees from every claimable market returned by the indexer, split into bounded batches.
| Option | Required | Description |
|---|---|---|
--creator-ata <address> | Yes | Creator's token account for the settlement mint |
--settlement-mint <address> | Yes | Settlement mint |
--max-per-tx <n> | No | Maximum claim instructions per batch, default 5 |
seesaw creator claim-all \
--creator-ata CreatorAtaAddr123456789abcdefghijklmnopqrs \
--settlement-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
widget#
Partner embed tooling. These commands do not submit Solana transactions.
widget snippet#
Emit embed code for partner sites.
| Option | Required | Description |
|---|---|---|
--surface <name> | No | Surface, default market |
--market <pubkey> | For market/trade/live | Market account pubkey |
--referrer <pubkey> | No | Referrer wallet pubkey |
--partner <id> | No | Partner id, max 16 chars |
--campaign <id> | No | Campaign id, max 16 chars |
--source <text> | No | Source label, max 64 chars |
--format <kind> | No | html, web-component, react, or iframe |
--host <url> | No | Widget host, default https://app.seesaw.fi |
--version <ver> | No | Widget bundle version, default v2 |
seesaw widget snippet \
--surface market \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--format iframe
widget sign-config#
Produce a signed partner config envelope using the configured Ed25519 keypair.
| Option | Required | Description |
|---|---|---|
--partner-id <id> | Yes | Partner id, max 16 chars |
--referral <pubkey> | Yes | Referrer wallet pubkey |
--campaign <id> | No | Campaign id |
--source <text> | No | Source label, max 64 chars |
--ttl <seconds> | No | Envelope lifetime, default 3600 |
seesaw widget sign-config \
--partner-id partner1 \
--referral RefAddr123456789abcdefghijklmnopqrstuvwxyz \
--ttl 3600