@x402x/facilitator-sdk 2.0.0 → 2.1.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/dist/index.d.mts CHANGED
@@ -108,6 +108,9 @@ declare function waitForSettlementReceipt(publicClient: PublicClient, txHash: He
108
108
  }>;
109
109
  /**
110
110
  * Parse settlement parameters from payment requirements and payload
111
+ *
112
+ * v2 behavior: Read from paymentPayload.extensions["x402x-router-settlement"].info first,
113
+ * fallback to paymentRequirements.extra for legacy compatibility.
111
114
  */
112
115
  declare function parseSettlementRouterParams(paymentRequirements: any, paymentPayload: any): SettlementRouterParams;
113
116
  /**
package/dist/index.d.ts CHANGED
@@ -108,6 +108,9 @@ declare function waitForSettlementReceipt(publicClient: PublicClient, txHash: He
108
108
  }>;
109
109
  /**
110
110
  * Parse settlement parameters from payment requirements and payload
111
+ *
112
+ * v2 behavior: Read from paymentPayload.extensions["x402x-router-settlement"].info first,
113
+ * fallback to paymentRequirements.extra for legacy compatibility.
111
114
  */
112
115
  declare function parseSettlementRouterParams(paymentRequirements: any, paymentPayload: any): SettlementRouterParams;
113
116
  /**
package/dist/index.js CHANGED
@@ -200,12 +200,12 @@ function networkConfigToChain(networkConfig, rpcUrl) {
200
200
  }
201
201
  function createPublicClientForNetwork(network, rpcUrls) {
202
202
  const canonicalNetwork = extensions.toCanonicalNetworkKey(network);
203
- const v1NetworkName = extensions.getNetworkName(canonicalNetwork);
204
- const networkConfig = extensions.getNetworkConfig(v1NetworkName);
203
+ const v1NetworkAlias = extensions.getNetworkAlias(canonicalNetwork);
204
+ const networkConfig = extensions.getNetworkConfig(v1NetworkAlias);
205
205
  if (!networkConfig) {
206
206
  throw new Error(`Network configuration not found for network: ${network}`);
207
207
  }
208
- const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkName] || rpcUrls?.[canonicalNetwork];
208
+ const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkAlias] || rpcUrls?.[canonicalNetwork];
209
209
  if (!rpcUrl) {
210
210
  throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);
211
211
  }
@@ -217,9 +217,9 @@ function createPublicClientForNetwork(network, rpcUrls) {
217
217
  }
218
218
  function createWalletClientForNetwork(network, signer, rpcUrls, transport, privateKey) {
219
219
  const canonicalNetwork = extensions.toCanonicalNetworkKey(network);
220
- const v1NetworkName = extensions.getNetworkName(canonicalNetwork);
221
- const networkConfig = extensions.getNetworkConfig(v1NetworkName);
222
- const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkName] || rpcUrls?.[canonicalNetwork];
220
+ const v1NetworkAlias = extensions.getNetworkAlias(canonicalNetwork);
221
+ const networkConfig = extensions.getNetworkConfig(v1NetworkAlias);
222
+ const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkAlias] || rpcUrls?.[canonicalNetwork];
223
223
  if (!rpcUrl) {
224
224
  throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);
225
225
  }
@@ -244,7 +244,7 @@ function createWalletClientForNetwork(network, signer, rpcUrls, transport, priva
244
244
  function calculateGasLimit(baseFee, facilitatorFee, gasMultiplier = 1.2) {
245
245
  validateGasMultiplier(gasMultiplier);
246
246
  const baseGas = 200000n;
247
- const hookGas = facilitatorFee !== "0x0" ? 100000n : 0n;
247
+ const hookGas = BigInt(facilitatorFee) === 0n ? 0n : 100000n;
248
248
  const totalGas = (baseGas + hookGas) * BigInt(Math.ceil(gasMultiplier * 100)) / 100n;
249
249
  validateGasLimit(totalGas);
250
250
  return totalGas;
@@ -341,17 +341,62 @@ function parseEvmExactPayload(payload) {
341
341
  }
342
342
  return evmPayload;
343
343
  }
344
+ function parseRouterSettlementFromExtensions(extensions) {
345
+ if (!extensions || typeof extensions !== "object") {
346
+ return void 0;
347
+ }
348
+ const ROUTER_SETTLEMENT_KEY = "x402x-router-settlement";
349
+ const routerSettlement = extensions[ROUTER_SETTLEMENT_KEY];
350
+ if (!routerSettlement || typeof routerSettlement !== "object") {
351
+ return void 0;
352
+ }
353
+ const info = routerSettlement.info;
354
+ if (!info || typeof info !== "object") {
355
+ return void 0;
356
+ }
357
+ if (typeof info.salt !== "string" || typeof info.settlementRouter !== "string" || typeof info.hook !== "string" || typeof info.hookData !== "string" || typeof info.finalPayTo !== "string") {
358
+ return void 0;
359
+ }
360
+ const facilitatorFee = typeof info.facilitatorFee === "string" ? info.facilitatorFee : "0";
361
+ return {
362
+ salt: info.salt,
363
+ settlementRouter: info.settlementRouter,
364
+ hook: info.hook,
365
+ hookData: info.hookData,
366
+ finalPayTo: info.finalPayTo,
367
+ facilitatorFee
368
+ };
369
+ }
344
370
  function parseSettlementRouterParams(paymentRequirements, paymentPayload) {
371
+ const evmPayload = parseEvmExactPayload(paymentPayload);
372
+ const extensionParams = parseRouterSettlementFromExtensions(paymentPayload.extensions);
373
+ if (extensionParams) {
374
+ return {
375
+ token: paymentRequirements.asset,
376
+ from: evmPayload.authorization.from,
377
+ value: paymentRequirements.amount,
378
+ validAfter: evmPayload.authorization.validAfter || "0x0",
379
+ validBefore: evmPayload.authorization.validBefore || "0xFFFFFFFFFFFFFFFF",
380
+ nonce: evmPayload.authorization.nonce,
381
+ signature: evmPayload.signature,
382
+ salt: extensionParams.salt,
383
+ payTo: extensionParams.finalPayTo,
384
+ facilitatorFee: extensionParams.facilitatorFee,
385
+ hook: extensionParams.hook,
386
+ hookData: extensionParams.hookData,
387
+ settlementRouter: extensionParams.settlementRouter
388
+ };
389
+ }
345
390
  if (!extensions.isSettlementMode(paymentRequirements)) {
346
- throw new Error("Payment requirements are not in SettlementRouter mode");
391
+ throw new Error(
392
+ "x402x router settlement parameters not found. Expected paymentPayload.extensions['x402x-router-settlement'].info (v2) or paymentRequirements.extra.settlementRouter (legacy)."
393
+ );
347
394
  }
348
- const evmPayload = parseEvmExactPayload(paymentPayload);
349
395
  const extra = extensions.parseSettlementExtra(paymentRequirements.extra);
350
396
  return {
351
397
  token: paymentRequirements.asset,
352
398
  from: evmPayload.authorization.from,
353
399
  value: paymentRequirements.amount,
354
- // V2 uses 'amount', not 'maxAmountRequired'
355
400
  validAfter: evmPayload.authorization.validAfter || "0x0",
356
401
  validBefore: evmPayload.authorization.validBefore || "0xFFFFFFFFFFFFFFFF",
357
402
  nonce: evmPayload.authorization.nonce,
@@ -366,20 +411,16 @@ function parseSettlementRouterParams(paymentRequirements, paymentPayload) {
366
411
  }
367
412
  async function executeSettlementWithWalletClient(walletClient, publicClient, paymentRequirements, paymentPayload, config = {}) {
368
413
  try {
414
+ const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
369
415
  const canonicalNetwork = extensions.toCanonicalNetworkKey(paymentRequirements.network);
370
- const v1NetworkName = extensions.getNetworkName(canonicalNetwork);
371
- const networkConfig = extensions.getNetworkConfig(v1NetworkName);
372
- const settlementRouter = paymentRequirements.extra?.settlementRouter;
373
- if (!settlementRouter) {
374
- throw new Error("Missing settlementRouter in payment requirements");
375
- }
416
+ const v1NetworkAlias = extensions.getNetworkAlias(canonicalNetwork);
417
+ const networkConfig = extensions.getNetworkConfig(v1NetworkAlias);
376
418
  validateSettlementRouter(
377
419
  paymentRequirements.network,
378
- settlementRouter,
420
+ params.settlementRouter,
379
421
  config.allowedRouters,
380
422
  networkConfig
381
423
  );
382
- const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
383
424
  const txHash = await executeSettlementWithRouter(walletClient, params, {
384
425
  gasLimit: config.gasLimit,
385
426
  gasMultiplier: config.gasMultiplier
@@ -426,14 +467,14 @@ async function executeSettlementWithWalletClient(walletClient, publicClient, pay
426
467
  }
427
468
  async function settleWithSettlementRouter(paymentRequirements, paymentPayload, config, options = {}) {
428
469
  try {
470
+ const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
429
471
  const networkConfig = extensions.getNetworkConfig(paymentRequirements.network);
430
472
  validateSettlementRouter(
431
473
  paymentRequirements.network,
432
- paymentRequirements.extra?.settlementRouter,
474
+ params.settlementRouter,
433
475
  config.allowedRouters,
434
476
  networkConfig
435
477
  );
436
- const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
437
478
  const publicClient = createPublicClientForNetwork(paymentRequirements.network, config.rpcUrls);
438
479
  const walletClient = createWalletClientForNetwork(
439
480
  paymentRequirements.network,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validation.ts","../src/settlement.ts","../src/facilitator.ts"],"names":["FacilitatorValidationError","toCanonicalNetworkKey","getNetworkName","getNetworkConfig","createPublicClient","http","privateKeyToAccount","createWalletClient","SETTLEMENT_ROUTER_ABI","isSettlementMode","parseSettlementExtra","parseEvmExactPayload","SettlementRouterError","parseErc6492Signature","verifyTypedData","calculateCommitment"],"mappings":"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","file":"index.js","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"]}
1
+ {"version":3,"sources":["../src/validation.ts","../src/settlement.ts","../src/facilitator.ts"],"names":["FacilitatorValidationError","toCanonicalNetworkKey","getNetworkAlias","getNetworkConfig","createPublicClient","http","privateKeyToAccount","createWalletClient","SETTLEMENT_ROUTER_ABI","isSettlementMode","parseSettlementExtra","parseEvmExactPayload","SettlementRouterError","parseErc6492Signature","verifyTypedData","calculateCommitment"],"mappings":"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","file":"index.js","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 getNetworkAlias,\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 v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\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?.[v1NetworkAlias] ||\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 v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\n\n // Use provided RPC URL or require it to be provided\n const rpcUrl =\n rpcUrls?.[network] ||\n rpcUrls?.[v1NetworkAlias] ||\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 // Treat both \"0\" and \"0x0\" (and any numeric zero) as no-fee.\n const hookGas = BigInt(facilitatorFee) === 0n ? 0n : 100000n;\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 x402x router settlement extension from v2 PaymentPayload.extensions\n * \n * @param extensions - PaymentPayload.extensions object\n * @returns Router settlement info or undefined if not present\n */\nfunction parseRouterSettlementFromExtensions(extensions: Record<string, unknown> | undefined): {\n salt: string;\n settlementRouter: string;\n hook: string;\n hookData: string;\n finalPayTo: string;\n facilitatorFee: string;\n} | undefined {\n if (!extensions || typeof extensions !== \"object\") {\n return undefined;\n }\n\n const ROUTER_SETTLEMENT_KEY = \"x402x-router-settlement\";\n const routerSettlement = extensions[ROUTER_SETTLEMENT_KEY];\n \n if (!routerSettlement || typeof routerSettlement !== \"object\") {\n return undefined;\n }\n\n const info = (routerSettlement as any).info;\n if (!info || typeof info !== \"object\") {\n return undefined;\n }\n\n // Validate and extract all required fields\n if (\n typeof info.salt !== \"string\" ||\n typeof info.settlementRouter !== \"string\" ||\n typeof info.hook !== \"string\" ||\n typeof info.hookData !== \"string\" ||\n typeof info.finalPayTo !== \"string\"\n ) {\n return undefined;\n }\n\n // facilitatorFee is optional; default to \"0\" when omitted\n const facilitatorFee =\n typeof (info as any).facilitatorFee === \"string\" ? (info as any).facilitatorFee : \"0\";\n\n return {\n salt: info.salt,\n settlementRouter: info.settlementRouter,\n hook: info.hook,\n hookData: info.hookData,\n finalPayTo: info.finalPayTo,\n facilitatorFee,\n };\n}\n\n/**\n * Parse settlement parameters from payment requirements and payload\n * \n * v2 behavior: Read from paymentPayload.extensions[\"x402x-router-settlement\"].info first,\n * fallback to paymentRequirements.extra for legacy compatibility.\n */\nexport function parseSettlementRouterParams(\n paymentRequirements: any,\n paymentPayload: any,\n): SettlementRouterParams {\n // Parse standard x402 v2 EVM exact payload\n const evmPayload = parseEvmExactPayload(paymentPayload);\n\n // Try v2 extensions first (paymentPayload.extensions[\"x402x-router-settlement\"])\n const extensionParams = parseRouterSettlementFromExtensions(paymentPayload.extensions);\n \n if (extensionParams) {\n // v2 path: all params from extensions\n return {\n token: paymentRequirements.asset as Address,\n from: evmPayload.authorization.from as Address,\n value: paymentRequirements.amount,\n validAfter: evmPayload.authorization.validAfter || \"0x0\",\n validBefore: evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\",\n nonce: evmPayload.authorization.nonce,\n signature: evmPayload.signature,\n salt: extensionParams.salt,\n payTo: extensionParams.finalPayTo as Address,\n facilitatorFee: extensionParams.facilitatorFee,\n hook: extensionParams.hook as Address,\n hookData: extensionParams.hookData,\n settlementRouter: extensionParams.settlementRouter as Address,\n };\n }\n\n // Fallback: legacy mode (read from requirements.extra)\n if (!isSettlementMode(paymentRequirements)) {\n throw new Error(\n \"x402x router settlement parameters not found. \" +\n \"Expected paymentPayload.extensions['x402x-router-settlement'].info (v2) or \" +\n \"paymentRequirements.extra.settlementRouter (legacy).\"\n );\n }\n\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,\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 // Parse settlement parameters (reads from paymentPayload.extensions or requirements.extra)\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n\n // Validate SettlementRouter\n // Normalize network identifier: any format -> CAIP-2 -> V1 name\n const canonicalNetwork = toCanonicalNetworkKey(paymentRequirements.network);\n const v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\n\n validateSettlementRouter(\n paymentRequirements.network,\n params.settlementRouter,\n config.allowedRouters,\n networkConfig,\n );\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 // Parse settlement parameters (reads from extensions or extra)\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n \n // Validate configuration\n const networkConfig = getNetworkConfig(paymentRequirements.network);\n validateSettlementRouter(\n paymentRequirements.network,\n params.settlementRouter,\n config.allowedRouters,\n networkConfig,\n );\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/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { FacilitatorValidationError, toCanonicalNetworkKey, getNetworkName, getNetworkConfig, SETTLEMENT_ROUTER_ABI, isSettlementMode, parseSettlementExtra, SettlementRouterError, calculateCommitment } from '@x402x/extensions';
1
+ import { FacilitatorValidationError, toCanonicalNetworkKey, getNetworkAlias, getNetworkConfig, SETTLEMENT_ROUTER_ABI, isSettlementMode, parseSettlementExtra, SettlementRouterError, calculateCommitment } from '@x402x/extensions';
2
2
  export { FacilitatorValidationError, SETTLEMENT_ROUTER_ABI, SettlementRouterError, getNetworkConfig, isSettlementMode, parseSettlementExtra } from '@x402x/extensions';
3
3
  import { createPublicClient, http, createWalletClient, parseErc6492Signature, verifyTypedData } from 'viem';
4
4
  import { privateKeyToAccount } from 'viem/accounts';
@@ -199,12 +199,12 @@ function networkConfigToChain(networkConfig, rpcUrl) {
199
199
  }
200
200
  function createPublicClientForNetwork(network, rpcUrls) {
201
201
  const canonicalNetwork = toCanonicalNetworkKey(network);
202
- const v1NetworkName = getNetworkName(canonicalNetwork);
203
- const networkConfig = getNetworkConfig(v1NetworkName);
202
+ const v1NetworkAlias = getNetworkAlias(canonicalNetwork);
203
+ const networkConfig = getNetworkConfig(v1NetworkAlias);
204
204
  if (!networkConfig) {
205
205
  throw new Error(`Network configuration not found for network: ${network}`);
206
206
  }
207
- const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkName] || rpcUrls?.[canonicalNetwork];
207
+ const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkAlias] || rpcUrls?.[canonicalNetwork];
208
208
  if (!rpcUrl) {
209
209
  throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);
210
210
  }
@@ -216,9 +216,9 @@ function createPublicClientForNetwork(network, rpcUrls) {
216
216
  }
217
217
  function createWalletClientForNetwork(network, signer, rpcUrls, transport, privateKey) {
218
218
  const canonicalNetwork = toCanonicalNetworkKey(network);
219
- const v1NetworkName = getNetworkName(canonicalNetwork);
220
- const networkConfig = getNetworkConfig(v1NetworkName);
221
- const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkName] || rpcUrls?.[canonicalNetwork];
219
+ const v1NetworkAlias = getNetworkAlias(canonicalNetwork);
220
+ const networkConfig = getNetworkConfig(v1NetworkAlias);
221
+ const rpcUrl = rpcUrls?.[network] || rpcUrls?.[v1NetworkAlias] || rpcUrls?.[canonicalNetwork];
222
222
  if (!rpcUrl) {
223
223
  throw new Error(`No RPC URL available for network: ${network}. Please provide RPC URL in config.`);
224
224
  }
@@ -243,7 +243,7 @@ function createWalletClientForNetwork(network, signer, rpcUrls, transport, priva
243
243
  function calculateGasLimit(baseFee, facilitatorFee, gasMultiplier = 1.2) {
244
244
  validateGasMultiplier(gasMultiplier);
245
245
  const baseGas = 200000n;
246
- const hookGas = facilitatorFee !== "0x0" ? 100000n : 0n;
246
+ const hookGas = BigInt(facilitatorFee) === 0n ? 0n : 100000n;
247
247
  const totalGas = (baseGas + hookGas) * BigInt(Math.ceil(gasMultiplier * 100)) / 100n;
248
248
  validateGasLimit(totalGas);
249
249
  return totalGas;
@@ -340,17 +340,62 @@ function parseEvmExactPayload(payload) {
340
340
  }
341
341
  return evmPayload;
342
342
  }
343
+ function parseRouterSettlementFromExtensions(extensions) {
344
+ if (!extensions || typeof extensions !== "object") {
345
+ return void 0;
346
+ }
347
+ const ROUTER_SETTLEMENT_KEY = "x402x-router-settlement";
348
+ const routerSettlement = extensions[ROUTER_SETTLEMENT_KEY];
349
+ if (!routerSettlement || typeof routerSettlement !== "object") {
350
+ return void 0;
351
+ }
352
+ const info = routerSettlement.info;
353
+ if (!info || typeof info !== "object") {
354
+ return void 0;
355
+ }
356
+ if (typeof info.salt !== "string" || typeof info.settlementRouter !== "string" || typeof info.hook !== "string" || typeof info.hookData !== "string" || typeof info.finalPayTo !== "string") {
357
+ return void 0;
358
+ }
359
+ const facilitatorFee = typeof info.facilitatorFee === "string" ? info.facilitatorFee : "0";
360
+ return {
361
+ salt: info.salt,
362
+ settlementRouter: info.settlementRouter,
363
+ hook: info.hook,
364
+ hookData: info.hookData,
365
+ finalPayTo: info.finalPayTo,
366
+ facilitatorFee
367
+ };
368
+ }
343
369
  function parseSettlementRouterParams(paymentRequirements, paymentPayload) {
370
+ const evmPayload = parseEvmExactPayload(paymentPayload);
371
+ const extensionParams = parseRouterSettlementFromExtensions(paymentPayload.extensions);
372
+ if (extensionParams) {
373
+ return {
374
+ token: paymentRequirements.asset,
375
+ from: evmPayload.authorization.from,
376
+ value: paymentRequirements.amount,
377
+ validAfter: evmPayload.authorization.validAfter || "0x0",
378
+ validBefore: evmPayload.authorization.validBefore || "0xFFFFFFFFFFFFFFFF",
379
+ nonce: evmPayload.authorization.nonce,
380
+ signature: evmPayload.signature,
381
+ salt: extensionParams.salt,
382
+ payTo: extensionParams.finalPayTo,
383
+ facilitatorFee: extensionParams.facilitatorFee,
384
+ hook: extensionParams.hook,
385
+ hookData: extensionParams.hookData,
386
+ settlementRouter: extensionParams.settlementRouter
387
+ };
388
+ }
344
389
  if (!isSettlementMode(paymentRequirements)) {
345
- throw new Error("Payment requirements are not in SettlementRouter mode");
390
+ throw new Error(
391
+ "x402x router settlement parameters not found. Expected paymentPayload.extensions['x402x-router-settlement'].info (v2) or paymentRequirements.extra.settlementRouter (legacy)."
392
+ );
346
393
  }
347
- const evmPayload = parseEvmExactPayload(paymentPayload);
348
394
  const extra = parseSettlementExtra(paymentRequirements.extra);
349
395
  return {
350
396
  token: paymentRequirements.asset,
351
397
  from: evmPayload.authorization.from,
352
398
  value: paymentRequirements.amount,
353
- // V2 uses 'amount', not 'maxAmountRequired'
354
399
  validAfter: evmPayload.authorization.validAfter || "0x0",
355
400
  validBefore: evmPayload.authorization.validBefore || "0xFFFFFFFFFFFFFFFF",
356
401
  nonce: evmPayload.authorization.nonce,
@@ -365,20 +410,16 @@ function parseSettlementRouterParams(paymentRequirements, paymentPayload) {
365
410
  }
366
411
  async function executeSettlementWithWalletClient(walletClient, publicClient, paymentRequirements, paymentPayload, config = {}) {
367
412
  try {
413
+ const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
368
414
  const canonicalNetwork = toCanonicalNetworkKey(paymentRequirements.network);
369
- const v1NetworkName = getNetworkName(canonicalNetwork);
370
- const networkConfig = getNetworkConfig(v1NetworkName);
371
- const settlementRouter = paymentRequirements.extra?.settlementRouter;
372
- if (!settlementRouter) {
373
- throw new Error("Missing settlementRouter in payment requirements");
374
- }
415
+ const v1NetworkAlias = getNetworkAlias(canonicalNetwork);
416
+ const networkConfig = getNetworkConfig(v1NetworkAlias);
375
417
  validateSettlementRouter(
376
418
  paymentRequirements.network,
377
- settlementRouter,
419
+ params.settlementRouter,
378
420
  config.allowedRouters,
379
421
  networkConfig
380
422
  );
381
- const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
382
423
  const txHash = await executeSettlementWithRouter(walletClient, params, {
383
424
  gasLimit: config.gasLimit,
384
425
  gasMultiplier: config.gasMultiplier
@@ -425,14 +466,14 @@ async function executeSettlementWithWalletClient(walletClient, publicClient, pay
425
466
  }
426
467
  async function settleWithSettlementRouter(paymentRequirements, paymentPayload, config, options = {}) {
427
468
  try {
469
+ const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
428
470
  const networkConfig = getNetworkConfig(paymentRequirements.network);
429
471
  validateSettlementRouter(
430
472
  paymentRequirements.network,
431
- paymentRequirements.extra?.settlementRouter,
473
+ params.settlementRouter,
432
474
  config.allowedRouters,
433
475
  networkConfig
434
476
  );
435
- const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);
436
477
  const publicClient = createPublicClientForNetwork(paymentRequirements.network, config.rpcUrls);
437
478
  const walletClient = createWalletClientForNetwork(
438
479
  paymentRequirements.network,
@@ -1 +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"]}
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 getNetworkAlias,\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 v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\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?.[v1NetworkAlias] ||\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 v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\n\n // Use provided RPC URL or require it to be provided\n const rpcUrl =\n rpcUrls?.[network] ||\n rpcUrls?.[v1NetworkAlias] ||\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 // Treat both \"0\" and \"0x0\" (and any numeric zero) as no-fee.\n const hookGas = BigInt(facilitatorFee) === 0n ? 0n : 100000n;\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 x402x router settlement extension from v2 PaymentPayload.extensions\n * \n * @param extensions - PaymentPayload.extensions object\n * @returns Router settlement info or undefined if not present\n */\nfunction parseRouterSettlementFromExtensions(extensions: Record<string, unknown> | undefined): {\n salt: string;\n settlementRouter: string;\n hook: string;\n hookData: string;\n finalPayTo: string;\n facilitatorFee: string;\n} | undefined {\n if (!extensions || typeof extensions !== \"object\") {\n return undefined;\n }\n\n const ROUTER_SETTLEMENT_KEY = \"x402x-router-settlement\";\n const routerSettlement = extensions[ROUTER_SETTLEMENT_KEY];\n \n if (!routerSettlement || typeof routerSettlement !== \"object\") {\n return undefined;\n }\n\n const info = (routerSettlement as any).info;\n if (!info || typeof info !== \"object\") {\n return undefined;\n }\n\n // Validate and extract all required fields\n if (\n typeof info.salt !== \"string\" ||\n typeof info.settlementRouter !== \"string\" ||\n typeof info.hook !== \"string\" ||\n typeof info.hookData !== \"string\" ||\n typeof info.finalPayTo !== \"string\"\n ) {\n return undefined;\n }\n\n // facilitatorFee is optional; default to \"0\" when omitted\n const facilitatorFee =\n typeof (info as any).facilitatorFee === \"string\" ? (info as any).facilitatorFee : \"0\";\n\n return {\n salt: info.salt,\n settlementRouter: info.settlementRouter,\n hook: info.hook,\n hookData: info.hookData,\n finalPayTo: info.finalPayTo,\n facilitatorFee,\n };\n}\n\n/**\n * Parse settlement parameters from payment requirements and payload\n * \n * v2 behavior: Read from paymentPayload.extensions[\"x402x-router-settlement\"].info first,\n * fallback to paymentRequirements.extra for legacy compatibility.\n */\nexport function parseSettlementRouterParams(\n paymentRequirements: any,\n paymentPayload: any,\n): SettlementRouterParams {\n // Parse standard x402 v2 EVM exact payload\n const evmPayload = parseEvmExactPayload(paymentPayload);\n\n // Try v2 extensions first (paymentPayload.extensions[\"x402x-router-settlement\"])\n const extensionParams = parseRouterSettlementFromExtensions(paymentPayload.extensions);\n \n if (extensionParams) {\n // v2 path: all params from extensions\n return {\n token: paymentRequirements.asset as Address,\n from: evmPayload.authorization.from as Address,\n value: paymentRequirements.amount,\n validAfter: evmPayload.authorization.validAfter || \"0x0\",\n validBefore: evmPayload.authorization.validBefore || \"0xFFFFFFFFFFFFFFFF\",\n nonce: evmPayload.authorization.nonce,\n signature: evmPayload.signature,\n salt: extensionParams.salt,\n payTo: extensionParams.finalPayTo as Address,\n facilitatorFee: extensionParams.facilitatorFee,\n hook: extensionParams.hook as Address,\n hookData: extensionParams.hookData,\n settlementRouter: extensionParams.settlementRouter as Address,\n };\n }\n\n // Fallback: legacy mode (read from requirements.extra)\n if (!isSettlementMode(paymentRequirements)) {\n throw new Error(\n \"x402x router settlement parameters not found. \" +\n \"Expected paymentPayload.extensions['x402x-router-settlement'].info (v2) or \" +\n \"paymentRequirements.extra.settlementRouter (legacy).\"\n );\n }\n\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,\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 // Parse settlement parameters (reads from paymentPayload.extensions or requirements.extra)\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n\n // Validate SettlementRouter\n // Normalize network identifier: any format -> CAIP-2 -> V1 name\n const canonicalNetwork = toCanonicalNetworkKey(paymentRequirements.network);\n const v1NetworkAlias = getNetworkAlias(canonicalNetwork);\n const networkConfig = getNetworkConfig(v1NetworkAlias);\n\n validateSettlementRouter(\n paymentRequirements.network,\n params.settlementRouter,\n config.allowedRouters,\n networkConfig,\n );\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 // Parse settlement parameters (reads from extensions or extra)\n const params = parseSettlementRouterParams(paymentRequirements, paymentPayload);\n \n // Validate configuration\n const networkConfig = getNetworkConfig(paymentRequirements.network);\n validateSettlementRouter(\n paymentRequirements.network,\n params.settlementRouter,\n config.allowedRouters,\n networkConfig,\n );\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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x402x/facilitator-sdk",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "SchemeNetworkFacilitator SDK for x402x - enables router settlement with official x402 protocol",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",