@circle-fin/x402-batching 2.0.3
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.
- package/README.md +123 -0
- package/dist/client/index.d.mts +653 -0
- package/dist/client/index.d.ts +653 -0
- package/dist/client/index.js +1313 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +1282 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/index.d.mts +62 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +33 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server/index.d.mts +318 -0
- package/dist/server/index.d.ts +318 -0
- package/dist/server/index.js +697 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +668 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/types-DnHgU28a.d.mts +90 -0
- package/dist/types-DnHgU28a.d.ts +90 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts","../../src/client/BatchEvmScheme.ts","../../src/constants.ts","../../src/detection.ts","../../src/client/CompositeEvmScheme.ts","../../src/client/register.ts","../../src/client/GatewayClient.ts"],"sourcesContent":["export { BatchEvmScheme } from './BatchEvmScheme';\nexport { CompositeEvmScheme } from './CompositeEvmScheme';\nexport { registerBatchScheme, type RegisterBatchSchemeConfig } from './register';\nexport {\n GatewayClient,\n GATEWAY_DOMAINS,\n CHAIN_CONFIGS,\n type GatewayClientConfig,\n type DepositResult,\n type WithdrawResult,\n type PayResult,\n type Balances,\n type SupportsResult,\n type TrustlessWithdrawalInitResult,\n type TrustlessWithdrawalResult,\n type GatewayBalance,\n type ChainConfig,\n type SupportedChainName,\n} from './GatewayClient';\n","import type { Address, Hex } from 'viem';\nimport { getAddress } from 'viem';\nimport {\n CIRCLE_BATCHING_NAME,\n CIRCLE_BATCHING_VERSION,\n CIRCLE_BATCHING_SCHEME,\n} from '../constants';\nimport { supportsBatching, getVerifyingContract } from '../detection';\nimport type { BatchEvmSigner, BatchPayload } from '../types';\n\n/**\n * EIP-712 types for TransferWithAuthorization.\n */\nconst authorizationTypes: Record<string, Array<{ name: string; type: string }>> = {\n TransferWithAuthorization: [\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 * Generate a random 32-byte nonce for EIP-3009.\n */\nfunction createNonce(): Hex {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return `0x${Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}` as Hex;\n}\n\n/**\n * PaymentRequirements interface (minimal subset needed).\n */\ninterface PaymentRequirements {\n scheme: string;\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds: number;\n extra?: Record<string, unknown>;\n}\n\n/**\n * PaymentPayload interface (minimal subset needed).\n */\ninterface PaymentPayload {\n x402Version: number;\n payload: BatchPayload;\n}\n\n/**\n * SchemeNetworkClient interface from @x402/core.\n */\ninterface SchemeNetworkClient {\n readonly scheme: string;\n createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>>;\n}\n\n/**\n * Circle Batching EVM Scheme Client.\n *\n * A SchemeNetworkClient implementation for Circle Gateway batched payments.\n * Signs EIP-3009 TransferWithAuthorization against the GatewayWallet contract\n * (from `extra.verifyingContract`) instead of the USDC token contract.\n *\n * @example\n * ```typescript\n * import { x402Client } from \"@x402/core/client\";\n * import { BatchEvmScheme } from \"@circle-fin/x402-batching/client\";\n *\n * const scheme = new BatchEvmScheme(evmSigner);\n * const client = new x402Client();\n * client.register(\"eip155:84532\", scheme);\n * ```\n */\nexport class BatchEvmScheme implements SchemeNetworkClient {\n readonly scheme = CIRCLE_BATCHING_SCHEME;\n\n /**\n * Creates a new BatchEvmScheme.\n *\n * @param signer - The EVM signer for signing payment authorizations\n */\n constructor(private readonly signer: BatchEvmSigner) {}\n\n /**\n * Creates a payment payload for Circle batching.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements (must be a Circle batching option)\n * @returns Promise resolving to the payment payload\n * @throws Error if requirements are not a Circle batching option\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n // Validate this is a Circle batching option\n if (!supportsBatching(paymentRequirements)) {\n throw new Error(\n `BatchEvmScheme can only handle Circle batching options. ` +\n `Expected extra.name=\"${CIRCLE_BATCHING_NAME}\" and extra.version=\"${CIRCLE_BATCHING_VERSION}\"`,\n );\n }\n\n const verifyingContract = getVerifyingContract(paymentRequirements);\n if (!verifyingContract) {\n throw new Error(\n 'Circle batching option missing extra.verifyingContract (GatewayWallet address)',\n );\n }\n\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: BatchPayload['authorization'] = {\n from: this.signer.address,\n to: getAddress(paymentRequirements.payTo) as Address,\n value: paymentRequirements.amount,\n validAfter: (now - 600).toString(), // 10 minutes before\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Sign against GatewayWallet contract (not USDC)\n const signature = await this.signAuthorization(\n authorization,\n paymentRequirements,\n verifyingContract,\n );\n\n const payload: BatchPayload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n }\n\n /**\n * Sign the EIP-3009 authorization using EIP-712.\n * Uses the GatewayWallet contract as verifyingContract instead of USDC.\n */\n private async signAuthorization(\n authorization: BatchPayload['authorization'],\n requirements: PaymentRequirements,\n verifyingContract: string,\n ): Promise<Hex> {\n if (!requirements.network.startsWith('eip155:')) {\n throw new Error(\n `BatchEvmScheme: unsupported network format \"${requirements.network}\". Expected \"eip155:<chainId>\"`,\n );\n }\n const chainId = parseInt(requirements.network.split(':')[1]);\n\n const domain = {\n name: CIRCLE_BATCHING_NAME,\n version: CIRCLE_BATCHING_VERSION,\n chainId,\n verifyingContract: getAddress(verifyingContract) as Address,\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await this.signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: 'TransferWithAuthorization',\n message,\n });\n }\n}\n","/**\n * EIP-712 domain name for Circle Gateway batched payments.\n * Used in the `extra.name` field of PaymentRequirements to identify Circle batching options.\n */\nexport const CIRCLE_BATCHING_NAME = 'GatewayWalletBatched';\n\n/**\n * EIP-712 domain version for Circle Gateway batched payments.\n * Used in the `extra.version` field of PaymentRequirements.\n */\nexport const CIRCLE_BATCHING_VERSION = '1';\n\n/**\n * The payment scheme used for Circle batching (same as standard x402 exact scheme).\n */\nexport const CIRCLE_BATCHING_SCHEME = 'exact';\n","import { CIRCLE_BATCHING_NAME, CIRCLE_BATCHING_VERSION } from './constants';\n\n/**\n * PaymentRequirements-like structure for detection.\n * We only need the `extra` field to detect batching options.\n */\ninterface PaymentRequirementsLike {\n extra?: Record<string, unknown>;\n}\n\n/**\n * Check if a PaymentRequirements object supports batched settlement.\n *\n * Batching options are identified by:\n * - `extra.name === \"GatewayWalletBatched\"`\n * - `extra.version === \"1\"`\n *\n * @param requirements - The payment requirements to check\n * @returns true if this supports batched settlement\n *\n * @example\n * ```typescript\n * import { supportsBatching } from \"@circle-fin/x402-batching\";\n *\n * if (supportsBatching(paymentRequirements)) {\n * // This option uses batched settlement (gas-free for users!)\n * }\n * ```\n */\nexport function supportsBatching(requirements: PaymentRequirementsLike): boolean {\n const extra = requirements.extra;\n if (!extra) {\n return false;\n }\n\n return extra.name === CIRCLE_BATCHING_NAME && extra.version === CIRCLE_BATCHING_VERSION;\n}\n\n/**\n * Check if a PaymentRequirements object is a batched payment.\n *\n * This is an alias for `supportsBatching`, intended for server-side/facilitator use.\n * Use this to route payments to the appropriate handler.\n *\n * @param requirements - The payment requirements to check\n * @returns true if this is a batched payment\n *\n * @example\n * ```typescript\n * import { isBatchPayment, BatchFacilitatorClient } from \"@circle-fin/x402-batching/server\";\n *\n * const gateway = new BatchFacilitatorClient();\n *\n * // In your facilitator's verify/settle handler:\n * if (isBatchPayment(requirements)) {\n * return gateway.verify(payload, requirements);\n * }\n * // else: handle with existing on-chain logic\n * ```\n */\nexport const isBatchPayment = supportsBatching;\n\n/**\n * Get the verifyingContract address from batching requirements.\n *\n * @param requirements - The payment requirements\n * @returns The batch wallet contract address, or undefined if not a batching option\n */\nexport function getVerifyingContract(\n requirements: PaymentRequirementsLike,\n): string | undefined {\n if (!supportsBatching(requirements)) {\n return undefined;\n }\n\n const verifyingContract = requirements.extra?.verifyingContract;\n if (typeof verifyingContract === 'string') {\n return verifyingContract;\n }\n\n return undefined;\n}\n","import { CIRCLE_BATCHING_SCHEME } from '../constants';\nimport { supportsBatching } from '../detection';\nimport type { BatchEvmScheme } from './BatchEvmScheme';\n\n/**\n * PaymentRequirements interface (minimal subset needed).\n */\ninterface PaymentRequirements {\n scheme: string;\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds: number;\n extra?: Record<string, unknown>;\n}\n\n/**\n * PaymentPayload interface (minimal subset needed).\n */\ninterface PaymentPayload {\n x402Version: number;\n payload: unknown;\n}\n\n/**\n * SchemeNetworkClient interface from @x402/core.\n */\ninterface SchemeNetworkClient {\n readonly scheme: string;\n createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>>;\n}\n\n/**\n * Composite EVM Scheme that dispatches between BatchEvmScheme and a fallback.\n *\n * When both BatchEvmScheme and ExactEvmScheme register for the same `scheme`\n * (\"exact\") on the same network wildcard (\"eip155:*\"), x402Client uses\n * first-registered-wins. This means one scheme always shadows the other.\n *\n * CompositeEvmScheme solves this by registering once and dispatching at\n * runtime: if the payment requirements include batching metadata\n * (`supportsBatching()`), it delegates to BatchEvmScheme; otherwise it\n * delegates to the fallback (typically ExactEvmScheme).\n *\n * @example\n * ```typescript\n * import { CompositeEvmScheme, BatchEvmScheme } from \"@circle-fin/x402-batching/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * const composite = new CompositeEvmScheme(\n * new BatchEvmScheme(signer),\n * new ExactEvmScheme(signer),\n * );\n * client.register(\"eip155:*\", composite);\n * ```\n */\nexport class CompositeEvmScheme implements SchemeNetworkClient {\n readonly scheme = CIRCLE_BATCHING_SCHEME;\n\n constructor(\n private readonly batchScheme: BatchEvmScheme,\n private readonly fallbackScheme: SchemeNetworkClient,\n ) {\n if (fallbackScheme.scheme !== CIRCLE_BATCHING_SCHEME) {\n throw new Error(\n `CompositeEvmScheme: fallbackScheme.scheme must be \"${CIRCLE_BATCHING_SCHEME}\", ` +\n `got \"${fallbackScheme.scheme}\"`,\n );\n }\n }\n\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n if (supportsBatching(paymentRequirements)) {\n return this.batchScheme.createPaymentPayload(x402Version, paymentRequirements);\n }\n return this.fallbackScheme.createPaymentPayload(x402Version, paymentRequirements);\n }\n}\n","import { BatchEvmScheme } from './BatchEvmScheme';\nimport { CompositeEvmScheme } from './CompositeEvmScheme';\nimport type { BatchEvmSigner } from '../types';\n\n/**\n * x402Client-like interface (minimal subset needed for registration).\n */\ninterface X402ClientLike {\n register(network: string, client: { readonly scheme: string }): unknown;\n}\n\n/**\n * SchemeNetworkClient-like interface (minimal subset for fallback).\n */\ninterface SchemeNetworkClientLike {\n readonly scheme: string;\n createPaymentPayload(\n x402Version: number,\n paymentRequirements: {\n scheme: string;\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds: number;\n extra?: Record<string, unknown>;\n },\n ): Promise<{ x402Version: number; payload: unknown }>;\n}\n\n/**\n * Configuration for registering batch scheme.\n */\nexport interface RegisterBatchSchemeConfig {\n /** The EVM signer for signing payment authorizations */\n signer: BatchEvmSigner;\n /** Networks to register for (default: all EVM networks via wildcard) */\n networks?: string[];\n /**\n * Optional fallback SchemeNetworkClient for non-batching \"exact\" payments.\n *\n * When provided, a CompositeEvmScheme is registered that dispatches to\n * BatchEvmScheme for Gateway payments and to the fallback for standard\n * on-chain payments. This avoids the scheme collision where x402Client's\n * first-registered-wins policy causes one scheme to shadow the other.\n *\n * @example\n * ```typescript\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n *\n * registerBatchScheme(client, {\n * signer: evmSigner,\n * fallbackScheme: new ExactEvmScheme(evmSigner),\n * });\n * ```\n */\n fallbackScheme?: SchemeNetworkClientLike;\n}\n\n/**\n * Register batch scheme with an x402Client.\n *\n * This registers a BatchEvmScheme that can handle payment requirements\n * with `extra.name === \"GatewayWalletBatched\"`. The scheme signs EIP-3009\n * authorizations against the batch wallet contract instead of USDC.\n *\n * When `fallbackScheme` is provided, a CompositeEvmScheme is registered\n * instead, which handles both batch and standard payments in a single\n * registration — no need to separately register ExactEvmScheme.\n *\n * @param client - The x402Client to register with\n * @param config - Configuration including the EVM signer\n * @returns The registered scheme instance\n *\n * @example\n * ```typescript\n * import { x402Client } from \"@x402/core/client\";\n * import { registerBatchScheme } from \"@circle-fin/x402-batching/client\";\n * import { ExactEvmScheme } from \"@x402/evm/exact/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n *\n * // Handles both batch and standard EVM payments:\n * registerBatchScheme(client, {\n * signer: account,\n * fallbackScheme: new ExactEvmScheme(account),\n * });\n * ```\n */\nexport function registerBatchScheme(\n client: X402ClientLike,\n config: RegisterBatchSchemeConfig & { fallbackScheme: SchemeNetworkClientLike },\n): CompositeEvmScheme;\nexport function registerBatchScheme(\n client: X402ClientLike,\n config: Omit<RegisterBatchSchemeConfig, 'fallbackScheme'>,\n): BatchEvmScheme;\nexport function registerBatchScheme(\n client: X402ClientLike,\n config: RegisterBatchSchemeConfig,\n): BatchEvmScheme | CompositeEvmScheme;\nexport function registerBatchScheme(\n client: X402ClientLike,\n config: RegisterBatchSchemeConfig,\n): BatchEvmScheme | CompositeEvmScheme {\n const batchScheme = new BatchEvmScheme(config.signer);\n\n const schemeToRegister = config.fallbackScheme\n ? new CompositeEvmScheme(batchScheme, config.fallbackScheme)\n : batchScheme;\n\n // Register for specified networks or use wildcard for all EVM networks\n const networks = config.networks ?? ['eip155:*'];\n for (const network of networks) {\n client.register(network, schemeToRegister);\n }\n\n return schemeToRegister;\n}\n","import {\n createPublicClient,\n createWalletClient,\n http,\n parseUnits,\n formatUnits,\n pad,\n zeroAddress,\n maxUint256,\n type Address,\n type Hex,\n type Chain,\n type PublicClient,\n type WalletClient,\n type Transport,\n type Account,\n defineChain,\n erc20Abi,\n} from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport * as chains from 'viem/chains';\nimport { randomBytes } from 'crypto';\n\n// viem's sonicTestnet uses the old testnet. This uses the new one.\nconst sonicTestnet = defineChain({\n id: 14601,\n name: 'Sonic Testnet',\n nativeCurrency: { decimals: 18, name: 'Sonic', symbol: 'S' },\n rpcUrls: {\n default: { http: ['https://rpc.testnet.soniclabs.com'] },\n },\n blockExplorers: {\n default: { name: 'Sonic Testnet Explorer', url: 'https://testnet.soniclabs.com/' },\n },\n testnet: true,\n});\n\n// ============================================================================\n// CONTRACT ABIS\n// ============================================================================\n\n// Gateway API URL\nconst GATEWAY_API_TESTNET = 'https://gateway-api-testnet.circle.com/v1';\nconst GATEWAY_API_MAINNET = 'https://gateway-api.circle.com/v1';\n\nconst GATEWAY_MINTER_ABI = [\n {\n name: 'gatewayMint',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'attestationPayload', type: 'bytes' },\n { name: 'signature', type: 'bytes' },\n ],\n outputs: [],\n },\n] as const;\n\nconst GATEWAY_WALLET_ABI = [\n {\n name: 'deposit',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n outputs: [],\n },\n {\n name: 'depositFor',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n outputs: [],\n },\n {\n name: 'totalBalance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'availableBalance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'withdrawingBalance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'withdrawableBalance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'withdrawalDelay',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'withdrawalBlock',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'depositor', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'initiateWithdrawal',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n outputs: [],\n },\n {\n name: 'withdraw',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ name: 'token', type: 'address' }],\n outputs: [],\n },\n] as const;\n\n// ============================================================================\n// CHAIN CONFIGURATIONS\n// ============================================================================\n\n/**\n * Gateway domain identifiers for supported chains.\n * See: https://developers.circle.com/gateway/gateway-supported-blockchains\n */\nexport const GATEWAY_DOMAINS = {\n // Testnet\n arbitrumSepolia: 3,\n arcTestnet: 26,\n avalancheFuji: 1,\n baseSepolia: 6,\n sepolia: 0,\n hyperEvmTestnet: 19,\n optimismSepolia: 2,\n polygonAmoy: 7,\n seiAtlantic: 16,\n sonicTestnet: 13,\n unichainSepolia: 10,\n worldChainSepolia: 14,\n // Mainnet\n arbitrum: 3,\n avalanche: 1,\n base: 6,\n mainnet: 0,\n hyperEvm: 19,\n optimism: 2,\n polygon: 7,\n sei: 16,\n sonic: 13,\n unichain: 10,\n worldChain: 14,\n} as const;\n\n/**\n * Supported chain names type.\n */\nexport type SupportedChainName = keyof typeof GATEWAY_DOMAINS;\n\n/**\n * Chain configuration with contract addresses.\n */\nexport interface ChainConfig {\n chain: Chain;\n domain: number;\n usdc: Address;\n gatewayWallet: Address;\n gatewayMinter: Address;\n rpcUrl?: string;\n}\n\n// Testnet GatewayWallet and GatewayMinter addresses (same across all testnet chains)\nconst TESTNET_GATEWAY_WALLET = '0x0077777d7EBA4688BDeF3E311b846F25870A19B9' as Address;\nconst TESTNET_GATEWAY_MINTER = '0x0022222ABE238Cc2C7Bb1f21003F0a260052475B' as Address;\n\n// Mainnet GatewayWallet and GatewayMinter addresses (same across all mainnet chains)\nconst MAINNET_GATEWAY_WALLET = '0x77777777Dcc4d5A8B6E418Fd04D8997ef11000eE' as Address;\nconst MAINNET_GATEWAY_MINTER = '0x2222222d7164433c4C09B0b0D809a9b52C04C205' as Address;\n\n/**\n * Chain configurations for supported chains.\n */\nexport const CHAIN_CONFIGS: Record<SupportedChainName, ChainConfig> = {\n // Testnet chains\n arbitrumSepolia: {\n chain: chains.arbitrumSepolia,\n domain: GATEWAY_DOMAINS.arbitrumSepolia,\n usdc: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n arcTestnet: {\n chain: chains.arcTestnet,\n domain: GATEWAY_DOMAINS.arcTestnet,\n usdc: '0x3600000000000000000000000000000000000000' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n rpcUrl: 'https://rpc.testnet.arc.network',\n },\n avalancheFuji: {\n chain: chains.avalancheFuji,\n domain: GATEWAY_DOMAINS.avalancheFuji,\n usdc: '0x5425890298aed601595a70AB815c96711a31Bc65' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n baseSepolia: {\n chain: chains.baseSepolia,\n domain: GATEWAY_DOMAINS.baseSepolia,\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n rpcUrl: 'https://sepolia-preconf.base.org',\n },\n sepolia: {\n chain: chains.sepolia,\n domain: GATEWAY_DOMAINS.sepolia,\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n hyperEvmTestnet: {\n chain: chains.hyperliquidEvmTestnet,\n domain: GATEWAY_DOMAINS.hyperEvmTestnet,\n usdc: '0x2B3370eE501B4a559b57D449569354196457D8Ab' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n optimismSepolia: {\n chain: chains.optimismSepolia,\n domain: GATEWAY_DOMAINS.optimismSepolia,\n usdc: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n polygonAmoy: {\n chain: chains.polygonAmoy,\n domain: GATEWAY_DOMAINS.polygonAmoy,\n usdc: '0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n seiAtlantic: {\n chain: chains.seiTestnet,\n domain: GATEWAY_DOMAINS.seiAtlantic,\n usdc: '0x4fCF1784B31630811181f670Aea7A7bEF803eaED' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n sonicTestnet: {\n chain: sonicTestnet,\n domain: GATEWAY_DOMAINS.sonicTestnet,\n usdc: '0x0BA304580ee7c9a980CF72e55f5Ed2E9fd30Bc51' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n unichainSepolia: {\n chain: chains.unichainSepolia,\n domain: GATEWAY_DOMAINS.unichainSepolia,\n usdc: '0x31d0220469e10c4E71834a79b1f276d740d3768F' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n worldChainSepolia: {\n chain: chains.worldchainSepolia,\n domain: GATEWAY_DOMAINS.worldChainSepolia,\n usdc: '0x66145f38cBAC35Ca6F1Dfb4914dF98F1614aeA88' as Address,\n gatewayWallet: TESTNET_GATEWAY_WALLET,\n gatewayMinter: TESTNET_GATEWAY_MINTER,\n },\n // Mainnet chains\n arbitrum: {\n chain: chains.arbitrum,\n domain: GATEWAY_DOMAINS.arbitrum,\n usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n avalanche: {\n chain: chains.avalanche,\n domain: GATEWAY_DOMAINS.avalanche,\n usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n base: {\n chain: chains.base,\n domain: GATEWAY_DOMAINS.base,\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n mainnet: {\n chain: chains.mainnet,\n domain: GATEWAY_DOMAINS.mainnet,\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n hyperEvm: {\n chain: chains.hyperEvm,\n domain: GATEWAY_DOMAINS.hyperEvm,\n usdc: '0xb88339CB7199b77E23DB6E890353E22632Ba630f' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n optimism: {\n chain: chains.optimism,\n domain: GATEWAY_DOMAINS.optimism,\n usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n polygon: {\n chain: chains.polygon,\n domain: GATEWAY_DOMAINS.polygon,\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n sei: {\n chain: chains.sei,\n domain: GATEWAY_DOMAINS.sei,\n usdc: '0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n sonic: {\n chain: chains.sonic,\n domain: GATEWAY_DOMAINS.sonic,\n usdc: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n unichain: {\n chain: chains.unichain,\n domain: GATEWAY_DOMAINS.unichain,\n usdc: '0x078D782b760474a361dDA0AF3839290b0EF57AD6' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n worldChain: {\n chain: chains.worldchain,\n domain: GATEWAY_DOMAINS.worldChain,\n usdc: '0x79A02482A880bCe3F13E09da970dC34dB4cD24D1' as Address,\n gatewayWallet: MAINNET_GATEWAY_WALLET,\n gatewayMinter: MAINNET_GATEWAY_MINTER,\n },\n};\n\n// ============================================================================\n// GATEWAY CLIENT TYPES\n// ============================================================================\n\n/**\n * Configuration for creating a GatewayClient.\n */\nexport interface GatewayClientConfig {\n /** The chain to connect to */\n chain: SupportedChainName;\n /** Private key for signing transactions */\n privateKey: Hex;\n /** Optional custom RPC URL */\n rpcUrl?: string;\n}\n\n/**\n * Result of a deposit operation.\n */\nexport interface DepositResult {\n /** Transaction hash of the approval (if needed) */\n approvalTxHash?: Hex;\n /** Transaction hash of the deposit */\n depositTxHash: Hex;\n /** Amount deposited in USDC atomic units */\n amount: bigint;\n /** Formatted amount deposited */\n formattedAmount: string;\n /** Depositor address */\n depositor: Address;\n}\n\n/**\n * Result of a withdraw operation (instant transfer).\n */\nexport interface WithdrawResult {\n /** Transaction hash of the mint on destination chain */\n mintTxHash: Hex;\n /** Amount withdrawn in USDC atomic units */\n amount: bigint;\n /** Formatted amount withdrawn */\n formattedAmount: string;\n /** Source chain name */\n sourceChain: string;\n /** Destination chain name */\n destinationChain: string;\n /** Recipient address */\n recipient: Address;\n}\n\n/**\n * Result of a pay operation.\n */\nexport interface PayResult<T = unknown> {\n /** The response data from the resource */\n data: T;\n /** Amount paid in USDC atomic units */\n amount: bigint;\n /** Formatted amount paid */\n formattedAmount: string;\n /** Transaction hash from settlement */\n transaction: string;\n /** HTTP status code */\n status: number;\n}\n\n/**\n * All balances in one object.\n */\nexport interface Balances {\n /** Regular wallet USDC balance */\n wallet: {\n balance: bigint;\n formatted: string;\n };\n /** Gateway balances */\n gateway: {\n total: bigint;\n available: bigint;\n withdrawing: bigint;\n withdrawable: bigint;\n formattedTotal: string;\n formattedAvailable: string;\n formattedWithdrawing: string;\n formattedWithdrawable: string;\n };\n}\n\n/**\n * Result of checking if a URL supports batching.\n */\nexport interface SupportsResult {\n /** Whether the URL supports Gateway batching */\n supported: boolean;\n /** Payment requirements if supported */\n requirements?: Record<string, unknown>;\n /** Error message if not supported */\n error?: string;\n}\n\n/**\n * Result of a trustless withdrawal initiation.\n *\n * NOTE: Trustless withdrawals are for emergency use only when Circle's API is unavailable.\n * For normal withdrawals, use `transfer()` with the same source and destination chain.\n */\nexport interface TrustlessWithdrawalInitResult {\n /** Transaction hash */\n txHash: Hex;\n /** Amount being withdrawn in USDC atomic units */\n amount: bigint;\n /** Formatted amount being withdrawn */\n formattedAmount: string;\n /** Block number at which withdrawal becomes available (~7 days) */\n withdrawalBlock: bigint;\n}\n\n/**\n * Result of a trustless withdrawal completion.\n *\n * NOTE: Trustless withdrawals are for emergency use only when Circle's API is unavailable.\n */\nexport interface TrustlessWithdrawalResult {\n /** Transaction hash */\n txHash: Hex;\n /** Amount withdrawn in USDC atomic units */\n amount: bigint;\n /** Formatted amount withdrawn */\n formattedAmount: string;\n}\n\n/**\n * Gateway balance information.\n */\nexport interface GatewayBalance {\n /** Total balance in Gateway */\n total: bigint;\n /** Available balance (can be used) */\n available: bigint;\n /** Balance in withdrawal process */\n withdrawing: bigint;\n /** Balance ready to be withdrawn */\n withdrawable: bigint;\n /** Formatted total balance */\n formattedTotal: string;\n /** Formatted available balance */\n formattedAvailable: string;\n /** Formatted withdrawing balance */\n formattedWithdrawing: string;\n /** Formatted withdrawable balance */\n formattedWithdrawable: string;\n}\n\n// ============================================================================\n// GATEWAY CLIENT\n// ============================================================================\n\n/**\n * Gateway Client for gasless payments and cross-chain USDC via Circle Gateway.\n *\n * This client provides a simple interface for buyers to:\n * - **Deposit**: Move USDC into Gateway for gasless payments\n * - **Pay**: Pay for x402-protected resources (handles 402 automatically)\n * - **Withdraw**: Get USDC back (same-chain or cross-chain, instant)\n * - **GetBalances**: Check all balances in one call\n *\n * ## Typical Flow\n * ```typescript\n * const gateway = new GatewayClient({ chain: 'arcTestnet', privateKey });\n *\n * // 1. Deposit (one-time setup)\n * await gateway.deposit('100');\n *\n * // 2. Pay for resources (many times, gasless!)\n * const { data } = await gateway.pay('https://api.example.com/resource');\n *\n * // 3. Check balances\n * const balances = await gateway.getBalances();\n *\n * // 4. Withdraw when done\n * await gateway.withdraw('50');\n * // Or withdraw to a different chain (requires gas on destination)\n * await gateway.withdraw('25', { chain: 'baseSepolia' });\n * ```\n *\n * ## Emergency Flow (when Circle's API is down)\n * Use `initiateTrustlessWithdrawal()` and `completeTrustlessWithdrawal()` (7-day delay).\n */\nexport class GatewayClient {\n readonly chainConfig: ChainConfig;\n readonly account: ReturnType<typeof privateKeyToAccount>;\n readonly publicClient: PublicClient<Transport, Chain>;\n readonly walletClient: WalletClient<Transport, Chain, Account>;\n\n /**\n * Creates a new GatewayClient.\n *\n * @param config - Configuration including chain and private key\n */\n constructor(config: GatewayClientConfig) {\n const chainConfig = CHAIN_CONFIGS[config.chain];\n if (!chainConfig) {\n throw new Error(`Unsupported chain: ${config.chain}`);\n }\n\n this.chainConfig = chainConfig;\n this.account = privateKeyToAccount(config.privateKey);\n\n const rpcUrl = config.rpcUrl ?? chainConfig.rpcUrl;\n const transport = rpcUrl ? http(rpcUrl) : http();\n\n this.publicClient = createPublicClient({\n chain: chainConfig.chain,\n transport,\n }) as PublicClient<Transport, Chain>;\n\n this.walletClient = createWalletClient({\n account: this.account,\n chain: chainConfig.chain,\n transport,\n }) as WalletClient<Transport, Chain, Account>;\n }\n\n /**\n * Get the account address.\n */\n get address(): Address {\n return this.account.address;\n }\n\n /**\n * Get the chain name.\n */\n get chainName(): string {\n return this.chainConfig.chain.name;\n }\n\n /**\n * Get the Gateway domain for this chain.\n */\n get domain(): number {\n return this.chainConfig.domain;\n }\n\n /**\n * Get the chain name key for this client.\n */\n getChainName(): SupportedChainName {\n // Find the key in CHAIN_CONFIGS that matches our domain\n for (const [name, config] of Object.entries(CHAIN_CONFIGS)) {\n if (\n config.domain === this.chainConfig.domain &&\n config.chain.id === this.chainConfig.chain.id\n ) {\n return name as SupportedChainName;\n }\n }\n throw new Error('Unknown chain configuration');\n }\n\n /**\n * Get the USDC balance of the account (not in Gateway).\n *\n * @param address - Optional address to check (defaults to account address)\n * @returns USDC balance in atomic units and formatted\n */\n async getUsdcBalance(\n address?: Address,\n ): Promise<{ balance: bigint; formatted: string }> {\n const target = address ?? this.account.address;\n const balance = await this.publicClient.readContract({\n address: this.chainConfig.usdc,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [target],\n });\n\n return {\n balance,\n formatted: formatUnits(balance, 6),\n };\n }\n\n /**\n * Get all balances (wallet + gateway) in one call.\n *\n * @param address - Optional address to check (defaults to account address)\n * @returns All balances\n */\n async getBalances(address?: Address): Promise<Balances> {\n const target = address ?? this.account.address;\n\n const [wallet, gateway] = await Promise.all([\n this.getUsdcBalance(target),\n this.getGatewayBalance(target),\n ]);\n\n return {\n wallet,\n gateway,\n };\n }\n\n /**\n * Get the Gateway balance for an address.\n *\n * @param address - Optional address to check (defaults to account address)\n * @returns Gateway balance information\n * @deprecated Use `getBalances()` instead for a unified view\n */\n async getBalance(address?: Address): Promise<GatewayBalance> {\n return this.getGatewayBalance(address);\n }\n\n /**\n * Get the Gateway balance for an address via Gateway API.\n */\n private async getGatewayBalance(address?: Address): Promise<GatewayBalance> {\n const target = address ?? this.account.address;\n const apiBaseUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n\n const response = await fetch(`${apiBaseUrl}/balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: 'USDC',\n sources: [{ depositor: target, domain: this.chainConfig.domain }],\n }),\n });\n\n const data = (await response.json()) as {\n balances?: Array<{\n balance: string;\n withdrawing?: string;\n withdrawable?: string;\n }>;\n message?: string;\n };\n\n if (!response.ok) {\n throw new Error(\n `Gateway API balance fetch failed: ${data.message ?? response.statusText}`,\n );\n }\n\n if (!data.balances || data.balances.length === 0) {\n throw new Error('Gateway API returned no balances for the depositor.');\n }\n\n const balanceData = data.balances[0];\n // Gateway API returns formatted decimal strings (e.g. \"0.300000\") for USDC.\n // Convert to atomic units (6 decimals) for bigint fields.\n const available = parseUnits(balanceData.balance, 6);\n const withdrawing = parseUnits(balanceData.withdrawing ?? '0', 6);\n const withdrawable = parseUnits(balanceData.withdrawable ?? '0', 6);\n const total = available + withdrawing;\n\n return {\n total,\n available,\n withdrawing,\n withdrawable,\n formattedTotal: formatUnits(total, 6),\n formattedAvailable: formatUnits(available, 6),\n formattedWithdrawing: formatUnits(withdrawing, 6),\n formattedWithdrawable: formatUnits(withdrawable, 6),\n };\n }\n\n /**\n * Deposit USDC into the Gateway Wallet.\n *\n * This method first approves the Gateway Wallet contract to spend USDC,\n * then deposits the specified amount.\n *\n * @param amount - Amount of USDC to deposit (as a decimal string, e.g., \"10.5\")\n * @param options - Optional deposit options\n * @returns Deposit result with transaction hashes\n */\n async deposit(\n amount: string,\n options?: {\n /** Amount to approve (defaults to amount) */\n approveAmount?: string;\n /** Skip approval if already approved */\n skipApprovalCheck?: boolean;\n },\n ): Promise<DepositResult> {\n const depositAmount = parseUnits(amount, 6);\n const approveAmount = parseUnits(options?.approveAmount ?? amount, 6);\n\n // Check balance\n const { balance } = await this.getUsdcBalance();\n if (balance < depositAmount) {\n throw new Error(\n `Insufficient USDC balance. Have: ${formatUnits(balance, 6)}, Need: ${amount}`,\n );\n }\n\n let approvalTxHash: Hex | undefined;\n\n // Check current allowance unless skipped\n if (!options?.skipApprovalCheck) {\n const allowance = await this.publicClient.readContract({\n address: this.chainConfig.usdc,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [this.account.address, this.chainConfig.gatewayWallet],\n });\n\n if (allowance < depositAmount) {\n // Approve the Gateway Wallet\n approvalTxHash = await this.walletClient.writeContract({\n address: this.chainConfig.usdc,\n abi: erc20Abi,\n functionName: 'approve',\n args: [this.chainConfig.gatewayWallet, approveAmount],\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: approvalTxHash });\n } catch (err) {\n throw new Error(`Approval transaction failed: ${approvalTxHash}`, {\n cause: err,\n });\n }\n }\n }\n\n // Deposit into Gateway Wallet\n const depositTxHash = await this.walletClient.writeContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'deposit',\n args: [this.chainConfig.usdc, depositAmount],\n gas: 120000n,\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: depositTxHash });\n } catch (err) {\n throw new Error(`Deposit transaction failed: ${depositTxHash}`, {\n cause: err,\n });\n }\n\n return {\n approvalTxHash,\n depositTxHash,\n amount: depositAmount,\n formattedAmount: amount,\n depositor: this.account.address,\n };\n }\n\n /**\n * Deposit USDC into the Gateway Wallet on behalf of another address.\n *\n * The resulting balance belongs to the specified depositor address,\n * not the caller.\n *\n * @param amount - Amount of USDC to deposit (as a decimal string)\n * @param depositor - Address that will own the resulting balance\n * @param options - Optional deposit options\n * @returns Deposit result with transaction hashes\n */\n async depositFor(\n amount: string,\n depositor: Address,\n options?: {\n /** Amount to approve (defaults to amount) */\n approveAmount?: string;\n /** Skip approval if already approved */\n skipApprovalCheck?: boolean;\n },\n ): Promise<DepositResult> {\n const depositAmount = parseUnits(amount, 6);\n const approveAmount = parseUnits(options?.approveAmount ?? amount, 6);\n\n // Check balance\n const { balance } = await this.getUsdcBalance();\n if (balance < depositAmount) {\n throw new Error(\n `Insufficient USDC balance. Have: ${formatUnits(balance, 6)}, Need: ${amount}`,\n );\n }\n\n let approvalTxHash: Hex | undefined;\n\n // Check current allowance unless skipped\n if (!options?.skipApprovalCheck) {\n const allowance = await this.publicClient.readContract({\n address: this.chainConfig.usdc,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [this.account.address, this.chainConfig.gatewayWallet],\n });\n\n if (allowance < depositAmount) {\n // Approve the Gateway Wallet\n approvalTxHash = await this.walletClient.writeContract({\n address: this.chainConfig.usdc,\n abi: erc20Abi,\n functionName: 'approve',\n args: [this.chainConfig.gatewayWallet, approveAmount],\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: approvalTxHash });\n } catch (err) {\n throw new Error(`Approval transaction failed: ${approvalTxHash}`, {\n cause: err,\n });\n }\n }\n }\n\n // Deposit into Gateway Wallet for another address\n const depositTxHash = await this.walletClient.writeContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'depositFor',\n args: [this.chainConfig.usdc, depositor, depositAmount],\n gas: 120000n,\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: depositTxHash });\n } catch (err) {\n throw new Error(`Deposit transaction failed: ${depositTxHash}`, {\n cause: err,\n });\n }\n\n return {\n approvalTxHash,\n depositTxHash,\n amount: depositAmount,\n formattedAmount: amount,\n depositor,\n };\n }\n\n // ============================================================================\n // PAYMENT (Pay for x402 resources)\n // ============================================================================\n\n /**\n * Check if a URL supports Gateway batching before paying.\n *\n * @param url - The URL to check\n * @returns Whether batching is supported and payment requirements\n */\n async supports(url: string): Promise<SupportsResult> {\n try {\n const response = await fetch(url);\n\n if (response.status !== 402) {\n return { supported: false, error: 'Resource does not require payment (not 402)' };\n }\n\n // x402 v2: Read from PAYMENT-REQUIRED header (base64-encoded)\n const paymentRequiredHeader = response.headers.get('PAYMENT-REQUIRED');\n if (!paymentRequiredHeader) {\n return {\n supported: false,\n error: 'Missing PAYMENT-REQUIRED header in 402 response',\n };\n }\n const data: { accepts?: Array<Record<string, unknown>> } = JSON.parse(\n Buffer.from(paymentRequiredHeader, 'base64').toString('utf-8'),\n );\n const accepts = data.accepts;\n\n if (!accepts || accepts.length === 0) {\n return { supported: false, error: 'No payment options in 402 response' };\n }\n\n // Find a batching option matching this client's chain\n const expectedNetwork = `eip155:${this.chainConfig.chain.id}`;\n const batchingOption = accepts.find((opt) => {\n const extra = opt.extra as Record<string, unknown> | undefined;\n return (\n opt.network === expectedNetwork &&\n extra?.name === 'GatewayWalletBatched' &&\n extra?.version === '1' &&\n typeof extra?.verifyingContract === 'string'\n );\n });\n\n if (!batchingOption) {\n return {\n supported: false,\n error: `No Gateway batching option available for network ${expectedNetwork} (${this.chainConfig.chain.name})`,\n };\n }\n\n return { supported: true, requirements: batchingOption };\n } catch (error) {\n return { supported: false, error: (error as Error).message };\n }\n }\n\n /**\n * Pay for an x402-protected resource.\n *\n * This method handles the full 402 payment flow automatically:\n * 1. Makes initial request\n * 2. If 402, finds Gateway batching option\n * 3. Signs payment authorization\n * 4. Retries with Payment-Signature header\n *\n * @param url - The URL to pay for\n * @param options - Optional request options\n * @returns The response data and payment info\n *\n * @example\n * ```typescript\n * const { data, amount } = await gateway.pay('https://api.example.com/resource');\n * console.log('Paid', amount, 'USDC for:', data);\n * ```\n */\n async pay<T = unknown>(\n url: string,\n options?: {\n /** HTTP method (default: GET) */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Request body for POST/PUT */\n body?: unknown;\n /** Additional headers */\n headers?: Record<string, string>;\n },\n ): Promise<PayResult<T>> {\n const method = options?.method ?? 'GET';\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options?.headers,\n };\n const serializedBody =\n options?.body !== undefined\n ? typeof options.body === 'string'\n ? options.body\n : JSON.stringify(options.body)\n : undefined;\n\n // Step 1: Make initial request\n const initialResponse = await fetch(url, {\n method,\n headers,\n body: serializedBody,\n });\n\n // If not 402, check if it's an error or success\n if (initialResponse.status !== 402) {\n if (initialResponse.ok) {\n const data = (await initialResponse.json()) as T;\n return {\n data,\n amount: 0n,\n formattedAmount: '0',\n transaction: '',\n status: initialResponse.status,\n };\n }\n throw new Error(`Request failed with status ${initialResponse.status}`);\n }\n\n // Step 2: Parse 402 response\n // x402 v2: Read from PAYMENT-REQUIRED header (base64-encoded)\n const paymentRequiredHeader = initialResponse.headers.get('PAYMENT-REQUIRED');\n if (!paymentRequiredHeader) {\n throw new Error('Missing PAYMENT-REQUIRED header in 402 response');\n }\n const paymentRequired = JSON.parse(\n Buffer.from(paymentRequiredHeader, 'base64').toString('utf-8'),\n ) as {\n x402Version?: number;\n accepts?: Array<Record<string, unknown>>;\n resource?: Record<string, unknown>;\n };\n const accepts = paymentRequired.accepts;\n\n if (!accepts || accepts.length === 0) {\n throw new Error('No payment options in 402 response');\n }\n\n // Step 3: Find Gateway batching option matching this client's chain\n const expectedNetwork = `eip155:${this.chainConfig.chain.id}`;\n const batchingOption = accepts.find((opt) => {\n const extra = opt.extra as Record<string, unknown> | undefined;\n return (\n opt.network === expectedNetwork &&\n extra?.name === 'GatewayWalletBatched' &&\n extra?.version === '1' &&\n typeof extra?.verifyingContract === 'string'\n );\n });\n\n if (!batchingOption) {\n throw new Error(\n `No Gateway batching option available for network ${expectedNetwork} (${this.chainConfig.chain.name}). The seller may not support this chain. Use supports() to check first.`,\n );\n }\n\n // Step 4: Create and sign payment\n const paymentPayload = await this.createPaymentPayload(\n paymentRequired.x402Version ?? 2,\n batchingOption,\n );\n\n // Step 5: Retry with payment\n const paymentHeader = Buffer.from(\n JSON.stringify({\n ...paymentPayload,\n resource: paymentRequired.resource,\n accepted: batchingOption,\n }),\n ).toString('base64');\n\n const paidResponse = await fetch(url, {\n method,\n headers: {\n ...headers,\n 'Payment-Signature': paymentHeader,\n },\n body: serializedBody,\n });\n\n if (!paidResponse.ok) {\n const error = await paidResponse.json().catch(() => ({}));\n throw new Error(\n `Payment failed: ${(error as { error?: string }).error || paidResponse.statusText}`,\n );\n }\n\n const data = (await paidResponse.json()) as T;\n const amount = BigInt(batchingOption.amount as string);\n\n // x402 v2: Read settlement info from PAYMENT-RESPONSE header (base64-encoded)\n let transaction = '';\n const paymentResponseHeader = paidResponse.headers.get('PAYMENT-RESPONSE');\n if (paymentResponseHeader) {\n const settleResponse = JSON.parse(\n Buffer.from(paymentResponseHeader, 'base64').toString('utf-8'),\n ) as { transaction?: string };\n transaction = settleResponse.transaction ?? '';\n }\n\n return {\n data,\n amount,\n formattedAmount: formatUnits(amount, 6),\n transaction,\n status: paidResponse.status,\n };\n }\n\n /**\n * Create a payment payload for x402 (low-level).\n */\n private async createPaymentPayload(\n x402Version: number,\n requirements: Record<string, unknown>,\n ) {\n const extra = requirements.extra as Record<string, unknown>;\n const verifyingContract = extra.verifyingContract as Address;\n const network = requirements.network as string;\n const chainId = parseInt(network.split(':')[1]);\n\n const nonce = `0x${randomBytes(32).toString('hex')}` as Hex;\n const now = Math.floor(Date.now() / 1000);\n\n const authorization = {\n from: this.account.address,\n to: requirements.payTo as Address,\n value: requirements.amount as string,\n validAfter: (now - 600).toString(),\n validBefore: (now + (requirements.maxTimeoutSeconds as number)).toString(),\n nonce,\n };\n\n const signature = await this.account.signTypedData({\n domain: {\n name: 'GatewayWalletBatched',\n version: '1',\n chainId,\n verifyingContract,\n },\n types: {\n TransferWithAuthorization: [\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 primaryType: 'TransferWithAuthorization',\n message: {\n from: authorization.from,\n to: authorization.to,\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n },\n });\n\n return {\n x402Version,\n payload: { authorization, signature },\n };\n }\n\n // ============================================================================\n // WITHDRAW (Instant way to get USDC out)\n // ============================================================================\n\n /**\n * Withdraw USDC from Gateway to your wallet.\n *\n * By default, withdraws to the same chain (instant, no 7-day delay).\n * Optionally, withdraw to a different chain (requires gas on destination).\n *\n * @param amount - Amount of USDC to withdraw (as a decimal string)\n * @param options - Optional withdrawal options\n * @returns Withdrawal result with transaction hash\n *\n * @example\n * ```typescript\n * // Withdraw to same chain (instant!)\n * await gateway.withdraw('50');\n *\n * // Withdraw to Base Sepolia (requires ETH on Base for gas)\n * await gateway.withdraw('25', { chain: 'baseSepolia' });\n * ```\n */\n async withdraw(\n amount: string,\n options?: {\n /** Destination chain (defaults to same chain) */\n chain?: SupportedChainName;\n /** Recipient address (defaults to your address) */\n recipient?: Address;\n /** Max fee willing to pay in USDC (defaults to 2.01) */\n maxFee?: string;\n },\n ): Promise<WithdrawResult> {\n // Find destination chain config\n const destinationChainName = options?.chain ?? this.getChainName();\n const destConfig = CHAIN_CONFIGS[destinationChainName];\n if (!destConfig) {\n throw new Error(`Unsupported destination chain: ${destinationChainName}`);\n }\n\n const withdrawAmount = parseUnits(amount, 6);\n const recipient = options?.recipient ?? this.account.address;\n const maxFee = parseUnits(options?.maxFee ?? '2.01', 6);\n\n // Check available balance\n const balances = await this.getBalances();\n if (balances.gateway.available < withdrawAmount) {\n throw new Error(\n `Insufficient available balance. Have: ${balances.gateway.formattedAvailable}, Need: ${amount}`,\n );\n }\n\n // Create burn intent\n const burnIntent = this.createBurnIntent(\n this.chainConfig,\n destConfig,\n withdrawAmount,\n recipient,\n maxFee,\n );\n\n // Sign the burn intent\n const signature = await this.account.signTypedData({\n domain: { name: 'GatewayWallet', version: '1' },\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n ],\n TransferSpec: [\n { name: 'version', type: 'uint32' },\n { name: 'sourceDomain', type: 'uint32' },\n { name: 'destinationDomain', type: 'uint32' },\n { name: 'sourceContract', type: 'bytes32' },\n { name: 'destinationContract', type: 'bytes32' },\n { name: 'sourceToken', type: 'bytes32' },\n { name: 'destinationToken', type: 'bytes32' },\n { name: 'sourceDepositor', type: 'bytes32' },\n { name: 'destinationRecipient', type: 'bytes32' },\n { name: 'sourceSigner', type: 'bytes32' },\n { name: 'destinationCaller', type: 'bytes32' },\n { name: 'value', type: 'uint256' },\n { name: 'salt', type: 'bytes32' },\n { name: 'hookData', type: 'bytes' },\n ],\n BurnIntent: [\n { name: 'maxBlockHeight', type: 'uint256' },\n { name: 'maxFee', type: 'uint256' },\n { name: 'spec', type: 'TransferSpec' },\n ],\n },\n primaryType: 'BurnIntent',\n message: burnIntent,\n });\n\n // Get attestation from Gateway API\n const apiUrl = this.isTestnet() ? GATEWAY_API_TESTNET : GATEWAY_API_MAINNET;\n const response = await fetch(`${apiUrl}/transfer`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify([{ burnIntent, signature }], (_, v) =>\n typeof v === 'bigint' ? v.toString() : v,\n ),\n });\n\n const result = (await response.json()) as {\n success?: boolean;\n error?: string;\n message?: string;\n attestation?: string;\n signature?: string;\n };\n\n if (\n result.success === false ||\n result.error ||\n !result.attestation ||\n !result.signature\n ) {\n throw new Error(\n `Gateway API error: ${result.message || result.error || JSON.stringify(result)}`,\n );\n }\n\n // Create destination chain client for minting\n const destTransport = destConfig.rpcUrl ? http(destConfig.rpcUrl) : http();\n const destWalletClient = createWalletClient({\n account: this.account,\n chain: destConfig.chain,\n transport: destTransport,\n });\n const destPublicClient = createPublicClient({\n chain: destConfig.chain,\n transport: destTransport,\n });\n\n // Mint on destination chain\n const mintTxHash = await destWalletClient.writeContract({\n address: destConfig.gatewayMinter,\n abi: GATEWAY_MINTER_ABI,\n functionName: 'gatewayMint',\n args: [result.attestation as Hex, result.signature as Hex],\n });\n\n try {\n await destPublicClient.waitForTransactionReceipt({ hash: mintTxHash });\n } catch (err) {\n throw new Error(`Mint transaction failed: ${mintTxHash}`, { cause: err });\n }\n\n return {\n mintTxHash,\n amount: withdrawAmount,\n formattedAmount: amount,\n sourceChain: this.chainConfig.chain.name,\n destinationChain: destConfig.chain.name,\n recipient,\n };\n }\n\n /**\n * Transfer USDC to any supported chain (alias for withdraw with destination chain).\n * @deprecated Use `withdraw({ chain })` instead\n */\n async transfer(\n amount: string,\n destinationChain: SupportedChainName,\n recipient?: Address,\n ): Promise<WithdrawResult> {\n return this.withdraw(amount, { chain: destinationChain, recipient });\n }\n\n /**\n * Create a burn intent for a transfer.\n */\n private createBurnIntent(\n from: ChainConfig,\n to: ChainConfig,\n value: bigint,\n recipient: Address,\n maxFee: bigint,\n ) {\n const addressToBytes32 = (addr: string): Hex =>\n pad(addr.toLowerCase() as Address, { size: 32 });\n\n return {\n maxBlockHeight: maxUint256,\n maxFee,\n spec: {\n version: 1,\n sourceDomain: from.domain,\n destinationDomain: to.domain,\n sourceContract: addressToBytes32(from.gatewayWallet),\n destinationContract: addressToBytes32(to.gatewayMinter),\n sourceToken: addressToBytes32(from.usdc),\n destinationToken: addressToBytes32(to.usdc),\n sourceDepositor: addressToBytes32(this.account.address),\n destinationRecipient: addressToBytes32(recipient),\n sourceSigner: addressToBytes32(this.account.address),\n destinationCaller: addressToBytes32(zeroAddress),\n value,\n salt: `0x${randomBytes(32).toString('hex')}` as Hex,\n hookData: '0x' as Hex,\n },\n };\n }\n\n /**\n * Check if this client is connected to a testnet.\n */\n private isTestnet(): boolean {\n const testnetChains: SupportedChainName[] = [\n 'arbitrumSepolia',\n 'arcTestnet',\n 'avalancheFuji',\n 'baseSepolia',\n 'sepolia',\n 'hyperEvmTestnet',\n 'seiAtlantic',\n 'sonicTestnet',\n 'worldChainSepolia',\n ];\n return testnetChains.some(\n (name) => CHAIN_CONFIGS[name].domain === this.chainConfig.domain,\n );\n }\n\n // ============================================================================\n // TRUSTLESS WITHDRAWAL (Emergency use only)\n // ============================================================================\n\n /**\n * Get the trustless withdrawal delay in blocks (~7 days).\n *\n * NOTE: This is for the emergency trustless withdrawal flow only.\n * For normal withdrawals, use `transfer()` to the same chain.\n *\n * @returns Number of blocks to wait after initiating trustless withdrawal\n */\n async getTrustlessWithdrawalDelay(): Promise<bigint> {\n return this.publicClient.readContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'withdrawalDelay',\n });\n }\n\n /**\n * Get the block at which a pending trustless withdrawal becomes available.\n *\n * @param address - Optional address to check (defaults to account address)\n * @returns Block number, or 0n if no pending withdrawal\n */\n async getTrustlessWithdrawalBlock(address?: Address): Promise<bigint> {\n const target = address ?? this.account.address;\n return this.publicClient.readContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'withdrawalBlock',\n args: [this.chainConfig.usdc, target],\n });\n }\n\n /**\n * Initiate a trustless withdrawal from the Gateway Wallet.\n *\n * ⚠️ **WARNING: This is for emergency use only!**\n *\n * Use this only when Circle's Gateway API is unavailable. For normal\n * withdrawals, use `transfer()` to the same chain - it's instant.\n *\n * After calling this, you must wait ~7 days (`withdrawalDelay` blocks)\n * before calling `completeTrustlessWithdrawal()`.\n *\n * @param amount - Amount of USDC to withdraw (as a decimal string)\n * @returns Withdrawal initiation result\n */\n async initiateTrustlessWithdrawal(\n amount: string,\n ): Promise<TrustlessWithdrawalInitResult> {\n const withdrawAmount = parseUnits(amount, 6);\n\n // Check available balance\n const balance = await this.getBalance();\n if (balance.available < withdrawAmount) {\n throw new Error(\n `Insufficient available balance. Have: ${balance.formattedAvailable}, Need: ${amount}`,\n );\n }\n\n // Initiate withdrawal\n const txHash = await this.walletClient.writeContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'initiateWithdrawal',\n args: [this.chainConfig.usdc, withdrawAmount],\n gas: 100000n,\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n } catch (err) {\n throw new Error(`Trustless withdrawal initiation failed: ${txHash}`, {\n cause: err,\n });\n }\n\n // Get the withdrawal block\n const withdrawalBlock = await this.getTrustlessWithdrawalBlock();\n\n return {\n txHash,\n amount: withdrawAmount,\n formattedAmount: amount,\n withdrawalBlock,\n };\n }\n\n /**\n * Complete a trustless withdrawal after the ~7-day delay period.\n *\n * ⚠️ **WARNING: This is for emergency use only!**\n *\n * Use this only when Circle's Gateway API is unavailable. For normal\n * withdrawals, use `transfer()` to the same chain - it's instant.\n *\n * @returns Withdrawal result\n */\n async completeTrustlessWithdrawal(): Promise<TrustlessWithdrawalResult> {\n // Check withdrawable balance\n const balance = await this.getBalance();\n if (balance.withdrawable === 0n) {\n const withdrawalBlock = await this.getTrustlessWithdrawalBlock();\n const currentBlock = await this.publicClient.getBlockNumber();\n\n if (withdrawalBlock > 0n && currentBlock < withdrawalBlock) {\n throw new Error(\n `Trustless withdrawal not yet available. Current block: ${currentBlock}, Available at: ${withdrawalBlock}`,\n );\n }\n\n throw new Error(\n 'No withdrawable balance. Call initiateTrustlessWithdrawal() first.',\n );\n }\n\n const withdrawAmount = balance.withdrawable;\n\n // Complete withdrawal\n const txHash = await this.walletClient.writeContract({\n address: this.chainConfig.gatewayWallet,\n abi: GATEWAY_WALLET_ABI,\n functionName: 'withdraw',\n args: [this.chainConfig.usdc],\n gas: 100000n,\n });\n\n try {\n await this.publicClient.waitForTransactionReceipt({ hash: txHash });\n } catch (err) {\n throw new Error(`Trustless withdrawal completion failed: ${txHash}`, {\n cause: err,\n });\n }\n\n return {\n txHash,\n amount: withdrawAmount,\n formattedAmount: formatUnits(withdrawAmount, 6),\n };\n }\n}\n"],"mappings":"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","names":["import_viem","data"]}
|