Skip to main content
Anchor numbers each program’s custom errors from 6000, so one code means different things in different programs. Always read a code together with the program ID that raised it. Wallets and RPC errors often show the code in hex: custom program error: 0x177c is 6012. The tables are generated from the published IDLs, so the codes match the deployed programs. The Message column is the program’s own text, as it appears in transaction logs. A cause is given where it was checked against the program source.

mint-redeem

Program ID (devnet): 5MBjhNUUguLTPNR5WG6YBUUw7vUcxQ14ARw3NsS3rKu4 Codes 6029 and 6030 are reserved placeholders: the γ rate caps they reported were removed, and the codes stay so that later codes keep their numbers. Codes 6048 to 6052 belonged to the unified vault, which the upgrade of 11 Oct 2026 removed. They are no longer returned and stay for the same reason.

clp

Program ID (devnet): 8xauDRjw9XRyk4FE3hW1JKjD8nC87gfr59Xig1dJqLES Codes 6003 to 6016 and 6044 to 6052 are swap errors from pool_swap and the committed-order instructions, including claim. clp_swap, retired on 11 Oct 2026, always fails with 6003. 6031 and 6032 are retired and nothing returns them.

oracle

Program ID (devnet): 5vxiCrDpFnQ2W5QtgZBC66K2XTC19bjVBjinGYYBsadC The oracle program isn’t updated on devnet, so these errors come only from operator instructions and the oracle’s own view instructions. Mint and redeem report price problems with mint-redeem errors.

registry

Program ID (devnet): Hss7QZ46RcrV4ta63q2EM2Wf1Pzbjnd5FNjaTTDZHnau

faucet

Program ID (devnet): 9tUeQAPEtVSB68NSfvFAqfwaB74GuVxm6Zbp1hrMiNKY

trading

Program ID (devnet): Anyy78cCJqapwvvFsignmQ45an5PCg9HfeDhDtAPNfmA These come from the order book, the trading account and the short rebate. Errors raised inside Manifest itself are Manifest’s, not these.

Anchor errors below 6000

Anchor raises its own errors before the program’s code runs: when the instruction doesn’t exist, or when an account fails validation. The common ones:

How errors surface in clients

Anchor turns a failed transaction into an AnchorError that carries the code, its name and the program that raised it:
When you simulate with @solana/web3.js, AnchorError.parse(logs) reads the same fields from the logs. The raw log line looks like this:

Common error sequences

Mint or redeem fails with TwapNotAvailable (6012)

The market’s price is 0 or more than 300 s old. The keeper doesn’t push prices while the underlying market is closed (for equities, nights and weekends), so mint and redeem stay closed until it reopens. The bin books trade in the meantime. If it happens during market hours and persists, check #announcements on Discord, where the team posts outages, or ask in #help.

Mint or redeem fails with MintNotAllowedInStress or RedeemNotAllowedInStress

The market is in Stress, which blocks both mint and redeem on every live market. Read market.riskState and surface it to the user as “mint and redeem paused”. Committed orders still fill while the keeper pushes prices.

Redeem fails with InvalidAmount (6001)

Both l_amount and s_amount must be above 0: there is no single-leg redeem. The program also fails with this code when the balanced pair it would burn has a zero leg, for example one atom of L whose value is worth less than one base unit of S. Offer a larger amount of the smaller leg. Sell a lone leg with a committed order while the market is open, or on its bin book while its price is stale. The same code also covers an amount above the outstanding supply and a token account whose mint doesn’t match the market.

pool_swap fails with PoolClosedWhileLive (6044)

The market’s price is live, and the bin books trade only while it is stale. Send a committed order (commit_swap) instead; it fills at the next price push. See Trade.

A pool_swap fails with ExposureCapExceeded (6045)

The market is full on that side. Its exposure cap limits how far traders’ net position can go, and a trade that pushes it further past the cap reverts. Trades the other way always pass and open room, so a short makes room for a long and the reverse. Redemptions are not capped, because they burn a balanced pair. Try a smaller amount, or wait. Committed orders don’t fail this way; they fill what fits and refund the rest. See Exposure cap.

A trade fails with ExposureAccountsMissing (6046)

The market is capped and the transaction didn’t pass the exposure accounts. For pool_swap and settle_swap they are the pool long and short synth vaults, then the CLP’s long and short token accounts. Passing them on an uncapped market is harmless. Redemptions need none of them. See Exposure cap.

Redeem fails with InsufficientLiquidCollateral (6022)

The payout is more than the market’s liquid collateral. On mainnet most collateral is lent out, and the vault keeps only a liquid share. Escrow the tokens with request_redemption and the keeper pays the request in parts as money comes back from the lending venues. Cancel with cancel_redemption to take the unpaid part back. See Redeem.

Mint or redeem fails with BelowMinimum (6019)

A mint needs a deposit of at least 10 cUSDC (10_000_000 base units). A redeem needs the balanced pair it burns to be worth at least 10 cUSDC at the redeem NAVs. If you offer a lopsided amount, the pair is smaller than the offer.

Mint or redeem fails with Unauthorized (6021)

devTokenAccount must be a cUSDC token account owned by market.feeRecipient. Derive it with getAssociatedTokenAddressSync(cusdcMint, market.feeRecipient, true); the true matters because a fee recipient can be a PDA.

See also

FAQ

Common questions, including error symptoms.

Glossary

What the terms in error names mean.