Error Reference
Every custom error code the Fora program can return. When a transaction fails, Solana logs include a line like Program log: AnchorError caused by account: ... or custom program error: 0x1A. The hex code maps to one of the variants below.
The protocol has two error layers:
- Manifest errors (codes 0–23) — from the underlying CLOB. Returned when low-level order book operations fail.
- Fora errors (codes 22–50) — Fora-specific. Returned by the prediction market protocol on top of Manifest.
Note the overlap at codes 22 and 23 — the codes come from two different enums in two different programs, so disambiguation depends on which program ID emitted the log line.
Manifest errors (codes 0–23)
From the underlying CLOB. These surface when the low-level order book mechanics fail.
| Code | Variant | Description |
|---|---|---|
| 0 | InvalidMarketParameters |
Invalid market parameters |
| 1 | InvalidDepositAccounts |
Invalid deposit accounts |
| 2 | InvalidWithdrawAccounts |
Invalid withdraw accounts |
| 3 | InvalidCancel |
Invalid cancel |
| 4 | InvalidFreeList |
Internal free list corruption |
| 5 | AlreadyClaimedSeat |
Cannot claim a second seat for the same trader |
| 6 | PostOnlyCrosses |
Matched on a post-only order |
| 7 | AlreadyExpired |
New order is already expired |
| 8 | InsufficientOut |
Less than minimum out amount (slippage) |
| 9 | InvalidPlaceOrderFromWalletParams |
Invalid place-order-from-wallet params |
| 10 | WrongIndexHintParams |
Index hint did not match actual index |
| 11 | PriceNotPositive |
Price is not positive |
| 12 | OrderWouldOverflow |
Order settlement would overflow |
| 13 | OrderTooSmall |
Order too small to settle any value |
| 14 | Overflow |
Overflow in token addition |
| 15 | MissingGlobal |
Missing Global account |
| 16 | GlobalInsufficient |
Insufficient funds on global account to rest an order |
| 17 | IncorrectAccount |
Account key did not match expected |
| 18 | InvalidMint |
Mint not allowed for market |
| 19 | TooManyGlobalSeats |
Cannot claim a new global seat — use evict |
| 20 | InvalidEvict |
Can only evict the lowest depositor |
| 21 | InvalidClean |
Tried to clean order that was not eligible to be cleaned |
| 22 | EvictProtected |
This seat is protected and cannot be evicted |
| 23 | InvalidGlobalCreate |
Global create / close-orphan-vault validation failed |
Fora errors (codes 22–50)
From the Fora prediction market layer on top of Manifest.
| Code | Variant | Description |
|---|---|---|
| 22 | InvalidMetadata |
Invalid metadata URI or hash |
| 23 | InsufficientCollateral |
Insufficient collateral |
| 24 | TokenMintFailed |
Token mint failed |
| 25 | MismatchedTokenAmounts |
Mismatched token amounts when burning |
| 26 | InvalidMarket |
Invalid market |
| 27 | PricesDoNotCross |
Prices do not cross (yes_price + no_price < 1.00) |
| 28 | SupplyInvariantViolated |
Supply invariant violated (YES_supply != NO_supply) |
| 29 | OrderNotFound |
Order not found |
| 30 | NumericOverflow |
Numeric overflow |
| 31 | InvalidDiscriminant |
Invalid discriminant |
| 32 | InvalidAuthority |
Invalid authority |
| 33 | InvalidSigner |
Invalid signer |
| 34 | InvalidTokenAccount |
Invalid token account |
| 35 | InvalidMint |
Invalid mint (Fora layer — not the same as Manifest's code 18) |
| 36 | MarketAlreadyInitialized |
Market already initialized |
| 37 | MarketNotInitialized |
Market not initialized |
| 38 | InvalidManifestProgram |
Invalid Manifest program |
| 39 | InvalidPredictionMarketState |
Invalid prediction market state |
| 40 | MarketClosed |
Market is closed |
| 41 | SlippageExceeded |
Slippage exceeded |
| 42 | MarketNotResolved |
Market not resolved |
| 43 | MarketNotSettled |
Market not fully settled (traders still have balances) |
| 44 | MarketNotDetermined |
Market is not in DETERMINED state |
| 45 | MarketNotClosed |
Market is not in CLOSED state |
| 46 | InvalidUserCount |
Invalid user count in batch settle params |
| 47 | SeatNotFound |
Seat not found in market |
| 48 | SeatOrderMismatch |
Seat order mismatch — user does not match expected seat trader |
| 49 | UnexpectedClobSeat |
Unexpected CLOB seat — user has seat but was not processed in earlier phases |
| 50 | InvalidOrderType |
Global orders cannot be placed through prediction market batch update |
Quick lookup
Searching for a specific failure mode? A few common ones:
| If you see... | It usually means |
|---|---|
MarketClosed (40) |
Trying to trade on a market that's already past ACTIVE — see Market Lifecycle |
MarketNotDetermined (44) |
Tried to close/settle before resolve was called |
SlippageExceeded (41) |
Order's min_out not met — increase tolerance or split the trade |
AlreadyClaimedSeat (5) |
Calling claim_seat twice; idempotent at the protocol level but no-op |
GlobalInsufficient (16) |
Cross-market matching couldn't find enough opposite-side global liquidity |
PricesDoNotCross (27) |
Cross-market match attempted but bids don't sum to ≥ $1.00 |
PostOnlyCrosses (6) |
Post-only limit order would have taken liquidity — placed during a ACTIVE market with crossing book |
Source
- Manifest errors:
programs/fora-markets/src/program/error.rs—pub enum ManifestError - Fora errors: same file —
pub enum PredictionMarketError