Errors
API error codes
| Code | Meaning |
|---|---|
INVALID_REQUEST | Missing or malformed field, or no account on the needed chain |
UNAUTHORIZED | No valid session, or the quote belongs to another account |
INSUFFICIENT_LIQUIDITY | Reserve larger than available capacity |
DIRECTION_NOT_OFFERED | No pool sells that direction |
STRIKE_TOO_CLOSE | Strike nearer spot than the pool allows |
INVALID_TENOR | Tenor outside 1 to 365 days |
TENOR_DISABLED | No accepting pool offers the tenor and structure |
INVALID_CAP | Limit (cap) missing, out of range, or does not match the open-cover rule |
INVALID_STRIKE | Strike on the wrong side of spot or outside 0.5× to 2×; a strike sent as a rate that today's rate has moved past; or strikeDistanceBps with more than 2 decimals |
STRUCTURE_NOT_OFFERED | Pool does not sell that structure |
QUOTE_EXPIRED | Older than 120 s, or spot moved while pricing |
QUOTE_USED | Nonce already consumed |
QUOTE_INVALID | Signature or terms do not verify |
SLIPPAGE_EXCEEDED | Cost above max_cost, or past deadline |
ORACLE_NOT_READY | No live rate, or no agreed settlement rate yet |
ORACLE_PRICE_REJECTED | Agreed rate failed the pool's checks |
POSITION_SETTLED | Already settled |
NOTHING_TO_CLAIM | No payout, or already claimed |
WITHDRAWAL_NOT_READY | Request cannot be executed yet |
POOL_NOT_FOUND | Unknown pool |
POOL_NOT_ACCEPTING | Pool not selling, or closed to outside deposits |
CHAIN_NOT_ENABLED | Chain or feature not enabled on this deployment |
CHAIN_DRAINING | Chain only settles existing business |
ROUTING_FAILED, NO_ROUTE, DESTINATION_FUNDS_MISSING | Funding route problems |
INSUFFICIENT_BALANCE | Not enough USDC |
TRANSACTION_REJECTED | The network rejected the transaction |
PAUSED | Protocol paused for new business |
UNKNOWN | Unexpected error; retry with backoff |
Business account error codes
Returned by /api/organisations as { error: { code, message } }.
| Code | Meaning |
|---|---|
NOT_OFFERED | Business accounts are not available on this deployment |
NO_PASSKEY | The user must create their wallet passkey first |
TOO_MANY_ORGANISATIONS | The user has created the most business accounts allowed |
NOT_A_MEMBER, NOT_ALLOWED | Not an active member, or the member's role does not allow this |
BAD_EMAIL, BAD_ROLE, BAD_NAME | Invalid invitation or name |
ALREADY_MEMBER, PASSKEY_IN_USE | The person, or their passkey, already belongs to the business |
BAD_INVITE, INVITE_EXPIRED, WRONG_ACCOUNT | The invitation is used, withdrawn, expired, or for a different email |
LAST_ADMIN | The change would leave the business without an admin |
CHANGE_IN_PROGRESS | Another member change is still being approved |
NOT_CONFIRMED | The chain does not show the change yet; confirm again shortly |
NOT_DEPLOYED, DEPLOY_FAILED | The business account is not set up yet, or setting it up failed |
Transfer allow-list policy errors
| # | Name | Raised when |
|---|---|---|
| 4100 | NotInstalled | The account or rule has no allow-list |
| 4101 | AlreadyInstalled | The allow-list is already installed on that rule |
| 4102 | NoRecipients | The list is empty |
| 4103 | TooManyRecipients | More than 10 recipients |
| 4104 | OnlyCallContractAllowed | Installed on a rule not scoped to one contract |
| 4105 | NoAuthenticatedSigner | None of the rule's signers signed |
| 4106 | NotATransfer | Any token function other than transfer, including approve |
| 4107 | WrongSender | The transfer is not from the business account |
| 4108 | RecipientNotAllowed | The recipient is not on the list |
| 4109 | NegativeAmount | The amount is negative |
| 4110 | DuplicateRecipient | A recipient appears twice |
| 4111 | WrongContract | The call is to a different contract than the rule's |
Currency pool contract errors
| # | Name | Raised when |
|---|---|---|
| 1 | AlreadyInitialized | initialize called twice |
| 2 | NotInitialized | Contract not initialised |
| 3 | Unauthorized | Caller lacks the role |
| 4 | InvalidTerms | Strike, limit, spot or fair rate out of bounds; structure rules |
| 5 | InvalidAmount | Below 10 USDC, or no tenors at creation |
| 6 | PoolNotFound | |
| 7 | PositionNotFound | |
| 8 | Paused | Pool creation, deposit or purchase while paused |
| 9 | PoolNotAccepting | Pool not selling |
| 10 | TenorNotOffered | Tenor missing or inactive |
| 11 | TenorInvalid | Tenor outside 1 to 365, or preference above 365 |
| 12 | MarkupOutOfRange | Markup outside 9,000 to 50,000 bps |
| 13 | MaxTenorsReached | More than 16 tenors |
| 14 | StructureNotOffered | Pool does not sell the structure |
| 15 | CapOutOfBounds | Limit outside the pool's distance range (limited cover) |
| 16 | OpenCapMismatch | Open-cover limit does not equal open_cap(...) |
| 17 | InsufficientCapacity | Backers' free money smaller than the reserve |
| 18 | SlippageExceeded | Past deadline, or total above max_cost |
| 19 | QuoteExpired | Quote older than 120 s or dated in the future |
| 20 | QuoteReused | Nonce already used |
| 21 | NotReady | Settling before expiry, or no consensus yet |
| 22 | InvalidOracle | Consensus expiry mismatch, or rate outside 0.5× to 2× spot |
| 23 | AlreadySettled | Position not active |
| 24 | NotClaimable | Position not settled |
| 25 | NothingToClaim | Zero payout, or nothing to withdraw |
| 26 | NotEnoughShares | Withdrawal above available free money, or no account |
| 27 | RequestClosed | Withdrawal already executed or cancelled |
| 28 | NoticeNotOver | Withdrawal not yet unlocked |
| 29 | SettlementPending | Not raised by the current code |
| 30 | CapitalReserved | Requested amount no longer free |
| 31 | PoolHasNoValue | Not raised by the current code |
| 32 | ExternalLpClosed | Outside deposits not allowed |
| 33 | PairNotEnabled | Pair not enabled for new pools |
| 34 | Arithmetic | Overflow or invalid arithmetic |
| 35 | RequestNotFound | Unknown withdrawal request |
| 36 | OraclePolicyTooLoose | Oracle quorum, tolerance, freshness or cooldown weaker than required |
| 37 | DirectionNotOffered | Pool sells the other direction |
| 38 | StrikeTooClose | Strike nearer spot than the pool's minimum |
| 39 | TooManyLps | Pool already has 50 underwriters |
Oracle contract errors
| # | Name | Raised when |
|---|---|---|
| 1 | AlreadyInitialized | |
| 2 | NotInitialized | |
| 3 | Unauthorized | Not the owner |
| 4 | InvalidOracleSet | Too few or too many operators, or a removal would leave fewer than the quorum |
| 5 | OracleAlreadyRegistered | |
| 6 | OracleNotRegistered | Submitter not registered |
| 7 | InvalidQuorum | Quorum below 2 or above operator count |
| 8 | InvalidTolerance | Tolerance above the maximum, or zero freshness window |
| 9 | InvalidEvent | Id 0, or expiry differs from the first submission's |
| 10 | InvalidPrice | Zero price |
| 11 | AlreadyResolved | Consensus already recorded |
| 12 | CooldownActive | Same operator within the cooldown |
| 13 | TooEarly | Before expiry |