/** CCIP SDK error codes. Add new codes at end of each category. */ export const CCIPErrorCode = { // Chain/Network CHAIN_NOT_FOUND: 'CHAIN_NOT_FOUND', CHAIN_SELECTOR_NOT_FOUND: 'CHAIN_SELECTOR_NOT_FOUND', CHAIN_FAMILY_UNSUPPORTED: 'CHAIN_FAMILY_UNSUPPORTED', NETWORK_FAMILY_UNSUPPORTED: 'NETWORK_FAMILY_UNSUPPORTED', METHOD_UNSUPPORTED: 'METHOD_UNSUPPORTED', CHAIN_FAMILY_MISMATCH: 'CHAIN_FAMILY_MISMATCH', APTOS_NETWORK_UNKNOWN: 'APTOS_NETWORK_UNKNOWN', // Block & Transaction BLOCK_NOT_FOUND: 'BLOCK_NOT_FOUND', TRANSACTION_NOT_FOUND: 'TRANSACTION_NOT_FOUND', BLOCK_TIME_NOT_FOUND: 'BLOCK_TIME_NOT_FOUND', BLOCK_BEFORE_TIMESTAMP_NOT_FOUND: 'BLOCK_BEFORE_TIMESTAMP_NOT_FOUND', TRANSACTION_NOT_FINALIZED: 'TRANSACTION_NOT_FINALIZED', // CCIP Message MESSAGE_INVALID: 'MESSAGE_INVALID', MESSAGE_DECODE_FAILED: 'MESSAGE_DECODE_FAILED', MESSAGE_CCIP_DECODE_FAILED: 'MESSAGE_CCIP_DECODE_FAILED', MESSAGE_NOT_FOUND_IN_TX: 'MESSAGE_NOT_FOUND_IN_TX', MESSAGE_ID_NOT_FOUND: 'MESSAGE_ID_NOT_FOUND', MESSAGE_ID_INVALID: 'MESSAGE_ID_INVALID', MESSAGE_BATCH_INCOMPLETE: 'MESSAGE_BATCH_INCOMPLETE', MESSAGE_NOT_IN_BATCH: 'MESSAGE_NOT_IN_BATCH', MESSAGE_CHAIN_MISMATCH: 'MESSAGE_CHAIN_MISMATCH', MESSAGE_RETRIEVAL_FAILED: 'MESSAGE_RETRIEVAL_FAILED', MESSAGE_NOT_VERIFIED_YET: 'MESSAGE_NOT_VERIFIED_YET', // Lane & Routing OFFRAMP_NOT_FOUND: 'OFFRAMP_NOT_FOUND', ONRAMP_REQUIRED: 'ONRAMP_REQUIRED', LANE_VERSION_UNSUPPORTED: 'LANE_VERSION_UNSUPPORTED', LANE_NOT_FOUND: 'LANE_NOT_FOUND', // Commit & Merkle COMMIT_NOT_FOUND: 'COMMIT_NOT_FOUND', MERKLE_ROOT_MISMATCH: 'MERKLE_ROOT_MISMATCH', MERKLE_TREE_EMPTY: 'MERKLE_TREE_EMPTY', MERKLE_PROOF_EMPTY: 'MERKLE_PROOF_EMPTY', MERKLE_PROOF_TOO_LARGE: 'MERKLE_PROOF_TOO_LARGE', MERKLE_HASHES_TOO_LARGE: 'MERKLE_HASHES_TOO_LARGE', MERKLE_FLAGS_MISMATCH: 'MERKLE_FLAGS_MISMATCH', MERKLE_PROOF_FLAGS_MISMATCH: 'MERKLE_PROOF_FLAGS_MISMATCH', MERKLE_PROOF_INCOMPLETE: 'MERKLE_PROOF_INCOMPLETE', MERKLE_INTERNAL_ERROR: 'MERKLE_INTERNAL_ERROR', // Version VERSION_UNSUPPORTED: 'VERSION_UNSUPPORTED', HASHER_VERSION_UNSUPPORTED: 'HASHER_VERSION_UNSUPPORTED', VERSION_FEATURE_UNAVAILABLE: 'VERSION_FEATURE_UNAVAILABLE', VERSION_REQUIRES_LANE: 'VERSION_REQUIRES_LANE', MESSAGE_VERSION_INVALID: 'MESSAGE_VERSION_INVALID', // ExtraArgs EXTRA_ARGS_PARSE_FAILED: 'EXTRA_ARGS_PARSE_FAILED', EXTRA_ARGS_UNKNOWN: 'EXTRA_ARGS_UNKNOWN', EXTRA_ARGS_INVALID_EVM: 'EXTRA_ARGS_INVALID_EVM', EXTRA_ARGS_INVALID_SVM: 'EXTRA_ARGS_INVALID_SVM', EXTRA_ARGS_INVALID_SUI: 'EXTRA_ARGS_INVALID_SUI', EXTRA_ARGS_INVALID_APTOS: 'EXTRA_ARGS_INVALID_APTOS', EXTRA_ARGS_INVALID_TON: 'EXTRA_ARGS_INVALID_TON', EXTRA_ARGS_SOLANA_EVM_ONLY: 'EXTRA_ARGS_SOLANA_EVM_ONLY', EXTRA_ARGS_APTOS_RESTRICTION: 'EXTRA_ARGS_APTOS_RESTRICTION', EXTRA_ARGS_APTOS_V2_REQUIRED: 'EXTRA_ARGS_APTOS_V2_REQUIRED', EXTRA_ARGS_LENGTH_INVALID: 'EXTRA_ARGS_LENGTH_INVALID', // Contract Type & Validation CONTRACT_TYPE_INVALID: 'CONTRACT_TYPE_INVALID', CONTRACT_NOT_ROUTER: 'CONTRACT_NOT_ROUTER', TYPE_VERSION_INVALID: 'TYPE_VERSION_INVALID', REGISTRY_TYPE_INVALID: 'REGISTRY_TYPE_INVALID', // Address Validation ADDRESS_INVALID: 'ADDRESS_INVALID', // Token & Registry TOKEN_NOT_FOUND: 'TOKEN_NOT_FOUND', TOKEN_NOT_IN_REGISTRY: 'TOKEN_NOT_IN_REGISTRY', TOKEN_NOT_CONFIGURED: 'TOKEN_NOT_CONFIGURED', TOKEN_NOT_REGISTERED: 'TOKEN_NOT_REGISTERED', TOKEN_REMOTE_NOT_CONFIGURED: 'TOKEN_REMOTE_NOT_CONFIGURED', TOKEN_DECIMALS_INSUFFICIENT: 'TOKEN_DECIMALS_INSUFFICIENT', TOKEN_INVALID_SPL: 'TOKEN_INVALID_SPL', TOKEN_DATA_PARSE_FAILED: 'TOKEN_DATA_PARSE_FAILED', TOKEN_MINT_NOT_FOUND: 'TOKEN_MINT_NOT_FOUND', TOKEN_MINT_INVALID: 'TOKEN_MINT_INVALID', TOKEN_AMOUNT_INVALID: 'TOKEN_AMOUNT_INVALID', TOKEN_POOL_STATE_NOT_FOUND: 'TOKEN_POOL_STATE_NOT_FOUND', TOKEN_POOL_INFO_NOT_FOUND: 'TOKEN_POOL_INFO_NOT_FOUND', TOKEN_ACCOUNT_NOT_FOUND: 'TOKEN_ACCOUNT_NOT_FOUND', LEGACY_TOKEN_POOLS_UNSUPPORTED: 'LEGACY_TOKEN_POOLS_UNSUPPORTED', // Wallet & Signer WALLET_NOT_SIGNER: 'WALLET_NOT_SIGNER', WALLET_INVALID: 'WALLET_INVALID', // Execution EXEC_TX_NOT_CONFIRMED: 'EXEC_TX_NOT_CONFIRMED', EXEC_TX_REVERTED: 'EXEC_TX_REVERTED', EXECUTION_STATE_INVALID: 'EXECUTION_STATE_INVALID', RECEIPT_NOT_FOUND: 'RECEIPT_NOT_FOUND', // Attestation (USDC/LBTC) USDC_ATTESTATION_FAILED: 'USDC_ATTESTATION_FAILED', USDC_BURN_FEES_FAILED: 'USDC_BURN_FEES_FAILED', LBTC_ATTESTATION_ERROR: 'LBTC_ATTESTATION_ERROR', LBTC_ATTESTATION_NOT_FOUND: 'LBTC_ATTESTATION_NOT_FOUND', LBTC_ATTESTATION_NOT_APPROVED: 'LBTC_ATTESTATION_NOT_APPROVED', CCTP_DECODE_FAILED: 'CCTP_DECODE_FAILED', // Log & Event LOG_DATA_INVALID: 'LOG_DATA_INVALID', LOG_APTOS_INVALID: 'LOG_APTOS_INVALID', LOG_DATA_MISSING: 'LOG_DATA_MISSING', LOGS_NOT_FOUND: 'LOGS_NOT_FOUND', LOG_TOPICS_NOT_FOUND: 'LOG_TOPICS_NOT_FOUND', LOG_EVENT_HANDLER_UNKNOWN: 'LOG_EVENT_HANDLER_UNKNOWN', LOGS_WATCH_REQUIRES_FINALITY: 'LOGS_WATCH_REQUIRES_FINALITY', LOGS_WATCH_REQUIRES_START: 'LOGS_WATCH_REQUIRES_START', LOGS_REQUIRES_START: 'LOGS_REQUIRES_START', LOGS_ADDRESS_REQUIRED: 'LOGS_ADDRESS_REQUIRED', TOPICS_INVALID: 'TOPICS_INVALID', // Solana SOLANA_REF_ADDRESSES_NOT_FOUND: 'SOLANA_REF_ADDRESSES_NOT_FOUND', SOLANA_OFFRAMP_EVENTS_NOT_FOUND: 'SOLANA_OFFRAMP_EVENTS_NOT_FOUND', SOLANA_ROUTER_CONFIG_NOT_FOUND: 'SOLANA_ROUTER_CONFIG_NOT_FOUND', SOLANA_FEE_RESULT_INVALID: 'SOLANA_FEE_RESULT_INVALID', SOLANA_SIMULATION_NO_RETURN_DATA: 'SOLANA_SIMULATION_NO_RETURN_DATA', SOLANA_LOOKUP_TABLE_NOT_FOUND: 'SOLANA_LOOKUP_TABLE_NOT_FOUND', SOLANA_SOURCE_CHAIN_UNSUPPORTED: 'SOLANA_SOURCE_CHAIN_UNSUPPORTED', SOLANA_COMPUTE_UNITS_EXCEEDED: 'SOLANA_COMPUTE_UNITS_EXCEEDED', // Aptos APTOS_TX_INVALID: 'APTOS_TX_INVALID', APTOS_TX_TYPE_INVALID: 'APTOS_TX_TYPE_INVALID', APTOS_TX_TYPE_UNEXPECTED: 'APTOS_TX_TYPE_UNEXPECTED', APTOS_ADDRESS_MODULE_REQUIRED: 'APTOS_ADDRESS_MODULE_REQUIRED', APTOS_HASHER_VERSION_UNSUPPORTED: 'APTOS_HASHER_VERSION_UNSUPPORTED', APTOS_TOPIC_INVALID: 'APTOS_TOPIC_INVALID', // HTTP & RPC HTTP_ERROR: 'HTTP_ERROR', RPC_NOT_FOUND: 'RPC_NOT_FOUND', TIMEOUT: 'TIMEOUT', ABORT: 'ABORT', // API Client API_CLIENT_NOT_AVAILABLE: 'API_CLIENT_NOT_AVAILABLE', API_UNEXPECTED_PAGINATION: 'API_UNEXPECTED_PAGINATION', // Data Format DATA_FORMAT_UNSUPPORTED: 'DATA_FORMAT_UNSUPPORTED', DATA_PARSE_FAILED: 'DATA_PARSE_FAILED', BORSH_TYPE_UNKNOWN: 'BORSH_TYPE_UNKNOWN', BORSH_METHOD_UNKNOWN: 'BORSH_METHOD_UNKNOWN', // CLI & Validation ARGUMENT_INVALID: 'ARGUMENT_INVALID', INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE', INTERACTIVE_REQUIRED: 'INTERACTIVE_REQUIRED', // Internal NOT_IMPLEMENTED: 'NOT_IMPLEMENTED', UNKNOWN: 'UNKNOWN', // Viem Adapter VIEM_ADAPTER_ERROR: 'VIEM_ADAPTER_ERROR', // Canton CANTON_API_ERROR: 'CANTON_API_ERROR', } as const /** Union type of all error codes. */ export type CCIPErrorCode = (typeof CCIPErrorCode)[keyof typeof CCIPErrorCode] /** Codes where retry may succeed. */ export const TRANSIENT_ERROR_CODES = new Set([ CCIPErrorCode.BLOCK_NOT_FOUND, CCIPErrorCode.TRANSACTION_NOT_FOUND, CCIPErrorCode.BLOCK_TIME_NOT_FOUND, CCIPErrorCode.TRANSACTION_NOT_FINALIZED, CCIPErrorCode.MESSAGE_ID_NOT_FOUND, CCIPErrorCode.MESSAGE_BATCH_INCOMPLETE, CCIPErrorCode.MESSAGE_NOT_VERIFIED_YET, CCIPErrorCode.COMMIT_NOT_FOUND, CCIPErrorCode.RECEIPT_NOT_FOUND, CCIPErrorCode.USDC_ATTESTATION_FAILED, CCIPErrorCode.LBTC_ATTESTATION_ERROR, CCIPErrorCode.LBTC_ATTESTATION_NOT_FOUND, CCIPErrorCode.HTTP_ERROR, CCIPErrorCode.TIMEOUT, CCIPErrorCode.SOLANA_LOOKUP_TABLE_NOT_FOUND, CCIPErrorCode.SOLANA_REF_ADDRESSES_NOT_FOUND, ]) /** Returns true if error code is transient. */ export function isTransientError(code: CCIPErrorCode): boolean { return TRANSIENT_ERROR_CODES.has(code) }