Skip to main content
All x0 error codes follow a structured numbering scheme for easy identification:
RangeProgramDomain
0x1100–0x114Fx0-guardPolicy, transfer, and Blink errors
0x1108–0x121Fx0-escrowEscrow state and operation errors
0x1300–0x130Fx0-registryAgent registration errors
0x1400–0x140Fx0-reputationReputation tracking errors
0x1500–0x1515x0-tokenToken and confidential transfer errors
0x1600–0x164Fx0-wrapperWrapper, reserve, and governance errors
0x1700–0x1721x0-zk-verifierProof verification errors
Within each category, subcategories follow a consistent pattern:
Low nibble rangeSubcategory
0xNN00–0xNN0FCore / fundamental errors
0xNN10–0xNN1FConfiguration errors
0xNN20–0xNN2FState transition errors
0xNN30–0xNN3FValidation errors
0xNN40–0xNN4FAuthorization errors
0xNN50–0xNN5FRate limiting errors

X0GuardError

Policy Errors (0x1100)

CodeNameMessage
0x1101RecipientNotWhitelistedRecipient not whitelisted
0x1102DailyLimitExceededDaily spending limit exceeded
0x1103InvalidMerkleProofInvalid Merkle proof
0x1104InvalidBloomFilterInvalid Bloom filter configuration
0x1105PolicyNotFoundAgent policy not found
0x1106UnauthorizedSignerUnauthorized signer
0x1107ConfidentialTransferFailedConfidential transfer proof verification failed

Policy Configuration Errors (0x1110)

CodeNameMessage
0x1110DailyLimitTooHighDaily limit exceeds maximum
0x1111DailyLimitTooLowDaily limit below minimum
0x1112InvalidWhitelistConfigInvalid whitelist configuration
0x1113MissingMerkleProofMissing Merkle proof
0x1114PolicyAlreadyInitializedPolicy already initialized
0x1115PolicyOwnerMismatchPolicy owner mismatch
0x1116AgentSignerActiveAgent signer already active
0x1117RollingWindowOverflowRolling window overflow
0x1118DelegationRequiredDelegation required: agent must be delegate, not owner
0x1119TokenAccountOwnerMismatchToken account owner must match policy owner
0x111ASelfDelegationNotAllowedSelf-delegation not allowed
0x111BBoundTokenAccountMismatchTransfer must originate from bound token account
0x111CInvalidTokenAccountDataInvalid token account data
0x111DInvalidZkProofOwnerZK proof account must be owned by Token-2022 program
0x111EZkProofContextMismatchZK proof context does not match transfer parameters
0x111FMissingZkProofZK proof required for confidential transfer

Transfer Errors (0x1120)

CodeNameMessage
0x110AInsufficientFundsInsufficient funds
0x1120ZeroTransferAmountTransfer amount cannot be zero
0x1121TransferAmountTooHighTransfer amount exceeds maximum
0x1122InvalidMemoHashInvalid memo hash
0x1123InvalidTimestampInvalid timestamp
CodeNameMessage
0x1130BlinkRateLimitExceededBlink rate limit exceeded
0x1131BlinkExpiredBlink expired
0x1132InvalidBlinkSignatureInvalid Blink signature
0x1133BlinkAlreadyProcessedBlink already processed

Medium Severity Errors (0x1140)

CodeNameMessage
0x1140PolicyUpdateTooFrequentPolicy updates are rate limited — try again later
0x1141SingleTransactionLimitExceededTransaction exceeds single transaction limit
0x1142TransferAmountTooSmallTransfer amount below minimum threshold
0x1143ExtraMetasAlreadyInitializedExtra account metas already initialized
0x1144UnauthorizedExtraMetasInitializerOnly the mint authority can initialize extra account metas

X0EscrowError

State Errors (0x1108)

CodeNameMessage
0x1108EscrowExpiredEscrow timeout reached
0x1109InvalidEscrowStateInvalid escrow state for this operation

Configuration Errors (0x1200)

CodeNameMessage
0x1200EscrowTimeoutTooShortEscrow timeout too short
0x1201EscrowTimeoutTooLongEscrow timeout too long
0x1202SameBuyerAndSellerBuyer and seller must be different
0x1203InvalidArbiterInvalid arbiter
0x1204ZeroEscrowAmountEscrow amount cannot be zero
0x1205EscrowAlreadyExistsEscrow already exists
0x1206InvalidMintInvalid mint account

Operation Errors (0x1210)

CodeNameMessage
0x1210OnlyBuyerCanFundOnly buyer can fund escrow
0x1211OnlySellerCanDeliverOnly seller can mark as delivered
0x1212OnlyBuyerCanReleaseOnly buyer can release funds
0x1213OnlyArbiterCanResolveOnly arbiter can resolve dispute
0x1214InvalidEvidenceHashInvalid evidence hash
0x1215DisputeAlreadyInitiatedDispute already initiated
0x1216CannotDisputeBeforeDeliveryCannot dispute before delivery
0x1217ArbiterResolutionTooEarlyArbiter must wait for resolution delay period
0x1218DisputeEvidenceRequiredDispute evidence required before arbiter resolution

X0RegistryError

CodeNameMessage
0x1300AgentAlreadyRegisteredAgent already registered
0x1301AgentNotFoundAgent not found
0x1302InvalidEndpointInvalid endpoint URL
0x1303EndpointTooLongEndpoint too long
0x1304TooManyCapabilitiesToo many capabilities
0x1305InvalidCapabilityTypeInvalid capability type
0x1306CapabilityMetadataTooLongCapability metadata too long
0x1307InsufficientListingFeeInsufficient listing fee
0x1308UnauthorizedRegistryUpdateUnauthorized registry update
0x1309RegistryEntryExpiredRegistry entry expired

X0ReputationError

CodeNameMessage
0x1400ReputationNotFoundReputation account not found
0x1401ReputationAlreadyInitializedReputation already initialized
0x1402InvalidReputationUpdateInvalid reputation update
0x1403UnauthorizedReputationUpdateUnauthorized reputation update
0x1404InsufficientTransactionsInsufficient transactions for reputation
0x1405ReputationScoreOutOfRangeReputation score out of range
0x1406InvalidPolicyAccountInvalid policy account
0x1407UnauthorizedUnauthorized

X0TokenError

Token Errors (0x1500)

CodeNameMessage
0x1500MintAlreadyInitializedMint already initialized
0x1501InvalidMintAuthorityInvalid mint authority
0x1502InvalidTransferHookProgramInvalid transfer hook program
0x1503ConfidentialTransfersNotEnabledConfidential transfers not enabled
0x1504InvalidTokenDecimalsInvalid token decimals
0x1505TransferHookValidationFailedTransfer hook validation failed

Confidential Transfer Errors (0x1506)

CodeNameMessage
0x1506AccountNotConfiguredForConfidentialAccount not configured for confidential transfers
0x1507InvalidElGamalPubkeyInvalid ElGamal public key
0x1508InvalidPubkeyValidityProofInvalid pubkey validity proof
0x1509InvalidZeroCiphertextProofInvalid zero ciphertext proof
0x150AInvalidWithdrawProofInvalid withdraw proof
0x150BConfidentialBalanceInsufficientConfidential balance insufficient
0x150CPendingBalanceNotAppliedPending balance must be applied before this operation
0x150DMaxPendingBalanceCreditsExceededMaximum pending balance credit counter exceeded
0x150EConfidentialCreditsDisabledConfidential credits are disabled on this account
0x150FAmountExceedsConfidentialMaxAmount exceeds maximum for confidential transfers (2^48 - 1)
0x1510ProofContextMismatchProof context account does not match expected
0x1511ProofVerificationFailedZero-knowledge proof verification failed
0x1512AuditorPubkeyRequiredAuditor ElGamal pubkey is required for this operation
0x1513NonConfidentialCreditsDisabledNon-confidential credits are disabled on this account
0x1514AccountAlreadyConfiguredAccount is already configured for confidential transfers
0x1515InvalidDecryptableBalanceInvalid decryptable balance ciphertext format

X0WrapperError

State Errors (0x1600)

CodeNameMessage
0x1600WrapperPausedWrapper operations are paused
0x1601WrapperAlreadyInitializedWrapper already initialized
0x1602WrapperNotInitializedWrapper not initialized
0x1603InvalidUsdcMintInvalid USDC mint address
0x1604InvalidWrapperMintInvalid wrapper mint address
0x1605DecimalMismatchToken decimal mismatch
0x1606InvalidMintConfigurationInvalid mint configuration

Reserve & Invariant Errors (0x1610)

CodeNameMessage
0x1610InsufficientReserveInsufficient reserve balance
0x1611ReserveInvariantViolatedReserve invariant violated: reserve < supply
0x1612ReserveRatioWarningReserve ratio below warning threshold
0x1613ReserveRatioCriticalReserve ratio critical: undercollateralized

Amount & Fee Errors (0x1620)

CodeNameMessage
0x1620DepositTooSmallDeposit amount below minimum
0x1621RedemptionTooSmallRedemption amount below minimum
0x1622RedemptionTooLargeRedemption exceeds per-transaction limit
0x1623DailyRedemptionLimitExceededDaily redemption limit exceeded
0x1624FeeRateTooHighFee rate exceeds maximum allowed
0x1625FeeRateTooLowFee rate below minimum allowed
0x1626MathOverflowMath overflow in calculation
0x1627MathUnderflowMath underflow in calculation

Authorization Errors (0x1630)

CodeNameMessage
0x1630UnauthorizedUnauthorized: admin required
0x1631InvalidMultisigInvalid multisig configuration
0x1632NoPendingAdminTransferNo pending admin transfer
0x1633NotPendingAdminCaller is not the pending admin

Timelock Errors (0x1640)

CodeNameMessage
0x1640AdminActionNotFoundAdmin action not found
0x1641AdminActionAlreadyExecutedAdmin action already executed
0x1642AdminActionCancelledAdmin action was cancelled
0x1643TimelockNotExpiredTimelock period not yet expired
0x1644TimelockExpiredTimelock period has expired
0x1645InvalidActionTypeInvalid admin action type

X0ZkVerifierError

Proof Verification Errors (0x1700)

CodeNameMessage
0x1700ProofVerificationFailedZero-knowledge proof verification failed
0x1701InvalidProofDataInvalid proof data format
0x1702ProofContextExistsProof context already exists
0x1703InvalidProofTypeInvalid proof type
0x1704ProofExpiredProof has expired

Parameter Validation Errors (0x1710)

CodeNameMessage
0x1710AmountTooLargeAmount exceeds maximum (2^48 - 1)
0x1711InvalidElGamalPubkeyInvalid ElGamal public key
0x1712InvalidCiphertextInvalid ciphertext format
0x1713ProofSizeMismatchProof data size does not match expected size
0x1714RecipientMismatchRecipient does not match proof context
0x1715AmountMismatchAmount does not match proof context

Math Errors (0x1720)

CodeNameMessage
0x1720ArithmeticOverflowArithmetic overflow in calculation
0x1721ArithmeticUnderflowArithmetic underflow in calculation

Unified X0Error

For cross-program invocations, errors are wrapped in a unified type:
pub enum X0Error {
    Guard(X0GuardError),
    Escrow(X0EscrowError),
    Registry(X0RegistryError),
    Reputation(X0ReputationError),
    Token(X0TokenError),
    Wrapper(X0WrapperError),
}

Handling Errors in the SDK

import { AnchorError } from '@coral-xyz/anchor';

try {
  await client.transfer(recipient, amount);
} catch (err) {
  if (err instanceof AnchorError) {
    switch (err.error.errorCode.code) {
      case 'DailyLimitExceeded':
        // Generate a Blink for human approval
        break;
      case 'RecipientNotWhitelisted':
        // Recipient not in policy whitelist
        break;
      default:
        console.error(`Error ${err.error.errorCode.number}: ${err.error.errorMessage}`);
    }
  }
}
Last modified on February 8, 2026