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",
"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",
"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 using Pyth Pull, Pyth Push, or Chainlink.
| Option | Required | Description |
|---|---|---|
--oracle-source <source> | No | pyth_pull (default), pyth_push, or chainlink. |
--pyth-api-key <key> | No | Pull Hermes credential; alternatively use PYTH_API_KEY or the local key vault. The CLI posts the Receiver update. |
--pyth-feed-id <hex> | Pyth | Pyth feed ID (32 bytes hex). This identifies the asset and is not a Solana account. |
--feed-account <address> | Chainlink | Chainlink feed account; cannot be combined with --pyth-feed-id. |
--settlement-mint <address> | Yes | Settlement token mint address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
--max-confidence-ratio <bps> | Choice | Max confidence ratio in basis points. Required unless --disable-confidence-guard is supplied. |
--disable-confidence-guard | Choice | Explicitly disable the confidence guard (max_confidence_ratio_bps = 0). Mutually exclusive with a non-zero --max-confidence-ratio. |
--capacity <tier> | No | Pull: standard (512/1025, default), small (64/129), or large (2048/4097). Direct Push/Chainlink: small only, also the default. |
--seats <count> | No | Advanced: exact activatable seat count. Must retain strict headroom above twice the selected orderbook capacity. Mutually exclusive with --capacity. |
--orderbook-capacity <levels> | No | Advanced override for deep RBT levels per side. Must be a supported tier and leave strict admission headroom with the selected seat count. |
--max-oracle-jump <bps> | No | Maximum oracle jump; 0 uses the protocol default. |
--core-provider <provider> | No | Pull landing provider: jito-direct (default), helius-jito, or quicknode-jito. |
--core-tip-approval-lamports <lamports> | No | Exact approved core-provider tip. |
--nozomi-preparation | No | Use Nozomi for Pull capacity preparation. |
--preparation-tip-approval-lamports <lamports> | No | Exact approved Nozomi preparation tip. |
--record-events | No | Deprecated no-op; recorder tail is always attached. |
-y, --yes | No | Skip the mainnet confirmation prompt. |
seesaw market create \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--duration 900 \
--max-confidence-ratio 500
Pull creation uses the configured API landing provider, or a local Hermes key
(--pyth-api-key / PYTH_API_KEY); it does not accept a cached update account.
The Pull path verifies and closes a Receiver-owned ephemeral PriceUpdateV2.
Push derives the sponsored feed account locally. Chainlink uses --feed-account
and requires --disable-confidence-guard. Direct sources do not call Hermes.
When the API landing path is used, provider tip approvals must match the
provider's required amount.
{
"success": true,
"data": {
"market": "Mkt1abc...",
"orderbook": "OB1abc...",
"vault": "Vlt1abc...",
"marketId": "112640"
},
"error": null,
"meta": {
"command": "market create",
"duration_ms": 1250,
"signature": "5UjR4w...",
"slot": 312456789
}
}
Trader seat capacity controls how many distinct traders the market can hold. The CLI couples each
--capacitypreset to a safe deep RBT orderbook/seat pair. Pull defaults to standard (512/1025); direct Push/Chainlink defaults to small (64/129) and rejects larger capacities before submission. Advanced--seatsand--orderbook-capacityvalues must still satisfy strict admission headroom. The Pull path submits the requiredEnsureTraderLedgerSpace(0x2E) andEnsureDeepOrderbookSpace(0x33) preludes in bounded chunks before the finalCreateMarket. It rejects seat counts above 4225 before submission because larger ledger tiers are not exposed in the beta CLI flow. Use--capacity largeor--seats 4225as the current upper bound. Account 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 |
--price-update <address> | Choice | Already-posted Receiver-owned PriceUpdateV2; alternative to Hermes credentials. |
--pyth-api-key <key> | Choice | Posts the update in the same bundle; alternatively use PYTH_API_KEY or the key vault. |
--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 \
--price-update 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 record-oracle-observation#
Record an authenticated Pyth Push or Chainlink observation for a non-Pull market. The observation PDA is derived from the source, feed identity, and expected publish time.
| Option | Required | Description |
|---|---|---|
--source <source> | Yes | pyth_push or chainlink |
--feed-identity <hex> | Yes | 32-byte feed ID or Chainlink feed identity |
--feed-account <address> | Yes | Live Push or Chainlink account, verified against the feed identity on-chain |
--publish-time <seconds> | Yes | Expected provider publish time |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw market record-oracle-observation \
--source pyth_push \
--feed-identity <32-byte-hex-feed-id> \
--feed-account <live-push-feed-account> \
--publish-time 1780000000
market submit-oracle-observation#
Submit a recorded observation as the market's provisional end candidate. The market's contest PDA is derived automatically; the recorder tail is attached automatically.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
--observation <address> | Yes | Recorded oracle observation PDA |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw market submit-oracle-observation \
--market <market-address> \
--observation <observation-address>
market finalize-oracle-observation#
Finalize the earliest usable submitted observation after the contest deadline. Any unusable candidate permits neutral expiry according to the on-chain contest rules.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw market finalize-oracle-observation \
--market <market-address>
market close-oracle-observation#
Close a retained observation account after its retention period and refund the recorded payer.
| Option | Required | Description |
|---|---|---|
--observation <address> | Yes | Oracle observation PDA |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw market close-oracle-observation \
--observation <observation-address>
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 |
--creator-token-account <address> | Yes | Creator's stablecoin token account |
--settlement-mint <address> | Yes | Settlement mint address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
seesaw market resolve \
--market-id 112640 \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv \
--creator-token-account CreatorUsdtAta11111111111111111111111 \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
{
"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 |
--creator-token-account <address> | Yes | Creator's stablecoin token account |
--settlement-mint <address> | Yes | Settlement mint address |
--duration <seconds> | No | Market duration in seconds (default: 900) |
--price-update <address> | No | Already-posted Receiver update for late capture. |
--pyth-api-key <key> | No | Posts a Receiver update in the same bundle; alternatively use PYTH_API_KEY or the key vault. |
seesaw market expire \
--market-id 112640 \
--pyth-feed-id ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv \
--creator-token-account CreatorUsdtAta11111111111111111111111 \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--price-update Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD
{
"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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
{
"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 |
--creator-stablecoin-ata <address> | Yes | Creator settlement-token ATA that receives residual vault dust first |
seesaw market close \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--creator Cre8orAddr123456789abcdefghijklmnopqrstuv \
--creator-stablecoin-ata Cre8orATA123456789abcdefghijklmnopqrst
{
"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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
{
"success": true,
"data": { "market": "Mkt1abc…", "vault": "Vlt1abc…" },
"error": null,
"meta": {
"command": "market claim-creator-fees",
"duration_ms": 830,
"signature": "9xYa4k…",
"slot": 312456900
}
}
market top-up-closer-rewards#
Permissionlessly top up a market PDA's rent-safe closer-reward budget to the current config rate.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
-y, --yes | No | Skip mainnet confirmation prompt |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
--dry-run | No | Simulate without sending |
--build-only | No | Print built tx without sending |
seesaw market top-up-closer-rewards \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu
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 |
--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) |
--self-trade-behavior <0|1|2> | No | Self-trade policy: 0=Abort, 1=CancelProvide, 2=DecrementTake |
--worst-acceptable-price-bps <bps> | No | IOC slippage bound [0-10000]; 0 disables the bound |
--min-fill-quantity <amount> | No | Minimum fill quantity in base units for IOC/partial-fill protection |
--match-limit <n> | No | Program limit: 0 through 12; counts fills, expired skips and self-trade handling. |
--max-age-seconds <seconds> | No | Optional shorter TTL; 0 selects the market close observed at placement |
--reject-post-only-would-cross <0|1> | No | Reject post-only orders that would cross the book (default: 1) |
--protocol-treasury-index <n> | Yes | Protocol treasury shard index [0-7] |
--referrer <addr> | No | Pending referrer candidate resolved through on-chain/indexer precedence |
--free-funds | No | Use the free-funds placement route; the full account set remains required by this CLI. |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip mainnet confirmation prompt |
The protocol treasury token account is derived from
ConfigAccount.treasuryRecipients[--protocol-treasury-index]; trading commands
do not accept a client-supplied fee-recipient account.
Although Commander registers the four token/mint flags and treasury index as
optional, the action validates them as required. This also applies to
--free-funds: it changes the placement route, not the required account set.
The CLI help on this branch still advertises a match limit of 63; use the
program's actual limit of 12.
Referral attribution defaults to the resolver path: pass --referrer as a
pending candidate and the CLI resolves the locked on-chain referrer, pending
candidate, protocol fallback, and referral-binding eligibility. The CLI does
not expose manual referral-account or treasury-shard overrides.
seesaw order place \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--side buy-yes \
--price 5000 \
--quantity 1000000 \
--self-trade-behavior 0 \
--max-age-seconds 300 \
--protocol-treasury-index 3 \
--token-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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. The command
does not call the on-chain CancelAllOrders instruction directly; it repeatedly
submits CancelMultipleOrdersById in bounded batches (at most six order IDs
per transaction) and refreshes the orderbook between batches until no owned
orders remain, so cancelling a large order count may send multiple
transactions and report incremental progress rather than completing in one.
seesaw order cancel-all \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--free-funds \
--token-account UserSettlementAta111111111111111111111 \
--settlement-mint SettlementMint11111111111111111111111 \
--user-yes-ata UserYesAta11111111111111111111111111111 \
--user-no-ata UserNoAta111111111111111111111111111111
Without --free-funds, also pass --token-account, --settlement-mint, --user-yes-ata, and --user-no-ata. With --free-funds, bids use the lean route, but asks must still use the standard route; pass those four account flags whenever the wallet may have asks. The command fails with its confirmed progress instead of silently leaving ask exposure when those accounts are absent.
order cancel-all-bounded#
Cancel every resting order for the wallet in one bounded instruction
(CancelAllOrders, 0x12, or CancelAllOrdersWithFreeFunds, 0x16). Unlike
order cancel-all, this emits the raw bounded builder in a single transaction —
it may exceed the compute budget on very deep books. Prefer order cancel-all
for batched cancellation of large order counts.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account address |
--token-account <address> | No* | User's settlement token account (required without --free-funds) |
--settlement-mint <address> | No* | Settlement mint address (required without --free-funds) |
--user-yes-ata <address> | No* | User's YES mint token account (required without --free-funds) |
--user-no-ata <address> | No* | User's NO mint token account (required without --free-funds) |
--free-funds | No | Use the lean with-free-funds account set |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw order cancel-all-bounded \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--free-funds
order cancel-up-to#
Cancel orders up to a canonical side, tick, and count limit. --max-orders is
capped at 6 (MAX_BULK_CANCEL_LIMIT) on-chain; the instruction reverts with
BulkCancelIncomplete if more qualifying orders exist than the requested
count can cancel atomically.
seesaw order cancel-up-to \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--side buy-yes \
--tick-limit-bps 4900 \
--max-orders 6 \
--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.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account. |
--bids <levels> | Choice | Comma-separated bid levels; provide bids, asks, or both. |
--asks <levels> | Choice | Comma-separated ask levels. |
--token-account <address> | Yes | User settlement-token account. |
--settlement-mint <address> | Yes | Settlement mint. |
--user-yes-ata <address> | Yes | User YES-token account. |
--user-no-ata <address> | Yes | User NO-token account. |
--reject-post-only-on-cross <0|1> | No | Reject the instruction if an order crosses; default 1. |
--self-trade-behavior <0|1|2> | No | Self-trade policy; default 1 (CancelProvide). |
--protocol-treasury-index <n> | Yes | Approved treasury shard index. |
--free-funds | No | Use the free-funds ladder route; token/mint flags are still required. |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip mainnet confirmation. |
seesaw order place-ladder \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--bids 4900:100000,4800:200000 \
--asks 5100:100000,5200:200000 \
--token-account ATA1abc123def456ghi789jkl012mno345pqr678stu \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--order-id 42 \
--caller-stablecoin-ata CallerStableAta123456789abcdefghi
order reclaim-expired-sweep#
Read a JSON target file and submit each expired-order reclaim in a separate confirmed transaction. The sweep stops at the first send error and reports completed, failed, and first-unattempted targets for resumable operation.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market PDA shared by all targets |
--settlement-mint <address> | Yes | Settlement mint |
--targets-file <path> | Yes | JSON array containing 1–64 exact target objects |
--caller-stablecoin-ata <addr> | No | Caller ATA for configured bounty collection |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip the mainnet confirmation prompt |
Each target must contain only maker, makerTokenAccount, makerYesAta,
makerNoAta, and decimal-string orderId. Duplicate (maker, orderId)
targets and unsafe IDs are rejected. Confirmation is applied once to the full
sweep; transactions are then sent sequentially.
[
{
"maker": "<maker-address>",
"makerTokenAccount": "<maker-stablecoin-ata>",
"makerYesAta": "<maker-yes-ata>",
"makerNoAta": "<maker-no-ata>",
"orderId": "42"
}
]
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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
{
"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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
{
"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 |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw position mark-settled \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--owner User1abc123def456ghi789jkl012mno345pqr678s \
--owner-settlement-ata UserStableAta123456789abcdefghijkl \
--settlement-mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
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 |
--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 propose-authority#
Propose a pending two-step ConfigAccount.authority rotation, or cancel a pending proposal with the all-zero authority payload.
| Option | Required | Description |
|---|---|---|
--new-authority <address> | Choice | Pending authority to propose |
--cancel | Choice | Cancel a pending authority rotation |
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw admin propose-authority --new-authority SquadsMultisig1111111111111111111111111
admin claim-authority#
Claim a pending ConfigAccount.authority rotation after the on-chain timelock elapses. The signer must be the pending authority.
| Option | Required | Description |
|---|---|---|
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw admin claim-authority
admin set-pauser#
Set the escalation-only pauser guardian key. Passing the all-zero pubkey disables pauser access fail-closed.
| Option | Required | Description |
|---|---|---|
--pauser <address> | Yes | New pauser pubkey |
-y, --yes | No | Skip mainnet confirmation prompt |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw admin set-pauser --pauser Pauser111111111111111111111111111111111111
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 enable-post-only-mode#
Enable global post-only mode. Existing makers may continue posting/cancelling, while taking is halted by the program.
| Option | Required | Description |
|---|---|---|
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw admin enable-post-only-mode
admin disable-post-only-mode#
Disable global post-only mode.
| Option | Required | Description |
|---|---|---|
-y, --yes | No | Skip mainnet confirmation prompt after reviewing inputs |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
seesaw admin disable-post-only-mode
admin update-fee-config#
Retune the capped-linear-decay curve and four-way allocation (instruction 0x1F UpdateFeeConfig). The four 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 |
--maker-rebate-share <bps> | No | Maker share in bps of fee; pass explicitly (CLI omission uses zero) |
--maker-rebate-min-rest-seconds <seconds> | No | Maker eligibility age; pass explicitly (CLI omission uses zero) |
--dry-run | No | Simulate without sending |
--build-only | No | Print the built transaction without sending |
seesaw admin update-fee-config \
--fee-cap 200 \
--decay-rate 400 \
--protocol-share 5000 \
--creator-share 500 \
--referral-share 500 \
--maker-rebate-share 4000 \
--maker-rebate-min-rest-seconds 10
{
"success": true,
"data": {
"config": "CfgXx...",
"feeCapBps": 200,
"decayRateBps": 400,
"protocolShareBps": 5000,
"creatorShareBps": 500,
"referralShareBps": 500,
"makerRebateShareBps": 4000,
"makerRebateMinRestSeconds": 10
},
"error": null,
"meta": {
"command": "admin update-fee-config",
"duration_ms": 910,
"signature": "5eJn3a...",
"slot": 312456930
}
}
The shipped allocation is 50% protocol / 5% creator / 5% referral / 40% maker rebate. Eligible maker fills credit the maker's free quote balance; ineligible maker allocation and rounding dust go to protocol, as does the referral allocation without an eligible referrer. See fee constants and allocation details.
<!-- src: program/src/logic/fee.rs:168 FeeSplit4::TARGET --> <!-- F-01: update with builder fee allocation -->The example explicitly sets shipped defaults, including the maker resting-age gate. It is not a live-config attestation. Maker allocation is credited only for eligible fills; read deployed config before changing governance settings.
<!-- src: program/src/state/config.rs:1098 ConfigAccount::new --> <!-- src: packages/cli/src/commands/admin/index.ts:651 update-fee-config -->admin update-tick-size#
Update the global order book tick size (minimum price increment). The shared global microstructure cooldown applies; this command does not select or mutate a market account.
| 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 global minimum quote notional required for a resting remainder. The shared global microstructure cooldown applies; this command does not select or mutate a market account.
| Option | Required | Description |
|---|---|---|
--min-resting-notional <u64> | Yes | New floor in settlement-token base units, max 100000000 |
-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 <n> | 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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--order-id 42
admin operational-params#
Tune the post-deploy operational bounds exposed by UpdateOperationalParams.
Bounds mirror on-chain validation: closer reward <= 1000000 lamports, price
staleness <= 3600 seconds, expiration window <= 2592000 seconds, explicit
market duration bounds must be 0 or between 60 and 604800 seconds with
min <= max, and max order size must be in [1, 281474976710655].
| 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 |
--spline-flags <u8> | No | Spline feature flags; default 0 |
--spline-min-commitment <u64> | No | Minimum spline commitment; default 10000000 |
--spline-mid-jump-reset-bps <u16> | No | Midpoint jump that resets eligibility; default 0 |
--dry-run | No | Simulate without sending |
--build-only | No | Print the built transaction without sending |
-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 \
--spline-flags 1 \
--spline-min-commitment 10000000 \
--spline-mid-jump-reset-bps 250
admin init-resolver-registry#
Initialize the singleton external resolver registry (InitResolverRegistry, 0x48). The registry
and config PDAs are derived automatically; the wallet must be the config authority.
| Option | Required | Description |
|---|---|---|
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin init-resolver-registry --yes
admin update-resolver-registry#
Atomically replace the external resolver registry epoch, enabled market-kind bitmask, and resolver
entry set (UpdateResolverRegistry, 0x49). At most 8 entries are accepted; the full set is
replaced on every call, so include every resolver that should remain registered.
| Option | Required | Description |
|---|---|---|
--epoch <n> | Yes | Monotonic registry epoch (u64) |
--market-kinds <n> | Yes | Enabled market-kind bitmask [0-255] |
--entries <json> | Yes | JSON array of up to 8 { resolverAuthority, programId, status, kindsBitmask } objects |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip mainnet confirmation prompt |
seesaw admin update-resolver-registry \
--epoch 2 --market-kinds 1 \
--entries '[{"resolverAuthority":"Reso1verAuth11111111111111111111111111111","programId":"AdapterProg11111111111111111111111111111111","status":1,"kindsBitmask":1}]'
spline#
Creator-owned spline lifecycle commands. Spline shapes use two JSON arrays of
exactly 16 compiled CurveLevel objects with endQuantityLots and
priceOffsetBps integer fields.
spline init#
Initialize a creator-owned spline for one feed and duration series. The
recorder-v1 tail is attached automatically and tag 60 is emitted;
--record-events is a deprecated no-op kept for existing scripts.
seesaw spline init --settlement-mint <mint> --feed-id <32-byte-hex> \
--duration-seconds 900 --initial-mid-price-bps 5000 \
--max-quote-age-seconds 45 --default-commitment 10000000 \
--bid-level-count 16 --ask-level-count 16 \
--bid-levels '<16-level-json-array>' --ask-levels '<16-level-json-array>'
spline update-shape#
Replace a spline shape. Pass --market when the spline is attached. The
recorder tail is attached automatically.
seesaw spline update-shape --spline <address> --market <address> \
--max-quote-age-seconds 45 --quote-authority <address> \
--default-commitment 10000000 --bid-level-count 16 --ask-level-count 16 \
--bid-levels '<16-level-json-array>' --ask-levels '<16-level-json-array>'
spline update-mid#
Advance the spline sequence and midpoint.
seesaw spline update-mid --spline <address> --sequence 42 \
--expected-generation 0 --quote-origin-unix <unix-seconds> \
--new-mid-price-bps 5050 --active
spline attach#
Attach a spline to a compatible market and commit collateral.
seesaw spline attach --market <address> --feed-id <32-byte-hex> \
--duration-seconds 900 --commit-amount 10000000
spline settle#
Settle an attached spline after the market reaches a terminal state.
seesaw spline settle --market <address> --feed-id <32-byte-hex> \
--duration-seconds 900 --market-creator <address>
spline recover#
Recover an unresolved attached creator spline and return its remaining inventory to the creator's token accounts.
seesaw spline recover --spline <address> --market <address> \
--creator-yes-token-account <address> \
--creator-no-token-account <address>
spline deposit-vault#
Deposit settlement tokens into a spline vault. Tag 61 is emitted with the post-transfer vault balance.
seesaw spline deposit-vault --spline <address> --creator-token-account <ata> \
--amount 10000000
spline withdraw-vault#
Withdraw idle settlement tokens from a spline vault. This remains available during pause because committed collateral is held by the market vault, which is not an account to this instruction. Tag 62 is emitted.
seesaw spline withdraw-vault --spline <address> --creator-token-account <ata> \
--amount 10000000
spline close#
Close an unattached or fully settled spline and its vault. Tag 63 is emitted.
seesaw spline close --spline <address>
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-stdin | No | Read auth token from stdin instead of argv |
export SEESAW_API_TOKEN=eyJhbGci...
seesaw api stats-personal
{
"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-stdin | No | Read auth token from stdin instead of argv |
export SEESAW_API_TOKEN=eyJhbGci...
seesaw api achievements
{
"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-stdin | No | Read auth token from stdin instead of argv |
export SEESAW_API_TOKEN=eyJhbGci...
seesaw api compliance-check \
--address User1abc123def456ghi789jkl012mno345pqr678s
{
"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 local fee math without RPC. This CLI version still uses a stale decay and local SDK allocation by default; its split output is not an on-chain config reading. The explicit decay override below matches the shipped curve, but does not fix the preview's local allocation. Use current config and the SDK fee helpers for allocation-sensitive work.
<!-- src: packages/cli/src/commands/fee/index.ts:95 preview defaults --> <!-- src: packages/core/src/fee.ts:37 DEFAULT_FEE_SPLIT -->| 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 | Pass 400 for shipped curve; CLI omission still uses 600 |
seesaw fee preview --price-bps 5000 --notional 1000000 --cap-bps 200 --decay-bps 400
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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--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
fee rollup-referral#
Permissionlessly move a bounded batch of deferred position liabilities into one referrer's earnings account and canonical treasury shard. Position addresses are decoded and raw-byte sorted before the instruction is built.
| Option | Required | Description |
|---|---|---|
--market <address> | Yes | Market account |
--referrer <address> | Yes | Common referrer for every position |
--treasury-index <n> | Yes | Earnings-account shard index, 0 through 7 |
--mint <address> | Yes | Market settlement mint |
--positions <json> | Yes | JSON array of 1–8 distinct position addresses |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip the mainnet transaction confirmation prompt |
seesaw fee rollup-referral \
--market Mkt1abc123def456ghi789jkl012mno345pqr678stu \
--referrer RefAddr123456789abcdefghijklmnopqrstuvwxyz \
--treasury-index 3 \
--mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB \
--positions '["Position111111111111111111111111111111"]'
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"
]'
treasury init-referrer-shard#
Permissionlessly and idempotently provision one canonical referrer treasury token account for the config's settlement mint.
| Option | Required | Description |
|---|---|---|
--treasury-index <n> | Yes | Referrer treasury shard index, 0 through 7 |
--mint <address> | Yes | Config default settlement mint |
--record-events | No | Deprecated no-op: the recorder tail is always attached |
-y, --yes | No | Skip the mainnet transaction confirmation prompt |
seesaw treasury init-referrer-shard \
--treasury-index 3 \
--mint Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
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 Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
reclaim#
Standalone-verifier Reclaim V1 proof transport and settlement. The CLI accepts
runner V2 envelopes or strict signed proof fields used by the verifier. It rejects the retired
Seesaw witness, claim, outcome, payout, and factHash authority fields.
reclaim buffer#
Manage immutable proof buffers owned by the standalone Reclaim verifier.
reclaim buffer create#
Create a proof-buffer PDA for an expected byte length and SHA-256 hash.
| Option | Required | Description |
|---|---|---|
--nonce <u64> | Yes | Uploader-scoped proof-buffer nonce |
--expected-length <bytes> | Yes | Exact proof length, from 1 through 8,192 |
--expected-hash <hex> | Yes | Exact 32-byte proof-buffer hash |
--expires-at <unix-seconds> | Yes | Positive signed-64-bit expiry timestamp |
--verifier-program-id <address> | No | Override the pinned verifier program |
seesaw reclaim buffer create --nonce 7 --expected-length 901 \
--expected-hash <hex32> --expires-at 1900000000
reclaim buffer write#
Write one bounded chunk to an active proof buffer.
| Option | Required | Description |
|---|---|---|
--buffer <address> | Yes | Proof-buffer account |
--offset <bytes> | Yes | Zero-based byte offset |
--bytes-base64 <base64> | Yes | Canonical base64 chunk, at most 900B |
--verifier-program-id <address> | No | Override the verifier program |
seesaw reclaim buffer write --buffer <address> --offset 0 --bytes-base64 AQ==
reclaim buffer finalize#
Make a fully written buffer immutable after the verifier checks its expected length and hash.
| Option | Required | Description |
|---|---|---|
--buffer <address> | Yes | Proof-buffer account |
--verifier-program-id <address> | No | Override the verifier program |
seesaw reclaim buffer finalize --buffer <address>
reclaim buffer close#
Close an eligible proof buffer and return rent to its committed rent payer.
| Option | Required | Description |
|---|---|---|
--buffer <address> | Yes | Proof-buffer account |
--rent-payer <address> | Yes | Committed rent destination |
--verifier-program-id <address> | No | Override the verifier program |
seesaw reclaim buffer close --buffer <address> --rent-payer <address>
reclaim polymarket#
Discover Gamma markets and prepare Reclaim requests. Gamma is the default Polymarket source; a discovery response cannot authorize a market transaction.
reclaim polymarket markets#
| Flag | Required | Description |
|---|---|---|
--query <link-or-id> | No | Polymarket link, slug, or decimal Gamma market ID |
--closed | No | Browse closed markets instead of active open markets |
--offset <offset> | No | Pagination offset, default 0 |
seesaw reclaim polymarket markets --closed
reclaim polymarket prepare#
| Flag | Required | Description |
|---|---|---|
--market-id <id> | Yes | Decimal Gamma market ID |
--operation <operation> | No | create (default) or resolve |
The response includes data.request, data.marketAddress, and data.snapshot.
Save the request for the Reclaim runner, generate its proof, and submit that
proof with the returned market and snapshot. See the
Gamma workflow.
seesaw reclaim polymarket prepare --market-id 253591 --operation resolve
reclaim kalshi#
Discover a binary Kalshi market by URL or ticker and prepare a V4 Reclaim proof request.
seesaw reclaim kalshi markets --query 'https://kalshi.com/markets/SERIES/SLUG/EVENT'
seesaw reclaim kalshi markets --closed --cursor NEXT_CURSOR
seesaw reclaim kalshi prepare --query MARKET_TICKER --operation create
seesaw reclaim kalshi prepare --query MARKET_TICKER --operation resolve
markets accepts --query, --closed, and --cursor. prepare requires
--query identifying exactly one market; --operation defaults to create.
Event links with multiple markets require selecting a ticker first. The
response contains data.request, data.marketAddress, and data.snapshot.
Use the Kalshi mirror workflow to generate and
submit the proof. SportsDataIO remains disabled.
reclaim snapshot#
Inspect authenticated verifier epoch state.
reclaim snapshot show#
Derive and decode the governed epoch snapshot for a deployment and epoch.
| Option | Required | Description |
|---|---|---|
--deployment-id <hex> | Yes | Exact 32-byte deployment ID |
--epoch <u32> | Yes | Nonzero Reclaim epoch |
--verifier-program-id <address> | No | Override the verifier program |
seesaw reclaim snapshot show --deployment-id <hex32> --epoch 7
reclaim submit#
Build or execute the complete V1 proof-buffer and atomic settlement plan. The preparation transactions create and write the buffer; the final lifecycle transaction verifies the Reclaim signature threshold through CPI, binds the claim to the exact market policy, consumes the receipt, and transitions the market atomically. Creation then allocates the book and ledger and confirms Open before reporting success. The live create path reads the settlement mint from Config unless supplied explicitly.
| Option | Required | Description |
|---|---|---|
--proof <path> | Yes | Runner V2 envelope or SeesawReclaimProofV1 JSON |
--operation <operation> | Yes | create, resolve, halt, or extend-close |
--market <address> | Yes | Exact consumer market |
--nonce <u64> | Yes | Uploader-scoped proof-buffer nonce |
--snapshot <address> | Yes | Authenticated epoch snapshot |
--payer <address> | Dry run | Required for a keyless deterministic dry run |
--verifier-program-id <address> | No | Override the pinned verifier program |
--settlement-mint <address> | Create dry run | Settlement mint; otherwise read from Config |
--dry-run | No | Print transactions without RPC access or signing |
seesaw reclaim submit --proof ./proof-v1.json --operation resolve \
--market <address> --nonce 7 --snapshot <address> --payer <address> --dry-run