@x402x/facilitator-sdk 2.0.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.
- package/README.md +307 -0
- package/dist/index.d.mts +189 -0
- package/dist/index.d.ts +189 -0
- package/dist/index.js +994 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +948 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validation.ts","../src/settlement.ts","../src/facilitator.ts"],"names":["parseEvmExactPayload","FacilitatorValidationError","getNetworkConfig","privateKeyToAccount","isSettlementMode"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Validation utilities for @x402x/facilitator-sdk\n *\n * Provides parameter validation and security checks for SettlementRouter integration\n */\n\nimport type { SettlementExtraCore, NetworkConfig, Address, Network } from \"@x402x/extensions\";\nimport { FacilitatorValidationError } from \"@x402x/extensions\";\n\n/**\n * Check if an Ethereum address is valid\n */\nexport function isValidEthereumAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Check if a hex string is valid\n */\nexport function isValidHex(hex: string): boolean {\n return /^0x[a-fA-F0-9]*$/.test(hex) && hex.length % 2 === 0 && hex.length >= 2;\n}\n\n/**\n * Check if a string is a valid 32-byte hex (for salt, nonce, etc.)\n */\nexport function isValid32ByteHex(hex: string): boolean {\n return /^0x[a-fA-F0-9]{64}$/.test(hex);\n}\n\n/**\n * Check if a string is a valid 256-bit number (for values, fees, timestamps)\n */\nexport function isValid256BitHex(hex: string): boolean {\n return /^0x[a-fA-F0-9]{1,64}$/.test(hex);\n}\n\n/**\n * Validate SettlementRouter address against allowed list\n */\nexport function validateSettlementRouter(\n network: string,\n router: Address,\n allowedRouters?: Record<string, string[]>,\n networkConfig?: NetworkConfig,\n): Address {\n // Check if address is valid\n if (!isValidEthereumAddress(router)) {\n throw new FacilitatorValidationError(`Invalid SettlementRouter address: ${router}`);\n }\n\n // Check against allowed routers if provided\n if (allowedRouters && network in allowedRouters) {\n const networkAllowedRouters = allowedRouters[network];\n if (networkAllowedRouters.length > 0 && !networkAllowedRouters.includes(router)) {\n throw new FacilitatorValidationError(\n `SettlementRouter ${router} not allowed for network ${network}. ` +\n `Allowed routers: ${networkAllowedRouters.join(\", \")}`,\n );\n }\n }\n\n // Check against network config if available\n if (networkConfig?.settlementRouter && router !== networkConfig.settlementRouter) {\n throw new FacilitatorValidationError(\n `SettlementRouter ${router} does not match network config expected router ${networkConfig.settlementRouter}`,\n );\n }\n\n return router;\n}\n\n/**\n * Validate settlement extra parameters\n */\nexport function validateSettlementExtra(extra: unknown): SettlementExtraCore {\n if (!extra || typeof extra !== \"object\") {\n throw new FacilitatorValidationError(\"Missing or invalid extra field\");\n }\n\n const e = extra as Record<string, any>;\n\n // Validate required fields with type checking\n if (!e.settlementRouter || typeof e.settlementRouter !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid settlementRouter\");\n }\n if (!isValidEthereumAddress(e.settlementRouter)) {\n throw new FacilitatorValidationError(\"Invalid settlementRouter address format\");\n }\n\n if (!e.salt || typeof e.salt !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid salt\");\n }\n if (!isValid32ByteHex(e.salt)) {\n throw new FacilitatorValidationError(\"Salt must be a 32-byte hex string\");\n }\n\n if (!e.payTo || typeof e.payTo !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid payTo\");\n }\n if (!isValidEthereumAddress(e.payTo)) {\n throw new FacilitatorValidationError(\"Invalid payTo address format\");\n }\n\n if (!e.facilitatorFee || typeof e.facilitatorFee !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid facilitatorFee\");\n }\n if (!isValid256BitHex(e.facilitatorFee)) {\n throw new FacilitatorValidationError(\"Facilitator fee must be a valid hex number\");\n }\n\n if (!e.hook || typeof e.hook !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid hook\");\n }\n if (!isValidEthereumAddress(e.hook)) {\n throw new FacilitatorValidationError(\"Invalid hook address format\");\n }\n\n if (!e.hookData || typeof e.hookData !== \"string\") {\n throw new FacilitatorValidationError(\"Missing or invalid hookData\");\n }\n if (!isValidHex(e.hookData)) {\n throw new FacilitatorValidationError(\"Hook data must be valid hex\");\n }\n\n return {\n settlementRouter: e.settlementRouter,\n salt: e.salt,\n payTo: e.payTo,\n facilitatorFee: e.facilitatorFee,\n hook: e.hook,\n hookData: e.hookData,\n };\n}\n\n/**\n * Validate network string format\n */\nexport function validateNetwork(network: string): Network {\n if (!network || typeof network !== \"string\") {\n throw new FacilitatorValidationError(\"Invalid network: must be a non-empty string\");\n }\n\n // Allow common network formats (eip155:84532, base-sepolia, etc.)\n if (!/^(eip155:\\d+|[a-z][a-z0-9-]*[a-z0-9])$/.test(network)) {\n throw new FacilitatorValidationError(`Invalid network format: ${network}`);\n }\n\n return network as Network;\n}\n\n/**\n * Validate facilitator configuration\n */\nexport function validateFacilitatorConfig(config: {\n signer?: string;\n privateKey?: string;\n allowedRouters?: Record<string, string[]>;\n rpcUrls?: Record<string, string>;\n}): void {\n // Debug: log what we received\n // Either signer or privateKey must be provided\n if (!config.signer && !config.privateKey) {\n throw new FacilitatorValidationError(\n \"Missing signer or privateKey in facilitator configuration\",\n );\n }\n\n // Validate signer if provided\n if (config.signer) {\n if (!isValidEthereumAddress(config.signer)) {\n throw new FacilitatorValidationError(`Invalid signer address: ${config.signer}`);\n }\n }\n\n // Validate private key if provided\n if (config.privateKey) {\n // Private key should be a 32-byte hex string (64 hex chars), with optional 0x prefix\n const privateKey = config.privateKey;\n const hasPrefix = privateKey.startsWith(\"0x\") || privateKey.startsWith(\"0X\");\n const hexBody = hasPrefix ? privateKey.slice(2) : privateKey;\n\n // Validate that it's a valid 64-character hex string (32 bytes)\n if (!/^[a-fA-F0-9]{64}$/.test(hexBody)) {\n throw new FacilitatorValidationError(\n \"Invalid private key format: must be 32-byte hex string (64 hex chars, with optional 0x prefix)\",\n );\n }\n }\n\n if (config.allowedRouters) {\n for (const [network, routers] of Object.entries(config.allowedRouters)) {\n validateNetwork(network);\n\n if (!Array.isArray(routers)) {\n throw new FacilitatorValidationError(`Allowed routers for ${network} must be an array`);\n }\n\n for (const router of routers) {\n if (!isValidEthereumAddress(router)) {\n throw new FacilitatorValidationError(`Invalid router address for ${network}: ${router}`);\n }\n }\n }\n }\n\n if (config.rpcUrls) {\n for (const [network, rpcUrl] of Object.entries(config.rpcUrls)) {\n validateNetwork(network);\n\n if (typeof rpcUrl !== \"string\" || !rpcUrl.startsWith(\"http\")) {\n throw new FacilitatorValidationError(`Invalid RPC URL for ${network}: ${rpcUrl}`);\n }\n }\n }\n}\n\n/**\n * Validate gas limit configuration\n */\nexport function validateGasLimit(gasLimit: bigint): void {\n if (gasLimit <= 0n) {\n throw new FacilitatorValidationError(\"Gas limit must be positive\");\n }\n\n if (gasLimit > 10_000_000n) {\n throw new FacilitatorValidationError(\"Gas limit too large (> 10M)\");\n }\n}\n\n/**\n * Validate gas multiplier\n */\nexport function validateGasMultiplier(multiplier: number): void {\n if (multiplier <= 0) {\n throw new FacilitatorValidationError(\"Gas multiplier must be positive\");\n }\n\n if (multiplier > 5) {\n throw new FacilitatorValidationError(\"Gas multiplier too large (> 5x)\");\n }\n}\n\n/**\n * Validate fee amount against minimum and maximum\n */\nexport function validateFeeAmount(fee: string, minFee?: string, maxFee?: string): void {\n let feeBigInt: bigint;\n\n try {\n feeBigInt = BigInt(fee);\n } catch (error) {\n throw new FacilitatorValidationError(`Invalid fee amount: ${fee}. Must be a valid number.`);\n }\n\n if (feeBigInt < 0n) {\n throw new FacilitatorValidationError(\"Fee cannot be negative\");\n }\n\n if (minFee && feeBigInt < BigInt(minFee)) {\n throw new FacilitatorValidationError(`Fee below minimum: ${fee} < ${minFee}`);\n }\n\n if (maxFee && feeBigInt > BigInt(maxFee)) {\n throw new FacilitatorValidationError(`Fee above maximum: ${fee} > ${maxFee}`);\n }\n}\n","/**\n * SettlementRouter integration utilities for @x402x/facilitator-sdk\n *\n * Provides direct viem integration with SettlementRouter contracts\n */\n\nimport type { Address, Hex } from \"viem\";\nimport {\n createPublicClient,\n createWalletClient,\n http,\n type PublicClient,\n type WalletClient,\n type Chain,\n type Transport,\n type Account,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { FacilitatorConfig, SettlementRouterParams } from \"@x402x/extensions\";\nimport { SETTLEMENT_ROUTER_ABI } from \"@x402x/extensions\";\nimport type { PaymentRequirements, PaymentPayload, SettleResponse } from \"@x402/core/types\";\nimport {\n validateGasLimit,\n validateGasMultiplier,\n validateSettlementRouter,\n validateSettlementExtra,\n} from \"./validation.js\";\nimport {\n isSettlementMode,\n parseSettlementExtra,\n getNetworkConfig,\n toCanonicalNetworkKey,\n getNetworkName,\n type NetworkConfig,\n} from \"@x402x/extensions\";\n\n/**\n * Convert NetworkConfig to viem Chain\n * \n * @param networkConfig - Network configuration\n * @param rpcUrl - RPC URL for the network\n * @returns viem Chain object\n */\nfunction networkConfigToChain(networkConfig: NetworkConfig, rpcUrl: string): Chain {\n return {\n id: networkConfig.chainId,\n name: networkConfig.name,\n nativeCurrency: {\n name: networkConfig.metadata?.nativeToken || \"ETH\",\n symbol: networkConfig.metadata?.nativeToken || \"ETH\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [rpcUrl],\n },\n },\n blockExplorers: {\n default: {\n name: \"Explorer\",\n url: (() => {\n const addressSuffix = \"/address/\";\n const baseUrl = networkConfig.addressExplorerBaseUrl;\n return baseUrl.endsWith(addressSuffix)\n ? baseUrl.slice(0, -addressSuffix.length)\n : baseUrl;\n })(),\n },\n },\n testnet: networkConfig.type === \"testnet\",\n };\n}\n\n/**\n * Create viem public client for a network\n *\n * @param network - Network identifier (V1 name or V2 CAIP-2 format)\n * @param rpcUrls - Optional custom RPC URLs\n */\nexport function createPublicClientForNetwork(\n network: string,\n rpcUrls?: Record<string, string>,\n): PublicClient {\n // Normalize network identifier: any format -> CAIP-2 -> V1 name\n const canonicalNetwork = toCanonicalNetworkKey(network);\n const v1NetworkName = getNetworkName(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkName);\n\n if (!networkConfig) {\n throw new Error(`Network configuration not found for network: ${network}`);\n }\n\n // Use provided RPC URL or require it to be provided\n const rpcUrl =\n rpcUrls?.[network] ||\n rpcUrls?.[v1NetworkName] ||\n rpcUrls?.[canonicalNetwork];\n\n if (!rpcUrl) {\n throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);\n }\n\n const chain = networkConfigToChain(networkConfig, rpcUrl);\n\n return createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n}\n\n/**\n * Create viem wallet client for a network\n * If privateKey is provided, uses local signing (works with standard RPC providers)\n * If only signer address is provided, requires node to have the account unlocked\n */\nexport function createWalletClientForNetwork(\n network: string,\n signer?: Address,\n rpcUrls?: Record<string, string>,\n transport?: Transport,\n privateKey?: string,\n): WalletClient {\n // Normalize network identifier: any format -> CAIP-2 -> V1 name\n const canonicalNetwork = toCanonicalNetworkKey(network);\n const v1NetworkName = getNetworkName(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkName);\n\n // Use provided RPC URL or require it to be provided\n const rpcUrl =\n rpcUrls?.[network] ||\n rpcUrls?.[v1NetworkName] ||\n rpcUrls?.[canonicalNetwork];\n\n if (!rpcUrl) {\n throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);\n }\n\n // Validate that at least one of signer or privateKey is provided\n if (!signer && !privateKey) {\n throw new Error(\"Either signer or privateKey must be provided to create wallet client\");\n }\n\n // Use private key for local signing if provided, otherwise use signer address\n let account: Account | Address;\n if (privateKey) {\n account = privateKeyToAccount(privateKey as Hex);\n } else if (signer) {\n account = signer;\n } else {\n // This should never happen due to the validation above\n throw new Error(\"Failed to create account: neither signer nor privateKey provided\");\n }\n\n const chain = networkConfigToChain(networkConfig, rpcUrl);\n\n return createWalletClient({\n account,\n chain,\n transport: transport || http(rpcUrl),\n });\n}\n\n/**\n * Calculate gas limit for SettlementRouter transaction\n */\nexport function calculateGasLimit(\n baseFee: string,\n facilitatorFee: string,\n gasMultiplier: number = 1.2,\n): bigint {\n validateGasMultiplier(gasMultiplier);\n\n // Base gas estimation for settleAndExecute\n const baseGas = 200000n; // Conservative estimate\n\n // Add gas for hook execution (if any)\n const hookGas = facilitatorFee !== \"0x0\" ? 100000n : 0n;\n\n // Calculate total with multiplier\n const totalGas = ((baseGas + hookGas) * BigInt(Math.ceil(gasMultiplier * 100))) / 100n;\n\n validateGasLimit(totalGas);\n return totalGas;\n}\n\n/**\n * Check if a settlement has already been executed\n */\nexport async function checkIfSettled(\n publicClient: PublicClient,\n router: Address,\n contextKey: Hex,\n): Promise<boolean> {\n try {\n const isSettled = await publicClient.readContract({\n address: router,\n abi: SETTLEMENT_ROUTER_ABI,\n functionName: \"isSettled\",\n args: [contextKey],\n });\n return isSettled;\n } catch (error) {\n throw new Error(\n `Failed to check settlement status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * Execute settlement via SettlementRouter\n */\nexport async function executeSettlementWithRouter(\n walletClient: WalletClient,\n params: SettlementRouterParams,\n config: {\n gasLimit?: bigint;\n gasMultiplier?: number;\n } = {},\n): Promise<Hex> {\n const gasLimit =\n config.gasLimit || calculateGasLimit(\"0x0\", params.facilitatorFee, config.gasMultiplier);\n\n // Log params for debugging\n console.log(\"[executeSettlementWithRouter] Settlement params:\", {\n token: params.token,\n from: params.from,\n value: params.value,\n validAfter: params.validAfter,\n validBefore: params.validBefore,\n nonce: params.nonce,\n signature: params.signature ? `${params.signature.slice(0, 10)}...` : undefined,\n salt: params.salt,\n payTo: params.payTo,\n facilitatorFee: params.facilitatorFee,\n hook: params.hook,\n hookData: params.hookData,\n settlementRouter: params.settlementRouter,\n });\n\n try {\n const txHash = await walletClient.writeContract({\n address: params.settlementRouter,\n abi: SETTLEMENT_ROUTER_ABI,\n functionName: \"settleAndExecute\",\n args: [\n params.token,\n params.from,\n BigInt(params.value),\n BigInt(params.validAfter),\n BigInt(params.validBefore),\n params.nonce as Hex,\n params.signature as Hex,\n params.salt as Hex,\n params.payTo,\n BigInt(params.facilitatorFee),\n params.hook,\n params.hookData as Hex,\n ],\n gas: gasLimit,\n chain: walletClient.chain,\n account: walletClient.account ?? null,\n });\n\n return txHash;\n } catch (error) {\n if (error instanceof Error) {\n // Try to extract meaningful error information\n let errorMessage = `SettlementRouter execution failed: ${error.message}`;\n\n // Add context if available\n if (\"cause\" in error && error.cause) {\n errorMessage += ` (cause: ${error.cause})`;\n }\n\n throw new Error(errorMessage);\n }\n throw new Error(\"Unknown error during SettlementRouter execution\");\n }\n}\n\n/**\n * Wait for transaction receipt and extract relevant data\n */\nexport async function waitForSettlementReceipt(\n publicClient: PublicClient,\n txHash: Hex,\n timeoutMs: number = 30000,\n): Promise<{\n success: boolean;\n blockNumber?: bigint;\n gasUsed?: bigint;\n effectiveGasPrice?: bigint;\n}> {\n try {\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n timeout: timeoutMs,\n });\n\n return {\n success: receipt.status === \"success\",\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n effectiveGasPrice: receipt.effectiveGasPrice,\n };\n } catch (error) {\n throw new Error(\n `Failed to get transaction receipt: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n\n/**\n * EVM Exact Scheme Authorization structure\n * Standard x402 v2 authorization format for EIP-3009\n */\ninterface ExactEvmAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: string;\n}\n\n/**\n * EVM Exact Scheme Payload structure\n * Standard x402 v2 payload format\n */\ninterface ExactEvmPayload {\n signature: string;\n authorization: ExactEvmAuthorization;\n}\n\n/**\n * Parse EVM exact scheme payload from x402 v2 PaymentPayload\n * Extracts the standard authorization and signature fields\n */\nfunction parseEvmExactPayload(payload: any): ExactEvmPayload {\n // x402 v2 uses payload.payload for scheme-specific data\n const evmPayload = payload.payload as ExactEvmPayload;\n \n if (!evmPayload || !evmPayload.signature || !evmPayload.authorization) {\n throw new Error(\"Invalid EVM exact payload structure\");\n }\n \n return evmPayload;\n}\n\n/**\n * Parse settlement parameters from payment requirements and payload\n */\nexport function parseSettlementRouterParams(\n paymentRequirements: any,\n paymentPayload: any,\n): SettlementRouterParams {\n if (!isSettlementMode(paymentRequirements)) {\n throw new Error(\"Payment requirements are not in SettlementRouter mode\");\n }\n\n // Parse standard x402 v2 EVM exact payload\n const evmPayload = parseEvmExactPayload(paymentPayload);\n const extra = parseSettlementExtra(paymentRequirements.extra);\n\n return {\n token: paymentRequirements.asset as Address,\n from: evmPayload.authorization.from as Address,\n value: paymentRequirements.amount, // V2 uses 'amount', not 'maxAmountRequired'\n validAfter: evmPayload.authorization.validAfter || \"0x0\",\n validBefore: evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\",\n nonce: evmPayload.authorization.nonce,\n signature: evmPayload.signature,\n salt: extra.salt,\n payTo: extra.payTo as Address,\n facilitatorFee: extra.facilitatorFee,\n hook: extra.hook as Address,\n hookData: extra.hookData,\n settlementRouter: extra.settlementRouter as Address,\n };\n}\n\n/**\n * Execute settlement using provided WalletClient (for AccountPool integration)\n * This function allows external wallet management by accepting a pre-configured WalletClient\n */\nexport async function executeSettlementWithWalletClient(\n walletClient: WalletClient,\n publicClient: PublicClient,\n paymentRequirements: PaymentRequirements,\n paymentPayload: PaymentPayload,\n config: {\n gasLimit?: bigint;\n gasMultiplier?: number;\n timeoutMs?: number;\n allowedRouters?: Record<string, string[]>;\n } = {},\n): Promise<SettleResponse> {\n try {\n // Validate SettlementRouter\n // Normalize network identifier: any format -> CAIP-2 -> V1 name\n const canonicalNetwork = toCanonicalNetworkKey(paymentRequirements.network);\n const v1NetworkName = getNetworkName(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkName);\n\n const settlementRouter = paymentRequirements.extra?.settlementRouter as string | undefined;\n if (!settlementRouter) {\n throw new Error(\"Missing settlementRouter in payment requirements\");\n }\n\n validateSettlementRouter(\n paymentRequirements.network,\n settlementRouter as Address,\n config.allowedRouters,\n networkConfig,\n );\n\n // Parse settlement parameters\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n\n // Execute settlement with provided wallet client\n const txHash = await executeSettlementWithRouter(walletClient, params, {\n gasLimit: config.gasLimit,\n gasMultiplier: config.gasMultiplier,\n });\n\n // Wait for receipt\n const receipt = await waitForSettlementReceipt(publicClient, txHash, config.timeoutMs || 30000);\n\n return {\n success: receipt.success,\n transaction: txHash,\n network: paymentRequirements.network,\n payer: params.from, // Use params.from for consistency\n errorReason: receipt.success ? undefined : \"Transaction failed\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n\n // Extract payer consistently from params when possible\n let payer: string | undefined;\n try {\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n payer = params.from;\n } catch (parseError) {\n console.error(\"[executeSettlementWithWalletClient] Failed to parse params:\", parseError);\n // Try to extract from payload directly as fallback\n try {\n const evmPayload = parseEvmExactPayload(paymentPayload);\n payer = evmPayload.authorization.from;\n } catch {\n payer = undefined;\n }\n }\n\n // Log detailed error for debugging\n console.error(\"[executeSettlementWithWalletClient] Settlement failed:\", {\n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n network: paymentRequirements.network,\n asset: paymentRequirements.asset,\n payer,\n });\n\n return {\n success: false,\n transaction: \"\",\n network: paymentRequirements.network,\n payer,\n errorReason: errorMessage,\n };\n }\n}\n\n/**\n * Full settlement workflow using SettlementRouter\n * This function creates its own clients based on FacilitatorConfig\n */\nexport async function settleWithSettlementRouter(\n paymentRequirements: any,\n paymentPayload: any,\n config: FacilitatorConfig,\n options: {\n gasMultiplier?: number;\n gasLimit?: bigint;\n timeoutMs?: number;\n } = {},\n): Promise<SettleResponse> {\n try {\n // Validate configuration\n const networkConfig = getNetworkConfig(paymentRequirements.network);\n validateSettlementRouter(\n paymentRequirements.network,\n paymentRequirements.extra?.settlementRouter,\n config.allowedRouters,\n networkConfig,\n );\n\n // Parse settlement parameters\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n\n // Create clients\n const publicClient = createPublicClientForNetwork(paymentRequirements.network, config.rpcUrls);\n const walletClient = createWalletClientForNetwork(\n paymentRequirements.network,\n config.signer,\n config.rpcUrls,\n undefined,\n config.privateKey,\n );\n\n // Execute settlement\n const txHash = await executeSettlementWithRouter(walletClient, params, {\n gasLimit: options.gasLimit,\n gasMultiplier: options.gasMultiplier,\n });\n\n // Wait for receipt\n const receipt = await waitForSettlementReceipt(\n publicClient,\n txHash,\n options.timeoutMs || 30000,\n );\n\n return {\n success: receipt.success,\n transaction: txHash,\n network: paymentRequirements.network,\n payer: params.from,\n errorReason: receipt.success ? undefined : \"Transaction failed\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n \n // Extract payer from payload\n let payer: string | undefined;\n try {\n const evmPayload = parseEvmExactPayload(paymentPayload);\n payer = evmPayload.authorization.from;\n } catch {\n payer = undefined;\n }\n \n return {\n success: false,\n transaction: \"\",\n network: paymentRequirements.network,\n payer,\n errorReason: errorMessage,\n };\n }\n}\n","/**\n * RouterSettlementFacilitator implementation\n *\n * Implements SchemeNetworkFacilitator interface using SettlementRouter for atomic settlement\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse as X402SettleResponse,\n} from \"@x402/core/types\";\nimport type {\n Address,\n Network,\n} from \"./types.js\";\nimport type { FacilitatorConfig, VerifyResponse } from \"@x402x/extensions\";\nimport { FacilitatorValidationError, SettlementRouterError } from \"@x402x/extensions\";\nimport { isSettlementMode, parseSettlementExtra, getNetworkConfig } from \"@x402x/extensions\";\nimport { calculateCommitment } from \"@x402x/extensions\";\nimport {\n settleWithSettlementRouter,\n createPublicClientForNetwork,\n createWalletClientForNetwork,\n waitForSettlementReceipt,\n} from \"./settlement.js\";\nimport { verifyTypedData, parseErc6492Signature } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n// EIP-712 authorization types for EIP-3009\nconst authorizationTypes = {\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} as const;\n\n/**\n * EVM Exact Scheme Authorization structure\n * Standard x402 v2 authorization format for EIP-3009\n */\ninterface ExactEvmAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: string;\n}\n\n/**\n * EVM Exact Scheme Payload structure\n * Standard x402 v2 payload format\n */\ninterface ExactEvmPayload {\n signature: string;\n authorization: ExactEvmAuthorization;\n}\n\n/**\n * Parse EVM exact scheme payload from x402 v2 PaymentPayload\n * Extracts the standard authorization and signature fields\n * \n * @remarks\n * The type assertion is safe here because we validate the structure immediately after casting.\n * PaymentPayload.payload is typed as Record<string, unknown> to support multiple schemes,\n * but for EVM exact scheme, it follows the ExactEvmPayload structure.\n */\nfunction parseEvmExactPayload(payload: PaymentPayload): ExactEvmPayload {\n // x402 v2 uses payload.payload for scheme-specific data\n // Type assertion is followed by runtime validation\n const evmPayload = payload.payload as unknown as ExactEvmPayload;\n \n if (!evmPayload.signature) {\n throw new FacilitatorValidationError(\"Missing signature in EVM exact payload\");\n }\n \n if (!evmPayload.authorization) {\n throw new FacilitatorValidationError(\"Missing authorization in EVM exact payload\");\n }\n \n const auth = evmPayload.authorization;\n if (!auth.from || !auth.to || !auth.value || !auth.nonce) {\n throw new FacilitatorValidationError(\"Invalid authorization structure in EVM exact payload\");\n }\n \n return evmPayload;\n}\n\n// EIP-3009 ABI for token contracts\nconst eip3009ABI = [\n {\n inputs: [\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 { name: \"signature\", type: \"bytes\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\nimport {\n validateFacilitatorConfig,\n validateNetwork,\n validateSettlementExtra,\n validateSettlementRouter,\n validateFeeAmount,\n} from \"./validation.js\";\n\n/**\n * SchemeNetworkFacilitator implementation using SettlementRouter\n *\n * Provides atomic settlement with hooks and facilitator fee handling\n */\nexport class RouterSettlementFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n\n private readonly config: FacilitatorConfig;\n\n constructor(config: FacilitatorConfig) {\n // Validate configuration\n validateFacilitatorConfig(config);\n\n this.config = {\n // Default values\n gasConfig: {\n maxGasLimit: 5_000_000n,\n gasMultiplier: 1.2,\n },\n feeConfig: {\n minFee: \"0x0\",\n maxFee: \"0xFFFFFFFFFFFFFFFF\",\n },\n timeouts: {\n verify: 5000, // 5 seconds\n settle: 30000, // 30 seconds\n },\n // Override with user config\n ...config,\n };\n }\n\n /**\n * Get scheme-specific extra data for responses\n */\n getExtra(network: string): Record<string, unknown> | undefined {\n try {\n // Validate network format first\n if (!network || typeof network !== \"string\" || network.trim() === \"\") {\n return undefined;\n }\n\n const networkConfig = getNetworkConfig(network);\n if (!networkConfig) {\n return undefined;\n }\n\n return {\n scheme: this.scheme,\n caipFamily: this.caipFamily,\n settlementRouter: networkConfig?.settlementRouter,\n defaultAsset: networkConfig?.defaultAsset,\n supportedNetworks: [network], // Can be expanded for multi-network support\n };\n } catch (error) {\n return undefined;\n }\n }\n\n /**\n * Get signer addresses for the network\n * Derives from privateKey if signer address not explicitly provided\n */\n getSigners(network: string): string[] {\n validateNetwork(network);\n // Use provided signer or derive from private key\n if (this.config.signer) {\n return [this.config.signer];\n }\n if (this.config.privateKey) {\n const account = privateKeyToAccount(this.config.privateKey as `0x${string}`);\n return [account.address];\n }\n throw new Error(\"Either signer or privateKey must be provided in FacilitatorConfig\");\n }\n\n /**\n * Verify payment payload without executing settlement\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n try {\n // Basic validations\n this.validateBasicPayload(payload, requirements);\n\n // Check if SettlementRouter mode\n const isRouterSettlement = isSettlementMode(requirements);\n\n if (isRouterSettlement) {\n return await this.verifySettlementRouter(payload, requirements);\n } else {\n return await this.verifyStandard(payload, requirements);\n }\n } catch (error) {\n // Extract payer from payload if possible\n let payer: string | undefined;\n try {\n const evmPayload = parseEvmExactPayload(payload);\n payer = evmPayload.authorization.from;\n } catch {\n payer = undefined;\n }\n\n if (error instanceof FacilitatorValidationError || error instanceof SettlementRouterError) {\n return {\n isValid: false,\n invalidReason: error.message,\n payer: payer || \"\",\n };\n }\n\n // Handle unexpected errors\n return {\n isValid: false,\n invalidReason: `Verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n payer: payer || \"\",\n };\n }\n }\n\n /**\n * Settle payment by executing blockchain transaction\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<X402SettleResponse> {\n try {\n // Pre-verify payment\n const verification = await this.verify(payload, requirements);\n if (!verification.isValid) {\n return {\n success: false,\n transaction: \"\",\n network: requirements.network,\n payer: verification.payer,\n errorReason: verification.invalidReason || \"Payment verification failed\",\n };\n }\n\n // Check if SettlementRouter mode\n const isRouterSettlement = isSettlementMode(requirements);\n\n if (isRouterSettlement) {\n return await this.settleWithRouter(payload, requirements);\n } else {\n return await this.settleStandard(payload, requirements);\n }\n } catch (error) {\n // Extract payer from payload if possible\n let payer: string | undefined;\n try {\n const evmPayload = parseEvmExactPayload(payload);\n payer = evmPayload.authorization.from;\n } catch {\n payer = undefined;\n }\n\n return {\n success: false,\n transaction: \"\",\n network: requirements.network,\n payer: payer || \"\",\n errorReason: error instanceof Error ? error.message : \"Unknown settlement error\",\n };\n }\n }\n\n /**\n * Validate basic payload and requirements\n */\n private validateBasicPayload(payload: PaymentPayload, requirements: PaymentRequirements): void {\n // Validate network\n validateNetwork(requirements.network);\n\n // Validate scheme match\n if (requirements.scheme !== this.scheme) {\n throw new FacilitatorValidationError(\n `Scheme mismatch: expected ${this.scheme}, got ${requirements.scheme}`,\n );\n }\n\n // Validate CAIP family\n if (!requirements.network.startsWith(\"eip155:\")) {\n throw new FacilitatorValidationError(\n `Unsupported network family: ${requirements.network}. Only EVM networks (eip155:*) are supported`,\n );\n }\n\n // Parse and validate EVM exact payload structure\n const evmPayload = parseEvmExactPayload(payload);\n\n if (!requirements.asset) {\n throw new FacilitatorValidationError(\"Missing asset in payment requirements\");\n }\n\n if (!requirements.payTo) {\n throw new FacilitatorValidationError(\"Missing payTo address in payment requirements\");\n }\n\n if (!requirements.amount) {\n throw new FacilitatorValidationError(\"Missing amount in payment requirements\");\n }\n }\n\n /**\n * Verify payment for SettlementRouter mode\n */\n private async verifySettlementRouter(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n // Parse EVM exact payload\n const evmPayload = parseEvmExactPayload(payload);\n const payer = evmPayload.authorization.from;\n\n // Parse and validate settlement extra\n const settlementExtra = validateSettlementExtra(requirements.extra);\n\n // Validate SettlementRouter address\n const networkConfig = getNetworkConfig(requirements.network);\n validateSettlementRouter(\n requirements.network,\n settlementExtra.settlementRouter as Address,\n this.config.allowedRouters,\n networkConfig,\n );\n\n // Validate facilitator fee against configuration\n validateFeeAmount(\n settlementExtra.facilitatorFee,\n this.config.feeConfig?.minFee,\n this.config.feeConfig?.maxFee,\n );\n\n // Create public client for balance checks and commitment verification\n const publicClient = createPublicClientForNetwork(requirements.network, this.config.rpcUrls);\n\n // Get EIP-712 domain info from requirements.extra (SettlementExtra includes name and version)\n const extraWithDomain = requirements.extra as any;\n const eip712Name = extraWithDomain?.name || \"USD Coin\";\n const eip712Version = extraWithDomain?.version || \"2\";\n\n // Signature verification using EIP-712 typed data\n try {\n // Parse signature (handle ERC-6492 for smart wallets)\n const parsedSignature = parseErc6492Signature(evmPayload.signature as `0x${string}`);\n\n // Build EIP-712 typed data for verification\n const typedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name: eip712Name,\n version: eip712Version,\n chainId: parseInt(requirements.network.split(\":\")[1]),\n verifyingContract: requirements.asset as Address,\n },\n message: {\n from: payer as Address,\n to: evmPayload.authorization.to as Address,\n value: BigInt(evmPayload.authorization.value),\n validAfter: BigInt(evmPayload.authorization.validAfter || \"0x0\"),\n validBefore: BigInt(evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\"),\n nonce: evmPayload.authorization.nonce as `0x${string}`,\n },\n };\n\n // Verify signature using viem\n const isValidSignature = await verifyTypedData({\n address: payer as Address,\n ...typedData,\n signature: parsedSignature.signature,\n });\n\n if (!isValidSignature) {\n return {\n isValid: false,\n invalidReason: \"Invalid signature\",\n payer,\n };\n }\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Signature verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n payer,\n };\n }\n\n // Commitment verification using @x402x/extensions\n try {\n const chainId = parseInt(requirements.network.split(\":\")[1]);\n const calculatedCommitment = calculateCommitment({\n chainId,\n hub: settlementExtra.settlementRouter,\n asset: requirements.asset,\n from: payer,\n value: evmPayload.authorization.value,\n validAfter: evmPayload.authorization.validAfter || \"0x0\",\n validBefore: evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\",\n salt: settlementExtra.salt,\n payTo: settlementExtra.payTo,\n facilitatorFee: settlementExtra.facilitatorFee,\n hook: settlementExtra.hook,\n hookData: settlementExtra.hookData,\n });\n\n if (evmPayload.authorization.nonce !== calculatedCommitment) {\n return {\n isValid: false,\n invalidReason: \"Commitment mismatch: nonce does not match calculated commitment\",\n payer,\n };\n }\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Commitment verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n payer,\n };\n }\n\n // Balance checks using viem public client\n try {\n // Check token balance\n const balance = await publicClient.readContract({\n address: requirements.asset as Address,\n abi: [\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n ],\n functionName: \"balanceOf\",\n args: [payer as Address],\n });\n\n const totalRequired =\n BigInt(requirements.amount) + BigInt(settlementExtra.facilitatorFee);\n if (balance < totalRequired) {\n return {\n isValid: false,\n invalidReason: `Insufficient balance: have ${balance}, need ${totalRequired}`,\n payer,\n };\n }\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Balance check failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n payer,\n };\n }\n\n return {\n isValid: true,\n payer,\n };\n }\n\n /**\n * Verify payment for standard mode (fallback)\n */\n private async verifyStandard(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n // Parse EVM exact payload\n const evmPayload = parseEvmExactPayload(payload);\n const payer = evmPayload.authorization.from;\n\n // Create viem public client\n const publicClient = createPublicClientForNetwork(requirements.network, this.config.rpcUrls);\n\n try {\n // Parse signature (handle ERC-6492 if needed)\n const parsedSignature = parseErc6492Signature(evmPayload.signature as `0x${string}`);\n\n // Get EIP-712 domain info\n const extraAny = requirements.extra as any;\n const domainName = (extraAny?.name || \"USD Coin\") as string;\n const domainVersion = (extraAny?.version || \"3\") as string;\n\n // Build EIP-712 typed data for verification\n const typedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name: domainName,\n version: domainVersion,\n chainId: parseInt(requirements.network.split(\":\")[1]),\n verifyingContract: requirements.asset as Address,\n },\n message: {\n from: payer as Address,\n to: requirements.payTo as Address,\n value: BigInt(requirements.amount),\n validAfter: BigInt(evmPayload.authorization.validAfter || \"0x0\"),\n validBefore: BigInt(evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\"),\n nonce: evmPayload.authorization.nonce as `0x${string}`,\n },\n };\n\n // Verify signature\n const isValidSignature = await verifyTypedData({\n address: payer as Address,\n ...typedData,\n signature: parsedSignature.signature,\n });\n\n if (!isValidSignature) {\n return {\n isValid: false,\n invalidReason: \"Invalid signature\",\n payer,\n };\n }\n\n // Check balance\n const balance = await publicClient.readContract({\n address: requirements.asset as Address,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payer as Address],\n });\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"Insufficient balance\",\n payer,\n };\n }\n\n return {\n isValid: true,\n payer,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Standard verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n payer,\n };\n }\n }\n\n /**\n * Settle payment using SettlementRouter\n */\n private async settleWithRouter(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<X402SettleResponse> {\n return await settleWithSettlementRouter(requirements, payload, this.config, {\n gasMultiplier: this.config.gasConfig?.gasMultiplier,\n timeoutMs: this.config.timeouts?.settle,\n });\n }\n\n /**\n * Settle payment using standard method (fallback)\n */\n private async settleStandard(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<X402SettleResponse> {\n // Parse EVM exact payload\n const evmPayload = parseEvmExactPayload(payload);\n const payer = evmPayload.authorization.from;\n\n const walletClient = createWalletClientForNetwork(\n requirements.network,\n this.config.signer,\n this.config.rpcUrls,\n undefined,\n this.config.privateKey,\n );\n const publicClient = createPublicClientForNetwork(requirements.network, this.config.rpcUrls);\n\n try {\n // Parse signature\n const parsedSignature = parseErc6492Signature(evmPayload.signature as `0x${string}`);\n\n // Execute EIP-3009 transfer\n const txHash = await walletClient.writeContract({\n address: requirements.asset as Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n payer as Address,\n requirements.payTo as Address,\n BigInt(requirements.amount),\n BigInt(evmPayload.authorization.validAfter || \"0x0\"),\n BigInt(evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\"),\n evmPayload.authorization.nonce as `0x${string}`,\n parsedSignature.signature,\n ],\n chain: walletClient.chain,\n account: walletClient.account ?? null,\n });\n\n // Wait for receipt\n const receipt = await waitForSettlementReceipt(publicClient, txHash);\n\n return {\n success: receipt.success,\n transaction: txHash,\n network: requirements.network,\n payer,\n errorReason: receipt.success ? undefined : \"Transaction failed\",\n };\n } catch (error) {\n return {\n success: false,\n transaction: \"\",\n network: requirements.network,\n payer,\n errorReason: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n}\n\n/**\n * Factory function to create RouterSettlementFacilitator instance\n */\nexport function createRouterSettlementFacilitator(\n config: FacilitatorConfig,\n): RouterSettlementFacilitator {\n return new RouterSettlementFacilitator(config);\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@x402x/facilitator-sdk",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "SchemeNetworkFacilitator SDK for x402x - enables router settlement with official x402 protocol",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"test:coverage": "vitest run --coverage",
|
|
24
|
+
"lint": "eslint src",
|
|
25
|
+
"format": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --write \"**/*.{ts,js,cjs,json,md}\"",
|
|
26
|
+
"format:check": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --check \"**/*.{ts,js,cjs,json,md}\""
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"x402",
|
|
30
|
+
"x402x",
|
|
31
|
+
"payment",
|
|
32
|
+
"settlement",
|
|
33
|
+
"facilitator",
|
|
34
|
+
"eip-3009",
|
|
35
|
+
"router-settlement"
|
|
36
|
+
],
|
|
37
|
+
"author": "Nuwa Protocol",
|
|
38
|
+
"license": "Apache-2.0",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@x402/core": "2.1.0",
|
|
41
|
+
"@x402/evm": "2.1.0",
|
|
42
|
+
"@x402x/extensions": "workspace:*",
|
|
43
|
+
"viem": "2.40.3"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.0.0",
|
|
47
|
+
"@types/node-fetch": "^2.6.13",
|
|
48
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
49
|
+
"@x402/hono": "2.1.0",
|
|
50
|
+
"eslint": "^9.0.0",
|
|
51
|
+
"hono": "^4.11.1",
|
|
52
|
+
"node-fetch": "^3.3.2",
|
|
53
|
+
"prettier": "3.5.2",
|
|
54
|
+
"tsup": "^8.0.0",
|
|
55
|
+
"typescript": "^5.5.0",
|
|
56
|
+
"vitest": "^1.0.0"
|
|
57
|
+
}
|
|
58
|
+
}
|