Troubleshooting#
Common issues and solutions when using Seesaw Protocol.
Order Placement#
Insufficient funds for the order#
Error: InsufficientBalance (0x300D)
Cause: Not enough USDT in your wallet or trader-ledger for the required collateral.
Required collateral:
bid collateral = (price_bps / 10_000) × quantity (in settlement tokens)
ask collateral = quantity settlement tokens (sell orders escrow the shares)
Solutions:
- Check your USDT balance in the Portfolio tab.
- Account for collateral already locked in open resting orders.
- Cancel unused resting orders to free collateral before placing a new one.
Order price is outside the allowed band#
Error: OrderPriceOutOfBand (0x3014)
Cause: Your resting order's price is too far from the current market midpoint, or outside the static dust-filter bounds.
How the band works:
- When both sides have resting orders:
mid ± 1000 bps. A midpoint of 5000 bps means bids must be ≥ 4000 bps and asks ≤ 6000 bps. - When one or both sides are empty: bids must be ≥ 100 bps, asks ≤ 9900 bps.
- IOC orders are exempt (they never rest on the book).
Solutions:
- Move your price closer to the current best bid/ask.
- Use an IOC order if you want to fill immediately regardless of price.
- Check the live order book before submitting.
PostOnly order would cross the spread#
Error: WouldCross (0x3004)
Cause: A PostOnly order would immediately match an existing resting order. PostOnly orders are guaranteed not to take liquidity.
Solutions:
- Adjust your price to sit on the passive side of the spread.
- Use a regular Limit order if you are willing to take liquidity.
Market is in PostOnly mode#
Error: PostOnlyModeActive (0x300B)
Cause: The market's admin has set its emergency status to PostOnly. Taker
fills (IOC and Limit orders that would match immediately) are blocked. Resting
Limit and PostOnly orders are still accepted.
Solutions:
- Switch to a PostOnly order to add liquidity.
- Wait for the market's status to return to
None. - Settlement instructions (Redeem, MarkPositionSettled, etc.) still work normally.
Protocol is paused#
Error: ProtocolPaused (0x6001)
Cause: The protocol authority has paused the protocol globally, or the
market has been set to Paused emergency status. All order placement is blocked.
Solutions:
- Settlement, redemption, and position-claiming instructions remain available.
- Wait for the pause to be lifted.
- Monitor the protocol's status page or Discord for updates.
Market is in ForceCancelOnly or emergency mode#
Cause: The market's SetMarketEmergencyStatus has been set to
ForceCancelOnly. New orders are blocked. The admin can call
ForceCancelMarketOrders (0x2D) to cancel all resting orders at once.
Solutions:
- Cancel your own resting orders if possible.
- Wait for
ForceCancelMarketOrdersto run (it cancels all resting orders and returns their collateral). - Redeem positions and any claimed collateral as normal.
Order book is full#
Error: OrderbookFull (0x3002)
Cause: The order book holds at most 63 resting bids and 63 resting asks. Your side is at capacity.
Solutions:
- Wait for existing orders to fill, be cancelled, or expire.
- Use a price that will match immediately (IOC or aggressive Limit).
- Try again after a few seconds.
Resting remainder is too small#
Error: MinRestingNotionalNotMet (0x3013)
Cause: After a partial fill, the remaining quantity's notional value falls below the protocol's minimum resting notional.
Solutions:
- Increase your order size so any remainder meets the minimum.
- Use an IOC order to avoid leaving a partial remainder on the book.
Trading has ended#
Error: TradingEnded (0x1004)
Cause: The market's duration window has closed. New orders are not accepted.
Solutions:
- Wait for the next market epoch to open (markets run on a fixed cadence).
- Check the countdown timer before placing orders near market close.
Settlement and Redemption#
Cannot claim winnings#
Symptom: Claim button is disabled or Redeem transaction fails.
Possible causes and solutions:
| Cause | Solution |
|---|---|
| Market not yet resolved | Wait for SnapshotEnd and ResolveMarket cranks (permissionless; run automatically) |
| Already redeemed | Check your transaction history — position may already be closed |
| Insufficient SOL for fees | Top up SOL (≈ 0.005 SOL covers a redemption) |
| Market still in SETTLING state | Wait for the end price to be captured |
Reclaiming an expired resting order#
Resting orders carry a per-order TTL (max_age_seconds). Once expired, the
order becomes claimable via ReclaimExpiredOrder (0x19). The caller receives a
10 bps bounty (capped) of the refund as an incentive.
To reclaim your own expired order:
- Find the expired order in your Portfolio tab.
- Click Reclaim or use the SDK to call
ReclaimExpiredOrder. - Your collateral is returned plus the caller bounty.
Note: CloseMarket requires the order book to be empty. If expired orders
remain on the book, call ReclaimExpiredOrder before CloseMarket is attempted.
Claiming an abandoned position (MarkPositionSettled)#
If you are not the position owner but want to help a stalled market close:
MarkPositionSettled (0x1C)is permissionless — anyone can call it for any abandoned position.- It reads only protocol-owned PDAs to compute the owner's owed value, then transfers that USDT directly to the owner's settlement token account.
- It advances
settled_positionssoCloseMarketcan proceed.
This crank protects owners — it pays them, not the creator.
Market not progressing to Closed state#
CloseMarket (0x1E) requires:
- Market is resolved (outcome != 0).
- At least 7 days have passed since
resolved_at. - All trader-ledger balances are zero.
- No unsettled position-holders or outstanding SPL share supply.
- No unclaimed creator fees (
accumulated_creator_fees == 0). - Order book is empty (all expired orders reclaimed).
- Vault balance is zero (after dust sweep to creator).
If CloseMarket fails, check which condition is not yet met. Call
MarkPositionSettled for each unsettled position, ReclaimExpiredOrder for any
expired orders, and ClaimCreatorFees (0x23) to clear accumulated fees.
Creating Markets#
Transaction fails when creating a market#
EnsureTraderLedgerSpace required (0x2E)
Cause: The trader-ledger PDA must grow past Solana's 10240-byte
MAX_PERMITTED_DATA_INCREASE cap per transaction. If the ledger has not been
pre-allocated, CreateMarket will fail with TraderLedgerNotAllocated (0x3017).
Solution: Call EnsureTraderLedgerSpace (0x2E) as an idempotent prelude
before CreateMarket. The SDK's create_market_bundle() returns both
instructions in the correct order automatically. Repeat calls are no-ops.
Market already exists for this epoch#
Error: MarketExists (0x1001)
Cause: A market for this feed + duration + epoch was already created.
Market IDs are deterministic: market_id = floor(unix_timestamp / duration_seconds).
Solution: Wait for the next epoch, or use a different duration. You can also interact with the existing market instead of creating a new one.
Oracle Issues#
Stale oracle price#
Error: StaleOracle (0x2002)
Cause: One of:
- The Pyth price's
publish_timeis older than the freshness window (start snapshot: hardcoded 60 s; end snapshot: configurable viaUpdateOperationalParams). - The price's
publish_timeis in the future relative to the Solana Clock sysvar (zero-tolerance future check; retries self-heal within seconds).
Solutions:
- Wait a few seconds and retry — transient feed delays are common.
- Check Pyth Network status for feed health.
- For end snapshots: the snapshot window is generous; a single retry is usually enough.
Confidence too wide#
Error: ConfidenceTooWide (0x2004)
Cause: The Pyth price confidence interval exceeds the market's configured
max_confidence_ratio_bps threshold. This protects trades from settling on
uncertain prices.
Solutions:
- Wait for market conditions to stabilize.
- This usually resolves within seconds to minutes.
Invalid oracle data#
Error: InvalidOracleData (0x2006)
Cause: The PriceUpdateV2 account has an unexpected discriminator, a
verification_level below Full (1), or an exponent outside [-18, 18].
Solutions:
- Ensure you are passing the correct Pyth feed account for the market.
- For pull markets, post a fresh
PriceUpdateV2via the Pyth Receiver before calling the snapshot instruction.
Wallet and Network Issues#
Wallet not detected#
Symptom: "Connect Wallet" shows no wallet options.
Solutions:
- Verify the wallet browser extension is installed and enabled.
- Refresh the page.
- Disable conflicting wallet extensions.
- Try a different browser.
Wrong network#
Symptom: Connected but transactions fail or show wrong balances.
Solutions:
- Open wallet settings and switch to
mainnet-beta. - Refresh the page after switching.
Transaction timeout or blockhash expired#
Symptom: Transaction submitted but never confirms; "blockhash not found".
Solutions:
- Retry immediately with a fresh blockhash — your funds are safe, the original transaction expired before landing.
- Increase priority fee for congested periods.
- Switch to a faster RPC endpoint (Helius, QuickNode, Triton).
Balance not showing#
Possible causes:
- Wrong network in wallet.
- Transaction not yet confirmed.
- UI needs refresh.
Solutions:
- Confirm wallet is on
mainnet-beta. - Check transaction status in your wallet history.
- Refresh the page or wait 30 seconds.
Getting Help#
If the above solutions do not resolve your issue:
- Review the FAQ and relevant docs section.
- Search Discord — many issues have been discussed before.
- Post in #support with:
- Error code (e.g.
0x3014) - Transaction signature
- Wallet type and browser
- Steps to reproduce
- Expected vs. actual result
- Error code (e.g.
- Open a GitHub issue for bugs or feature requests.
Error Code Quick Reference#
See Error Codes for the complete, categorized error code reference including all categories (Market, Oracle, Order, Account, Fee/Referral, and Authority errors) with recovery actions.