uvd-x402-sdk 2.71.0 → 2.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/index.ts","../../src/chains/index.ts","../../src/utils/base64.ts","../../src/utils/x402.ts","../../src/escrow-preauth.ts","../../src/backend/index.ts"],"names":["requirements","reqOptions","ethers"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * uvd-x402-sdk - Type Definitions\n *\n * Core TypeScript interfaces for the x402 payment SDK.\n * These types define the contract between the SDK and consuming applications.\n */\n\n// ============================================================================\n// CHAIN CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Network type categorization\n * - 'evm': Ethereum Virtual Machine compatible chains (use EIP-712)\n * - 'svm': Solana Virtual Machine chains (Solana, Fogo) (use SPL tokens)\n * - 'stellar': Stellar network (use Soroban)\n * - 'near': NEAR Protocol (use NEP-366)\n * - 'algorand': Algorand network (use ASA transfers with atomic transactions)\n * - 'sui': Sui blockchain (use sponsored transactions)\n * - 'xrpl': XRP Ledger (use pre-signed Payment transaction blobs)\n *\n * @deprecated 'solana' type is deprecated, use 'svm' instead\n */\nexport type NetworkType = 'evm' | 'svm' | 'solana' | 'stellar' | 'near' | 'algorand' | 'sui' | 'xrpl';\n\n/**\n * Supported x402 payment schemes\n * - 'exact': Standard one-shot payment (default)\n * - 'escrow': Escrow-based payment with verify/settle/refund\n * - 'commerce': Commerce alias for escrow (marketplace integrations)\n */\nexport type X402Scheme = 'exact' | 'escrow' | 'commerce';\n\n/**\n * Supported stablecoin token types\n * - usdc: USD Coin (Circle) - 6 decimals\n * - eurc: Euro Coin (Circle) - 6 decimals\n * - ausd: Agora USD (Agora Finance) - 6 decimals\n * - pyusd: PayPal USD (PayPal/Paxos) - 6 decimals\n * - usdt: Tether USD (USDT0 omnichain via LayerZero) - 6 decimals\n * - usdg: Global Dollar (Paxos) - 6 decimals; settlement stablecoin on Robinhood Chain\n */\nexport type TokenType = 'usdc' | 'eurc' | 'ausd' | 'pyusd' | 'usdt' | 'usdg';\n\n/**\n * Token configuration for EIP-712 signing and transfers\n */\nexport interface TokenConfig {\n /** Contract/mint address */\n address: string;\n /** Token decimals (6 for all supported stablecoins) */\n decimals: number;\n /** Token name for EIP-712 domain (e.g., \"USD Coin\" or \"USDC\") */\n name: string;\n /** Token version for EIP-712 domain */\n version: string;\n}\n\n/**\n * USDC token configuration for a specific chain\n * @deprecated Use TokenConfig instead. This is kept for backward compatibility.\n */\nexport interface USDCConfig {\n /** Contract/mint address */\n address: string;\n /** Token decimals (6 for most chains, 7 for Stellar) */\n decimals: number;\n /** Token name for EIP-712 domain (e.g., \"USD Coin\" or \"USDC\") */\n name: string;\n /** Token version for EIP-712 domain */\n version: string;\n}\n\n/**\n * Native currency configuration\n */\nexport interface NativeCurrency {\n name: string;\n symbol: string;\n decimals: number;\n}\n\n/**\n * Complete chain configuration\n */\nexport interface ChainConfig {\n /** Numeric chain ID (0 for non-EVM chains) */\n chainId: number;\n /** Hex-encoded chain ID for wallet_switchEthereumChain */\n chainIdHex: string;\n /** Internal chain identifier (e.g., 'base', 'solana') */\n name: string;\n /** Human-readable display name */\n displayName: string;\n /** Network type for routing */\n networkType: NetworkType;\n /** Primary RPC endpoint URL */\n rpcUrl: string;\n /** Block explorer base URL */\n explorerUrl: string;\n /** Native currency info */\n nativeCurrency: NativeCurrency;\n /** USDC token configuration */\n usdc: USDCConfig;\n /**\n * Multi-token configurations (EVM chains only)\n * Maps token type to its configuration for this chain.\n * Not all tokens are available on all chains.\n */\n tokens?: Partial<Record<TokenType, TokenConfig>>;\n /** x402 facilitator configuration */\n x402: {\n facilitatorUrl: string;\n enabled: boolean;\n };\n}\n\n// ============================================================================\n// WALLET TYPES\n// ============================================================================\n\n/**\n * Current wallet connection state\n */\nexport interface WalletState {\n /** Whether a wallet is currently connected */\n connected: boolean;\n /** Connected wallet address (null if not connected) */\n address: string | null;\n /** Current chain ID (null for non-EVM or disconnected) */\n chainId: number | null;\n /** Current network name */\n network: string | null;\n /** Network type of connected wallet */\n networkType: NetworkType | null;\n /** USDC balance on current chain (null if unknown) */\n balance: string | null;\n}\n\n/**\n * Wallet adapter interface for different wallet types\n */\nexport interface WalletAdapter {\n /** Unique identifier for this wallet type */\n readonly id: string;\n /** Display name */\n readonly name: string;\n /** Network type this adapter supports */\n readonly networkType: NetworkType;\n\n /** Check if this wallet is available/installed */\n isAvailable(): boolean;\n\n /** Connect to the wallet */\n connect(chainName?: string): Promise<string>;\n\n /** Disconnect from the wallet */\n disconnect(): Promise<void>;\n\n /** Switch to a different chain (EVM only) */\n switchChain?(chainName: string): Promise<void>;\n\n /**\n * Sign a payment payload\n * For EVM chains, supports multi-token via paymentInfo.tokenType\n */\n signPayment(paymentInfo: PaymentInfo, chainConfig: ChainConfig): Promise<string>;\n\n /**\n * Check token balance (defaults to USDC for backward compatibility)\n * EVM providers may accept optional tokenType parameter\n */\n getBalance(chainConfig: ChainConfig, tokenType?: TokenType): Promise<string>;\n\n /** Get current address */\n getAddress(): string | null;\n\n /** Get current chain ID (EVM only) */\n getChainId?(): number | null;\n}\n\n/**\n * EIP-712 domain for typed data signing\n */\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\n/**\n * EIP-712 type definitions\n */\nexport interface EIP712Types {\n [typeName: string]: Array<{ name: string; type: string }>;\n}\n\n// ============================================================================\n// PAYMENT TYPES\n// ============================================================================\n\n/**\n * Payment information returned by backend on 402 response\n */\nexport interface PaymentInfo {\n /** Default recipient address */\n recipient: string;\n /** Network-specific recipient addresses */\n recipients?: {\n evm?: string;\n solana?: string;\n near?: string;\n stellar?: string;\n algorand?: string;\n sui?: string;\n xrpl?: string;\n };\n /** Facilitator address (for Solana fee payer) */\n facilitator?: string;\n /** Amount in USD (e.g., \"10.00\") */\n amount: string;\n /** Token symbol (usually \"USDC\") */\n token?: string;\n /**\n * Token type for multi-token support\n * Defaults to 'usdc' if not specified for backward compatibility\n */\n tokenType?: TokenType;\n /** Network hint from backend */\n network?: string;\n /** Supported chain IDs */\n supportedChains?: number[];\n}\n\n/**\n * Simple payment request from application\n */\nexport interface PaymentRequest {\n /** Amount in USDC (e.g., \"10.00\") */\n amount: string;\n /** Override recipient address (optional) */\n recipient?: string;\n /** Application-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * x402 payment header names\n *\n * - 'X-PAYMENT': v1 header name (default, most compatible)\n * - 'PAYMENT-SIGNATURE': v2 header name (newer standard)\n *\n * Both headers use the same base64-encoded JSON payload format.\n * The facilitator accepts both headers.\n */\nexport type X402HeaderName = 'X-PAYMENT' | 'PAYMENT-SIGNATURE';\n\n/**\n * Payment headers object containing both v1 and v2 header formats\n */\nexport interface PaymentHeaders {\n /** v1 header: X-PAYMENT */\n 'X-PAYMENT': string;\n /** v2 header: PAYMENT-SIGNATURE (same value, different header name) */\n 'PAYMENT-SIGNATURE': string;\n}\n\n/**\n * Result of a payment operation\n */\nexport interface PaymentResult {\n /** Whether payment was successful */\n success: boolean;\n /** Base64-encoded X-PAYMENT header value */\n paymentHeader: string;\n /**\n * Payment headers object for easy use with fetch/axios\n *\n * @example\n * ```ts\n * // Use v1 header\n * fetch(url, { headers: { 'X-PAYMENT': result.headers['X-PAYMENT'] } });\n *\n * // Use v2 header\n * fetch(url, { headers: { 'PAYMENT-SIGNATURE': result.headers['PAYMENT-SIGNATURE'] } });\n * ```\n */\n headers: PaymentHeaders;\n /** Transaction hash (if available) */\n transactionHash?: string;\n /** Network where payment was made */\n network: string;\n /** Payer address */\n payer?: string;\n /** Error message (if success is false) */\n error?: string;\n}\n\n// ============================================================================\n// PAYLOAD TYPES (Internal)\n// ============================================================================\n\n/**\n * EVM payment payload (ERC-3009 TransferWithAuthorization)\n */\nexport interface EVMPaymentPayload {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string;\n v: number;\n r: string;\n s: string;\n chainId: number;\n token: string;\n}\n\n/**\n * Token info for non-USDC stablecoins (e.g., Token2022 like AUSD)\n * Required in payload for facilitator to verify Token2022 transfers correctly.\n */\nexport interface TokenInfo {\n /** Token mint address */\n address: string;\n /** Token symbol (e.g., 'AUSD') */\n symbol: string;\n /** Token decimals (e.g., 6) */\n decimals: number;\n}\n\n/**\n * Solana payment payload (partially-signed transaction)\n */\nexport interface SolanaPaymentPayload {\n /** Base64-encoded serialized transaction */\n transaction: string;\n /**\n * Token info for non-USDC tokens (e.g., Token2022 like AUSD)\n * CRITICAL: Must be included for Token2022 tokens for facilitator verification\n */\n token?: TokenInfo;\n}\n\n/**\n * Stellar payment payload (Soroban authorization)\n */\nexport interface StellarPaymentPayload {\n /** Sender G... public key */\n from: string;\n /** Recipient G... public key */\n to: string;\n /** Amount in stroops (7 decimals) */\n amount: string;\n /** USDC SAC contract address */\n tokenContract: string;\n /** Base64 XDR-encoded SorobanAuthorizationEntry */\n authorizationEntryXdr: string;\n /** Random 64-bit nonce */\n nonce: number;\n /** Ledger when authorization expires */\n signatureExpirationLedger: number;\n}\n\n/**\n * NEAR payment payload (NEP-366 meta-transaction)\n */\nexport interface NEARPaymentPayload {\n /** Base64 Borsh-encoded SignedDelegateAction */\n signedDelegateAction: string;\n network: 'near';\n}\n\n/**\n * Algorand payment payload (atomic transaction group)\n *\n * Follows the GoPlausible x402-avm spec for atomic groups:\n * - Transaction 0: Fee payment (UNSIGNED) - facilitator -> facilitator, covers all fees\n * - Transaction 1: ASA transfer (SIGNED) - client -> merchant\n *\n * The facilitator signs transaction 0 and submits the complete atomic group.\n */\nexport interface AlgorandPaymentPayload {\n /** Index of the payment transaction in the group (always 1) */\n paymentIndex: number;\n /**\n * Array of base64-encoded msgpack transactions forming the atomic group:\n * - [0]: Unsigned fee transaction (facilitator signs)\n * - [1]: Signed ASA transfer (client signed)\n */\n paymentGroup: string[];\n}\n\n/**\n * Sui payment payload (sponsored transaction)\n *\n * Uses Sui sponsored transactions where:\n * - User creates a programmable transaction for USDC transfer\n * - User signs the transaction\n * - Facilitator sponsors (pays gas in SUI) and submits\n *\n * User pays: ZERO SUI\n */\nexport interface SuiPaymentPayload {\n /** Base64-encoded BCS serialized TransactionData */\n transactionBytes: string;\n /** Base64-encoded user signature */\n senderSignature: string;\n /** Sender address (0x + 64 hex chars) */\n from: string;\n /** Recipient address (0x + 64 hex chars) */\n to: string;\n /** Amount in base units (string to handle large numbers) */\n amount: string;\n /** Coin object ID used for the transfer (REQUIRED by facilitator) */\n coinObjectId: string;\n}\n\n/**\n * XRPL payment payload (pre-signed Payment transaction blob)\n *\n * Uses the t54 \"pre-signed Payment blob\" scheme on the XRP Ledger:\n * - The client builds and FULLY signs a Payment transaction off-chain,\n * paying its own XRP network fee.\n * - The single `signedTxBlob` field (hex-encoded fully-signed XRPL tx blob)\n * is sent to the facilitator, which decodes it to re-derive payer/amount/\n * destination and submits it.\n *\n * All payment-level fields (destination, amount, InvoiceID, SourceTag, etc.)\n * come from PaymentRequirements/extra, NOT from this payload.\n *\n * XRP is the native asset (6 decimals / drops). There is no token contract.\n *\n * The JSON field name is EXACTLY `signedTxBlob` (camelCase).\n */\nexport interface XRPLPaymentPayload {\n /** Hex-encoded fully-signed XRPL Payment transaction blob (tx_blob) */\n signedTxBlob: string;\n}\n\n/**\n * Union type for all payment payloads\n */\nexport type PaymentPayload =\n | EVMPaymentPayload\n | SolanaPaymentPayload\n | StellarPaymentPayload\n | NEARPaymentPayload\n | AlgorandPaymentPayload\n | SuiPaymentPayload\n | XRPLPaymentPayload;\n\n// ============================================================================\n// X402 HEADER TYPES (v1 and v2)\n// ============================================================================\n\n/**\n * x402 protocol version\n */\nexport type X402Version = 1 | 2;\n\n/**\n * CAIP-2 chain identifiers for x402 v2\n * @see https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md\n */\nexport const CAIP2_IDENTIFIERS: Record<string, string> = {\n // EVM chains\n base: 'eip155:8453',\n ethereum: 'eip155:1',\n polygon: 'eip155:137',\n arbitrum: 'eip155:42161',\n optimism: 'eip155:10',\n avalanche: 'eip155:43114',\n celo: 'eip155:42220',\n hyperevm: 'eip155:999',\n unichain: 'eip155:130',\n monad: 'eip155:143',\n bsc: 'eip155:56',\n scroll: 'eip155:534352',\n 'skale-base': 'eip155:1187947933',\n 'skale-base-sepolia': 'eip155:324705682',\n robinhood: 'eip155:4663',\n 'robinhood-testnet': 'eip155:46630',\n // SVM chains\n solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n fogo: 'svm:fogo',\n // Stellar\n stellar: 'stellar:pubnet',\n // NEAR\n near: 'near:mainnet',\n // Algorand\n algorand: 'algorand:mainnet',\n 'algorand-testnet': 'algorand:testnet',\n // Sui\n sui: 'sui:mainnet',\n 'sui-testnet': 'sui:testnet',\n // XRPL (XRP Ledger has no CAIP-2 form - the v1 string IS the network id)\n 'xrpl-mainnet': 'xrpl-mainnet',\n 'xrpl-testnet': 'xrpl-testnet',\n};\n\n/**\n * Reverse mapping from CAIP-2 to chain name\n */\nexport const CAIP2_TO_CHAIN: Record<string, string> = Object.fromEntries(\n Object.entries(CAIP2_IDENTIFIERS).map(([k, v]) => [v, k])\n);\n\n/**\n * x402 v1 header structure (network as string)\n */\nexport interface X402HeaderV1 {\n x402Version: 1;\n scheme: X402Scheme;\n network: string;\n payload: X402PayloadData;\n}\n\n/**\n * x402 v2 payment option\n */\nexport interface X402PaymentOption {\n network: string; // CAIP-2 format\n asset: string;\n amount: string;\n facilitator?: string;\n}\n\n/**\n * x402 v2 header structure (CAIP-2 network, accepts array)\n */\nexport interface X402HeaderV2 {\n x402Version: 2;\n scheme: X402Scheme;\n network: string; // CAIP-2 format\n payload: X402PayloadData;\n accepts?: X402PaymentOption[];\n}\n\n/**\n * Union type for both v1 and v2 headers\n */\nexport type X402Header = X402HeaderV1 | X402HeaderV2;\n\n/**\n * EVM-specific payload in x402 header\n */\nexport interface X402EVMPayload {\n signature: string;\n authorization: {\n from: string;\n to: string;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: string;\n };\n /**\n * Which token was actually paid.\n *\n * Only present when the payment is created with `includeTokenMetadata`. The\n * signature alone does not say which stablecoin it authorizes — a server that\n * accepts several tokens on the same chain cannot rebuild the payment\n * requirements without this. Omitted by default so existing v1 wire formats\n * stay byte-identical.\n */\n token?: PaymentTokenMetadata;\n}\n\n/**\n * Token identification carried inside an x402 payload.\n *\n * Mirrors what a resource server needs to build `paymentRequirements`: the\n * `asset` it must charge and the `extra` EIP-712 domain the facilitator needs\n * to recover the signature.\n */\nexport interface PaymentTokenMetadata {\n /** Token contract address (the `asset` of the payment requirements) */\n address: string;\n /** Uppercase token symbol, e.g. `USDC`, `EURC`, `USDT` */\n symbol: string;\n /** Token decimals — the amount in the authorization is in these units */\n decimals: number;\n /** EIP-712 domain of the token contract (the `extra` of the requirements) */\n eip712: {\n name: string;\n version: string;\n };\n}\n\n/**\n * Solana-specific payload in x402 header\n */\nexport interface X402SolanaPayload {\n transaction: string;\n}\n\n/**\n * Settlement account payload for Crossmint and other custodial wallets\n * that can only sendTransaction (not signTransaction).\n *\n * In this mode, the client already submitted the transaction on-chain.\n * The facilitator verifies the on-chain tx, then sweeps USDC from the\n * settlement account to the payTo address.\n *\n * Used by: Crossmint smart wallets via @faremeter/wallet-crossmint\n */\nexport interface X402SettlementAccountPayload {\n /** On-chain transaction signature (already submitted) */\n transactionSignature: string;\n /** Base58 secret key for sweeping settlement account (optional) */\n settleSecretKey?: string;\n /** Address to receive rent from closed settlement ATA (optional) */\n settlementRentDestination?: string;\n}\n\n/**\n * Stellar-specific payload in x402 header\n */\nexport interface X402StellarPayload {\n from: string;\n to: string;\n amount: string;\n tokenContract: string;\n authorizationEntryXdr: string;\n nonce: number;\n signatureExpirationLedger: number;\n}\n\n/**\n * NEAR-specific payload in x402 header\n */\nexport interface X402NEARPayload {\n signedDelegateAction: string;\n}\n\n/**\n * Algorand-specific payload in x402 header (atomic group format)\n */\nexport interface X402AlgorandPayload {\n /** Index of the payment transaction in the group (always 1) */\n paymentIndex: number;\n /** Array of base64-encoded msgpack transactions */\n paymentGroup: string[];\n}\n\n/**\n * Sui-specific payload in x402 header (sponsored transaction)\n */\nexport interface X402SuiPayload {\n /** BCS-encoded transaction bytes (base64) */\n transactionBytes: string;\n /** User's signature on the transaction (base64) */\n senderSignature: string;\n /** Sender's Sui address (0x...) */\n from: string;\n /** Recipient's Sui address (0x...) */\n to: string;\n /** Amount in smallest unit (string to avoid precision issues) */\n amount: string;\n /** Coin object ID used for the transfer (REQUIRED by facilitator) */\n coinObjectId: string;\n}\n\n/**\n * XRPL-specific payload in x402 header (t54 pre-signed Payment blob)\n *\n * The JSON field name is EXACTLY `signedTxBlob` (camelCase). The facilitator\n * decodes the blob to re-derive payer/amount/destination; no other fields are\n * carried in the payload.\n */\nexport interface X402XRPLPayload {\n /** Hex-encoded fully-signed XRPL Payment transaction blob (tx_blob) */\n signedTxBlob: string;\n}\n\n/**\n * Union of all x402 payload types\n */\nexport type X402PayloadData =\n | X402EVMPayload\n | X402SolanaPayload\n | X402SettlementAccountPayload\n | X402StellarPayload\n | X402NEARPayload\n | X402AlgorandPayload\n | X402SuiPayload\n | X402XRPLPayload;\n\n// ============================================================================\n// CLIENT CONFIGURATION\n// ============================================================================\n\n/**\n * Multi-payment configuration for supporting multiple networks\n */\nexport interface MultiPaymentConfig {\n /** Networks to support (e.g., ['base', 'solana', 'stellar', 'near']) */\n networks: string[];\n /** Default network if user hasn't selected one */\n defaultNetwork?: string;\n /** Whether to auto-detect user's preferred network based on wallet */\n autoDetect?: boolean;\n}\n\n/**\n * SDK client configuration options\n */\nexport interface X402ClientConfig {\n /** Facilitator URL (default: https://facilitator.ultravioletadao.xyz) */\n facilitatorUrl?: string;\n /** Default chain to connect to */\n defaultChain?: string;\n /** Auto-connect on initialization */\n autoConnect?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom chain configurations (override defaults) */\n customChains?: Record<string, Partial<ChainConfig>>;\n /** Wallet preference order */\n walletPreference?: string[];\n /** Custom RPC URLs (override defaults) */\n rpcOverrides?: Record<string, string>;\n /**\n * x402 protocol version to use\n * - 1: Classic format with network as string (e.g., \"base\")\n * - 2: CAIP-2 format with accepts array (e.g., \"eip155:8453\")\n * - 'auto': Auto-detect from 402 response (default)\n */\n x402Version?: X402Version | 'auto';\n /** Multi-payment configuration for supporting multiple networks */\n multiPayment?: MultiPaymentConfig;\n /**\n * Include a `token` block in the payload naming the asset, its decimals and\n * its EIP-712 domain.\n *\n * Needed when the resource accepts more than one stablecoin on the same\n * chain: the signature alone does not say which one was paid, so the server\n * cannot rebuild `paymentRequirements`. Off by default — the emitted header\n * stays byte-identical to previous versions.\n */\n includeTokenMetadata?: boolean;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Required<Pick<X402ClientConfig, 'facilitatorUrl' | 'defaultChain' | 'autoConnect' | 'debug' | 'x402Version'>> = {\n facilitatorUrl: 'https://facilitator.ultravioletadao.xyz',\n defaultChain: 'base',\n autoConnect: false,\n debug: false,\n x402Version: 'auto',\n};\n\n// ============================================================================\n// BALANCE TYPES\n// ============================================================================\n\n/**\n * Balance information for a single network\n */\nexport interface NetworkBalance {\n /** Chain name */\n chainName: string;\n /** Human-readable display name */\n displayName: string;\n /** Formatted balance (e.g., \"15.50\") or null if loading/error */\n balance: string | null;\n /** Whether balance is currently being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n// ============================================================================\n// EVENT TYPES\n// ============================================================================\n\n/**\n * Events emitted by the SDK client\n */\nexport type X402Event =\n | 'connect'\n | 'disconnect'\n | 'chainChanged'\n | 'accountChanged'\n | 'balanceChanged'\n | 'paymentStarted'\n | 'paymentSigned'\n | 'paymentCompleted'\n | 'paymentFailed';\n\n/**\n * Event data types\n */\nexport interface X402EventData {\n connect: WalletState;\n disconnect: void;\n chainChanged: { chainId: number; chainName: string };\n accountChanged: { address: string };\n balanceChanged: { balance: string };\n paymentStarted: { amount: string; network: string };\n paymentSigned: { paymentHeader: string };\n paymentCompleted: PaymentResult;\n paymentFailed: { error: string; code: X402ErrorCode };\n}\n\n/**\n * Event handler type\n */\nexport type X402EventHandler<E extends X402Event> = (data: X402EventData[E]) => void;\n\n// ============================================================================\n// ERROR TYPES\n// ============================================================================\n\n/**\n * Error codes for categorizing errors\n */\nexport type X402ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_CONNECTED'\n | 'WALLET_NOT_SUPPORTED'\n | 'WALLET_CONNECTION_FAILED'\n | 'WALLET_CONNECTION_REJECTED'\n | 'WALLET_CONNECTION_TIMEOUT'\n | 'CHAIN_NOT_SUPPORTED'\n | 'CHAIN_SWITCH_REJECTED'\n | 'INSUFFICIENT_BALANCE'\n | 'SIGNATURE_REJECTED'\n | 'PAYMENT_FAILED'\n | 'PAYMENT_TIMEOUT'\n | 'NETWORK_ERROR'\n | 'INVALID_CONFIG'\n | 'INVALID_AMOUNT'\n | 'INVALID_RECIPIENT'\n | 'UNKNOWN_ERROR';\n\n/**\n * SDK-specific error class\n */\nexport class X402Error extends Error {\n public readonly code: X402ErrorCode;\n public readonly details?: unknown;\n\n constructor(message: string, code: X402ErrorCode, details?: unknown) {\n super(message);\n this.name = 'X402Error';\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error);\n }\n }\n}\n","/**\n * uvd-x402-sdk - Chain Registry\n *\n * Complete configuration for all 25 supported blockchain networks.\n * EVM chains (15): Use ERC-3009 TransferWithAuthorization (includes Scroll, SKALE Base, Robinhood Chain mainnet + testnet)\n * SVM chains (2): Solana and Fogo - Use SPL tokens with partially-signed transactions\n * Stellar (1): Uses Soroban authorization entries\n * NEAR (1): Uses NEP-366 meta-transactions\n * Algorand (2): Uses ASA transfers with atomic transaction groups\n * Sui (2): Uses sponsored transactions (facilitator pays gas)\n * XRPL (2): Native XRP via pre-signed Payment transaction blobs (facilitator pays fee)\n */\n\nimport type { ChainConfig, NetworkType, TokenType, TokenConfig } from '../types';\n\n/**\n * Default facilitator URL for x402 payments\n */\nexport const DEFAULT_FACILITATOR_URL = 'https://facilitator.ultravioletadao.xyz';\n\n/**\n * All supported chains configuration\n *\n * To add a new chain:\n * 1. Add chain config below with all required fields\n * 2. Verify USDC contract supports ERC-3009 (transferWithAuthorization) for EVM chains\n * 3. Test on testnet first before enabling\n */\nexport const SUPPORTED_CHAINS: Record<string, ChainConfig> = {\n // ============================================================================\n // EVM CHAINS (15 networks)\n // ============================================================================\n\n base: {\n chainId: 8453,\n chainIdHex: '0x2105',\n name: 'base',\n displayName: 'Base',\n networkType: 'evm',\n rpcUrl: 'https://mainnet.base.org',\n explorerUrl: 'https://basescan.org',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42',\n decimals: 6,\n name: 'EURC',\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n avalanche: {\n chainId: 43114,\n chainIdHex: '0xa86a',\n name: 'avalanche',\n displayName: 'Avalanche C-Chain',\n networkType: 'evm',\n rpcUrl: 'https://avalanche-c-chain-rpc.publicnode.com',\n explorerUrl: 'https://snowtrace.io',\n nativeCurrency: {\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n },\n usdc: {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0xC891EB4cbdEFf6e073e859e987815Ed1505c2ACD',\n decimals: 6,\n name: 'EURC',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n ethereum: {\n chainId: 1,\n chainIdHex: '0x1',\n name: 'ethereum',\n displayName: 'Ethereum',\n networkType: 'evm',\n rpcUrl: 'https://eth.llamarpc.com',\n explorerUrl: 'https://etherscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c',\n decimals: 6,\n name: 'Euro Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n pyusd: {\n address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\n decimals: 6,\n name: 'PayPal USD',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n polygon: {\n chainId: 137,\n chainIdHex: '0x89',\n name: 'polygon',\n displayName: 'Polygon',\n networkType: 'evm',\n rpcUrl: 'https://polygon-rpc.com',\n explorerUrl: 'https://polygonscan.com',\n nativeCurrency: {\n name: 'Polygon',\n symbol: 'POL',\n decimals: 18,\n },\n usdc: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n arbitrum: {\n chainId: 42161,\n chainIdHex: '0xa4b1',\n name: 'arbitrum',\n displayName: 'Arbitrum One',\n networkType: 'evm',\n rpcUrl: 'https://arb1.arbitrum.io/rpc',\n explorerUrl: 'https://arbiscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n usdt: {\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n decimals: 6,\n name: 'USD₮0',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n optimism: {\n chainId: 10,\n chainIdHex: '0xa',\n name: 'optimism',\n displayName: 'Optimism',\n networkType: 'evm',\n rpcUrl: 'https://mainnet.optimism.io',\n explorerUrl: 'https://optimistic.etherscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n usdt: {\n address: '0x01bff41798a0bcf287b996046ca68b395dbc1071',\n decimals: 6,\n name: 'USD₮0',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n celo: {\n chainId: 42220,\n chainIdHex: '0xa4ec',\n name: 'celo',\n displayName: 'Celo',\n networkType: 'evm',\n rpcUrl: 'https://forno.celo.org',\n explorerUrl: 'https://celoscan.io',\n nativeCurrency: {\n name: 'Celo',\n symbol: 'CELO',\n decimals: 18,\n },\n usdc: {\n address: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n decimals: 6,\n name: 'USDC', // Celo uses \"USDC\" not \"USD Coin\" for EIP-712\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n decimals: 6,\n name: 'USDC', // Celo uses \"USDC\" not \"USD Coin\" for EIP-712\n version: '2',\n },\n usdt: {\n address: '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e',\n decimals: 6,\n name: 'Tether USD', // Celo USDT uses \"Tether USD\" for EIP-712\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n hyperevm: {\n chainId: 999,\n chainIdHex: '0x3e7',\n name: 'hyperevm',\n displayName: 'HyperEVM',\n networkType: 'evm',\n rpcUrl: 'https://rpc.hyperliquid.xyz/evm',\n explorerUrl: 'https://hyperevmscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xb88339CB7199b77E23DB6E890353E22632Ba630f',\n decimals: 6,\n name: 'USDC', // HyperEVM uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xb88339CB7199b77E23DB6E890353E22632Ba630f',\n decimals: 6,\n name: 'USDC', // HyperEVM uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n unichain: {\n chainId: 130,\n chainIdHex: '0x82',\n name: 'unichain',\n displayName: 'Unichain',\n networkType: 'evm',\n rpcUrl: 'https://unichain-rpc.publicnode.com',\n explorerUrl: 'https://uniscan.xyz',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x078d782b760474a361dda0af3839290b0ef57ad6',\n decimals: 6,\n name: 'USDC', // Unichain uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x078d782b760474a361dda0af3839290b0ef57ad6',\n decimals: 6,\n name: 'USDC', // Unichain uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n monad: {\n chainId: 143,\n chainIdHex: '0x8f',\n name: 'monad',\n displayName: 'Monad',\n networkType: 'evm',\n rpcUrl: 'https://rpc.monad.xyz',\n explorerUrl: 'https://monad.socialscan.io',\n nativeCurrency: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n usdc: {\n address: '0x754704bc059f8c67012fed69bc8a327a5aafb603',\n decimals: 6,\n name: 'USDC', // Monad uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x754704bc059f8c67012fed69bc8a327a5aafb603',\n decimals: 6,\n name: 'USDC', // Monad uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n usdt: {\n address: '0xe7cd86e13AC4309349F30B3435a9d337750fC82D',\n decimals: 6,\n name: 'USD\\u20AE0', // USD₮0 (USDT0 omnichain via LayerZero)\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n bsc: {\n chainId: 56,\n chainIdHex: '0x38',\n name: 'bsc',\n displayName: 'BNB Smart Chain',\n networkType: 'evm',\n rpcUrl: 'https://binance.llamarpc.com',\n explorerUrl: 'https://bscscan.com',\n nativeCurrency: {\n name: 'Binance Coin',\n symbol: 'BNB',\n decimals: 18,\n },\n usdc: {\n // Binance-Peg USDC — 18 decimals, NOT the 6 every other chain uses.\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n // Disabled on purpose: Binance-Peg USDC does not implement ERC-3009\n // `transferWithAuthorization`, so the exact scheme cannot settle it. The\n // entry exists so the 18-decimal figure is on record — assuming the usual\n // 6 here mis-prices a payment by 12 orders of magnitude.\n enabled: false,\n },\n },\n\n scroll: {\n chainId: 534352,\n chainIdHex: '0x82750',\n name: 'scroll',\n displayName: 'Scroll',\n networkType: 'evm',\n rpcUrl: 'https://rpc.scroll.io',\n explorerUrl: 'https://scrollscan.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'skale-base': {\n chainId: 1187947933,\n chainIdHex: '0x46cea59d',\n name: 'skale-base',\n displayName: 'SKALE Base',\n networkType: 'evm',\n rpcUrl: 'https://skale-base.skalenodes.com/v1/base',\n explorerUrl: 'https://skale-base-explorer.skalenodes.com',\n nativeCurrency: {\n name: 'CREDIT',\n symbol: 'CREDIT',\n decimals: 18,\n },\n usdc: {\n address: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'skale-base-sepolia': {\n chainId: 324705682,\n chainIdHex: '0x135a9d92',\n name: 'skale-base-sepolia',\n displayName: 'SKALE Base Sepolia',\n networkType: 'evm',\n rpcUrl: 'https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha',\n explorerUrl: 'https://base-sepolia-testnet-explorer.skalenodes.com',\n nativeCurrency: {\n name: 'CREDIT',\n symbol: 'CREDIT',\n decimals: 18,\n },\n usdc: {\n address: '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // Robinhood Chain (Arbitrum Orbit L2). NOTE: there is NO USDC on this chain -\n // the settlement stablecoin is Paxos USDG (Global Dollar). The `usdc` field\n // below carries USDG for interface compatibility (same pattern as XRPL's native\n // asset), and `tokens.usdg` is the canonical entry.\n // CRITICAL: USDG's on-chain version() getter REVERTS, so the EIP-712 domain\n // { name: 'Global Dollar', version: '1' } can NEVER be resolved on-chain and\n // MUST come from this config (mirrored into PaymentRequirements.extra by callers).\n robinhood: {\n chainId: 4663,\n chainIdHex: '0x1237',\n name: 'robinhood',\n displayName: 'Robinhood Chain',\n networkType: 'evm',\n rpcUrl: 'https://rpc.mainnet.chain.robinhood.com',\n explorerUrl: 'https://robinhoodchain.blockscout.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168', // Paxos USDG (no USDC on this chain)\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n tokens: {\n usdg: {\n address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168',\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'robinhood-testnet': {\n chainId: 46630,\n chainIdHex: '0xb626',\n name: 'robinhood-testnet',\n displayName: 'Robinhood Chain Testnet',\n networkType: 'evm',\n rpcUrl: 'https://rpc.testnet.chain.robinhood.com',\n explorerUrl: 'https://explorer.testnet.chain.robinhood.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x7E955252E15c84f5768B83c41a71F9eba181802F', // Paxos USDG testnet (no USDC on this chain)\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n tokens: {\n usdg: {\n address: '0x7E955252E15c84f5768B83c41a71F9eba181802F',\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // SVM CHAINS (2 networks) - Solana Virtual Machine\n // ============================================================================\n\n solana: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'solana',\n displayName: 'Solana',\n networkType: 'svm',\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n explorerUrl: 'https://solscan.io',\n nativeCurrency: {\n name: 'Solana',\n symbol: 'SOL',\n decimals: 9,\n },\n usdc: {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token mint\n decimals: 6,\n name: 'USD Coin',\n version: '1',\n },\n tokens: {\n usdc: {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token mint\n decimals: 6,\n name: 'USD Coin',\n version: '1',\n },\n ausd: {\n address: 'AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9', // AUSD Token2022 mint\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n fogo: {\n chainId: 0, // Non-EVM (SVM)\n chainIdHex: '0x0',\n name: 'fogo',\n displayName: 'Fogo',\n networkType: 'svm',\n rpcUrl: 'https://rpc.fogo.nightly.app/',\n explorerUrl: 'https://explorer.fogo.nightly.app',\n nativeCurrency: {\n name: 'Fogo',\n symbol: 'FOGO',\n decimals: 9,\n },\n usdc: {\n address: 'uSd2czE61Evaf76RNbq4KPpXnkiL3irdzgLFUMe3NoG', // Fogo USDC mint\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // STELLAR (1 network)\n // ============================================================================\n\n stellar: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'stellar',\n displayName: 'Stellar',\n networkType: 'stellar',\n rpcUrl: 'https://horizon.stellar.org',\n explorerUrl: 'https://stellar.expert/explorer/public',\n nativeCurrency: {\n name: 'Lumens',\n symbol: 'XLM',\n decimals: 7, // Stellar uses 7 decimals (stroops)\n },\n usdc: {\n address: 'CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75', // Soroban Asset Contract\n decimals: 7, // Stellar USDC uses 7 decimals\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // NEAR (1 network) - Uses NEP-366 meta-transactions\n // ============================================================================\n\n near: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'near',\n displayName: 'NEAR Protocol',\n networkType: 'near',\n rpcUrl: 'https://rpc.mainnet.near.org',\n explorerUrl: 'https://nearblocks.io',\n nativeCurrency: {\n name: 'NEAR',\n symbol: 'NEAR',\n decimals: 24, // NEAR uses 24 decimals (yoctoNEAR)\n },\n usdc: {\n address: '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1', // Native Circle USDC\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true, // NEP-366 meta-transactions supported\n },\n },\n\n // ============================================================================\n // ALGORAND (2 networks) - Uses ASA transfers with atomic transaction groups\n // ============================================================================\n\n algorand: {\n chainId: 0, // Non-EVM (Algorand uses genesis hash for network identification)\n chainIdHex: '0x0',\n name: 'algorand',\n displayName: 'Algorand',\n networkType: 'algorand',\n rpcUrl: 'https://mainnet-api.algonode.cloud',\n explorerUrl: 'https://allo.info',\n nativeCurrency: {\n name: 'Algo',\n symbol: 'ALGO',\n decimals: 6, // Algorand uses 6 decimals (microAlgos)\n },\n usdc: {\n address: '31566704', // USDC ASA ID on Algorand mainnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '31566704', // USDC ASA ID on Algorand mainnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'algorand-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'algorand-testnet',\n displayName: 'Algorand Testnet',\n networkType: 'algorand',\n rpcUrl: 'https://testnet-api.algonode.cloud',\n explorerUrl: 'https://testnet.allo.info',\n nativeCurrency: {\n name: 'Algo',\n symbol: 'ALGO',\n decimals: 6,\n },\n usdc: {\n address: '10458941', // USDC ASA ID on Algorand testnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '10458941', // USDC ASA ID on Algorand testnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // SUI (2 networks) - Uses sponsored transactions (facilitator pays gas)\n // ============================================================================\n\n sui: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'sui',\n displayName: 'Sui',\n networkType: 'sui',\n rpcUrl: 'https://fullnode.mainnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/mainnet',\n nativeCurrency: {\n name: 'Sui',\n symbol: 'SUI',\n decimals: 9,\n },\n usdc: {\n // USDC coin type on Sui mainnet\n address: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n ausd: {\n // AUSD (Agora USD) coin type on Sui mainnet\n address: '0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD',\n decimals: 6,\n name: 'AUSD',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'sui-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'sui-testnet',\n displayName: 'Sui Testnet',\n networkType: 'sui',\n rpcUrl: 'https://fullnode.testnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/testnet',\n nativeCurrency: {\n name: 'Sui',\n symbol: 'SUI',\n decimals: 9,\n },\n usdc: {\n // USDC coin type on Sui testnet\n address: '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // XRPL (2 networks) - XRP Ledger, native XRP via pre-signed Payment blobs\n // ============================================================================\n\n 'xrpl-mainnet': {\n chainId: 0, // Non-EVM (XRPL uses network id strings, no numeric chain ID)\n chainIdHex: '0x0',\n name: 'xrpl-mainnet',\n displayName: 'XRP Ledger',\n networkType: 'xrpl',\n rpcUrl: 'https://xrplcluster.com',\n explorerUrl: 'https://livenet.xrpl.org',\n nativeCurrency: {\n name: 'XRP',\n symbol: 'XRP',\n decimals: 6, // XRPL uses 6 decimals (drops); 1 XRP = 1,000,000 drops\n },\n // XRPL settles in native XRP - there is no USDC/token contract.\n // The `usdc` field describes the native asset for interface compatibility.\n usdc: {\n address: 'XRP', // Native asset - no token contract\n decimals: 6,\n name: 'XRP',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'xrpl-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'xrpl-testnet',\n displayName: 'XRP Ledger Testnet',\n networkType: 'xrpl',\n rpcUrl: 'https://s.altnet.rippletest.net:51234',\n explorerUrl: 'https://testnet.xrpl.org',\n nativeCurrency: {\n name: 'XRP',\n symbol: 'XRP',\n decimals: 6,\n },\n // XRPL settles in native XRP - there is no USDC/token contract.\n usdc: {\n address: 'XRP', // Native asset - no token contract\n decimals: 6,\n name: 'XRP',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n};\n\n/**\n * Default chain for new users\n */\nexport const DEFAULT_CHAIN = 'base';\n\n/**\n * Get chain config by chain ID\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(SUPPORTED_CHAINS).find(chain => chain.chainId === chainId);\n}\n\n/**\n * Get chain config by name (case-insensitive)\n */\nexport function getChainByName(name: string): ChainConfig | undefined {\n return SUPPORTED_CHAINS[name.toLowerCase()];\n}\n\n/**\n * Check if a chain is supported\n */\nexport function isChainSupported(chainIdOrName: number | string): boolean {\n if (typeof chainIdOrName === 'number') {\n return Object.values(SUPPORTED_CHAINS).some(chain => chain.chainId === chainIdOrName);\n }\n return chainIdOrName.toLowerCase() in SUPPORTED_CHAINS;\n}\n\n/**\n * Get list of enabled chains\n */\nexport function getEnabledChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(chain => chain.x402.enabled);\n}\n\n/**\n * Get list of chains by network type\n */\nexport function getChainsByNetworkType(networkType: NetworkType): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === networkType && chain.x402.enabled\n );\n}\n\n/**\n * Get all EVM chain IDs (for wallet_switchEthereumChain)\n */\nexport function getEVMChainIds(): number[] {\n return getChainsByNetworkType('evm').map(chain => chain.chainId);\n}\n\n/**\n * Get list of SVM chains (Solana, Fogo)\n */\nexport function getSVMChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'svm' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is SVM-based (Solana Virtual Machine)\n */\nexport function isSVMChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'svm';\n}\n\n/**\n * Get list of Sui chains\n */\nexport function getSuiChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'sui' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is Sui-based\n */\nexport function isSuiChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'sui';\n}\n\n/**\n * Get network type from chain name\n */\nexport function getNetworkType(chainName: string): NetworkType | undefined {\n const chain = getChainByName(chainName);\n return chain?.networkType;\n}\n\n/**\n * Format transaction URL for block explorer\n */\nexport function getExplorerTxUrl(chainName: string, txHash: string): string | null {\n const chain = getChainByName(chainName);\n if (!chain) return null;\n\n switch (chain.networkType) {\n case 'evm':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'svm':\n case 'solana': // @deprecated\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'stellar':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'near':\n return `${chain.explorerUrl}/txns/${txHash}`;\n case 'algorand':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'sui':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'xrpl':\n return `${chain.explorerUrl}/transactions/${txHash}`;\n default:\n return null;\n }\n}\n\n/**\n * Format address URL for block explorer\n */\nexport function getExplorerAddressUrl(chainName: string, address: string): string | null {\n const chain = getChainByName(chainName);\n if (!chain) return null;\n\n switch (chain.networkType) {\n case 'evm':\n return `${chain.explorerUrl}/address/${address}`;\n case 'svm':\n case 'solana': // @deprecated\n return `${chain.explorerUrl}/account/${address}`;\n case 'stellar':\n return `${chain.explorerUrl}/account/${address}`;\n case 'near':\n return `${chain.explorerUrl}/address/${address}`;\n case 'algorand':\n return `${chain.explorerUrl}/account/${address}`;\n case 'sui':\n return `${chain.explorerUrl}/account/${address}`;\n case 'xrpl':\n return `${chain.explorerUrl}/accounts/${address}`;\n default:\n return null;\n }\n}\n\n/**\n * Get list of Algorand chains\n */\nexport function getAlgorandChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'algorand' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is Algorand-based\n */\nexport function isAlgorandChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'algorand';\n}\n\n/**\n * Get list of XRPL chains (XRP Ledger mainnet/testnet)\n */\nexport function getXRPLChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'xrpl' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is XRPL-based (XRP Ledger)\n */\nexport function isXRPLChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'xrpl';\n}\n\n// ============================================================================\n// MULTI-TOKEN SUPPORT FUNCTIONS\n// ============================================================================\n\n/**\n * Get token configuration for a specific chain and token type\n * Falls back to USDC config if token not found (for backward compatibility)\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns Token configuration or undefined if chain not found\n */\nexport function getTokenConfig(\n chainName: string,\n tokenType: TokenType = 'usdc'\n): TokenConfig | undefined {\n const chain = getChainByName(chainName);\n if (!chain) return undefined;\n\n // Try to get from tokens map first (new multi-token support)\n if (chain.tokens && chain.tokens[tokenType]) {\n return chain.tokens[tokenType];\n }\n\n // Fall back to usdc config for backward compatibility\n if (tokenType === 'usdc') {\n return chain.usdc;\n }\n\n return undefined;\n}\n\n/**\n * Find which token of a chain a contract address belongs to.\n *\n * The signed payload carries the token *address*, but a server that accepts\n * several stablecoins on the same chain needs the symbol, the decimals and the\n * EIP-712 domain to rebuild the payment requirements. This resolves the address\n * back to the registry entry so that metadata can travel with the payment.\n *\n * @param chainName - Chain name (e.g., 'optimism')\n * @param address - Token contract address (case-insensitive on EVM)\n * @returns The token type and its config, or undefined if the address is not in the registry\n */\nexport function getTokenByAddress(\n chainName: string,\n address: string\n): { tokenType: TokenType; config: TokenConfig } | undefined {\n const chain = getChainByName(chainName);\n if (!chain || !address) return undefined;\n\n const wanted = address.startsWith('0x') ? address.toLowerCase() : address;\n const matches = (candidate: string): boolean =>\n (candidate.startsWith('0x') ? candidate.toLowerCase() : candidate) === wanted;\n\n if (chain.tokens) {\n for (const [tokenType, config] of Object.entries(chain.tokens)) {\n if (config && matches(config.address)) {\n return { tokenType: tokenType as TokenType, config };\n }\n }\n }\n\n if (chain.usdc && matches(chain.usdc.address)) {\n return { tokenType: 'usdc', config: chain.usdc };\n }\n\n return undefined;\n}\n\n/**\n * Get list of supported tokens for a chain\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @returns Array of supported token types, or empty array if chain not found\n */\nexport function getSupportedTokens(chainName: string): TokenType[] {\n const chain = getChainByName(chainName);\n if (!chain) return [];\n\n // If tokens map exists, return its keys\n if (chain.tokens) {\n return Object.keys(chain.tokens) as TokenType[];\n }\n\n // Default to just USDC for chains without explicit tokens map\n return ['usdc'];\n}\n\n/**\n * Check if a token is supported on a specific chain\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns true if token is supported on the chain\n */\nexport function isTokenSupported(chainName: string, tokenType: TokenType): boolean {\n const chain = getChainByName(chainName);\n if (!chain) return false;\n\n // Check tokens map\n if (chain.tokens && chain.tokens[tokenType]) {\n return true;\n }\n\n // USDC is always supported (backward compatibility)\n if (tokenType === 'usdc') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get all chains that support a specific token\n *\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns Array of chain configs that support the token\n */\nexport function getChainsByToken(tokenType: TokenType): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(chain => {\n if (!chain.x402.enabled) return false;\n if (chain.tokens && chain.tokens[tokenType]) return true;\n if (tokenType === 'usdc') return true; // USDC is universal\n return false;\n });\n}\n","/**\n * uvd-x402-sdk - UTF-8 safe base64\n *\n * `btoa()` only accepts code points 0-255. Any character above that throws\n * `InvalidCharacterError`, and the X-PAYMENT payload is not guaranteed to be\n * ASCII: the EIP-712 domain name of USDT on Optimism and Arbitrum is literally\n * `USD₮0` (U+20AE). A header carrying that name crashes a plain `btoa()`.\n *\n * So the JSON is UTF-8 encoded to bytes first, and only then base64'd. Decoding\n * reverses it. For ASCII-only input the output is byte-identical to\n * `btoa(json)`, which is why swapping this in cannot change any existing header.\n *\n * `TextEncoder`/`TextDecoder` are available in every browser the SDK targets and\n * in Node 11+; `btoa`/`atob` are used for the byte<->base64 step because they\n * exist in both environments without pulling in `Buffer`.\n */\n\n/**\n * Encode a string as base64, handling non-ASCII characters correctly.\n *\n * @param value - Any UTF-8 string\n * @returns Base64-encoded value\n */\nexport function encodeBase64Utf8(value: string): string {\n const bytes = new TextEncoder().encode(value);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode a base64 string produced by {@link encodeBase64Utf8}.\n *\n * @param encoded - Base64-encoded value\n * @returns The original UTF-8 string\n */\nexport function decodeBase64Utf8(encoded: string): string {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * JSON-serialize a value and encode it as UTF-8 safe base64.\n *\n * This is the encoder for every X-PAYMENT header the SDK emits.\n *\n * @param value - Value to serialize\n * @returns Base64-encoded JSON\n */\nexport function encodeBase64Json(value: unknown): string {\n return encodeBase64Utf8(JSON.stringify(value));\n}\n","/**\n * uvd-x402-sdk - x402 Protocol Utilities\n *\n * Utilities for working with x402 v1 and v2 protocols.\n * Handles version detection, payload encoding, and CAIP-2 conversions.\n */\n\nimport type {\n X402Header,\n X402HeaderV1,\n X402HeaderV2,\n X402PayloadData,\n X402PaymentOption,\n X402Version,\n ChainConfig,\n} from '../types';\nimport { CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN } from '../types';\nimport { getChainByName } from '../chains';\nimport { decodeBase64Utf8, encodeBase64Json } from './base64';\n\n/**\n * Detect x402 version from a response header or body\n *\n * @param data - The 402 response data (parsed JSON or header value)\n * @returns The detected version (1 or 2)\n */\nexport function detectX402Version(data: unknown): X402Version {\n if (typeof data === 'string') {\n // A `PAYMENT-REQUIRED` header value is base64 JSON, and the doc above\n // invites one. Returning 1 without decoding misread every v2 challenge as\n // v1 — silently, as a plausible value rather than an error, and the two\n // wire forms are structurally incompatible.\n //\n // This is not hypothetical: measured 2026-08-20, 36 of 36 live Bazaar\n // resources answering 402 carry the challenge in the header, and several\n // put a free content preview in the body, so the header is the only place\n // the version signal exists.\n const trimmed = data.trim();\n if (!trimmed) return 1;\n for (const decode of [\n () => JSON.parse(decodeBase64Utf8(trimmed)),\n () => JSON.parse(trimmed),\n ]) {\n try {\n const parsed = decode();\n if (typeof parsed === 'object' && parsed !== null) {\n return detectX402Version(parsed);\n }\n } catch {\n // not this encoding; try the next\n }\n }\n return 1; // undecodable: fall back to v1, as before\n }\n\n if (typeof data !== 'object' || data === null) {\n return 1; // Default to v1\n }\n\n const obj = data as Record<string, unknown>;\n\n // Check explicit version field\n if (obj.x402Version === 2) {\n return 2;\n }\n\n // Check for v2 indicators\n if (obj.accepts && Array.isArray(obj.accepts)) {\n return 2;\n }\n\n // `paymentRequirements` is the v1 spelling, so its presence points at v1 --\n // but only when there is no v2 signal, which the checks above already ruled\n // out. Recognised so the value is not treated as an unknown shape.\n if (Array.isArray(obj.paymentRequirements)) {\n return 1;\n }\n\n // Check if network is in CAIP-2 format\n if (typeof obj.network === 'string') {\n if (obj.network.includes(':')) {\n return 2;\n }\n }\n\n return 1;\n}\n\n/**\n * Convert chain name to CAIP-2 identifier\n *\n * @param chainName - Chain name (e.g., 'base', 'solana')\n * @returns CAIP-2 identifier (e.g., 'eip155:8453', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp')\n */\nexport function chainToCAIP2(chainName: string): string {\n const caip2 = CAIP2_IDENTIFIERS[chainName.toLowerCase()];\n if (caip2) {\n return caip2;\n }\n\n // Try to construct from chain config\n const chain = getChainByName(chainName);\n if (chain) {\n if (chain.networkType === 'evm') {\n return `eip155:${chain.chainId}`;\n }\n // For non-EVM, return the name as-is with network prefix\n return `${chain.networkType}:${chainName}`;\n }\n\n return chainName; // Return as-is if unknown\n}\n\n/**\n * Convert CAIP-2 identifier to chain name\n *\n * @param caip2 - CAIP-2 identifier\n * @returns Chain name or null if unknown\n */\nexport function caip2ToChain(caip2: string): string | null {\n // Check direct mapping\n if (CAIP2_TO_CHAIN[caip2]) {\n return CAIP2_TO_CHAIN[caip2];\n }\n\n // Try to extract from EIP-155 format\n const match = caip2.match(/^eip155:(\\d+)$/);\n if (match) {\n const chainId = parseInt(match[1], 10);\n // Find chain by ID\n for (const [name, _config] of Object.entries(CAIP2_IDENTIFIERS)) {\n const chain = getChainByName(name);\n if (chain?.chainId === chainId) {\n return name;\n }\n }\n }\n\n // Try to extract from network:name format\n const parts = caip2.split(':');\n if (parts.length === 2) {\n const networkName = parts[1];\n if (getChainByName(networkName)) {\n return networkName;\n }\n }\n\n return null;\n}\n\n/**\n * Parse network identifier from either v1 or v2 format\n *\n * @param network - Network identifier (v1 string or v2 CAIP-2)\n * @returns Normalized chain name\n */\nexport function parseNetworkIdentifier(network: string): string {\n // If it contains a colon, it's likely CAIP-2\n if (network.includes(':')) {\n return caip2ToChain(network) || network;\n }\n return network.toLowerCase();\n}\n\n/**\n * Encode x402 payload as base64 header value\n *\n * @param header - The x402 header object\n * @returns Base64-encoded string\n */\nexport function encodeX402Header(header: X402Header): string {\n return encodeBase64Json(header);\n}\n\n/**\n * Decode x402 header from base64 string\n *\n * @param encoded - Base64-encoded header value\n * @returns Parsed x402 header\n */\nexport function decodeX402Header(encoded: string): X402Header {\n const json = decodeBase64Utf8(encoded);\n return JSON.parse(json) as X402Header;\n}\n\n/**\n * Create x402 v1 header\n *\n * @param network - Chain name (e.g., 'base')\n * @param payload - Network-specific payload\n * @returns x402 v1 header object\n */\nexport function createX402V1Header(\n network: string,\n payload: X402PayloadData\n): X402HeaderV1 {\n return {\n x402Version: 1,\n scheme: 'exact',\n network,\n payload,\n };\n}\n\n/**\n * Create x402 v2 header\n *\n * @param network - CAIP-2 network identifier\n * @param payload - Network-specific payload\n * @param accepts - Optional array of payment options\n * @returns x402 v2 header object\n */\nexport function createX402V2Header(\n network: string,\n payload: X402PayloadData,\n accepts?: X402PaymentOption[]\n): X402HeaderV2 {\n const header: X402HeaderV2 = {\n x402Version: 2,\n scheme: 'exact',\n network: network.includes(':') ? network : chainToCAIP2(network),\n payload,\n };\n\n if (accepts && accepts.length > 0) {\n header.accepts = accepts;\n }\n\n return header;\n}\n\n/**\n * Create x402 header with automatic version selection\n *\n * @param chainConfig - Chain configuration\n * @param payload - Network-specific payload\n * @param version - Version to use (1, 2, or 'auto')\n * @returns x402 header object\n */\nexport function createX402Header(\n chainConfig: ChainConfig,\n payload: X402PayloadData,\n version: X402Version | 'auto' = 'auto'\n): X402Header {\n // Default to v1 for maximum compatibility\n const effectiveVersion = version === 'auto' ? 1 : version;\n\n if (effectiveVersion === 2) {\n return createX402V2Header(chainConfig.name, payload);\n }\n\n return createX402V1Header(chainConfig.name, payload);\n}\n\n/**\n * Generate payment options array for multi-network support\n *\n * @param chainConfigs - Array of chain configurations\n * @param amount - Amount in USDC (e.g., \"10.00\")\n * @param facilitator - Optional facilitator URL override\n * @returns Array of x402 v2 payment options\n */\nexport function generatePaymentOptions(\n chainConfigs: ChainConfig[],\n amount: string,\n facilitator?: string\n): X402PaymentOption[] {\n // Convert amount to atomic units for each chain\n return chainConfigs\n .filter(chain => chain.x402.enabled)\n .map(chain => {\n const atomicAmount = Math.floor(\n parseFloat(amount) * Math.pow(10, chain.usdc.decimals)\n ).toString();\n\n return {\n network: chainToCAIP2(chain.name),\n asset: chain.usdc.address,\n amount: atomicAmount,\n facilitator: facilitator || chain.x402.facilitatorUrl,\n };\n });\n}\n\n/**\n * Check if a network string is in CAIP-2 format\n *\n * @param network - Network identifier\n * @returns True if CAIP-2 format\n */\nexport function isCAIP2Format(network: string): boolean {\n return network.includes(':');\n}\n\n/**\n * Convert between x402 v1 and v2 header formats\n *\n * @param header - Source header\n * @param targetVersion - Target version\n * @returns Converted header\n */\nexport function convertX402Header(\n header: X402Header,\n targetVersion: X402Version\n): X402Header {\n if (header.x402Version === targetVersion) {\n return header;\n }\n\n if (targetVersion === 2) {\n // v1 -> v2\n return {\n x402Version: 2,\n scheme: 'exact',\n network: chainToCAIP2(header.network),\n payload: header.payload,\n };\n } else {\n // v2 -> v1\n const chainName = isCAIP2Format(header.network)\n ? caip2ToChain(header.network) || header.network\n : header.network;\n\n return {\n x402Version: 1,\n scheme: 'exact',\n network: chainName,\n payload: header.payload,\n };\n }\n}\n\n/**\n * Read a 402 payment challenge from wherever the seller put it.\n *\n * x402 allows BOTH transports and sellers pick freely:\n *\n * - base64 JSON in the `PAYMENT-REQUIRED` (or `X-PAYMENT-REQUIRED`) header\n * - JSON in the response body\n *\n * Measured against production on 2026-08-20: of 40 live Bazaar resources,\n * **36 of 36 that answered 402 carried the challenge in the header, and none in\n * the body**. Worse, sellers like Tenjin use the 402 body for a free preview of\n * the paid content — so the body is valid JSON that simply has no `accepts`, and\n * a body-only reader parses it happily and finds nothing.\n *\n * Reads the header first because that is where live sellers put it, and falls\n * back to the body so the sellers who use it keep working.\n *\n * Returns `null` when neither transport carries a challenge — a real \"no terms\n * here\", distinct from a challenge we failed to decode.\n */\nexport function paymentChallengeFrom(\n headers: { get(name: string): string | null } | Record<string, string>,\n body?: unknown,\n): Record<string, unknown> | null {\n const read = (name: string): string | null => {\n if (typeof (headers as { get?: unknown }).get === 'function') {\n return (headers as { get(n: string): string | null }).get(name);\n }\n const rec = headers as Record<string, string>;\n return rec[name] ?? rec[name.toLowerCase()] ?? rec[name.toUpperCase()] ?? null;\n };\n\n const raw = read('payment-required') ?? read('x-payment-required');\n if (raw) {\n const trimmed = raw.trim();\n for (const decode of [\n () => JSON.parse(decodeBase64Utf8(trimmed)),\n () => JSON.parse(trimmed),\n ]) {\n try {\n const parsed = decode();\n if (isChallenge(parsed)) return parsed as Record<string, unknown>;\n } catch {\n // not this encoding; try the next\n }\n }\n }\n\n const parsedBody = typeof body === 'string' ? tryJson(body) : body;\n return isChallenge(parsedBody) ? (parsedBody as Record<string, unknown>) : null;\n}\n\n/**\n * Whether a value actually looks like an x402 challenge.\n *\n * Deliberately stricter than \"is an object\": a 402 body carrying a free preview\n * is valid JSON with no payment terms in it, and treating that as a challenge is\n * how a body-only reader concludes it looked and found nothing wrong.\n */\nfunction isChallenge(v: unknown): boolean {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n // `paymentRequirements` is the v1 spelling of `accepts`. Missing it made a\n // seller using it look like \"no terms here\" — the exact false negative this\n // function exists to prevent. Found in the Python SDK by KarmaKadabra's\n // buyer, which matched both keys in production, 2026-08-20.\n return (\n Array.isArray(o.accepts) ||\n Array.isArray(o.paymentRequirements) ||\n typeof o.payTo === 'string'\n );\n}\n\nfunction tryJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return null;\n }\n}\n","/**\n * uvd-x402-sdk - Escrow Pre-Auth Builder (sign-on-assignment)\n *\n * Builds and signs the EIP-3009 `ReceiveWithAuthorization` that locks a\n * bounty in the x402r AuthCaptureEscrow, and packs it into the raw-JSON\n * `X-Payment-Auth` wrapper the Ultravioleta Facilitator's `/settle` expects.\n * Used by marketplaces built on the escrow rail (e.g. Execution Market's\n * universal escrow, ADR-002).\n *\n * >>> PROTOCOL CONSTRAINT <<<\n * The EIP-3009 nonce is `AuthCaptureEscrow.getHash(paymentInfo)` which\n * INCLUDES the receiver — the escrow signature can only be created AT\n * ASSIGNMENT, when the worker/payee is known. Never design flows that sign\n * an escrow auth before the receiver is chosen (\"stored pre-auth with late\n * receiver fill\" is on-chain unsound).\n *\n * Fail-loud policy: an incomplete network config, an unknown tier, a bounty\n * outside the on-chain deposit limit, or a `maxFeeBps` that cannot cover the\n * operator's static fee all throw instead of falling back — a silent\n * fallback would sign an EIP-3009 authorization with the WRONG EIP-712\n * domain (chainId + verifyingContract): a mismatched, wallet-draining auth.\n *\n * Wire format is pinned by golden vectors (`src/escrow-preauth.vectors.json`):\n * payer-zeroed raw-keccak nonce (`keccak(chainId, escrow,\n * keccak(PAYMENT_INFO_TYPEHASH, paymentInfo tuple with payer=0))`),\n * `ReceiveWithAuthorization` typed data, raw JSON (NOT base64) wrapper.\n * Byte-parity with the production references is enforced in\n * `src/escrow-preauth.test.ts`.\n *\n * @example Sign the escrow lock at assignment time\n * ```typescript\n * import { buildEscrowPreAuth, EnvKeyAdapter } from 'uvd-x402-sdk';\n *\n * // Server-published escrow config (e.g. GET /api/v1/h2a/payment-config\n * // on Execution Market — escrow_networks[network]).\n * const paymentAuth = await buildEscrowPreAuth(new EnvKeyAdapter(), {\n * networkConfig: config.escrow.networks.base,\n * payerWallet: '0xPublisher...',\n * workerWallet: '0xWorker...', // committed by the nonce\n * bountyAtomic: '100000', // $0.10 in 6-decimal USDC\n * reviewDeadlineSec: taskDeadlineEpoch,\n * });\n * // Send as the X-Payment-Auth header (raw JSON, NOT base64).\n * ```\n *\n * Reference implementations (kept in byte-parity via the shared vectors):\n * - Python: `em_plugin_sdk.escrow_signing.build_escrow_pre_auth`\n * (production reference, derived from `uvd_x402_sdk.advanced_escrow`)\n * - Browser (viem): Execution Market `dashboard/src/services/h2aSigning.ts`\n */\n\nimport { ethers } from 'ethers';\nimport { X402Error } from './types';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst USDC_DECIMALS = 6;\n\n/** AuthCaptureEscrow deposit condition: $100 max per deposit. */\nexport const ESCROW_DEPOSIT_LIMIT_USD = 100;\n\n/**\n * StaticFeeCalculator: canonical 13% flat fee. The signed maxFeeBps MUST\n * cover it or the on-chain release reverts.\n */\nexport const OPERATOR_FEE_BPS = 1300;\n\n/** Fee-bound defaults for optional config keys only — never for the domain. */\nconst DEFAULT_MIN_FEE_BPS = 0;\nconst DEFAULT_MAX_FEE_BPS = 1800;\n\n/**\n * EIP-712 type for the escrow flow. The token collector pulls the funds, so\n * the scheme is ReceiveWithAuthorization (not TransferWithAuthorization).\n */\nconst RECEIVE_WITH_AUTHORIZATION_TYPES = {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n};\n\n/**\n * ABI type of the paymentInfo tuple — mirrors AdvancedEscrowClient /\n * em_plugin_sdk.escrow_signing (unnamed components, positional encoding).\n */\nconst PAYMENT_INFO_TUPLE =\n 'tuple(address,address,address,address,uint120,uint48,uint48,uint48,uint16,uint16,address,uint256)';\n\n/** Per-tier expiry windows in seconds, relative to now() at signing. */\nexport interface EscrowTierWindows {\n pre: number;\n auth: number;\n refund: number;\n}\n\n/** Canonical fallback — mirrors uvd_x402_sdk TIER_TIMINGS. */\nexport const ESCROW_TIER_WINDOWS: Record<string, EscrowTierWindows> = {\n micro: { pre: 3600, auth: 7200, refund: 86400 },\n standard: { pre: 7200, auth: 86400, refund: 604800 },\n};\n\n/**\n * Human review windows. Agents approve in seconds, so the short SDK tier\n * windows (micro auth = 2h) work for them. A HUMAN publisher reviews on\n * their own schedule — if authorizationExpiry passes before approval, the\n * on-chain release REVERTS (AfterAuthorizationExpiry). So release/refund\n * windows are extended to comfortably outlast the deadline + review buffer.\n */\nexport const REVIEW_WINDOW_SEC = 7 * 24 * 3600; // >=7 days to approve after the deadline\nexport const REFUND_WINDOW_SEC = 7 * 24 * 3600; // +7 days to refund after that\n\n/**\n * One network's escrow parameters, as published by the marketplace server\n * (e.g. Execution Market's `GET /api/v1/h2a/payment-config` →\n * `escrow_networks[network]`). Snake_case on purpose: pass the server's\n * JSON straight through so the SDK builds the paymentInfo EXACTLY like the\n * production reference.\n */\nexport interface EscrowNetworkConfig {\n chain_id: number;\n operator: string;\n escrow: string;\n token_collector: string;\n usdc: string;\n usdc_domain_name: string;\n usdc_domain_version: string;\n /** 32-byte hex PAYMENT_INFO_TYPEHASH (with or without 0x prefix). */\n payment_info_typehash: string;\n /** Server-published tier windows; falls back to ESCROW_TIER_WINDOWS. */\n tiers?: Record<string, EscrowTierWindows>;\n min_fee_bps?: number;\n max_fee_bps?: number;\n}\n\n/** paymentInfo exactly as serialized in the X-Payment-Auth wrapper. */\nexport interface EscrowPaymentInfo {\n operator: string;\n receiver: string;\n token: string;\n /** Atomic units, as string (uint120 on-chain). */\n maxAmount: string;\n preApprovalExpiry: number;\n authorizationExpiry: number;\n refundExpiry: number;\n minFeeBps: number;\n maxFeeBps: number;\n feeReceiver: string;\n /** 32-byte hex. */\n salt: string;\n}\n\nconst REQUIRED_NETWORK_KEYS: Array<keyof EscrowNetworkConfig> = [\n 'chain_id',\n 'operator',\n 'escrow',\n 'token_collector',\n 'usdc',\n 'usdc_domain_name',\n 'usdc_domain_version',\n 'payment_info_typehash',\n];\n\nfunction hex32(value: string): string {\n return value.startsWith('0x') ? value : `0x${value}`;\n}\n\n/** 32 random bytes as 0x-hex (WebCrypto when available, ethers otherwise). */\nfunction randomSalt(): string {\n const webCrypto = (globalThis as { crypto?: Crypto }).crypto;\n if (webCrypto?.getRandomValues) {\n const bytes = new Uint8Array(32);\n webCrypto.getRandomValues(bytes);\n return ethers.hexlify(bytes);\n }\n return ethers.hexlify(ethers.randomBytes(32));\n}\n\n/**\n * Compute the escrow EIP-3009 nonce = `AuthCaptureEscrow.getHash(paymentInfo)`.\n *\n * `keccak(chainId, escrow, keccak(PAYMENT_INFO_TYPEHASH, paymentInfo tuple\n * with payer=0))` — the payer slot is zeroed for the payer-agnostic hash;\n * the RECEIVER is part of the hash, which is why the signature commits to\n * the chosen worker. Port of `AdvancedEscrowClient._compute_nonce` /\n * `em_plugin_sdk.escrow_signing.compute_escrow_nonce`.\n *\n * @param chainId - EVM chain id.\n * @param escrowAddress - AuthCaptureEscrow contract on that chain.\n * @param paymentInfoTypehash - 32-byte hex typehash from the server config.\n * @param pi - paymentInfo exactly as serialized on the wire.\n * @returns 32-byte hex nonce (0x-prefixed, lowercase).\n */\nexport function computeEscrowNonce(\n chainId: number,\n escrowAddress: string,\n paymentInfoTypehash: string,\n pi: EscrowPaymentInfo\n): string {\n const coder = ethers.AbiCoder.defaultAbiCoder();\n\n const piTuple = [\n ethers.getAddress(pi.operator),\n ZERO_ADDRESS, // payer = 0 for the payer-agnostic hash\n ethers.getAddress(pi.receiver),\n ethers.getAddress(pi.token),\n BigInt(pi.maxAmount), // uint120\n pi.preApprovalExpiry, // uint48\n pi.authorizationExpiry, // uint48\n pi.refundExpiry, // uint48\n pi.minFeeBps, // uint16\n pi.maxFeeBps, // uint16\n ethers.getAddress(pi.feeReceiver),\n BigInt(hex32(pi.salt)), // uint256\n ];\n\n const piHash = ethers.keccak256(\n coder.encode(['bytes32', PAYMENT_INFO_TUPLE], [hex32(paymentInfoTypehash), piTuple])\n );\n return ethers.keccak256(\n coder.encode(\n ['uint256', 'address', 'bytes32'],\n [chainId, ethers.getAddress(escrowAddress), piHash]\n )\n );\n}\n\n/**\n * Minimal signer for {@link buildEscrowPreAuth}: EIP-712 typed-data signing\n * over the full typed-data JSON string (`domain`, `types`, `primaryType`,\n * `message`) — the same contract as `SigningWalletAdapter.signTypedData`,\n * so every adapter (EnvKeyAdapter, OWSWalletAdapter, custom) satisfies it\n * structurally. Browser wallets can wrap their own signTypedData in this\n * shape; the key never leaves the signer.\n */\nexport interface EscrowPreAuthSigner {\n signTypedData(typedData: string): Promise<{ signature: string }>;\n}\n\nexport interface EscrowPreAuthParams {\n /** Network escrow config as published by the marketplace server. */\n networkConfig: EscrowNetworkConfig;\n /**\n * Publisher wallet (payer). Not checked against the signer's address —\n * payer binding is enforced on-chain and by the backend, not here.\n */\n payerWallet: string;\n /** Chosen worker's wallet (escrow receiver — committed by the nonce). */\n workerWallet: string;\n /** Bounty in atomic units (6-decimal USDC). */\n bountyAtomic: string | bigint;\n /** Expiry tier; windows come from config when present. Default 'micro'. */\n tier?: string;\n /**\n * Task deadline (epoch seconds). The release/refund windows are extended\n * to outlast it + a review buffer so a human publisher can still approve\n * after the worker delivers. When omitted, falls back to now()-based\n * windows.\n */\n reviewDeadlineSec?: number;\n /**\n * On-chain deposit limit in USD (AuthCaptureEscrow deposit condition).\n * Default {@link ESCROW_DEPOSIT_LIMIT_USD}; override only when the server\n * publishes a different limit.\n */\n depositLimitUsd?: number;\n}\n\n/**\n * Build + sign the escrow lock authorization AT ASSIGNMENT time and return\n * the raw JSON string for the `X-Payment-Auth` header (NOT base64 — the\n * backend relays it verbatim to the Facilitator `/settle`). Mirror of\n * `AdvancedEscrowClient.authorize()`'s /settle payload and of\n * `em_plugin_sdk.escrow_signing.build_escrow_pre_auth`.\n *\n * @throws {X402Error} `INVALID_CONFIG` on an incomplete network config,\n * unknown tier, or a `maxFeeBps` that cannot cover the operator's static\n * fee; `INVALID_AMOUNT` on a bounty outside (0, deposit limit].\n */\nexport async function buildEscrowPreAuth(\n wallet: EscrowPreAuthSigner,\n params: EscrowPreAuthParams\n): Promise<string> {\n const cfg = params.networkConfig;\n\n const missing = REQUIRED_NETWORK_KEYS.filter((key) => !cfg[key]);\n if (missing.length > 0) {\n throw new X402Error(\n `Incomplete escrow network config (missing ${missing.join(', ')}) — ` +\n 'refusing to sign an EIP-3009 authorization with a mismatched domain.',\n 'INVALID_CONFIG'\n );\n }\n\n const maxAmount = BigInt(params.bountyAtomic);\n if (maxAmount <= 0n) {\n throw new X402Error(\n `Bounty must be positive, got ${maxAmount} atomic units`,\n 'INVALID_AMOUNT'\n );\n }\n const depositLimitUsd = params.depositLimitUsd ?? ESCROW_DEPOSIT_LIMIT_USD;\n const depositLimitAtomic = BigInt(Math.round(depositLimitUsd * 10 ** USDC_DECIMALS));\n if (maxAmount > depositLimitAtomic) {\n throw new X402Error(\n `Bounty ${maxAmount} atomic units exceeds the on-chain escrow deposit ` +\n `limit ($${depositLimitUsd}).`,\n 'INVALID_AMOUNT'\n );\n }\n\n const minFeeBps = cfg.min_fee_bps ?? DEFAULT_MIN_FEE_BPS;\n const maxFeeBps = cfg.max_fee_bps ?? DEFAULT_MAX_FEE_BPS;\n if (maxFeeBps < OPERATOR_FEE_BPS) {\n throw new X402Error(\n `maxFeeBps=${maxFeeBps} cannot cover the operator's ${OPERATOR_FEE_BPS} ` +\n 'bps static fee — the on-chain release would revert.',\n 'INVALID_CONFIG'\n );\n }\n\n const tierKey = params.tier ?? 'micro';\n const windows = cfg.tiers?.[tierKey] ?? ESCROW_TIER_WINDOWS[tierKey];\n if (!windows) {\n const known = [...new Set([...Object.keys(cfg.tiers ?? {}), ...Object.keys(ESCROW_TIER_WINDOWS)])].sort();\n throw new X402Error(\n `Unknown escrow tier '${tierKey}' — known tiers: ${known.join(', ')}`,\n 'INVALID_CONFIG'\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n\n // The release window must outlast the human review. Base it on the task\n // deadline (the worker delivers near it) plus a generous buffer, and never\n // shorter than the SDK tier window. preApprovalExpiry stays short — the\n // lock executes immediately at assignment.\n const reviewBase = Math.max(now, params.reviewDeadlineSec ?? now);\n const authExpiry = Math.max(now + windows.auth, reviewBase + REVIEW_WINDOW_SEC);\n const refundExpiry = Math.max(now + windows.refund, authExpiry + REFUND_WINDOW_SEC);\n\n const paymentInfo: EscrowPaymentInfo = {\n operator: ethers.getAddress(cfg.operator),\n receiver: ethers.getAddress(params.workerWallet),\n token: ethers.getAddress(cfg.usdc),\n maxAmount: maxAmount.toString(),\n preApprovalExpiry: now + windows.pre,\n authorizationExpiry: authExpiry,\n refundExpiry: refundExpiry,\n minFeeBps: minFeeBps,\n maxFeeBps: maxFeeBps,\n feeReceiver: ethers.getAddress(cfg.operator),\n salt: randomSalt(),\n };\n\n const nonce = computeEscrowNonce(\n cfg.chain_id,\n cfg.escrow,\n cfg.payment_info_typehash,\n paymentInfo\n );\n\n const payer = ethers.getAddress(params.payerWallet);\n const tokenCollector = ethers.getAddress(cfg.token_collector);\n\n // String-valued message fields: the typed data travels as JSON to the\n // adapter (SigningWalletAdapter.signTypedData contract), and ethers\n // accepts decimal strings for uint256 / 0x-hex for bytes32.\n const { signature } = await wallet.signTypedData(\n JSON.stringify({\n domain: {\n name: cfg.usdc_domain_name,\n version: cfg.usdc_domain_version,\n chainId: cfg.chain_id,\n verifyingContract: ethers.getAddress(cfg.usdc),\n },\n types: RECEIVE_WITH_AUTHORIZATION_TYPES,\n primaryType: 'ReceiveWithAuthorization',\n message: {\n from: payer,\n to: tokenCollector,\n value: maxAmount.toString(),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce: nonce,\n },\n })\n );\n\n // Raw JSON (NOT base64): the backend relays this verbatim to the\n // Facilitator /settle after validating payer/amount/receiver.\n return JSON.stringify({\n x402Version: 2,\n scheme: 'escrow',\n payload: {\n authorization: {\n from: payer,\n to: tokenCollector,\n value: maxAmount.toString(),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce: nonce,\n },\n signature: signature,\n paymentInfo: paymentInfo,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${cfg.chain_id}`,\n },\n });\n}\n","/**\n * uvd-x402-sdk - Backend Utilities\n *\n * Server-side utilities for building x402 payment APIs.\n * These utilities help backend developers:\n * - Build verify/settle requests for the facilitator\n * - Parse X-PAYMENT headers from incoming requests\n * - Configure CORS for x402 payment flows\n * - Create atomic payment handlers\n * - Discover and register resources via Bazaar Discovery API\n * - Manage escrow payments with refund and dispute resolution\n *\n * @example Basic payment flow\n * ```ts\n * import {\n * parsePaymentHeader,\n * FacilitatorClient,\n * X402_CORS_HEADERS,\n * } from 'uvd-x402-sdk/backend';\n *\n * // Parse payment from request header\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n *\n * // Verify with facilitator\n * const client = new FacilitatorClient();\n * const verifyResult = await client.verify(payment, paymentRequirements);\n *\n * // If valid, provide service then settle\n * const settleResult = await client.settle(payment, paymentRequirements);\n * ```\n *\n * @example Escrow payment with refund support\n * ```ts\n * import { EscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const escrow = new EscrowClient();\n *\n * // Hold payment in escrow\n * const escrowPayment = await escrow.createEscrow({\n * paymentHeader: req.headers['x-payment'],\n * requirements: paymentRequirements,\n * escrowDuration: 86400, // 24 hours\n * });\n *\n * // After service delivered, release to recipient\n * await escrow.release(escrowPayment.id);\n *\n * // Or if service failed, request refund\n * await escrow.requestRefund({\n * escrowId: escrowPayment.id,\n * reason: 'Service not delivered',\n * });\n * ```\n *\n * @example Resource discovery\n * ```ts\n * import { BazaarClient } from 'uvd-x402-sdk/backend';\n *\n * const bazaar = new BazaarClient();\n * const resources = await bazaar.discover({\n * category: 'ai',\n * network: 'base',\n * maxPrice: '0.10',\n * });\n * ```\n */\n\nimport type {\n X402Header,\n X402PayloadData,\n X402Version,\n} from '../types';\nimport { decodeX402Header, chainToCAIP2, parseNetworkIdentifier } from '../utils';\nimport { REVIEW_WINDOW_SEC, REFUND_WINDOW_SEC } from '../escrow-preauth';\nimport { getChainByName } from '../chains';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Payment requirements sent to the facilitator\n */\nexport interface PaymentRequirements {\n /** Payment scheme */\n scheme: 'exact' | 'escrow' | 'commerce';\n /** Network name (v1) or CAIP-2 identifier (v2) */\n network: string;\n /** Maximum amount required in atomic units (e.g., \"1000000\" for 1 USDC) */\n maxAmountRequired: string;\n /** Resource URL being paid for */\n resource: string;\n /** Description of what's being paid for */\n description: string;\n /** MIME type of the resource */\n mimeType: string;\n /** Recipient address for payment */\n payTo: string;\n /** Maximum timeout in seconds */\n maxTimeoutSeconds: number;\n /** Token contract address */\n asset: string;\n /** Optional output schema for the resource */\n outputSchema?: unknown;\n /** Optional extra data */\n extra?: unknown;\n}\n\n/**\n * Verify request body for the facilitator /verify endpoint\n */\nexport interface VerifyRequest {\n x402Version: X402Version;\n paymentPayload: X402Header;\n paymentRequirements: PaymentRequirements;\n}\n\n/**\n * Settle request body for the facilitator /settle endpoint\n */\nexport interface SettleRequest {\n x402Version: X402Version;\n paymentPayload: X402Header;\n paymentRequirements: PaymentRequirements;\n}\n\n/**\n * Verify response from the facilitator\n */\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n network?: string;\n}\n\n/**\n * Settle response from the facilitator\n */\nexport interface SettleResponse {\n success: boolean;\n transactionHash?: string;\n network?: string;\n /** Transport-level failure (unreachable facilitator, non-2xx, timeout). */\n error?: string;\n /**\n * The facilitator's own reason when it settled nothing — e.g. a transfer that\n * mined and reverted. Distinct from `error` above, which is this client\n * failing to ask; this one is the facilitator answering \"no\".\n */\n errorReason?: string;\n /** The address the facilitator confirmed as the payer. */\n payer?: string;\n /**\n * Settlement proof, present when the ERC-8004 extension asked for it.\n *\n * Typed here rather than only on {@link SettleResponseWithProof} because\n * `settle()` returns it whenever the facilitator sends it, and it is what\n * DX402's `anchorEvidence` needs to reach `verified: true`.\n */\n proofOfPayment?: ProofOfPayment;\n}\n\n/**\n * Options for building payment requirements\n */\nexport interface PaymentRequirementsOptions {\n /** Amount in human-readable format (e.g., \"1.00\") */\n amount: string;\n /** Recipient address */\n recipient: string;\n /** Resource URL being protected */\n resource: string;\n /** Chain name (e.g., \"base\") */\n chainName?: string;\n /** Description of the resource */\n description?: string;\n /** MIME type of the resource */\n mimeType?: string;\n /** Timeout in seconds (default: 300) */\n timeoutSeconds?: number;\n /** x402 version to use */\n x402Version?: X402Version;\n}\n\n/**\n * x402 payment option advertised in a 402 response.\n *\n * The SDK keeps the response shape richer than the minimal protocol fields so\n * servers can preserve settlement-critical metadata such as payTo and extra.\n */\nexport interface PaymentAcceptance {\n network: string;\n asset: string;\n amount: string;\n /**\n * Payment scheme. REQUIRED by the facilitator's v2 `PaymentRequirementsV2`.\n *\n * Optional here only so existing callers keep compiling — when it is absent,\n * `buildRequirementFromAcceptance` defaults it to `'exact'`. Do not treat its\n * optionality as \"the facilitator does not need it\": an accepts[] entry that\n * reaches a v2 client without a scheme is unpayable.\n */\n scheme?: string;\n payTo?: string;\n facilitator?: string;\n resource?: string;\n description?: string;\n mimeType?: string;\n maxTimeoutSeconds?: number;\n outputSchema?: unknown;\n extra?: unknown;\n}\n\n/**\n * Verified payment context attached by server middleware.\n */\nexport interface VerifiedPaymentState {\n payment: X402Header;\n requirements: PaymentRequirements;\n verifyResult: VerifyResponse;\n settle: () => Promise<SettleResponse>;\n}\n\n/**\n * Shared server middleware options.\n */\nexport interface PaymentMiddlewareOptions extends FacilitatorClientOptions {\n /** Alias for baseUrl to keep middleware options ergonomic */\n facilitatorUrl?: string;\n /**\n * Settlement behavior after verification.\n * - manual: verify only; caller settles explicitly\n * - before-handler: settle immediately before calling next()\n */\n settlementStrategy?: 'manual' | 'before-handler';\n}\n\n/**\n * Custom resolver for selecting the correct payment requirement when multiple\n * accepts are advertised.\n */\nexport type PaymentRequirementResolver = (\n payment: X402Header,\n requirements: PaymentRequirements[]\n) => PaymentRequirements | null | Promise<PaymentRequirements | null>;\n\n// ============================================================================\n// HEADER PARSING\n// ============================================================================\n\n/**\n * Parse X-PAYMENT or PAYMENT-SIGNATURE header value\n *\n * @param headerValue - Base64-encoded header value (or undefined/null)\n * @returns Parsed x402 header object, or null if invalid\n *\n * @example\n * ```ts\n * // Express.js\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n * if (!payment) {\n * return res.status(400).json({ error: 'Invalid payment header' });\n * }\n * ```\n */\nexport function parsePaymentHeader(\n headerValue: string | undefined | null\n): X402Header | null {\n if (!headerValue) {\n return null;\n }\n\n try {\n return decodeX402Header(headerValue);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract payment header from request headers object\n *\n * Checks both X-PAYMENT and PAYMENT-SIGNATURE headers.\n *\n * @param headers - Request headers object (case-insensitive)\n * @returns Parsed x402 header object, or null if not found/invalid\n *\n * @example\n * ```ts\n * const payment = extractPaymentFromHeaders(req.headers);\n * ```\n */\nexport function extractPaymentFromHeaders(\n headers: Record<string, string | string[] | undefined>\n): X402Header | null {\n // Normalize header keys to lowercase\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n normalizedHeaders[key.toLowerCase()] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n normalizedHeaders[key.toLowerCase()] = value[0];\n }\n }\n\n // Try X-PAYMENT first, then PAYMENT-SIGNATURE\n const headerValue =\n normalizedHeaders['x-payment'] ||\n normalizedHeaders['payment-signature'];\n\n return parsePaymentHeader(headerValue);\n}\n\n// ============================================================================\n// REQUEST BUILDERS\n// ============================================================================\n\n/**\n * Build payment requirements for the facilitator\n *\n * @param options - Payment requirements options\n * @returns PaymentRequirements object ready for verify/settle\n *\n * @example\n * ```ts\n * const requirements = buildPaymentRequirements({\n * amount: '1.00',\n * recipient: '0x1234...',\n * resource: 'https://api.example.com/premium-data',\n * chainName: 'base',\n * });\n * ```\n */\nexport function buildPaymentRequirements(\n options: PaymentRequirementsOptions\n): PaymentRequirements {\n const {\n amount,\n recipient,\n resource,\n chainName = 'base',\n description = 'Payment for resource access',\n mimeType = 'application/json',\n timeoutSeconds = 300,\n x402Version = 1,\n } = options;\n\n const chain = getChainByName(chainName);\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n\n // Convert amount to atomic units\n const atomicAmount = Math.floor(\n parseFloat(amount) * Math.pow(10, chain.usdc.decimals)\n ).toString();\n\n // Use CAIP-2 for v2, chain name for v1\n const network = x402Version === 2 ? chainToCAIP2(chainName) : chainName;\n\n return {\n scheme: 'exact',\n network,\n maxAmountRequired: atomicAmount,\n resource,\n description,\n mimeType,\n payTo: recipient,\n maxTimeoutSeconds: timeoutSeconds,\n asset: chain.usdc.address,\n };\n}\n\n/**\n * Build a verify request for the facilitator /verify endpoint\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns VerifyRequest body ready for fetch/axios\n *\n * @example\n * ```ts\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n * const verifyBody = buildVerifyRequest(payment, requirements);\n *\n * const response = await fetch('https://facilitator.uvd.xyz/verify', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify(verifyBody),\n * });\n * ```\n */\nexport function buildVerifyRequest(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n): VerifyRequest {\n return {\n x402Version: paymentHeader.x402Version,\n paymentPayload: paymentHeader,\n paymentRequirements: requirements,\n };\n}\n\n/**\n * Build a settle request for the facilitator /settle endpoint\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns SettleRequest body ready for fetch/axios\n */\n/**\n * Describes the protected resource, as x402 v2 expects it.\n *\n * Note this is an OBJECT in v2. Sending a bare URL string here is the single\n * most common v2 mistake and it fails as an unhelpful \"no variant matched\"\n * deserialization error at the facilitator, naming no field.\n */\nexport interface ResourceInfoV2 {\n url: string;\n description: string;\n mimeType: string;\n}\n\n/**\n * Payment requirements in x402 v2 form.\n *\n * Differences from v1 that actually bite:\n * - `network` is CAIP-2 (`eip155:8453`), NOT a plain name (`base`). Mixing a v1\n * name into a v2 request fails deserialization, and vice versa.\n * - `maxAmountRequired` is renamed to `amount`.\n * - `resource` / `description` / `mimeType` moved out to {@link ResourceInfoV2}.\n */\nexport interface PaymentRequirementsV2 {\n scheme: string;\n /** CAIP-2 chain id, e.g. `eip155:8453`. */\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds: number;\n extra?: unknown;\n}\n\n/** The v2 payment payload — note it carries no top-level scheme/network. */\nexport interface PaymentPayloadV2 {\n x402Version: 2;\n resource: ResourceInfoV2;\n accepted: PaymentRequirementsV2;\n payload: X402PayloadData;\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Verify request body in x402 v2 form.\n *\n * There is deliberately NO `paymentRequirements` key: that is the v1 envelope.\n * v2 carries `resource` and `accepted` at the top level instead.\n */\nexport interface VerifyRequestV2 {\n x402Version: 2;\n paymentPayload: PaymentPayloadV2;\n resource: ResourceInfoV2;\n accepted: PaymentRequirementsV2;\n}\n\n/** Settle request body in x402 v2 form. Same shape as {@link VerifyRequestV2}. */\nexport type SettleRequestV2 = VerifyRequestV2;\n\nfunction buildV2Envelope(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): VerifyRequestV2 {\n return {\n x402Version: 2,\n // The facilitator reads the payload from here; `resource` and `accepted` are\n // repeated at the top level because the v2 envelope declares both.\n paymentPayload: { x402Version: 2, resource, accepted, payload },\n resource,\n accepted,\n };\n}\n\n/**\n * Build a verify request for the facilitator `/verify` endpoint, in **v2** form.\n *\n * Use this whenever your 402 advertises CAIP-2 networks. {@link buildVerifyRequest}\n * emits the v1 envelope `{x402Version, paymentPayload, paymentRequirements}` and\n * cannot express v2 — putting a v2 payload inside it matches no variant at the\n * facilitator and fails with an error that names no field.\n *\n * @example\n * ```ts\n * const body = buildVerifyRequestV2(\n * payment.payload,\n * { url: 'https://api.example.com/thing', description: 'Thing', mimeType: 'application/json' },\n * { scheme: 'exact', network: 'eip155:8453', asset: '0x8335...', amount: '100000',\n * payTo: '0xabc...', maxTimeoutSeconds: 300 }\n * );\n * ```\n */\nexport function buildVerifyRequestV2(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): VerifyRequestV2 {\n return buildV2Envelope(payload, resource, accepted);\n}\n\n/**\n * Build a settle request for the facilitator `/settle` endpoint, in **v2** form.\n *\n * See {@link buildVerifyRequestV2} — the envelope is identical.\n */\nexport function buildSettleRequestV2(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): SettleRequestV2 {\n return buildV2Envelope(payload, resource, accepted);\n}\n\nexport function buildSettleRequest(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n): SettleRequest {\n return {\n x402Version: paymentHeader.x402Version,\n paymentPayload: paymentHeader,\n paymentRequirements: requirements,\n };\n}\n\n// ============================================================================\n// CORS CONFIGURATION\n// ============================================================================\n\n/**\n * Recommended CORS headers for x402 payment APIs\n *\n * These headers allow browsers to send payment headers in cross-origin requests.\n */\nexport const X402_CORS_HEADERS = {\n 'Access-Control-Allow-Headers':\n 'Content-Type, X-PAYMENT, PAYMENT-SIGNATURE, Authorization',\n 'Access-Control-Expose-Headers':\n 'X-PAYMENT-RESPONSE, PAYMENT-RESPONSE, PAYMENT-REQUIRED',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n} as const;\n\n/**\n * All x402 custom header names that should be allowed in CORS\n */\nexport const X402_HEADER_NAMES = [\n 'X-PAYMENT',\n 'PAYMENT-SIGNATURE',\n 'X-PAYMENT-RESPONSE',\n 'PAYMENT-RESPONSE',\n 'PAYMENT-REQUIRED',\n] as const;\n\n/**\n * Get CORS headers with custom origin\n *\n * @param origin - Allowed origin (use '*' for any, or specific domain)\n * @returns Complete CORS headers object\n *\n * @example\n * ```ts\n * // Express.js middleware\n * app.use((req, res, next) => {\n * const corsHeaders = getCorsHeaders('https://myapp.com');\n * Object.entries(corsHeaders).forEach(([key, value]) => {\n * res.setHeader(key, value);\n * });\n * if (req.method === 'OPTIONS') {\n * return res.status(204).end();\n * }\n * next();\n * });\n * ```\n */\nexport function getCorsHeaders(origin: string = '*'): Record<string, string> {\n return {\n 'Access-Control-Allow-Origin': origin,\n ...X402_CORS_HEADERS,\n };\n}\n\n// ============================================================================\n// FACILITATOR CLIENT\n// ============================================================================\n\n/**\n * Options for the FacilitatorClient\n */\nexport interface FacilitatorClientOptions {\n /** Base URL of the facilitator (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /**\n * Request timeout in milliseconds (default: auto per network).\n * When not set, the client uses per-network defaults from ESCROW_TIMEOUT_MS\n * (960s for Ethereum L1, 90s for L2s, 30s for others).\n * Set explicitly to override per-network auto-detection.\n */\n timeout?: number;\n}\n\n/**\n * Client for interacting with the x402 facilitator API\n *\n * @example\n * ```ts\n * const client = new FacilitatorClient();\n *\n * // Verify a payment\n * const verifyResult = await client.verify(paymentHeader, requirements);\n * if (!verifyResult.isValid) {\n * return res.status(402).json({ error: verifyResult.invalidReason });\n * }\n *\n * // Provide the service, then settle\n * const settleResult = await client.settle(paymentHeader, requirements);\n * if (!settleResult.success) {\n * // Handle settlement failure (maybe refund or retry)\n * }\n * ```\n */\nexport class FacilitatorClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly explicitTimeout: boolean;\n\n constructor(options: FacilitatorClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://facilitator.ultravioletadao.xyz';\n this.explicitTimeout = options.timeout !== undefined;\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Get timeout for a specific network, using per-chain defaults when no explicit timeout was set.\n */\n private getTimeout(network?: string): number {\n if (this.explicitTimeout) return this.timeout;\n if (!network) return this.timeout;\n // Extract chainId from CAIP-2 format (eip155:1) or legacy names\n const match = network.match(/^eip155:(\\d+)$/);\n if (match) {\n const chainId = parseInt(match[1], 10);\n return ESCROW_TIMEOUT_MS[chainId] || this.timeout;\n }\n // Legacy network name mapping for Ethereum\n if (network === 'ethereum' || network === 'ethereum-mainnet') return ESCROW_TIMEOUT_MS[1];\n return this.timeout;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * Call this before providing the paid resource to validate the payment.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Verification result\n */\n async verify(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<VerifyResponse> {\n const body = buildVerifyRequest(paymentHeader, requirements);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/verify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n isValid: false,\n invalidReason: `Facilitator error: ${response.status} - ${errorText}`,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n isValid: false,\n invalidReason: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * Call this after providing the paid resource to execute the on-chain transfer.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Settlement result with transaction hash\n */\n async settle(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<SettleResponse> {\n const body = buildSettleRequest(paymentHeader, requirements);\n const settleTimeout = this.getTimeout(requirements.network);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), settleTimeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n };\n }\n\n const result = await response.json();\n // Read all three spellings. The facilitator's canonical name for this\n // field is `transaction`, and this client used to read only the two\n // camel/snake variants — so it silently returned `undefined` for the\n // most important field a settle produces. A consumer failed closed on\n // that and revoked access to a payment that had already settled\n // on-chain: the money moved, the receipt was unreadable.\n //\n // The server now emits all three, but this fallback stays: it makes the\n // client work against facilitators that have not deployed that yet, and\n // against any that only ever emitted the canonical name.\n const transactionHash =\n result.transaction ?? result.transactionHash ?? result.transaction_hash;\n if (result.success && !transactionHash) {\n // Never let a missing hash pass as a normal success. A caller that\n // gates access on the receipt needs to know the receipt is absent,\n // not infer it from an undefined field.\n console.warn(\n '[x402] settle reported success but carried no transaction hash under ' +\n 'transaction/transactionHash/transaction_hash — treat delivery as unconfirmed'\n );\n }\n return {\n // Read the facilitator's verdict instead of asserting one.\n //\n // This was the literal `true`, so a settle was reported successful\n // whenever the HTTP call was — and \"the request arrived\" is not \"the\n // money moved\". A payment that MINES AND THEN REVERTS is answered with\n // 200 and `success: false` (x402-rs src/chain/evm.rs:1343, serialised\n // through StatusCode::OK), which is precisely the case a caller most\n // needs to hear about. Every consumer doing `result.success === true`\n // was reading a constant, so a reverted payment was booked as settled\n // and no reconciliation path could ever fire.\n //\n // Absent `success` is treated as NOT successful: a facilitator that\n // does not say it worked has not said it worked.\n success: result.success === true,\n transactionHash,\n network: result.network,\n // Why it failed, when it did. Without this the caller gets `success:\n // false` and no way to tell a reverted transfer from a rejected\n // authorization except by parsing prose.\n errorReason: result.errorReason ?? result.error_reason,\n // The settlement proof, when the facilitator attached one (it does for\n // the ERC-8004 extension). Dropping it here made `verified: true`\n // unreachable for DX402 anchoring through this client: `anchorEvidence`\n // documents proofOfPayment as the only thing that gets there, the\n // facilitator returns it, and this method threw it away — so a seller\n // using the SDK end to end could only ever produce provisional anchors.\n proofOfPayment: result.proofOfPayment ?? result.proof_of_payment,\n payer: result.payer,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Verify and settle atomically\n *\n * Convenience method that verifies first, then settles if valid.\n * Use this for simple payment flows where you don't need custom logic between verify and settle.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Combined result with verify and settle status\n */\n async verifyAndSettle(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<{\n verified: boolean;\n settled: boolean;\n transactionHash?: string;\n error?: string;\n }> {\n // Verify first\n const verifyResult = await this.verify(paymentHeader, requirements);\n if (!verifyResult.isValid) {\n return {\n verified: false,\n settled: false,\n error: verifyResult.invalidReason,\n };\n }\n\n // Settle\n const settleResult = await this.settle(paymentHeader, requirements);\n return {\n verified: true,\n settled: settleResult.success,\n transactionHash: settleResult.transactionHash,\n error: settleResult.error,\n };\n }\n\n /**\n * Check if the facilitator is healthy\n *\n * @returns True if the facilitator is responding\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the facilitator version info\n *\n * @returns Version info (e.g., { version: \"1.37.0\" })\n */\n async getVersion(): Promise<{ version: string; [key: string]: unknown }> {\n const response = await fetch(`${this.baseUrl}/version`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /version failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Get the facilitator's supported networks and payment schemes\n *\n * @returns Supported networks/schemes with 'kinds' array\n *\n * @example\n * ```ts\n * const supported = await client.getSupported();\n * for (const kind of supported.kinds) {\n * console.log(`${kind.network} - ${kind.scheme}`);\n * }\n * ```\n */\n async getSupported(): Promise<{\n kinds: Array<{ network: string; scheme: string; [key: string]: unknown }>;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/supported`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /supported failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Aggregated totals per network and asset (`GET /api/stats`).\n *\n * **An index, not a ledger.** Records are written best-effort AFTER\n * settlement, so an outage loses rows while payments proceed — verify\n * anything that matters against the transaction hash. Counting starts when\n * the operator enabled the store, so earlier operations are UNKNOWN, not\n * zero. And unless `X402_EVENTS_PUBLISH_FAILURES=true`, operations that ERROR\n * are not recorded at all: a 100% success rate means \"no failures were\n * recorded\".\n *\n * `volumeAtomic` is a STRING (u256-shaped; a JS number loses precision above\n * 2^53) and each row carries its own `decimals`. **Use that, never a\n * constant** — USDC is 6 decimals nearly everywhere and 18 on BSC, so scaling\n * by 6 there overstates volume by 10^12. `decimals` is null when the asset is\n * unrecognised; render the atomic value rather than guessing a scale.\n */\n async getStats(): Promise<{\n totals: { settlesOk: number; settlesFailed: number; verifies: number; networks: number };\n byNetworkAndAsset: Array<{\n network: string;\n asset: string;\n settlesOk: number;\n settlesFailed: number;\n verifies: number;\n volumeAtomic: string;\n decimals: number | null;\n lastTs: number;\n }>;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/api/stats`, { method: 'GET' });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /api/stats failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Recent recorded operations, newest first (`GET /transactions`).\n *\n * There is **no pagination and no cursor**: this returns the newest N,\n * walking back at most 30 days. With 10,000 rows you get the newest 200, not\n * page one of fifty. `limit` is clamped to 200 by the facilitator.\n *\n * `network` matches the canonical slug `/supported` uses, which is not always\n * the alias you may send — `skale` is accepted inbound but records say\n * `skale-base`.\n */\n async getTransactions(options: { limit?: number; network?: string } = {}): Promise<{\n transactions: Array<Record<string, unknown>>;\n count: number;\n [key: string]: unknown;\n }> {\n const params = new URLSearchParams();\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.network) params.set('network', options.network);\n const query = params.toString();\n const response = await fetch(\n `${this.baseUrl}/transactions${query ? `?${query}` : ''}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /transactions failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Get the facilitator's blocked/sanctioned addresses\n *\n * @returns Blacklist info (totalBlocked, loadedAtStartup, addresses)\n *\n * @example\n * ```ts\n * const bl = await client.getBlacklist();\n * console.log(`Blocked: ${bl.totalBlocked} addresses`);\n * ```\n */\n async getBlacklist(): Promise<{\n totalBlocked: number;\n loadedAtStartup: boolean;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/blacklist`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /blacklist failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Negotiate payment requirements with the facilitator via POST /accepts.\n *\n * Sends merchant payment requirements to the facilitator, which matches\n * them against its supported capabilities and returns enriched requirements\n * with facilitator data (feePayer, tokens, escrow configuration).\n *\n * This is used by Faremeter middleware and clients that need to discover\n * what the facilitator can settle before constructing payment authorizations.\n *\n * @param paymentRequirements - List of payment requirement objects\n * @param x402Version - x402 protocol version (default: 2)\n * @returns List of enriched payment requirements with facilitator extras\n *\n * @example\n * ```ts\n * const enriched = await client.accepts([\n * {\n * scheme: 'exact',\n * network: 'base-mainnet',\n * maxAmountRequired: '1000000',\n * resource: 'https://api.example.com/data',\n * payTo: '0xMerchant...',\n * },\n * ]);\n * // enriched[0].extra.feePayer is now set\n * ```\n */\n async accepts(\n paymentRequirements: PaymentRequirements[],\n x402Version: number = 2\n ): Promise<PaymentRequirements[]> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/accepts`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n x402Version,\n accepts: paymentRequirements,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Facilitator /accepts error: ${response.status} - ${errorText}`);\n }\n\n const data = await response.json();\n return data.accepts || [];\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\n// ============================================================================\n// ATOMIC PAYMENT HELPERS\n// ============================================================================\n\n/**\n * Create a 402 Payment Required response\n *\n * @param requirements - Payment requirements\n * @param options - Additional response options\n * @returns Object with status code, headers, and body for the 402 response\n *\n * @example\n * ```ts\n * // Express.js\n * app.get('/premium-data', (req, res) => {\n * const payment = extractPaymentFromHeaders(req.headers);\n *\n * if (!payment) {\n * const { status, headers, body } = create402Response({\n * amount: '1.00',\n * recipient: '0x...',\n * resource: 'https://api.example.com/premium-data',\n * });\n * return res.status(status).set(headers).json(body);\n * }\n *\n * // Verify and serve...\n * });\n * ```\n */\nexport function create402Response(\n requirements: PaymentRequirementsOptions,\n options: {\n accepts?: PaymentAcceptance[];\n } = {}\n): {\n status: 402;\n headers: Record<string, string>;\n body: Record<string, unknown>;\n} {\n const primaryRequirement = buildPaymentRequirements(requirements);\n const version = requirements.x402Version\n || ((options.accepts && options.accepts.length > 0)\n || primaryRequirement.network.includes(':')\n || (options.accepts || []).some((accept) => accept.network.includes(':'))\n ? 2\n : 1);\n const advertisedRequirements = [\n normalizeRequirementForVersion(primaryRequirement, version),\n ...(options.accepts || []).map((accept) =>\n buildRequirementFromAcceptance(accept, primaryRequirement.resource, version, primaryRequirement)\n ),\n ];\n const body = create402ResponseBody(advertisedRequirements[0], advertisedRequirements, version);\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n ...X402_CORS_HEADERS,\n },\n body,\n };\n}\n\nconst DEFAULT_PAYMENT_DESCRIPTION = 'Payment required';\nconst DEFAULT_PAYMENT_MIME_TYPE = 'application/json';\nconst DEFAULT_PAYMENT_TIMEOUT_SECONDS = 300;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction resolveAdvertisedVersion(\n accepts: PaymentAcceptance[],\n requestedVersion?: X402Version | 'auto'\n): X402Version {\n if (requestedVersion && requestedVersion !== 'auto') {\n return requestedVersion;\n }\n\n if (accepts.length > 1 || accepts.some((accept) => accept.network.includes(':'))) {\n return 2;\n }\n\n return 1;\n}\n\nfunction normalizeRequirementForVersion(\n requirements: PaymentRequirements,\n version: X402Version\n): PaymentRequirements {\n return {\n ...requirements,\n network: version === 2\n ? (requirements.network.includes(':') ? requirements.network : chainToCAIP2(requirements.network))\n : (requirements.network.includes(':') ? parseNetworkIdentifier(requirements.network) : requirements.network),\n };\n}\n\nfunction buildRequirementFromAcceptance(\n accept: PaymentAcceptance,\n resource: string,\n version: X402Version,\n defaults?: PaymentRequirements\n): PaymentRequirements {\n const payTo = accept.payTo ?? defaults?.payTo;\n if (!payTo) {\n throw new Error('Payment accepts entries must include payTo');\n }\n\n return normalizeRequirementForVersion({\n // Honour a caller-supplied scheme; 'exact' is the default, not an override.\n // Hardcoding it silently discarded 'escrow' / 'commerce' accepts.\n scheme: (accept.scheme as PaymentRequirements['scheme']) ?? 'exact',\n network: accept.network,\n maxAmountRequired: accept.amount,\n resource: accept.resource ?? defaults?.resource ?? resource,\n description: accept.description ?? defaults?.description ?? DEFAULT_PAYMENT_DESCRIPTION,\n mimeType: accept.mimeType ?? defaults?.mimeType ?? DEFAULT_PAYMENT_MIME_TYPE,\n payTo,\n asset: accept.asset,\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? defaults?.maxTimeoutSeconds ?? DEFAULT_PAYMENT_TIMEOUT_SECONDS,\n ...(accept.outputSchema !== undefined\n ? { outputSchema: accept.outputSchema }\n : defaults?.outputSchema !== undefined\n ? { outputSchema: defaults.outputSchema }\n : {}),\n ...(accept.extra !== undefined\n ? { extra: accept.extra }\n : defaults?.extra !== undefined\n ? { extra: defaults.extra }\n : {}),\n }, version);\n}\n\nfunction toPaymentAcceptance(\n requirements: PaymentRequirements,\n facilitator?: string\n): PaymentAcceptance {\n return {\n network: requirements.network,\n asset: requirements.asset,\n amount: requirements.maxAmountRequired,\n // scheme is REQUIRED by the facilitator's v2 PaymentRequirementsV2. Dropping it\n // here produced an accepts[] entry that no v2 client could pay: the spec makes\n // the client echo the accept verbatim, so the omission travelled downstream and\n // died in deserialization with an error naming no field.\n scheme: requirements.scheme,\n payTo: requirements.payTo,\n resource: requirements.resource,\n description: requirements.description,\n mimeType: requirements.mimeType,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n ...(facilitator ? { facilitator } : {}),\n ...(requirements.outputSchema !== undefined ? { outputSchema: requirements.outputSchema } : {}),\n ...(requirements.extra !== undefined ? { extra: requirements.extra } : {}),\n };\n}\n\nfunction create402ResponseBody(\n primaryRequirement: PaymentRequirements,\n advertisedRequirements: PaymentRequirements[],\n version: X402Version,\n facilitator?: string\n): Record<string, unknown> {\n const normalizedPrimary = normalizeRequirementForVersion(primaryRequirement, version);\n const normalizedAdvertised = advertisedRequirements.map((requirements) =>\n normalizeRequirementForVersion(requirements, version)\n );\n\n const body: Record<string, unknown> = {\n x402Version: version,\n ...normalizedPrimary,\n };\n\n if (version === 2 && normalizedAdvertised.length > 1) {\n body.accepts = normalizedAdvertised.map((requirements) =>\n toPaymentAcceptance(requirements, facilitator)\n );\n }\n\n return body;\n}\n\nfunction getComparableNetwork(network: string): string {\n return parseNetworkIdentifier(network).toLowerCase();\n}\n\nfunction getPaymentRecipient(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n const authorization = payload.authorization;\n\n if (isObject(authorization) && typeof authorization.to === 'string') {\n return authorization.to.toLowerCase();\n }\n\n if (typeof payload.to === 'string') {\n return payload.to.toLowerCase();\n }\n\n return undefined;\n}\n\nfunction getPaymentAmount(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n const authorization = payload.authorization;\n\n if (isObject(authorization) && typeof authorization.value === 'string') {\n return authorization.value;\n }\n\n if (typeof payload.amount === 'string') {\n return payload.amount;\n }\n\n return undefined;\n}\n\nfunction getPaymentAsset(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n\n if (typeof payload.tokenContract === 'string') {\n return payload.tokenContract.toLowerCase();\n }\n\n return undefined;\n}\n\nasync function resolvePaymentRequirement(\n payment: X402Header,\n requirements: PaymentRequirements[],\n resolver?: PaymentRequirementResolver\n): Promise<{ requirement: PaymentRequirements | null; reason?: string }> {\n const normalizedRequirements = requirements.map((requirements) =>\n normalizeRequirementForVersion(requirements, payment.x402Version)\n );\n\n if (resolver) {\n const resolved = await resolver(payment, normalizedRequirements);\n return {\n requirement: resolved\n ? normalizeRequirementForVersion(resolved, payment.x402Version)\n : null,\n ...(resolved ? {} : { reason: 'Custom requirement resolver did not return a matching requirement.' }),\n };\n }\n\n const networkMatches = normalizedRequirements.filter((requirements) =>\n getComparableNetwork(requirements.network) === getComparableNetwork(payment.network)\n );\n\n if (networkMatches.length === 0) {\n return {\n requirement: null,\n reason: `No advertised payment requirement matched network ${payment.network}.`,\n };\n }\n\n let matches = networkMatches;\n\n const paymentRecipient = getPaymentRecipient(payment);\n if (paymentRecipient) {\n const recipientMatches = matches.filter((requirements) =>\n requirements.payTo.toLowerCase() === paymentRecipient\n );\n if (recipientMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment recipient does not match any advertised requirement.',\n };\n }\n matches = recipientMatches;\n }\n\n const paymentAmount = getPaymentAmount(payment);\n if (paymentAmount) {\n const amountMatches = matches.filter((requirements) =>\n requirements.maxAmountRequired === paymentAmount\n );\n if (amountMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment amount does not match any advertised requirement.',\n };\n }\n matches = amountMatches;\n }\n\n const paymentAsset = getPaymentAsset(payment);\n if (paymentAsset) {\n const assetMatches = matches.filter((requirements) =>\n requirements.asset.toLowerCase() === paymentAsset\n );\n if (assetMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment asset does not match any advertised requirement.',\n };\n }\n matches = assetMatches;\n }\n\n if (matches.length !== 1) {\n return {\n requirement: null,\n reason: 'Payment matched multiple advertised requirements. Advertise unique network/payTo/amount combinations or provide resolveRequirement().',\n };\n }\n\n return { requirement: matches[0] };\n}\n\nfunction createVerifiedPaymentState(\n client: FacilitatorClient,\n payment: X402Header,\n requirements: PaymentRequirements,\n verifyResult: VerifyResponse\n): VerifiedPaymentState {\n let settlePromise: Promise<SettleResponse> | null = null;\n return {\n payment,\n requirements,\n verifyResult,\n settle: () => {\n if (!settlePromise) {\n settlePromise = client.settle(payment, requirements);\n }\n return settlePromise;\n },\n };\n}\n\n/**\n * Create an Express-compatible middleware for x402 payments\n *\n * @param getRequirements - Function to get payment requirements for a request\n * @param options - Middleware options\n * @returns Express middleware function\n *\n * @example\n * ```ts\n * const paymentMiddleware = createPaymentMiddleware(\n * (req) => ({\n * amount: '1.00',\n * recipient: process.env.PAYMENT_RECIPIENT,\n * resource: `${req.protocol}://${req.get('host')}${req.originalUrl}`,\n * }),\n * { facilitatorUrl: 'https://facilitator.uvd.xyz' }\n * );\n *\n * app.get('/premium/*', paymentMiddleware, async (req, res) => {\n * const settleResult = await req.x402?.settle();\n * if (!settleResult?.success) {\n * return res.status(500).json({ error: settleResult?.error });\n * }\n *\n * res.json({ premium: 'data' });\n * });\n * ```\n */\nexport function createPaymentMiddleware(\n getRequirements: (req: { headers: Record<string, string | string[] | undefined> }) => PaymentRequirementsOptions,\n options: PaymentMiddlewareOptions = {}\n): (\n req: { headers: Record<string, string | string[] | undefined>; x402?: VerifiedPaymentState },\n res: { status: (code: number) => { json: (body: unknown) => void; set: (headers: Record<string, string>) => { json: (body: unknown) => void } } },\n next: () => void\n) => Promise<void> {\n const client = new FacilitatorClient({\n baseUrl: options.facilitatorUrl || options.baseUrl,\n timeout: options.timeout,\n });\n const settlementStrategy = options.settlementStrategy || 'before-handler';\n\n return async (req, res, next) => {\n // Extract payment header\n const payment = extractPaymentFromHeaders(req.headers);\n\n // If no payment, return 402\n if (!payment) {\n const reqOptions = getRequirements(req);\n const { status, headers, body } = create402Response(reqOptions);\n res.status(status).set(headers).json(body);\n return;\n }\n\n // Build requirements and verify\n const reqOptions = getRequirements(req);\n const requirements = buildPaymentRequirements(reqOptions);\n const verifyResult = await client.verify(payment, requirements);\n\n if (!verifyResult.isValid) {\n res.status(402).json({\n error: 'Payment verification failed',\n reason: verifyResult.invalidReason,\n });\n return;\n }\n\n req.x402 = createVerifiedPaymentState(client, payment, requirements, verifyResult);\n\n if (settlementStrategy === 'before-handler') {\n const settleResult = await req.x402.settle();\n if (!settleResult.success) {\n res.status(500).json({\n error: 'Payment settlement failed',\n reason: settleResult.error || 'Unknown settlement error',\n });\n return;\n }\n }\n\n next();\n };\n}\n\n// ============================================================================\n// HONO MIDDLEWARE\n// ============================================================================\n\n/**\n * Options for creating a Hono x402 payment middleware\n */\nexport interface HonoMiddlewareOptions extends PaymentMiddlewareOptions {\n /** Payment requirements to advertise */\n accepts: PaymentAcceptance[];\n /** Response version to advertise (defaults to auto) */\n x402Version?: X402Version | 'auto';\n /** Custom requirement resolver for ambiguous multi-accept flows */\n resolveRequirement?: PaymentRequirementResolver;\n}\n\n/**\n * Create a Hono-compatible middleware for x402 payments.\n *\n * Handles the x402 payment flow:\n * 1. Returns 402 with payment requirements if no X-PAYMENT header\n * 2. Verifies the payment with the facilitator\n * 3. Optionally settles before the handler when settlementStrategy is set\n * 4. Passes control to the next handler on success\n *\n * @param options - Middleware options with facilitator URL and payment accepts\n * @returns Hono middleware function\n *\n * @example\n * ```ts\n * import { createHonoMiddleware } from 'uvd-x402-sdk';\n *\n * const paywall = createHonoMiddleware({\n * accepts: [{\n * network: 'skale-base',\n * asset: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n * amount: '1000000',\n * payTo: '0xYourWallet',\n * extra: { name: 'Bridged USDC (SKALE Bridge)', version: '2' },\n * }],\n * });\n *\n * app.get('/api/premium', paywall, (c) => {\n * return c.json({ message: 'Premium content!' });\n * });\n * ```\n */\nexport function createHonoMiddleware(options: HonoMiddlewareOptions) {\n const client = new FacilitatorClient({\n baseUrl: options.facilitatorUrl || options.baseUrl,\n timeout: options.timeout,\n });\n const settlementStrategy = options.settlementStrategy || 'before-handler';\n\n if (!options.accepts[0]) {\n throw new Error('At least one accept entry is required');\n }\n\n return async (\n c: {\n req: { header: (name: string) => string | undefined; url: string };\n json: (body: unknown, status?: number) => unknown;\n set?: (key: string, value: unknown) => void;\n },\n next: () => Promise<void>\n ) => {\n const paymentHeader = c.req.header('X-PAYMENT') || c.req.header('x-payment');\n const advertisedVersion = resolveAdvertisedVersion(options.accepts, options.x402Version);\n const advertisedRequirements = options.accepts.map((accept) =>\n buildRequirementFromAcceptance(accept, c.req.url, advertisedVersion)\n );\n\n if (!paymentHeader) {\n return c.json(\n create402ResponseBody(\n advertisedRequirements[0],\n advertisedRequirements,\n advertisedVersion,\n options.facilitatorUrl\n ),\n 402\n );\n }\n\n const parsed = parsePaymentHeader(paymentHeader);\n if (!parsed) {\n return c.json({ error: 'Invalid X-PAYMENT header' }, 400);\n }\n\n const { requirement, reason } = await resolvePaymentRequirement(\n parsed,\n advertisedRequirements,\n options.resolveRequirement\n );\n\n if (!requirement) {\n return c.json({\n error: 'Payment verification failed',\n reason,\n }, 402);\n }\n\n const verifyResult = await client.verify(parsed, requirement);\n if (!verifyResult.isValid) {\n return c.json({\n error: 'Payment verification failed',\n reason: verifyResult.invalidReason,\n }, 402);\n }\n\n const verifiedPayment = createVerifiedPaymentState(client, parsed, requirement, verifyResult);\n c.set?.('x402', verifiedPayment);\n\n if (settlementStrategy === 'before-handler') {\n const settleResult = await verifiedPayment.settle();\n if (!settleResult.success) {\n return c.json({\n error: 'Payment settlement failed',\n reason: settleResult.error || 'Unknown error',\n }, 500);\n }\n }\n\n await next();\n };\n}\n\n// ============================================================================\n// BAZAAR DISCOVERY API\n// ============================================================================\n//\n// The Bazaar is the discovery registry served by the facilitator itself, under\n// `/discovery/*`. There is no separate Bazaar host.\n\n/**\n * Maximum length of the free-text `q` filter.\n *\n * Mirrors the facilitator's `MAX_SEARCH_LEN`; a longer needle is rejected\n * server-side with a 400.\n */\nexport const MAX_SEARCH_LEN = 128;\n\n/**\n * Liveness of a registered resource, as measured by the facilitator's prober.\n *\n * Resources that stop answering are quarantined rather than deleted, so filter\n * on this before paying anyone.\n */\nexport type DiscoveryHealthStatus =\n | 'alive'\n | 'degraded'\n | 'auth_gated'\n | 'quarantined'\n | 'unknown'\n | 'unprobeable';\n\n/** Values accepted by the `health` filter, including the `any` escape hatch. */\nexport const HEALTH_FILTERS = [\n 'alive',\n 'degraded',\n 'auth_gated',\n 'quarantined',\n 'unknown',\n 'unprobeable',\n 'any',\n] as const;\n\n/** Curated tier, in descending order of trust. */\nexport type DiscoveryTier = 'first_party' | 'vip' | 'verified' | 'listed';\n\n/** Values accepted by the `tier` filter. */\nexport const TIER_FILTERS = [\n 'first_party',\n 'vip',\n 'verified',\n 'listed',\n] as const;\n\n/** How a resource got into the registry. */\nexport type DiscoverySource =\n | 'self_registered'\n | 'settlement'\n | 'crawled'\n | 'aggregated';\n\n/** Health of a single resource, as reported by the registry's prober. */\nexport interface DiscoveryHealth {\n /** Last observed liveness */\n status?: DiscoveryHealthStatus;\n /** Unix epoch seconds of the last probe */\n lastChecked?: number;\n /** HTTP status the probe got back (402 is the healthy answer for x402) */\n httpStatus?: number;\n /** Round-trip time of the last probe, in milliseconds */\n latencyMs?: number;\n}\n\n/** Curation metadata attached to a resource. */\nexport interface DiscoveryCuration {\n /** Curated tier */\n tier?: DiscoveryTier;\n /** Human-readable name of the curated set */\n label?: string;\n}\n\n/** One payment method a resource declares. */\nexport interface DiscoveryAccepts {\n /** Payment scheme (\"exact\", \"escrow\", \"commerce\") */\n scheme: string;\n /** CAIP-2 network id, e.g. \"eip155:8453\" */\n network: string;\n /** Token contract address */\n asset?: string;\n /** Price in atomic units of `asset` */\n amount?: string;\n /** Recipient address */\n payTo?: string;\n /** Settlement deadline in seconds */\n maxTimeoutSeconds?: number;\n /** Scheme-specific extras (EIP-712 domain, etc.) */\n extra?: Record<string, unknown>;\n /** Anything the registry adds later */\n [key: string]: unknown;\n}\n\n/**\n * A discoverable paid resource, exactly as `GET /discovery/resources` serves it.\n *\n * Timestamps are Unix epoch **seconds**, not ISO strings and not milliseconds.\n */\nexport interface DiscoveryResource {\n /** Resource URL. This is the registry's primary key -- there is no `id` */\n url: string;\n /** Resource type (\"http\", \"mcp\", \"a2a\") */\n type: string;\n /** x402 protocol version the resource speaks */\n x402Version: number;\n /** Human-readable description */\n description?: string;\n /** Payment methods the resource accepts */\n accepts: DiscoveryAccepts[];\n /** Free-form metadata (category, provider, tags) */\n metadata?: Record<string, unknown>;\n /** How this resource entered the registry */\n source?: DiscoverySource;\n /** Facilitator this resource was aggregated from */\n sourceFacilitator?: string;\n /** Unix epoch seconds when the registry first saw this resource */\n firstSeen?: number;\n /** Unix epoch seconds when the registry last saw this resource */\n lastSeen?: number;\n /** Unix epoch seconds of the last change to this record */\n lastUpdated?: number;\n /** Liveness, when the resource has been probed */\n health?: DiscoveryHealth;\n /** Curation tier, when the resource has been curated */\n curation?: DiscoveryCuration;\n /** Anything the registry adds later */\n [key: string]: unknown;\n}\n\n/** Pagination envelope of `GET /discovery/resources`. */\nexport interface DiscoveryPagination {\n /** Page size that was applied */\n limit: number;\n /** Offset that was applied */\n offset: number;\n /** Total number of resources matching the filters, across all pages */\n total: number;\n}\n\n/** Paginated response from `GET /discovery/resources`. */\nexport interface DiscoveryResponse {\n /** x402 protocol version of the response envelope */\n x402Version: number;\n /** Resources on this page */\n items: DiscoveryResource[];\n /** Pagination state */\n pagination: DiscoveryPagination;\n}\n\n/**\n * Filters for `listResources()`.\n *\n * Every one of these is applied server-side over the whole catalog, so\n * `pagination.total` reflects the filtered set. Filtering a page after the\n * fact is not the same thing and will under-report.\n */\nexport interface DiscoveryListOptions {\n /** Page size (default: 10, max: 100) */\n limit?: number;\n /** Number of resources to skip */\n offset?: number;\n /** Filter by category */\n category?: string;\n /** Filter by network, CAIP-2 or v1 name */\n network?: string;\n /** Filter by provider name */\n provider?: string;\n /** Filter by tag */\n tag?: string;\n /** Filter by how the resource was discovered */\n source?: DiscoverySource;\n /** Filter by originating facilitator */\n sourceFacilitator?: string;\n /** Filter by liveness, or 'any' to opt out of the default visibility rules */\n health?: DiscoveryHealthStatus | 'any';\n /** Filter by curated tier */\n tier?: DiscoveryTier;\n /** Free-text search over url / description / provider / category / tags */\n q?: string;\n}\n\n/** Options for `registerResource()`. */\nexport interface DiscoveryRegisterOptions {\n /** URL of the paid resource. Doubles as its identity in the registry */\n url: string;\n /** Resource type (default: \"http\") */\n type?: string;\n /** Human-readable description */\n description?: string;\n /** Payment methods the resource accepts */\n accepts?: DiscoveryAccepts[];\n /** Free-form metadata (category, provider, tags) */\n metadata?: Record<string, unknown>;\n}\n\n/** Aggregate catalog metrics from `GET /discovery/stats`. */\nexport interface DiscoveryStats {\n /** Every record the registry holds, including quarantined ones */\n total: number;\n /** Records served by default listings */\n visible: number;\n /** Counts by discovery source */\n bySource: Record<string, number>;\n /** Counts by originating facilitator */\n bySourceFacilitator: Record<string, number>;\n /** Counts by CAIP-2 network */\n byNetwork: Record<string, number>;\n /** Counts by curated tier */\n byTier: Record<string, number>;\n /** Counts by liveness */\n byHealth: Record<string, number>;\n /** Unix epoch seconds this snapshot was computed (60s cache) */\n generatedAt?: number;\n}\n\n/** Options for the {@link BazaarClient}. */\nexport interface BazaarClientOptions {\n /** Facilitator base URL (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/** Render an epoch-seconds field as a `Date`. */\nexport function epochToDate(seconds?: number): Date | undefined {\n return seconds === undefined ? undefined : new Date(seconds * 1000);\n}\n\n/** True when the last probe reached this resource. */\nexport function isAlive(resource: DiscoveryResource): boolean {\n return resource.health?.status === 'alive';\n}\n\n/**\n * Client for the x402 Bazaar Discovery API.\n *\n * The Bazaar is the facilitator's own registry of x402-enabled resources.\n * Providers register their endpoints and consumers discover them, with a\n * liveness probe and a curation tier attached to every record.\n *\n * @example\n * ```ts\n * const bazaar = new BazaarClient();\n *\n * // Only endpoints a probe actually reached, best-curated first\n * const page = await bazaar.listResources({ limit: 20, health: 'alive', tier: 'vip' });\n * for (const r of page.items) {\n * console.log(r.url, r.health?.status, r.health?.latencyMs, r.curation?.label);\n * }\n *\n * // Free-text search runs server-side over the whole catalog\n * const hits = await bazaar.listResources({ q: 'logs' });\n * console.log(hits.pagination.total);\n *\n * // Register your own\n * await bazaar.registerResource({\n * url: 'https://api.example.com/v1/generate',\n * description: 'Generate images with AI',\n * accepts: [{\n * scheme: 'exact',\n * network: 'eip155:8453',\n * asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * amount: '10000',\n * payTo: '0xYourWallet...',\n * maxTimeoutSeconds: 60,\n * }],\n * metadata: { category: 'ai', tags: ['image'] },\n * });\n * ```\n */\nexport class BazaarClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: BazaarClientOptions = {}) {\n this.baseUrl = (\n options.baseUrl || 'https://facilitator.ultravioletadao.xyz'\n ).replace(/\\/+$/, '');\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Issue a request against the facilitator with the configured timeout.\n */\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: { Accept: 'application/json', ...(init?.headers || {}) },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bazaar API error: ${response.status} - ${errorText}`\n );\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * List resources from the discovery registry.\n *\n * @param options - Server-side filters and pagination\n * @returns One page of resources plus the total across all pages\n *\n * @example\n * ```ts\n * const page = await bazaar.listResources({ network: 'eip155:8453', health: 'alive' });\n * ```\n */\n async listResources(\n options: DiscoveryListOptions = {}\n ): Promise<DiscoveryResponse> {\n if (options.q !== undefined && options.q.length > MAX_SEARCH_LEN) {\n throw new Error(`q must be at most ${MAX_SEARCH_LEN} characters`);\n }\n\n const params = new URLSearchParams();\n params.set('limit', String(options.limit ?? 10));\n params.set('offset', String(options.offset ?? 0));\n if (options.category) params.set('category', options.category);\n if (options.network) params.set('network', options.network);\n if (options.provider) params.set('provider', options.provider);\n if (options.tag) params.set('tag', options.tag);\n if (options.source) params.set('source', options.source);\n if (options.sourceFacilitator)\n params.set('sourceFacilitator', options.sourceFacilitator);\n if (options.health) params.set('health', options.health);\n if (options.tier) params.set('tier', options.tier);\n if (options.q) params.set('q', options.q);\n\n return this.request<DiscoveryResponse>(\n `/discovery/resources?${params.toString()}`\n );\n }\n\n /**\n * Walk the whole filtered catalog, one page at a time.\n *\n * Pages are fetched in sequence rather than in parallel: the read routes are\n * rate limited, and a burst of parallel pages is how a legitimate catalog\n * walk turns into a wall of 429s.\n *\n * @param options - Same filters as {@link listResources}; `limit` is the page size\n *\n * @example\n * ```ts\n * for await (const r of bazaar.iterateResources({ health: 'alive' })) {\n * console.log(r.url);\n * }\n * ```\n */\n async *iterateResources(\n options: DiscoveryListOptions = {}\n ): AsyncGenerator<DiscoveryResource, void, undefined> {\n const pageSize = options.limit ?? 100;\n let offset = options.offset ?? 0;\n\n for (;;) {\n const page = await this.listResources({\n ...options,\n limit: pageSize,\n offset,\n });\n if (page.items.length === 0) return;\n\n for (const item of page.items) yield item;\n\n offset += page.items.length;\n if (offset >= page.pagination.total) return;\n }\n }\n\n /**\n * Look up a single resource by its URL.\n *\n * The registry keys on URL and has no by-id lookup, so this searches and\n * then matches exactly.\n *\n * @param resourceUrl - Exact URL of the resource\n * @returns The resource, or null when it is not registered\n */\n async getResourceByUrl(\n resourceUrl: string\n ): Promise<DiscoveryResource | null> {\n const page = await this.listResources({\n q: resourceUrl.slice(0, MAX_SEARCH_LEN),\n limit: 100,\n health: 'any',\n });\n return page.items.find((item) => item.url === resourceUrl) ?? null;\n }\n\n /**\n * Register a paid resource in the discovery registry.\n *\n * Registration is open and rate limited; re-registering a known URL updates\n * the existing record rather than creating a duplicate.\n *\n * @param options - Resource details\n * @returns The registry's acknowledgement\n */\n async registerResource(\n options: DiscoveryRegisterOptions\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n url: options.url,\n type: options.type || 'http',\n description: options.description || '',\n };\n if (options.accepts) payload.accepts = options.accepts;\n if (options.metadata) payload.metadata = options.metadata;\n\n return this.request<Record<string, unknown>>('/discovery/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n /**\n * Aggregate catalog metrics (60s cached server-side).\n *\n * @returns Counts by source, facilitator, network, tier and liveness\n */\n async getStats(): Promise<DiscoveryStats> {\n return this.request<DiscoveryStats>('/discovery/stats');\n }\n\n /**\n * Check that the facilitator serving the registry is up.\n *\n * @returns True when the facilitator answers its health check\n */\n async healthCheck(): Promise<boolean> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n return response.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * @deprecated Renamed to {@link listResources}, which returns the registry's\n * real `{ items, pagination }` envelope. The old `discover()` returned a\n * `{ resources, page, totalPages }` shape that no endpoint ever served.\n */\n async discover(options: DiscoveryListOptions = {}): Promise<DiscoveryResponse> {\n return this.listResources(options);\n }\n}\n\n/**\n * @deprecated Use {@link DiscoveryResource}. The old shape (`id`, `name`,\n * `pricePerRequest`, `isActive`, ISO `createdAt`) described an API that was\n * never deployed.\n */\nexport type BazaarResource = DiscoveryResource;\n\n/** @deprecated Use {@link DiscoveryResponse}. */\nexport type BazaarDiscoverResponse = DiscoveryResponse;\n\n/** @deprecated Use {@link DiscoveryListOptions}. */\nexport type BazaarDiscoverOptions = DiscoveryListOptions;\n\n/** @deprecated Use {@link DiscoveryRegisterOptions}. */\nexport type BazaarRegisterOptions = DiscoveryRegisterOptions;\n\n// ============================================================================\n// ESCROW & REFUND EXTENSION\n// ============================================================================\n\n/**\n * Escrow payment status\n */\nexport type EscrowStatus =\n | 'pending' // Payment initiated, awaiting confirmation\n | 'held' // Funds held in escrow\n | 'released' // Funds released to recipient\n | 'refunded' // Funds returned to payer\n | 'disputed' // Dispute in progress\n | 'expired'; // Escrow expired without resolution\n\n/**\n * Refund request status\n */\nexport type RefundStatus =\n | 'pending' // Refund requested, awaiting processing\n | 'approved' // Refund approved\n | 'rejected' // Refund rejected\n | 'processed' // Refund completed on-chain\n | 'disputed'; // Under dispute review\n\n/**\n * Dispute resolution outcome\n */\nexport type DisputeOutcome =\n | 'pending' // Dispute under review\n | 'payer_wins' // Payer gets refund\n | 'recipient_wins' // Recipient keeps funds\n | 'split'; // Funds split between parties\n\n/**\n * Escrow payment record\n */\nexport interface EscrowPayment {\n /** Unique escrow ID */\n id: string;\n /** Original payment header (base64 encoded) */\n paymentHeader: string;\n /** Current status */\n status: EscrowStatus;\n /** Network where payment was made */\n network: string;\n /** Payer address */\n payer: string;\n /** Recipient address */\n recipient: string;\n /** Amount in atomic units */\n amount: string;\n /** Token/asset contract */\n asset: string;\n /** Resource URL being paid for */\n resource: string;\n /** Escrow expiration timestamp (ISO) */\n expiresAt: string;\n /** Release conditions (optional) */\n releaseConditions?: {\n /** Minimum time before release (seconds) */\n minHoldTime?: number;\n /** Required confirmations */\n confirmations?: number;\n /** Custom condition metadata */\n custom?: unknown;\n };\n /** Transaction hash if released/refunded */\n transactionHash?: string;\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Last update timestamp (ISO) */\n updatedAt: string;\n}\n\n/**\n * Refund request record\n */\nexport interface RefundRequest {\n /** Unique refund request ID */\n id: string;\n /** Related escrow ID */\n escrowId: string;\n /** Current status */\n status: RefundStatus;\n /** Reason for refund request */\n reason: string;\n /** Additional evidence/details */\n evidence?: string;\n /** Amount requested (may be partial) */\n amountRequested: string;\n /** Amount approved (if any) */\n amountApproved?: string;\n /** Requester (payer) address */\n requester: string;\n /** Transaction hash if processed */\n transactionHash?: string;\n /** Response from recipient/facilitator */\n response?: {\n status: 'approved' | 'rejected';\n reason?: string;\n respondedAt: string;\n };\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Last update timestamp (ISO) */\n updatedAt: string;\n}\n\n/**\n * Dispute record\n */\nexport interface Dispute {\n /** Unique dispute ID */\n id: string;\n /** Related escrow ID */\n escrowId: string;\n /** Related refund request ID (if any) */\n refundRequestId?: string;\n /** Dispute outcome */\n outcome: DisputeOutcome;\n /** Initiator (payer or recipient) */\n initiator: 'payer' | 'recipient';\n /** Reason for dispute */\n reason: string;\n /** Evidence from payer */\n payerEvidence?: string;\n /** Evidence from recipient */\n recipientEvidence?: string;\n /** Arbitration notes */\n arbitrationNotes?: string;\n /** Amount resolved to payer */\n payerAmount?: string;\n /** Amount resolved to recipient */\n recipientAmount?: string;\n /** Transaction hash(es) for resolution */\n transactionHashes?: string[];\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Resolution timestamp (ISO) */\n resolvedAt?: string;\n}\n\n/**\n * Options for creating an escrow payment\n */\nexport interface CreateEscrowOptions {\n /** Payment header (from client SDK) */\n paymentHeader: string;\n /** Payment requirements */\n requirements: PaymentRequirements;\n /** Escrow duration in seconds (default: 86400 = 24h) */\n escrowDuration?: number;\n /** Release conditions */\n releaseConditions?: {\n minHoldTime?: number;\n confirmations?: number;\n custom?: unknown;\n };\n}\n\n/**\n * Options for requesting a refund\n */\nexport interface RequestRefundOptions {\n /** Escrow ID to refund */\n escrowId: string;\n /** Reason for refund */\n reason: string;\n /** Amount to refund (full amount if not specified) */\n amount?: string;\n /** Supporting evidence */\n evidence?: string;\n}\n\n/**\n * Options for the EscrowClient\n */\nexport interface EscrowClientOptions {\n /** Base URL of the Escrow API (default: https://escrow.ultravioletadao.xyz) */\n baseUrl?: string;\n /** API key for authenticated operations */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Client for x402 Escrow & Refund operations\n *\n * The Escrow system holds payments until service is verified,\n * enabling refunds and dispute resolution.\n *\n * @example\n * ```ts\n * // Create escrow payment (backend)\n * const escrow = new EscrowClient();\n * const escrowPayment = await escrow.createEscrow({\n * paymentHeader: req.headers['x-payment'],\n * requirements: paymentRequirements,\n * escrowDuration: 86400, // 24 hours\n * });\n *\n * // After service is provided, release the escrow\n * await escrow.release(escrowPayment.id);\n *\n * // If service not provided, payer can request refund\n * await escrow.requestRefund({\n * escrowId: escrowPayment.id,\n * reason: 'Service not delivered within expected timeframe',\n * });\n * ```\n */\nexport class EscrowClient {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeout: number;\n\n constructor(options: EscrowClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://escrow.ultravioletadao.xyz';\n this.apiKey = options.apiKey;\n this.timeout = options.timeout || 30000;\n }\n\n private getHeaders(authenticated: boolean = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n if (authenticated && this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return headers;\n }\n\n /**\n * Create an escrow payment\n *\n * Holds the payment in escrow until released or refunded.\n *\n * @param options - Escrow creation options\n * @returns Created escrow payment\n */\n async createEscrow(options: CreateEscrowOptions): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({\n paymentHeader: options.paymentHeader,\n paymentRequirements: options.requirements,\n escrowDuration: options.escrowDuration || 86400,\n releaseConditions: options.releaseConditions,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get escrow payment by ID\n *\n * @param escrowId - Escrow payment ID\n * @returns Escrow payment details\n */\n async getEscrow(escrowId: string): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Release escrow funds to recipient\n *\n * Call this after service has been successfully provided.\n *\n * @param escrowId - Escrow payment ID\n * @returns Updated escrow payment with transaction hash\n */\n async release(escrowId: string): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}/release`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Request a refund for an escrow payment\n *\n * Initiates a refund request that must be approved.\n *\n * @param options - Refund request options\n * @returns Created refund request\n */\n async requestRefund(options: RequestRefundOptions): Promise<RefundRequest> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(options.escrowId)}/refund`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({\n reason: options.reason,\n amount: options.amount,\n evidence: options.evidence,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Approve a refund request (for recipients)\n *\n * @param refundId - Refund request ID\n * @param amount - Amount to approve (may be less than requested)\n * @returns Updated refund request\n */\n async approveRefund(refundId: string, amount?: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}/approve`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ amount }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Reject a refund request (for recipients)\n *\n * @param refundId - Refund request ID\n * @param reason - Reason for rejection\n * @returns Updated refund request\n */\n async rejectRefund(refundId: string, reason: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}/reject`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ reason }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get refund request by ID\n *\n * @param refundId - Refund request ID\n * @returns Refund request details\n */\n async getRefund(refundId: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Open a dispute for an escrow payment\n *\n * Initiates arbitration when payer and recipient disagree.\n *\n * @param escrowId - Escrow payment ID\n * @param reason - Reason for dispute\n * @param evidence - Supporting evidence\n * @returns Created dispute\n */\n async openDispute(\n escrowId: string,\n reason: string,\n evidence?: string\n ): Promise<Dispute> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}/dispute`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ reason, evidence }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Submit evidence to a dispute\n *\n * @param disputeId - Dispute ID\n * @param evidence - Evidence to submit\n * @returns Updated dispute\n */\n async submitEvidence(disputeId: string, evidence: string): Promise<Dispute> {\n const url = `${this.baseUrl}/dispute/${encodeURIComponent(disputeId)}/evidence`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ evidence }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get dispute by ID\n *\n * @param disputeId - Dispute ID\n * @returns Dispute details\n */\n async getDispute(disputeId: string): Promise<Dispute> {\n const url = `${this.baseUrl}/dispute/${encodeURIComponent(disputeId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * List escrow payments (with filters)\n *\n * @param options - Filter and pagination options\n * @returns Paginated list of escrow payments\n */\n async listEscrows(options: {\n status?: EscrowStatus;\n payer?: string;\n recipient?: string;\n page?: number;\n limit?: number;\n } = {}): Promise<{\n escrows: EscrowPayment[];\n total: number;\n page: number;\n limit: number;\n hasMore: boolean;\n }> {\n const params = new URLSearchParams();\n if (options.status) params.set('status', options.status);\n if (options.payer) params.set('payer', options.payer);\n if (options.recipient) params.set('recipient', options.recipient);\n if (options.page) params.set('page', options.page.toString());\n if (options.limit) params.set('limit', options.limit.toString());\n\n const url = `${this.baseUrl}/escrow${params.toString() ? `?${params}` : ''}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(true),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Query on-chain escrow state from the facilitator\n *\n * Calls POST /escrow/state to read current escrow state without settlement.\n *\n * @param options - Escrow state query parameters\n * @returns On-chain escrow state (status, balance, timestamps)\n *\n * @example\n * ```ts\n * const state = await escrow.getEscrowState({\n * network: 'base-mainnet',\n * payer: '0xPayer...',\n * recipient: '0xRecipient...',\n * nonce: '0x1234...',\n * });\n * console.log(`Status: ${state.status}`);\n * ```\n */\n async getEscrowState(options: {\n network: string;\n payer: string;\n recipient: string;\n nonce: string;\n }): Promise<Record<string, unknown>> {\n const url = `${this.baseUrl}/escrow/state`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(options),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Check Escrow API health\n *\n * @returns True if healthy\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// ============================================================================\n// ESCROW HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if an escrow can be released\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow can be released\n */\nexport function canReleaseEscrow(escrow: EscrowPayment): boolean {\n if (escrow.status !== 'held') {\n return false;\n }\n\n // Check expiration\n if (new Date(escrow.expiresAt) < new Date()) {\n return false;\n }\n\n // Check minimum hold time if specified\n if (escrow.releaseConditions?.minHoldTime) {\n const createdAt = new Date(escrow.createdAt);\n const minReleaseTime = new Date(\n createdAt.getTime() + escrow.releaseConditions.minHoldTime * 1000\n );\n if (new Date() < minReleaseTime) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if an escrow can be refunded\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow can be refunded\n */\nexport function canRefundEscrow(escrow: EscrowPayment): boolean {\n // Can only refund held or pending escrows\n return escrow.status === 'held' || escrow.status === 'pending';\n}\n\n/**\n * Check if an escrow is expired\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow is expired\n */\nexport function isEscrowExpired(escrow: EscrowPayment): boolean {\n return new Date(escrow.expiresAt) < new Date();\n}\n\n/**\n * Calculate time remaining until escrow expires\n *\n * @param escrow - Escrow payment to check\n * @returns Milliseconds until expiration (negative if expired)\n */\nexport function escrowTimeRemaining(escrow: EscrowPayment): number {\n return new Date(escrow.expiresAt).getTime() - Date.now();\n}\n\n// ============================================================================\n// ERC-8004 TRUSTLESS AGENTS\n// ============================================================================\n\n/**\n * ERC-8004 extension identifier\n */\nexport const ERC8004_EXTENSION_ID = '8004-reputation';\n\n/**\n * Agent ID type: EVM uses sequential uint256 (number), Solana uses base58 pubkey (string)\n */\nexport type AgentId = number | string;\n\n/**\n * ERC-8004 contract addresses per network\n */\n// Mainnet addresses (CREATE2 deterministic - same on all mainnets)\nconst MAINNET_IDENTITY = '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432';\nconst MAINNET_REPUTATION = '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63';\n// Deployed after the identity/reputation pair, which is why it was missing here.\n// Verified live on all ten EVM mainnets; SKALE Base has no code at this address\n// and is the one mainnet that legitimately has no validation registry.\nconst MAINNET_VALIDATION = '0x8004Cc8439f36fd5F9F049D9fF86523Df6dAAB58';\n\n// Testnet addresses (same on all testnets)\nconst TESTNET_IDENTITY = '0x8004A818BFB912233c491871b3d84c89A494BD9e';\nconst TESTNET_REPUTATION = '0x8004B663056A597Dffe9eCcC1965A193B7388713';\nconst TESTNET_VALIDATION = '0x8004Cb1BF31DAf7788923b405b754f57acEB4272';\n\n// Solana program IDs (QuantuLabs 8004-solana)\nconst SOLANA_AGENT_REGISTRY = '8oo4dC4JvBLwy5tGgiH3WwK4B9PWxL9Z4XjA2jzkQMbQ';\nconst SOLANA_ATOM_ENGINE = 'AToMw53aiPQ8j7iHVb4fGt6nzUNxUhcPc3tbPBZuzVVb';\n\n/**\n * ERC-8004 contract addresses per network (21 networks: 19 EVM + 2 Solana)\n */\nexport const ERC8004_CONTRACTS: Record<string, {\n identityRegistry?: string;\n reputationRegistry?: string;\n validationRegistry?: string;\n agentRegistryProgram?: string;\n atomEngineProgram?: string;\n}> = {\n // Mainnets (11)\n ethereum: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n base: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n polygon: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n arbitrum: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n optimism: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n celo: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n bsc: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n monad: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n avalanche: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n scroll: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n // SKALE Base is the one mainnet without a validation registry (no code at\n // the canonical address), so leaving it out is correct, not an omission.\n 'skale-base': {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n },\n // Deprecated alias for 'base' -- kept so existing lookups keep resolving.\n 'base-mainnet': {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n // Testnets (8)\n 'ethereum-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'base-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'polygon-amoy': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'arbitrum-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'optimism-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'celo-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'avalanche-fuji': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'skale-base-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n // Solana (2) - uses QuantuLabs 8004-solana Anchor program + ATOM Engine\n solana: {\n agentRegistryProgram: SOLANA_AGENT_REGISTRY,\n atomEngineProgram: SOLANA_ATOM_ENGINE,\n },\n 'solana-devnet': {\n agentRegistryProgram: SOLANA_AGENT_REGISTRY,\n atomEngineProgram: SOLANA_ATOM_ENGINE,\n },\n};\n\n/**\n * Return the network name the facilitator actually accepts.\n *\n * `base-mainnet` reads like the canonical spelling and is not: the facilitator\n * answers `400 {\"error\": \"Invalid network: base-mainnet\"}`. Every name is passed\n * through here before it reaches a URL or a request body, so callers holding the\n * old spelling keep working instead of being rejected at the edge.\n */\nexport function wireNetwork(network: string): string {\n return network === 'base-mainnet' ? 'base' : network;\n}\n\n/**\n * Network type for ERC-8004 operations (21 networks: 19 EVM + 2 Solana)\n *\n * These are the names the FACILITATOR accepts, verified against\n * GET /feedback -> supportedNetworks. 'base-mainnet' is kept only as a\n * deprecated alias: the facilitator rejects it outright (400 \"Invalid network\"),\n * so anything passed through this module is normalised to 'base' before it\n * reaches the wire. Use 'base'.\n */\nexport type Erc8004Network =\n // EVM Mainnets\n | 'ethereum' | 'base' | 'polygon' | 'arbitrum' | 'optimism' | 'celo' | 'bsc' | 'monad' | 'avalanche' | 'scroll' | 'skale-base'\n // Deprecated alias, rewritten to 'base' before it reaches the wire\n | 'base-mainnet'\n // EVM Testnets\n | 'ethereum-sepolia' | 'base-sepolia' | 'polygon-amoy' | 'arbitrum-sepolia' | 'optimism-sepolia' | 'celo-sepolia' | 'avalanche-fuji' | 'skale-base-sepolia'\n // Solana (uses QuantuLabs 8004-solana Anchor program + ATOM Engine)\n | 'solana' | 'solana-devnet';\n\n/**\n * Networks where the facilitator serves the RELAYED feedback rail, i.e. where\n * Execution Market has deployed a `FeedbackDelegate` and the facilitator\n * verified it on-chain (code present, and its `REPUTATION_REGISTRY()` reads\n * back that network's registry).\n *\n * Anywhere else `POST /feedback/evm/prepare` answers 400 — and it should. An\n * invented delegate address would send a type-4 transaction to an account with\n * no code behind it, and in the EVM a `.call()` to an address with no code\n * RETURNS SUCCESS. The failure would look exactly like a rating that rated\n * nobody.\n *\n * `avalanche` is absent and is not waiting to join: the C-Chain rejects the\n * transaction type itself (`-32000 transaction type not supported`), so there\n * is nothing to deploy against. Anchor the rating on a chain that supports\n * EIP-7702; the payment stays where it was made.\n */\nexport const RELAYED_FEEDBACK_NETWORKS: readonly Erc8004Network[] = [\n 'base',\n 'ethereum',\n 'polygon',\n 'arbitrum',\n 'optimism',\n 'celo',\n 'bsc',\n 'monad',\n 'base-sepolia',\n] as const;\n\n/**\n * Whether `network` serves the rater-authored feedback rail.\n *\n * Lets a caller route without paying a round trip for a 400. The facilitator\n * re-checks the delegate on-chain on every request regardless — this list is a\n * routing hint, never the authority.\n */\nexport function supportsRelayedFeedback(network: string): boolean {\n return (RELAYED_FEEDBACK_NETWORKS as readonly string[]).includes(wireNetwork(network));\n}\n\n/**\n * An EIP-7702 authorization, as a wallet produces it.\n *\n * Needed only the first time a rater rates: it points their EOA at the\n * `FeedbackDelegate`. Once delegated, `prepare` answers `delegated: true` and\n * the submission carries no authorization at all.\n */\nexport interface RelayAuthorizationParams {\n /**\n * Chain the authorization is for.\n *\n * `0` is EIP-7702's wildcard and is valid on EVERY chain — a far broader\n * grant than pinning this one. Send the chain id `prepare` returned.\n */\n chainId: number;\n /**\n * The delegate the account is pointed at. Must be the address `prepare`\n * offered; the facilitator refuses anything else before it pays for a\n * transaction.\n */\n address: string;\n /** The rater account's nonce at the moment the authorization executes */\n nonce: number;\n yParity: number;\n r: string;\n s: string;\n}\n\n/**\n * Request body for `POST /feedback/evm/prepare`.\n *\n * `rater` is the address that will appear on-chain as the author, which is the\n * whole point of this rail.\n */\nexport interface PrepareRelayFeedbackRequest {\n x402Version: 1 | 2;\n network: Erc8004Network;\n feedback: FeedbackParams & { rater: string };\n}\n\n/**\n * Response from `POST /feedback/evm/prepare`.\n *\n * Everything the rater has to sign so the CHAIN records them as the author\n * while the facilitator pays the gas.\n */\nexport interface PrepareRelayFeedbackResponse {\n success: boolean;\n /** The `FeedbackDelegate` the rater's EOA must be delegated to */\n delegate?: string;\n /** Registry calldata the rater is authorising, hex-encoded */\n data?: string;\n /**\n * The value the rater's signature must recover against.\n *\n * **The EIP-191 envelope is already applied here.** A holder of a raw key\n * signs this directly as a prehash (viem's `sign({ hash })`, ethers'\n * `signingKey.sign`). A WALLET must not be handed this value: `personal_sign`\n * applies the envelope itself, so it gets wrapped twice and recovers an\n * address that is not the rater. Wallets sign {@link signingPayload}.\n */\n digest?: string;\n /**\n * The same hash with the envelope still OFF — what a wallet signs.\n *\n * `keccak256('\\x19Ethereum Signed Message:\\n32' || signingPayload)` is\n * exactly {@link digest}, so a client can check the two against each other\n * rather than rebuilding the preimage from `data`.\n *\n * Requires facilitator v1.95.0+. Older facilitators omit it; a client that\n * needs it should fail loudly rather than fall back to signing `digest`\n * through a wallet, which produces a well-formed signature that authorises\n * nobody.\n */\n signingPayload?: string;\n /**\n * Unix seconds after which the authorisation is void. Short on purpose:\n * relaying is permissionless, so a signed authorisation is live in the wild\n * until it expires.\n */\n deadline?: number;\n /** Single-use value binding this authorisation. Echo it back on submit */\n nonce?: string;\n /**\n * Whether the account is already delegated. When `false` the submission MUST\n * carry an `authorization`.\n */\n delegated: boolean;\n /** The account nonce to put in the EIP-7702 authorization, when needed */\n accountNonce?: number;\n chainId: number;\n error?: string;\n network: Erc8004Network;\n}\n\n/**\n * Request body for `POST /feedback/evm/submit`.\n *\n * The feedback parameters are not redundant with `prepare`: the facilitator\n * rebuilds the registry calldata from them and requires the rater's signature\n * to cover exactly that. It does not relay calldata it was handed.\n */\nexport interface SubmitRelayFeedbackRequest {\n x402Version: 1 | 2;\n network: Erc8004Network;\n feedback: FeedbackParams & { rater: string };\n /** The deadline `prepare` returned */\n deadline: number;\n /** The single-use nonce `prepare` returned */\n nonce: string;\n /**\n * The rater's signature. It must recover to `rater` over `digest` — so\n * either a raw-key prehash signature over `digest`, or a wallet\n * `personal_sign` over `signingPayload`. Not `personal_sign` over `digest`.\n */\n signature: string;\n /** Required only when `prepare` answered `delegated: false` */\n authorization?: RelayAuthorizationParams;\n}\n\n/**\n * Proof of payment returned when settling with ERC-8004 extension\n */\nexport interface ProofOfPayment {\n /** Transaction hash of the settled payment */\n transactionHash: string;\n /** Block number where the transaction was included */\n blockNumber: number;\n /** Network where the payment was settled */\n network: string;\n /** The payer (consumer/client) address */\n payer: string;\n /** The payee (agent/resource owner) address */\n payee: string;\n /** Amount paid in token base units */\n amount: string;\n /** Token contract address */\n token: string;\n /** Unix timestamp of the block */\n timestamp: number;\n /** Keccak256 hash of the payment data for verification */\n paymentHash: string;\n}\n\n/**\n * Extended settle response with ERC-8004 proof of payment\n */\nexport interface SettleResponseWithProof extends SettleResponse {\n /** Proof of payment for ERC-8004 reputation submission */\n proofOfPayment?: ProofOfPayment;\n}\n\n/**\n * Agent identity from the Identity Registry\n */\nexport interface AgentIdentity {\n /** The agent's ID (EVM: sequential uint256, Solana: base58 pubkey string) */\n agentId: AgentId;\n /** Owner address of the agent NFT */\n owner: string;\n /** URI pointing to agent registration file */\n agentUri: string;\n /** Payment wallet address (if set) */\n agentWallet?: string;\n /** Network where the agent is registered */\n network: Erc8004Network;\n}\n\n/**\n * Agent registration file structure (resolved from agentURI)\n */\nexport interface AgentRegistrationFile {\n /** Type identifier */\n type: string;\n /** Agent name */\n name: string;\n /** Agent description */\n description: string;\n /** Image URL */\n image?: string;\n /** List of services the agent provides */\n services: AgentService[];\n /** Whether x402 payments are supported */\n x402Support: boolean;\n /** Whether the agent is active */\n active: boolean;\n /** List of registrations across chains */\n registrations: AgentRegistration[];\n /** Supported trust models */\n supportedTrust: string[];\n}\n\n/**\n * Agent service entry\n */\nexport interface AgentService {\n name: string;\n endpoint: string;\n version?: string;\n}\n\n/**\n * Agent registration reference\n */\nexport interface AgentRegistration {\n agentId: AgentId;\n agentRegistry: string; // Format: {namespace}:{chainId}:{address}\n}\n\n/**\n * Reputation summary for an agent\n */\nexport interface ReputationSummary {\n /** Agent ID (EVM: number, Solana: string) */\n agentId: AgentId;\n /** Number of feedback entries */\n count: number;\n /** Aggregated value */\n summaryValue: number;\n /** Decimal places for summaryValue */\n summaryValueDecimals: number;\n /** Network */\n network: Erc8004Network;\n}\n\n/**\n * Individual feedback entry\n */\nexport interface FeedbackEntry {\n /** Client who submitted the feedback */\n client: string;\n /** Feedback index (1-indexed) */\n feedbackIndex: number;\n /** Feedback value */\n value: number;\n /** Value decimals */\n valueDecimals: number;\n /** Primary tag */\n tag1: string;\n /** Secondary tag */\n tag2: string;\n /** Whether this feedback was revoked */\n isRevoked: boolean;\n}\n\n/**\n * Parameters for submitting reputation feedback\n */\nexport interface FeedbackParams {\n /** The agent's ID (EVM: tokenId number, Solana: base58 pubkey string) */\n agentId: AgentId;\n /** Feedback value (e.g., 87 for 87/100) */\n value: number;\n /** Decimal places for value interpretation (0-18) */\n valueDecimals?: number;\n /** Primary categorization tag (e.g., \"starred\", \"uptime\") */\n tag1?: string;\n /** Secondary categorization tag */\n tag2?: string;\n /** Service endpoint that was used */\n endpoint?: string;\n /** URI to off-chain feedback file (IPFS, HTTPS) */\n feedbackUri?: string;\n /** Keccak256 hash of feedback content (for integrity) */\n feedbackHash?: string;\n /**\n * Quality score 0-100.\n *\n * Solana only, and effectively required there: the ATOM Engine ignores an\n * unscored feedback. It is written to the agent but contributes nothing to\n * reputation, and the program reports `had_impact=false`. This is not\n * retroactive — reputation stays at zero however much unscored feedback\n * accumulates.\n */\n score?: number;\n /** Proof of payment (required for authorized feedback) */\n proof?: ProofOfPayment;\n}\n\n/**\n * Feedback request body for POST /feedback\n */\nexport interface FeedbackRequest {\n /** x402 protocol version */\n x402Version: 1 | 2;\n /** Network where feedback will be submitted */\n network: Erc8004Network;\n /** Feedback parameters */\n feedback: FeedbackParams;\n}\n\n/**\n * Feedback response from POST /feedback\n */\nexport interface FeedbackResponse {\n /** Whether the feedback was successfully submitted */\n success: boolean;\n /** Transaction hash of the feedback submission */\n transaction?: string;\n /** Feedback index assigned (1-indexed) */\n feedbackIndex?: number;\n /** Error message (if failed) */\n error?: string;\n /** Network where feedback was submitted */\n network: Erc8004Network;\n}\n\n/**\n * Reputation query response\n */\n/**\n * Error from an ERC-8004 lookup, carrying the HTTP status as a field.\n *\n * `notFound` and `retryable` are mutually exclusive and must stay that way in\n * calling code: the facilitator answers 404 for \"this address owns no agent\"\n * and 503 for \"I could not find out\", usually an RPC failure behind it.\n * Treating a 503 as absence is how a transient failure becomes a permanent\n * wrong answer — on a registration path it mints a second agent for an owner\n * who already has one, burning gas and leaving an orphan.\n */\nexport class Erc8004LookupError extends Error {\n /** HTTP status returned by the facilitator */\n readonly status: number;\n /** Raw response body, for debugging */\n readonly body: string;\n\n constructor(message: string, status: number, body: string) {\n super(message);\n this.name = 'Erc8004LookupError';\n this.status = status;\n this.body = body;\n }\n\n /** The address genuinely owns no agent on this network. */\n get notFound(): boolean {\n return this.status === 404;\n }\n\n /** The lookup reached no verdict. Retry; never read as \"owns nothing\". */\n get retryable(): boolean {\n return this.status === 503;\n }\n}\n\n/**\n * ATOM Engine reputation analytics (Solana only).\n *\n * Present only when the agent's `atom_stats` account has been initialized. The\n * facilitator does that during `registerAgent`; agents registered elsewhere may\n * never have it, in which case their feedback is never scored.\n *\n * The engine measures quality through EMA scores, so there are no\n * positive/negative tallies.\n */\nexport interface AtomStats {\n /** Trust tier 0-4 */\n trustTier: number;\n /** Human-readable trust tier */\n trustTierName: string;\n /** Cached quality score */\n qualityScore: number;\n /** Cached loyalty score */\n loyaltyScore: number;\n /** Statistical confidence */\n confidence: number;\n /** Risk assessment (lower is better) */\n riskScore: number;\n /** Client diversity from HyperLogLog */\n diversityRatio: number;\n /** Lowest score ever recorded */\n minScore: number;\n /** Highest score ever recorded */\n maxScore: number;\n /** Most recent score recorded */\n lastScore: number;\n /** Total feedback counted by the engine */\n feedbackCount: number;\n /** Slot of the most recent feedback */\n lastFeedbackSlot: number;\n}\n\nexport interface ReputationResponse {\n agentId: AgentId;\n summary: ReputationSummary;\n feedback?: FeedbackEntry[];\n /** ATOM Engine analytics; absent when the agent has no initialized stats */\n atomStats?: AtomStats | null;\n network: Erc8004Network;\n}\n\n/**\n * Key-value metadata entry for agent registration\n */\nexport interface MetadataEntryParam {\n /** Metadata key */\n key: string;\n /** Metadata value (hex-encoded bytes or UTF-8 string) */\n value: string;\n}\n\n/**\n * Request body for POST /register\n */\nexport interface RegisterAgentRequest {\n /** x402 protocol version */\n x402Version: 1 | 2;\n /** Network where agent will be registered */\n network: Erc8004Network;\n /** URI pointing to agent registration file (IPFS, HTTPS) */\n agentUri: string;\n /** Optional metadata key-value pairs */\n metadata?: MetadataEntryParam[];\n /** Optional recipient address - NFT is transferred to this address after minting */\n recipient?: string;\n}\n\n/**\n * Response from POST /register\n */\nexport interface RegisterAgentResponse {\n /** Whether registration succeeded */\n success: boolean;\n /** The newly assigned agent ID (EVM: tokenId number, Solana: base58 pubkey string) */\n agentId?: AgentId;\n /** Registration transaction hash */\n transaction?: string;\n /** Transfer transaction hash (if recipient was specified) */\n transferTransaction?: string;\n /** Owner address of the agent NFT */\n owner?: string;\n /** Error message if failed */\n error?: string;\n /** Network where agent was registered */\n network: string;\n}\n\n/**\n * Response from GET /identity/{network}/owner/{address}\n */\nexport interface IdentityByOwnerResponse {\n /** First (lowest) token ID owned by this address */\n agentId: AgentId;\n /** The queried address (checksummed) */\n owner: string;\n /** Agent's registration URI (may be empty) */\n agentUri: string;\n /** Network name */\n network: string;\n /** Total number of agent NFTs owned (as string) */\n balance: string;\n}\n\n/**\n * Response from GET /identity/{network}/{agent_id}/metadata/{key}\n */\n/**\n * Lifecycle of an async registration. `mint_confirmed` and `done` carry an\n * `agentId`; `failed` carries an `error`.\n */\nexport type RegisterJobStatus = 'pending' | 'mint_confirmed' | 'done' | 'failed';\n\n/**\n * Status of an asynchronous registration.\n *\n * Returned by `POST /register` with `Prefer: respond-async` (HTTP 202) and by\n * `GET /register/status/{jobId}`.\n *\n * Terminal jobs are retained for one hour and then age out, after which the\n * status endpoint 404s. Read the agent id before then, or it is only\n * recoverable from the chain.\n */\nexport interface RegisterJobResponse {\n jobId: string;\n status: RegisterJobStatus;\n network?: string;\n agentId?: AgentId;\n transaction?: string;\n transferTransaction?: string;\n owner?: string;\n error?: string;\n}\n\n/** Whether polling can stop: the job either finished or failed. */\nexport function isRegisterJobTerminal(job: RegisterJobResponse): boolean {\n return job.status === 'done' || job.status === 'failed';\n}\n\n/**\n * Thrown when a registration is still running after the wait elapsed.\n *\n * This is emphatically **not** a failure. The mint may still land. `jobId` is a\n * field rather than only part of the message, because the correct recovery is to\n * keep polling `getRegisterStatus(jobId)` — and a caller who cannot reach the id\n * without parsing a string will re-register instead, minting a duplicate agent.\n * That is the exact sequence that once produced five duplicate mints.\n *\n * Never map this to \"registration failed\".\n */\nexport class RegistrationPendingError extends Error {\n readonly jobId: string;\n readonly lastStatus: RegisterJobStatus;\n readonly timeoutMs: number;\n readonly retryable = true;\n\n constructor(jobId: string, lastStatus: RegisterJobStatus, timeoutMs: number) {\n super(\n `Registration job ${jobId} still '${lastStatus}' after ${Math.round(\n timeoutMs / 1000,\n )}s. It may still complete: poll getRegisterStatus('${jobId}') rather than registering again.`,\n );\n this.name = 'RegistrationPendingError';\n this.jobId = jobId;\n this.lastStatus = lastStatus;\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Present a finished async job in the shape the synchronous call returns.\n *\n * Keeping the return type identical is the whole point of `asyncTransport`:\n * switching transports must not force callers to rewrite anything downstream.\n */\nfunction jobToRegisterResponse(\n job: RegisterJobResponse,\n network: Erc8004Network,\n): RegisterAgentResponse {\n return {\n success: job.status !== 'failed',\n agentId: job.agentId,\n transaction: job.transaction,\n transferTransaction: job.transferTransaction,\n owner: job.owner,\n error: job.error,\n network: (job.network as Erc8004Network) ?? network,\n };\n}\n\nexport interface IdentityMetadataResponse {\n /** Agent ID (EVM: number, Solana: string) */\n agentId: AgentId;\n /** Metadata key */\n key: string;\n /**\n * Raw hex-encoded value. The facilitator sends this as `value`; this field\n * used to be declared as `valueHex`, which no response ever carried, so it\n * was always undefined at runtime.\n */\n value: string;\n /** UTF-8 decoded value (if decodable) */\n valueUtf8?: string;\n /** Whether the entry can still be changed */\n immutable?: boolean;\n /** Network */\n network: string;\n}\n\n/**\n * Response from GET /identity/{network}/total-supply\n *\n * On Solana the counts come from the Metaplex Core collection, not the registry,\n * which keeps no counter of its own.\n */\nexport interface IdentityTotalSupplyResponse {\n /** Registered agents, net of burns */\n totalSupply: number;\n /** All-time mint count (Solana) */\n numMinted?: number;\n /** Metaplex Core collection backing the count (Solana) */\n collection?: string;\n /** Network */\n network: string;\n}\n\n/**\n * Options for the ERC8004Client\n */\nexport interface Erc8004ClientOptions {\n /** Base URL of the facilitator (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Client for ERC-8004 Trustless Agents API\n *\n * Provides methods for:\n * - Registering new agents (gasless, facilitator pays gas)\n * - Registering agents on behalf of users (gasless delegation)\n * - Querying agent identity, metadata, and total supply\n * - Querying agent reputation\n * - Submitting reputation feedback\n * - Revoking feedback\n *\n * @example\n * ```ts\n * const client = new Erc8004Client();\n *\n * // Get agent identity\n * const identity = await client.getIdentity('ethereum', 42);\n * console.log(identity.agentUri);\n *\n * // Get agent reputation\n * const reputation = await client.getReputation('ethereum', 42);\n * console.log(`Score: ${reputation.summary.summaryValue}`);\n *\n * // Submit feedback after payment\n * const result = await client.submitFeedback({\n * x402Version: 1,\n * network: 'ethereum',\n * feedback: {\n * agentId: 42,\n * value: 95,\n * valueDecimals: 0,\n * tag1: 'quality',\n * proof: settleResponse.proofOfPayment,\n * },\n * });\n * ```\n */\nexport class Erc8004Client {\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: Erc8004ClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://facilitator.ultravioletadao.xyz';\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Get agent identity from the Identity Registry\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @returns Agent identity information\n */\n async getIdentity(network: Erc8004Network, agentId: AgentId): Promise<AgentIdentity> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/${agentId}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get agent identity by owner address\n *\n * Resolves the first ERC-8004 agent ID owned by a wallet address on a given network.\n *\n * @param network - Network to query\n * @param address - Owner wallet address\n * @returns Agent identity information including balance\n *\n * @example\n * ```ts\n * const identity = await client.getIdentityByOwner('base-mainnet', '0x52E0...');\n * console.log(`Agent #${identity.agentId}, balance: ${identity.balance}`);\n * ```\n */\n async getIdentityByOwner(network: Erc8004Network, address: string): Promise<IdentityByOwnerResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/owner/${address}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n // 404 and 503 are different answers: \"owns nothing\" versus \"could not\n // find out\". Reading the status out of a message string is how they get\n // collapsed, and collapsing them mints a duplicate agent for an owner\n // who already has one. Carry the status as a field.\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Resolve agent registration file from agentURI\n *\n * @param agentUri - URI pointing to agent registration file\n * @returns Resolved agent registration file\n */\n async resolveAgentUri(agentUri: string): Promise<AgentRegistrationFile> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Handle IPFS URIs\n let url = agentUri;\n if (agentUri.startsWith('ipfs://')) {\n const cid = agentUri.replace('ipfs://', '');\n url = `https://ipfs.io/ipfs/${cid}`;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to resolve agentURI: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get agent reputation from the Reputation Registry\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @param options - Query options (tag filters, include individual feedback, client addresses)\n * @param options.clientAddresses - Comma-separated client addresses to filter by.\n * If omitted, the facilitator auto-discovers all clients via getClients().\n * @returns Reputation summary and optionally individual feedback entries\n */\n async getReputation(\n network: Erc8004Network,\n agentId: AgentId,\n options: {\n tag1?: string;\n tag2?: string;\n includeFeedback?: boolean;\n clientAddresses?: string;\n } = {}\n ): Promise<ReputationResponse> {\n const params = new URLSearchParams();\n if (options.tag1) params.set('tag1', options.tag1);\n if (options.tag2) params.set('tag2', options.tag2);\n if (options.includeFeedback) params.set('includeFeedback', 'true');\n if (options.clientAddresses) params.set('clientAddresses', options.clientAddresses);\n\n const url = `${this.baseUrl}/reputation/${wireNetwork(network)}/${agentId}${params.toString() ? `?${params}` : ''}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Submit reputation feedback for an agent\n *\n * Requires proof of payment for authorized feedback submission.\n *\n * @deprecated On this route the facilitator is the AUTHOR: the registry\n * records `msg.sender`, and that is the facilitator's wallet — which can also\n * revoke what it wrote. On the networks in {@link RELAYED_FEEDBACK_NETWORKS}\n * use {@link Erc8004Client.prepareRelayedFeedback} +\n * {@link Erc8004Client.submitRelayedFeedback} instead, which record the RATER\n * as author. This route still works and is not going away without notice: it\n * is the only one available where no `FeedbackDelegate` is deployed.\n *\n * @param request - Feedback request with agent ID, value, and proof\n * @returns Feedback response with transaction hash\n *\n * @example\n * ```ts\n * // After settling a payment with ERC-8004 extension\n * const settleResult = await facilitator.settle(payment, {\n * ...requirements,\n * extra: { '8004-reputation': { includeProof: true } },\n * });\n *\n * // Submit feedback with proof of payment\n * const feedback = await erc8004.submitFeedback({\n * x402Version: 1,\n * network: 'ethereum',\n * feedback: {\n * agentId: 42,\n * value: 95, // 95/100\n * valueDecimals: 0,\n * tag1: 'quality',\n * tag2: 'response-time',\n * proof: settleResult.proofOfPayment,\n * },\n * });\n * ```\n */\n async submitFeedback(request: FeedbackRequest): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Ask the facilitator what the rater must sign to author a rating.\n *\n * Step 1 of the rater-authored rail. Writes nothing on-chain and costs\n * nothing: it reads the delegate, the rater's delegation state and their\n * account nonce, then hands back a digest, a deadline and a single-use nonce.\n *\n * Why this exists: the ERC-8004 Reputation Registry records `msg.sender` as\n * the author, and the deployed implementation has no delegation path — no\n * `giveFeedbackWithSignature`, no ERC-2771 forwarder. So a rating the\n * facilitator relays the ordinary way is a rating attributed to the\n * FACILITATOR. EIP-7702 fixes it without touching the registry: the rater\n * delegates their own EOA to the `FeedbackDelegate` and the transaction is\n * sent TO THE RATER'S ADDRESS, so the registry sees the rater while the\n * facilitator pays.\n *\n * What to do with the answer:\n * 1. Produce the rater's signature. **Which value you sign depends on how you\n * sign it**, and getting it wrong yields a well-formed signature that\n * authorises nobody:\n * - raw key: sign `digest` as a **prehash**. It already carries the\n * EIP-191 envelope.\n * - wallet: `personal_sign` over `signingPayload`. `personal_sign` adds the\n * envelope itself, so signing `digest` with it wraps the value TWICE and\n * recovers a stranger — the only symptom is `relay_bad_signature`.\n * 2. If `delegated` is `false`, also produce an EIP-7702 authorization over\n * `(chainId, delegate, accountNonce)`.\n * 3. Hand both to {@link submitRelayedFeedback} with the SAME feedback\n * parameters, `deadline` and `nonce`.\n *\n * @param request - Network, rater address and feedback parameters\n * @returns Everything needed to sign, including whether an EIP-7702\n * authorization is still required\n *\n * @example\n * ```ts\n * const prep = await erc8004.prepareRelayedFeedback({\n * x402Version: 1,\n * network: 'base',\n * feedback: { agentId: 18896, value: 95, tag1: 'quality', rater: raterAddress },\n * });\n * // prep.delegated === false -> an EIP-7702 authorization is required\n * ```\n */\n async prepareRelayedFeedback(\n request: PrepareRelayFeedbackRequest,\n ): Promise<PrepareRelayFeedbackResponse> {\n const url = `${this.baseUrl}/feedback/evm/prepare`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n delegated: false,\n chainId: 0,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n delegated: false,\n chainId: 0,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Relay a rater-authored rating; the facilitator pays the gas.\n *\n * Step 2 of the rater-authored rail. The on-chain record that comes out of it\n * has the RATER as `msg.sender`, so `getClients(agentId)` shows the rater\n * rather than the facilitator.\n *\n * Pass back the same feedback parameters, `deadline` and `nonce` that\n * {@link prepareRelayedFeedback} returned. They are not redundant: the\n * facilitator rebuilds the registry calldata from them and requires the\n * rater's signature to cover exactly that.\n *\n * `authorization` is required only when `prepare` answered\n * `delegated: false`. One that names a different delegate than the one\n * `prepare` offered is refused before any gas is spent.\n *\n * @param request - Feedback parameters plus the rater's signature\n * @returns Feedback response with the transaction hash\n */\n async submitRelayedFeedback(\n request: SubmitRelayFeedbackRequest,\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/evm/submit`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Revoke previously submitted feedback\n *\n * Only the original submitter can revoke their feedback.\n *\n * @param network - Network where feedback was submitted\n * @param agentId - Agent ID\n * @param feedbackIndex - Index of feedback to revoke\n * @returns Revocation result\n */\n async revokeFeedback(\n network: Erc8004Network,\n agentId: AgentId,\n feedbackIndex: number,\n options?: { sealHash?: string; originalFeedback?: Omit<FeedbackParams, 'agentId' | 'proof'> }\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/revoke`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const payload: Record<string, unknown> = {\n x402Version: 1,\n network: wireNetwork(network),\n agentId,\n feedbackIndex,\n };\n // Solana revocations need the SEAL hash of the feedback being revoked. Pass\n // originalFeedback and the facilitator derives it; computing it yourself\n // means reimplementing the program's keccak256 layout exactly.\n if (options?.sealHash) {\n payload.sealHash = options.sealHash;\n } else if (options?.originalFeedback) {\n payload.originalFeedback = options.originalFeedback;\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network,\n };\n }\n }\n\n /**\n * Get ERC-8004 contract addresses for a network\n *\n * @param network - Network to get contracts for\n * @returns Contract addresses or undefined if not deployed\n */\n getContracts(network: Erc8004Network): typeof ERC8004_CONTRACTS[Erc8004Network] | undefined {\n return ERC8004_CONTRACTS[network];\n }\n\n /**\n * Check if ERC-8004 is available on a network\n *\n * @param network - Network to check\n * @returns True if ERC-8004 contracts are deployed\n */\n isAvailable(network: string): network is Erc8004Network {\n return network in ERC8004_CONTRACTS;\n }\n\n /**\n * Get feedback endpoint metadata\n *\n * @returns Endpoint information for /feedback\n */\n async getFeedbackMetadata(): Promise<{\n endpoint: string;\n supportedNetworks: Erc8004Network[];\n version: string;\n }> {\n const url = `${this.baseUrl}/feedback`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to get feedback metadata: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Append a response to existing feedback\n *\n * Allows agents to respond to feedback they received.\n * Only the agent (identity owner) can append responses.\n *\n * @param network - Network where feedback was submitted\n * @param agentId - Agent ID\n * @param feedbackIndex - Index of feedback to respond to\n * @param response - Response content\n * @param responseUri - Optional URI to off-chain response file\n * @returns Response result\n *\n * @example\n * ```ts\n * // Agent responds to feedback\n * const result = await erc8004.appendResponse(\n * 'ethereum',\n * 42,\n * 1,\n * 'Thank you for your feedback! We have addressed the issue.',\n * );\n * ```\n */\n async appendResponse(\n network: Erc8004Network,\n agentId: AgentId,\n feedbackIndex: number,\n response: string,\n options?: { responseUri?: string; sealHash?: string }\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/response`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const payload: Record<string, unknown> = {\n x402Version: 1,\n network: wireNetwork(network),\n agentId,\n feedbackIndex,\n response,\n };\n if (options?.responseUri) {\n payload.responseUri = options.responseUri;\n }\n if (options?.sealHash) {\n payload.sealHash = options.sealHash;\n }\n\n try {\n const fetchResponse = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!fetchResponse.ok) {\n const errorText = await fetchResponse.text();\n return {\n success: false,\n error: `Facilitator error: ${fetchResponse.status} - ${errorText}`,\n network,\n };\n }\n\n return await fetchResponse.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network,\n };\n }\n }\n\n /**\n * Register an agent on the Identity Registry (idempotent)\n *\n * If the recipient already owns an agent on the target network, returns the\n * existing one instead of minting a duplicate. The facilitator pays gas fees.\n * Optionally transfer the NFT to a recipient address (gasless delegation).\n *\n * @param request - Registration request\n * @returns Registration response with agent ID and transaction hash\n *\n * @example\n * ```ts\n * // Register agent owned by facilitator\n * const result = await client.registerAgent({\n * x402Version: 1,\n * network: 'ethereum',\n * agentUri: 'ipfs://QmYourAgentFile',\n * });\n * console.log(`Agent #${result.agentId} registered`);\n *\n * // Register agent and transfer to user\n * const result = await client.registerAgent({\n * x402Version: 1,\n * network: 'ethereum',\n * agentUri: 'ipfs://QmYourAgentFile',\n * recipient: '0xUserAddress...',\n * });\n * console.log(`Agent #${result.agentId} transferred to user`);\n * ```\n */\n async registerAgent(\n request: RegisterAgentRequest,\n options?: { asyncTransport?: boolean; pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<RegisterAgentResponse> {\n // asyncTransport changes how the wait is carried out, not what comes back.\n // The synchronous call holds one HTTP request open for the whole mint, which\n // on a congested chain outlives proxy timeouts; each poll here is short, so\n // nothing in the path can time out ambiguously.\n if (options?.asyncTransport) {\n const job = await this.registerAgentAsync(request);\n const terminal = await this.waitForRegistration(job.jobId, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n return jobToRegisterResponse(terminal, request.network);\n }\n\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n // The facilitator answers 4xx with a structured RegisterAgentResponse,\n // and on 409 - a registration for this agent is ALREADY IN FLIGHT -\n // that body carries the agent id and tx of the run already underway,\n // plus an explicit \"poll GET /register/status/{jobId}\" hint.\n //\n // Flattening it into a bare string threw away the only thing that lets\n // a caller resolve instead of re-POSTing, and re-POSTing a mint is\n // exactly how duplicate agents get created. Keep the body.\n try {\n const parsed = JSON.parse(errorText) as RegisterAgentResponse;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return {\n ...parsed,\n // Never let a 4xx body claim success, whatever it says.\n success: false,\n error: parsed.error ?? `Facilitator error: ${response.status}`,\n network: parsed.network ?? request.network,\n };\n }\n } catch {\n // Not JSON - fall through to the flattened error.\n }\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Start a registration without waiting for the chain to confirm it.\n *\n * Registration waits on a mint receipt, which on a congested chain outlives\n * client and proxy timeouts. A timed-out synchronous call is genuinely\n * ambiguous — the mint may well have landed — and retrying it is how five\n * duplicate agents once got minted. This returns immediately with a job id\n * instead; poll {@link getRegisterStatus} or use {@link waitForRegistration}.\n *\n * On Solana, `recipient` is a base58 address: the facilitator mints,\n * initializes the ATOM stats and transfers, paying every fee.\n */\n async registerAgentAsync(request: RegisterAgentRequest): Promise<RegisterJobResponse> {\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Prefer': 'respond-async',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Read the current state of an asynchronous registration.\n *\n * Throws {@link Erc8004LookupError} with `notFound` when the job is unknown or\n * has aged out — terminal jobs are kept for one hour.\n */\n async getRegisterStatus(jobId: string): Promise<RegisterJobResponse> {\n const url = `${this.baseUrl}/register/status/${encodeURIComponent(jobId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Poll an asynchronous registration until it finishes.\n *\n * Rejects on timeout rather than resolving with the last non-terminal status,\n * so \"still pending\" is never mistaken for \"did not happen\": the mint may\n * still land afterwards, and treating a timeout as failure is what leads to\n * registering the same agent twice. Keep the job id and poll again rather\n * than re-registering.\n */\n async waitForRegistration(\n jobId: string,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<RegisterJobResponse> {\n const pollIntervalMs = options?.pollIntervalMs ?? 2000;\n const timeoutMs = options?.timeoutMs ?? 300_000;\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n const job = await this.getRegisterStatus(jobId);\n if (isRegisterJobTerminal(job)) {\n return job;\n }\n if (Date.now() >= deadline) {\n throw new RegistrationPendingError(jobId, job.status, timeoutMs);\n }\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n }\n\n /**\n * Get registration endpoint metadata\n *\n * @returns Endpoint information for POST /register\n */\n async getRegisterInfo(): Promise<Record<string, unknown>> {\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get a specific metadata entry for an agent\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @param key - Metadata key to retrieve\n * @returns Metadata value (hex-encoded and UTF-8 decoded if possible)\n */\n async getIdentityMetadata(\n network: Erc8004Network,\n agentId: AgentId,\n key: string,\n ): Promise<IdentityMetadataResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/${agentId}/metadata/${encodeURIComponent(key)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get total number of registered agents on a network\n *\n * @param network - Network to query\n * @returns Total supply count\n */\n async getIdentityTotalSupply(network: Erc8004Network): Promise<IdentityTotalSupplyResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/total-supply`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\n/**\n * Build payment requirements with ERC-8004 extension\n *\n * Adds the 8004-reputation extension to include proof of payment\n * in settlement responses for reputation submission.\n *\n * @param options - Base payment requirements options\n * @returns Payment requirements with ERC-8004 extension\n *\n * @example\n * ```ts\n * const requirements = buildErc8004PaymentRequirements({\n * amount: '1.00',\n * recipient: '0x...',\n * resource: 'https://api.example.com/service',\n * chainName: 'ethereum',\n * });\n *\n * // Settlement will include proofOfPayment\n * const result = await facilitator.settle(payment, requirements);\n * console.log(result.proofOfPayment);\n * ```\n */\nexport function buildErc8004PaymentRequirements(\n options: PaymentRequirementsOptions\n): PaymentRequirements & { extra: { '8004-reputation': { includeProof: boolean } } } {\n const base = buildPaymentRequirements(options);\n return {\n ...base,\n extra: {\n [ERC8004_EXTENSION_ID]: {\n includeProof: true,\n },\n },\n };\n}\n\n// ============================================================================\n// ADVANCED ESCROW (PaymentOperator - On-Chain Escrow)\n// ============================================================================\n//\n// The 5 Advanced Escrow flows via the PaymentOperator contract:\n// 1. AUTHORIZE - Lock funds in escrow (via facilitator)\n// 2. RELEASE - Capture escrowed funds to receiver (on-chain)\n// 3. REFUND IN ESCROW - Return escrowed funds to payer (on-chain)\n// 4. CHARGE - Direct instant payment without escrow (on-chain)\n// 5. REFUND POST ESCROW - Dispute refund after release (on-chain)\n//\n// Contract mapping:\n// operator.authorize() -> escrow.authorize() (lock funds)\n// operator.release() -> escrow.capture() (pay receiver)\n// operator.refundInEscrow() -> escrow.partialVoid() (refund payer)\n// operator.charge() -> escrow.charge() (direct payment)\n// operator.refundPostEscrow() -> escrow.refund() (dispute refund)\n// ============================================================================\n\n/**\n * PAYMENT_INFO_TYPEHASH used for nonce computation.\n * Must match the on-chain AuthCaptureEscrow contract.\n */\nexport const PAYMENT_INFO_TYPEHASH =\n '0xae68ac7ce30c86ece8196b61a7c486d8f0061f575037fbd34e7fe4e2820c6591';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/**\n * Contract deposit limit (enforced by PaymentOperator condition).\n * As of 2026-02-03, commerce-payments contracts enforce $100 max per deposit.\n */\nexport const DEPOSIT_LIMIT_USDC = '100000000'; // $100 in atomic units (6 decimals)\n\n/**\n * Default facilitator request timeout per chain in milliseconds.\n * Ethereum L1 (~12s blocks) needs much longer than L2s (~2s blocks).\n * Timeout chain: Client > SDK > Facilitator. The facilitator uses 900s for Ethereum L1.\n */\nexport const ESCROW_TIMEOUT_MS: Record<number, number> = {\n 1: 960_000, // Ethereum L1: 960s (facilitator uses 900s TxWatcher)\n 11155111: 960_000, // Ethereum Sepolia: same as L1\n 137: 90_000, // Polygon: 90s\n 8453: 90_000, // Base: 90s\n 84532: 90_000, // Base Sepolia: 90s\n 42161: 90_000, // Arbitrum: 90s\n 10: 90_000, // Optimism: 90s\n 43114: 90_000, // Avalanche: 90s\n 42220: 90_000, // Celo: 90s\n 143: 90_000, // Monad: 90s\n};\n\n/** Default timeout when chain is not in ESCROW_TIMEOUT_MS */\nconst DEFAULT_ESCROW_TIMEOUT_MS = 30_000;\n\n/**\n * USDC EIP-712 domain name per chain.\n * Most chains use \"USD Coin\", but some (Celo, Monad, HyperEVM) use \"USDC\".\n * This must match the on-chain token's name() for EIP-712 signing to work.\n */\nexport const USDC_DOMAIN_NAME: Record<number, string> = {\n 8453: 'USD Coin', // Base Mainnet\n 84532: 'USD Coin', // Base Sepolia\n 1: 'USD Coin', // Ethereum Mainnet\n 11155111: 'USD Coin', // Ethereum Sepolia\n 137: 'USD Coin', // Polygon\n 42161: 'USD Coin', // Arbitrum\n 43114: 'USD Coin', // Avalanche\n 42220: 'USDC', // Celo\n 143: 'USDC', // Monad\n};\n\n/**\n * Multi-chain escrow contract addresses for the Advanced Escrow system.\n * Keyed by EVM chain ID. Source: x402r-sdk A1igator/multichain-config deployment.\n */\nexport const ESCROW_CONTRACTS: Record<number, AdvancedEscrowContracts> = {\n // Base Sepolia (testnet, chain 84532)\n 84532: {\n operator: '0x97d53e63A9CB97556c00BeFd325AF810c9b267B2',\n escrow: '0x29025c0E9D4239d438e169570818dB9FE0A80873',\n tokenCollector: '0x5cA789000070DF15b4663DB64a50AeF5D49c5Ee0',\n protocolFeeConfig: '0x8F96C493bAC365E41f0315cf45830069EBbDCaCe',\n refundRequest: '0x1C2Ab244aC8bDdDB74d43389FF34B118aF2E90F4',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n },\n // Base Mainnet (chain 8453)\n 8453: {\n operator: '0x3D0837fF8Ea36F417261577b9BA568400A840260',\n escrow: '0xb9488351E48b23D798f24e8174514F28B741Eb4f',\n tokenCollector: '0x48ADf6E37F9b31dC2AAD0462C5862B5422C736B8',\n protocolFeeConfig: '0x59314674BAbb1a24Eb2704468a9cCdD50668a1C6',\n refundRequest: '0x35fb2EFEfAc3Ee9f6E52A9AAE5C9655bC08dEc00',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n // Ethereum Sepolia (testnet, chain 11155111)\n 11155111: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n // Ethereum Mainnet (chain 1) - Updated from Ali's redeploy (commit e6cf29d)\n 1: {\n operator: '0x69B67962ffb7c5C7078ff348a87DF604dfA8001b',\n escrow: '0x9D4146EF898c8E60B3e865AE254ef438E7cEd2A0',\n tokenCollector: '0x206D4DbB6E7b876e4B5EFAAD2a04e7d7813FB6ba',\n protocolFeeConfig: '0x5b3e33791C1764cF7e2573Bf8116F1D361FD97Cd',\n refundRequest: '0xFa8C4Cb156053b867Ae7489220A29b5939E3Df70',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n // Polygon (chain 137)\n 137: {\n operator: '0xb33D6502EdBbC47201cd1E53C49d703EC0a660b8',\n escrow: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n tokenCollector: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n protocolFeeConfig: '0xE78648e7af7B1BaDE717FF6E410B922F92adE80f',\n refundRequest: '0xed02d3E5167BCc9582D851885A89b050AB816a56',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n },\n // Arbitrum (chain 42161)\n 42161: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n },\n // Celo (chain 42220)\n 42220: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n },\n // Monad (chain 143)\n 143: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x754704Bc059F8C67012fEd69BC8a327a5aafb603',\n },\n // Avalanche (chain 43114)\n 43114: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n },\n // Optimism (chain 10)\n 10: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n },\n // SKALE Base (chain 1187947933) - CREATE3 deployment, operator via factory\n 1187947933: {\n operator: '0x28c23AE8f55aDe5Ea10a5353FC40418D0c1B3d33',\n escrow: '0xBC151792f80C0EB1973d56b0235e6bee2A60e245',\n tokenCollector: '0x9A12A116a44636F55c9e135189A1321Abcfe2f30',\n protocolFeeConfig: '0xf62788834C99B2E85a6891C0b46D1EB996f8f596',\n refundRequest: '0x69e9BF2b40Ed472b55E47e9D4205d93Ed673093F',\n usdc: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n },\n};\n\n/**\n * Base Mainnet contract addresses for the Advanced Escrow system.\n * @deprecated Use ESCROW_CONTRACTS[8453] or getEscrowContractsByChainId(8453) instead.\n */\nexport const BASE_MAINNET_CONTRACTS: AdvancedEscrowContracts = ESCROW_CONTRACTS[8453];\n\n/**\n * Get escrow contract addresses for a given chain ID.\n *\n * @param chainId - EVM chain ID (e.g., 8453 for Base, 1 for Ethereum)\n * @returns Contract addresses or undefined if chain is not supported\n */\nexport function getEscrowContractsByChainId(chainId: number): AdvancedEscrowContracts | undefined {\n return ESCROW_CONTRACTS[chainId];\n}\n\n/**\n * Get all chain IDs that have escrow contracts deployed.\n *\n * @returns Array of chain IDs with escrow support\n */\nexport function getEscrowSupportedChainIds(): number[] {\n return Object.keys(ESCROW_CONTRACTS).map(Number);\n}\n\n/**\n * Check if escrow contracts are deployed on a given chain.\n *\n * @param chainId - EVM chain ID\n * @returns True if escrow is supported on this chain\n */\nexport function isEscrowSupportedOnChain(chainId: number): boolean {\n return chainId in ESCROW_CONTRACTS;\n}\n\n/**\n * Task tiers determine timing parameters for escrow operations.\n */\nexport type AdvancedEscrowTaskTier = 'micro' | 'standard' | 'premium' | 'enterprise';\n\n/**\n * Timing configuration per task tier (in seconds).\n */\nexport const TIER_TIMINGS: Record<AdvancedEscrowTaskTier, { pre: number; auth: number; refund: number }> = {\n micro: { pre: 3600, auth: 7200, refund: 86400 },\n standard: { pre: 7200, auth: 86400, refund: 604800 },\n premium: { pre: 14400, auth: 172800, refund: 1209600 },\n enterprise: { pre: 86400, auth: 604800, refund: 2592000 },\n};\n\n/**\n * PaymentInfo struct matching the on-chain PaymentOperator contract.\n */\nexport interface AdvancedPaymentInfo {\n operator: string;\n receiver: string;\n token: string;\n maxAmount: string;\n preApprovalExpiry: number;\n authorizationExpiry: number;\n refundExpiry: number;\n minFeeBps: number;\n maxFeeBps: number;\n feeReceiver: string;\n salt: string;\n}\n\n/**\n * Result of an AUTHORIZE operation.\n */\nexport interface AdvancedAuthorizationResult {\n success: boolean;\n transactionHash?: string;\n paymentInfo?: AdvancedPaymentInfo;\n salt?: string;\n error?: string;\n}\n\n/**\n * Result of an on-chain transaction (release, refund, charge).\n */\nexport interface AdvancedTransactionResult {\n success: boolean;\n transactionHash?: string;\n gasUsed?: number;\n error?: string;\n}\n\n/**\n * Response from the facilitator's /escrow/state endpoint.\n * Represents the on-chain state of an escrow for a given paymentInfo + payer.\n */\nexport interface EscrowStateResponse {\n /** Whether the payment has already been collected (released) */\n hasCollectedPayment: boolean;\n /** Amount that can still be captured/released (in atomic units) */\n capturableAmount: string;\n /** Amount that can still be refunded to the payer (in atomic units) */\n refundableAmount: string;\n /** Keccak256 hash of the paymentInfo struct */\n paymentInfoHash: string;\n /** Network in CAIP-2 format (e.g., \"eip155:8453\") */\n network: string;\n}\n\n/**\n * Contract addresses configuration for AdvancedEscrowClient.\n *\n * Maps to the on-chain x402r escrow contracts:\n * - operator: PaymentOperatorFactory\n * - escrow: AuthCaptureEscrow\n * - tokenCollector: TokenCollector\n * - protocolFeeConfig: ProtocolFeeConfig\n * - refundRequest: RefundRequest\n * - usdc: USDC token contract\n */\nexport interface AdvancedEscrowContracts {\n /** PaymentOperatorFactory contract address */\n operator: string;\n /** AuthCaptureEscrow contract address */\n escrow: string;\n /** TokenCollector contract address */\n tokenCollector: string;\n /** ProtocolFeeConfig contract address */\n protocolFeeConfig: string;\n /** RefundRequest contract address */\n refundRequest: string;\n /** USDC token contract address */\n usdc: string;\n}\n\n/**\n * Configuration options for AdvancedEscrowClient.\n */\nexport interface AdvancedEscrowClientOptions {\n /** Facilitator URL for AUTHORIZE operations */\n facilitatorUrl?: string;\n /** JSON-RPC URL for on-chain operations (required when using SigningWalletAdapter) */\n rpcUrl?: string;\n /**\n * Chain ID (default: 8453 for Base Mainnet).\n * Supported chains: 8453 (Base), 84532 (Base Sepolia), 1 (Ethereum),\n * 11155111 (Ethereum Sepolia), 137 (Polygon), 42161 (Arbitrum),\n * 10 (Optimism), 42220 (Celo), 143 (Monad), 43114 (Avalanche).\n */\n chainId?: number;\n /** Contract addresses (auto-resolved from chainId if not provided) */\n contracts?: AdvancedEscrowContracts;\n /** Gas limit for transactions (default: 300000) */\n gasLimit?: number;\n /**\n * Request timeout in milliseconds for facilitator HTTP calls (authorize, gasless release/refund).\n * Default is per-network: 960s for Ethereum L1, 90s for L2s.\n * Ethereum L1 confirmations can take several minutes under congestion.\n */\n timeout?: number;\n /**\n * SigningWalletAdapter for OWS wallet signing (v2.36.0+).\n *\n * When provided, the client uses the adapter for all signing operations\n * instead of requiring a raw ethers.Signer. The first constructor argument\n * is ignored when `wallet` is set.\n *\n * Requires `rpcUrl` to be set for on-chain transaction building.\n *\n * @example\n * ```typescript\n * import { OWSWalletAdapter, AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, {\n * wallet,\n * rpcUrl: 'https://mainnet.base.org',\n * chainId: 8453,\n * });\n * ```\n */\n wallet?: import('../wallet').SigningWalletAdapter;\n}\n\n/**\n * Minimal PaymentOperator ABI for the 4 on-chain functions.\n * (AUTHORIZE goes through the facilitator, not directly on-chain)\n */\nexport const OPERATOR_ABI = [\n 'function release(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount)',\n 'function refundInEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint120 amount)',\n 'function charge(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n 'function refundPostEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n];\n\n/**\n * CREATE3-deployed operators (SKALE, future chains) use updated ABI with extra `bytes data` param\n * on release() and refundInEscrow(). Pass empty bytes (0x) for the data parameter.\n */\nexport const OPERATOR_ABI_CREATE3 = [\n 'function release(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, bytes data)',\n 'function refundInEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint120 amount, bytes data)',\n 'function charge(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n 'function refundPostEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n];\n\n/** Chain IDs using CREATE3-deployed operators with updated ABI */\nconst CREATE3_CHAIN_IDS = new Set([1187947933]);\n\n/**\n * AdvancedEscrowClient provides the 5 Advanced Escrow flows via the\n * PaymentOperator contract on 9 supported EVM networks.\n *\n * Supported chains: Base (8453), Base Sepolia (84532), Ethereum (1),\n * Ethereum Sepolia (11155111), Polygon (137), Arbitrum (42161),\n * Optimism (10), Celo (42220), Monad (143), Avalanche (43114).\n *\n * Contract addresses are auto-resolved from the chain ID.\n * Pass custom contracts to override.\n *\n * Two signer modes (v2.36.0+):\n * - **Legacy**: Pass an ethers.Signer as the first argument.\n * - **OWS Wallet**: Pass a SigningWalletAdapter via `options.wallet`.\n * The adapter signs transactions offline (no raw private key needed).\n * Requires `rpcUrl` for transaction building and broadcast.\n *\n * @example Legacy mode (ethers.Signer)\n * ```typescript\n * import { ethers } from 'ethers';\n * import { AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');\n * const signer = new ethers.Wallet(process.env.KEY!, provider);\n * const client = new AdvancedEscrowClient(signer, { chainId: 8453 });\n * ```\n *\n * @example OWS Wallet mode (SigningWalletAdapter)\n * ```typescript\n * import { OWSWalletAdapter } from 'uvd-x402-sdk';\n * import { AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, {\n * wallet,\n * rpcUrl: 'https://mainnet.base.org',\n * chainId: 8453,\n * });\n * await client.init();\n *\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * const auth = await client.authorize(pi);\n * const release = await client.release(pi);\n * ```\n */\nexport class AdvancedEscrowClient {\n private facilitatorUrl: string;\n private chainId: number;\n private gasLimit: number;\n private readonly timeout: number;\n private contracts: AdvancedEscrowContracts;\n private signer: any; // ethers.Signer (legacy mode)\n private walletAdapter: import('../wallet').SigningWalletAdapter | null; // OWS mode (v2.36.0+)\n private rpcUrl: string | undefined;\n private payerAddress: string = '';\n\n /**\n * Create an AdvancedEscrowClient.\n *\n * Two modes of operation:\n *\n * 1. **Legacy (ethers.Signer)**: Pass an ethers Signer as the first argument.\n * ```ts\n * const client = new AdvancedEscrowClient(signer, { rpcUrl, chainId });\n * ```\n *\n * 2. **OWS Wallet (SigningWalletAdapter)**: Pass `wallet` in options. The\n * first argument is ignored (pass `null`). Requires `rpcUrl` for on-chain\n * transaction building and broadcast.\n * ```ts\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, { wallet, rpcUrl, chainId });\n * ```\n *\n * @param signer - ethers.Signer instance (ignored when options.wallet is set)\n * @param options - Configuration options\n */\n constructor(signer: any, options: AdvancedEscrowClientOptions = {}) {\n this.walletAdapter = options.wallet || null;\n this.signer = this.walletAdapter ? null : signer;\n this.rpcUrl = options.rpcUrl;\n this.facilitatorUrl = (options.facilitatorUrl || 'https://facilitator.ultravioletadao.xyz').replace(/\\/$/, '');\n this.chainId = options.chainId || 8453;\n this.gasLimit = options.gasLimit || 300000;\n this.timeout = options.timeout || ESCROW_TIMEOUT_MS[this.chainId] || DEFAULT_ESCROW_TIMEOUT_MS;\n\n if (this.walletAdapter && !this.rpcUrl) {\n throw new Error(\n 'AdvancedEscrowClient: rpcUrl is required when using a SigningWalletAdapter. ' +\n 'The adapter signs transactions offline; an RPC provider is needed to build ' +\n 'and broadcast them.'\n );\n }\n\n if (options.contracts) {\n this.contracts = options.contracts;\n } else {\n const resolved = ESCROW_CONTRACTS[this.chainId];\n if (!resolved) {\n throw new Error(\n `No escrow contracts found for chain ID ${this.chainId}. ` +\n `Supported chains: ${getEscrowSupportedChainIds().join(', ')}. ` +\n `Pass custom contracts via options.contracts to use an unsupported chain.`\n );\n }\n this.contracts = resolved;\n }\n }\n\n /**\n * Initialize the client (resolves payer address).\n * Call this before using any methods.\n */\n async init(): Promise<void> {\n if (this.walletAdapter) {\n this.payerAddress = this.walletAdapter.getAddress();\n } else {\n this.payerAddress = await this.signer.getAddress();\n }\n }\n\n /**\n * Build a PaymentInfo struct with appropriate timing for the task tier.\n *\n * @param receiver - Worker's wallet address\n * @param amount - Amount in token atomic units (e.g., '5000000' for $5 USDC)\n * @param tier - Task tier determines timing parameters\n * @param salt - Random salt (auto-generated if not provided)\n */\n buildPaymentInfo(\n receiver: string,\n amount: string,\n tier: AdvancedEscrowTaskTier = 'standard',\n salt?: string,\n opts?: { deadline?: number; reviewWindowSec?: number },\n ): AdvancedPaymentInfo {\n const now = Math.floor(Date.now() / 1000);\n const t = TIER_TIMINGS[tier];\n // The release window must outlast the REVIEW, not just the tier. `micro`\n // alone gives two hours; a buyer approving later gets\n // `AfterAuthorizationExpiry` on-chain — the release reverts, the worker is\n // not paid, and only the payer's `reclaim()` can move the funds. Measured in\n // production 2026-08-19: a release attempted 26.2 HOURS past expiry, 8\n // escrows stuck on one network in 24h.\n //\n // buildEscrowPreAuth — the other escrow path in this same SDK — already\n // floors both windows this way and says why. This path never got the memo,\n // and it is the one the marketplace documents as recommended.\n const reviewWindow = opts?.reviewWindowSec ?? REVIEW_WINDOW_SEC;\n const reviewBase = Math.max(now, opts?.deadline ?? now);\n const authorizationExpiry = Math.max(now + t.auth, reviewBase + reviewWindow);\n const refundExpiry = Math.max(now + t.refund, authorizationExpiry + REFUND_WINDOW_SEC);\n // Use crypto-safe randomness (Node.js crypto or Web Crypto API)\n let generatedSalt = salt;\n if (!generatedSalt) {\n const bytes = new Uint8Array(32);\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n // Node.js fallback\n const nodeCrypto = require('crypto');\n const buf = nodeCrypto.randomBytes(32);\n bytes.set(new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength));\n }\n generatedSalt = '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n return {\n operator: this.contracts.operator,\n receiver,\n token: this.contracts.usdc,\n maxAmount: amount,\n preApprovalExpiry: now + t.pre,\n authorizationExpiry,\n refundExpiry,\n minFeeBps: 0,\n maxFeeBps: 800,\n feeReceiver: this.contracts.operator,\n salt: generatedSalt,\n };\n }\n\n /**\n * Compute the correct nonce (with PAYMENT_INFO_TYPEHASH).\n * Matches the on-chain AuthCaptureEscrow nonce derivation.\n */\n private async computeNonce(paymentInfo: AdvancedPaymentInfo): Promise<string> {\n // Dynamic import of ethers to avoid hard dependency at module level\n const { ethers } = await import('ethers');\n\n const piTuple = ethers.AbiCoder.defaultAbiCoder().encode(\n ['bytes32', 'tuple(address,address,address,address,uint120,uint48,uint48,uint48,uint16,uint16,address,uint256)'],\n [\n PAYMENT_INFO_TYPEHASH,\n [\n paymentInfo.operator,\n ZERO_ADDRESS, // payer = 0 for payer-agnostic hash\n paymentInfo.receiver,\n paymentInfo.token,\n paymentInfo.maxAmount,\n paymentInfo.preApprovalExpiry,\n paymentInfo.authorizationExpiry,\n paymentInfo.refundExpiry,\n paymentInfo.minFeeBps,\n paymentInfo.maxFeeBps,\n paymentInfo.feeReceiver,\n paymentInfo.salt,\n ],\n ],\n );\n const piHash = ethers.keccak256(piTuple);\n\n const finalEncoded = ethers.AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'address', 'bytes32'],\n [this.chainId, this.contracts.escrow, piHash],\n );\n return ethers.keccak256(finalEncoded);\n }\n\n /**\n * Sign ReceiveWithAuthorization for ERC-3009.\n *\n * Uses SigningWalletAdapter.signTypedData() when in OWS mode,\n * or ethers Signer.signTypedData() in legacy mode.\n */\n private async signErc3009(auth: Record<string, string>): Promise<string> {\n const domain = {\n name: USDC_DOMAIN_NAME[this.chainId] || 'USD Coin',\n version: '2',\n chainId: this.chainId,\n verifyingContract: this.contracts.usdc,\n };\n\n const types = {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n const message = {\n from: auth.from,\n to: auth.to,\n value: auth.value,\n validAfter: auth.validAfter,\n validBefore: auth.validBefore,\n nonce: auth.nonce,\n };\n\n // OWS wallet adapter mode: serialize to JSON and use adapter.signTypedData()\n if (this.walletAdapter) {\n const typedData = JSON.stringify({\n domain,\n types,\n primaryType: 'ReceiveWithAuthorization',\n message,\n });\n const result = await this.walletAdapter.signTypedData(typedData);\n return result.signature;\n }\n\n // Legacy ethers.Signer mode\n return this.signer.signTypedData(domain, types, message);\n }\n\n /**\n * Build the on-chain PaymentInfo tuple for contract calls.\n */\n private buildTuple(pi: AdvancedPaymentInfo): any[] {\n return [\n pi.operator,\n this.payerAddress,\n pi.receiver,\n pi.token,\n pi.maxAmount,\n pi.preApprovalExpiry,\n pi.authorizationExpiry,\n pi.refundExpiry,\n pi.minFeeBps,\n pi.maxFeeBps,\n pi.feeReceiver,\n pi.salt,\n ];\n }\n\n /**\n * AUTHORIZE: Lock funds in escrow via the facilitator.\n *\n * Sends an ERC-3009 ReceiveWithAuthorization to the facilitator,\n * which calls PaymentOperator.authorize() on-chain.\n */\n async authorize(paymentInfo: AdvancedPaymentInfo): Promise<AdvancedAuthorizationResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const nonce = await this.computeNonce(paymentInfo);\n\n const auth = {\n from: this.payerAddress,\n to: this.contracts.tokenCollector,\n value: paymentInfo.maxAmount,\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce,\n };\n const signature = await this.signErc3009(auth);\n\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n payload: {\n authorization: auth,\n signature,\n paymentInfo: paymentInfo,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n maxAmountRequired: paymentInfo.maxAmount,\n asset: this.contracts.usdc,\n payTo: paymentInfo.receiver,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction,\n paymentInfo,\n salt: paymentInfo.salt,\n };\n }\n return { success: false, error: result.errorReason };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.capturableAmount && BigInt(state.capturableAmount) > 0n) {\n return {\n success: true,\n paymentInfo,\n salt: paymentInfo.salt,\n };\n }\n } catch { /* fallback query failed, report original timeout */ }\n return { success: false, error: `Authorize timed out after ${this.timeout}ms. On-chain state could not confirm escrow lock.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * RELEASE: Capture escrowed funds to receiver (worker gets paid).\n *\n * Calls PaymentOperator.release() -> escrow.capture()\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to release (defaults to maxAmount)\n */\n async release(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const isCreate3 = CREATE3_CHAIN_IDS.has(this.chainId);\n const abi = isCreate3 ? OPERATOR_ABI_CREATE3 : OPERATOR_ABI;\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode: build unsigned TX, sign via adapter, broadcast\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, abi, (iface) => {\n return isCreate3\n ? iface.encodeFunctionData('release', [tuple, amt, '0x'])\n : iface.encodeFunctionData('release', [tuple, amt]);\n });\n }\n\n // Legacy ethers.Signer mode: contract sends directly\n const contract = new ethers.Contract(this.contracts.operator, abi, this.signer);\n const tx = isCreate3\n ? await contract.release(tuple, amt, '0x', { gasLimit: this.gasLimit })\n : await contract.release(tuple, amt, { gasLimit: this.gasLimit });\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * REFUND IN ESCROW: Return escrowed funds to payer (cancel task).\n *\n * Calls PaymentOperator.refundInEscrow() -> escrow.partialVoid()\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to refund (defaults to maxAmount)\n */\n async refundInEscrow(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const isCreate3 = CREATE3_CHAIN_IDS.has(this.chainId);\n const abi = isCreate3 ? OPERATOR_ABI_CREATE3 : OPERATOR_ABI;\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode: build unsigned TX, sign via adapter, broadcast\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, abi, (iface) => {\n return isCreate3\n ? iface.encodeFunctionData('refundInEscrow', [tuple, amt, '0x'])\n : iface.encodeFunctionData('refundInEscrow', [tuple, amt]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, abi, this.signer);\n const tx = isCreate3\n ? await contract.refundInEscrow(tuple, amt, '0x', { gasLimit: this.gasLimit })\n : await contract.refundInEscrow(tuple, amt, { gasLimit: this.gasLimit });\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n // ==========================================================================\n // GASLESS FACILITATOR METHODS\n // ==========================================================================\n\n /**\n * GASLESS RELEASE: Release escrowed funds via the facilitator.\n *\n * Instead of calling the PaymentOperator contract directly (which requires\n * gas), this sends a release request to the facilitator, which submits\n * the transaction on your behalf.\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to release in atomic units (defaults to maxAmount)\n * @returns Transaction result from the facilitator\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n * // Worker completes task...\n * const result = await client.releaseViaFacilitator(pi);\n * console.log(result.transactionHash);\n * ```\n */\n async releaseViaFacilitator(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n action: 'release',\n payload: {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n amount: amount || paymentInfo.maxAmount,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction || result.transactionHash || result.transaction_hash,\n };\n }\n // Parity with the Python SDK (2026-08-22): a last-resort message that\n // says only \"Release failed\" is the same dead end as an empty string —\n // name the status and what the body DID carry so the caller has a\n // thread to pull. Divergence between the two SDKs is exactly what let\n // the escrow-window bug live in one of them for weeks.\n return {\n success: false,\n error:\n result.errorReason ||\n result.error ||\n `Release refused with no reason (HTTP ${response.status}, body keys: ${Object.keys(result ?? {}).sort().join(', ') || 'none'})`,\n };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.capturableAmount === '0' && state.hasCollectedPayment) {\n return { success: true };\n }\n } catch { /* fallback query failed */ }\n return { success: false, error: `Gasless release timed out after ${this.timeout}ms. Check escrow state on-chain.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * GASLESS REFUND: Refund escrowed funds via the facilitator.\n *\n * Instead of calling the PaymentOperator contract directly (which requires\n * gas), this sends a refundInEscrow request to the facilitator, which\n * submits the transaction on your behalf.\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to refund in atomic units (defaults to maxAmount)\n * @returns Transaction result from the facilitator\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n * // Task cancelled...\n * const result = await client.refundViaFacilitator(pi);\n * console.log(result.transactionHash);\n * ```\n */\n async refundViaFacilitator(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n action: 'refundInEscrow',\n payload: {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n amount: amount || paymentInfo.maxAmount,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction || result.transactionHash || result.transaction_hash,\n };\n }\n return { success: false, error: result.errorReason || result.error || 'Refund failed' };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.refundableAmount === '0') {\n return { success: true };\n }\n } catch { /* fallback query failed */ }\n return { success: false, error: `Gasless refund timed out after ${this.timeout}ms. Check escrow state on-chain.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * QUERY ESCROW STATE: Read on-chain escrow state via the facilitator.\n *\n * This is a read-only operation that queries the facilitator for the\n * current escrow state without requiring gas or a signer.\n *\n * @param paymentInfo - PaymentInfo to query state for\n * @returns Escrow state including capturable/refundable amounts\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n *\n * const state = await client.queryEscrowState(pi);\n * console.log(`Capturable: ${state.capturableAmount}`);\n * console.log(`Refundable: ${state.refundableAmount}`);\n * console.log(`Already collected: ${state.hasCollectedPayment}`);\n * ```\n */\n async queryEscrowState(paymentInfo: AdvancedPaymentInfo): Promise<EscrowStateResponse> {\n if (!this.payerAddress) await this.init();\n\n const payload = {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n };\n\n const response = await fetch(`${this.facilitatorUrl}/escrow/state`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow state query failed: ${response.status} - ${errorText}`);\n }\n\n return await response.json() as EscrowStateResponse;\n }\n\n /**\n * CHARGE: Direct instant payment (no escrow hold).\n *\n * Calls PaymentOperator.charge() -> escrow.charge()\n * Funds go directly from payer to receiver.\n *\n * @param paymentInfo - PaymentInfo with receiver and amount\n * @param amount - Amount to charge (defaults to maxAmount)\n */\n async charge(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const nonce = await this.computeNonce(paymentInfo);\n const amt = amount || paymentInfo.maxAmount;\n\n const auth = {\n from: this.payerAddress,\n to: this.contracts.tokenCollector,\n value: String(amt),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce,\n };\n const signature = await this.signErc3009(auth);\n // Pass raw signature bytes as collectorData (ethers handles hex -> bytes)\n const collectorData = ethers.getBytes(signature);\n\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, OPERATOR_ABI, (iface) => {\n return iface.encodeFunctionData('charge', [\n tuple, amt, this.contracts.tokenCollector, collectorData,\n ]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, OPERATOR_ABI, this.signer);\n const tx = await contract.charge(\n tuple,\n amt,\n this.contracts.tokenCollector,\n collectorData,\n { gasLimit: this.gasLimit },\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * REFUND POST ESCROW: Dispute refund after funds were released.\n *\n * Calls PaymentOperator.refundPostEscrow() -> escrow.refund()\n *\n * WARNING: NOT FUNCTIONAL IN PRODUCTION (as of 2026-02-03).\n * The protocol team has not implemented the required tokenCollector\n * contract. This call will fail on-chain.\n *\n * For dispute resolution, use refundInEscrow() instead: keep funds\n * in escrow and refund before releasing. This guarantees funds are\n * available and under arbiter control.\n *\n * Kept for future use when tokenCollector is implemented.\n *\n * @param paymentInfo - PaymentInfo from the original authorization\n * @param amount - Amount to refund (defaults to maxAmount)\n * @param tokenCollector - Address of token collector for refund sourcing\n * @param collectorData - Data for the token collector\n */\n async refundPostEscrow(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n tokenCollector?: string,\n collectorData?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, OPERATOR_ABI, (iface) => {\n return iface.encodeFunctionData('refundPostEscrow', [\n tuple, amt, tokenCollector || ZERO_ADDRESS, collectorData || '0x',\n ]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, OPERATOR_ABI, this.signer);\n const tx = await contract.refundPostEscrow(\n tuple,\n amt,\n tokenCollector || ZERO_ADDRESS,\n collectorData || '0x',\n { gasLimit: this.gasLimit },\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n // ==========================================================================\n // INTERNAL: Adapter-based transaction signing and broadcast\n // ==========================================================================\n\n /**\n * Build an unsigned transaction, sign via SigningWalletAdapter, and broadcast.\n *\n * Used by release(), refundInEscrow(), charge(), refundPostEscrow() when\n * operating in OWS wallet adapter mode. The adapter signs the serialized\n * transaction offline; the RPC provider broadcasts the signed raw TX.\n *\n * @param ethersModule - ethers namespace (from `const { ethers } = await import('ethers')`)\n * @param abi - Contract ABI (OPERATOR_ABI or OPERATOR_ABI_CREATE3)\n * @param encodeCalldata - Function that encodes the calldata using the interface\n * @returns Transaction result\n */\n private async sendViaAdapter(\n ethersModule: any,\n abi: string[],\n encodeCalldata: (iface: any) => string,\n ): Promise<AdvancedTransactionResult> {\n const provider = new ethersModule.JsonRpcProvider(this.rpcUrl);\n const iface = new ethersModule.Interface(abi);\n const data = encodeCalldata(iface);\n\n // Build unsigned transaction\n const nonce = await provider.getTransactionCount(this.payerAddress);\n const feeData = await provider.getFeeData();\n\n const unsignedTx = ethersModule.Transaction.from({\n to: this.contracts.operator,\n data,\n gasLimit: this.gasLimit,\n nonce,\n chainId: this.chainId,\n maxFeePerGas: feeData.maxFeePerGas,\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,\n type: 2, // EIP-1559\n });\n\n // Sign via adapter\n const signedTxHex = await this.walletAdapter!.signTransaction(unsignedTx.unsignedSerialized);\n\n // Broadcast\n const txResponse = await provider.broadcastTransaction(signedTxHex);\n const receipt = await txResponse.wait();\n\n return {\n success: receipt !== null && receipt.status === 1,\n transactionHash: txResponse.hash,\n gasUsed: receipt ? Number(receipt.gasUsed) : undefined,\n error: receipt && receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/types/index.ts","../../src/chains/index.ts","../../src/utils/base64.ts","../../src/utils/x402.ts","../../src/escrow-preauth.ts","../../src/backend/index.ts"],"names":["requirements","reqOptions","ethers"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * uvd-x402-sdk - Type Definitions\n *\n * Core TypeScript interfaces for the x402 payment SDK.\n * These types define the contract between the SDK and consuming applications.\n */\n\n// ============================================================================\n// CHAIN CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Network type categorization\n * - 'evm': Ethereum Virtual Machine compatible chains (use EIP-712)\n * - 'svm': Solana Virtual Machine chains (Solana, Fogo) (use SPL tokens)\n * - 'stellar': Stellar network (use Soroban)\n * - 'near': NEAR Protocol (use NEP-366)\n * - 'algorand': Algorand network (use ASA transfers with atomic transactions)\n * - 'sui': Sui blockchain (use sponsored transactions)\n * - 'xrpl': XRP Ledger (use pre-signed Payment transaction blobs)\n *\n * @deprecated 'solana' type is deprecated, use 'svm' instead\n */\nexport type NetworkType = 'evm' | 'svm' | 'solana' | 'stellar' | 'near' | 'algorand' | 'sui' | 'xrpl';\n\n/**\n * Supported x402 payment schemes\n * - 'exact': Standard one-shot payment (default)\n * - 'escrow': Escrow-based payment with verify/settle/refund\n * - 'commerce': Commerce alias for escrow (marketplace integrations)\n */\nexport type X402Scheme = 'exact' | 'escrow' | 'commerce';\n\n/**\n * Supported stablecoin token types\n * - usdc: USD Coin (Circle) - 6 decimals\n * - eurc: Euro Coin (Circle) - 6 decimals\n * - ausd: Agora USD (Agora Finance) - 6 decimals\n * - pyusd: PayPal USD (PayPal/Paxos) - 6 decimals\n * - usdt: Tether USD (USDT0 omnichain via LayerZero) - 6 decimals\n * - usdg: Global Dollar (Paxos) - 6 decimals; settlement stablecoin on Robinhood Chain\n */\nexport type TokenType = 'usdc' | 'eurc' | 'ausd' | 'pyusd' | 'usdt' | 'usdg';\n\n/**\n * Token configuration for EIP-712 signing and transfers\n */\nexport interface TokenConfig {\n /** Contract/mint address */\n address: string;\n /** Token decimals (6 for all supported stablecoins) */\n decimals: number;\n /** Token name for EIP-712 domain (e.g., \"USD Coin\" or \"USDC\") */\n name: string;\n /** Token version for EIP-712 domain */\n version: string;\n}\n\n/**\n * USDC token configuration for a specific chain\n * @deprecated Use TokenConfig instead. This is kept for backward compatibility.\n */\nexport interface USDCConfig {\n /** Contract/mint address */\n address: string;\n /** Token decimals (6 for most chains, 7 for Stellar) */\n decimals: number;\n /** Token name for EIP-712 domain (e.g., \"USD Coin\" or \"USDC\") */\n name: string;\n /** Token version for EIP-712 domain */\n version: string;\n}\n\n/**\n * Native currency configuration\n */\nexport interface NativeCurrency {\n name: string;\n symbol: string;\n decimals: number;\n}\n\n/**\n * Complete chain configuration\n */\nexport interface ChainConfig {\n /** Numeric chain ID (0 for non-EVM chains) */\n chainId: number;\n /** Hex-encoded chain ID for wallet_switchEthereumChain */\n chainIdHex: string;\n /** Internal chain identifier (e.g., 'base', 'solana') */\n name: string;\n /** Human-readable display name */\n displayName: string;\n /** Network type for routing */\n networkType: NetworkType;\n /** Primary RPC endpoint URL */\n rpcUrl: string;\n /** Block explorer base URL */\n explorerUrl: string;\n /** Native currency info */\n nativeCurrency: NativeCurrency;\n /** USDC token configuration */\n usdc: USDCConfig;\n /**\n * Multi-token configurations (EVM chains only)\n * Maps token type to its configuration for this chain.\n * Not all tokens are available on all chains.\n */\n tokens?: Partial<Record<TokenType, TokenConfig>>;\n /** x402 facilitator configuration */\n x402: {\n facilitatorUrl: string;\n enabled: boolean;\n };\n}\n\n// ============================================================================\n// WALLET TYPES\n// ============================================================================\n\n/**\n * Current wallet connection state\n */\nexport interface WalletState {\n /** Whether a wallet is currently connected */\n connected: boolean;\n /** Connected wallet address (null if not connected) */\n address: string | null;\n /** Current chain ID (null for non-EVM or disconnected) */\n chainId: number | null;\n /** Current network name */\n network: string | null;\n /** Network type of connected wallet */\n networkType: NetworkType | null;\n /** USDC balance on current chain (null if unknown) */\n balance: string | null;\n}\n\n/**\n * Wallet adapter interface for different wallet types\n */\nexport interface WalletAdapter {\n /** Unique identifier for this wallet type */\n readonly id: string;\n /** Display name */\n readonly name: string;\n /** Network type this adapter supports */\n readonly networkType: NetworkType;\n\n /** Check if this wallet is available/installed */\n isAvailable(): boolean;\n\n /** Connect to the wallet */\n connect(chainName?: string): Promise<string>;\n\n /** Disconnect from the wallet */\n disconnect(): Promise<void>;\n\n /** Switch to a different chain (EVM only) */\n switchChain?(chainName: string): Promise<void>;\n\n /**\n * Sign a payment payload\n * For EVM chains, supports multi-token via paymentInfo.tokenType\n */\n signPayment(paymentInfo: PaymentInfo, chainConfig: ChainConfig): Promise<string>;\n\n /**\n * Check token balance (defaults to USDC for backward compatibility)\n * EVM providers may accept optional tokenType parameter\n */\n getBalance(chainConfig: ChainConfig, tokenType?: TokenType): Promise<string>;\n\n /** Get current address */\n getAddress(): string | null;\n\n /** Get current chain ID (EVM only) */\n getChainId?(): number | null;\n}\n\n/**\n * EIP-712 domain for typed data signing\n */\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\n/**\n * EIP-712 type definitions\n */\nexport interface EIP712Types {\n [typeName: string]: Array<{ name: string; type: string }>;\n}\n\n// ============================================================================\n// PAYMENT TYPES\n// ============================================================================\n\n/**\n * Payment information returned by backend on 402 response\n */\nexport interface PaymentInfo {\n /** Default recipient address */\n recipient: string;\n /** Network-specific recipient addresses */\n recipients?: {\n evm?: string;\n solana?: string;\n near?: string;\n stellar?: string;\n algorand?: string;\n sui?: string;\n xrpl?: string;\n };\n /** Facilitator address (for Solana fee payer) */\n facilitator?: string;\n /** Amount in USD (e.g., \"10.00\") */\n amount: string;\n /** Token symbol (usually \"USDC\") */\n token?: string;\n /**\n * Token type for multi-token support\n * Defaults to 'usdc' if not specified for backward compatibility\n */\n tokenType?: TokenType;\n /** Network hint from backend */\n network?: string;\n /** Supported chain IDs */\n supportedChains?: number[];\n}\n\n/**\n * Simple payment request from application\n */\nexport interface PaymentRequest {\n /** Amount in USDC (e.g., \"10.00\") */\n amount: string;\n /** Override recipient address (optional) */\n recipient?: string;\n /** Application-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * x402 payment header names\n *\n * - 'X-PAYMENT': v1 header name (default, most compatible)\n * - 'PAYMENT-SIGNATURE': v2 header name (newer standard)\n *\n * Both headers use the same base64-encoded JSON payload format.\n * The facilitator accepts both headers.\n */\nexport type X402HeaderName = 'X-PAYMENT' | 'PAYMENT-SIGNATURE';\n\n/**\n * Payment headers object containing both v1 and v2 header formats\n */\nexport interface PaymentHeaders {\n /** v1 header: X-PAYMENT */\n 'X-PAYMENT': string;\n /** v2 header: PAYMENT-SIGNATURE (same value, different header name) */\n 'PAYMENT-SIGNATURE': string;\n}\n\n/**\n * Result of a payment operation\n */\nexport interface PaymentResult {\n /** Whether payment was successful */\n success: boolean;\n /** Base64-encoded X-PAYMENT header value */\n paymentHeader: string;\n /**\n * Payment headers object for easy use with fetch/axios\n *\n * @example\n * ```ts\n * // Use v1 header\n * fetch(url, { headers: { 'X-PAYMENT': result.headers['X-PAYMENT'] } });\n *\n * // Use v2 header\n * fetch(url, { headers: { 'PAYMENT-SIGNATURE': result.headers['PAYMENT-SIGNATURE'] } });\n * ```\n */\n headers: PaymentHeaders;\n /** Transaction hash (if available) */\n transactionHash?: string;\n /** Network where payment was made */\n network: string;\n /** Payer address */\n payer?: string;\n /** Error message (if success is false) */\n error?: string;\n}\n\n// ============================================================================\n// PAYLOAD TYPES (Internal)\n// ============================================================================\n\n/**\n * EVM payment payload (ERC-3009 TransferWithAuthorization)\n */\nexport interface EVMPaymentPayload {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string;\n v: number;\n r: string;\n s: string;\n chainId: number;\n token: string;\n}\n\n/**\n * Token info for non-USDC stablecoins (e.g., Token2022 like AUSD)\n * Required in payload for facilitator to verify Token2022 transfers correctly.\n */\nexport interface TokenInfo {\n /** Token mint address */\n address: string;\n /** Token symbol (e.g., 'AUSD') */\n symbol: string;\n /** Token decimals (e.g., 6) */\n decimals: number;\n}\n\n/**\n * Solana payment payload (partially-signed transaction)\n */\nexport interface SolanaPaymentPayload {\n /** Base64-encoded serialized transaction */\n transaction: string;\n /**\n * Token info for non-USDC tokens (e.g., Token2022 like AUSD)\n * CRITICAL: Must be included for Token2022 tokens for facilitator verification\n */\n token?: TokenInfo;\n}\n\n/**\n * Stellar payment payload (Soroban authorization)\n */\nexport interface StellarPaymentPayload {\n /** Sender G... public key */\n from: string;\n /** Recipient G... public key */\n to: string;\n /** Amount in stroops (7 decimals) */\n amount: string;\n /** USDC SAC contract address */\n tokenContract: string;\n /** Base64 XDR-encoded SorobanAuthorizationEntry */\n authorizationEntryXdr: string;\n /** Random 64-bit nonce */\n nonce: number;\n /** Ledger when authorization expires */\n signatureExpirationLedger: number;\n}\n\n/**\n * NEAR payment payload (NEP-366 meta-transaction)\n */\nexport interface NEARPaymentPayload {\n /** Base64 Borsh-encoded SignedDelegateAction */\n signedDelegateAction: string;\n network: 'near';\n}\n\n/**\n * Algorand payment payload (atomic transaction group)\n *\n * Follows the GoPlausible x402-avm spec for atomic groups:\n * - Transaction 0: Fee payment (UNSIGNED) - facilitator -> facilitator, covers all fees\n * - Transaction 1: ASA transfer (SIGNED) - client -> merchant\n *\n * The facilitator signs transaction 0 and submits the complete atomic group.\n */\nexport interface AlgorandPaymentPayload {\n /** Index of the payment transaction in the group (always 1) */\n paymentIndex: number;\n /**\n * Array of base64-encoded msgpack transactions forming the atomic group:\n * - [0]: Unsigned fee transaction (facilitator signs)\n * - [1]: Signed ASA transfer (client signed)\n */\n paymentGroup: string[];\n}\n\n/**\n * Sui payment payload (sponsored transaction)\n *\n * Uses Sui sponsored transactions where:\n * - User creates a programmable transaction for USDC transfer\n * - User signs the transaction\n * - Facilitator sponsors (pays gas in SUI) and submits\n *\n * User pays: ZERO SUI\n */\nexport interface SuiPaymentPayload {\n /** Base64-encoded BCS serialized TransactionData */\n transactionBytes: string;\n /** Base64-encoded user signature */\n senderSignature: string;\n /** Sender address (0x + 64 hex chars) */\n from: string;\n /** Recipient address (0x + 64 hex chars) */\n to: string;\n /** Amount in base units (string to handle large numbers) */\n amount: string;\n /** Coin object ID used for the transfer (REQUIRED by facilitator) */\n coinObjectId: string;\n}\n\n/**\n * XRPL payment payload (pre-signed Payment transaction blob)\n *\n * Uses the t54 \"pre-signed Payment blob\" scheme on the XRP Ledger:\n * - The client builds and FULLY signs a Payment transaction off-chain,\n * paying its own XRP network fee.\n * - The single `signedTxBlob` field (hex-encoded fully-signed XRPL tx blob)\n * is sent to the facilitator, which decodes it to re-derive payer/amount/\n * destination and submits it.\n *\n * All payment-level fields (destination, amount, InvoiceID, SourceTag, etc.)\n * come from PaymentRequirements/extra, NOT from this payload.\n *\n * XRP is the native asset (6 decimals / drops). There is no token contract.\n *\n * The JSON field name is EXACTLY `signedTxBlob` (camelCase).\n */\nexport interface XRPLPaymentPayload {\n /** Hex-encoded fully-signed XRPL Payment transaction blob (tx_blob) */\n signedTxBlob: string;\n}\n\n/**\n * Union type for all payment payloads\n */\nexport type PaymentPayload =\n | EVMPaymentPayload\n | SolanaPaymentPayload\n | StellarPaymentPayload\n | NEARPaymentPayload\n | AlgorandPaymentPayload\n | SuiPaymentPayload\n | XRPLPaymentPayload;\n\n// ============================================================================\n// X402 HEADER TYPES (v1 and v2)\n// ============================================================================\n\n/**\n * x402 protocol version\n */\nexport type X402Version = 1 | 2;\n\n/**\n * CAIP-2 chain identifiers for x402 v2\n * @see https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md\n */\nexport const CAIP2_IDENTIFIERS: Record<string, string> = {\n // EVM chains\n base: 'eip155:8453',\n ethereum: 'eip155:1',\n polygon: 'eip155:137',\n arbitrum: 'eip155:42161',\n optimism: 'eip155:10',\n avalanche: 'eip155:43114',\n celo: 'eip155:42220',\n hyperevm: 'eip155:999',\n unichain: 'eip155:130',\n monad: 'eip155:143',\n bsc: 'eip155:56',\n scroll: 'eip155:534352',\n 'skale-base': 'eip155:1187947933',\n 'skale-base-sepolia': 'eip155:324705682',\n robinhood: 'eip155:4663',\n 'robinhood-testnet': 'eip155:46630',\n // SVM chains\n solana: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n fogo: 'svm:fogo',\n // Stellar\n stellar: 'stellar:pubnet',\n // NEAR\n near: 'near:mainnet',\n // Algorand\n algorand: 'algorand:mainnet',\n 'algorand-testnet': 'algorand:testnet',\n // Sui\n sui: 'sui:mainnet',\n 'sui-testnet': 'sui:testnet',\n // XRPL (XRP Ledger has no CAIP-2 form - the v1 string IS the network id)\n 'xrpl-mainnet': 'xrpl-mainnet',\n 'xrpl-testnet': 'xrpl-testnet',\n};\n\n/**\n * Reverse mapping from CAIP-2 to chain name\n */\nexport const CAIP2_TO_CHAIN: Record<string, string> = Object.fromEntries(\n Object.entries(CAIP2_IDENTIFIERS).map(([k, v]) => [v, k])\n);\n\n/**\n * x402 v1 header structure (network as string)\n */\nexport interface X402HeaderV1 {\n x402Version: 1;\n scheme: X402Scheme;\n network: string;\n payload: X402PayloadData;\n}\n\n/**\n * x402 v2 payment option\n */\nexport interface X402PaymentOption {\n network: string; // CAIP-2 format\n asset: string;\n amount: string;\n facilitator?: string;\n}\n\n/**\n * x402 v2 header structure (CAIP-2 network, accepts array)\n */\nexport interface X402HeaderV2 {\n x402Version: 2;\n scheme: X402Scheme;\n network: string; // CAIP-2 format\n payload: X402PayloadData;\n accepts?: X402PaymentOption[];\n}\n\n/**\n * Union type for both v1 and v2 headers\n */\nexport type X402Header = X402HeaderV1 | X402HeaderV2;\n\n/**\n * EVM-specific payload in x402 header\n */\nexport interface X402EVMPayload {\n signature: string;\n authorization: {\n from: string;\n to: string;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: string;\n };\n /**\n * Which token was actually paid.\n *\n * Only present when the payment is created with `includeTokenMetadata`. The\n * signature alone does not say which stablecoin it authorizes — a server that\n * accepts several tokens on the same chain cannot rebuild the payment\n * requirements without this. Omitted by default so existing v1 wire formats\n * stay byte-identical.\n */\n token?: PaymentTokenMetadata;\n}\n\n/**\n * Token identification carried inside an x402 payload.\n *\n * Mirrors what a resource server needs to build `paymentRequirements`: the\n * `asset` it must charge and the `extra` EIP-712 domain the facilitator needs\n * to recover the signature.\n */\nexport interface PaymentTokenMetadata {\n /** Token contract address (the `asset` of the payment requirements) */\n address: string;\n /** Uppercase token symbol, e.g. `USDC`, `EURC`, `USDT` */\n symbol: string;\n /** Token decimals — the amount in the authorization is in these units */\n decimals: number;\n /** EIP-712 domain of the token contract (the `extra` of the requirements) */\n eip712: {\n name: string;\n version: string;\n };\n}\n\n/**\n * Solana-specific payload in x402 header\n */\nexport interface X402SolanaPayload {\n transaction: string;\n}\n\n/**\n * Settlement account payload for Crossmint and other custodial wallets\n * that can only sendTransaction (not signTransaction).\n *\n * In this mode, the client already submitted the transaction on-chain.\n * The facilitator verifies the on-chain tx, then sweeps USDC from the\n * settlement account to the payTo address.\n *\n * Used by: Crossmint smart wallets via @faremeter/wallet-crossmint\n */\nexport interface X402SettlementAccountPayload {\n /** On-chain transaction signature (already submitted) */\n transactionSignature: string;\n /** Base58 secret key for sweeping settlement account (optional) */\n settleSecretKey?: string;\n /** Address to receive rent from closed settlement ATA (optional) */\n settlementRentDestination?: string;\n}\n\n/**\n * Stellar-specific payload in x402 header\n */\nexport interface X402StellarPayload {\n from: string;\n to: string;\n amount: string;\n tokenContract: string;\n authorizationEntryXdr: string;\n nonce: number;\n signatureExpirationLedger: number;\n}\n\n/**\n * NEAR-specific payload in x402 header\n */\nexport interface X402NEARPayload {\n signedDelegateAction: string;\n}\n\n/**\n * Algorand-specific payload in x402 header (atomic group format)\n */\nexport interface X402AlgorandPayload {\n /** Index of the payment transaction in the group (always 1) */\n paymentIndex: number;\n /** Array of base64-encoded msgpack transactions */\n paymentGroup: string[];\n}\n\n/**\n * Sui-specific payload in x402 header (sponsored transaction)\n */\nexport interface X402SuiPayload {\n /** BCS-encoded transaction bytes (base64) */\n transactionBytes: string;\n /** User's signature on the transaction (base64) */\n senderSignature: string;\n /** Sender's Sui address (0x...) */\n from: string;\n /** Recipient's Sui address (0x...) */\n to: string;\n /** Amount in smallest unit (string to avoid precision issues) */\n amount: string;\n /** Coin object ID used for the transfer (REQUIRED by facilitator) */\n coinObjectId: string;\n}\n\n/**\n * XRPL-specific payload in x402 header (t54 pre-signed Payment blob)\n *\n * The JSON field name is EXACTLY `signedTxBlob` (camelCase). The facilitator\n * decodes the blob to re-derive payer/amount/destination; no other fields are\n * carried in the payload.\n */\nexport interface X402XRPLPayload {\n /** Hex-encoded fully-signed XRPL Payment transaction blob (tx_blob) */\n signedTxBlob: string;\n}\n\n/**\n * Union of all x402 payload types\n */\nexport type X402PayloadData =\n | X402EVMPayload\n | X402SolanaPayload\n | X402SettlementAccountPayload\n | X402StellarPayload\n | X402NEARPayload\n | X402AlgorandPayload\n | X402SuiPayload\n | X402XRPLPayload;\n\n// ============================================================================\n// CLIENT CONFIGURATION\n// ============================================================================\n\n/**\n * Multi-payment configuration for supporting multiple networks\n */\nexport interface MultiPaymentConfig {\n /** Networks to support (e.g., ['base', 'solana', 'stellar', 'near']) */\n networks: string[];\n /** Default network if user hasn't selected one */\n defaultNetwork?: string;\n /** Whether to auto-detect user's preferred network based on wallet */\n autoDetect?: boolean;\n}\n\n/**\n * SDK client configuration options\n */\nexport interface X402ClientConfig {\n /** Facilitator URL (default: https://facilitator.ultravioletadao.xyz) */\n facilitatorUrl?: string;\n /** Default chain to connect to */\n defaultChain?: string;\n /** Auto-connect on initialization */\n autoConnect?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom chain configurations (override defaults) */\n customChains?: Record<string, Partial<ChainConfig>>;\n /** Wallet preference order */\n walletPreference?: string[];\n /** Custom RPC URLs (override defaults) */\n rpcOverrides?: Record<string, string>;\n /**\n * x402 protocol version to use\n * - 1: Classic format with network as string (e.g., \"base\")\n * - 2: CAIP-2 format with accepts array (e.g., \"eip155:8453\")\n * - 'auto': Auto-detect from 402 response (default)\n */\n x402Version?: X402Version | 'auto';\n /** Multi-payment configuration for supporting multiple networks */\n multiPayment?: MultiPaymentConfig;\n /**\n * Include a `token` block in the payload naming the asset, its decimals and\n * its EIP-712 domain.\n *\n * Needed when the resource accepts more than one stablecoin on the same\n * chain: the signature alone does not say which one was paid, so the server\n * cannot rebuild `paymentRequirements`. Off by default — the emitted header\n * stays byte-identical to previous versions.\n */\n includeTokenMetadata?: boolean;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Required<Pick<X402ClientConfig, 'facilitatorUrl' | 'defaultChain' | 'autoConnect' | 'debug' | 'x402Version'>> = {\n facilitatorUrl: 'https://facilitator.ultravioletadao.xyz',\n defaultChain: 'base',\n autoConnect: false,\n debug: false,\n x402Version: 'auto',\n};\n\n// ============================================================================\n// BALANCE TYPES\n// ============================================================================\n\n/**\n * Balance information for a single network\n */\nexport interface NetworkBalance {\n /** Chain name */\n chainName: string;\n /** Human-readable display name */\n displayName: string;\n /** Formatted balance (e.g., \"15.50\") or null if loading/error */\n balance: string | null;\n /** Whether balance is currently being fetched */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n}\n\n// ============================================================================\n// EVENT TYPES\n// ============================================================================\n\n/**\n * Events emitted by the SDK client\n */\nexport type X402Event =\n | 'connect'\n | 'disconnect'\n | 'chainChanged'\n | 'accountChanged'\n | 'balanceChanged'\n | 'paymentStarted'\n | 'paymentSigned'\n | 'paymentCompleted'\n | 'paymentFailed';\n\n/**\n * Event data types\n */\nexport interface X402EventData {\n connect: WalletState;\n disconnect: void;\n chainChanged: { chainId: number; chainName: string };\n accountChanged: { address: string };\n balanceChanged: { balance: string };\n paymentStarted: { amount: string; network: string };\n paymentSigned: { paymentHeader: string };\n paymentCompleted: PaymentResult;\n paymentFailed: { error: string; code: X402ErrorCode };\n}\n\n/**\n * Event handler type\n */\nexport type X402EventHandler<E extends X402Event> = (data: X402EventData[E]) => void;\n\n// ============================================================================\n// ERROR TYPES\n// ============================================================================\n\n/**\n * Error codes for categorizing errors\n */\nexport type X402ErrorCode =\n | 'WALLET_NOT_FOUND'\n | 'WALLET_NOT_CONNECTED'\n | 'WALLET_NOT_SUPPORTED'\n | 'WALLET_CONNECTION_FAILED'\n | 'WALLET_CONNECTION_REJECTED'\n | 'WALLET_CONNECTION_TIMEOUT'\n | 'CHAIN_NOT_SUPPORTED'\n | 'CHAIN_SWITCH_REJECTED'\n | 'INSUFFICIENT_BALANCE'\n | 'SIGNATURE_REJECTED'\n | 'PAYMENT_FAILED'\n | 'PAYMENT_TIMEOUT'\n | 'NETWORK_ERROR'\n | 'INVALID_CONFIG'\n | 'INVALID_AMOUNT'\n | 'INVALID_RECIPIENT'\n | 'UNKNOWN_ERROR';\n\n/**\n * SDK-specific error class\n */\nexport class X402Error extends Error {\n public readonly code: X402ErrorCode;\n public readonly details?: unknown;\n\n constructor(message: string, code: X402ErrorCode, details?: unknown) {\n super(message);\n this.name = 'X402Error';\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, X402Error);\n }\n }\n}\n","/**\n * uvd-x402-sdk - Chain Registry\n *\n * Complete configuration for all 25 supported blockchain networks.\n * EVM chains (15): Use ERC-3009 TransferWithAuthorization (includes Scroll, SKALE Base, Robinhood Chain mainnet + testnet)\n * SVM chains (2): Solana and Fogo - Use SPL tokens with partially-signed transactions\n * Stellar (1): Uses Soroban authorization entries\n * NEAR (1): Uses NEP-366 meta-transactions\n * Algorand (2): Uses ASA transfers with atomic transaction groups\n * Sui (2): Uses sponsored transactions (facilitator pays gas)\n * XRPL (2): Native XRP via pre-signed Payment transaction blobs (facilitator pays fee)\n */\n\nimport type { ChainConfig, NetworkType, TokenType, TokenConfig } from '../types';\n\n/**\n * Default facilitator URL for x402 payments\n */\nexport const DEFAULT_FACILITATOR_URL = 'https://facilitator.ultravioletadao.xyz';\n\n/**\n * All supported chains configuration\n *\n * To add a new chain:\n * 1. Add chain config below with all required fields\n * 2. Verify USDC contract supports ERC-3009 (transferWithAuthorization) for EVM chains\n * 3. Test on testnet first before enabling\n */\nexport const SUPPORTED_CHAINS: Record<string, ChainConfig> = {\n // ============================================================================\n // EVM CHAINS (15 networks)\n // ============================================================================\n\n base: {\n chainId: 8453,\n chainIdHex: '0x2105',\n name: 'base',\n displayName: 'Base',\n networkType: 'evm',\n rpcUrl: 'https://mainnet.base.org',\n explorerUrl: 'https://basescan.org',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42',\n decimals: 6,\n name: 'EURC',\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n avalanche: {\n chainId: 43114,\n chainIdHex: '0xa86a',\n name: 'avalanche',\n displayName: 'Avalanche C-Chain',\n networkType: 'evm',\n rpcUrl: 'https://avalanche-c-chain-rpc.publicnode.com',\n explorerUrl: 'https://snowtrace.io',\n nativeCurrency: {\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n },\n usdc: {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0xC891EB4cbdEFf6e073e859e987815Ed1505c2ACD',\n decimals: 6,\n name: 'EURC',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n ethereum: {\n chainId: 1,\n chainIdHex: '0x1',\n name: 'ethereum',\n displayName: 'Ethereum',\n networkType: 'evm',\n rpcUrl: 'https://eth.llamarpc.com',\n explorerUrl: 'https://etherscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n eurc: {\n address: '0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c',\n decimals: 6,\n name: 'Euro Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n pyusd: {\n address: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8',\n decimals: 6,\n name: 'PayPal USD',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n polygon: {\n chainId: 137,\n chainIdHex: '0x89',\n name: 'polygon',\n displayName: 'Polygon',\n networkType: 'evm',\n rpcUrl: 'https://polygon-rpc.com',\n explorerUrl: 'https://polygonscan.com',\n nativeCurrency: {\n name: 'Polygon',\n symbol: 'POL',\n decimals: 18,\n },\n usdc: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n arbitrum: {\n chainId: 42161,\n chainIdHex: '0xa4b1',\n name: 'arbitrum',\n displayName: 'Arbitrum One',\n networkType: 'evm',\n rpcUrl: 'https://arb1.arbitrum.io/rpc',\n explorerUrl: 'https://arbiscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n usdt: {\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n decimals: 6,\n name: 'USD₮0',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n optimism: {\n chainId: 10,\n chainIdHex: '0xa',\n name: 'optimism',\n displayName: 'Optimism',\n networkType: 'evm',\n rpcUrl: 'https://mainnet.optimism.io',\n explorerUrl: 'https://optimistic.etherscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n usdt: {\n address: '0x01bff41798a0bcf287b996046ca68b395dbc1071',\n decimals: 6,\n name: 'USD₮0',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n celo: {\n chainId: 42220,\n chainIdHex: '0xa4ec',\n name: 'celo',\n displayName: 'Celo',\n networkType: 'evm',\n rpcUrl: 'https://forno.celo.org',\n explorerUrl: 'https://celoscan.io',\n nativeCurrency: {\n name: 'Celo',\n symbol: 'CELO',\n decimals: 18,\n },\n usdc: {\n address: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n decimals: 6,\n name: 'USDC', // Celo uses \"USDC\" not \"USD Coin\" for EIP-712\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n decimals: 6,\n name: 'USDC', // Celo uses \"USDC\" not \"USD Coin\" for EIP-712\n version: '2',\n },\n usdt: {\n address: '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e',\n decimals: 6,\n name: 'Tether USD', // Celo USDT uses \"Tether USD\" for EIP-712\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n hyperevm: {\n chainId: 999,\n chainIdHex: '0x3e7',\n name: 'hyperevm',\n displayName: 'HyperEVM',\n networkType: 'evm',\n rpcUrl: 'https://rpc.hyperliquid.xyz/evm',\n explorerUrl: 'https://hyperevmscan.io',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0xb88339CB7199b77E23DB6E890353E22632Ba630f',\n decimals: 6,\n name: 'USDC', // HyperEVM uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0xb88339CB7199b77E23DB6E890353E22632Ba630f',\n decimals: 6,\n name: 'USDC', // HyperEVM uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n unichain: {\n chainId: 130,\n chainIdHex: '0x82',\n name: 'unichain',\n displayName: 'Unichain',\n networkType: 'evm',\n rpcUrl: 'https://unichain-rpc.publicnode.com',\n explorerUrl: 'https://uniscan.xyz',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x078d782b760474a361dda0af3839290b0ef57ad6',\n decimals: 6,\n name: 'USDC', // Unichain uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x078d782b760474a361dda0af3839290b0ef57ad6',\n decimals: 6,\n name: 'USDC', // Unichain uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n monad: {\n chainId: 143,\n chainIdHex: '0x8f',\n name: 'monad',\n displayName: 'Monad',\n networkType: 'evm',\n rpcUrl: 'https://rpc.monad.xyz',\n explorerUrl: 'https://monad.socialscan.io',\n nativeCurrency: {\n name: 'Monad',\n symbol: 'MON',\n decimals: 18,\n },\n usdc: {\n address: '0x754704bc059f8c67012fed69bc8a327a5aafb603',\n decimals: 6,\n name: 'USDC', // Monad uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x754704bc059f8c67012fed69bc8a327a5aafb603',\n decimals: 6,\n name: 'USDC', // Monad uses \"USDC\" not \"USD Coin\"\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n usdt: {\n address: '0xe7cd86e13AC4309349F30B3435a9d337750fC82D',\n decimals: 6,\n name: 'USD\\u20AE0', // USD₮0 (USDT0 omnichain via LayerZero)\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n bsc: {\n chainId: 56,\n chainIdHex: '0x38',\n name: 'bsc',\n displayName: 'BNB Smart Chain',\n networkType: 'evm',\n rpcUrl: 'https://binance.llamarpc.com',\n explorerUrl: 'https://bscscan.com',\n nativeCurrency: {\n name: 'Binance Coin',\n symbol: 'BNB',\n decimals: 18,\n },\n usdc: {\n // Binance-Peg USDC — 18 decimals, NOT the 6 every other chain uses.\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n decimals: 18,\n name: 'USD Coin',\n version: '2',\n },\n ausd: {\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n // Disabled on purpose: Binance-Peg USDC does not implement ERC-3009\n // `transferWithAuthorization`, so the exact scheme cannot settle it. The\n // entry exists so the 18-decimal figure is on record — assuming the usual\n // 6 here mis-prices a payment by 12 orders of magnitude.\n enabled: false,\n },\n },\n\n scroll: {\n chainId: 534352,\n chainIdHex: '0x82750',\n name: 'scroll',\n displayName: 'Scroll',\n networkType: 'evm',\n rpcUrl: 'https://rpc.scroll.io',\n explorerUrl: 'https://scrollscan.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4',\n decimals: 6,\n name: 'USD Coin',\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'skale-base': {\n chainId: 1187947933,\n chainIdHex: '0x46cea59d',\n name: 'skale-base',\n displayName: 'SKALE Base',\n networkType: 'evm',\n rpcUrl: 'https://skale-base.skalenodes.com/v1/base',\n explorerUrl: 'https://skale-base-explorer.skalenodes.com',\n nativeCurrency: {\n name: 'CREDIT',\n symbol: 'CREDIT',\n decimals: 18,\n },\n usdc: {\n address: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'skale-base-sepolia': {\n chainId: 324705682,\n chainIdHex: '0x135a9d92',\n name: 'skale-base-sepolia',\n displayName: 'SKALE Base Sepolia',\n networkType: 'evm',\n rpcUrl: 'https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha',\n explorerUrl: 'https://base-sepolia-testnet-explorer.skalenodes.com',\n nativeCurrency: {\n name: 'CREDIT',\n symbol: 'CREDIT',\n decimals: 18,\n },\n usdc: {\n address: '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n tokens: {\n usdc: {\n address: '0x2e08028E3C4c2356572E096d8EF835cD5C6030bD',\n decimals: 6,\n name: 'Bridged USDC (SKALE Bridge)', // Must match on-chain EIP-712 domain exactly\n version: '2',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // Robinhood Chain (Arbitrum Orbit L2). NOTE: there is NO USDC on this chain -\n // the settlement stablecoin is Paxos USDG (Global Dollar). The `usdc` field\n // below carries USDG for interface compatibility (same pattern as XRPL's native\n // asset), and `tokens.usdg` is the canonical entry.\n // CRITICAL: USDG's on-chain version() getter REVERTS, so the EIP-712 domain\n // { name: 'Global Dollar', version: '1' } can NEVER be resolved on-chain and\n // MUST come from this config (mirrored into PaymentRequirements.extra by callers).\n robinhood: {\n chainId: 4663,\n chainIdHex: '0x1237',\n name: 'robinhood',\n displayName: 'Robinhood Chain',\n networkType: 'evm',\n rpcUrl: 'https://rpc.mainnet.chain.robinhood.com',\n explorerUrl: 'https://robinhoodchain.blockscout.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168', // Paxos USDG (no USDC on this chain)\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n tokens: {\n usdg: {\n address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168',\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'robinhood-testnet': {\n chainId: 46630,\n chainIdHex: '0xb626',\n name: 'robinhood-testnet',\n displayName: 'Robinhood Chain Testnet',\n networkType: 'evm',\n rpcUrl: 'https://rpc.testnet.chain.robinhood.com',\n explorerUrl: 'https://explorer.testnet.chain.robinhood.com',\n nativeCurrency: {\n name: 'Ethereum',\n symbol: 'ETH',\n decimals: 18,\n },\n usdc: {\n address: '0x7E955252E15c84f5768B83c41a71F9eba181802F', // Paxos USDG testnet (no USDC on this chain)\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n tokens: {\n usdg: {\n address: '0x7E955252E15c84f5768B83c41a71F9eba181802F',\n decimals: 6,\n name: 'Global Dollar', // on-chain version() reverts; domain must be supplied off-chain\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // SVM CHAINS (2 networks) - Solana Virtual Machine\n // ============================================================================\n\n solana: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'solana',\n displayName: 'Solana',\n networkType: 'svm',\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n explorerUrl: 'https://solscan.io',\n nativeCurrency: {\n name: 'Solana',\n symbol: 'SOL',\n decimals: 9,\n },\n usdc: {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token mint\n decimals: 6,\n name: 'USD Coin',\n version: '1',\n },\n tokens: {\n usdc: {\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC SPL token mint\n decimals: 6,\n name: 'USD Coin',\n version: '1',\n },\n ausd: {\n address: 'AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9', // AUSD Token2022 mint\n decimals: 6,\n name: 'Agora Dollar',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n fogo: {\n chainId: 0, // Non-EVM (SVM)\n chainIdHex: '0x0',\n name: 'fogo',\n displayName: 'Fogo',\n networkType: 'svm',\n rpcUrl: 'https://rpc.fogo.nightly.app/',\n explorerUrl: 'https://explorer.fogo.nightly.app',\n nativeCurrency: {\n name: 'Fogo',\n symbol: 'FOGO',\n decimals: 9,\n },\n usdc: {\n address: 'uSd2czE61Evaf76RNbq4KPpXnkiL3irdzgLFUMe3NoG', // Fogo USDC mint\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // STELLAR (1 network)\n // ============================================================================\n\n stellar: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'stellar',\n displayName: 'Stellar',\n networkType: 'stellar',\n rpcUrl: 'https://horizon.stellar.org',\n explorerUrl: 'https://stellar.expert/explorer/public',\n nativeCurrency: {\n name: 'Lumens',\n symbol: 'XLM',\n decimals: 7, // Stellar uses 7 decimals (stroops)\n },\n usdc: {\n address: 'CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75', // Soroban Asset Contract\n decimals: 7, // Stellar USDC uses 7 decimals\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // NEAR (1 network) - Uses NEP-366 meta-transactions\n // ============================================================================\n\n near: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'near',\n displayName: 'NEAR Protocol',\n networkType: 'near',\n rpcUrl: 'https://rpc.mainnet.near.org',\n explorerUrl: 'https://nearblocks.io',\n nativeCurrency: {\n name: 'NEAR',\n symbol: 'NEAR',\n decimals: 24, // NEAR uses 24 decimals (yoctoNEAR)\n },\n usdc: {\n address: '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1', // Native Circle USDC\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true, // NEP-366 meta-transactions supported\n },\n },\n\n // ============================================================================\n // ALGORAND (2 networks) - Uses ASA transfers with atomic transaction groups\n // ============================================================================\n\n algorand: {\n chainId: 0, // Non-EVM (Algorand uses genesis hash for network identification)\n chainIdHex: '0x0',\n name: 'algorand',\n displayName: 'Algorand',\n networkType: 'algorand',\n rpcUrl: 'https://mainnet-api.algonode.cloud',\n explorerUrl: 'https://allo.info',\n nativeCurrency: {\n name: 'Algo',\n symbol: 'ALGO',\n decimals: 6, // Algorand uses 6 decimals (microAlgos)\n },\n usdc: {\n address: '31566704', // USDC ASA ID on Algorand mainnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '31566704', // USDC ASA ID on Algorand mainnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'algorand-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'algorand-testnet',\n displayName: 'Algorand Testnet',\n networkType: 'algorand',\n rpcUrl: 'https://testnet-api.algonode.cloud',\n explorerUrl: 'https://testnet.allo.info',\n nativeCurrency: {\n name: 'Algo',\n symbol: 'ALGO',\n decimals: 6,\n },\n usdc: {\n address: '10458941', // USDC ASA ID on Algorand testnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '10458941', // USDC ASA ID on Algorand testnet\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // SUI (2 networks) - Uses sponsored transactions (facilitator pays gas)\n // ============================================================================\n\n sui: {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'sui',\n displayName: 'Sui',\n networkType: 'sui',\n rpcUrl: 'https://fullnode.mainnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/mainnet',\n nativeCurrency: {\n name: 'Sui',\n symbol: 'SUI',\n decimals: 9,\n },\n usdc: {\n // USDC coin type on Sui mainnet\n address: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n ausd: {\n // AUSD (Agora USD) coin type on Sui mainnet\n address: '0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD',\n decimals: 6,\n name: 'AUSD',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'sui-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'sui-testnet',\n displayName: 'Sui Testnet',\n networkType: 'sui',\n rpcUrl: 'https://fullnode.testnet.sui.io:443',\n explorerUrl: 'https://suiscan.xyz/testnet',\n nativeCurrency: {\n name: 'Sui',\n symbol: 'SUI',\n decimals: 9,\n },\n usdc: {\n // USDC coin type on Sui testnet\n address: '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n tokens: {\n usdc: {\n address: '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC',\n decimals: 6,\n name: 'USDC',\n version: '1',\n },\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n // ============================================================================\n // XRPL (2 networks) - XRP Ledger, native XRP via pre-signed Payment blobs\n // ============================================================================\n\n 'xrpl-mainnet': {\n chainId: 0, // Non-EVM (XRPL uses network id strings, no numeric chain ID)\n chainIdHex: '0x0',\n name: 'xrpl-mainnet',\n displayName: 'XRP Ledger',\n networkType: 'xrpl',\n rpcUrl: 'https://xrplcluster.com',\n explorerUrl: 'https://livenet.xrpl.org',\n nativeCurrency: {\n name: 'XRP',\n symbol: 'XRP',\n decimals: 6, // XRPL uses 6 decimals (drops); 1 XRP = 1,000,000 drops\n },\n // XRPL settles in native XRP - there is no USDC/token contract.\n // The `usdc` field describes the native asset for interface compatibility.\n usdc: {\n address: 'XRP', // Native asset - no token contract\n decimals: 6,\n name: 'XRP',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n\n 'xrpl-testnet': {\n chainId: 0, // Non-EVM\n chainIdHex: '0x0',\n name: 'xrpl-testnet',\n displayName: 'XRP Ledger Testnet',\n networkType: 'xrpl',\n rpcUrl: 'https://s.altnet.rippletest.net:51234',\n explorerUrl: 'https://testnet.xrpl.org',\n nativeCurrency: {\n name: 'XRP',\n symbol: 'XRP',\n decimals: 6,\n },\n // XRPL settles in native XRP - there is no USDC/token contract.\n usdc: {\n address: 'XRP', // Native asset - no token contract\n decimals: 6,\n name: 'XRP',\n version: '1',\n },\n x402: {\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n enabled: true,\n },\n },\n};\n\n/**\n * Default chain for new users\n */\nexport const DEFAULT_CHAIN = 'base';\n\n/**\n * Get chain config by chain ID\n */\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return Object.values(SUPPORTED_CHAINS).find(chain => chain.chainId === chainId);\n}\n\n/**\n * Get chain config by name (case-insensitive)\n */\nexport function getChainByName(name: string): ChainConfig | undefined {\n return SUPPORTED_CHAINS[name.toLowerCase()];\n}\n\n/**\n * Check if a chain is supported\n */\nexport function isChainSupported(chainIdOrName: number | string): boolean {\n if (typeof chainIdOrName === 'number') {\n return Object.values(SUPPORTED_CHAINS).some(chain => chain.chainId === chainIdOrName);\n }\n return chainIdOrName.toLowerCase() in SUPPORTED_CHAINS;\n}\n\n/**\n * Get list of enabled chains\n */\nexport function getEnabledChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(chain => chain.x402.enabled);\n}\n\n/**\n * Get list of chains by network type\n */\nexport function getChainsByNetworkType(networkType: NetworkType): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === networkType && chain.x402.enabled\n );\n}\n\n/**\n * Get all EVM chain IDs (for wallet_switchEthereumChain)\n */\nexport function getEVMChainIds(): number[] {\n return getChainsByNetworkType('evm').map(chain => chain.chainId);\n}\n\n/**\n * Get list of SVM chains (Solana, Fogo)\n */\nexport function getSVMChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'svm' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is SVM-based (Solana Virtual Machine)\n */\nexport function isSVMChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'svm';\n}\n\n/**\n * Get list of Sui chains\n */\nexport function getSuiChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'sui' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is Sui-based\n */\nexport function isSuiChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'sui';\n}\n\n/**\n * Get network type from chain name\n */\nexport function getNetworkType(chainName: string): NetworkType | undefined {\n const chain = getChainByName(chainName);\n return chain?.networkType;\n}\n\n/**\n * Format transaction URL for block explorer\n */\nexport function getExplorerTxUrl(chainName: string, txHash: string): string | null {\n const chain = getChainByName(chainName);\n if (!chain) return null;\n\n switch (chain.networkType) {\n case 'evm':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'svm':\n case 'solana': // @deprecated\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'stellar':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'near':\n return `${chain.explorerUrl}/txns/${txHash}`;\n case 'algorand':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'sui':\n return `${chain.explorerUrl}/tx/${txHash}`;\n case 'xrpl':\n return `${chain.explorerUrl}/transactions/${txHash}`;\n default:\n return null;\n }\n}\n\n/**\n * Format address URL for block explorer\n */\nexport function getExplorerAddressUrl(chainName: string, address: string): string | null {\n const chain = getChainByName(chainName);\n if (!chain) return null;\n\n switch (chain.networkType) {\n case 'evm':\n return `${chain.explorerUrl}/address/${address}`;\n case 'svm':\n case 'solana': // @deprecated\n return `${chain.explorerUrl}/account/${address}`;\n case 'stellar':\n return `${chain.explorerUrl}/account/${address}`;\n case 'near':\n return `${chain.explorerUrl}/address/${address}`;\n case 'algorand':\n return `${chain.explorerUrl}/account/${address}`;\n case 'sui':\n return `${chain.explorerUrl}/account/${address}`;\n case 'xrpl':\n return `${chain.explorerUrl}/accounts/${address}`;\n default:\n return null;\n }\n}\n\n/**\n * Get list of Algorand chains\n */\nexport function getAlgorandChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'algorand' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is Algorand-based\n */\nexport function isAlgorandChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'algorand';\n}\n\n/**\n * Get list of XRPL chains (XRP Ledger mainnet/testnet)\n */\nexport function getXRPLChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n chain => chain.networkType === 'xrpl' && chain.x402.enabled\n );\n}\n\n/**\n * Check if a chain is XRPL-based (XRP Ledger)\n */\nexport function isXRPLChain(chainName: string): boolean {\n const chain = getChainByName(chainName);\n return chain?.networkType === 'xrpl';\n}\n\n// ============================================================================\n// MULTI-TOKEN SUPPORT FUNCTIONS\n// ============================================================================\n\n/**\n * Get token configuration for a specific chain and token type\n * Falls back to USDC config if token not found (for backward compatibility)\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns Token configuration or undefined if chain not found\n */\nexport function getTokenConfig(\n chainName: string,\n tokenType: TokenType = 'usdc'\n): TokenConfig | undefined {\n const chain = getChainByName(chainName);\n if (!chain) return undefined;\n\n // Try to get from tokens map first (new multi-token support)\n if (chain.tokens && chain.tokens[tokenType]) {\n return chain.tokens[tokenType];\n }\n\n // Fall back to usdc config for backward compatibility\n if (tokenType === 'usdc') {\n return chain.usdc;\n }\n\n return undefined;\n}\n\n/**\n * Find which token of a chain a contract address belongs to.\n *\n * The signed payload carries the token *address*, but a server that accepts\n * several stablecoins on the same chain needs the symbol, the decimals and the\n * EIP-712 domain to rebuild the payment requirements. This resolves the address\n * back to the registry entry so that metadata can travel with the payment.\n *\n * @param chainName - Chain name (e.g., 'optimism')\n * @param address - Token contract address (case-insensitive on EVM)\n * @returns The token type and its config, or undefined if the address is not in the registry\n */\nexport function getTokenByAddress(\n chainName: string,\n address: string\n): { tokenType: TokenType; config: TokenConfig } | undefined {\n const chain = getChainByName(chainName);\n if (!chain || !address) return undefined;\n\n const wanted = address.startsWith('0x') ? address.toLowerCase() : address;\n const matches = (candidate: string): boolean =>\n (candidate.startsWith('0x') ? candidate.toLowerCase() : candidate) === wanted;\n\n if (chain.tokens) {\n for (const [tokenType, config] of Object.entries(chain.tokens)) {\n if (config && matches(config.address)) {\n return { tokenType: tokenType as TokenType, config };\n }\n }\n }\n\n if (chain.usdc && matches(chain.usdc.address)) {\n return { tokenType: 'usdc', config: chain.usdc };\n }\n\n return undefined;\n}\n\n/**\n * Get list of supported tokens for a chain\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @returns Array of supported token types, or empty array if chain not found\n */\nexport function getSupportedTokens(chainName: string): TokenType[] {\n const chain = getChainByName(chainName);\n if (!chain) return [];\n\n // If tokens map exists, return its keys\n if (chain.tokens) {\n return Object.keys(chain.tokens) as TokenType[];\n }\n\n // Default to just USDC for chains without explicit tokens map\n return ['usdc'];\n}\n\n/**\n * Check if a token is supported on a specific chain\n *\n * @param chainName - Chain name (e.g., 'ethereum', 'base')\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns true if token is supported on the chain\n */\nexport function isTokenSupported(chainName: string, tokenType: TokenType): boolean {\n const chain = getChainByName(chainName);\n if (!chain) return false;\n\n // Check tokens map\n if (chain.tokens && chain.tokens[tokenType]) {\n return true;\n }\n\n // USDC is always supported (backward compatibility)\n if (tokenType === 'usdc') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get all chains that support a specific token\n *\n * @param tokenType - Token type (e.g., 'usdc', 'eurc', 'pyusd')\n * @returns Array of chain configs that support the token\n */\nexport function getChainsByToken(tokenType: TokenType): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(chain => {\n if (!chain.x402.enabled) return false;\n if (chain.tokens && chain.tokens[tokenType]) return true;\n if (tokenType === 'usdc') return true; // USDC is universal\n return false;\n });\n}\n","/**\n * uvd-x402-sdk - UTF-8 safe base64\n *\n * `btoa()` only accepts code points 0-255. Any character above that throws\n * `InvalidCharacterError`, and the X-PAYMENT payload is not guaranteed to be\n * ASCII: the EIP-712 domain name of USDT on Optimism and Arbitrum is literally\n * `USD₮0` (U+20AE). A header carrying that name crashes a plain `btoa()`.\n *\n * So the JSON is UTF-8 encoded to bytes first, and only then base64'd. Decoding\n * reverses it. For ASCII-only input the output is byte-identical to\n * `btoa(json)`, which is why swapping this in cannot change any existing header.\n *\n * `TextEncoder`/`TextDecoder` are available in every browser the SDK targets and\n * in Node 11+; `btoa`/`atob` are used for the byte<->base64 step because they\n * exist in both environments without pulling in `Buffer`.\n */\n\n/**\n * Encode a string as base64, handling non-ASCII characters correctly.\n *\n * @param value - Any UTF-8 string\n * @returns Base64-encoded value\n */\nexport function encodeBase64Utf8(value: string): string {\n const bytes = new TextEncoder().encode(value);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode a base64 string produced by {@link encodeBase64Utf8}.\n *\n * @param encoded - Base64-encoded value\n * @returns The original UTF-8 string\n */\nexport function decodeBase64Utf8(encoded: string): string {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * JSON-serialize a value and encode it as UTF-8 safe base64.\n *\n * This is the encoder for every X-PAYMENT header the SDK emits.\n *\n * @param value - Value to serialize\n * @returns Base64-encoded JSON\n */\nexport function encodeBase64Json(value: unknown): string {\n return encodeBase64Utf8(JSON.stringify(value));\n}\n","/**\n * uvd-x402-sdk - x402 Protocol Utilities\n *\n * Utilities for working with x402 v1 and v2 protocols.\n * Handles version detection, payload encoding, and CAIP-2 conversions.\n */\n\nimport type {\n X402Header,\n X402HeaderV1,\n X402HeaderV2,\n X402PayloadData,\n X402PaymentOption,\n X402Version,\n ChainConfig,\n} from '../types';\nimport { CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN } from '../types';\nimport { getChainByName } from '../chains';\nimport { decodeBase64Utf8, encodeBase64Json } from './base64';\n\n/**\n * Detect x402 version from a response header or body\n *\n * @param data - The 402 response data (parsed JSON or header value)\n * @returns The detected version (1 or 2)\n */\nexport function detectX402Version(data: unknown): X402Version {\n if (typeof data === 'string') {\n // A `PAYMENT-REQUIRED` header value is base64 JSON, and the doc above\n // invites one. Returning 1 without decoding misread every v2 challenge as\n // v1 — silently, as a plausible value rather than an error, and the two\n // wire forms are structurally incompatible.\n //\n // This is not hypothetical: measured 2026-08-20, 36 of 36 live Bazaar\n // resources answering 402 carry the challenge in the header, and several\n // put a free content preview in the body, so the header is the only place\n // the version signal exists.\n const trimmed = data.trim();\n if (!trimmed) return 1;\n for (const decode of [\n () => JSON.parse(decodeBase64Utf8(trimmed)),\n () => JSON.parse(trimmed),\n ]) {\n try {\n const parsed = decode();\n if (typeof parsed === 'object' && parsed !== null) {\n return detectX402Version(parsed);\n }\n } catch {\n // not this encoding; try the next\n }\n }\n return 1; // undecodable: fall back to v1, as before\n }\n\n if (typeof data !== 'object' || data === null) {\n return 1; // Default to v1\n }\n\n const obj = data as Record<string, unknown>;\n\n // Check explicit version field\n if (obj.x402Version === 2) {\n return 2;\n }\n\n // Check for v2 indicators\n if (obj.accepts && Array.isArray(obj.accepts)) {\n return 2;\n }\n\n // `paymentRequirements` is the v1 spelling, so its presence points at v1 --\n // but only when there is no v2 signal, which the checks above already ruled\n // out. Recognised so the value is not treated as an unknown shape.\n if (Array.isArray(obj.paymentRequirements)) {\n return 1;\n }\n\n // Check if network is in CAIP-2 format\n if (typeof obj.network === 'string') {\n if (obj.network.includes(':')) {\n return 2;\n }\n }\n\n return 1;\n}\n\n/**\n * Convert chain name to CAIP-2 identifier\n *\n * @param chainName - Chain name (e.g., 'base', 'solana')\n * @returns CAIP-2 identifier (e.g., 'eip155:8453', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp')\n */\nexport function chainToCAIP2(chainName: string): string {\n const caip2 = CAIP2_IDENTIFIERS[chainName.toLowerCase()];\n if (caip2) {\n return caip2;\n }\n\n // Try to construct from chain config\n const chain = getChainByName(chainName);\n if (chain) {\n if (chain.networkType === 'evm') {\n return `eip155:${chain.chainId}`;\n }\n // For non-EVM, return the name as-is with network prefix\n return `${chain.networkType}:${chainName}`;\n }\n\n return chainName; // Return as-is if unknown\n}\n\n/**\n * Convert CAIP-2 identifier to chain name\n *\n * @param caip2 - CAIP-2 identifier\n * @returns Chain name or null if unknown\n */\nexport function caip2ToChain(caip2: string): string | null {\n // Check direct mapping\n if (CAIP2_TO_CHAIN[caip2]) {\n return CAIP2_TO_CHAIN[caip2];\n }\n\n // Try to extract from EIP-155 format\n const match = caip2.match(/^eip155:(\\d+)$/);\n if (match) {\n const chainId = parseInt(match[1], 10);\n // Find chain by ID\n for (const [name, _config] of Object.entries(CAIP2_IDENTIFIERS)) {\n const chain = getChainByName(name);\n if (chain?.chainId === chainId) {\n return name;\n }\n }\n }\n\n // Try to extract from network:name format\n const parts = caip2.split(':');\n if (parts.length === 2) {\n const networkName = parts[1];\n if (getChainByName(networkName)) {\n return networkName;\n }\n }\n\n return null;\n}\n\n/**\n * Parse network identifier from either v1 or v2 format\n *\n * @param network - Network identifier (v1 string or v2 CAIP-2)\n * @returns Normalized chain name\n */\nexport function parseNetworkIdentifier(network: string): string {\n // If it contains a colon, it's likely CAIP-2\n if (network.includes(':')) {\n return caip2ToChain(network) || network;\n }\n return network.toLowerCase();\n}\n\n/**\n * Encode x402 payload as base64 header value\n *\n * @param header - The x402 header object\n * @returns Base64-encoded string\n */\nexport function encodeX402Header(header: X402Header): string {\n return encodeBase64Json(header);\n}\n\n/**\n * Decode x402 header from base64 string\n *\n * @param encoded - Base64-encoded header value\n * @returns Parsed x402 header\n */\nexport function decodeX402Header(encoded: string): X402Header {\n const json = decodeBase64Utf8(encoded);\n return JSON.parse(json) as X402Header;\n}\n\n/**\n * Create x402 v1 header\n *\n * @param network - Chain name (e.g., 'base')\n * @param payload - Network-specific payload\n * @returns x402 v1 header object\n */\nexport function createX402V1Header(\n network: string,\n payload: X402PayloadData\n): X402HeaderV1 {\n return {\n x402Version: 1,\n scheme: 'exact',\n network,\n payload,\n };\n}\n\n/**\n * Create x402 v2 header\n *\n * @param network - CAIP-2 network identifier\n * @param payload - Network-specific payload\n * @param accepts - Optional array of payment options\n * @returns x402 v2 header object\n */\nexport function createX402V2Header(\n network: string,\n payload: X402PayloadData,\n accepts?: X402PaymentOption[]\n): X402HeaderV2 {\n const header: X402HeaderV2 = {\n x402Version: 2,\n scheme: 'exact',\n network: network.includes(':') ? network : chainToCAIP2(network),\n payload,\n };\n\n if (accepts && accepts.length > 0) {\n header.accepts = accepts;\n }\n\n return header;\n}\n\n/**\n * Create x402 header with automatic version selection\n *\n * @param chainConfig - Chain configuration\n * @param payload - Network-specific payload\n * @param version - Version to use (1, 2, or 'auto')\n * @returns x402 header object\n */\nexport function createX402Header(\n chainConfig: ChainConfig,\n payload: X402PayloadData,\n version: X402Version | 'auto' = 'auto'\n): X402Header {\n // Default to v1 for maximum compatibility\n const effectiveVersion = version === 'auto' ? 1 : version;\n\n if (effectiveVersion === 2) {\n return createX402V2Header(chainConfig.name, payload);\n }\n\n return createX402V1Header(chainConfig.name, payload);\n}\n\n/**\n * Generate payment options array for multi-network support\n *\n * @param chainConfigs - Array of chain configurations\n * @param amount - Amount in USDC (e.g., \"10.00\")\n * @param facilitator - Optional facilitator URL override\n * @returns Array of x402 v2 payment options\n */\nexport function generatePaymentOptions(\n chainConfigs: ChainConfig[],\n amount: string,\n facilitator?: string\n): X402PaymentOption[] {\n // Convert amount to atomic units for each chain\n return chainConfigs\n .filter(chain => chain.x402.enabled)\n .map(chain => {\n const atomicAmount = Math.floor(\n parseFloat(amount) * Math.pow(10, chain.usdc.decimals)\n ).toString();\n\n return {\n network: chainToCAIP2(chain.name),\n asset: chain.usdc.address,\n amount: atomicAmount,\n facilitator: facilitator || chain.x402.facilitatorUrl,\n };\n });\n}\n\n/**\n * Check if a network string is in CAIP-2 format\n *\n * @param network - Network identifier\n * @returns True if CAIP-2 format\n */\nexport function isCAIP2Format(network: string): boolean {\n return network.includes(':');\n}\n\n/**\n * Convert between x402 v1 and v2 header formats\n *\n * @param header - Source header\n * @param targetVersion - Target version\n * @returns Converted header\n */\nexport function convertX402Header(\n header: X402Header,\n targetVersion: X402Version\n): X402Header {\n if (header.x402Version === targetVersion) {\n return header;\n }\n\n if (targetVersion === 2) {\n // v1 -> v2\n return {\n x402Version: 2,\n scheme: 'exact',\n network: chainToCAIP2(header.network),\n payload: header.payload,\n };\n } else {\n // v2 -> v1\n const chainName = isCAIP2Format(header.network)\n ? caip2ToChain(header.network) || header.network\n : header.network;\n\n return {\n x402Version: 1,\n scheme: 'exact',\n network: chainName,\n payload: header.payload,\n };\n }\n}\n\n/**\n * Read a 402 payment challenge from wherever the seller put it.\n *\n * x402 allows BOTH transports and sellers pick freely:\n *\n * - base64 JSON in the `PAYMENT-REQUIRED` (or `X-PAYMENT-REQUIRED`) header\n * - JSON in the response body\n *\n * Measured against production on 2026-08-20: of 40 live Bazaar resources,\n * **36 of 36 that answered 402 carried the challenge in the header, and none in\n * the body**. Worse, sellers like Tenjin use the 402 body for a free preview of\n * the paid content — so the body is valid JSON that simply has no `accepts`, and\n * a body-only reader parses it happily and finds nothing.\n *\n * Reads the header first because that is where live sellers put it, and falls\n * back to the body so the sellers who use it keep working.\n *\n * Returns `null` when neither transport carries a challenge — a real \"no terms\n * here\", distinct from a challenge we failed to decode.\n */\nexport function paymentChallengeFrom(\n headers: { get(name: string): string | null } | Record<string, string>,\n body?: unknown,\n): Record<string, unknown> | null {\n const read = (name: string): string | null => {\n if (typeof (headers as { get?: unknown }).get === 'function') {\n return (headers as { get(n: string): string | null }).get(name);\n }\n const rec = headers as Record<string, string>;\n return rec[name] ?? rec[name.toLowerCase()] ?? rec[name.toUpperCase()] ?? null;\n };\n\n const raw = read('payment-required') ?? read('x-payment-required');\n if (raw) {\n const trimmed = raw.trim();\n for (const decode of [\n () => JSON.parse(decodeBase64Utf8(trimmed)),\n () => JSON.parse(trimmed),\n ]) {\n try {\n const parsed = decode();\n if (isChallenge(parsed)) return parsed as Record<string, unknown>;\n } catch {\n // not this encoding; try the next\n }\n }\n }\n\n const parsedBody = typeof body === 'string' ? tryJson(body) : body;\n return isChallenge(parsedBody) ? (parsedBody as Record<string, unknown>) : null;\n}\n\n/**\n * Whether a value actually looks like an x402 challenge.\n *\n * Deliberately stricter than \"is an object\": a 402 body carrying a free preview\n * is valid JSON with no payment terms in it, and treating that as a challenge is\n * how a body-only reader concludes it looked and found nothing wrong.\n */\nfunction isChallenge(v: unknown): boolean {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n // `paymentRequirements` is the v1 spelling of `accepts`. Missing it made a\n // seller using it look like \"no terms here\" — the exact false negative this\n // function exists to prevent. Found in the Python SDK by KarmaKadabra's\n // buyer, which matched both keys in production, 2026-08-20.\n return (\n Array.isArray(o.accepts) ||\n Array.isArray(o.paymentRequirements) ||\n typeof o.payTo === 'string'\n );\n}\n\nfunction tryJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return null;\n }\n}\n","/**\n * uvd-x402-sdk - Escrow Pre-Auth Builder (sign-on-assignment)\n *\n * Builds and signs the EIP-3009 `ReceiveWithAuthorization` that locks a\n * bounty in the x402r AuthCaptureEscrow, and packs it into the raw-JSON\n * `X-Payment-Auth` wrapper the Ultravioleta Facilitator's `/settle` expects.\n * Used by marketplaces built on the escrow rail (e.g. Execution Market's\n * universal escrow, ADR-002).\n *\n * >>> PROTOCOL CONSTRAINT <<<\n * The EIP-3009 nonce is `AuthCaptureEscrow.getHash(paymentInfo)` which\n * INCLUDES the receiver — the escrow signature can only be created AT\n * ASSIGNMENT, when the worker/payee is known. Never design flows that sign\n * an escrow auth before the receiver is chosen (\"stored pre-auth with late\n * receiver fill\" is on-chain unsound).\n *\n * Fail-loud policy: an incomplete network config, an unknown tier, a bounty\n * outside the on-chain deposit limit, or a `maxFeeBps` that cannot cover the\n * operator's static fee all throw instead of falling back — a silent\n * fallback would sign an EIP-3009 authorization with the WRONG EIP-712\n * domain (chainId + verifyingContract): a mismatched, wallet-draining auth.\n *\n * Wire format is pinned by golden vectors (`src/escrow-preauth.vectors.json`):\n * payer-zeroed raw-keccak nonce (`keccak(chainId, escrow,\n * keccak(PAYMENT_INFO_TYPEHASH, paymentInfo tuple with payer=0))`),\n * `ReceiveWithAuthorization` typed data, raw JSON (NOT base64) wrapper.\n * Byte-parity with the production references is enforced in\n * `src/escrow-preauth.test.ts`.\n *\n * @example Sign the escrow lock at assignment time\n * ```typescript\n * import { buildEscrowPreAuth, EnvKeyAdapter } from 'uvd-x402-sdk';\n *\n * // Server-published escrow config (e.g. GET /api/v1/h2a/payment-config\n * // on Execution Market — escrow_networks[network]).\n * const paymentAuth = await buildEscrowPreAuth(new EnvKeyAdapter(), {\n * networkConfig: config.escrow.networks.base,\n * payerWallet: '0xPublisher...',\n * workerWallet: '0xWorker...', // committed by the nonce\n * bountyAtomic: '100000', // $0.10 in 6-decimal USDC\n * reviewDeadlineSec: taskDeadlineEpoch,\n * });\n * // Send as the X-Payment-Auth header (raw JSON, NOT base64).\n * ```\n *\n * Reference implementations (kept in byte-parity via the shared vectors):\n * - Python: `em_plugin_sdk.escrow_signing.build_escrow_pre_auth`\n * (production reference, derived from `uvd_x402_sdk.advanced_escrow`)\n * - Browser (viem): Execution Market `dashboard/src/services/h2aSigning.ts`\n */\n\nimport { ethers } from 'ethers';\nimport { X402Error } from './types';\nimport {\n needsAccountWrap,\n replaySafeTypedData,\n resolveDelegation,\n wrapSignature,\n type DelegationResolver,\n} from './erc7702.js';\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst USDC_DECIMALS = 6;\n\n/** AuthCaptureEscrow deposit condition: $100 max per deposit. */\nexport const ESCROW_DEPOSIT_LIMIT_USD = 100;\n\n/**\n * StaticFeeCalculator: canonical 13% flat fee. The signed maxFeeBps MUST\n * cover it or the on-chain release reverts.\n */\nexport const OPERATOR_FEE_BPS = 1300;\n\n/** Fee-bound defaults for optional config keys only — never for the domain. */\nconst DEFAULT_MIN_FEE_BPS = 0;\nconst DEFAULT_MAX_FEE_BPS = 1800;\n\n/**\n * EIP-712 type for the escrow flow. The token collector pulls the funds, so\n * the scheme is ReceiveWithAuthorization (not TransferWithAuthorization).\n */\nconst RECEIVE_WITH_AUTHORIZATION_TYPES = {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n};\n\n/**\n * ABI type of the paymentInfo tuple — mirrors AdvancedEscrowClient /\n * em_plugin_sdk.escrow_signing (unnamed components, positional encoding).\n */\nconst PAYMENT_INFO_TUPLE =\n 'tuple(address,address,address,address,uint120,uint48,uint48,uint48,uint16,uint16,address,uint256)';\n\n/** Per-tier expiry windows in seconds, relative to now() at signing. */\nexport interface EscrowTierWindows {\n pre: number;\n auth: number;\n refund: number;\n}\n\n/** Canonical fallback — mirrors uvd_x402_sdk TIER_TIMINGS. */\nexport const ESCROW_TIER_WINDOWS: Record<string, EscrowTierWindows> = {\n micro: { pre: 3600, auth: 7200, refund: 86400 },\n standard: { pre: 7200, auth: 86400, refund: 604800 },\n};\n\n/**\n * Human review windows. Agents approve in seconds, so the short SDK tier\n * windows (micro auth = 2h) work for them. A HUMAN publisher reviews on\n * their own schedule — if authorizationExpiry passes before approval, the\n * on-chain release REVERTS (AfterAuthorizationExpiry). So release/refund\n * windows are extended to comfortably outlast the deadline + review buffer.\n */\nexport const REVIEW_WINDOW_SEC = 7 * 24 * 3600; // >=7 days to approve after the deadline\nexport const REFUND_WINDOW_SEC = 7 * 24 * 3600; // +7 days to refund after that\n\n/**\n * One network's escrow parameters, as published by the marketplace server\n * (e.g. Execution Market's `GET /api/v1/h2a/payment-config` →\n * `escrow_networks[network]`). Snake_case on purpose: pass the server's\n * JSON straight through so the SDK builds the paymentInfo EXACTLY like the\n * production reference.\n */\nexport interface EscrowNetworkConfig {\n chain_id: number;\n operator: string;\n escrow: string;\n token_collector: string;\n usdc: string;\n usdc_domain_name: string;\n usdc_domain_version: string;\n /** 32-byte hex PAYMENT_INFO_TYPEHASH (with or without 0x prefix). */\n payment_info_typehash: string;\n /** Server-published tier windows; falls back to ESCROW_TIER_WINDOWS. */\n tiers?: Record<string, EscrowTierWindows>;\n min_fee_bps?: number;\n max_fee_bps?: number;\n}\n\n/** paymentInfo exactly as serialized in the X-Payment-Auth wrapper. */\nexport interface EscrowPaymentInfo {\n operator: string;\n receiver: string;\n token: string;\n /** Atomic units, as string (uint120 on-chain). */\n maxAmount: string;\n preApprovalExpiry: number;\n authorizationExpiry: number;\n refundExpiry: number;\n minFeeBps: number;\n maxFeeBps: number;\n feeReceiver: string;\n /** 32-byte hex. */\n salt: string;\n}\n\nconst REQUIRED_NETWORK_KEYS: Array<keyof EscrowNetworkConfig> = [\n 'chain_id',\n 'operator',\n 'escrow',\n 'token_collector',\n 'usdc',\n 'usdc_domain_name',\n 'usdc_domain_version',\n 'payment_info_typehash',\n];\n\nfunction hex32(value: string): string {\n return value.startsWith('0x') ? value : `0x${value}`;\n}\n\n/** 32 random bytes as 0x-hex (WebCrypto when available, ethers otherwise). */\nfunction randomSalt(): string {\n const webCrypto = (globalThis as { crypto?: Crypto }).crypto;\n if (webCrypto?.getRandomValues) {\n const bytes = new Uint8Array(32);\n webCrypto.getRandomValues(bytes);\n return ethers.hexlify(bytes);\n }\n return ethers.hexlify(ethers.randomBytes(32));\n}\n\n/**\n * Compute the escrow EIP-3009 nonce = `AuthCaptureEscrow.getHash(paymentInfo)`.\n *\n * `keccak(chainId, escrow, keccak(PAYMENT_INFO_TYPEHASH, paymentInfo tuple\n * with payer=0))` — the payer slot is zeroed for the payer-agnostic hash;\n * the RECEIVER is part of the hash, which is why the signature commits to\n * the chosen worker. Port of `AdvancedEscrowClient._compute_nonce` /\n * `em_plugin_sdk.escrow_signing.compute_escrow_nonce`.\n *\n * @param chainId - EVM chain id.\n * @param escrowAddress - AuthCaptureEscrow contract on that chain.\n * @param paymentInfoTypehash - 32-byte hex typehash from the server config.\n * @param pi - paymentInfo exactly as serialized on the wire.\n * @returns 32-byte hex nonce (0x-prefixed, lowercase).\n */\nexport function computeEscrowNonce(\n chainId: number,\n escrowAddress: string,\n paymentInfoTypehash: string,\n pi: EscrowPaymentInfo\n): string {\n const coder = ethers.AbiCoder.defaultAbiCoder();\n\n const piTuple = [\n ethers.getAddress(pi.operator),\n ZERO_ADDRESS, // payer = 0 for the payer-agnostic hash\n ethers.getAddress(pi.receiver),\n ethers.getAddress(pi.token),\n BigInt(pi.maxAmount), // uint120\n pi.preApprovalExpiry, // uint48\n pi.authorizationExpiry, // uint48\n pi.refundExpiry, // uint48\n pi.minFeeBps, // uint16\n pi.maxFeeBps, // uint16\n ethers.getAddress(pi.feeReceiver),\n BigInt(hex32(pi.salt)), // uint256\n ];\n\n const piHash = ethers.keccak256(\n coder.encode(['bytes32', PAYMENT_INFO_TUPLE], [hex32(paymentInfoTypehash), piTuple])\n );\n return ethers.keccak256(\n coder.encode(\n ['uint256', 'address', 'bytes32'],\n [chainId, ethers.getAddress(escrowAddress), piHash]\n )\n );\n}\n\n/**\n * Minimal signer for {@link buildEscrowPreAuth}: EIP-712 typed-data signing\n * over the full typed-data JSON string (`domain`, `types`, `primaryType`,\n * `message`) — the same contract as `SigningWalletAdapter.signTypedData`,\n * so every adapter (EnvKeyAdapter, OWSWalletAdapter, custom) satisfies it\n * structurally. Browser wallets can wrap their own signTypedData in this\n * shape; the key never leaves the signer.\n */\nexport interface EscrowPreAuthSigner {\n signTypedData(typedData: string): Promise<{ signature: string }>;\n}\n\nexport interface EscrowPreAuthParams {\n /** Network escrow config as published by the marketplace server. */\n networkConfig: EscrowNetworkConfig;\n /**\n * Publisher wallet (payer). Not checked against the signer's address —\n * payer binding is enforced on-chain and by the backend, not here.\n */\n payerWallet: string;\n /** Chosen worker's wallet (escrow receiver — committed by the nonce). */\n workerWallet: string;\n /** Bounty in atomic units (6-decimal USDC). */\n bountyAtomic: string | bigint;\n /** Expiry tier; windows come from config when present. Default 'micro'. */\n tier?: string;\n /**\n * Task deadline (epoch seconds). The release/refund windows are extended\n * to outlast it + a review buffer so a human publisher can still approve\n * after the worker delivers. When omitted, falls back to now()-based\n * windows.\n */\n reviewDeadlineSec?: number;\n /**\n * On-chain deposit limit in USD (AuthCaptureEscrow deposit condition).\n * Default {@link ESCROW_DEPOSIT_LIMIT_USD}; override only when the server\n * publishes a different limit.\n */\n depositLimitUsd?: number;\n /**\n * How to find out whether `payerWallet` is EIP-7702-delegated, and to what.\n *\n * Optional, and its absence is honest rather than convenient: with no resolver\n * the verdict is UNKNOWN and this function signs the ordinary way, exactly as\n * it did before. Pass one — {@link rpcDelegationResolver} or your own — as soon\n * as your payers can be delegated accounts, because a delegated payer signing\n * the wrong dialect produces an authorization that **cannot settle on-chain**\n * and only fails at lock time.\n *\n * When a resolver IS supplied and it reaches no verdict, this throws instead of\n * guessing: an unreadable chain is not a \"not delegated\" answer.\n */\n delegationResolver?: DelegationResolver;\n}\n\n/**\n * Build + sign the escrow lock authorization AT ASSIGNMENT time and return\n * the raw JSON string for the `X-Payment-Auth` header (NOT base64 — the\n * backend relays it verbatim to the Facilitator `/settle`). Mirror of\n * `AdvancedEscrowClient.authorize()`'s /settle payload and of\n * `em_plugin_sdk.escrow_signing.build_escrow_pre_auth`.\n *\n * @throws {X402Error} `INVALID_CONFIG` on an incomplete network config,\n * unknown tier, or a `maxFeeBps` that cannot cover the operator's static\n * fee; `INVALID_AMOUNT` on a bounty outside (0, deposit limit].\n */\nexport async function buildEscrowPreAuth(\n wallet: EscrowPreAuthSigner,\n params: EscrowPreAuthParams\n): Promise<string> {\n const cfg = params.networkConfig;\n\n const missing = REQUIRED_NETWORK_KEYS.filter((key) => !cfg[key]);\n if (missing.length > 0) {\n throw new X402Error(\n `Incomplete escrow network config (missing ${missing.join(', ')}) — ` +\n 'refusing to sign an EIP-3009 authorization with a mismatched domain.',\n 'INVALID_CONFIG'\n );\n }\n\n const maxAmount = BigInt(params.bountyAtomic);\n if (maxAmount <= 0n) {\n throw new X402Error(\n `Bounty must be positive, got ${maxAmount} atomic units`,\n 'INVALID_AMOUNT'\n );\n }\n const depositLimitUsd = params.depositLimitUsd ?? ESCROW_DEPOSIT_LIMIT_USD;\n const depositLimitAtomic = BigInt(Math.round(depositLimitUsd * 10 ** USDC_DECIMALS));\n if (maxAmount > depositLimitAtomic) {\n throw new X402Error(\n `Bounty ${maxAmount} atomic units exceeds the on-chain escrow deposit ` +\n `limit ($${depositLimitUsd}).`,\n 'INVALID_AMOUNT'\n );\n }\n\n const minFeeBps = cfg.min_fee_bps ?? DEFAULT_MIN_FEE_BPS;\n const maxFeeBps = cfg.max_fee_bps ?? DEFAULT_MAX_FEE_BPS;\n if (maxFeeBps < OPERATOR_FEE_BPS) {\n throw new X402Error(\n `maxFeeBps=${maxFeeBps} cannot cover the operator's ${OPERATOR_FEE_BPS} ` +\n 'bps static fee — the on-chain release would revert.',\n 'INVALID_CONFIG'\n );\n }\n\n const tierKey = params.tier ?? 'micro';\n const windows = cfg.tiers?.[tierKey] ?? ESCROW_TIER_WINDOWS[tierKey];\n if (!windows) {\n const known = [...new Set([...Object.keys(cfg.tiers ?? {}), ...Object.keys(ESCROW_TIER_WINDOWS)])].sort();\n throw new X402Error(\n `Unknown escrow tier '${tierKey}' — known tiers: ${known.join(', ')}`,\n 'INVALID_CONFIG'\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n\n // The release window must outlast the human review. Base it on the task\n // deadline (the worker delivers near it) plus a generous buffer, and never\n // shorter than the SDK tier window. preApprovalExpiry stays short — the\n // lock executes immediately at assignment.\n const reviewBase = Math.max(now, params.reviewDeadlineSec ?? now);\n const authExpiry = Math.max(now + windows.auth, reviewBase + REVIEW_WINDOW_SEC);\n const refundExpiry = Math.max(now + windows.refund, authExpiry + REFUND_WINDOW_SEC);\n\n const paymentInfo: EscrowPaymentInfo = {\n operator: ethers.getAddress(cfg.operator),\n receiver: ethers.getAddress(params.workerWallet),\n token: ethers.getAddress(cfg.usdc),\n maxAmount: maxAmount.toString(),\n preApprovalExpiry: now + windows.pre,\n authorizationExpiry: authExpiry,\n refundExpiry: refundExpiry,\n minFeeBps: minFeeBps,\n maxFeeBps: maxFeeBps,\n feeReceiver: ethers.getAddress(cfg.operator),\n salt: randomSalt(),\n };\n\n const nonce = computeEscrowNonce(\n cfg.chain_id,\n cfg.escrow,\n cfg.payment_info_typehash,\n paymentInfo\n );\n\n const payer = ethers.getAddress(params.payerWallet);\n const tokenCollector = ethers.getAddress(cfg.token_collector);\n\n // String-valued message fields: the typed data travels as JSON to the\n // adapter (SigningWalletAdapter.signTypedData contract), and ethers\n // accepts decimal strings for uint256 / 0x-hex for bytes32.\n const typedData = {\n domain: {\n name: cfg.usdc_domain_name,\n version: cfg.usdc_domain_version,\n chainId: cfg.chain_id,\n verifyingContract: ethers.getAddress(cfg.usdc),\n },\n types: RECEIVE_WITH_AUTHORIZATION_TYPES,\n primaryType: 'ReceiveWithAuthorization',\n message: {\n from: payer,\n to: tokenCollector,\n value: maxAmount.toString(),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce: nonce,\n },\n };\n\n // ── EIP-7702: a DELEGATED payer cannot settle a raw ECDSA authorization ──\n //\n // Once the payer's EOA carries code, USDC validates via ERC-1271 only and raw\n // ECDSA reverts (0x151d90fe) — the lock fails on-chain. Measured in production\n // 2026-07-31: 14 of 14 delegated payers failed; the one plain EOA locked fine.\n //\n // THREE STATES, and the third is the one that matters: an UNKNOWN delegation is\n // NOT \"not delegated\". Collapsing it to false is exactly how the original bug\n // survived eight days — signing raw for an account that can never settle it,\n // silently.\n //\n // AND THE DIALECT DEPENDS ON THE TARGET. \"Delegated\" is not one signature\n // scheme: the account-envelope wrap is Alchemy-SMA-specific. A delegate that\n // validates plain ECDSA through ERC-1271 — Execution Market's FeedbackDelegate,\n // which every account that has rated through the facilitator's rail is pointed\n // at — needs the ORDINARY signature. Wrapping it is as unsettleable as signing\n // raw for an SMA.\n const { delegated, target } = await resolveDelegation(\n payer,\n `eip155:${cfg.chain_id}`,\n params.delegationResolver\n );\n if (delegated === null && params.delegationResolver) {\n throw new X402Error(\n `Could not determine whether ${payer} is EIP-7702-delegated on chain ` +\n `${cfg.chain_id} (the resolver gave no verdict) — refusing to sign an ` +\n 'escrow authorization blindly: the wrong dialect is unsettleable ' +\n 'on-chain and the failure only shows up at lock time. Retry when the ' +\n 'chain is readable.',\n 'INVALID_CONFIG'\n );\n }\n\n let signature: string;\n if (delegated && (needsAccountWrap(target) || target === null)) {\n // SMA-wrap: the known Alchemy account, OR a legacy boolean-only resolver that\n // could not name the target — for which we keep the conservative behaviour\n // rather than silently changing what such callers got. A resolver that\n // returns the target lands any non-SMA delegate in the plain branch below.\n const innerDigest = ethers.TypedDataEncoder.hash(\n typedData.domain,\n typedData.types,\n typedData.message\n );\n const replaySafe = replaySafeTypedData(innerDigest, cfg.chain_id, payer);\n const wrapped = await wallet.signTypedData(\n JSON.stringify({ ...replaySafe, primaryType: 'ReplaySafeHash' })\n );\n if (!wrapped?.signature) {\n throw new X402Error(\n 'The wallet returned no signature for the replay-safe wrap — refusing ' +\n 'to build an unsettleable authorization.',\n 'INVALID_CONFIG'\n );\n }\n signature = wrapSignature(wrapped.signature);\n } else {\n // Plain EOA, unknown-with-no-resolver, or a delegate that takes ordinary\n // ECDSA (FeedbackDelegate and the standard 1271 smart-EOA pattern).\n signature = (await wallet.signTypedData(JSON.stringify(typedData))).signature;\n }\n\n // Raw JSON (NOT base64): the backend relays this verbatim to the\n // Facilitator /settle after validating payer/amount/receiver.\n return JSON.stringify({\n x402Version: 2,\n scheme: 'escrow',\n payload: {\n authorization: {\n from: payer,\n to: tokenCollector,\n value: maxAmount.toString(),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce: nonce,\n },\n signature: signature,\n paymentInfo: paymentInfo,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${cfg.chain_id}`,\n },\n });\n}\n","/**\n * uvd-x402-sdk - Backend Utilities\n *\n * Server-side utilities for building x402 payment APIs.\n * These utilities help backend developers:\n * - Build verify/settle requests for the facilitator\n * - Parse X-PAYMENT headers from incoming requests\n * - Configure CORS for x402 payment flows\n * - Create atomic payment handlers\n * - Discover and register resources via Bazaar Discovery API\n * - Manage escrow payments with refund and dispute resolution\n *\n * @example Basic payment flow\n * ```ts\n * import {\n * parsePaymentHeader,\n * FacilitatorClient,\n * X402_CORS_HEADERS,\n * } from 'uvd-x402-sdk/backend';\n *\n * // Parse payment from request header\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n *\n * // Verify with facilitator\n * const client = new FacilitatorClient();\n * const verifyResult = await client.verify(payment, paymentRequirements);\n *\n * // If valid, provide service then settle\n * const settleResult = await client.settle(payment, paymentRequirements);\n * ```\n *\n * @example Escrow payment with refund support\n * ```ts\n * import { EscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const escrow = new EscrowClient();\n *\n * // Hold payment in escrow\n * const escrowPayment = await escrow.createEscrow({\n * paymentHeader: req.headers['x-payment'],\n * requirements: paymentRequirements,\n * escrowDuration: 86400, // 24 hours\n * });\n *\n * // After service delivered, release to recipient\n * await escrow.release(escrowPayment.id);\n *\n * // Or if service failed, request refund\n * await escrow.requestRefund({\n * escrowId: escrowPayment.id,\n * reason: 'Service not delivered',\n * });\n * ```\n *\n * @example Resource discovery\n * ```ts\n * import { BazaarClient } from 'uvd-x402-sdk/backend';\n *\n * const bazaar = new BazaarClient();\n * const resources = await bazaar.discover({\n * category: 'ai',\n * network: 'base',\n * maxPrice: '0.10',\n * });\n * ```\n */\n\nimport type {\n X402Header,\n X402PayloadData,\n X402Version,\n} from '../types';\nimport { decodeX402Header, chainToCAIP2, parseNetworkIdentifier } from '../utils';\nimport { REVIEW_WINDOW_SEC, REFUND_WINDOW_SEC } from '../escrow-preauth';\nimport { getChainByName } from '../chains';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Payment requirements sent to the facilitator\n */\nexport interface PaymentRequirements {\n /** Payment scheme */\n scheme: 'exact' | 'escrow' | 'commerce';\n /** Network name (v1) or CAIP-2 identifier (v2) */\n network: string;\n /** Maximum amount required in atomic units (e.g., \"1000000\" for 1 USDC) */\n maxAmountRequired: string;\n /** Resource URL being paid for */\n resource: string;\n /** Description of what's being paid for */\n description: string;\n /** MIME type of the resource */\n mimeType: string;\n /** Recipient address for payment */\n payTo: string;\n /** Maximum timeout in seconds */\n maxTimeoutSeconds: number;\n /** Token contract address */\n asset: string;\n /** Optional output schema for the resource */\n outputSchema?: unknown;\n /** Optional extra data */\n extra?: unknown;\n}\n\n/**\n * Verify request body for the facilitator /verify endpoint\n */\nexport interface VerifyRequest {\n x402Version: X402Version;\n paymentPayload: X402Header;\n paymentRequirements: PaymentRequirements;\n}\n\n/**\n * Settle request body for the facilitator /settle endpoint\n */\nexport interface SettleRequest {\n x402Version: X402Version;\n paymentPayload: X402Header;\n paymentRequirements: PaymentRequirements;\n}\n\n/**\n * Verify response from the facilitator\n */\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n network?: string;\n}\n\n/**\n * Settle response from the facilitator\n */\nexport interface SettleResponse {\n success: boolean;\n transactionHash?: string;\n network?: string;\n /** Transport-level failure (unreachable facilitator, non-2xx, timeout). */\n error?: string;\n /**\n * The facilitator's own reason when it settled nothing — e.g. a transfer that\n * mined and reverted. Distinct from `error` above, which is this client\n * failing to ask; this one is the facilitator answering \"no\".\n */\n errorReason?: string;\n /** The address the facilitator confirmed as the payer. */\n payer?: string;\n /**\n * Settlement proof, present when the ERC-8004 extension asked for it.\n *\n * Typed here rather than only on {@link SettleResponseWithProof} because\n * `settle()` returns it whenever the facilitator sends it, and it is what\n * DX402's `anchorEvidence` needs to reach `verified: true`.\n */\n proofOfPayment?: ProofOfPayment;\n}\n\n/**\n * Options for building payment requirements\n */\nexport interface PaymentRequirementsOptions {\n /** Amount in human-readable format (e.g., \"1.00\") */\n amount: string;\n /** Recipient address */\n recipient: string;\n /** Resource URL being protected */\n resource: string;\n /** Chain name (e.g., \"base\") */\n chainName?: string;\n /** Description of the resource */\n description?: string;\n /** MIME type of the resource */\n mimeType?: string;\n /** Timeout in seconds (default: 300) */\n timeoutSeconds?: number;\n /** x402 version to use */\n x402Version?: X402Version;\n}\n\n/**\n * x402 payment option advertised in a 402 response.\n *\n * The SDK keeps the response shape richer than the minimal protocol fields so\n * servers can preserve settlement-critical metadata such as payTo and extra.\n */\nexport interface PaymentAcceptance {\n network: string;\n asset: string;\n amount: string;\n /**\n * Payment scheme. REQUIRED by the facilitator's v2 `PaymentRequirementsV2`.\n *\n * Optional here only so existing callers keep compiling — when it is absent,\n * `buildRequirementFromAcceptance` defaults it to `'exact'`. Do not treat its\n * optionality as \"the facilitator does not need it\": an accepts[] entry that\n * reaches a v2 client without a scheme is unpayable.\n */\n scheme?: string;\n payTo?: string;\n facilitator?: string;\n resource?: string;\n description?: string;\n mimeType?: string;\n maxTimeoutSeconds?: number;\n outputSchema?: unknown;\n extra?: unknown;\n}\n\n/**\n * Verified payment context attached by server middleware.\n */\nexport interface VerifiedPaymentState {\n payment: X402Header;\n requirements: PaymentRequirements;\n verifyResult: VerifyResponse;\n settle: () => Promise<SettleResponse>;\n}\n\n/**\n * Shared server middleware options.\n */\nexport interface PaymentMiddlewareOptions extends FacilitatorClientOptions {\n /** Alias for baseUrl to keep middleware options ergonomic */\n facilitatorUrl?: string;\n /**\n * Settlement behavior after verification.\n * - manual: verify only; caller settles explicitly\n * - before-handler: settle immediately before calling next()\n */\n settlementStrategy?: 'manual' | 'before-handler';\n}\n\n/**\n * Custom resolver for selecting the correct payment requirement when multiple\n * accepts are advertised.\n */\nexport type PaymentRequirementResolver = (\n payment: X402Header,\n requirements: PaymentRequirements[]\n) => PaymentRequirements | null | Promise<PaymentRequirements | null>;\n\n// ============================================================================\n// HEADER PARSING\n// ============================================================================\n\n/**\n * Parse X-PAYMENT or PAYMENT-SIGNATURE header value\n *\n * @param headerValue - Base64-encoded header value (or undefined/null)\n * @returns Parsed x402 header object, or null if invalid\n *\n * @example\n * ```ts\n * // Express.js\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n * if (!payment) {\n * return res.status(400).json({ error: 'Invalid payment header' });\n * }\n * ```\n */\nexport function parsePaymentHeader(\n headerValue: string | undefined | null\n): X402Header | null {\n if (!headerValue) {\n return null;\n }\n\n try {\n return decodeX402Header(headerValue);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract payment header from request headers object\n *\n * Checks both X-PAYMENT and PAYMENT-SIGNATURE headers.\n *\n * @param headers - Request headers object (case-insensitive)\n * @returns Parsed x402 header object, or null if not found/invalid\n *\n * @example\n * ```ts\n * const payment = extractPaymentFromHeaders(req.headers);\n * ```\n */\nexport function extractPaymentFromHeaders(\n headers: Record<string, string | string[] | undefined>\n): X402Header | null {\n // Normalize header keys to lowercase\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n normalizedHeaders[key.toLowerCase()] = value;\n } else if (Array.isArray(value) && value.length > 0) {\n normalizedHeaders[key.toLowerCase()] = value[0];\n }\n }\n\n // Try X-PAYMENT first, then PAYMENT-SIGNATURE\n const headerValue =\n normalizedHeaders['x-payment'] ||\n normalizedHeaders['payment-signature'];\n\n return parsePaymentHeader(headerValue);\n}\n\n// ============================================================================\n// REQUEST BUILDERS\n// ============================================================================\n\n/**\n * Build payment requirements for the facilitator\n *\n * @param options - Payment requirements options\n * @returns PaymentRequirements object ready for verify/settle\n *\n * @example\n * ```ts\n * const requirements = buildPaymentRequirements({\n * amount: '1.00',\n * recipient: '0x1234...',\n * resource: 'https://api.example.com/premium-data',\n * chainName: 'base',\n * });\n * ```\n */\nexport function buildPaymentRequirements(\n options: PaymentRequirementsOptions\n): PaymentRequirements {\n const {\n amount,\n recipient,\n resource,\n chainName = 'base',\n description = 'Payment for resource access',\n mimeType = 'application/json',\n timeoutSeconds = 300,\n x402Version = 1,\n } = options;\n\n const chain = getChainByName(chainName);\n if (!chain) {\n throw new Error(`Unsupported chain: ${chainName}`);\n }\n\n // Convert amount to atomic units\n const atomicAmount = Math.floor(\n parseFloat(amount) * Math.pow(10, chain.usdc.decimals)\n ).toString();\n\n // Use CAIP-2 for v2, chain name for v1\n const network = x402Version === 2 ? chainToCAIP2(chainName) : chainName;\n\n return {\n scheme: 'exact',\n network,\n maxAmountRequired: atomicAmount,\n resource,\n description,\n mimeType,\n payTo: recipient,\n maxTimeoutSeconds: timeoutSeconds,\n asset: chain.usdc.address,\n };\n}\n\n/**\n * Build a verify request for the facilitator /verify endpoint\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns VerifyRequest body ready for fetch/axios\n *\n * @example\n * ```ts\n * const payment = parsePaymentHeader(req.headers['x-payment']);\n * const verifyBody = buildVerifyRequest(payment, requirements);\n *\n * const response = await fetch('https://facilitator.uvd.xyz/verify', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify(verifyBody),\n * });\n * ```\n */\nexport function buildVerifyRequest(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n): VerifyRequest {\n return {\n x402Version: paymentHeader.x402Version,\n paymentPayload: paymentHeader,\n paymentRequirements: requirements,\n };\n}\n\n/**\n * Build a settle request for the facilitator /settle endpoint\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns SettleRequest body ready for fetch/axios\n */\n/**\n * Describes the protected resource, as x402 v2 expects it.\n *\n * Note this is an OBJECT in v2. Sending a bare URL string here is the single\n * most common v2 mistake and it fails as an unhelpful \"no variant matched\"\n * deserialization error at the facilitator, naming no field.\n */\nexport interface ResourceInfoV2 {\n url: string;\n description: string;\n mimeType: string;\n}\n\n/**\n * Payment requirements in x402 v2 form.\n *\n * Differences from v1 that actually bite:\n * - `network` is CAIP-2 (`eip155:8453`), NOT a plain name (`base`). Mixing a v1\n * name into a v2 request fails deserialization, and vice versa.\n * - `maxAmountRequired` is renamed to `amount`.\n * - `resource` / `description` / `mimeType` moved out to {@link ResourceInfoV2}.\n */\nexport interface PaymentRequirementsV2 {\n scheme: string;\n /** CAIP-2 chain id, e.g. `eip155:8453`. */\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds: number;\n extra?: unknown;\n}\n\n/** The v2 payment payload — note it carries no top-level scheme/network. */\nexport interface PaymentPayloadV2 {\n x402Version: 2;\n resource: ResourceInfoV2;\n accepted: PaymentRequirementsV2;\n payload: X402PayloadData;\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Verify request body in x402 v2 form.\n *\n * There is deliberately NO `paymentRequirements` key: that is the v1 envelope.\n * v2 carries `resource` and `accepted` at the top level instead.\n */\nexport interface VerifyRequestV2 {\n x402Version: 2;\n paymentPayload: PaymentPayloadV2;\n resource: ResourceInfoV2;\n accepted: PaymentRequirementsV2;\n}\n\n/** Settle request body in x402 v2 form. Same shape as {@link VerifyRequestV2}. */\nexport type SettleRequestV2 = VerifyRequestV2;\n\nfunction buildV2Envelope(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): VerifyRequestV2 {\n return {\n x402Version: 2,\n // The facilitator reads the payload from here; `resource` and `accepted` are\n // repeated at the top level because the v2 envelope declares both.\n paymentPayload: { x402Version: 2, resource, accepted, payload },\n resource,\n accepted,\n };\n}\n\n/**\n * Build a verify request for the facilitator `/verify` endpoint, in **v2** form.\n *\n * Use this whenever your 402 advertises CAIP-2 networks. {@link buildVerifyRequest}\n * emits the v1 envelope `{x402Version, paymentPayload, paymentRequirements}` and\n * cannot express v2 — putting a v2 payload inside it matches no variant at the\n * facilitator and fails with an error that names no field.\n *\n * @example\n * ```ts\n * const body = buildVerifyRequestV2(\n * payment.payload,\n * { url: 'https://api.example.com/thing', description: 'Thing', mimeType: 'application/json' },\n * { scheme: 'exact', network: 'eip155:8453', asset: '0x8335...', amount: '100000',\n * payTo: '0xabc...', maxTimeoutSeconds: 300 }\n * );\n * ```\n */\nexport function buildVerifyRequestV2(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): VerifyRequestV2 {\n return buildV2Envelope(payload, resource, accepted);\n}\n\n/**\n * Build a settle request for the facilitator `/settle` endpoint, in **v2** form.\n *\n * See {@link buildVerifyRequestV2} — the envelope is identical.\n */\nexport function buildSettleRequestV2(\n payload: X402PayloadData,\n resource: ResourceInfoV2,\n accepted: PaymentRequirementsV2\n): SettleRequestV2 {\n return buildV2Envelope(payload, resource, accepted);\n}\n\nexport function buildSettleRequest(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n): SettleRequest {\n return {\n x402Version: paymentHeader.x402Version,\n paymentPayload: paymentHeader,\n paymentRequirements: requirements,\n };\n}\n\n// ============================================================================\n// CORS CONFIGURATION\n// ============================================================================\n\n/**\n * Recommended CORS headers for x402 payment APIs\n *\n * These headers allow browsers to send payment headers in cross-origin requests.\n */\nexport const X402_CORS_HEADERS = {\n 'Access-Control-Allow-Headers':\n 'Content-Type, X-PAYMENT, PAYMENT-SIGNATURE, Authorization',\n 'Access-Control-Expose-Headers':\n 'X-PAYMENT-RESPONSE, PAYMENT-RESPONSE, PAYMENT-REQUIRED',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n} as const;\n\n/**\n * All x402 custom header names that should be allowed in CORS\n */\nexport const X402_HEADER_NAMES = [\n 'X-PAYMENT',\n 'PAYMENT-SIGNATURE',\n 'X-PAYMENT-RESPONSE',\n 'PAYMENT-RESPONSE',\n 'PAYMENT-REQUIRED',\n] as const;\n\n/**\n * Get CORS headers with custom origin\n *\n * @param origin - Allowed origin (use '*' for any, or specific domain)\n * @returns Complete CORS headers object\n *\n * @example\n * ```ts\n * // Express.js middleware\n * app.use((req, res, next) => {\n * const corsHeaders = getCorsHeaders('https://myapp.com');\n * Object.entries(corsHeaders).forEach(([key, value]) => {\n * res.setHeader(key, value);\n * });\n * if (req.method === 'OPTIONS') {\n * return res.status(204).end();\n * }\n * next();\n * });\n * ```\n */\nexport function getCorsHeaders(origin: string = '*'): Record<string, string> {\n return {\n 'Access-Control-Allow-Origin': origin,\n ...X402_CORS_HEADERS,\n };\n}\n\n// ============================================================================\n// FACILITATOR CLIENT\n// ============================================================================\n\n/**\n * Options for the FacilitatorClient\n */\nexport interface FacilitatorClientOptions {\n /** Base URL of the facilitator (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /**\n * Request timeout in milliseconds (default: auto per network).\n * When not set, the client uses per-network defaults from ESCROW_TIMEOUT_MS\n * (960s for Ethereum L1, 90s for L2s, 30s for others).\n * Set explicitly to override per-network auto-detection.\n */\n timeout?: number;\n}\n\n/**\n * Client for interacting with the x402 facilitator API\n *\n * @example\n * ```ts\n * const client = new FacilitatorClient();\n *\n * // Verify a payment\n * const verifyResult = await client.verify(paymentHeader, requirements);\n * if (!verifyResult.isValid) {\n * return res.status(402).json({ error: verifyResult.invalidReason });\n * }\n *\n * // Provide the service, then settle\n * const settleResult = await client.settle(paymentHeader, requirements);\n * if (!settleResult.success) {\n * // Handle settlement failure (maybe refund or retry)\n * }\n * ```\n */\nexport class FacilitatorClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly explicitTimeout: boolean;\n\n constructor(options: FacilitatorClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://facilitator.ultravioletadao.xyz';\n this.explicitTimeout = options.timeout !== undefined;\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Get timeout for a specific network, using per-chain defaults when no explicit timeout was set.\n */\n private getTimeout(network?: string): number {\n if (this.explicitTimeout) return this.timeout;\n if (!network) return this.timeout;\n // Extract chainId from CAIP-2 format (eip155:1) or legacy names\n const match = network.match(/^eip155:(\\d+)$/);\n if (match) {\n const chainId = parseInt(match[1], 10);\n return ESCROW_TIMEOUT_MS[chainId] || this.timeout;\n }\n // Legacy network name mapping for Ethereum\n if (network === 'ethereum' || network === 'ethereum-mainnet') return ESCROW_TIMEOUT_MS[1];\n return this.timeout;\n }\n\n /**\n * Verify a payment with the facilitator\n *\n * Call this before providing the paid resource to validate the payment.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Verification result\n */\n async verify(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<VerifyResponse> {\n const body = buildVerifyRequest(paymentHeader, requirements);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/verify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n isValid: false,\n invalidReason: `Facilitator error: ${response.status} - ${errorText}`,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n isValid: false,\n invalidReason: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Settle a payment with the facilitator\n *\n * Call this after providing the paid resource to execute the on-chain transfer.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Settlement result with transaction hash\n */\n async settle(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<SettleResponse> {\n const body = buildSettleRequest(paymentHeader, requirements);\n const settleTimeout = this.getTimeout(requirements.network);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), settleTimeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n };\n }\n\n const result = await response.json();\n // Read all three spellings. The facilitator's canonical name for this\n // field is `transaction`, and this client used to read only the two\n // camel/snake variants — so it silently returned `undefined` for the\n // most important field a settle produces. A consumer failed closed on\n // that and revoked access to a payment that had already settled\n // on-chain: the money moved, the receipt was unreadable.\n //\n // The server now emits all three, but this fallback stays: it makes the\n // client work against facilitators that have not deployed that yet, and\n // against any that only ever emitted the canonical name.\n const transactionHash =\n result.transaction ?? result.transactionHash ?? result.transaction_hash;\n if (result.success && !transactionHash) {\n // Never let a missing hash pass as a normal success. A caller that\n // gates access on the receipt needs to know the receipt is absent,\n // not infer it from an undefined field.\n console.warn(\n '[x402] settle reported success but carried no transaction hash under ' +\n 'transaction/transactionHash/transaction_hash — treat delivery as unconfirmed'\n );\n }\n return {\n // Read the facilitator's verdict instead of asserting one.\n //\n // This was the literal `true`, so a settle was reported successful\n // whenever the HTTP call was — and \"the request arrived\" is not \"the\n // money moved\". A payment that MINES AND THEN REVERTS is answered with\n // 200 and `success: false` (x402-rs src/chain/evm.rs:1343, serialised\n // through StatusCode::OK), which is precisely the case a caller most\n // needs to hear about. Every consumer doing `result.success === true`\n // was reading a constant, so a reverted payment was booked as settled\n // and no reconciliation path could ever fire.\n //\n // Absent `success` is treated as NOT successful: a facilitator that\n // does not say it worked has not said it worked.\n success: result.success === true,\n transactionHash,\n network: result.network,\n // Why it failed, when it did. Without this the caller gets `success:\n // false` and no way to tell a reverted transfer from a rejected\n // authorization except by parsing prose.\n errorReason: result.errorReason ?? result.error_reason,\n // The settlement proof, when the facilitator attached one (it does for\n // the ERC-8004 extension). Dropping it here made `verified: true`\n // unreachable for DX402 anchoring through this client: `anchorEvidence`\n // documents proofOfPayment as the only thing that gets there, the\n // facilitator returns it, and this method threw it away — so a seller\n // using the SDK end to end could only ever produce provisional anchors.\n proofOfPayment: result.proofOfPayment ?? result.proof_of_payment,\n payer: result.payer,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Verify and settle atomically\n *\n * Convenience method that verifies first, then settles if valid.\n * Use this for simple payment flows where you don't need custom logic between verify and settle.\n *\n * @param paymentHeader - Parsed x402 payment header\n * @param requirements - Payment requirements\n * @returns Combined result with verify and settle status\n */\n async verifyAndSettle(\n paymentHeader: X402Header,\n requirements: PaymentRequirements\n ): Promise<{\n verified: boolean;\n settled: boolean;\n transactionHash?: string;\n error?: string;\n }> {\n // Verify first\n const verifyResult = await this.verify(paymentHeader, requirements);\n if (!verifyResult.isValid) {\n return {\n verified: false,\n settled: false,\n error: verifyResult.invalidReason,\n };\n }\n\n // Settle\n const settleResult = await this.settle(paymentHeader, requirements);\n return {\n verified: true,\n settled: settleResult.success,\n transactionHash: settleResult.transactionHash,\n error: settleResult.error,\n };\n }\n\n /**\n * Check if the facilitator is healthy\n *\n * @returns True if the facilitator is responding\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the facilitator version info\n *\n * @returns Version info (e.g., { version: \"1.37.0\" })\n */\n async getVersion(): Promise<{ version: string; [key: string]: unknown }> {\n const response = await fetch(`${this.baseUrl}/version`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /version failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Get the facilitator's supported networks and payment schemes\n *\n * @returns Supported networks/schemes with 'kinds' array\n *\n * @example\n * ```ts\n * const supported = await client.getSupported();\n * for (const kind of supported.kinds) {\n * console.log(`${kind.network} - ${kind.scheme}`);\n * }\n * ```\n */\n async getSupported(): Promise<{\n kinds: Array<{ network: string; scheme: string; [key: string]: unknown }>;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/supported`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /supported failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Aggregated totals per network and asset (`GET /api/stats`).\n *\n * **An index, not a ledger.** Records are written best-effort AFTER\n * settlement, so an outage loses rows while payments proceed — verify\n * anything that matters against the transaction hash. Counting starts when\n * the operator enabled the store, so earlier operations are UNKNOWN, not\n * zero. And unless `X402_EVENTS_PUBLISH_FAILURES=true`, operations that ERROR\n * are not recorded at all: a 100% success rate means \"no failures were\n * recorded\".\n *\n * `volumeAtomic` is a STRING (u256-shaped; a JS number loses precision above\n * 2^53) and each row carries its own `decimals`. **Use that, never a\n * constant** — USDC is 6 decimals nearly everywhere and 18 on BSC, so scaling\n * by 6 there overstates volume by 10^12. `decimals` is null when the asset is\n * unrecognised; render the atomic value rather than guessing a scale.\n */\n async getStats(): Promise<{\n totals: { settlesOk: number; settlesFailed: number; verifies: number; networks: number };\n byNetworkAndAsset: Array<{\n network: string;\n asset: string;\n settlesOk: number;\n settlesFailed: number;\n verifies: number;\n volumeAtomic: string;\n decimals: number | null;\n lastTs: number;\n }>;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/api/stats`, { method: 'GET' });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /api/stats failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Recent recorded operations, newest first (`GET /transactions`).\n *\n * There is **no pagination and no cursor**: this returns the newest N,\n * walking back at most 30 days. With 10,000 rows you get the newest 200, not\n * page one of fifty. `limit` is clamped to 200 by the facilitator.\n *\n * `network` matches the canonical slug `/supported` uses, which is not always\n * the alias you may send — `skale` is accepted inbound but records say\n * `skale-base`.\n */\n async getTransactions(options: { limit?: number; network?: string } = {}): Promise<{\n transactions: Array<Record<string, unknown>>;\n count: number;\n [key: string]: unknown;\n }> {\n const params = new URLSearchParams();\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.network) params.set('network', options.network);\n const query = params.toString();\n const response = await fetch(\n `${this.baseUrl}/transactions${query ? `?${query}` : ''}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /transactions failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Get the facilitator's blocked/sanctioned addresses\n *\n * @returns Blacklist info (totalBlocked, loadedAtStartup, addresses)\n *\n * @example\n * ```ts\n * const bl = await client.getBlacklist();\n * console.log(`Blocked: ${bl.totalBlocked} addresses`);\n * ```\n */\n async getBlacklist(): Promise<{\n totalBlocked: number;\n loadedAtStartup: boolean;\n [key: string]: unknown;\n }> {\n const response = await fetch(`${this.baseUrl}/blacklist`, {\n method: 'GET',\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GET /blacklist failed: ${response.status} - ${errorText}`);\n }\n return await response.json();\n }\n\n /**\n * Negotiate payment requirements with the facilitator via POST /accepts.\n *\n * Sends merchant payment requirements to the facilitator, which matches\n * them against its supported capabilities and returns enriched requirements\n * with facilitator data (feePayer, tokens, escrow configuration).\n *\n * This is used by Faremeter middleware and clients that need to discover\n * what the facilitator can settle before constructing payment authorizations.\n *\n * @param paymentRequirements - List of payment requirement objects\n * @param x402Version - x402 protocol version (default: 2)\n * @returns List of enriched payment requirements with facilitator extras\n *\n * @example\n * ```ts\n * const enriched = await client.accepts([\n * {\n * scheme: 'exact',\n * network: 'base-mainnet',\n * maxAmountRequired: '1000000',\n * resource: 'https://api.example.com/data',\n * payTo: '0xMerchant...',\n * },\n * ]);\n * // enriched[0].extra.feePayer is now set\n * ```\n */\n async accepts(\n paymentRequirements: PaymentRequirements[],\n x402Version: number = 2\n ): Promise<PaymentRequirements[]> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/accepts`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n x402Version,\n accepts: paymentRequirements,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Facilitator /accepts error: ${response.status} - ${errorText}`);\n }\n\n const data = await response.json();\n return data.accepts || [];\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\n// ============================================================================\n// ATOMIC PAYMENT HELPERS\n// ============================================================================\n\n/**\n * Create a 402 Payment Required response\n *\n * @param requirements - Payment requirements\n * @param options - Additional response options\n * @returns Object with status code, headers, and body for the 402 response\n *\n * @example\n * ```ts\n * // Express.js\n * app.get('/premium-data', (req, res) => {\n * const payment = extractPaymentFromHeaders(req.headers);\n *\n * if (!payment) {\n * const { status, headers, body } = create402Response({\n * amount: '1.00',\n * recipient: '0x...',\n * resource: 'https://api.example.com/premium-data',\n * });\n * return res.status(status).set(headers).json(body);\n * }\n *\n * // Verify and serve...\n * });\n * ```\n */\nexport function create402Response(\n requirements: PaymentRequirementsOptions,\n options: {\n accepts?: PaymentAcceptance[];\n } = {}\n): {\n status: 402;\n headers: Record<string, string>;\n body: Record<string, unknown>;\n} {\n const primaryRequirement = buildPaymentRequirements(requirements);\n const version = requirements.x402Version\n || ((options.accepts && options.accepts.length > 0)\n || primaryRequirement.network.includes(':')\n || (options.accepts || []).some((accept) => accept.network.includes(':'))\n ? 2\n : 1);\n const advertisedRequirements = [\n normalizeRequirementForVersion(primaryRequirement, version),\n ...(options.accepts || []).map((accept) =>\n buildRequirementFromAcceptance(accept, primaryRequirement.resource, version, primaryRequirement)\n ),\n ];\n const body = create402ResponseBody(advertisedRequirements[0], advertisedRequirements, version);\n\n return {\n status: 402,\n headers: {\n 'Content-Type': 'application/json',\n ...X402_CORS_HEADERS,\n },\n body,\n };\n}\n\nconst DEFAULT_PAYMENT_DESCRIPTION = 'Payment required';\nconst DEFAULT_PAYMENT_MIME_TYPE = 'application/json';\nconst DEFAULT_PAYMENT_TIMEOUT_SECONDS = 300;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction resolveAdvertisedVersion(\n accepts: PaymentAcceptance[],\n requestedVersion?: X402Version | 'auto'\n): X402Version {\n if (requestedVersion && requestedVersion !== 'auto') {\n return requestedVersion;\n }\n\n if (accepts.length > 1 || accepts.some((accept) => accept.network.includes(':'))) {\n return 2;\n }\n\n return 1;\n}\n\nfunction normalizeRequirementForVersion(\n requirements: PaymentRequirements,\n version: X402Version\n): PaymentRequirements {\n return {\n ...requirements,\n network: version === 2\n ? (requirements.network.includes(':') ? requirements.network : chainToCAIP2(requirements.network))\n : (requirements.network.includes(':') ? parseNetworkIdentifier(requirements.network) : requirements.network),\n };\n}\n\nfunction buildRequirementFromAcceptance(\n accept: PaymentAcceptance,\n resource: string,\n version: X402Version,\n defaults?: PaymentRequirements\n): PaymentRequirements {\n const payTo = accept.payTo ?? defaults?.payTo;\n if (!payTo) {\n throw new Error('Payment accepts entries must include payTo');\n }\n\n return normalizeRequirementForVersion({\n // Honour a caller-supplied scheme; 'exact' is the default, not an override.\n // Hardcoding it silently discarded 'escrow' / 'commerce' accepts.\n scheme: (accept.scheme as PaymentRequirements['scheme']) ?? 'exact',\n network: accept.network,\n maxAmountRequired: accept.amount,\n resource: accept.resource ?? defaults?.resource ?? resource,\n description: accept.description ?? defaults?.description ?? DEFAULT_PAYMENT_DESCRIPTION,\n mimeType: accept.mimeType ?? defaults?.mimeType ?? DEFAULT_PAYMENT_MIME_TYPE,\n payTo,\n asset: accept.asset,\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? defaults?.maxTimeoutSeconds ?? DEFAULT_PAYMENT_TIMEOUT_SECONDS,\n ...(accept.outputSchema !== undefined\n ? { outputSchema: accept.outputSchema }\n : defaults?.outputSchema !== undefined\n ? { outputSchema: defaults.outputSchema }\n : {}),\n ...(accept.extra !== undefined\n ? { extra: accept.extra }\n : defaults?.extra !== undefined\n ? { extra: defaults.extra }\n : {}),\n }, version);\n}\n\nfunction toPaymentAcceptance(\n requirements: PaymentRequirements,\n facilitator?: string\n): PaymentAcceptance {\n return {\n network: requirements.network,\n asset: requirements.asset,\n amount: requirements.maxAmountRequired,\n // scheme is REQUIRED by the facilitator's v2 PaymentRequirementsV2. Dropping it\n // here produced an accepts[] entry that no v2 client could pay: the spec makes\n // the client echo the accept verbatim, so the omission travelled downstream and\n // died in deserialization with an error naming no field.\n scheme: requirements.scheme,\n payTo: requirements.payTo,\n resource: requirements.resource,\n description: requirements.description,\n mimeType: requirements.mimeType,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n ...(facilitator ? { facilitator } : {}),\n ...(requirements.outputSchema !== undefined ? { outputSchema: requirements.outputSchema } : {}),\n ...(requirements.extra !== undefined ? { extra: requirements.extra } : {}),\n };\n}\n\nfunction create402ResponseBody(\n primaryRequirement: PaymentRequirements,\n advertisedRequirements: PaymentRequirements[],\n version: X402Version,\n facilitator?: string\n): Record<string, unknown> {\n const normalizedPrimary = normalizeRequirementForVersion(primaryRequirement, version);\n const normalizedAdvertised = advertisedRequirements.map((requirements) =>\n normalizeRequirementForVersion(requirements, version)\n );\n\n const body: Record<string, unknown> = {\n x402Version: version,\n ...normalizedPrimary,\n };\n\n if (version === 2 && normalizedAdvertised.length > 1) {\n body.accepts = normalizedAdvertised.map((requirements) =>\n toPaymentAcceptance(requirements, facilitator)\n );\n }\n\n return body;\n}\n\nfunction getComparableNetwork(network: string): string {\n return parseNetworkIdentifier(network).toLowerCase();\n}\n\nfunction getPaymentRecipient(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n const authorization = payload.authorization;\n\n if (isObject(authorization) && typeof authorization.to === 'string') {\n return authorization.to.toLowerCase();\n }\n\n if (typeof payload.to === 'string') {\n return payload.to.toLowerCase();\n }\n\n return undefined;\n}\n\nfunction getPaymentAmount(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n const authorization = payload.authorization;\n\n if (isObject(authorization) && typeof authorization.value === 'string') {\n return authorization.value;\n }\n\n if (typeof payload.amount === 'string') {\n return payload.amount;\n }\n\n return undefined;\n}\n\nfunction getPaymentAsset(payment: X402Header): string | undefined {\n const payload = payment.payload as unknown;\n if (!isObject(payload)) {\n return undefined;\n }\n\n if (typeof payload.tokenContract === 'string') {\n return payload.tokenContract.toLowerCase();\n }\n\n return undefined;\n}\n\nasync function resolvePaymentRequirement(\n payment: X402Header,\n requirements: PaymentRequirements[],\n resolver?: PaymentRequirementResolver\n): Promise<{ requirement: PaymentRequirements | null; reason?: string }> {\n const normalizedRequirements = requirements.map((requirements) =>\n normalizeRequirementForVersion(requirements, payment.x402Version)\n );\n\n if (resolver) {\n const resolved = await resolver(payment, normalizedRequirements);\n return {\n requirement: resolved\n ? normalizeRequirementForVersion(resolved, payment.x402Version)\n : null,\n ...(resolved ? {} : { reason: 'Custom requirement resolver did not return a matching requirement.' }),\n };\n }\n\n const networkMatches = normalizedRequirements.filter((requirements) =>\n getComparableNetwork(requirements.network) === getComparableNetwork(payment.network)\n );\n\n if (networkMatches.length === 0) {\n return {\n requirement: null,\n reason: `No advertised payment requirement matched network ${payment.network}.`,\n };\n }\n\n let matches = networkMatches;\n\n const paymentRecipient = getPaymentRecipient(payment);\n if (paymentRecipient) {\n const recipientMatches = matches.filter((requirements) =>\n requirements.payTo.toLowerCase() === paymentRecipient\n );\n if (recipientMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment recipient does not match any advertised requirement.',\n };\n }\n matches = recipientMatches;\n }\n\n const paymentAmount = getPaymentAmount(payment);\n if (paymentAmount) {\n const amountMatches = matches.filter((requirements) =>\n requirements.maxAmountRequired === paymentAmount\n );\n if (amountMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment amount does not match any advertised requirement.',\n };\n }\n matches = amountMatches;\n }\n\n const paymentAsset = getPaymentAsset(payment);\n if (paymentAsset) {\n const assetMatches = matches.filter((requirements) =>\n requirements.asset.toLowerCase() === paymentAsset\n );\n if (assetMatches.length === 0) {\n return {\n requirement: null,\n reason: 'Payment asset does not match any advertised requirement.',\n };\n }\n matches = assetMatches;\n }\n\n if (matches.length !== 1) {\n return {\n requirement: null,\n reason: 'Payment matched multiple advertised requirements. Advertise unique network/payTo/amount combinations or provide resolveRequirement().',\n };\n }\n\n return { requirement: matches[0] };\n}\n\nfunction createVerifiedPaymentState(\n client: FacilitatorClient,\n payment: X402Header,\n requirements: PaymentRequirements,\n verifyResult: VerifyResponse\n): VerifiedPaymentState {\n let settlePromise: Promise<SettleResponse> | null = null;\n return {\n payment,\n requirements,\n verifyResult,\n settle: () => {\n if (!settlePromise) {\n settlePromise = client.settle(payment, requirements);\n }\n return settlePromise;\n },\n };\n}\n\n/**\n * Create an Express-compatible middleware for x402 payments\n *\n * @param getRequirements - Function to get payment requirements for a request\n * @param options - Middleware options\n * @returns Express middleware function\n *\n * @example\n * ```ts\n * const paymentMiddleware = createPaymentMiddleware(\n * (req) => ({\n * amount: '1.00',\n * recipient: process.env.PAYMENT_RECIPIENT,\n * resource: `${req.protocol}://${req.get('host')}${req.originalUrl}`,\n * }),\n * { facilitatorUrl: 'https://facilitator.uvd.xyz' }\n * );\n *\n * app.get('/premium/*', paymentMiddleware, async (req, res) => {\n * const settleResult = await req.x402?.settle();\n * if (!settleResult?.success) {\n * return res.status(500).json({ error: settleResult?.error });\n * }\n *\n * res.json({ premium: 'data' });\n * });\n * ```\n */\nexport function createPaymentMiddleware(\n getRequirements: (req: { headers: Record<string, string | string[] | undefined> }) => PaymentRequirementsOptions,\n options: PaymentMiddlewareOptions = {}\n): (\n req: { headers: Record<string, string | string[] | undefined>; x402?: VerifiedPaymentState },\n res: { status: (code: number) => { json: (body: unknown) => void; set: (headers: Record<string, string>) => { json: (body: unknown) => void } } },\n next: () => void\n) => Promise<void> {\n const client = new FacilitatorClient({\n baseUrl: options.facilitatorUrl || options.baseUrl,\n timeout: options.timeout,\n });\n const settlementStrategy = options.settlementStrategy || 'before-handler';\n\n return async (req, res, next) => {\n // Extract payment header\n const payment = extractPaymentFromHeaders(req.headers);\n\n // If no payment, return 402\n if (!payment) {\n const reqOptions = getRequirements(req);\n const { status, headers, body } = create402Response(reqOptions);\n res.status(status).set(headers).json(body);\n return;\n }\n\n // Build requirements and verify\n const reqOptions = getRequirements(req);\n const requirements = buildPaymentRequirements(reqOptions);\n const verifyResult = await client.verify(payment, requirements);\n\n if (!verifyResult.isValid) {\n res.status(402).json({\n error: 'Payment verification failed',\n reason: verifyResult.invalidReason,\n });\n return;\n }\n\n req.x402 = createVerifiedPaymentState(client, payment, requirements, verifyResult);\n\n if (settlementStrategy === 'before-handler') {\n const settleResult = await req.x402.settle();\n if (!settleResult.success) {\n res.status(500).json({\n error: 'Payment settlement failed',\n reason: settleResult.error || 'Unknown settlement error',\n });\n return;\n }\n }\n\n next();\n };\n}\n\n// ============================================================================\n// HONO MIDDLEWARE\n// ============================================================================\n\n/**\n * Options for creating a Hono x402 payment middleware\n */\nexport interface HonoMiddlewareOptions extends PaymentMiddlewareOptions {\n /** Payment requirements to advertise */\n accepts: PaymentAcceptance[];\n /** Response version to advertise (defaults to auto) */\n x402Version?: X402Version | 'auto';\n /** Custom requirement resolver for ambiguous multi-accept flows */\n resolveRequirement?: PaymentRequirementResolver;\n}\n\n/**\n * Create a Hono-compatible middleware for x402 payments.\n *\n * Handles the x402 payment flow:\n * 1. Returns 402 with payment requirements if no X-PAYMENT header\n * 2. Verifies the payment with the facilitator\n * 3. Optionally settles before the handler when settlementStrategy is set\n * 4. Passes control to the next handler on success\n *\n * @param options - Middleware options with facilitator URL and payment accepts\n * @returns Hono middleware function\n *\n * @example\n * ```ts\n * import { createHonoMiddleware } from 'uvd-x402-sdk';\n *\n * const paywall = createHonoMiddleware({\n * accepts: [{\n * network: 'skale-base',\n * asset: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n * amount: '1000000',\n * payTo: '0xYourWallet',\n * extra: { name: 'Bridged USDC (SKALE Bridge)', version: '2' },\n * }],\n * });\n *\n * app.get('/api/premium', paywall, (c) => {\n * return c.json({ message: 'Premium content!' });\n * });\n * ```\n */\nexport function createHonoMiddleware(options: HonoMiddlewareOptions) {\n const client = new FacilitatorClient({\n baseUrl: options.facilitatorUrl || options.baseUrl,\n timeout: options.timeout,\n });\n const settlementStrategy = options.settlementStrategy || 'before-handler';\n\n if (!options.accepts[0]) {\n throw new Error('At least one accept entry is required');\n }\n\n return async (\n c: {\n req: { header: (name: string) => string | undefined; url: string };\n json: (body: unknown, status?: number) => unknown;\n set?: (key: string, value: unknown) => void;\n },\n next: () => Promise<void>\n ) => {\n const paymentHeader = c.req.header('X-PAYMENT') || c.req.header('x-payment');\n const advertisedVersion = resolveAdvertisedVersion(options.accepts, options.x402Version);\n const advertisedRequirements = options.accepts.map((accept) =>\n buildRequirementFromAcceptance(accept, c.req.url, advertisedVersion)\n );\n\n if (!paymentHeader) {\n return c.json(\n create402ResponseBody(\n advertisedRequirements[0],\n advertisedRequirements,\n advertisedVersion,\n options.facilitatorUrl\n ),\n 402\n );\n }\n\n const parsed = parsePaymentHeader(paymentHeader);\n if (!parsed) {\n return c.json({ error: 'Invalid X-PAYMENT header' }, 400);\n }\n\n const { requirement, reason } = await resolvePaymentRequirement(\n parsed,\n advertisedRequirements,\n options.resolveRequirement\n );\n\n if (!requirement) {\n return c.json({\n error: 'Payment verification failed',\n reason,\n }, 402);\n }\n\n const verifyResult = await client.verify(parsed, requirement);\n if (!verifyResult.isValid) {\n return c.json({\n error: 'Payment verification failed',\n reason: verifyResult.invalidReason,\n }, 402);\n }\n\n const verifiedPayment = createVerifiedPaymentState(client, parsed, requirement, verifyResult);\n c.set?.('x402', verifiedPayment);\n\n if (settlementStrategy === 'before-handler') {\n const settleResult = await verifiedPayment.settle();\n if (!settleResult.success) {\n return c.json({\n error: 'Payment settlement failed',\n reason: settleResult.error || 'Unknown error',\n }, 500);\n }\n }\n\n await next();\n };\n}\n\n// ============================================================================\n// BAZAAR DISCOVERY API\n// ============================================================================\n//\n// The Bazaar is the discovery registry served by the facilitator itself, under\n// `/discovery/*`. There is no separate Bazaar host.\n\n/**\n * Maximum length of the free-text `q` filter.\n *\n * Mirrors the facilitator's `MAX_SEARCH_LEN`; a longer needle is rejected\n * server-side with a 400.\n */\nexport const MAX_SEARCH_LEN = 128;\n\n/**\n * Liveness of a registered resource, as measured by the facilitator's prober.\n *\n * Resources that stop answering are quarantined rather than deleted, so filter\n * on this before paying anyone.\n */\nexport type DiscoveryHealthStatus =\n | 'alive'\n | 'degraded'\n | 'auth_gated'\n | 'quarantined'\n | 'unknown'\n | 'unprobeable';\n\n/** Values accepted by the `health` filter, including the `any` escape hatch. */\nexport const HEALTH_FILTERS = [\n 'alive',\n 'degraded',\n 'auth_gated',\n 'quarantined',\n 'unknown',\n 'unprobeable',\n 'any',\n] as const;\n\n/** Curated tier, in descending order of trust. */\nexport type DiscoveryTier = 'first_party' | 'vip' | 'verified' | 'listed';\n\n/** Values accepted by the `tier` filter. */\nexport const TIER_FILTERS = [\n 'first_party',\n 'vip',\n 'verified',\n 'listed',\n] as const;\n\n/** How a resource got into the registry. */\nexport type DiscoverySource =\n | 'self_registered'\n | 'settlement'\n | 'crawled'\n | 'aggregated';\n\n/** Health of a single resource, as reported by the registry's prober. */\nexport interface DiscoveryHealth {\n /** Last observed liveness */\n status?: DiscoveryHealthStatus;\n /** Unix epoch seconds of the last probe */\n lastChecked?: number;\n /** HTTP status the probe got back (402 is the healthy answer for x402) */\n httpStatus?: number;\n /** Round-trip time of the last probe, in milliseconds */\n latencyMs?: number;\n}\n\n/** Curation metadata attached to a resource. */\nexport interface DiscoveryCuration {\n /** Curated tier */\n tier?: DiscoveryTier;\n /** Human-readable name of the curated set */\n label?: string;\n}\n\n/** One payment method a resource declares. */\nexport interface DiscoveryAccepts {\n /** Payment scheme (\"exact\", \"escrow\", \"commerce\") */\n scheme: string;\n /** CAIP-2 network id, e.g. \"eip155:8453\" */\n network: string;\n /** Token contract address */\n asset?: string;\n /** Price in atomic units of `asset` */\n amount?: string;\n /** Recipient address */\n payTo?: string;\n /** Settlement deadline in seconds */\n maxTimeoutSeconds?: number;\n /** Scheme-specific extras (EIP-712 domain, etc.) */\n extra?: Record<string, unknown>;\n /** Anything the registry adds later */\n [key: string]: unknown;\n}\n\n/**\n * A discoverable paid resource, exactly as `GET /discovery/resources` serves it.\n *\n * Timestamps are Unix epoch **seconds**, not ISO strings and not milliseconds.\n */\nexport interface DiscoveryResource {\n /** Resource URL. This is the registry's primary key -- there is no `id` */\n url: string;\n /** Resource type (\"http\", \"mcp\", \"a2a\") */\n type: string;\n /** x402 protocol version the resource speaks */\n x402Version: number;\n /** Human-readable description */\n description?: string;\n /** Payment methods the resource accepts */\n accepts: DiscoveryAccepts[];\n /** Free-form metadata (category, provider, tags) */\n metadata?: Record<string, unknown>;\n /** How this resource entered the registry */\n source?: DiscoverySource;\n /** Facilitator this resource was aggregated from */\n sourceFacilitator?: string;\n /** Unix epoch seconds when the registry first saw this resource */\n firstSeen?: number;\n /** Unix epoch seconds when the registry last saw this resource */\n lastSeen?: number;\n /** Unix epoch seconds of the last change to this record */\n lastUpdated?: number;\n /** Liveness, when the resource has been probed */\n health?: DiscoveryHealth;\n /** Curation tier, when the resource has been curated */\n curation?: DiscoveryCuration;\n /** Anything the registry adds later */\n [key: string]: unknown;\n}\n\n/** Pagination envelope of `GET /discovery/resources`. */\nexport interface DiscoveryPagination {\n /** Page size that was applied */\n limit: number;\n /** Offset that was applied */\n offset: number;\n /** Total number of resources matching the filters, across all pages */\n total: number;\n}\n\n/** Paginated response from `GET /discovery/resources`. */\nexport interface DiscoveryResponse {\n /** x402 protocol version of the response envelope */\n x402Version: number;\n /** Resources on this page */\n items: DiscoveryResource[];\n /** Pagination state */\n pagination: DiscoveryPagination;\n}\n\n/**\n * Filters for `listResources()`.\n *\n * Every one of these is applied server-side over the whole catalog, so\n * `pagination.total` reflects the filtered set. Filtering a page after the\n * fact is not the same thing and will under-report.\n */\nexport interface DiscoveryListOptions {\n /** Page size (default: 10, max: 100) */\n limit?: number;\n /** Number of resources to skip */\n offset?: number;\n /** Filter by category */\n category?: string;\n /** Filter by network, CAIP-2 or v1 name */\n network?: string;\n /** Filter by provider name */\n provider?: string;\n /** Filter by tag */\n tag?: string;\n /** Filter by how the resource was discovered */\n source?: DiscoverySource;\n /** Filter by originating facilitator */\n sourceFacilitator?: string;\n /** Filter by liveness, or 'any' to opt out of the default visibility rules */\n health?: DiscoveryHealthStatus | 'any';\n /** Filter by curated tier */\n tier?: DiscoveryTier;\n /** Free-text search over url / description / provider / category / tags */\n q?: string;\n}\n\n/** Options for `registerResource()`. */\nexport interface DiscoveryRegisterOptions {\n /** URL of the paid resource. Doubles as its identity in the registry */\n url: string;\n /** Resource type (default: \"http\") */\n type?: string;\n /** Human-readable description */\n description?: string;\n /** Payment methods the resource accepts */\n accepts?: DiscoveryAccepts[];\n /** Free-form metadata (category, provider, tags) */\n metadata?: Record<string, unknown>;\n}\n\n/** Aggregate catalog metrics from `GET /discovery/stats`. */\nexport interface DiscoveryStats {\n /** Every record the registry holds, including quarantined ones */\n total: number;\n /** Records served by default listings */\n visible: number;\n /** Counts by discovery source */\n bySource: Record<string, number>;\n /** Counts by originating facilitator */\n bySourceFacilitator: Record<string, number>;\n /** Counts by CAIP-2 network */\n byNetwork: Record<string, number>;\n /** Counts by curated tier */\n byTier: Record<string, number>;\n /** Counts by liveness */\n byHealth: Record<string, number>;\n /** Unix epoch seconds this snapshot was computed (60s cache) */\n generatedAt?: number;\n}\n\n/** Options for the {@link BazaarClient}. */\nexport interface BazaarClientOptions {\n /** Facilitator base URL (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/** Render an epoch-seconds field as a `Date`. */\nexport function epochToDate(seconds?: number): Date | undefined {\n return seconds === undefined ? undefined : new Date(seconds * 1000);\n}\n\n/** True when the last probe reached this resource. */\nexport function isAlive(resource: DiscoveryResource): boolean {\n return resource.health?.status === 'alive';\n}\n\n/**\n * Client for the x402 Bazaar Discovery API.\n *\n * The Bazaar is the facilitator's own registry of x402-enabled resources.\n * Providers register their endpoints and consumers discover them, with a\n * liveness probe and a curation tier attached to every record.\n *\n * @example\n * ```ts\n * const bazaar = new BazaarClient();\n *\n * // Only endpoints a probe actually reached, best-curated first\n * const page = await bazaar.listResources({ limit: 20, health: 'alive', tier: 'vip' });\n * for (const r of page.items) {\n * console.log(r.url, r.health?.status, r.health?.latencyMs, r.curation?.label);\n * }\n *\n * // Free-text search runs server-side over the whole catalog\n * const hits = await bazaar.listResources({ q: 'logs' });\n * console.log(hits.pagination.total);\n *\n * // Register your own\n * await bazaar.registerResource({\n * url: 'https://api.example.com/v1/generate',\n * description: 'Generate images with AI',\n * accepts: [{\n * scheme: 'exact',\n * network: 'eip155:8453',\n * asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n * amount: '10000',\n * payTo: '0xYourWallet...',\n * maxTimeoutSeconds: 60,\n * }],\n * metadata: { category: 'ai', tags: ['image'] },\n * });\n * ```\n */\nexport class BazaarClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: BazaarClientOptions = {}) {\n this.baseUrl = (\n options.baseUrl || 'https://facilitator.ultravioletadao.xyz'\n ).replace(/\\/+$/, '');\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Issue a request against the facilitator with the configured timeout.\n */\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers: { Accept: 'application/json', ...(init?.headers || {}) },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bazaar API error: ${response.status} - ${errorText}`\n );\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * List resources from the discovery registry.\n *\n * @param options - Server-side filters and pagination\n * @returns One page of resources plus the total across all pages\n *\n * @example\n * ```ts\n * const page = await bazaar.listResources({ network: 'eip155:8453', health: 'alive' });\n * ```\n */\n async listResources(\n options: DiscoveryListOptions = {}\n ): Promise<DiscoveryResponse> {\n if (options.q !== undefined && options.q.length > MAX_SEARCH_LEN) {\n throw new Error(`q must be at most ${MAX_SEARCH_LEN} characters`);\n }\n\n const params = new URLSearchParams();\n params.set('limit', String(options.limit ?? 10));\n params.set('offset', String(options.offset ?? 0));\n if (options.category) params.set('category', options.category);\n if (options.network) params.set('network', options.network);\n if (options.provider) params.set('provider', options.provider);\n if (options.tag) params.set('tag', options.tag);\n if (options.source) params.set('source', options.source);\n if (options.sourceFacilitator)\n params.set('sourceFacilitator', options.sourceFacilitator);\n if (options.health) params.set('health', options.health);\n if (options.tier) params.set('tier', options.tier);\n if (options.q) params.set('q', options.q);\n\n return this.request<DiscoveryResponse>(\n `/discovery/resources?${params.toString()}`\n );\n }\n\n /**\n * Walk the whole filtered catalog, one page at a time.\n *\n * Pages are fetched in sequence rather than in parallel: the read routes are\n * rate limited, and a burst of parallel pages is how a legitimate catalog\n * walk turns into a wall of 429s.\n *\n * @param options - Same filters as {@link listResources}; `limit` is the page size\n *\n * @example\n * ```ts\n * for await (const r of bazaar.iterateResources({ health: 'alive' })) {\n * console.log(r.url);\n * }\n * ```\n */\n async *iterateResources(\n options: DiscoveryListOptions = {}\n ): AsyncGenerator<DiscoveryResource, void, undefined> {\n const pageSize = options.limit ?? 100;\n let offset = options.offset ?? 0;\n\n for (;;) {\n const page = await this.listResources({\n ...options,\n limit: pageSize,\n offset,\n });\n if (page.items.length === 0) return;\n\n for (const item of page.items) yield item;\n\n offset += page.items.length;\n if (offset >= page.pagination.total) return;\n }\n }\n\n /**\n * Look up a single resource by its URL.\n *\n * The registry keys on URL and has no by-id lookup, so this searches and\n * then matches exactly.\n *\n * @param resourceUrl - Exact URL of the resource\n * @returns The resource, or null when it is not registered\n */\n async getResourceByUrl(\n resourceUrl: string\n ): Promise<DiscoveryResource | null> {\n const page = await this.listResources({\n q: resourceUrl.slice(0, MAX_SEARCH_LEN),\n limit: 100,\n health: 'any',\n });\n return page.items.find((item) => item.url === resourceUrl) ?? null;\n }\n\n /**\n * Register a paid resource in the discovery registry.\n *\n * Registration is open and rate limited; re-registering a known URL updates\n * the existing record rather than creating a duplicate.\n *\n * @param options - Resource details\n * @returns The registry's acknowledgement\n */\n async registerResource(\n options: DiscoveryRegisterOptions\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n url: options.url,\n type: options.type || 'http',\n description: options.description || '',\n };\n if (options.accepts) payload.accepts = options.accepts;\n if (options.metadata) payload.metadata = options.metadata;\n\n return this.request<Record<string, unknown>>('/discovery/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n /**\n * Aggregate catalog metrics (60s cached server-side).\n *\n * @returns Counts by source, facilitator, network, tier and liveness\n */\n async getStats(): Promise<DiscoveryStats> {\n return this.request<DiscoveryStats>('/discovery/stats');\n }\n\n /**\n * Check that the facilitator serving the registry is up.\n *\n * @returns True when the facilitator answers its health check\n */\n async healthCheck(): Promise<boolean> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n signal: controller.signal,\n });\n return response.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * @deprecated Renamed to {@link listResources}, which returns the registry's\n * real `{ items, pagination }` envelope. The old `discover()` returned a\n * `{ resources, page, totalPages }` shape that no endpoint ever served.\n */\n async discover(options: DiscoveryListOptions = {}): Promise<DiscoveryResponse> {\n return this.listResources(options);\n }\n}\n\n/**\n * @deprecated Use {@link DiscoveryResource}. The old shape (`id`, `name`,\n * `pricePerRequest`, `isActive`, ISO `createdAt`) described an API that was\n * never deployed.\n */\nexport type BazaarResource = DiscoveryResource;\n\n/** @deprecated Use {@link DiscoveryResponse}. */\nexport type BazaarDiscoverResponse = DiscoveryResponse;\n\n/** @deprecated Use {@link DiscoveryListOptions}. */\nexport type BazaarDiscoverOptions = DiscoveryListOptions;\n\n/** @deprecated Use {@link DiscoveryRegisterOptions}. */\nexport type BazaarRegisterOptions = DiscoveryRegisterOptions;\n\n// ============================================================================\n// ESCROW & REFUND EXTENSION\n// ============================================================================\n\n/**\n * Escrow payment status\n */\nexport type EscrowStatus =\n | 'pending' // Payment initiated, awaiting confirmation\n | 'held' // Funds held in escrow\n | 'released' // Funds released to recipient\n | 'refunded' // Funds returned to payer\n | 'disputed' // Dispute in progress\n | 'expired'; // Escrow expired without resolution\n\n/**\n * Refund request status\n */\nexport type RefundStatus =\n | 'pending' // Refund requested, awaiting processing\n | 'approved' // Refund approved\n | 'rejected' // Refund rejected\n | 'processed' // Refund completed on-chain\n | 'disputed'; // Under dispute review\n\n/**\n * Dispute resolution outcome\n */\nexport type DisputeOutcome =\n | 'pending' // Dispute under review\n | 'payer_wins' // Payer gets refund\n | 'recipient_wins' // Recipient keeps funds\n | 'split'; // Funds split between parties\n\n/**\n * Escrow payment record\n */\nexport interface EscrowPayment {\n /** Unique escrow ID */\n id: string;\n /** Original payment header (base64 encoded) */\n paymentHeader: string;\n /** Current status */\n status: EscrowStatus;\n /** Network where payment was made */\n network: string;\n /** Payer address */\n payer: string;\n /** Recipient address */\n recipient: string;\n /** Amount in atomic units */\n amount: string;\n /** Token/asset contract */\n asset: string;\n /** Resource URL being paid for */\n resource: string;\n /** Escrow expiration timestamp (ISO) */\n expiresAt: string;\n /** Release conditions (optional) */\n releaseConditions?: {\n /** Minimum time before release (seconds) */\n minHoldTime?: number;\n /** Required confirmations */\n confirmations?: number;\n /** Custom condition metadata */\n custom?: unknown;\n };\n /** Transaction hash if released/refunded */\n transactionHash?: string;\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Last update timestamp (ISO) */\n updatedAt: string;\n}\n\n/**\n * Refund request record\n */\nexport interface RefundRequest {\n /** Unique refund request ID */\n id: string;\n /** Related escrow ID */\n escrowId: string;\n /** Current status */\n status: RefundStatus;\n /** Reason for refund request */\n reason: string;\n /** Additional evidence/details */\n evidence?: string;\n /** Amount requested (may be partial) */\n amountRequested: string;\n /** Amount approved (if any) */\n amountApproved?: string;\n /** Requester (payer) address */\n requester: string;\n /** Transaction hash if processed */\n transactionHash?: string;\n /** Response from recipient/facilitator */\n response?: {\n status: 'approved' | 'rejected';\n reason?: string;\n respondedAt: string;\n };\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Last update timestamp (ISO) */\n updatedAt: string;\n}\n\n/**\n * Dispute record\n */\nexport interface Dispute {\n /** Unique dispute ID */\n id: string;\n /** Related escrow ID */\n escrowId: string;\n /** Related refund request ID (if any) */\n refundRequestId?: string;\n /** Dispute outcome */\n outcome: DisputeOutcome;\n /** Initiator (payer or recipient) */\n initiator: 'payer' | 'recipient';\n /** Reason for dispute */\n reason: string;\n /** Evidence from payer */\n payerEvidence?: string;\n /** Evidence from recipient */\n recipientEvidence?: string;\n /** Arbitration notes */\n arbitrationNotes?: string;\n /** Amount resolved to payer */\n payerAmount?: string;\n /** Amount resolved to recipient */\n recipientAmount?: string;\n /** Transaction hash(es) for resolution */\n transactionHashes?: string[];\n /** Creation timestamp (ISO) */\n createdAt: string;\n /** Resolution timestamp (ISO) */\n resolvedAt?: string;\n}\n\n/**\n * Options for creating an escrow payment\n */\nexport interface CreateEscrowOptions {\n /** Payment header (from client SDK) */\n paymentHeader: string;\n /** Payment requirements */\n requirements: PaymentRequirements;\n /** Escrow duration in seconds (default: 86400 = 24h) */\n escrowDuration?: number;\n /** Release conditions */\n releaseConditions?: {\n minHoldTime?: number;\n confirmations?: number;\n custom?: unknown;\n };\n}\n\n/**\n * Options for requesting a refund\n */\nexport interface RequestRefundOptions {\n /** Escrow ID to refund */\n escrowId: string;\n /** Reason for refund */\n reason: string;\n /** Amount to refund (full amount if not specified) */\n amount?: string;\n /** Supporting evidence */\n evidence?: string;\n}\n\n/**\n * Options for the EscrowClient\n */\nexport interface EscrowClientOptions {\n /** Base URL of the Escrow API (default: https://escrow.ultravioletadao.xyz) */\n baseUrl?: string;\n /** API key for authenticated operations */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Client for x402 Escrow & Refund operations\n *\n * The Escrow system holds payments until service is verified,\n * enabling refunds and dispute resolution.\n *\n * @example\n * ```ts\n * // Create escrow payment (backend)\n * const escrow = new EscrowClient();\n * const escrowPayment = await escrow.createEscrow({\n * paymentHeader: req.headers['x-payment'],\n * requirements: paymentRequirements,\n * escrowDuration: 86400, // 24 hours\n * });\n *\n * // After service is provided, release the escrow\n * await escrow.release(escrowPayment.id);\n *\n * // If service not provided, payer can request refund\n * await escrow.requestRefund({\n * escrowId: escrowPayment.id,\n * reason: 'Service not delivered within expected timeframe',\n * });\n * ```\n */\nexport class EscrowClient {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeout: number;\n\n constructor(options: EscrowClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://escrow.ultravioletadao.xyz';\n this.apiKey = options.apiKey;\n this.timeout = options.timeout || 30000;\n }\n\n private getHeaders(authenticated: boolean = false): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n if (authenticated && this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return headers;\n }\n\n /**\n * Create an escrow payment\n *\n * Holds the payment in escrow until released or refunded.\n *\n * @param options - Escrow creation options\n * @returns Created escrow payment\n */\n async createEscrow(options: CreateEscrowOptions): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({\n paymentHeader: options.paymentHeader,\n paymentRequirements: options.requirements,\n escrowDuration: options.escrowDuration || 86400,\n releaseConditions: options.releaseConditions,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get escrow payment by ID\n *\n * @param escrowId - Escrow payment ID\n * @returns Escrow payment details\n */\n async getEscrow(escrowId: string): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Release escrow funds to recipient\n *\n * Call this after service has been successfully provided.\n *\n * @param escrowId - Escrow payment ID\n * @returns Updated escrow payment with transaction hash\n */\n async release(escrowId: string): Promise<EscrowPayment> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}/release`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Request a refund for an escrow payment\n *\n * Initiates a refund request that must be approved.\n *\n * @param options - Refund request options\n * @returns Created refund request\n */\n async requestRefund(options: RequestRefundOptions): Promise<RefundRequest> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(options.escrowId)}/refund`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({\n reason: options.reason,\n amount: options.amount,\n evidence: options.evidence,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Approve a refund request (for recipients)\n *\n * @param refundId - Refund request ID\n * @param amount - Amount to approve (may be less than requested)\n * @returns Updated refund request\n */\n async approveRefund(refundId: string, amount?: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}/approve`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ amount }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Reject a refund request (for recipients)\n *\n * @param refundId - Refund request ID\n * @param reason - Reason for rejection\n * @returns Updated refund request\n */\n async rejectRefund(refundId: string, reason: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}/reject`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ reason }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get refund request by ID\n *\n * @param refundId - Refund request ID\n * @returns Refund request details\n */\n async getRefund(refundId: string): Promise<RefundRequest> {\n const url = `${this.baseUrl}/refund/${encodeURIComponent(refundId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Open a dispute for an escrow payment\n *\n * Initiates arbitration when payer and recipient disagree.\n *\n * @param escrowId - Escrow payment ID\n * @param reason - Reason for dispute\n * @param evidence - Supporting evidence\n * @returns Created dispute\n */\n async openDispute(\n escrowId: string,\n reason: string,\n evidence?: string\n ): Promise<Dispute> {\n const url = `${this.baseUrl}/escrow/${encodeURIComponent(escrowId)}/dispute`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ reason, evidence }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Submit evidence to a dispute\n *\n * @param disputeId - Dispute ID\n * @param evidence - Evidence to submit\n * @returns Updated dispute\n */\n async submitEvidence(disputeId: string, evidence: string): Promise<Dispute> {\n const url = `${this.baseUrl}/dispute/${encodeURIComponent(disputeId)}/evidence`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(true),\n body: JSON.stringify({ evidence }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get dispute by ID\n *\n * @param disputeId - Dispute ID\n * @returns Dispute details\n */\n async getDispute(disputeId: string): Promise<Dispute> {\n const url = `${this.baseUrl}/dispute/${encodeURIComponent(disputeId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * List escrow payments (with filters)\n *\n * @param options - Filter and pagination options\n * @returns Paginated list of escrow payments\n */\n async listEscrows(options: {\n status?: EscrowStatus;\n payer?: string;\n recipient?: string;\n page?: number;\n limit?: number;\n } = {}): Promise<{\n escrows: EscrowPayment[];\n total: number;\n page: number;\n limit: number;\n hasMore: boolean;\n }> {\n const params = new URLSearchParams();\n if (options.status) params.set('status', options.status);\n if (options.payer) params.set('payer', options.payer);\n if (options.recipient) params.set('recipient', options.recipient);\n if (options.page) params.set('page', options.page.toString());\n if (options.limit) params.set('limit', options.limit.toString());\n\n const url = `${this.baseUrl}/escrow${params.toString() ? `?${params}` : ''}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(true),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Query on-chain escrow state from the facilitator\n *\n * Calls POST /escrow/state to read current escrow state without settlement.\n *\n * @param options - Escrow state query parameters\n * @returns On-chain escrow state (status, balance, timestamps)\n *\n * @example\n * ```ts\n * const state = await escrow.getEscrowState({\n * network: 'base-mainnet',\n * payer: '0xPayer...',\n * recipient: '0xRecipient...',\n * nonce: '0x1234...',\n * });\n * console.log(`Status: ${state.status}`);\n * ```\n */\n async getEscrowState(options: {\n network: string;\n payer: string;\n recipient: string;\n nonce: string;\n }): Promise<Record<string, unknown>> {\n const url = `${this.baseUrl}/escrow/state`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(options),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Check Escrow API health\n *\n * @returns True if healthy\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// ============================================================================\n// ESCROW HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if an escrow can be released\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow can be released\n */\nexport function canReleaseEscrow(escrow: EscrowPayment): boolean {\n if (escrow.status !== 'held') {\n return false;\n }\n\n // Check expiration\n if (new Date(escrow.expiresAt) < new Date()) {\n return false;\n }\n\n // Check minimum hold time if specified\n if (escrow.releaseConditions?.minHoldTime) {\n const createdAt = new Date(escrow.createdAt);\n const minReleaseTime = new Date(\n createdAt.getTime() + escrow.releaseConditions.minHoldTime * 1000\n );\n if (new Date() < minReleaseTime) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if an escrow can be refunded\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow can be refunded\n */\nexport function canRefundEscrow(escrow: EscrowPayment): boolean {\n // Can only refund held or pending escrows\n return escrow.status === 'held' || escrow.status === 'pending';\n}\n\n/**\n * Check if an escrow is expired\n *\n * @param escrow - Escrow payment to check\n * @returns True if the escrow is expired\n */\nexport function isEscrowExpired(escrow: EscrowPayment): boolean {\n return new Date(escrow.expiresAt) < new Date();\n}\n\n/**\n * Calculate time remaining until escrow expires\n *\n * @param escrow - Escrow payment to check\n * @returns Milliseconds until expiration (negative if expired)\n */\nexport function escrowTimeRemaining(escrow: EscrowPayment): number {\n return new Date(escrow.expiresAt).getTime() - Date.now();\n}\n\n// ============================================================================\n// ERC-8004 TRUSTLESS AGENTS\n// ============================================================================\n\n/**\n * ERC-8004 extension identifier\n */\nexport const ERC8004_EXTENSION_ID = '8004-reputation';\n\n/**\n * Agent ID type: EVM uses sequential uint256 (number), Solana uses base58 pubkey (string)\n */\nexport type AgentId = number | string;\n\n/**\n * ERC-8004 contract addresses per network\n */\n// Mainnet addresses (CREATE2 deterministic - same on all mainnets)\nconst MAINNET_IDENTITY = '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432';\nconst MAINNET_REPUTATION = '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63';\n// Deployed after the identity/reputation pair, which is why it was missing here.\n// Verified live on all ten EVM mainnets; SKALE Base has no code at this address\n// and is the one mainnet that legitimately has no validation registry.\nconst MAINNET_VALIDATION = '0x8004Cc8439f36fd5F9F049D9fF86523Df6dAAB58';\n\n// Testnet addresses (same on all testnets)\nconst TESTNET_IDENTITY = '0x8004A818BFB912233c491871b3d84c89A494BD9e';\nconst TESTNET_REPUTATION = '0x8004B663056A597Dffe9eCcC1965A193B7388713';\nconst TESTNET_VALIDATION = '0x8004Cb1BF31DAf7788923b405b754f57acEB4272';\n\n// Solana program IDs (QuantuLabs 8004-solana)\nconst SOLANA_AGENT_REGISTRY = '8oo4dC4JvBLwy5tGgiH3WwK4B9PWxL9Z4XjA2jzkQMbQ';\nconst SOLANA_ATOM_ENGINE = 'AToMw53aiPQ8j7iHVb4fGt6nzUNxUhcPc3tbPBZuzVVb';\n\n/**\n * ERC-8004 contract addresses per network (21 networks: 19 EVM + 2 Solana)\n */\nexport const ERC8004_CONTRACTS: Record<string, {\n identityRegistry?: string;\n reputationRegistry?: string;\n validationRegistry?: string;\n agentRegistryProgram?: string;\n atomEngineProgram?: string;\n}> = {\n // Mainnets (11)\n ethereum: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n base: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n polygon: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n arbitrum: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n optimism: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n celo: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n bsc: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n monad: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n avalanche: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n scroll: {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n // SKALE Base is the one mainnet without a validation registry (no code at\n // the canonical address), so leaving it out is correct, not an omission.\n 'skale-base': {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n },\n // Deprecated alias for 'base' -- kept so existing lookups keep resolving.\n 'base-mainnet': {\n identityRegistry: MAINNET_IDENTITY,\n reputationRegistry: MAINNET_REPUTATION,\n validationRegistry: MAINNET_VALIDATION,\n },\n // Testnets (8)\n 'ethereum-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'base-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'polygon-amoy': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'arbitrum-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'optimism-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'celo-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'avalanche-fuji': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n 'skale-base-sepolia': {\n identityRegistry: TESTNET_IDENTITY,\n reputationRegistry: TESTNET_REPUTATION,\n validationRegistry: TESTNET_VALIDATION,\n },\n // Solana (2) - uses QuantuLabs 8004-solana Anchor program + ATOM Engine\n solana: {\n agentRegistryProgram: SOLANA_AGENT_REGISTRY,\n atomEngineProgram: SOLANA_ATOM_ENGINE,\n },\n 'solana-devnet': {\n agentRegistryProgram: SOLANA_AGENT_REGISTRY,\n atomEngineProgram: SOLANA_ATOM_ENGINE,\n },\n};\n\n/**\n * Return the network name the facilitator actually accepts.\n *\n * `base-mainnet` reads like the canonical spelling and is not: the facilitator\n * answers `400 {\"error\": \"Invalid network: base-mainnet\"}`. Every name is passed\n * through here before it reaches a URL or a request body, so callers holding the\n * old spelling keep working instead of being rejected at the edge.\n */\nexport function wireNetwork(network: string): string {\n return network === 'base-mainnet' ? 'base' : network;\n}\n\n/**\n * Network type for ERC-8004 operations (21 networks: 19 EVM + 2 Solana)\n *\n * These are the names the FACILITATOR accepts, verified against\n * GET /feedback -> supportedNetworks. 'base-mainnet' is kept only as a\n * deprecated alias: the facilitator rejects it outright (400 \"Invalid network\"),\n * so anything passed through this module is normalised to 'base' before it\n * reaches the wire. Use 'base'.\n */\nexport type Erc8004Network =\n // EVM Mainnets\n | 'ethereum' | 'base' | 'polygon' | 'arbitrum' | 'optimism' | 'celo' | 'bsc' | 'monad' | 'avalanche' | 'scroll' | 'skale-base'\n // Deprecated alias, rewritten to 'base' before it reaches the wire\n | 'base-mainnet'\n // EVM Testnets\n | 'ethereum-sepolia' | 'base-sepolia' | 'polygon-amoy' | 'arbitrum-sepolia' | 'optimism-sepolia' | 'celo-sepolia' | 'avalanche-fuji' | 'skale-base-sepolia'\n // Solana (uses QuantuLabs 8004-solana Anchor program + ATOM Engine)\n | 'solana' | 'solana-devnet';\n\n/**\n * Networks where the facilitator serves the RELAYED feedback rail, i.e. where\n * Execution Market has deployed a `FeedbackDelegate` and the facilitator\n * verified it on-chain (code present, and its `REPUTATION_REGISTRY()` reads\n * back that network's registry).\n *\n * Anywhere else `POST /feedback/evm/prepare` answers 400 — and it should. An\n * invented delegate address would send a type-4 transaction to an account with\n * no code behind it, and in the EVM a `.call()` to an address with no code\n * RETURNS SUCCESS. The failure would look exactly like a rating that rated\n * nobody.\n *\n * `avalanche` is absent and is not waiting to join: the C-Chain rejects the\n * transaction type itself (`-32000 transaction type not supported`), so there\n * is nothing to deploy against. Anchor the rating on a chain that supports\n * EIP-7702; the payment stays where it was made.\n */\nexport const RELAYED_FEEDBACK_NETWORKS: readonly Erc8004Network[] = [\n 'base',\n 'ethereum',\n 'polygon',\n 'arbitrum',\n 'optimism',\n 'celo',\n 'bsc',\n 'monad',\n 'base-sepolia',\n] as const;\n\n/**\n * Whether `network` serves the rater-authored feedback rail.\n *\n * Lets a caller route without paying a round trip for a 400. The facilitator\n * re-checks the delegate on-chain on every request regardless — this list is a\n * routing hint, never the authority.\n */\nexport function supportsRelayedFeedback(network: string): boolean {\n return (RELAYED_FEEDBACK_NETWORKS as readonly string[]).includes(wireNetwork(network));\n}\n\n/**\n * An EIP-7702 authorization, as a wallet produces it.\n *\n * Needed only the first time a rater rates: it points their EOA at the\n * `FeedbackDelegate`. Once delegated, `prepare` answers `delegated: true` and\n * the submission carries no authorization at all.\n */\nexport interface RelayAuthorizationParams {\n /**\n * Chain the authorization is for.\n *\n * `0` is EIP-7702's wildcard and is valid on EVERY chain — a far broader\n * grant than pinning this one. Send the chain id `prepare` returned.\n */\n chainId: number;\n /**\n * The delegate the account is pointed at. Must be the address `prepare`\n * offered; the facilitator refuses anything else before it pays for a\n * transaction.\n */\n address: string;\n /** The rater account's nonce at the moment the authorization executes */\n nonce: number;\n yParity: number;\n r: string;\n s: string;\n}\n\n/**\n * Request body for `POST /feedback/evm/prepare`.\n *\n * `rater` is the address that will appear on-chain as the author, which is the\n * whole point of this rail.\n */\nexport interface PrepareRelayFeedbackRequest {\n x402Version: 1 | 2;\n network: Erc8004Network;\n feedback: FeedbackParams & { rater: string };\n}\n\n/**\n * Response from `POST /feedback/evm/prepare`.\n *\n * Everything the rater has to sign so the CHAIN records them as the author\n * while the facilitator pays the gas.\n */\nexport interface PrepareRelayFeedbackResponse {\n success: boolean;\n /** The `FeedbackDelegate` the rater's EOA must be delegated to */\n delegate?: string;\n /** Registry calldata the rater is authorising, hex-encoded */\n data?: string;\n /**\n * The value the rater's signature must recover against.\n *\n * **The EIP-191 envelope is already applied here.** A holder of a raw key\n * signs this directly as a prehash (viem's `sign({ hash })`, ethers'\n * `signingKey.sign`). A WALLET must not be handed this value: `personal_sign`\n * applies the envelope itself, so it gets wrapped twice and recovers an\n * address that is not the rater. Wallets sign {@link signingPayload}.\n */\n digest?: string;\n /**\n * The same hash with the envelope still OFF — what a wallet signs.\n *\n * `keccak256('\\x19Ethereum Signed Message:\\n32' || signingPayload)` is\n * exactly {@link digest}, so a client can check the two against each other\n * rather than rebuilding the preimage from `data`.\n *\n * Requires facilitator v1.95.0+. Older facilitators omit it; a client that\n * needs it should fail loudly rather than fall back to signing `digest`\n * through a wallet, which produces a well-formed signature that authorises\n * nobody.\n */\n signingPayload?: string;\n /**\n * Unix seconds after which the authorisation is void. Short on purpose:\n * relaying is permissionless, so a signed authorisation is live in the wild\n * until it expires.\n */\n deadline?: number;\n /** Single-use value binding this authorisation. Echo it back on submit */\n nonce?: string;\n /**\n * Whether the account is already delegated. When `false` the submission MUST\n * carry an `authorization`.\n */\n delegated: boolean;\n /** The account nonce to put in the EIP-7702 authorization, when needed */\n accountNonce?: number;\n chainId: number;\n error?: string;\n network: Erc8004Network;\n}\n\n/**\n * Request body for `POST /feedback/evm/submit`.\n *\n * The feedback parameters are not redundant with `prepare`: the facilitator\n * rebuilds the registry calldata from them and requires the rater's signature\n * to cover exactly that. It does not relay calldata it was handed.\n */\nexport interface SubmitRelayFeedbackRequest {\n x402Version: 1 | 2;\n network: Erc8004Network;\n feedback: FeedbackParams & { rater: string };\n /** The deadline `prepare` returned */\n deadline: number;\n /** The single-use nonce `prepare` returned */\n nonce: string;\n /**\n * The rater's signature. It must recover to `rater` over `digest` — so\n * either a raw-key prehash signature over `digest`, or a wallet\n * `personal_sign` over `signingPayload`. Not `personal_sign` over `digest`.\n */\n signature: string;\n /** Required only when `prepare` answered `delegated: false` */\n authorization?: RelayAuthorizationParams;\n}\n\n/**\n * Proof of payment returned when settling with ERC-8004 extension\n */\nexport interface ProofOfPayment {\n /** Transaction hash of the settled payment */\n transactionHash: string;\n /** Block number where the transaction was included */\n blockNumber: number;\n /** Network where the payment was settled */\n network: string;\n /** The payer (consumer/client) address */\n payer: string;\n /** The payee (agent/resource owner) address */\n payee: string;\n /** Amount paid in token base units */\n amount: string;\n /** Token contract address */\n token: string;\n /** Unix timestamp of the block */\n timestamp: number;\n /** Keccak256 hash of the payment data for verification */\n paymentHash: string;\n}\n\n/**\n * Extended settle response with ERC-8004 proof of payment\n */\nexport interface SettleResponseWithProof extends SettleResponse {\n /** Proof of payment for ERC-8004 reputation submission */\n proofOfPayment?: ProofOfPayment;\n}\n\n/**\n * Agent identity from the Identity Registry\n */\nexport interface AgentIdentity {\n /** The agent's ID (EVM: sequential uint256, Solana: base58 pubkey string) */\n agentId: AgentId;\n /** Owner address of the agent NFT */\n owner: string;\n /** URI pointing to agent registration file */\n agentUri: string;\n /** Payment wallet address (if set) */\n agentWallet?: string;\n /** Network where the agent is registered */\n network: Erc8004Network;\n}\n\n/**\n * Agent registration file structure (resolved from agentURI)\n */\nexport interface AgentRegistrationFile {\n /** Type identifier */\n type: string;\n /** Agent name */\n name: string;\n /** Agent description */\n description: string;\n /** Image URL */\n image?: string;\n /** List of services the agent provides */\n services: AgentService[];\n /** Whether x402 payments are supported */\n x402Support: boolean;\n /** Whether the agent is active */\n active: boolean;\n /** List of registrations across chains */\n registrations: AgentRegistration[];\n /** Supported trust models */\n supportedTrust: string[];\n}\n\n/**\n * Agent service entry\n */\nexport interface AgentService {\n name: string;\n endpoint: string;\n version?: string;\n}\n\n/**\n * Agent registration reference\n */\nexport interface AgentRegistration {\n agentId: AgentId;\n agentRegistry: string; // Format: {namespace}:{chainId}:{address}\n}\n\n/**\n * Reputation summary for an agent\n */\nexport interface ReputationSummary {\n /** Agent ID (EVM: number, Solana: string) */\n agentId: AgentId;\n /** Number of feedback entries */\n count: number;\n /** Aggregated value */\n summaryValue: number;\n /** Decimal places for summaryValue */\n summaryValueDecimals: number;\n /** Network */\n network: Erc8004Network;\n}\n\n/**\n * Individual feedback entry\n */\nexport interface FeedbackEntry {\n /** Client who submitted the feedback */\n client: string;\n /** Feedback index (1-indexed) */\n feedbackIndex: number;\n /** Feedback value */\n value: number;\n /** Value decimals */\n valueDecimals: number;\n /** Primary tag */\n tag1: string;\n /** Secondary tag */\n tag2: string;\n /** Whether this feedback was revoked */\n isRevoked: boolean;\n}\n\n/**\n * Parameters for submitting reputation feedback\n */\nexport interface FeedbackParams {\n /** The agent's ID (EVM: tokenId number, Solana: base58 pubkey string) */\n agentId: AgentId;\n /** Feedback value (e.g., 87 for 87/100) */\n value: number;\n /** Decimal places for value interpretation (0-18) */\n valueDecimals?: number;\n /** Primary categorization tag (e.g., \"starred\", \"uptime\") */\n tag1?: string;\n /** Secondary categorization tag */\n tag2?: string;\n /** Service endpoint that was used */\n endpoint?: string;\n /** URI to off-chain feedback file (IPFS, HTTPS) */\n feedbackUri?: string;\n /** Keccak256 hash of feedback content (for integrity) */\n feedbackHash?: string;\n /**\n * Quality score 0-100.\n *\n * Solana only, and effectively required there: the ATOM Engine ignores an\n * unscored feedback. It is written to the agent but contributes nothing to\n * reputation, and the program reports `had_impact=false`. This is not\n * retroactive — reputation stays at zero however much unscored feedback\n * accumulates.\n */\n score?: number;\n /** Proof of payment (required for authorized feedback) */\n proof?: ProofOfPayment;\n}\n\n/**\n * Feedback request body for POST /feedback\n */\nexport interface FeedbackRequest {\n /** x402 protocol version */\n x402Version: 1 | 2;\n /** Network where feedback will be submitted */\n network: Erc8004Network;\n /** Feedback parameters */\n feedback: FeedbackParams;\n}\n\n/**\n * Feedback response from POST /feedback\n */\nexport interface FeedbackResponse {\n /** Whether the feedback was successfully submitted */\n success: boolean;\n /** Transaction hash of the feedback submission */\n transaction?: string;\n /** Feedback index assigned (1-indexed) */\n feedbackIndex?: number;\n /** Error message (if failed) */\n error?: string;\n /** Network where feedback was submitted */\n network: Erc8004Network;\n}\n\n/**\n * Reputation query response\n */\n/**\n * Error from an ERC-8004 lookup, carrying the HTTP status as a field.\n *\n * `notFound` and `retryable` are mutually exclusive and must stay that way in\n * calling code: the facilitator answers 404 for \"this address owns no agent\"\n * and 503 for \"I could not find out\", usually an RPC failure behind it.\n * Treating a 503 as absence is how a transient failure becomes a permanent\n * wrong answer — on a registration path it mints a second agent for an owner\n * who already has one, burning gas and leaving an orphan.\n */\nexport class Erc8004LookupError extends Error {\n /** HTTP status returned by the facilitator */\n readonly status: number;\n /** Raw response body, for debugging */\n readonly body: string;\n\n constructor(message: string, status: number, body: string) {\n super(message);\n this.name = 'Erc8004LookupError';\n this.status = status;\n this.body = body;\n }\n\n /** The address genuinely owns no agent on this network. */\n get notFound(): boolean {\n return this.status === 404;\n }\n\n /** The lookup reached no verdict. Retry; never read as \"owns nothing\". */\n get retryable(): boolean {\n return this.status === 503;\n }\n}\n\n/**\n * ATOM Engine reputation analytics (Solana only).\n *\n * Present only when the agent's `atom_stats` account has been initialized. The\n * facilitator does that during `registerAgent`; agents registered elsewhere may\n * never have it, in which case their feedback is never scored.\n *\n * The engine measures quality through EMA scores, so there are no\n * positive/negative tallies.\n */\nexport interface AtomStats {\n /** Trust tier 0-4 */\n trustTier: number;\n /** Human-readable trust tier */\n trustTierName: string;\n /** Cached quality score */\n qualityScore: number;\n /** Cached loyalty score */\n loyaltyScore: number;\n /** Statistical confidence */\n confidence: number;\n /** Risk assessment (lower is better) */\n riskScore: number;\n /** Client diversity from HyperLogLog */\n diversityRatio: number;\n /** Lowest score ever recorded */\n minScore: number;\n /** Highest score ever recorded */\n maxScore: number;\n /** Most recent score recorded */\n lastScore: number;\n /** Total feedback counted by the engine */\n feedbackCount: number;\n /** Slot of the most recent feedback */\n lastFeedbackSlot: number;\n}\n\nexport interface ReputationResponse {\n agentId: AgentId;\n summary: ReputationSummary;\n feedback?: FeedbackEntry[];\n /** ATOM Engine analytics; absent when the agent has no initialized stats */\n atomStats?: AtomStats | null;\n network: Erc8004Network;\n}\n\n/**\n * Key-value metadata entry for agent registration\n */\nexport interface MetadataEntryParam {\n /** Metadata key */\n key: string;\n /** Metadata value (hex-encoded bytes or UTF-8 string) */\n value: string;\n}\n\n/**\n * Request body for POST /register\n */\nexport interface RegisterAgentRequest {\n /** x402 protocol version */\n x402Version: 1 | 2;\n /** Network where agent will be registered */\n network: Erc8004Network;\n /** URI pointing to agent registration file (IPFS, HTTPS) */\n agentUri: string;\n /** Optional metadata key-value pairs */\n metadata?: MetadataEntryParam[];\n /** Optional recipient address - NFT is transferred to this address after minting */\n recipient?: string;\n}\n\n/**\n * Response from POST /register\n */\nexport interface RegisterAgentResponse {\n /** Whether registration succeeded */\n success: boolean;\n /** The newly assigned agent ID (EVM: tokenId number, Solana: base58 pubkey string) */\n agentId?: AgentId;\n /** Registration transaction hash */\n transaction?: string;\n /** Transfer transaction hash (if recipient was specified) */\n transferTransaction?: string;\n /** Owner address of the agent NFT */\n owner?: string;\n /** Error message if failed */\n error?: string;\n /** Network where agent was registered */\n network: string;\n}\n\n/**\n * Response from GET /identity/{network}/owner/{address}\n */\nexport interface IdentityByOwnerResponse {\n /** First (lowest) token ID owned by this address */\n agentId: AgentId;\n /** The queried address (checksummed) */\n owner: string;\n /** Agent's registration URI (may be empty) */\n agentUri: string;\n /** Network name */\n network: string;\n /** Total number of agent NFTs owned (as string) */\n balance: string;\n}\n\n/**\n * Response from GET /identity/{network}/{agent_id}/metadata/{key}\n */\n/**\n * Lifecycle of an async registration. `mint_confirmed` and `done` carry an\n * `agentId`; `failed` carries an `error`.\n */\nexport type RegisterJobStatus = 'pending' | 'mint_confirmed' | 'done' | 'failed';\n\n/**\n * Status of an asynchronous registration.\n *\n * Returned by `POST /register` with `Prefer: respond-async` (HTTP 202) and by\n * `GET /register/status/{jobId}`.\n *\n * Terminal jobs are retained for one hour and then age out, after which the\n * status endpoint 404s. Read the agent id before then, or it is only\n * recoverable from the chain.\n */\nexport interface RegisterJobResponse {\n jobId: string;\n status: RegisterJobStatus;\n network?: string;\n agentId?: AgentId;\n transaction?: string;\n transferTransaction?: string;\n owner?: string;\n error?: string;\n}\n\n/** Whether polling can stop: the job either finished or failed. */\nexport function isRegisterJobTerminal(job: RegisterJobResponse): boolean {\n return job.status === 'done' || job.status === 'failed';\n}\n\n/**\n * Thrown when a registration is still running after the wait elapsed.\n *\n * This is emphatically **not** a failure. The mint may still land. `jobId` is a\n * field rather than only part of the message, because the correct recovery is to\n * keep polling `getRegisterStatus(jobId)` — and a caller who cannot reach the id\n * without parsing a string will re-register instead, minting a duplicate agent.\n * That is the exact sequence that once produced five duplicate mints.\n *\n * Never map this to \"registration failed\".\n */\nexport class RegistrationPendingError extends Error {\n readonly jobId: string;\n readonly lastStatus: RegisterJobStatus;\n readonly timeoutMs: number;\n readonly retryable = true;\n\n constructor(jobId: string, lastStatus: RegisterJobStatus, timeoutMs: number) {\n super(\n `Registration job ${jobId} still '${lastStatus}' after ${Math.round(\n timeoutMs / 1000,\n )}s. It may still complete: poll getRegisterStatus('${jobId}') rather than registering again.`,\n );\n this.name = 'RegistrationPendingError';\n this.jobId = jobId;\n this.lastStatus = lastStatus;\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Present a finished async job in the shape the synchronous call returns.\n *\n * Keeping the return type identical is the whole point of `asyncTransport`:\n * switching transports must not force callers to rewrite anything downstream.\n */\nfunction jobToRegisterResponse(\n job: RegisterJobResponse,\n network: Erc8004Network,\n): RegisterAgentResponse {\n return {\n success: job.status !== 'failed',\n agentId: job.agentId,\n transaction: job.transaction,\n transferTransaction: job.transferTransaction,\n owner: job.owner,\n error: job.error,\n network: (job.network as Erc8004Network) ?? network,\n };\n}\n\nexport interface IdentityMetadataResponse {\n /** Agent ID (EVM: number, Solana: string) */\n agentId: AgentId;\n /** Metadata key */\n key: string;\n /**\n * Raw hex-encoded value. The facilitator sends this as `value`; this field\n * used to be declared as `valueHex`, which no response ever carried, so it\n * was always undefined at runtime.\n */\n value: string;\n /** UTF-8 decoded value (if decodable) */\n valueUtf8?: string;\n /** Whether the entry can still be changed */\n immutable?: boolean;\n /** Network */\n network: string;\n}\n\n/**\n * Response from GET /identity/{network}/total-supply\n *\n * On Solana the counts come from the Metaplex Core collection, not the registry,\n * which keeps no counter of its own.\n */\nexport interface IdentityTotalSupplyResponse {\n /** Registered agents, net of burns */\n totalSupply: number;\n /** All-time mint count (Solana) */\n numMinted?: number;\n /** Metaplex Core collection backing the count (Solana) */\n collection?: string;\n /** Network */\n network: string;\n}\n\n/**\n * Options for the ERC8004Client\n */\nexport interface Erc8004ClientOptions {\n /** Base URL of the facilitator (default: https://facilitator.ultravioletadao.xyz) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Client for ERC-8004 Trustless Agents API\n *\n * Provides methods for:\n * - Registering new agents (gasless, facilitator pays gas)\n * - Registering agents on behalf of users (gasless delegation)\n * - Querying agent identity, metadata, and total supply\n * - Querying agent reputation\n * - Submitting reputation feedback\n * - Revoking feedback\n *\n * @example\n * ```ts\n * const client = new Erc8004Client();\n *\n * // Get agent identity\n * const identity = await client.getIdentity('ethereum', 42);\n * console.log(identity.agentUri);\n *\n * // Get agent reputation\n * const reputation = await client.getReputation('ethereum', 42);\n * console.log(`Score: ${reputation.summary.summaryValue}`);\n *\n * // Submit feedback after payment\n * const result = await client.submitFeedback({\n * x402Version: 1,\n * network: 'ethereum',\n * feedback: {\n * agentId: 42,\n * value: 95,\n * valueDecimals: 0,\n * tag1: 'quality',\n * proof: settleResponse.proofOfPayment,\n * },\n * });\n * ```\n */\nexport class Erc8004Client {\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: Erc8004ClientOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://facilitator.ultravioletadao.xyz';\n this.timeout = options.timeout || 30000;\n }\n\n /**\n * Get agent identity from the Identity Registry\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @returns Agent identity information\n */\n async getIdentity(network: Erc8004Network, agentId: AgentId): Promise<AgentIdentity> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/${agentId}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get agent identity by owner address\n *\n * Resolves the first ERC-8004 agent ID owned by a wallet address on a given network.\n *\n * @param network - Network to query\n * @param address - Owner wallet address\n * @returns Agent identity information including balance\n *\n * @example\n * ```ts\n * const identity = await client.getIdentityByOwner('base-mainnet', '0x52E0...');\n * console.log(`Agent #${identity.agentId}, balance: ${identity.balance}`);\n * ```\n */\n async getIdentityByOwner(network: Erc8004Network, address: string): Promise<IdentityByOwnerResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/owner/${address}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n // 404 and 503 are different answers: \"owns nothing\" versus \"could not\n // find out\". Reading the status out of a message string is how they get\n // collapsed, and collapsing them mints a duplicate agent for an owner\n // who already has one. Carry the status as a field.\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Resolve agent registration file from agentURI\n *\n * @param agentUri - URI pointing to agent registration file\n * @returns Resolved agent registration file\n */\n async resolveAgentUri(agentUri: string): Promise<AgentRegistrationFile> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Handle IPFS URIs\n let url = agentUri;\n if (agentUri.startsWith('ipfs://')) {\n const cid = agentUri.replace('ipfs://', '');\n url = `https://ipfs.io/ipfs/${cid}`;\n }\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to resolve agentURI: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get agent reputation from the Reputation Registry\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @param options - Query options (tag filters, include individual feedback, client addresses)\n * @param options.clientAddresses - Comma-separated client addresses to filter by.\n * If omitted, the facilitator auto-discovers all clients via getClients().\n * @returns Reputation summary and optionally individual feedback entries\n */\n async getReputation(\n network: Erc8004Network,\n agentId: AgentId,\n options: {\n tag1?: string;\n tag2?: string;\n includeFeedback?: boolean;\n clientAddresses?: string;\n } = {}\n ): Promise<ReputationResponse> {\n const params = new URLSearchParams();\n if (options.tag1) params.set('tag1', options.tag1);\n if (options.tag2) params.set('tag2', options.tag2);\n if (options.includeFeedback) params.set('includeFeedback', 'true');\n if (options.clientAddresses) params.set('clientAddresses', options.clientAddresses);\n\n const url = `${this.baseUrl}/reputation/${wireNetwork(network)}/${agentId}${params.toString() ? `?${params}` : ''}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Submit reputation feedback for an agent\n *\n * Requires proof of payment for authorized feedback submission.\n *\n * @deprecated On this route the facilitator is the AUTHOR: the registry\n * records `msg.sender`, and that is the facilitator's wallet — which can also\n * revoke what it wrote. On the networks in {@link RELAYED_FEEDBACK_NETWORKS}\n * use {@link Erc8004Client.prepareRelayedFeedback} +\n * {@link Erc8004Client.submitRelayedFeedback} instead, which record the RATER\n * as author. This route still works and is not going away without notice: it\n * is the only one available where no `FeedbackDelegate` is deployed.\n *\n * @param request - Feedback request with agent ID, value, and proof\n * @returns Feedback response with transaction hash\n *\n * @example\n * ```ts\n * // After settling a payment with ERC-8004 extension\n * const settleResult = await facilitator.settle(payment, {\n * ...requirements,\n * extra: { '8004-reputation': { includeProof: true } },\n * });\n *\n * // Submit feedback with proof of payment\n * const feedback = await erc8004.submitFeedback({\n * x402Version: 1,\n * network: 'ethereum',\n * feedback: {\n * agentId: 42,\n * value: 95, // 95/100\n * valueDecimals: 0,\n * tag1: 'quality',\n * tag2: 'response-time',\n * proof: settleResult.proofOfPayment,\n * },\n * });\n * ```\n */\n async submitFeedback(request: FeedbackRequest): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Ask the facilitator what the rater must sign to author a rating.\n *\n * Step 1 of the rater-authored rail. Writes nothing on-chain and costs\n * nothing: it reads the delegate, the rater's delegation state and their\n * account nonce, then hands back a digest, a deadline and a single-use nonce.\n *\n * Why this exists: the ERC-8004 Reputation Registry records `msg.sender` as\n * the author, and the deployed implementation has no delegation path — no\n * `giveFeedbackWithSignature`, no ERC-2771 forwarder. So a rating the\n * facilitator relays the ordinary way is a rating attributed to the\n * FACILITATOR. EIP-7702 fixes it without touching the registry: the rater\n * delegates their own EOA to the `FeedbackDelegate` and the transaction is\n * sent TO THE RATER'S ADDRESS, so the registry sees the rater while the\n * facilitator pays.\n *\n * What to do with the answer:\n * 1. Produce the rater's signature. **Which value you sign depends on how you\n * sign it**, and getting it wrong yields a well-formed signature that\n * authorises nobody:\n * - raw key: sign `digest` as a **prehash**. It already carries the\n * EIP-191 envelope.\n * - wallet: `personal_sign` over `signingPayload`. `personal_sign` adds the\n * envelope itself, so signing `digest` with it wraps the value TWICE and\n * recovers a stranger — the only symptom is `relay_bad_signature`.\n * 2. If `delegated` is `false`, also produce an EIP-7702 authorization over\n * `(chainId, delegate, accountNonce)`.\n * 3. Hand both to {@link submitRelayedFeedback} with the SAME feedback\n * parameters, `deadline` and `nonce`.\n *\n * @param request - Network, rater address and feedback parameters\n * @returns Everything needed to sign, including whether an EIP-7702\n * authorization is still required\n *\n * @example\n * ```ts\n * const prep = await erc8004.prepareRelayedFeedback({\n * x402Version: 1,\n * network: 'base',\n * feedback: { agentId: 18896, value: 95, tag1: 'quality', rater: raterAddress },\n * });\n * // prep.delegated === false -> an EIP-7702 authorization is required\n * ```\n */\n async prepareRelayedFeedback(\n request: PrepareRelayFeedbackRequest,\n ): Promise<PrepareRelayFeedbackResponse> {\n const url = `${this.baseUrl}/feedback/evm/prepare`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n delegated: false,\n chainId: 0,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n delegated: false,\n chainId: 0,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Relay a rater-authored rating; the facilitator pays the gas.\n *\n * Step 2 of the rater-authored rail. The on-chain record that comes out of it\n * has the RATER as `msg.sender`, so `getClients(agentId)` shows the rater\n * rather than the facilitator.\n *\n * Pass back the same feedback parameters, `deadline` and `nonce` that\n * {@link prepareRelayedFeedback} returned. They are not redundant: the\n * facilitator rebuilds the registry calldata from them and requires the\n * rater's signature to cover exactly that.\n *\n * `authorization` is required only when `prepare` answered\n * `delegated: false`. One that names a different delegate than the one\n * `prepare` offered is refused before any gas is spent.\n *\n * @param request - Feedback parameters plus the rater's signature\n * @returns Feedback response with the transaction hash\n */\n async submitRelayedFeedback(\n request: SubmitRelayFeedbackRequest,\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/evm/submit`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Revoke previously submitted feedback\n *\n * Only the original submitter can revoke their feedback.\n *\n * @param network - Network where feedback was submitted\n * @param agentId - Agent ID\n * @param feedbackIndex - Index of feedback to revoke\n * @returns Revocation result\n */\n async revokeFeedback(\n network: Erc8004Network,\n agentId: AgentId,\n feedbackIndex: number,\n options?: { sealHash?: string; originalFeedback?: Omit<FeedbackParams, 'agentId' | 'proof'> }\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/revoke`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const payload: Record<string, unknown> = {\n x402Version: 1,\n network: wireNetwork(network),\n agentId,\n feedbackIndex,\n };\n // Solana revocations need the SEAL hash of the feedback being revoked. Pass\n // originalFeedback and the facilitator derives it; computing it yourself\n // means reimplementing the program's keccak256 layout exactly.\n if (options?.sealHash) {\n payload.sealHash = options.sealHash;\n } else if (options?.originalFeedback) {\n payload.originalFeedback = options.originalFeedback;\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network,\n };\n }\n }\n\n /**\n * Get ERC-8004 contract addresses for a network\n *\n * @param network - Network to get contracts for\n * @returns Contract addresses or undefined if not deployed\n */\n getContracts(network: Erc8004Network): typeof ERC8004_CONTRACTS[Erc8004Network] | undefined {\n return ERC8004_CONTRACTS[network];\n }\n\n /**\n * Check if ERC-8004 is available on a network\n *\n * @param network - Network to check\n * @returns True if ERC-8004 contracts are deployed\n */\n isAvailable(network: string): network is Erc8004Network {\n return network in ERC8004_CONTRACTS;\n }\n\n /**\n * Get feedback endpoint metadata\n *\n * @returns Endpoint information for /feedback\n */\n async getFeedbackMetadata(): Promise<{\n endpoint: string;\n supportedNetworks: Erc8004Network[];\n version: string;\n }> {\n const url = `${this.baseUrl}/feedback`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to get feedback metadata: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Append a response to existing feedback\n *\n * Allows agents to respond to feedback they received.\n * Only the agent (identity owner) can append responses.\n *\n * @param network - Network where feedback was submitted\n * @param agentId - Agent ID\n * @param feedbackIndex - Index of feedback to respond to\n * @param response - Response content\n * @param responseUri - Optional URI to off-chain response file\n * @returns Response result\n *\n * @example\n * ```ts\n * // Agent responds to feedback\n * const result = await erc8004.appendResponse(\n * 'ethereum',\n * 42,\n * 1,\n * 'Thank you for your feedback! We have addressed the issue.',\n * );\n * ```\n */\n async appendResponse(\n network: Erc8004Network,\n agentId: AgentId,\n feedbackIndex: number,\n response: string,\n options?: { responseUri?: string; sealHash?: string }\n ): Promise<FeedbackResponse> {\n const url = `${this.baseUrl}/feedback/response`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const payload: Record<string, unknown> = {\n x402Version: 1,\n network: wireNetwork(network),\n agentId,\n feedbackIndex,\n response,\n };\n if (options?.responseUri) {\n payload.responseUri = options.responseUri;\n }\n if (options?.sealHash) {\n payload.sealHash = options.sealHash;\n }\n\n try {\n const fetchResponse = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!fetchResponse.ok) {\n const errorText = await fetchResponse.text();\n return {\n success: false,\n error: `Facilitator error: ${fetchResponse.status} - ${errorText}`,\n network,\n };\n }\n\n return await fetchResponse.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network,\n };\n }\n }\n\n /**\n * Register an agent on the Identity Registry (idempotent)\n *\n * If the recipient already owns an agent on the target network, returns the\n * existing one instead of minting a duplicate. The facilitator pays gas fees.\n * Optionally transfer the NFT to a recipient address (gasless delegation).\n *\n * @param request - Registration request\n * @returns Registration response with agent ID and transaction hash\n *\n * @example\n * ```ts\n * // Register agent owned by facilitator\n * const result = await client.registerAgent({\n * x402Version: 1,\n * network: 'ethereum',\n * agentUri: 'ipfs://QmYourAgentFile',\n * });\n * console.log(`Agent #${result.agentId} registered`);\n *\n * // Register agent and transfer to user\n * const result = await client.registerAgent({\n * x402Version: 1,\n * network: 'ethereum',\n * agentUri: 'ipfs://QmYourAgentFile',\n * recipient: '0xUserAddress...',\n * });\n * console.log(`Agent #${result.agentId} transferred to user`);\n * ```\n */\n async registerAgent(\n request: RegisterAgentRequest,\n options?: { asyncTransport?: boolean; pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<RegisterAgentResponse> {\n // asyncTransport changes how the wait is carried out, not what comes back.\n // The synchronous call holds one HTTP request open for the whole mint, which\n // on a congested chain outlives proxy timeouts; each poll here is short, so\n // nothing in the path can time out ambiguously.\n if (options?.asyncTransport) {\n const job = await this.registerAgentAsync(request);\n const terminal = await this.waitForRegistration(job.jobId, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n return jobToRegisterResponse(terminal, request.network);\n }\n\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n // The facilitator answers 4xx with a structured RegisterAgentResponse,\n // and on 409 - a registration for this agent is ALREADY IN FLIGHT -\n // that body carries the agent id and tx of the run already underway,\n // plus an explicit \"poll GET /register/status/{jobId}\" hint.\n //\n // Flattening it into a bare string threw away the only thing that lets\n // a caller resolve instead of re-POSTing, and re-POSTing a mint is\n // exactly how duplicate agents get created. Keep the body.\n try {\n const parsed = JSON.parse(errorText) as RegisterAgentResponse;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return {\n ...parsed,\n // Never let a 4xx body claim success, whatever it says.\n success: false,\n error: parsed.error ?? `Facilitator error: ${response.status}`,\n network: parsed.network ?? request.network,\n };\n }\n } catch {\n // Not JSON - fall through to the flattened error.\n }\n return {\n success: false,\n error: `Facilitator error: ${response.status} - ${errorText}`,\n network: request.network,\n };\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n network: request.network,\n };\n }\n }\n\n /**\n * Start a registration without waiting for the chain to confirm it.\n *\n * Registration waits on a mint receipt, which on a congested chain outlives\n * client and proxy timeouts. A timed-out synchronous call is genuinely\n * ambiguous — the mint may well have landed — and retrying it is how five\n * duplicate agents once got minted. This returns immediately with a job id\n * instead; poll {@link getRegisterStatus} or use {@link waitForRegistration}.\n *\n * On Solana, `recipient` is a base58 address: the facilitator mints,\n * initializes the ATOM stats and transfers, paying every fee.\n */\n async registerAgentAsync(request: RegisterAgentRequest): Promise<RegisterJobResponse> {\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Prefer': 'respond-async',\n },\n body: JSON.stringify({ ...request, network: wireNetwork(request.network) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Read the current state of an asynchronous registration.\n *\n * Throws {@link Erc8004LookupError} with `notFound` when the job is unknown or\n * has aged out — terminal jobs are kept for one hour.\n */\n async getRegisterStatus(jobId: string): Promise<RegisterJobResponse> {\n const url = `${this.baseUrl}/register/status/${encodeURIComponent(jobId)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Erc8004LookupError(\n `ERC-8004 API error: ${response.status} - ${errorText}`,\n response.status,\n errorText,\n );\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Poll an asynchronous registration until it finishes.\n *\n * Rejects on timeout rather than resolving with the last non-terminal status,\n * so \"still pending\" is never mistaken for \"did not happen\": the mint may\n * still land afterwards, and treating a timeout as failure is what leads to\n * registering the same agent twice. Keep the job id and poll again rather\n * than re-registering.\n */\n async waitForRegistration(\n jobId: string,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<RegisterJobResponse> {\n const pollIntervalMs = options?.pollIntervalMs ?? 2000;\n const timeoutMs = options?.timeoutMs ?? 300_000;\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n const job = await this.getRegisterStatus(jobId);\n if (isRegisterJobTerminal(job)) {\n return job;\n }\n if (Date.now() >= deadline) {\n throw new RegistrationPendingError(jobId, job.status, timeoutMs);\n }\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n }\n\n /**\n * Get registration endpoint metadata\n *\n * @returns Endpoint information for POST /register\n */\n async getRegisterInfo(): Promise<Record<string, unknown>> {\n const url = `${this.baseUrl}/register`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get a specific metadata entry for an agent\n *\n * @param network - Network where agent is registered\n * @param agentId - Agent's tokenId\n * @param key - Metadata key to retrieve\n * @returns Metadata value (hex-encoded and UTF-8 decoded if possible)\n */\n async getIdentityMetadata(\n network: Erc8004Network,\n agentId: AgentId,\n key: string,\n ): Promise<IdentityMetadataResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/${agentId}/metadata/${encodeURIComponent(key)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Get total number of registered agents on a network\n *\n * @param network - Network to query\n * @returns Total supply count\n */\n async getIdentityTotalSupply(network: Erc8004Network): Promise<IdentityTotalSupplyResponse> {\n const url = `${this.baseUrl}/identity/${wireNetwork(network)}/total-supply`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ERC-8004 API error: ${response.status} - ${errorText}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\n/**\n * Build payment requirements with ERC-8004 extension\n *\n * Adds the 8004-reputation extension to include proof of payment\n * in settlement responses for reputation submission.\n *\n * @param options - Base payment requirements options\n * @returns Payment requirements with ERC-8004 extension\n *\n * @example\n * ```ts\n * const requirements = buildErc8004PaymentRequirements({\n * amount: '1.00',\n * recipient: '0x...',\n * resource: 'https://api.example.com/service',\n * chainName: 'ethereum',\n * });\n *\n * // Settlement will include proofOfPayment\n * const result = await facilitator.settle(payment, requirements);\n * console.log(result.proofOfPayment);\n * ```\n */\nexport function buildErc8004PaymentRequirements(\n options: PaymentRequirementsOptions\n): PaymentRequirements & { extra: { '8004-reputation': { includeProof: boolean } } } {\n const base = buildPaymentRequirements(options);\n return {\n ...base,\n extra: {\n [ERC8004_EXTENSION_ID]: {\n includeProof: true,\n },\n },\n };\n}\n\n// ============================================================================\n// ADVANCED ESCROW (PaymentOperator - On-Chain Escrow)\n// ============================================================================\n//\n// The 5 Advanced Escrow flows via the PaymentOperator contract:\n// 1. AUTHORIZE - Lock funds in escrow (via facilitator)\n// 2. RELEASE - Capture escrowed funds to receiver (on-chain)\n// 3. REFUND IN ESCROW - Return escrowed funds to payer (on-chain)\n// 4. CHARGE - Direct instant payment without escrow (on-chain)\n// 5. REFUND POST ESCROW - Dispute refund after release (on-chain)\n//\n// Contract mapping:\n// operator.authorize() -> escrow.authorize() (lock funds)\n// operator.release() -> escrow.capture() (pay receiver)\n// operator.refundInEscrow() -> escrow.partialVoid() (refund payer)\n// operator.charge() -> escrow.charge() (direct payment)\n// operator.refundPostEscrow() -> escrow.refund() (dispute refund)\n// ============================================================================\n\n/**\n * PAYMENT_INFO_TYPEHASH used for nonce computation.\n * Must match the on-chain AuthCaptureEscrow contract.\n */\nexport const PAYMENT_INFO_TYPEHASH =\n '0xae68ac7ce30c86ece8196b61a7c486d8f0061f575037fbd34e7fe4e2820c6591';\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n/**\n * Contract deposit limit (enforced by PaymentOperator condition).\n * As of 2026-02-03, commerce-payments contracts enforce $100 max per deposit.\n */\nexport const DEPOSIT_LIMIT_USDC = '100000000'; // $100 in atomic units (6 decimals)\n\n/**\n * Default facilitator request timeout per chain in milliseconds.\n * Ethereum L1 (~12s blocks) needs much longer than L2s (~2s blocks).\n * Timeout chain: Client > SDK > Facilitator. The facilitator uses 900s for Ethereum L1.\n */\nexport const ESCROW_TIMEOUT_MS: Record<number, number> = {\n 1: 960_000, // Ethereum L1: 960s (facilitator uses 900s TxWatcher)\n 11155111: 960_000, // Ethereum Sepolia: same as L1\n 137: 90_000, // Polygon: 90s\n 8453: 90_000, // Base: 90s\n 84532: 90_000, // Base Sepolia: 90s\n 42161: 90_000, // Arbitrum: 90s\n 10: 90_000, // Optimism: 90s\n 43114: 90_000, // Avalanche: 90s\n 42220: 90_000, // Celo: 90s\n 143: 90_000, // Monad: 90s\n};\n\n/** Default timeout when chain is not in ESCROW_TIMEOUT_MS */\nconst DEFAULT_ESCROW_TIMEOUT_MS = 30_000;\n\n/**\n * USDC EIP-712 domain name per chain.\n * Most chains use \"USD Coin\", but some (Celo, Monad, HyperEVM) use \"USDC\".\n * This must match the on-chain token's name() for EIP-712 signing to work.\n */\nexport const USDC_DOMAIN_NAME: Record<number, string> = {\n 8453: 'USD Coin', // Base Mainnet\n 84532: 'USD Coin', // Base Sepolia\n 1: 'USD Coin', // Ethereum Mainnet\n 11155111: 'USD Coin', // Ethereum Sepolia\n 137: 'USD Coin', // Polygon\n 42161: 'USD Coin', // Arbitrum\n 43114: 'USD Coin', // Avalanche\n 42220: 'USDC', // Celo\n 143: 'USDC', // Monad\n};\n\n/**\n * Multi-chain escrow contract addresses for the Advanced Escrow system.\n * Keyed by EVM chain ID. Source: x402r-sdk A1igator/multichain-config deployment.\n */\nexport const ESCROW_CONTRACTS: Record<number, AdvancedEscrowContracts> = {\n // Base Sepolia (testnet, chain 84532)\n 84532: {\n operator: '0x97d53e63A9CB97556c00BeFd325AF810c9b267B2',\n escrow: '0x29025c0E9D4239d438e169570818dB9FE0A80873',\n tokenCollector: '0x5cA789000070DF15b4663DB64a50AeF5D49c5Ee0',\n protocolFeeConfig: '0x8F96C493bAC365E41f0315cf45830069EBbDCaCe',\n refundRequest: '0x1C2Ab244aC8bDdDB74d43389FF34B118aF2E90F4',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n },\n // Base Mainnet (chain 8453)\n 8453: {\n operator: '0x3D0837fF8Ea36F417261577b9BA568400A840260',\n escrow: '0xb9488351E48b23D798f24e8174514F28B741Eb4f',\n tokenCollector: '0x48ADf6E37F9b31dC2AAD0462C5862B5422C736B8',\n protocolFeeConfig: '0x59314674BAbb1a24Eb2704468a9cCdD50668a1C6',\n refundRequest: '0x35fb2EFEfAc3Ee9f6E52A9AAE5C9655bC08dEc00',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n // Ethereum Sepolia (testnet, chain 11155111)\n 11155111: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n // Ethereum Mainnet (chain 1) - Updated from Ali's redeploy (commit e6cf29d)\n 1: {\n operator: '0x69B67962ffb7c5C7078ff348a87DF604dfA8001b',\n escrow: '0x9D4146EF898c8E60B3e865AE254ef438E7cEd2A0',\n tokenCollector: '0x206D4DbB6E7b876e4B5EFAAD2a04e7d7813FB6ba',\n protocolFeeConfig: '0x5b3e33791C1764cF7e2573Bf8116F1D361FD97Cd',\n refundRequest: '0xFa8C4Cb156053b867Ae7489220A29b5939E3Df70',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n // Polygon (chain 137)\n 137: {\n operator: '0xb33D6502EdBbC47201cd1E53C49d703EC0a660b8',\n escrow: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n tokenCollector: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n protocolFeeConfig: '0xE78648e7af7B1BaDE717FF6E410B922F92adE80f',\n refundRequest: '0xed02d3E5167BCc9582D851885A89b050AB816a56',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n },\n // Arbitrum (chain 42161)\n 42161: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n },\n // Celo (chain 42220)\n 42220: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\n },\n // Monad (chain 143)\n 143: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x754704Bc059F8C67012fEd69BC8a327a5aafb603',\n },\n // Avalanche (chain 43114)\n 43114: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n },\n // Optimism (chain 10)\n 10: {\n operator: '0x32d6AC59BCe8DFB3026F10BcaDB8D00AB218f5b6',\n escrow: '0x320a3c35F131E5D2Fb36af56345726B298936037',\n tokenCollector: '0x230fd3A171750FA45db2976121376b7F47Cba308',\n protocolFeeConfig: '0xD979dBfBdA5f4b16AAF60Eaab32A44f352076838',\n refundRequest: '0xc1256Bb30bd0cdDa07D8C8Cf67a59105f2EA1b98',\n usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n },\n // SKALE Base (chain 1187947933) - CREATE3 deployment, operator via factory\n 1187947933: {\n operator: '0x28c23AE8f55aDe5Ea10a5353FC40418D0c1B3d33',\n escrow: '0xBC151792f80C0EB1973d56b0235e6bee2A60e245',\n tokenCollector: '0x9A12A116a44636F55c9e135189A1321Abcfe2f30',\n protocolFeeConfig: '0xf62788834C99B2E85a6891C0b46D1EB996f8f596',\n refundRequest: '0x69e9BF2b40Ed472b55E47e9D4205d93Ed673093F',\n usdc: '0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20',\n },\n};\n\n/**\n * Base Mainnet contract addresses for the Advanced Escrow system.\n * @deprecated Use ESCROW_CONTRACTS[8453] or getEscrowContractsByChainId(8453) instead.\n */\nexport const BASE_MAINNET_CONTRACTS: AdvancedEscrowContracts = ESCROW_CONTRACTS[8453];\n\n/**\n * Get escrow contract addresses for a given chain ID.\n *\n * @param chainId - EVM chain ID (e.g., 8453 for Base, 1 for Ethereum)\n * @returns Contract addresses or undefined if chain is not supported\n */\nexport function getEscrowContractsByChainId(chainId: number): AdvancedEscrowContracts | undefined {\n return ESCROW_CONTRACTS[chainId];\n}\n\n/**\n * Get all chain IDs that have escrow contracts deployed.\n *\n * @returns Array of chain IDs with escrow support\n */\nexport function getEscrowSupportedChainIds(): number[] {\n return Object.keys(ESCROW_CONTRACTS).map(Number);\n}\n\n/**\n * Check if escrow contracts are deployed on a given chain.\n *\n * @param chainId - EVM chain ID\n * @returns True if escrow is supported on this chain\n */\nexport function isEscrowSupportedOnChain(chainId: number): boolean {\n return chainId in ESCROW_CONTRACTS;\n}\n\n/**\n * Task tiers determine timing parameters for escrow operations.\n */\nexport type AdvancedEscrowTaskTier = 'micro' | 'standard' | 'premium' | 'enterprise';\n\n/**\n * Timing configuration per task tier (in seconds).\n */\nexport const TIER_TIMINGS: Record<AdvancedEscrowTaskTier, { pre: number; auth: number; refund: number }> = {\n micro: { pre: 3600, auth: 7200, refund: 86400 },\n standard: { pre: 7200, auth: 86400, refund: 604800 },\n premium: { pre: 14400, auth: 172800, refund: 1209600 },\n enterprise: { pre: 86400, auth: 604800, refund: 2592000 },\n};\n\n/**\n * PaymentInfo struct matching the on-chain PaymentOperator contract.\n */\nexport interface AdvancedPaymentInfo {\n operator: string;\n receiver: string;\n token: string;\n maxAmount: string;\n preApprovalExpiry: number;\n authorizationExpiry: number;\n refundExpiry: number;\n minFeeBps: number;\n maxFeeBps: number;\n feeReceiver: string;\n salt: string;\n}\n\n/**\n * Result of an AUTHORIZE operation.\n */\nexport interface AdvancedAuthorizationResult {\n success: boolean;\n transactionHash?: string;\n paymentInfo?: AdvancedPaymentInfo;\n salt?: string;\n error?: string;\n}\n\n/**\n * Result of an on-chain transaction (release, refund, charge).\n */\nexport interface AdvancedTransactionResult {\n success: boolean;\n transactionHash?: string;\n gasUsed?: number;\n error?: string;\n}\n\n/**\n * Response from the facilitator's /escrow/state endpoint.\n * Represents the on-chain state of an escrow for a given paymentInfo + payer.\n */\nexport interface EscrowStateResponse {\n /** Whether the payment has already been collected (released) */\n hasCollectedPayment: boolean;\n /** Amount that can still be captured/released (in atomic units) */\n capturableAmount: string;\n /** Amount that can still be refunded to the payer (in atomic units) */\n refundableAmount: string;\n /** Keccak256 hash of the paymentInfo struct */\n paymentInfoHash: string;\n /** Network in CAIP-2 format (e.g., \"eip155:8453\") */\n network: string;\n}\n\n/**\n * Contract addresses configuration for AdvancedEscrowClient.\n *\n * Maps to the on-chain x402r escrow contracts:\n * - operator: PaymentOperatorFactory\n * - escrow: AuthCaptureEscrow\n * - tokenCollector: TokenCollector\n * - protocolFeeConfig: ProtocolFeeConfig\n * - refundRequest: RefundRequest\n * - usdc: USDC token contract\n */\nexport interface AdvancedEscrowContracts {\n /** PaymentOperatorFactory contract address */\n operator: string;\n /** AuthCaptureEscrow contract address */\n escrow: string;\n /** TokenCollector contract address */\n tokenCollector: string;\n /** ProtocolFeeConfig contract address */\n protocolFeeConfig: string;\n /** RefundRequest contract address */\n refundRequest: string;\n /** USDC token contract address */\n usdc: string;\n}\n\n/**\n * Configuration options for AdvancedEscrowClient.\n */\nexport interface AdvancedEscrowClientOptions {\n /** Facilitator URL for AUTHORIZE operations */\n facilitatorUrl?: string;\n /** JSON-RPC URL for on-chain operations (required when using SigningWalletAdapter) */\n rpcUrl?: string;\n /**\n * Chain ID (default: 8453 for Base Mainnet).\n * Supported chains: 8453 (Base), 84532 (Base Sepolia), 1 (Ethereum),\n * 11155111 (Ethereum Sepolia), 137 (Polygon), 42161 (Arbitrum),\n * 10 (Optimism), 42220 (Celo), 143 (Monad), 43114 (Avalanche).\n */\n chainId?: number;\n /** Contract addresses (auto-resolved from chainId if not provided) */\n contracts?: AdvancedEscrowContracts;\n /** Gas limit for transactions (default: 300000) */\n gasLimit?: number;\n /**\n * Request timeout in milliseconds for facilitator HTTP calls (authorize, gasless release/refund).\n * Default is per-network: 960s for Ethereum L1, 90s for L2s.\n * Ethereum L1 confirmations can take several minutes under congestion.\n */\n timeout?: number;\n /**\n * SigningWalletAdapter for OWS wallet signing (v2.36.0+).\n *\n * When provided, the client uses the adapter for all signing operations\n * instead of requiring a raw ethers.Signer. The first constructor argument\n * is ignored when `wallet` is set.\n *\n * Requires `rpcUrl` to be set for on-chain transaction building.\n *\n * @example\n * ```typescript\n * import { OWSWalletAdapter, AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, {\n * wallet,\n * rpcUrl: 'https://mainnet.base.org',\n * chainId: 8453,\n * });\n * ```\n */\n wallet?: import('../wallet').SigningWalletAdapter;\n}\n\n/**\n * Minimal PaymentOperator ABI for the 4 on-chain functions.\n * (AUTHORIZE goes through the facilitator, not directly on-chain)\n */\nexport const OPERATOR_ABI = [\n 'function release(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount)',\n 'function refundInEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint120 amount)',\n 'function charge(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n 'function refundPostEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n];\n\n/**\n * CREATE3-deployed operators (SKALE, future chains) use updated ABI with extra `bytes data` param\n * on release() and refundInEscrow(). Pass empty bytes (0x) for the data parameter.\n */\nexport const OPERATOR_ABI_CREATE3 = [\n 'function release(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, bytes data)',\n 'function refundInEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint120 amount, bytes data)',\n 'function charge(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n 'function refundPostEscrow(tuple(address operator, address payer, address receiver, address token, uint120 maxAmount, uint48 preApprovalExpiry, uint48 authorizationExpiry, uint48 refundExpiry, uint16 minFeeBps, uint16 maxFeeBps, address feeReceiver, uint256 salt) paymentInfo, uint256 amount, address tokenCollector, bytes collectorData)',\n];\n\n/** Chain IDs using CREATE3-deployed operators with updated ABI */\nconst CREATE3_CHAIN_IDS = new Set([1187947933]);\n\n/**\n * AdvancedEscrowClient provides the 5 Advanced Escrow flows via the\n * PaymentOperator contract on 9 supported EVM networks.\n *\n * Supported chains: Base (8453), Base Sepolia (84532), Ethereum (1),\n * Ethereum Sepolia (11155111), Polygon (137), Arbitrum (42161),\n * Optimism (10), Celo (42220), Monad (143), Avalanche (43114).\n *\n * Contract addresses are auto-resolved from the chain ID.\n * Pass custom contracts to override.\n *\n * Two signer modes (v2.36.0+):\n * - **Legacy**: Pass an ethers.Signer as the first argument.\n * - **OWS Wallet**: Pass a SigningWalletAdapter via `options.wallet`.\n * The adapter signs transactions offline (no raw private key needed).\n * Requires `rpcUrl` for transaction building and broadcast.\n *\n * @example Legacy mode (ethers.Signer)\n * ```typescript\n * import { ethers } from 'ethers';\n * import { AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');\n * const signer = new ethers.Wallet(process.env.KEY!, provider);\n * const client = new AdvancedEscrowClient(signer, { chainId: 8453 });\n * ```\n *\n * @example OWS Wallet mode (SigningWalletAdapter)\n * ```typescript\n * import { OWSWalletAdapter } from 'uvd-x402-sdk';\n * import { AdvancedEscrowClient } from 'uvd-x402-sdk/backend';\n *\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, {\n * wallet,\n * rpcUrl: 'https://mainnet.base.org',\n * chainId: 8453,\n * });\n * await client.init();\n *\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * const auth = await client.authorize(pi);\n * const release = await client.release(pi);\n * ```\n */\nexport class AdvancedEscrowClient {\n private facilitatorUrl: string;\n private chainId: number;\n private gasLimit: number;\n private readonly timeout: number;\n private contracts: AdvancedEscrowContracts;\n private signer: any; // ethers.Signer (legacy mode)\n private walletAdapter: import('../wallet').SigningWalletAdapter | null; // OWS mode (v2.36.0+)\n private rpcUrl: string | undefined;\n private payerAddress: string = '';\n\n /**\n * Create an AdvancedEscrowClient.\n *\n * Two modes of operation:\n *\n * 1. **Legacy (ethers.Signer)**: Pass an ethers Signer as the first argument.\n * ```ts\n * const client = new AdvancedEscrowClient(signer, { rpcUrl, chainId });\n * ```\n *\n * 2. **OWS Wallet (SigningWalletAdapter)**: Pass `wallet` in options. The\n * first argument is ignored (pass `null`). Requires `rpcUrl` for on-chain\n * transaction building and broadcast.\n * ```ts\n * const wallet = new OWSWalletAdapter(owsWallet);\n * const client = new AdvancedEscrowClient(null, { wallet, rpcUrl, chainId });\n * ```\n *\n * @param signer - ethers.Signer instance (ignored when options.wallet is set)\n * @param options - Configuration options\n */\n constructor(signer: any, options: AdvancedEscrowClientOptions = {}) {\n this.walletAdapter = options.wallet || null;\n this.signer = this.walletAdapter ? null : signer;\n this.rpcUrl = options.rpcUrl;\n this.facilitatorUrl = (options.facilitatorUrl || 'https://facilitator.ultravioletadao.xyz').replace(/\\/$/, '');\n this.chainId = options.chainId || 8453;\n this.gasLimit = options.gasLimit || 300000;\n this.timeout = options.timeout || ESCROW_TIMEOUT_MS[this.chainId] || DEFAULT_ESCROW_TIMEOUT_MS;\n\n if (this.walletAdapter && !this.rpcUrl) {\n throw new Error(\n 'AdvancedEscrowClient: rpcUrl is required when using a SigningWalletAdapter. ' +\n 'The adapter signs transactions offline; an RPC provider is needed to build ' +\n 'and broadcast them.'\n );\n }\n\n if (options.contracts) {\n this.contracts = options.contracts;\n } else {\n const resolved = ESCROW_CONTRACTS[this.chainId];\n if (!resolved) {\n throw new Error(\n `No escrow contracts found for chain ID ${this.chainId}. ` +\n `Supported chains: ${getEscrowSupportedChainIds().join(', ')}. ` +\n `Pass custom contracts via options.contracts to use an unsupported chain.`\n );\n }\n this.contracts = resolved;\n }\n }\n\n /**\n * Initialize the client (resolves payer address).\n * Call this before using any methods.\n */\n async init(): Promise<void> {\n if (this.walletAdapter) {\n this.payerAddress = this.walletAdapter.getAddress();\n } else {\n this.payerAddress = await this.signer.getAddress();\n }\n }\n\n /**\n * Build a PaymentInfo struct with appropriate timing for the task tier.\n *\n * @param receiver - Worker's wallet address\n * @param amount - Amount in token atomic units (e.g., '5000000' for $5 USDC)\n * @param tier - Task tier determines timing parameters\n * @param salt - Random salt (auto-generated if not provided)\n */\n buildPaymentInfo(\n receiver: string,\n amount: string,\n tier: AdvancedEscrowTaskTier = 'standard',\n salt?: string,\n opts?: { deadline?: number; reviewWindowSec?: number },\n ): AdvancedPaymentInfo {\n const now = Math.floor(Date.now() / 1000);\n const t = TIER_TIMINGS[tier];\n // The release window must outlast the REVIEW, not just the tier. `micro`\n // alone gives two hours; a buyer approving later gets\n // `AfterAuthorizationExpiry` on-chain — the release reverts, the worker is\n // not paid, and only the payer's `reclaim()` can move the funds. Measured in\n // production 2026-08-19: a release attempted 26.2 HOURS past expiry, 8\n // escrows stuck on one network in 24h.\n //\n // buildEscrowPreAuth — the other escrow path in this same SDK — already\n // floors both windows this way and says why. This path never got the memo,\n // and it is the one the marketplace documents as recommended.\n const reviewWindow = opts?.reviewWindowSec ?? REVIEW_WINDOW_SEC;\n const reviewBase = Math.max(now, opts?.deadline ?? now);\n const authorizationExpiry = Math.max(now + t.auth, reviewBase + reviewWindow);\n const refundExpiry = Math.max(now + t.refund, authorizationExpiry + REFUND_WINDOW_SEC);\n // Use crypto-safe randomness (Node.js crypto or Web Crypto API)\n let generatedSalt = salt;\n if (!generatedSalt) {\n const bytes = new Uint8Array(32);\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n // Node.js fallback\n const nodeCrypto = require('crypto');\n const buf = nodeCrypto.randomBytes(32);\n bytes.set(new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength));\n }\n generatedSalt = '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n\n return {\n operator: this.contracts.operator,\n receiver,\n token: this.contracts.usdc,\n maxAmount: amount,\n preApprovalExpiry: now + t.pre,\n authorizationExpiry,\n refundExpiry,\n minFeeBps: 0,\n maxFeeBps: 800,\n feeReceiver: this.contracts.operator,\n salt: generatedSalt,\n };\n }\n\n /**\n * Compute the correct nonce (with PAYMENT_INFO_TYPEHASH).\n * Matches the on-chain AuthCaptureEscrow nonce derivation.\n */\n private async computeNonce(paymentInfo: AdvancedPaymentInfo): Promise<string> {\n // Dynamic import of ethers to avoid hard dependency at module level\n const { ethers } = await import('ethers');\n\n const piTuple = ethers.AbiCoder.defaultAbiCoder().encode(\n ['bytes32', 'tuple(address,address,address,address,uint120,uint48,uint48,uint48,uint16,uint16,address,uint256)'],\n [\n PAYMENT_INFO_TYPEHASH,\n [\n paymentInfo.operator,\n ZERO_ADDRESS, // payer = 0 for payer-agnostic hash\n paymentInfo.receiver,\n paymentInfo.token,\n paymentInfo.maxAmount,\n paymentInfo.preApprovalExpiry,\n paymentInfo.authorizationExpiry,\n paymentInfo.refundExpiry,\n paymentInfo.minFeeBps,\n paymentInfo.maxFeeBps,\n paymentInfo.feeReceiver,\n paymentInfo.salt,\n ],\n ],\n );\n const piHash = ethers.keccak256(piTuple);\n\n const finalEncoded = ethers.AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'address', 'bytes32'],\n [this.chainId, this.contracts.escrow, piHash],\n );\n return ethers.keccak256(finalEncoded);\n }\n\n /**\n * Sign ReceiveWithAuthorization for ERC-3009.\n *\n * Uses SigningWalletAdapter.signTypedData() when in OWS mode,\n * or ethers Signer.signTypedData() in legacy mode.\n */\n private async signErc3009(auth: Record<string, string>): Promise<string> {\n const domain = {\n name: USDC_DOMAIN_NAME[this.chainId] || 'USD Coin',\n version: '2',\n chainId: this.chainId,\n verifyingContract: this.contracts.usdc,\n };\n\n const types = {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n const message = {\n from: auth.from,\n to: auth.to,\n value: auth.value,\n validAfter: auth.validAfter,\n validBefore: auth.validBefore,\n nonce: auth.nonce,\n };\n\n // OWS wallet adapter mode: serialize to JSON and use adapter.signTypedData()\n if (this.walletAdapter) {\n const typedData = JSON.stringify({\n domain,\n types,\n primaryType: 'ReceiveWithAuthorization',\n message,\n });\n const result = await this.walletAdapter.signTypedData(typedData);\n return result.signature;\n }\n\n // Legacy ethers.Signer mode\n return this.signer.signTypedData(domain, types, message);\n }\n\n /**\n * Build the on-chain PaymentInfo tuple for contract calls.\n */\n private buildTuple(pi: AdvancedPaymentInfo): any[] {\n return [\n pi.operator,\n this.payerAddress,\n pi.receiver,\n pi.token,\n pi.maxAmount,\n pi.preApprovalExpiry,\n pi.authorizationExpiry,\n pi.refundExpiry,\n pi.minFeeBps,\n pi.maxFeeBps,\n pi.feeReceiver,\n pi.salt,\n ];\n }\n\n /**\n * AUTHORIZE: Lock funds in escrow via the facilitator.\n *\n * Sends an ERC-3009 ReceiveWithAuthorization to the facilitator,\n * which calls PaymentOperator.authorize() on-chain.\n */\n async authorize(paymentInfo: AdvancedPaymentInfo): Promise<AdvancedAuthorizationResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const nonce = await this.computeNonce(paymentInfo);\n\n const auth = {\n from: this.payerAddress,\n to: this.contracts.tokenCollector,\n value: paymentInfo.maxAmount,\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce,\n };\n const signature = await this.signErc3009(auth);\n\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n payload: {\n authorization: auth,\n signature,\n paymentInfo: paymentInfo,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n maxAmountRequired: paymentInfo.maxAmount,\n asset: this.contracts.usdc,\n payTo: paymentInfo.receiver,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction,\n paymentInfo,\n salt: paymentInfo.salt,\n };\n }\n return { success: false, error: result.errorReason };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.capturableAmount && BigInt(state.capturableAmount) > 0n) {\n return {\n success: true,\n paymentInfo,\n salt: paymentInfo.salt,\n };\n }\n } catch { /* fallback query failed, report original timeout */ }\n return { success: false, error: `Authorize timed out after ${this.timeout}ms. On-chain state could not confirm escrow lock.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * RELEASE: Capture escrowed funds to receiver (worker gets paid).\n *\n * Calls PaymentOperator.release() -> escrow.capture()\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to release (defaults to maxAmount)\n */\n async release(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const isCreate3 = CREATE3_CHAIN_IDS.has(this.chainId);\n const abi = isCreate3 ? OPERATOR_ABI_CREATE3 : OPERATOR_ABI;\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode: build unsigned TX, sign via adapter, broadcast\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, abi, (iface) => {\n return isCreate3\n ? iface.encodeFunctionData('release', [tuple, amt, '0x'])\n : iface.encodeFunctionData('release', [tuple, amt]);\n });\n }\n\n // Legacy ethers.Signer mode: contract sends directly\n const contract = new ethers.Contract(this.contracts.operator, abi, this.signer);\n const tx = isCreate3\n ? await contract.release(tuple, amt, '0x', { gasLimit: this.gasLimit })\n : await contract.release(tuple, amt, { gasLimit: this.gasLimit });\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * REFUND IN ESCROW: Return escrowed funds to payer (cancel task).\n *\n * Calls PaymentOperator.refundInEscrow() -> escrow.partialVoid()\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to refund (defaults to maxAmount)\n */\n async refundInEscrow(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const isCreate3 = CREATE3_CHAIN_IDS.has(this.chainId);\n const abi = isCreate3 ? OPERATOR_ABI_CREATE3 : OPERATOR_ABI;\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode: build unsigned TX, sign via adapter, broadcast\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, abi, (iface) => {\n return isCreate3\n ? iface.encodeFunctionData('refundInEscrow', [tuple, amt, '0x'])\n : iface.encodeFunctionData('refundInEscrow', [tuple, amt]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, abi, this.signer);\n const tx = isCreate3\n ? await contract.refundInEscrow(tuple, amt, '0x', { gasLimit: this.gasLimit })\n : await contract.refundInEscrow(tuple, amt, { gasLimit: this.gasLimit });\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n // ==========================================================================\n // GASLESS FACILITATOR METHODS\n // ==========================================================================\n\n /**\n * GASLESS RELEASE: Release escrowed funds via the facilitator.\n *\n * Instead of calling the PaymentOperator contract directly (which requires\n * gas), this sends a release request to the facilitator, which submits\n * the transaction on your behalf.\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to release in atomic units (defaults to maxAmount)\n * @returns Transaction result from the facilitator\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n * // Worker completes task...\n * const result = await client.releaseViaFacilitator(pi);\n * console.log(result.transactionHash);\n * ```\n */\n async releaseViaFacilitator(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n action: 'release',\n payload: {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n amount: amount || paymentInfo.maxAmount,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction || result.transactionHash || result.transaction_hash,\n };\n }\n // Parity with the Python SDK (2026-08-22): a last-resort message that\n // says only \"Release failed\" is the same dead end as an empty string —\n // name the status and what the body DID carry so the caller has a\n // thread to pull. Divergence between the two SDKs is exactly what let\n // the escrow-window bug live in one of them for weeks.\n return {\n success: false,\n error:\n result.errorReason ||\n result.error ||\n `Release refused with no reason (HTTP ${response.status}, body keys: ${Object.keys(result ?? {}).sort().join(', ') || 'none'})`,\n };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.capturableAmount === '0' && state.hasCollectedPayment) {\n return { success: true };\n }\n } catch { /* fallback query failed */ }\n return { success: false, error: `Gasless release timed out after ${this.timeout}ms. Check escrow state on-chain.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * GASLESS REFUND: Refund escrowed funds via the facilitator.\n *\n * Instead of calling the PaymentOperator contract directly (which requires\n * gas), this sends a refundInEscrow request to the facilitator, which\n * submits the transaction on your behalf.\n *\n * @param paymentInfo - PaymentInfo from the authorize step\n * @param amount - Amount to refund in atomic units (defaults to maxAmount)\n * @returns Transaction result from the facilitator\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n * // Task cancelled...\n * const result = await client.refundViaFacilitator(pi);\n * console.log(result.transactionHash);\n * ```\n */\n async refundViaFacilitator(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const payload = {\n x402Version: 2,\n scheme: 'escrow',\n action: 'refundInEscrow',\n payload: {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n amount: amount || paymentInfo.maxAmount,\n },\n paymentRequirements: {\n scheme: 'escrow',\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n },\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.facilitatorUrl}/settle`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n const result = await response.json();\n\n if (result.success) {\n return {\n success: true,\n transactionHash: result.transaction || result.transactionHash || result.transaction_hash,\n };\n }\n return { success: false, error: result.errorReason || result.error || 'Refund failed' };\n } catch (fetchErr: any) {\n clearTimeout(timeoutId);\n\n // On timeout, check on-chain state as fallback\n if (fetchErr.name === 'AbortError') {\n try {\n const state = await this.queryEscrowState(paymentInfo);\n if (state.refundableAmount === '0') {\n return { success: true };\n }\n } catch { /* fallback query failed */ }\n return { success: false, error: `Gasless refund timed out after ${this.timeout}ms. Check escrow state on-chain.` };\n }\n throw fetchErr;\n }\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * QUERY ESCROW STATE: Read on-chain escrow state via the facilitator.\n *\n * This is a read-only operation that queries the facilitator for the\n * current escrow state without requiring gas or a signer.\n *\n * @param paymentInfo - PaymentInfo to query state for\n * @returns Escrow state including capturable/refundable amounts\n *\n * @example\n * ```typescript\n * const pi = client.buildPaymentInfo('0xWorker...', '5000000', 'standard');\n * await client.authorize(pi);\n *\n * const state = await client.queryEscrowState(pi);\n * console.log(`Capturable: ${state.capturableAmount}`);\n * console.log(`Refundable: ${state.refundableAmount}`);\n * console.log(`Already collected: ${state.hasCollectedPayment}`);\n * ```\n */\n async queryEscrowState(paymentInfo: AdvancedPaymentInfo): Promise<EscrowStateResponse> {\n if (!this.payerAddress) await this.init();\n\n const payload = {\n paymentInfo: {\n operator: paymentInfo.operator,\n receiver: paymentInfo.receiver,\n token: paymentInfo.token,\n maxAmount: paymentInfo.maxAmount,\n preApprovalExpiry: paymentInfo.preApprovalExpiry,\n authorizationExpiry: paymentInfo.authorizationExpiry,\n refundExpiry: paymentInfo.refundExpiry,\n minFeeBps: paymentInfo.minFeeBps,\n maxFeeBps: paymentInfo.maxFeeBps,\n feeReceiver: paymentInfo.feeReceiver,\n salt: paymentInfo.salt,\n },\n payer: this.payerAddress,\n network: `eip155:${this.chainId}`,\n extra: {\n escrowAddress: this.contracts.escrow,\n operatorAddress: this.contracts.operator,\n tokenCollector: this.contracts.tokenCollector,\n },\n };\n\n const response = await fetch(`${this.facilitatorUrl}/escrow/state`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Escrow state query failed: ${response.status} - ${errorText}`);\n }\n\n return await response.json() as EscrowStateResponse;\n }\n\n /**\n * CHARGE: Direct instant payment (no escrow hold).\n *\n * Calls PaymentOperator.charge() -> escrow.charge()\n * Funds go directly from payer to receiver.\n *\n * @param paymentInfo - PaymentInfo with receiver and amount\n * @param amount - Amount to charge (defaults to maxAmount)\n */\n async charge(paymentInfo: AdvancedPaymentInfo, amount?: string): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const nonce = await this.computeNonce(paymentInfo);\n const amt = amount || paymentInfo.maxAmount;\n\n const auth = {\n from: this.payerAddress,\n to: this.contracts.tokenCollector,\n value: String(amt),\n validAfter: '0',\n validBefore: String(paymentInfo.preApprovalExpiry),\n nonce,\n };\n const signature = await this.signErc3009(auth);\n // Pass raw signature bytes as collectorData (ethers handles hex -> bytes)\n const collectorData = ethers.getBytes(signature);\n\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, OPERATOR_ABI, (iface) => {\n return iface.encodeFunctionData('charge', [\n tuple, amt, this.contracts.tokenCollector, collectorData,\n ]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, OPERATOR_ABI, this.signer);\n const tx = await contract.charge(\n tuple,\n amt,\n this.contracts.tokenCollector,\n collectorData,\n { gasLimit: this.gasLimit },\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n /**\n * REFUND POST ESCROW: Dispute refund after funds were released.\n *\n * Calls PaymentOperator.refundPostEscrow() -> escrow.refund()\n *\n * WARNING: NOT FUNCTIONAL IN PRODUCTION (as of 2026-02-03).\n * The protocol team has not implemented the required tokenCollector\n * contract. This call will fail on-chain.\n *\n * For dispute resolution, use refundInEscrow() instead: keep funds\n * in escrow and refund before releasing. This guarantees funds are\n * available and under arbiter control.\n *\n * Kept for future use when tokenCollector is implemented.\n *\n * @param paymentInfo - PaymentInfo from the original authorization\n * @param amount - Amount to refund (defaults to maxAmount)\n * @param tokenCollector - Address of token collector for refund sourcing\n * @param collectorData - Data for the token collector\n */\n async refundPostEscrow(\n paymentInfo: AdvancedPaymentInfo,\n amount?: string,\n tokenCollector?: string,\n collectorData?: string,\n ): Promise<AdvancedTransactionResult> {\n if (!this.payerAddress) await this.init();\n\n try {\n const { ethers } = await import('ethers');\n const amt = amount || paymentInfo.maxAmount;\n const tuple = this.buildTuple(paymentInfo);\n\n // OWS wallet adapter mode\n if (this.walletAdapter) {\n return this.sendViaAdapter(ethers, OPERATOR_ABI, (iface) => {\n return iface.encodeFunctionData('refundPostEscrow', [\n tuple, amt, tokenCollector || ZERO_ADDRESS, collectorData || '0x',\n ]);\n });\n }\n\n // Legacy ethers.Signer mode\n const contract = new ethers.Contract(this.contracts.operator, OPERATOR_ABI, this.signer);\n const tx = await contract.refundPostEscrow(\n tuple,\n amt,\n tokenCollector || ZERO_ADDRESS,\n collectorData || '0x',\n { gasLimit: this.gasLimit },\n );\n const receipt = await tx.wait();\n\n return {\n success: receipt.status === 1,\n transactionHash: receipt.hash,\n gasUsed: Number(receipt.gasUsed),\n error: receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n } catch (e: any) {\n return { success: false, error: e.message || String(e) };\n }\n }\n\n // ==========================================================================\n // INTERNAL: Adapter-based transaction signing and broadcast\n // ==========================================================================\n\n /**\n * Build an unsigned transaction, sign via SigningWalletAdapter, and broadcast.\n *\n * Used by release(), refundInEscrow(), charge(), refundPostEscrow() when\n * operating in OWS wallet adapter mode. The adapter signs the serialized\n * transaction offline; the RPC provider broadcasts the signed raw TX.\n *\n * @param ethersModule - ethers namespace (from `const { ethers } = await import('ethers')`)\n * @param abi - Contract ABI (OPERATOR_ABI or OPERATOR_ABI_CREATE3)\n * @param encodeCalldata - Function that encodes the calldata using the interface\n * @returns Transaction result\n */\n private async sendViaAdapter(\n ethersModule: any,\n abi: string[],\n encodeCalldata: (iface: any) => string,\n ): Promise<AdvancedTransactionResult> {\n const provider = new ethersModule.JsonRpcProvider(this.rpcUrl);\n const iface = new ethersModule.Interface(abi);\n const data = encodeCalldata(iface);\n\n // Build unsigned transaction\n const nonce = await provider.getTransactionCount(this.payerAddress);\n const feeData = await provider.getFeeData();\n\n const unsignedTx = ethersModule.Transaction.from({\n to: this.contracts.operator,\n data,\n gasLimit: this.gasLimit,\n nonce,\n chainId: this.chainId,\n maxFeePerGas: feeData.maxFeePerGas,\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,\n type: 2, // EIP-1559\n });\n\n // Sign via adapter\n const signedTxHex = await this.walletAdapter!.signTransaction(unsignedTx.unsignedSerialized);\n\n // Broadcast\n const txResponse = await provider.broadcastTransaction(signedTxHex);\n const receipt = await txResponse.wait();\n\n return {\n success: receipt !== null && receipt.status === 1,\n transactionHash: txResponse.hash,\n gasUsed: receipt ? Number(receipt.gasUsed) : undefined,\n error: receipt && receipt.status !== 1 ? 'Transaction reverted' : undefined,\n };\n }\n}\n"]}