@elizaos/plugin-x402 2.0.0-alpha.6 → 2.0.3-beta.5

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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -0
  3. package/dist/index.d.ts +57 -2
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +2542 -1915
  6. package/dist/index.js.map +14 -21
  7. package/dist/payment-config.d.ts +256 -0
  8. package/dist/payment-config.d.ts.map +1 -0
  9. package/dist/payment-wrapper.d.ts +42 -0
  10. package/dist/payment-wrapper.d.ts.map +1 -0
  11. package/dist/startup-validator.d.ts +28 -0
  12. package/dist/startup-validator.d.ts.map +1 -0
  13. package/dist/types.d.ts +158 -0
  14. package/dist/types.d.ts.map +1 -0
  15. package/dist/x402-facilitator-binding.d.ts +9 -0
  16. package/dist/x402-facilitator-binding.d.ts.map +1 -0
  17. package/dist/x402-replay-durable.d.ts +30 -0
  18. package/dist/x402-replay-durable.d.ts.map +1 -0
  19. package/dist/x402-replay-guard.d.ts +28 -0
  20. package/dist/x402-replay-guard.d.ts.map +1 -0
  21. package/dist/x402-replay-keys.d.ts +21 -0
  22. package/dist/x402-replay-keys.d.ts.map +1 -0
  23. package/dist/x402-resolve.d.ts +6 -0
  24. package/dist/x402-resolve.d.ts.map +1 -0
  25. package/dist/x402-standard-payment.d.ts +130 -0
  26. package/dist/x402-standard-payment.d.ts.map +1 -0
  27. package/dist/x402-types.d.ts +130 -0
  28. package/dist/x402-types.d.ts.map +1 -0
  29. package/package.json +63 -94
  30. package/src/__tests__/core-test-mock.ts +10 -0
  31. package/src/index.ts +115 -0
  32. package/src/payment-config.ts +737 -0
  33. package/src/payment-wrapper.test.ts +234 -0
  34. package/src/payment-wrapper.ts +1997 -0
  35. package/src/startup-validator.test.ts +86 -0
  36. package/src/startup-validator.ts +351 -0
  37. package/src/types.ts +177 -0
  38. package/src/x402-facilitator-binding.ts +104 -0
  39. package/src/x402-replay-durable.ts +320 -0
  40. package/src/x402-replay-guard.ts +165 -0
  41. package/src/x402-replay-keys.ts +151 -0
  42. package/src/x402-resolve.ts +43 -0
  43. package/src/x402-standard-payment.ts +519 -0
  44. package/src/x402-types.ts +376 -0
package/dist/index.js.map CHANGED
@@ -1,27 +1,20 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../actions/check-payment-history.ts", "../utils.ts", "../actions/set-payment-policy.ts", "../actions/pay-for-service.ts", "../providers/payment-balance.ts", "../routes/agent-card.ts", "../networks.ts", "../services/x402-service.ts", "../client/signer.ts", "../client/fetch-with-payment.ts", "../policy/circuit-breaker.ts", "../policy/engine.ts", "../storage/memory.ts", "../storage/sqlite.ts", "../middleware/facilitator-client.ts", "../middleware/paywall.ts", "../storage/postgres.ts", "../index.ts"],
3
+ "sources": ["../src/payment-config.ts", "../src/payment-wrapper.ts", "../src/startup-validator.ts", "../src/x402-facilitator-binding.ts", "../src/x402-replay-guard.ts", "../src/x402-replay-durable.ts", "../src/x402-replay-keys.ts", "../src/x402-resolve.ts", "../src/x402-standard-payment.ts", "../src/x402-types.ts", "../src/index.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Action: Check payment history.\n *\n * Allows the agent to review its x402 payment history,\n * including spending summaries and recent transactions.\n */\n\nimport type {\n Action,\n ActionExample,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n JsonValue,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { X402Service } from \"../services/x402-service\";\n\nimport { ONE_DAY_MS, formatUsd, truncateAddress } from \"../utils\";\n\nexport const checkPaymentHistoryAction: Action = {\n name: \"CHECK_PAYMENT_HISTORY\",\n description:\n \"Check x402 payment history including spending summary and recent transactions. Use when asked about payment activity, spending, or earnings.\",\n\n similes: [\n \"check payments\",\n \"payment history\",\n \"spending summary\",\n \"how much have I spent\",\n \"payment transactions\",\n \"show payments\",\n ],\n\n parameters: [\n {\n name: \"limit\",\n description: \"Maximum number of recent transactions to show (default: 10)\",\n required: false,\n schema: { type: \"number\" },\n },\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['check', 'payment', 'history'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:check|payment|history)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.isActive();\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n options?: HandlerOptions | Record<string, JsonValue | undefined>,\n callback?: HandlerCallback,\n ) => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n\n if (!service || !service.isActive()) {\n logger.warn(\n \"[x402] CHECK_PAYMENT_HISTORY: Service not available or inactive\",\n );\n if (callback) {\n await callback({\n text: \"Payment tracking is not active. The x402 payment service is not configured.\",\n actions: [],\n });\n }\n return { success: false, error: \"x402 service not available\" };\n }\n\n const params = (options as Record<string, Record<string, string | number> | undefined> | undefined)?.parameters;\n const limit = typeof params?.limit === \"number\" ? params.limit : 10;\n\n try {\n // Get 24h summary\n const summary = await service.getSummary(ONE_DAY_MS);\n const recentTxns = await service.getRecentTransactions(limit);\n\n const lines: string[] = [];\n\n // Header\n const walletAddress = service.getWalletAddress();\n const network = service.getNetwork();\n lines.push(`**Payment Summary** (${network})`);\n lines.push(\n `Wallet: ${walletAddress ? truncateAddress(walletAddress) : \"N/A\"}`,\n );\n lines.push(\"\");\n\n // 24h summary\n lines.push(\"**Last 24 Hours:**\");\n lines.push(\n `- Spent: ${formatUsd(summary.totalSpent)} (${summary.outgoingCount} transactions)`,\n );\n lines.push(\n `- Earned: ${formatUsd(summary.totalEarned)} (${summary.incomingCount} transactions)`,\n );\n\n const net = summary.totalEarned - summary.totalSpent;\n const netDisplay =\n net < 0n ? `-${formatUsd(-net)}` : `+${formatUsd(net)}`;\n lines.push(`- Net: ${netDisplay}`);\n lines.push(\"\");\n\n // Circuit breaker status\n lines.push(\n `Circuit Breaker: ${service.getCircuitBreakerState()}`,\n );\n lines.push(\"\");\n\n // Recent transactions\n if (recentTxns.length > 0) {\n lines.push(`**Recent Transactions** (last ${recentTxns.length}):`);\n for (const txn of recentTxns) {\n const direction = txn.direction === \"outgoing\" ? \"SENT\" : \"RECV\";\n const counterpartyDisplay = truncateAddress(txn.counterparty);\n const time = new Date(txn.createdAt).toLocaleString();\n lines.push(\n `- [${direction}] ${formatUsd(txn.amount)} ${txn.direction === \"outgoing\" ? \"to\" : \"from\"} ${counterpartyDisplay} — ${txn.resource || \"N/A\"} (${time}) [${txn.status}]`,\n );\n }\n } else {\n lines.push(\"No recent transactions.\");\n }\n\n const responseText = lines.join(\"\\n\");\n\n if (callback) {\n await callback({\n text: responseText,\n actions: [],\n });\n }\n\n return {\n success: true,\n text: responseText,\n data: {\n totalSpent: formatUsd(summary.totalSpent),\n totalEarned: formatUsd(summary.totalEarned),\n outgoingCount: summary.outgoingCount,\n incomingCount: summary.incomingCount,\n recentTransactionCount: recentTxns.length,\n },\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n `[x402] CHECK_PAYMENT_HISTORY: Failed: ${errorMessage}`,\n );\n if (callback) {\n await callback({\n text: `Failed to retrieve payment history: ${errorMessage}`,\n actions: [],\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"How much have you spent today?\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Let me check my payment history for today.\",\n actions: [\"CHECK_PAYMENT_HISTORY\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Show me your recent payment transactions\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Here are my recent x402 payment transactions.\",\n actions: [\"CHECK_PAYMENT_HISTORY\"],\n },\n } as ActionExample,\n ],\n ],\n};\n",
6
- "/**\n * Shared utility functions for the x402 plugin.\n */\n\n/** 24 hours in milliseconds */\nexport const ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\n/** Format USDC base units (6 decimals) as human-readable USD string */\nexport function formatUsd(baseUnits: bigint): string {\n const dollars = Number(baseUnits) / 1_000_000;\n return `$${dollars.toFixed(2)}`;\n}\n\n/** Truncate an Ethereum address for display (e.g. \"0x1234...5678\") */\nexport function truncateAddress(address: string): string {\n if (address.length <= 10) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/** Convert whole USD dollars to USDC base units (6 decimals) */\nexport function usdToBaseUnits(usd: number): bigint {\n return BigInt(Math.round(usd * 1_000_000));\n}\n",
7
- "/**\n * Action: SET_PAYMENT_POLICY\n *\n * Allows the agent to manage its payment policies via natural language.\n * Supports setting per-transaction and daily limits, as well as\n * blocking/allowing specific recipient addresses.\n */\n\nimport type {\n Action,\n ActionExample,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n JsonValue,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { X402Service } from \"../services/x402-service\";\nimport { usdToBaseUnits } from \"../utils\";\n\ninterface PolicyParams {\n maxPerPaymentUsd?: number;\n maxDailyUsd?: number;\n blockRecipient?: string;\n allowRecipient?: string;\n}\n\nexport const setPaymentPolicyAction: Action = {\n name: \"SET_PAYMENT_POLICY\",\n description:\n \"Manage payment policies for the x402 payment service. Set per-transaction limits, daily spending limits, or block/allow specific recipient addresses.\",\n\n similes: [\n \"set payment policy\",\n \"update payment limits\",\n \"change spending limit\",\n \"block recipient\",\n \"allow recipient\",\n \"set max payment\",\n \"set daily limit\",\n \"payment policy\",\n ],\n\n parameters: [\n {\n name: \"maxPerPaymentUsd\",\n description:\n \"Maximum amount in USD for a single outgoing payment (e.g. 5.0 for $5.00)\",\n required: false,\n schema: { type: \"number\" },\n },\n {\n name: \"maxDailyUsd\",\n description:\n \"Maximum total USD spend per day (e.g. 50.0 for $50.00)\",\n required: false,\n schema: { type: \"number\" },\n },\n {\n name: \"blockRecipient\",\n description:\n \"Ethereum address to add to the blocklist (payments to this address will be rejected)\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"allowRecipient\",\n description:\n \"Ethereum address to add to the allowlist (when allowlist is non-empty, only listed addresses can receive payments)\",\n required: false,\n schema: { type: \"string\" },\n },\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['set', 'payment', 'policy'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:set|payment|policy)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.isActive();\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n options?: HandlerOptions | Record<string, JsonValue | undefined>,\n callback?: HandlerCallback,\n ) => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n\n if (!service || !service.isActive()) {\n logger.warn(\"[x402] SET_PAYMENT_POLICY: Service not available or inactive\");\n if (callback) {\n await callback({\n text: \"I'm unable to update payment policies right now. The x402 payment service is not configured or is inactive.\",\n actions: [],\n });\n }\n return { success: false, error: \"x402 service not available\" };\n }\n\n // Extract parameters\n const rawParams = (\n options as Record<string, Record<string, unknown> | undefined> | undefined\n )?.parameters as PolicyParams | undefined;\n\n const maxPerPaymentUsd = rawParams?.maxPerPaymentUsd;\n const maxDailyUsd = rawParams?.maxDailyUsd;\n const blockRecipient = rawParams?.blockRecipient;\n const allowRecipient = rawParams?.allowRecipient;\n\n // Validate that at least one parameter was provided\n if (\n maxPerPaymentUsd === undefined &&\n maxDailyUsd === undefined &&\n !blockRecipient &&\n !allowRecipient\n ) {\n if (callback) {\n await callback({\n text: \"Please specify at least one policy change: maxPerPaymentUsd, maxDailyUsd, blockRecipient, or allowRecipient.\",\n actions: [],\n });\n }\n return { success: false, error: \"No policy parameters provided\" };\n }\n\n const changes: string[] = [];\n\n try {\n // Apply per-transaction limit\n if (maxPerPaymentUsd !== undefined) {\n if (maxPerPaymentUsd <= 0) {\n if (callback) {\n await callback({\n text: \"maxPerPaymentUsd must be a positive number.\",\n actions: [],\n });\n }\n return { success: false, error: \"Invalid maxPerPaymentUsd\" };\n }\n service.updatePolicy({\n outgoing: {\n maxPerTransaction: usdToBaseUnits(maxPerPaymentUsd),\n } as never,\n });\n changes.push(`Max per-payment limit set to $${maxPerPaymentUsd.toFixed(2)}`);\n logger.info(\n `[x402] SET_PAYMENT_POLICY: maxPerTransaction set to $${maxPerPaymentUsd}`,\n );\n }\n\n // Apply daily total limit\n if (maxDailyUsd !== undefined) {\n if (maxDailyUsd <= 0) {\n if (callback) {\n await callback({\n text: \"maxDailyUsd must be a positive number.\",\n actions: [],\n });\n }\n return { success: false, error: \"Invalid maxDailyUsd\" };\n }\n service.updatePolicy({\n outgoing: {\n maxTotal: usdToBaseUnits(maxDailyUsd),\n } as never,\n });\n changes.push(`Daily spending limit set to $${maxDailyUsd.toFixed(2)}`);\n logger.info(\n `[x402] SET_PAYMENT_POLICY: maxTotal (daily) set to $${maxDailyUsd}`,\n );\n }\n\n // Block a recipient\n if (blockRecipient) {\n service.updatePolicy({\n outgoing: {\n blockedRecipients: [blockRecipient],\n } as never,\n });\n changes.push(`Blocked recipient: ${blockRecipient}`);\n logger.info(\n `[x402] SET_PAYMENT_POLICY: blocked recipient ${blockRecipient}`,\n );\n }\n\n // Allow a recipient\n if (allowRecipient) {\n service.updatePolicy({\n outgoing: {\n allowedRecipients: [allowRecipient],\n } as never,\n });\n changes.push(`Added to allowlist: ${allowRecipient}`);\n logger.info(\n `[x402] SET_PAYMENT_POLICY: allowed recipient ${allowRecipient}`,\n );\n }\n\n const summary = changes.join(\"\\n- \");\n if (callback) {\n await callback({\n text: `Payment policy updated:\\n- ${summary}`,\n actions: [],\n });\n }\n\n return {\n success: true,\n text: `Payment policy updated: ${changes.join(\"; \")}`,\n data: {\n maxPerPaymentUsd: maxPerPaymentUsd ?? null,\n maxDailyUsd: maxDailyUsd ?? null,\n blockRecipient: blockRecipient ?? null,\n allowRecipient: allowRecipient ?? null,\n },\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n `[x402] SET_PAYMENT_POLICY: Failed to update policy: ${errorMessage}`,\n );\n if (callback) {\n await callback({\n text: `Failed to update payment policy: ${errorMessage}`,\n actions: [],\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Set the maximum payment per transaction to $5\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll set the per-transaction limit to $5.00.\",\n actions: [\"SET_PAYMENT_POLICY\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Limit my daily spending to $50 and block payments to 0xDEAD...BEEF\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll set the daily limit to $50 and block that address.\",\n actions: [\"SET_PAYMENT_POLICY\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Allow payments only to 0x1234567890abcdef1234567890abcdef12345678\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Adding that address to the payment allowlist.\",\n actions: [\"SET_PAYMENT_POLICY\"],\n },\n } as ActionExample,\n ],\n ],\n};\n",
8
- "/**\n * Action: Pay for an x402-protected service.\n *\n * Allows the agent to make a request to an x402-protected URL,\n * automatically handling payment if a 402 response is received.\n */\n\nimport type {\n Action,\n ActionExample,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n JsonValue,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { X402Service } from \"../services/x402-service\";\n\nexport const payForServiceAction: Action = {\n name: \"PAY_FOR_SERVICE\",\n description:\n \"Make a request to an x402-protected URL, automatically paying if required. Use when you need to access a paid API or service that uses the x402 payment protocol.\",\n\n similes: [\n \"pay for service\",\n \"x402 payment\",\n \"make a paid request\",\n \"access paid endpoint\",\n \"pay and fetch\",\n ],\n\n parameters: [\n {\n name: \"url\",\n description: \"The URL of the x402-protected service to access\",\n required: true,\n schema: { type: \"string\" },\n },\n {\n name: \"method\",\n description: \"HTTP method (GET, POST, etc.). Defaults to GET.\",\n required: false,\n schema: {\n type: \"string\",\n enumValues: [\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n },\n },\n {\n name: \"body\",\n description: \"Optional request body as a JSON string (for POST/PUT)\",\n required: false,\n schema: { type: \"string\" },\n },\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['pay', 'for', 'service'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:pay|for|service)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.canMakePayments();\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n options?: HandlerOptions | Record<string, JsonValue | undefined>,\n callback?: HandlerCallback,\n ) => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n\n if (!service || !service.canMakePayments()) {\n logger.warn(\"[x402] PAY_FOR_SERVICE: Service not available or inactive\");\n if (callback) {\n await callback({\n text: \"I'm unable to make payments right now. The x402 payment service is not configured or is inactive.\",\n actions: [],\n });\n }\n return { success: false, error: \"x402 service not available\" };\n }\n\n // Extract parameters\n const params = (options as Record<string, Record<string, string> | undefined> | undefined)?.parameters;\n const url = params?.url ?? extractUrlFromMessage(message);\n const method = params?.method ?? \"GET\";\n const body = params?.body;\n\n if (!url) {\n logger.warn(\"[x402] PAY_FOR_SERVICE: No URL provided\");\n if (callback) {\n await callback({\n text: \"I need a URL to make the paid request. Please provide the URL of the service you want me to access.\",\n actions: [],\n });\n }\n return { success: false, error: \"No URL provided\" };\n }\n\n logger.info(`[x402] PAY_FOR_SERVICE: Requesting ${method} ${url}`);\n\n const payFetch = service.getFetchWithPayment();\n\n try {\n const init: RequestInit = { method };\n if (body && (method === \"POST\" || method === \"PUT\")) {\n init.body = body;\n init.headers = { \"Content-Type\": \"application/json\" };\n }\n\n const response = await payFetch(url, init);\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n let responseText: string;\n\n if (contentType.includes(\"application/json\")) {\n const json = await response.json();\n responseText = JSON.stringify(json, null, 2);\n } else {\n responseText = await response.text();\n }\n\n // Truncate very long responses\n const maxLen = 2000;\n const truncated =\n responseText.length > maxLen\n ? `${responseText.slice(0, maxLen)}...\\n[Truncated - ${responseText.length} total characters]`\n : responseText;\n\n if (response.ok) {\n logger.info(\n `[x402] PAY_FOR_SERVICE: Success (${response.status}) from ${url}`,\n );\n if (callback) {\n await callback({\n text: `Successfully accessed ${url} (HTTP ${response.status}):\\n\\n${truncated}`,\n actions: [],\n });\n }\n return {\n success: true,\n text: `Payment and request successful for ${url}`,\n data: {\n status: response.status,\n url,\n responsePreview: truncated,\n },\n };\n } else {\n logger.warn(\n `[x402] PAY_FOR_SERVICE: Request returned ${response.status} from ${url}`,\n );\n if (callback) {\n await callback({\n text: `Request to ${url} returned HTTP ${response.status}:\\n\\n${truncated}`,\n actions: [],\n });\n }\n return {\n success: false,\n error: `HTTP ${response.status}`,\n data: {\n status: response.status,\n url,\n responsePreview: truncated,\n },\n };\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(\n `[x402] PAY_FOR_SERVICE: Request failed: ${errorMessage}`,\n );\n if (callback) {\n await callback({\n text: `Failed to access ${url}: ${errorMessage}`,\n actions: [],\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Can you fetch the data from https://api.example.com/premium/data? It's a paid API.\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"I'll access that paid API for you now.\",\n actions: [\"PAY_FOR_SERVICE\"],\n },\n } as ActionExample,\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Please make a paid request to https://weather.paid-api.com/forecast\",\n },\n } as ActionExample,\n {\n name: \"assistant\",\n content: {\n text: \"Making a paid request to the weather API.\",\n actions: [\"PAY_FOR_SERVICE\"],\n },\n } as ActionExample,\n ],\n ],\n};\n\n/**\n * Attempt to extract a URL from the message text.\n */\nfunction extractUrlFromMessage(message: Memory): string | undefined {\n const text =\n typeof message.content === \"string\"\n ? message.content\n : message.content?.text;\n\n if (!text) return undefined;\n\n const urlRegex = /https?:\\/\\/[^\\s<>\"{}|\\\\^`[\\]]+/g;\n const matches = text.match(urlRegex);\n return matches?.[0];\n}\n",
9
- "/**\n * Payment balance provider.\n *\n * Injects current payment state into the agent's context so that the LLM\n * is aware of the agent's spending and earning activity.\n */\n\nimport type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport { X402Service } from \"../services/x402-service\";\n\nimport { ONE_DAY_MS, formatUsd, truncateAddress } from \"../utils\";\nexport const paymentBalanceProvider: Provider = {\n name: \"x402_payment_status\",\n description:\n \"Current x402 payment status including wallet, spending, and earning summary\",\n\n dynamic: true,\nget: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state: State,\n ) => {\nconst service = runtime.getService<X402Service>(\"x402_payment\");\n\n if (!service || !service.isActive()) {\n return {\n text: \"[Payment Status]\\nPayments: Inactive (no wallet configured)\",\n values: {\n x402Active: false,\n },\n };\n }\n\n const walletAddress = service.getWalletAddress();\n const network = service.getNetwork();\n\n const summary = await service.getSummary(ONE_DAY_MS);\n\n const netAmount = summary.totalEarned - summary.totalSpent;\n const netDisplay = netAmount < 0n\n ? `-${formatUsd(-netAmount)}`\n : `+${formatUsd(netAmount)}`;\n\n const statusLines = [\n \"[Payment Status]\",\n `Wallet: ${walletAddress ? truncateAddress(walletAddress) : \"N/A\"} (${network})`,\n `24h Spent: ${formatUsd(summary.totalSpent)} (${summary.outgoingCount} txns)`,\n `24h Earned: ${formatUsd(summary.totalEarned)} (${summary.incomingCount} txns)`,\n `Net: ${netDisplay}`,\n `Circuit Breaker: ${service.getCircuitBreakerState()}`,\n ];\n\n return {\n text: statusLines.join(\"\\n\"),\n values: {\n x402Active: true,\n x402Wallet: walletAddress ?? \"\",\n x402Network: network,\n x402TotalSpent: formatUsd(summary.totalSpent),\n x402TotalEarned: formatUsd(summary.totalEarned),\n x402OutgoingCount: summary.outgoingCount,\n x402IncomingCount: summary.incomingCount,\n },\n };\n },\n};\n",
10
- "/**\n * Route: /.well-known/agent-card.json\n *\n * Serves an agent card that advertises the agent's x402 payment capabilities,\n * wallet address, network, and available paid skills/routes.\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type {\n IAgentRuntime,\n Route,\n RouteRequest,\n RouteResponse,\n} from \"@elizaos/core\";\n\nimport { X402Service } from \"../services/x402-service\";\nimport { resolveNetwork } from \"../networks\";\n\n/** Shape of a skill entry in the agent card */\ninterface AgentCardSkill {\n name: string;\n description: string;\n path?: string;\n price?: string;\n network?: string;\n}\n\n/** Shape of the agent card JSON response */\ninterface AgentCard {\n protocolVersion: string;\n name: string;\n description: string;\n url: string;\n capabilities: {\n x402Payments: boolean;\n };\n payments: Array<{\n method: string;\n payee: string;\n network: string;\n facilitatorUrl: string;\n }>;\n skills: AgentCardSkill[];\n}\n\n/** GET /.well-known/agent-card.json Serve the agent's payment capabilities card */\nasync function handleAgentCard(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime,\n): Promise<void> {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n if (!service || !service.isActive()) {\n res.status(503).json({ error: \"x402 service not active\" });\n return;\n }\n\n const walletAddress = service.getWalletAddress() ?? \"\";\n const networkKey = service.getNetwork();\n const facilitatorUrl = service.getFacilitatorUrl();\n\n // Resolve CAIP-2 network identifier\n let caip2Network: string;\n try {\n const networkInfo = resolveNetwork(networkKey);\n caip2Network = networkInfo.caip2;\n } catch (err) {\n // Unknown network key use it as-is (may be a CAIP-2 ID already)\n caip2Network = networkKey;\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(\"[x402] Agent card: could not resolve network '\" + networkKey + \"': \" + msg);\n }\n\n // Extract agent name and description from runtime character\n const character = runtime.character;\n const agentName = character?.name ?? \"ElizaOS Agent\";\n const agentDescription =\n (Array.isArray(character?.bio) ? character.bio[0] : character?.bio) ??\n \"An ElizaOS agent with x402 payment capabilities\";\n\n // Auto-detect the agent URL from the request or configuration\n const configuredUrl = String(runtime.getSetting(\"X402_AGENT_URL\") ?? \"\");\n let agentUrl = configuredUrl;\n if (!agentUrl && req.headers) {\n const host =\n (Array.isArray(req.headers.host) ? req.headers.host[0] : req.headers.host) ?? \"\";\n const proto =\n (Array.isArray(req.headers[\"x-forwarded-proto\"])\n ? req.headers[\"x-forwarded-proto\"][0]\n : req.headers[\"x-forwarded-proto\"]) ?? \"https\";\n if (host) {\n agentUrl = `${proto}://${host}`;\n }\n }\n\n // Collect paid routes/skills from the plugin's routes\n const skills: AgentCardSkill[] = [];\n\n // Check registered routes for x402 configuration\n const plugins = runtime.plugins ?? [];\n for (const plugin of plugins) {\n if (!plugin.routes) continue;\n for (const route of plugin.routes) {\n // Access x402 field it's on BaseRoute but may not be in published types yet\n const x402Config = \"x402\" in route\n ? (route as { x402?: { price: string; network?: string; description?: string } }).x402\n : undefined;\n if (x402Config) {\n skills.push({\n name: (\"name\" in route ? route.name : undefined) ?? route.path,\n description: x402Config.description ?? `Paid endpoint: ${route.path}`,\n path: route.path,\n price: x402Config.price,\n network: x402Config.network,\n });\n }\n }\n }\n\n const card: AgentCard = {\n protocolVersion: \"1.0\",\n name: agentName,\n description: agentDescription,\n url: agentUrl,\n capabilities: {\n x402Payments: true,\n },\n payments: [\n {\n method: \"x402\",\n payee: walletAddress,\n network: caip2Network,\n facilitatorUrl,\n },\n ],\n skills,\n };\n\n res.status(200).json(card as unknown as Record<string, string | number | boolean | Record<string, string> | undefined>);\n}\n\nexport const agentCardRoute: Route = {\n type: \"GET\" as const,\n path: \"/.well-known/agent-card.json\",\n name: \"x402-agent-card\",\n public: true,\n handler: handleAgentCard,\n};\n",
11
- "/**\n * Registry of supported EVM networks for x402 payments.\n *\n * IMPORTANT: usdcDomainName MUST match the on-chain EIP-712 domain name\n * returned by the USDC contract's name() function. This varies by chain:\n * - Ethereum mainnet: \"USD Coin\"\n * - Base / Base Sepolia / testnets: \"USDC\"\n * Using the wrong name produces signatures the on-chain contract rejects.\n */\n\nimport type { NetworkInfo } from \"./types\";\n\nexport const NETWORK_REGISTRY: Record<string, NetworkInfo> = {\n base: {\n caip2: \"eip155:8453\",\n chainId: 8453,\n name: \"Base\",\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n usdcDomainName: \"USDC\",\n usdcPermitVersion: \"2\",\n rpcUrl: \"https://mainnet.base.org\",\n },\n \"base-sepolia\": {\n caip2: \"eip155:84532\",\n chainId: 84532,\n name: \"Base Sepolia\",\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n usdcDomainName: \"USDC\",\n usdcPermitVersion: \"2\",\n rpcUrl: \"https://sepolia.base.org\",\n },\n ethereum: {\n caip2: \"eip155:1\",\n chainId: 1,\n name: \"Ethereum\",\n usdcAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n usdcDomainName: \"USD Coin\",\n usdcPermitVersion: \"2\",\n rpcUrl: \"https://cloudflare-eth.com\",\n },\n sepolia: {\n caip2: \"eip155:11155111\",\n chainId: 11155111,\n name: \"Sepolia\",\n usdcAddress: \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n usdcDomainName: \"USDC\",\n usdcPermitVersion: \"2\",\n rpcUrl: \"https://rpc.sepolia.org\",\n },\n} as const;\n\nexport function resolveNetwork(key: string): NetworkInfo {\n const info = NETWORK_REGISTRY[key];\n if (!info) {\n const supported = Object.keys(NETWORK_REGISTRY).join(\", \");\n throw new Error(`Unknown network \"${key}\". Supported: ${supported}`);\n }\n return info;\n}\n\nexport function networkKeyFromCaip2(caip2: string): string | undefined {\n for (const [key, info] of Object.entries(NETWORK_REGISTRY)) {\n if (info.caip2 === caip2) {\n return key;\n }\n }\n return undefined;\n}\n",
12
- "/**\n * Core X402 payment service for ElizaOS.\n *\n * Manages wallet configuration, payment signing, policy enforcement,\n * circuit breaking, and payment tracking. Provides a fetch wrapper\n * that auto-handles 402 Payment Required responses.\n */\n\nimport { Service } from \"@elizaos/core\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\nimport { EvmPaymentSigner } from \"../client/signer\";\nimport {\n createFetchWithPayment,\n type X402Fetch,\n} from \"../client/fetch-with-payment\";\nimport { resolveNetwork } from \"../networks\";\nimport { CircuitBreaker } from \"../policy/circuit-breaker\";\nimport { PolicyEngine } from \"../policy/engine\";\nimport { MemoryPaymentStorage } from \"../storage/memory\";\nimport { SqlitePaymentStorage } from \"../storage/sqlite\";\nimport type {\n PaymentPolicy,\n PaymentRecord,\n PaymentSigner,\n PaymentStorage,\n PaymentSummary,\n X402ServiceConfig,\n} from \"../types\";\n\nimport { ONE_DAY_MS, usdToBaseUnits } from \"../utils\";\n\nconst DEFAULT_FACILITATOR_URL = \"https://facilitator.daydreams.systems\";\n\nconst DEFAULTS = {\n network: \"base\",\n maxPaymentUsd: 1.0,\n maxTotalUsd: 10.0,\n} as const;\n\nexport class X402Service extends Service {\n static serviceType = \"x402_payment\" as const;\n capabilityDescription = \"x402 HTTP payment protocol - send and receive crypto payments\";\n\n private signer: PaymentSigner | null = null;\n private policyEngine: PolicyEngine | null = null;\n private circuitBreaker: CircuitBreaker;\n private storage: PaymentStorage;\n private serviceConfig: X402ServiceConfig;\n private fetchWithPayment: X402Fetch | null = null;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n\n // Initialize with safe defaults — real init happens in start()\n this.circuitBreaker = new CircuitBreaker();\n this.storage = new MemoryPaymentStorage();\n this.serviceConfig = {\n privateKey: \"\",\n network: DEFAULTS.network,\n payTo: \"\",\n facilitatorUrl: DEFAULT_FACILITATOR_URL,\n maxPaymentUsd: DEFAULTS.maxPaymentUsd,\n maxTotalUsd: DEFAULTS.maxTotalUsd,\n enabled: false,\n };\n }\n\n /**\n * Factory method: create and start the service.\n */\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new X402Service(runtime);\n await service.initialize(runtime);\n return service;\n }\n\n /**\n * Initialize the service with runtime configuration.\n */\n private async initialize(runtime: IAgentRuntime): Promise<void> {\n this.runtime = runtime;\n\n // Read configuration from runtime settings\n // getSetting returns string | boolean | number | null — coerce to string\n const privateKey = String(runtime.getSetting(\"X402_PRIVATE_KEY\") ?? \"\");\n const network = String(runtime.getSetting(\"X402_NETWORK\") ?? DEFAULTS.network);\n const payTo = String(runtime.getSetting(\"X402_PAY_TO\") ?? \"\");\n const facilitatorUrl = String(\n runtime.getSetting(\"X402_FACILITATOR_URL\") ?? DEFAULT_FACILITATOR_URL,\n );\n const maxPaymentUsdRaw = runtime.getSetting(\"X402_MAX_PAYMENT_USD\");\n const maxPaymentUsd = maxPaymentUsdRaw !== null\n ? parseFloat(String(maxPaymentUsdRaw))\n : DEFAULTS.maxPaymentUsd;\n const maxTotalUsdRaw = runtime.getSetting(\"X402_MAX_TOTAL_USD\");\n const maxTotalUsd = maxTotalUsdRaw !== null\n ? parseFloat(String(maxTotalUsdRaw))\n : DEFAULTS.maxTotalUsd;\n const enabledSetting = runtime.getSetting(\"X402_ENABLED\");\n const enabled =\n String(enabledSetting) !== \"false\" && privateKey.length > 0;\n\n this.serviceConfig = {\n privateKey,\n network,\n payTo,\n facilitatorUrl,\n maxPaymentUsd: isNaN(maxPaymentUsd) ? DEFAULTS.maxPaymentUsd : maxPaymentUsd,\n maxTotalUsd: isNaN(maxTotalUsd) ? DEFAULTS.maxTotalUsd : maxTotalUsd,\n enabled,\n };\n\n if (!enabled) {\n logger.info(\n \"[x402] Service inactive no private key configured or explicitly disabled\",\n );\n return;\n }\n\n // Validate network\n try {\n resolveNetwork(network);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`[x402] Invalid network configuration: ${message}`);\n this.serviceConfig.enabled = false;\n return;\n }\n\n // Create signer\n try {\n this.signer = new EvmPaymentSigner(privateKey, network);\n logger.info(\n `[x402] Wallet initialized: ${this.signer.address} on ${network}`,\n );\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`[x402] Failed to initialize signer: ${message}`);\n this.serviceConfig.enabled = false;\n return;\n }\n\n // Security: clear the private key from config now that the signer has it.\n // The signer holds the key internally via viem's account object.\n this.serviceConfig.privateKey = \"\";\n\n // Auto-select storage backend\n const dbPath = String(runtime.getSetting(\"X402_DB_PATH\") ?? \"\");\n if (dbPath) {\n try {\n this.storage = new SqlitePaymentStorage(dbPath);\n logger.info(`[x402] Using SQLite storage at ${dbPath}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.warn(`[x402] Failed to initialize SQLite storage: ${message}. Falling back to memory storage.`);\n this.storage = new MemoryPaymentStorage();\n }\n } else {\n logger.info(\"[x402] Using in-memory storage (set X402_DB_PATH for persistence)\");\n }\n\n // Build default policy\n const policy: PaymentPolicy = {\n outgoing: {\n maxPerTransaction: usdToBaseUnits(this.serviceConfig.maxPaymentUsd),\n maxTotal: usdToBaseUnits(this.serviceConfig.maxTotalUsd),\n windowMs: ONE_DAY_MS,\n maxTransactions: 1000,\n allowedRecipients: [],\n blockedRecipients: [],\n },\n incoming: {\n minPerTransaction: 0n,\n allowedSenders: [],\n blockedSenders: [],\n },\n };\n\n this.policyEngine = new PolicyEngine(policy, this.storage);\n this.circuitBreaker = new CircuitBreaker();\n\n // Create the fetch wrapper\n this.fetchWithPayment = createFetchWithPayment({\n signer: this.signer,\n policyEngine: this.policyEngine,\n circuitBreaker: this.circuitBreaker,\n storage: this.storage,\n logger,\n });\n\n logger.info(\n `[x402] Service active — max per-txn: $${this.serviceConfig.maxPaymentUsd}, max daily: $${this.serviceConfig.maxTotalUsd}`,\n );\n }\n\n async stop(): Promise<void> {\n logger.info(\"[x402] Service stopping\");\n this.signer = null;\n this.fetchWithPayment = null;\n }\n\n /**\n * Get a fetch function that automatically handles 402 Payment Required.\n * Returns the standard fetch if the service is inactive.\n */\n getFetchWithPayment(): X402Fetch {\n if (!this.fetchWithPayment) {\n return (input: RequestInfo | URL, init?: RequestInit) => fetch(input, init);\n }\n return this.fetchWithPayment;\n }\n\n /**\n * Get a summary of payment activity.\n * @param windowMs - Time window in milliseconds (default: 24h)\n */\n async getSummary(windowMs: number = ONE_DAY_MS): Promise<PaymentSummary> {\n const [totalSpent, totalEarned, outgoingCount, incomingCount] =\n await Promise.all([\n this.storage.getTotal(\"outgoing\", windowMs),\n this.storage.getTotal(\"incoming\", windowMs),\n this.storage.getCount(\"outgoing\", windowMs),\n this.storage.getCount(\"incoming\", windowMs),\n ]);\n\n return {\n totalSpent,\n totalEarned,\n outgoingCount,\n incomingCount,\n windowMs,\n };\n }\n\n /**\n * Get recent payment transactions.\n * @param limit - Maximum number of records to return\n */\n async getRecentTransactions(limit: number = 20): Promise<PaymentRecord[]> {\n return this.storage.getRecords({ limit });\n }\n\n isActive(): boolean {\n return this.serviceConfig.enabled && this.signer !== null;\n }\n\n canMakePayments(): boolean {\n return this.isActive() && this.fetchWithPayment !== null;\n }\n\n updatePolicy(policy: Partial<PaymentPolicy>): void {\n if (this.policyEngine) {\n this.policyEngine.updatePolicy(policy);\n logger.info(\"[x402] Payment policy updated\");\n }\n }\n\n getWalletAddress(): string | null {\n return this.signer?.address ?? null;\n }\n\n getNetwork(): string {\n return this.serviceConfig.network;\n }\n\n getFacilitatorUrl(): string {\n return this.serviceConfig.facilitatorUrl;\n }\n\n getPayToAddress(): string {\n return this.serviceConfig.payTo;\n }\n\n getStorage(): PaymentStorage {\n return this.storage;\n }\n\n getCircuitBreakerState(): string {\n return this.circuitBreaker.getState();\n }\n\n resetCircuitBreaker(): void {\n this.circuitBreaker.reset();\n logger.info(\"[x402] Circuit breaker reset\");\n }\n}\n",
13
- "/** EVM payment signer using viem. Produces \"upto\" scheme payloads with ERC-2612 Permit. */\n\nimport { type Hex, createPublicClient, http, type PublicClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { resolveNetwork } from \"../networks\";\nimport type {\n PaymentRequirement,\n PaymentSigner,\n PermitParams,\n PermitSignature,\n} from \"../types\";\n\nconst PERMIT_TYPES = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\nexport class EvmPaymentSigner implements PaymentSigner {\n private account: ReturnType<typeof privateKeyToAccount>;\n private network: string;\n\n constructor(privateKey: string, network: string) {\n // Normalize private key to have 0x prefix\n const key = privateKey.startsWith(\"0x\")\n ? (privateKey as Hex)\n : (`0x${privateKey}` as Hex);\n\n this.account = privateKeyToAccount(key);\n this.network = network;\n }\n\n get address(): string {\n return this.account.address;\n }\n\n get networkId(): string {\n return resolveNetwork(this.network).caip2;\n }\n\n /** Sign an ERC-2612 permit for USDC. */\n async signPermit(params: PermitParams): Promise<PermitSignature> {\n const networkInfo = resolveNetwork(this.network);\n\n const domain = {\n name: networkInfo.usdcDomainName,\n version: networkInfo.usdcPermitVersion,\n chainId: BigInt(networkInfo.chainId),\n verifyingContract: networkInfo.usdcAddress as Hex,\n };\n\n const message = {\n owner: this.account.address as Hex,\n spender: params.spender as Hex,\n value: params.value,\n nonce: params.nonce,\n deadline: params.deadline,\n };\n\n const signature = await this.account.signTypedData({\n domain,\n types: PERMIT_TYPES,\n primaryType: \"Permit\",\n message,\n });\n\n // Parse r, s, v from the 65-byte compact signature (0x + 130 hex chars)\n const raw = signature.slice(2); // remove 0x prefix\n const r = `0x${raw.slice(0, 64)}`;\n const s = `0x${raw.slice(64, 128)}`;\n const v = parseInt(raw.slice(128, 130), 16);\n\n return { v, r, s };\n }\n\n /** Query the USDC contract's nonces(owner) on-chain via RPC. */\n private async queryOnChainNonce(usdcAddress: Hex, rpcUrl: string, chainId: number): Promise<bigint> {\n const client = createPublicClient({\n transport: http(rpcUrl),\n });\n const result = await client.readContract({\n address: usdcAddress,\n abi: [{\n inputs: [{ name: \"owner\", type: \"address\" }],\n name: \"nonces\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n }],\n functionName: \"nonces\",\n args: [this.account.address],\n }) as bigint;\n return result;\n }\n\n /**\n * Build a base64-encoded x402 v2 payment header using \"upto\" scheme (ERC-2612 Permit).\n *\n * The facilitator's EVM verification expects:\n * - scheme \"upto\" with ERC-2612 Permit signature\n * - EIP-712 domain: { name, version, chainId, verifyingContract: asset }\n * - name and version come from requirement.extra\n * - nonce is the USDC contract's sequential nonce (from requirement.extra or default 0)\n *\n * If requirement.extra.nonce is not provided, the signer queries\n * USDC.nonces(owner) on-chain automatically via RPC.\n */\n async buildPaymentHeader(\n requirement: PaymentRequirement,\n ): Promise<string> {\n const networkInfo = resolveNetwork(this.network);\n const amount = BigInt(requirement.maxAmountRequired);\n\n // Read name and version from requirement.extra for the EIP-712 domain separator.\n // The facilitator's verification reconstructs the domain from these values.\n const tokenName = requirement.extra?.name ?? networkInfo.usdcDomainName;\n const tokenVersion =\n requirement.extra?.version ?? networkInfo.usdcPermitVersion;\n\n // Sequential nonce from the USDC contract's nonces(owner) mapping.\n // Query on-chain if not provided in requirement.extra.\n let nonce: bigint;\n if (requirement.extra?.nonce !== undefined) {\n nonce = BigInt(requirement.extra.nonce);\n } else {\n nonce = await this.queryOnChainNonce(requirement.asset as Hex, networkInfo.rpcUrl, networkInfo.chainId);\n }\n\n // Deadline for the Permit (Unix timestamp)\n const deadline = BigInt(\n Math.floor(Date.now() / 1000) + requirement.maxTimeoutSeconds,\n );\n\n // The spender is the facilitator's signer address (payTo in the requirement)\n const spender = requirement.payTo as Hex;\n\n // Build EIP-712 domain using values from the requirement\n const domain = {\n name: tokenName,\n version: tokenVersion,\n chainId: BigInt(networkInfo.chainId),\n verifyingContract: requirement.asset as Hex,\n };\n\n const message = {\n owner: this.account.address as Hex,\n spender,\n value: amount,\n nonce,\n deadline,\n };\n\n // Sign the ERC-2612 Permit\n const signature = await this.account.signTypedData({\n domain,\n types: PERMIT_TYPES,\n primaryType: \"Permit\",\n message,\n });\n\n // Build the x402 v2 \"upto\" payment payload matching facilitator's expected structure\n const payload = {\n x402Version: 2,\n accepted: {\n scheme: \"upto\",\n network: requirement.network,\n asset: requirement.asset,\n amount: requirement.maxAmountRequired,\n payTo: requirement.payTo,\n },\n payload: {\n authorization: {\n from: this.account.address,\n to: requirement.payTo,\n value: requirement.maxAmountRequired,\n validBefore: deadline.toString(),\n nonce: nonce.toString(),\n },\n signature,\n },\n };\n\n // Base64 encode the JSON payload\n const jsonString = JSON.stringify(payload);\n return Buffer.from(jsonString).toString(\"base64\");\n }\n}\n",
14
- "/** Fetch wrapper that handles 402 Payment Required by signing and retrying. */\n\nimport type { CircuitBreaker } from \"../policy/circuit-breaker\";\nimport type { PolicyEngine } from \"../policy/engine\";\nimport type {\n PaymentRecord,\n PaymentRequiredResponse,\n PaymentRequirement,\n PaymentSigner,\n PaymentStorage,\n} from \"../types\";\n\n/** Logger interface matching ElizaOS logger shape */\ninterface Logger {\n info(msg: string): void;\n info(obj: Record<string, string | number | boolean>, msg: string): void;\n warn(msg: string): void;\n warn(obj: Record<string, string | number | boolean>, msg: string): void;\n error(msg: string): void;\n error(obj: Record<string, string | number | boolean>, msg: string): void;\n debug(msg: string): void;\n debug(obj: Record<string, string | number | boolean>, msg: string): void;\n}\n\nexport interface FetchWithPaymentOptions {\n signer: PaymentSigner;\n policyEngine: PolicyEngine;\n circuitBreaker: CircuitBreaker;\n storage: PaymentStorage;\n logger: Logger;\n}\n\nfunction generateId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `x402_${timestamp}_${random}`;\n}\n\nfunction parsePaymentRequired(\n response: Response,\n): PaymentRequiredResponse | null {\n // The facilitator middleware sends the payment requirement as:\n // - \"payment-required\" header (primary in x402 v2)\n // - \"x-402\" header (backward-compatible alias)\n // - \"x-payment-required\" header (legacy alias)\n // Fetch API Headers.get() is case-insensitive per spec.\n const headerValue =\n response.headers.get(\"payment-required\") ??\n response.headers.get(\"x-402\") ??\n response.headers.get(\"x-payment-required\");\n\n if (!headerValue) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(headerValue, \"base64\").toString(\"utf-8\");\n return JSON.parse(decoded) as PaymentRequiredResponse;\n } catch {\n // Try direct JSON parse (some servers may not base64-encode)\n try {\n return JSON.parse(headerValue) as PaymentRequiredResponse;\n } catch {\n return null;\n }\n }\n}\n\n/** Select a payment option matching our network. */\nfunction selectPaymentOption(\n accepts: PaymentRequirement[],\n signerNetworkId: string,\n): PaymentRequirement | null {\n // Only select options that match our network — never fall back to\n // a different chain, as that would produce invalid signatures\n const matching = accepts.find((a) => a.network === signerNetworkId);\n return matching ?? null;\n}\n\n/** A fetch-compatible function that also handles x402 402 responses. */\nexport type X402Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport function createFetchWithPayment(\n options: FetchWithPaymentOptions,\n): X402Fetch {\n const { signer, policyEngine, circuitBreaker, storage, logger } = options;\n\n return async function fetchWithPayment(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Make the initial request\n logger.debug(`[x402] Making request to ${url}`);\n const initialResponse = await fetch(input, init);\n\n // If not 402, return as-is\n if (initialResponse.status !== 402) {\n return initialResponse;\n }\n\n logger.info(`[x402] Received 402 Payment Required from ${url}`);\n\n // Parse the payment requirement\n const paymentRequired = parsePaymentRequired(initialResponse);\n if (!paymentRequired) {\n logger.error(\n \"[x402] Could not parse payment requirement header from 402 response\",\n );\n return initialResponse;\n }\n\n if (\n !paymentRequired.accepts ||\n paymentRequired.accepts.length === 0\n ) {\n logger.error(\"[x402] No payment options in 402 response\");\n return initialResponse;\n }\n\n // Select a payment option\n const requirement = selectPaymentOption(\n paymentRequired.accepts,\n signer.networkId,\n );\n if (!requirement) {\n logger.error(\"[x402] No compatible payment option found\");\n return initialResponse;\n }\n\n const amount = BigInt(requirement.maxAmountRequired);\n logger.info(\n `[x402] Payment required: ${amount} to ${requirement.payTo} on ${requirement.network}`,\n );\n\n // Check policy BEFORE signing\n const policyResult = await policyEngine.evaluateOutgoing({\n amount,\n recipient: requirement.payTo,\n resource: url,\n });\n\n if (!policyResult.allowed) {\n logger.warn(`[x402] Payment blocked by policy: ${policyResult.reason}`);\n return initialResponse;\n }\n\n // Check circuit breaker\n const breakerResult = circuitBreaker.check(amount);\n if (!breakerResult.allowed) {\n logger.warn(\n `[x402] Payment blocked by circuit breaker: ${breakerResult.reason}`,\n );\n return initialResponse;\n }\n\n // Sign the payment\n let paymentHeader: string;\n try {\n paymentHeader = await signer.buildPaymentHeader(requirement);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : String(err);\n logger.error(`[x402] Failed to sign payment: ${message}`);\n circuitBreaker.recordFailure();\n return initialResponse;\n }\n\n // Retry request with payment header.\n // \"X-PAYMENT\" is an accepted alias for \"Payment\" in the facilitator middleware.\n logger.info(\"[x402] Retrying request with X-PAYMENT header\");\n const retryHeaders = new Headers(init?.headers);\n retryHeaders.set(\"X-PAYMENT\", paymentHeader);\n\n const retryInit: RequestInit = {\n ...init,\n headers: retryHeaders,\n };\n\n let retryResponse: Response;\n try {\n retryResponse = await fetch(input, retryInit);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : String(err);\n logger.error(`[x402] Retry request failed: ${message}`);\n circuitBreaker.recordFailure();\n return initialResponse;\n }\n\n // Read session ID for \"upto\" scheme (primary response header)\n // and fall back to legacy X-PAYMENT-RESPONSE for backward compatibility.\n const sessionId =\n retryResponse.headers.get(\"x-upto-session-id\") ??\n retryResponse.headers.get(\"X-PAYMENT-RESPONSE\") ??\n \"\";\n\n // Record the payment\n const record: PaymentRecord = {\n id: generateId(),\n direction: \"outgoing\",\n counterparty: requirement.payTo,\n amount,\n network: requirement.network,\n txHash: sessionId,\n resource: url,\n status: retryResponse.ok ? \"confirmed\" : \"failed\",\n createdAt: new Date().toISOString(),\n metadata: {\n scheme: requirement.scheme,\n description: requirement.description,\n },\n };\n\n try {\n await storage.recordPayment(record);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : String(err);\n logger.error(`[x402] Failed to record payment: ${message}`);\n }\n\n if (retryResponse.ok) {\n circuitBreaker.recordSuccess(amount);\n logger.info(\n `[x402] Payment successful: ${amount} to ${requirement.payTo}`,\n );\n } else {\n circuitBreaker.recordFailure();\n logger.warn(\n `[x402] Payment request returned ${retryResponse.status} after payment`,\n );\n }\n\n return retryResponse;\n };\n}\n",
15
- "/** Circuit breaker: trips on excessive rate or anomalous amount, with cooldown/half-open probe. */\n\nimport type { CircuitBreakerConfig, CircuitState } from \"../types\";\n\n/** Default circuit breaker configuration */\nconst DEFAULT_CONFIG: CircuitBreakerConfig = {\n maxPaymentsPerMinute: 50,\n anomalyMultiplier: 10,\n cooldownMs: 60_000,\n recentWindowSize: 20,\n};\n\nexport class CircuitBreaker {\n private state: CircuitState = \"closed\";\n private config: CircuitBreakerConfig;\n\n private recentTimestamps: number[] = [];\n\n private recentAmounts: bigint[] = [];\n\n private trippedAt: number = 0;\n\n private lastTripReason: string = \"\";\n\n constructor(config?: Partial<CircuitBreakerConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n check(amount: bigint): { allowed: boolean; reason: string } {\n const now = Date.now();\n\n // If open, check if cooldown has elapsed\n if (this.state === \"open\") {\n if (now - this.trippedAt >= this.config.cooldownMs) {\n this.state = \"half-open\";\n } else {\n return {\n allowed: false,\n reason: `Circuit breaker is OPEN: ${this.lastTripReason}. Resets in ${Math.ceil((this.config.cooldownMs - (now - this.trippedAt)) / 1000)}s`,\n };\n }\n }\n\n // Rate check: count payments in the last 60 seconds\n const oneMinuteAgo = now - 60_000;\n this.recentTimestamps = this.recentTimestamps.filter(\n (t) => t > oneMinuteAgo,\n );\n if (this.recentTimestamps.length >= this.config.maxPaymentsPerMinute) {\n this.trip(`Rate exceeded: ${this.recentTimestamps.length} payments in the last minute`);\n return { allowed: false, reason: this.lastTripReason };\n }\n\n // Anomaly check: compare against rolling average\n if (this.recentAmounts.length >= 3) {\n const sum = this.recentAmounts.reduce((a, b) => a + b, 0n);\n const avg = sum / BigInt(this.recentAmounts.length);\n if (avg > 0n && amount > avg * BigInt(this.config.anomalyMultiplier)) {\n this.trip(\n `Anomaly detected: payment of ${amount} is >${this.config.anomalyMultiplier}x the average of ${avg}`,\n );\n return { allowed: false, reason: this.lastTripReason };\n }\n }\n\n return { allowed: true, reason: \"\" };\n }\n\n recordSuccess(amount: bigint): void {\n const now = Date.now();\n this.recentTimestamps.push(now);\n\n // Maintain a sliding window of recent amounts\n this.recentAmounts.push(amount);\n if (this.recentAmounts.length > this.config.recentWindowSize) {\n this.recentAmounts.shift();\n }\n\n // Successful probe in half-open → close\n if (this.state === \"half-open\") {\n this.state = \"closed\";\n this.lastTripReason = \"\";\n }\n }\n\n recordFailure(): void {\n if (this.state === \"half-open\") {\n this.trip(\"Probe payment failed in half-open state\");\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n\n getTripReason(): string {\n return this.lastTripReason;\n }\n\n reset(): void {\n this.state = \"closed\";\n this.lastTripReason = \"\";\n this.trippedAt = 0;\n }\n\n private trip(reason: string): void {\n this.state = \"open\";\n this.trippedAt = Date.now();\n this.lastTripReason = reason;\n }\n}\n",
16
- "/** Payment policy engine. First violation blocks. */\n\nimport type {\n IncomingPaymentRequest,\n OutgoingPaymentRequest,\n PaymentPolicy,\n PaymentStorage,\n PolicyResult,\n} from \"../types\";\n\nconst ALLOW: PolicyResult = { allowed: true, reason: \"\" };\n\nfunction deny(reason: string): PolicyResult {\n return { allowed: false, reason };\n}\n\nexport class PolicyEngine {\n private policy: PaymentPolicy;\n private storage: PaymentStorage;\n\n constructor(policy: PaymentPolicy, storage: PaymentStorage) {\n this.policy = policy;\n this.storage = storage;\n }\n\n updatePolicy(partial: Partial<PaymentPolicy>): void {\n if (partial.outgoing) {\n this.policy.outgoing = { ...this.policy.outgoing, ...partial.outgoing };\n }\n if (partial.incoming) {\n this.policy.incoming = { ...this.policy.incoming, ...partial.incoming };\n }\n }\n\n getPolicy(): PaymentPolicy {\n return {\n outgoing: { ...this.policy.outgoing },\n incoming: { ...this.policy.incoming },\n };\n }\n\n async evaluateOutgoing(\n request: OutgoingPaymentRequest,\n ): Promise<PolicyResult> {\n const limits = this.policy.outgoing;\n\n // 1. Per-transaction limit\n if (request.amount > limits.maxPerTransaction) {\n return deny(\n `Amount ${request.amount} exceeds per-transaction limit of ${limits.maxPerTransaction}`,\n );\n }\n\n // 2. Blocked recipients\n if (limits.blockedRecipients.length > 0) {\n const normalized = request.recipient.toLowerCase();\n if (\n limits.blockedRecipients.some(\n (addr) => addr.toLowerCase() === normalized,\n )\n ) {\n return deny(`Recipient ${request.recipient} is blocked`);\n }\n }\n\n // 3. Allowed recipients (whitelist mode)\n if (limits.allowedRecipients.length > 0) {\n const normalized = request.recipient.toLowerCase();\n if (\n !limits.allowedRecipients.some(\n (addr) => addr.toLowerCase() === normalized,\n )\n ) {\n return deny(`Recipient ${request.recipient} is not in the allow list`);\n }\n }\n\n // 4. Total within time window\n const currentTotal = await this.storage.getTotal(\n \"outgoing\",\n limits.windowMs,\n );\n if (currentTotal + request.amount > limits.maxTotal) {\n return deny(\n `Total spend would be ${currentTotal + request.amount}, exceeding window limit of ${limits.maxTotal}`,\n );\n }\n\n // 5. Transaction count within time window\n const currentCount = await this.storage.getCount(\n \"outgoing\",\n limits.windowMs,\n );\n if (currentCount >= limits.maxTransactions) {\n return deny(\n `Transaction count ${currentCount} has reached the limit of ${limits.maxTransactions}`,\n );\n }\n\n return ALLOW;\n }\n\n async evaluateIncoming(\n request: IncomingPaymentRequest,\n ): Promise<PolicyResult> {\n const limits = this.policy.incoming;\n\n // 1. Minimum per-transaction\n if (request.amount < limits.minPerTransaction) {\n return deny(\n `Amount ${request.amount} is below minimum of ${limits.minPerTransaction}`,\n );\n }\n\n // 2. Blocked senders\n if (limits.blockedSenders.length > 0) {\n const normalized = request.sender.toLowerCase();\n if (\n limits.blockedSenders.some(\n (addr) => addr.toLowerCase() === normalized,\n )\n ) {\n return deny(`Sender ${request.sender} is blocked`);\n }\n }\n\n // 3. Allowed senders (whitelist mode)\n if (limits.allowedSenders.length > 0) {\n const normalized = request.sender.toLowerCase();\n if (\n !limits.allowedSenders.some(\n (addr) => addr.toLowerCase() === normalized,\n )\n ) {\n return deny(`Sender ${request.sender} is not in the allow list`);\n }\n }\n\n return ALLOW;\n }\n}\n",
17
- "/** In-memory PaymentStorage. Data lost on process exit. */\n\nimport type {\n PaymentDirection,\n PaymentFilters,\n PaymentRecord,\n PaymentStorage,\n} from \"../types\";\n\nexport class MemoryPaymentStorage implements PaymentStorage {\n private records: PaymentRecord[] = [];\n\n async recordPayment(record: PaymentRecord): Promise<void> {\n // Deep copy to prevent external mutation from corrupting stored data.\n // metadata is the only nested reference type that needs cloning.\n this.records.push({\n ...record,\n metadata: { ...record.metadata },\n });\n }\n\n async getTotal(\n direction: PaymentDirection,\n windowMs?: number,\n scope?: string,\n ): Promise<bigint> {\n const cutoff = windowMs\n ? new Date(Date.now() - windowMs).toISOString()\n : undefined;\n\n let total = 0n;\n for (const r of this.records) {\n if (r.direction !== direction) continue;\n if (cutoff && r.createdAt < cutoff) continue;\n if (scope && r.counterparty !== scope) continue;\n if (r.status === \"failed\" || r.status === \"refunded\") continue;\n total += r.amount;\n }\n return total;\n }\n\n async getRecords(filters?: PaymentFilters): Promise<PaymentRecord[]> {\n let result = [...this.records];\n\n if (filters) {\n if (filters.direction) {\n result = result.filter((r) => r.direction === filters.direction);\n }\n if (filters.counterparty) {\n result = result.filter(\n (r) =>\n r.counterparty.toLowerCase() ===\n filters.counterparty!.toLowerCase(),\n );\n }\n if (filters.status) {\n result = result.filter((r) => r.status === filters.status);\n }\n if (filters.network) {\n result = result.filter((r) => r.network === filters.network);\n }\n if (filters.since) {\n result = result.filter((r) => r.createdAt >= filters.since!);\n }\n if (filters.until) {\n result = result.filter((r) => r.createdAt <= filters.until!);\n }\n }\n\n // Sort newest first\n result.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n const offset = filters?.offset ?? 0;\n const limit = filters?.limit ?? result.length;\n return result.slice(offset, offset + limit);\n }\n\n async getCount(\n direction: PaymentDirection,\n windowMs?: number,\n ): Promise<number> {\n const cutoff = windowMs\n ? new Date(Date.now() - windowMs).toISOString()\n : undefined;\n\n let count = 0;\n for (const r of this.records) {\n if (r.direction !== direction) continue;\n if (cutoff && r.createdAt < cutoff) continue;\n if (r.status === \"failed\" || r.status === \"refunded\") continue;\n count++;\n }\n return count;\n }\n\n async clear(): Promise<void> {\n this.records = [];\n }\n}\n",
18
- "/** SQLite PaymentStorage using better-sqlite3. Amounts stored as TEXT for BigInt precision. */\n\nimport Database from \"better-sqlite3\";\nimport type {\n PaymentDirection,\n PaymentFilters,\n PaymentRecord,\n PaymentStorage,\n} from \"../types\";\n\n/** Row shape returned from SQLite queries */\ninterface PaymentRow {\n id: string;\n direction: string;\n counterparty: string;\n amount: string;\n network: string;\n tx_hash: string;\n resource: string;\n status: string;\n created_at: string;\n metadata: string;\n}\n\nexport class SqlitePaymentStorage implements PaymentStorage {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n this.initialize();\n }\n\n private initialize(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS x402_payments (\n id TEXT PRIMARY KEY,\n direction TEXT NOT NULL CHECK(direction IN ('outgoing', 'incoming')),\n counterparty TEXT NOT NULL,\n amount TEXT NOT NULL,\n network TEXT NOT NULL,\n tx_hash TEXT NOT NULL DEFAULT '',\n resource TEXT NOT NULL DEFAULT '',\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}'\n );\n\n CREATE INDEX IF NOT EXISTS idx_x402_direction ON x402_payments(direction);\n CREATE INDEX IF NOT EXISTS idx_x402_created_at ON x402_payments(created_at);\n CREATE INDEX IF NOT EXISTS idx_x402_counterparty ON x402_payments(counterparty);\n CREATE INDEX IF NOT EXISTS idx_x402_status ON x402_payments(status);\n `);\n }\n\n async recordPayment(record: PaymentRecord): Promise<void> {\n const stmt = this.db.prepare(`\n INSERT INTO x402_payments (id, direction, counterparty, amount, network, tx_hash, resource, status, created_at, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n record.id,\n record.direction,\n record.counterparty,\n record.amount.toString(),\n record.network,\n record.txHash,\n record.resource,\n record.status,\n record.createdAt,\n JSON.stringify(record.metadata),\n );\n }\n\n async getTotal(\n direction: PaymentDirection,\n windowMs?: number,\n scope?: string,\n ): Promise<bigint> {\n let sql =\n \"SELECT amount FROM x402_payments WHERE direction = ? AND status NOT IN ('failed', 'refunded')\";\n const params: (string | number)[] = [direction];\n\n if (windowMs !== undefined) {\n const cutoff = new Date(Date.now() - windowMs).toISOString();\n sql += \" AND created_at >= ?\";\n params.push(cutoff);\n }\n\n if (scope) {\n sql += \" AND counterparty = ?\";\n params.push(scope);\n }\n\n const rows = this.db.prepare(sql).all(...params) as Array<{ amount: string }>;\n let total = 0n;\n for (const row of rows) {\n total += BigInt(row.amount);\n }\n return total;\n }\n\n async getRecords(filters?: PaymentFilters): Promise<PaymentRecord[]> {\n let sql = \"SELECT * FROM x402_payments WHERE 1=1\";\n const params: (string | number)[] = [];\n\n if (filters) {\n if (filters.direction) {\n sql += \" AND direction = ?\";\n params.push(filters.direction);\n }\n if (filters.counterparty) {\n sql += \" AND LOWER(counterparty) = LOWER(?)\";\n params.push(filters.counterparty);\n }\n if (filters.status) {\n sql += \" AND status = ?\";\n params.push(filters.status);\n }\n if (filters.network) {\n sql += \" AND network = ?\";\n params.push(filters.network);\n }\n if (filters.since) {\n sql += \" AND created_at >= ?\";\n params.push(filters.since);\n }\n if (filters.until) {\n sql += \" AND created_at <= ?\";\n params.push(filters.until);\n }\n }\n\n sql += \" ORDER BY created_at DESC\";\n\n if (filters?.limit !== undefined) {\n sql += \" LIMIT ?\";\n params.push(filters.limit);\n }\n if (filters?.offset !== undefined) {\n sql += \" OFFSET ?\";\n params.push(filters.offset);\n }\n\n const rows = this.db.prepare(sql).all(...params) as PaymentRow[];\n return rows.map((row) => this.rowToRecord(row));\n }\n\n async getCount(\n direction: PaymentDirection,\n windowMs?: number,\n ): Promise<number> {\n let sql =\n \"SELECT COUNT(*) as cnt FROM x402_payments WHERE direction = ? AND status NOT IN ('failed', 'refunded')\";\n const params: (string | number)[] = [direction];\n\n if (windowMs !== undefined) {\n const cutoff = new Date(Date.now() - windowMs).toISOString();\n sql += \" AND created_at >= ?\";\n params.push(cutoff);\n }\n\n const row = this.db.prepare(sql).get(...params) as { cnt: number };\n return row.cnt;\n }\n\n async clear(): Promise<void> {\n this.db.exec(\"DELETE FROM x402_payments\");\n }\n\n close(): void {\n this.db.close();\n }\n\n private rowToRecord(row: PaymentRow): PaymentRecord {\n let metadata: Record<string, string> = {};\n try {\n metadata = JSON.parse(row.metadata) as Record<string, string>;\n } catch (_metadataParseError) {\n // Non-critical: metadata is optional display data\n }\n\n return {\n id: row.id,\n direction: row.direction as PaymentDirection,\n counterparty: row.counterparty,\n amount: BigInt(row.amount),\n network: row.network,\n txHash: row.tx_hash,\n resource: row.resource,\n status: row.status as PaymentRecord[\"status\"],\n createdAt: row.created_at,\n metadata,\n };\n }\n}\n",
19
- "/** Client for the x402 facilitator service (verify + settle). */\n\nimport type { FacilitatorVerifyResult, PaymentRequirement } from \"../types\";\n\nfunction buildFacilitatorRequestBody(\n paymentProof: string,\n requirement: PaymentRequirement,\n): string {\n // Decode the base64 payment proof back to JSON.\n // Try base64 first, then direct JSON, then give up with a clear error.\n let paymentPayload: Record<string, string | number | boolean | Record<string, string | number>>;\n try {\n const decoded = Buffer.from(paymentProof, \"base64\").toString(\"utf-8\");\n paymentPayload = JSON.parse(decoded) as Record<string, string | number | boolean | Record<string, string | number>>;\n } catch {\n try {\n paymentPayload = JSON.parse(paymentProof) as Record<string, string | number | boolean | Record<string, string | number>>;\n } catch {\n throw new Error(\n \"Payment proof is neither valid base64-encoded JSON nor direct JSON\",\n );\n }\n }\n\n const paymentRequirements = {\n scheme: requirement.scheme,\n network: requirement.network,\n asset: requirement.asset,\n amount: requirement.maxAmountRequired,\n payTo: requirement.payTo,\n maxTimeoutSeconds: requirement.maxTimeoutSeconds,\n extra: requirement.extra,\n };\n\n return JSON.stringify({ paymentPayload, paymentRequirements });\n}\n\nexport async function verifyPaymentWithFacilitator(\n paymentProof: string,\n facilitatorUrl: string,\n requirement: PaymentRequirement,\n): Promise<FacilitatorVerifyResult> {\n const url = new URL(\"/verify\", facilitatorUrl);\n\n try {\n const body = buildFacilitatorRequestBody(paymentProof, requirement);\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"unknown error\");\n return {\n valid: false,\n reason: `Facilitator returned ${response.status}: ${errorText}`,\n };\n }\n\n const result = (await response.json()) as {\n isValid?: boolean;\n payer?: string;\n invalidReason?: string;\n };\n\n return {\n valid: result.isValid === true,\n payer: result.payer,\n reason: result.invalidReason,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n valid: false,\n reason: `Facilitator request failed: ${message}`,\n };\n }\n}\n\nexport async function settlePaymentWithFacilitator(\n paymentProof: string,\n facilitatorUrl: string,\n requirement: PaymentRequirement,\n): Promise<{ success: boolean; txHash?: string; reason?: string }> {\n const url = new URL(\"/settle\", facilitatorUrl);\n\n try {\n const body = buildFacilitatorRequestBody(paymentProof, requirement);\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"unknown error\");\n return {\n success: false,\n reason: `Facilitator returned ${response.status}: ${errorText}`,\n };\n }\n\n const result = (await response.json()) as {\n success?: boolean;\n transaction?: string;\n network?: string;\n payer?: string;\n errorReason?: string;\n };\n\n return {\n success: result.success === true,\n txHash: result.transaction,\n reason: result.errorReason,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n reason: `Facilitator request failed: ${message}`,\n };\n }\n}\n",
20
- "/** Paywall middleware — returns 402 or verifies X-PAYMENT header via facilitator. */\n\nimport { resolveNetwork } from \"../networks\";\nimport type {\n PaymentRequiredResponse,\n PaymentRequirement,\n PaymentStorage,\n PaywallConfig,\n PaywallMiddleware,\n PaywallRequest,\n PaywallResponse,\n} from \"../types\";\nimport {\n settlePaymentWithFacilitator,\n verifyPaymentWithFacilitator,\n} from \"./facilitator-client\";\n\nexport function createPaywallMiddleware(\n config: PaywallConfig,\n storage?: PaymentStorage,\n onStorageError?: (err: Error) => void,\n): PaywallMiddleware {\n const networkInfo = resolveNetwork(config.network);\n\n // Pre-build the payment requirement template.\n // Uses \"upto\" scheme to match the facilitator's EVM verification.\n // Includes extra fields (name, version) so the client can reconstruct\n // the correct EIP-712 domain for the Permit signature.\n const requirementTemplate: PaymentRequirement = {\n scheme: \"upto\",\n network: networkInfo.caip2,\n maxAmountRequired: config.amount.toString(),\n resource: \"\", // Will be set per-request\n description: config.description,\n mimeType: config.mimeType,\n payTo: config.payTo,\n maxTimeoutSeconds: config.maxTimeoutSeconds,\n asset: networkInfo.usdcAddress,\n extra: {\n name: networkInfo.usdcDomainName,\n version: networkInfo.usdcPermitVersion,\n },\n };\n\n return async (\n req: PaywallRequest,\n res: PaywallResponse,\n next: () => void,\n ): Promise<void> => {\n // Check for X-PAYMENT header (also accepted as \"payment\" by facilitator)\n const paymentHeader = getHeader(req, \"x-payment\");\n\n if (!paymentHeader) {\n // No payment provided — return 402 with requirements\n const resource = req.url ?? \"/\";\n const requirement = { ...requirementTemplate, resource };\n const paymentRequired: PaymentRequiredResponse = {\n x402Version: 2,\n accepts: [requirement],\n };\n\n const encoded = Buffer.from(\n JSON.stringify(paymentRequired),\n ).toString(\"base64\");\n\n res\n .setHeader(\"Payment-Required\", encoded)\n .setHeader(\"x-402\", encoded)\n .status(402)\n .json({\n error: \"Payment Required\",\n message: config.description,\n x402Version: 2,\n });\n return;\n }\n\n // Build requirement for this request\n const requirement: PaymentRequirement = {\n ...requirementTemplate,\n resource: req.url ?? \"/\",\n };\n\n // Verify the payment with the facilitator\n const verifyResult = await verifyPaymentWithFacilitator(\n paymentHeader,\n config.facilitatorUrl,\n requirement,\n );\n\n if (!verifyResult.valid) {\n res.status(402).json({\n error: \"Payment Invalid\",\n reason: verifyResult.reason ?? \"Payment verification failed\",\n });\n return;\n }\n\n // Settle the payment\n const settleResult = await settlePaymentWithFacilitator(\n paymentHeader,\n config.facilitatorUrl,\n requirement,\n );\n\n // Record incoming payment if storage is provided\n if (storage && verifyResult.payer) {\n const id = `x402_in_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 8)}`;\n await storage\n .recordPayment({\n id,\n direction: \"incoming\",\n counterparty: verifyResult.payer,\n amount: config.amount,\n network: networkInfo.caip2,\n txHash: settleResult.txHash ?? \"\",\n resource: req.url ?? \"/\",\n status: settleResult.success ? \"confirmed\" : \"pending\",\n createdAt: new Date().toISOString(),\n metadata: {},\n })\n .catch((err: Error) => {\n if (onStorageError) {\n onStorageError(err);\n }\n });\n }\n\n // Set response headers with tx hash / session ID if available\n if (settleResult.txHash) {\n // Primary: x-upto-session-id for \"upto\" scheme\n res.setHeader(\"x-upto-session-id\", settleResult.txHash);\n // Backward-compatible alias\n res.setHeader(\"X-PAYMENT-RESPONSE\", settleResult.txHash);\n }\n\n // Payment verified — proceed to handler\n next();\n };\n}\n\n/** Case-insensitive header lookup. */\nfunction getHeader(req: PaywallRequest, name: string): string | undefined {\n const headers = req.headers;\n const lowerName = name.toLowerCase();\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerName) {\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n }\n\n return undefined;\n}\n",
21
- "/** PostgreSQL PaymentStorage for multi-tenant Eliza Cloud deployments. Amounts stored as TEXT for BigInt precision. */\n\nimport pg from \"pg\";\nimport type {\n PaymentDirection,\n PaymentFilters,\n PaymentRecord,\n PaymentStorage,\n} from \"../types\";\n\nconst { Pool } = pg;\n\n/** Row shape returned from Postgres queries */\ninterface PaymentRow {\n id: string;\n agent_id: string;\n direction: string;\n counterparty: string;\n amount: string;\n network: string;\n tx_hash: string;\n resource: string;\n status: string;\n created_at: string;\n metadata: Record<string, string>;\n}\n\nexport class PostgresPaymentStorage implements PaymentStorage {\n private pool: pg.Pool;\n private agentId: string;\n private initialized: Promise<void>;\n\n constructor(connectionString: string, agentId: string) {\n this.pool = new Pool({ connectionString });\n this.agentId = agentId;\n this.initialized = this.initialize();\n }\n\n private async initialize(): Promise<void> {\n const client = await this.pool.connect();\n try {\n await client.query(`\n CREATE TABLE IF NOT EXISTS x402_payments (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n direction VARCHAR NOT NULL CHECK(direction IN ('outgoing', 'incoming')),\n counterparty TEXT NOT NULL,\n amount TEXT NOT NULL,\n network TEXT NOT NULL,\n tx_hash TEXT NOT NULL DEFAULT '',\n resource TEXT NOT NULL DEFAULT '',\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL,\n metadata JSONB NOT NULL DEFAULT '{}'\n );\n CREATE INDEX IF NOT EXISTS idx_x402_agent ON x402_payments(agent_id);\n CREATE INDEX IF NOT EXISTS idx_x402_direction ON x402_payments(agent_id, direction, created_at);\n `);\n } finally {\n client.release();\n }\n }\n\n /** Ensure the table is created before any operation */\n private async ready(): Promise<void> {\n await this.initialized;\n }\n\n async recordPayment(record: PaymentRecord): Promise<void> {\n await this.ready();\n await this.pool.query(\n `INSERT INTO x402_payments (id, agent_id, direction, counterparty, amount, network, tx_hash, resource, status, created_at, metadata)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n [\n record.id,\n this.agentId,\n record.direction,\n record.counterparty,\n record.amount.toString(),\n record.network,\n record.txHash,\n record.resource,\n record.status,\n record.createdAt,\n JSON.stringify(record.metadata),\n ],\n );\n }\n\n async getTotal(\n direction: PaymentDirection,\n windowMs?: number,\n scope?: string,\n ): Promise<bigint> {\n await this.ready();\n\n let sql =\n \"SELECT amount FROM x402_payments WHERE agent_id = $1 AND direction = $2 AND status NOT IN ('failed', 'refunded')\";\n const params: (string | number)[] = [this.agentId, direction];\n let paramIdx = 3;\n\n if (windowMs !== undefined) {\n const cutoff = new Date(Date.now() - windowMs).toISOString();\n sql += ` AND created_at >= $${paramIdx}`;\n params.push(cutoff);\n paramIdx++;\n }\n\n if (scope) {\n sql += ` AND counterparty = $${paramIdx}`;\n params.push(scope);\n paramIdx++;\n }\n\n const result = await this.pool.query<{ amount: string }>(sql, params);\n let total = 0n;\n for (const row of result.rows) {\n total += BigInt(row.amount);\n }\n return total;\n }\n\n async getRecords(filters?: PaymentFilters): Promise<PaymentRecord[]> {\n await this.ready();\n\n let sql = \"SELECT * FROM x402_payments WHERE agent_id = $1\";\n const params: (string | number)[] = [this.agentId];\n let paramIdx = 2;\n\n if (filters) {\n if (filters.direction) {\n sql += ` AND direction = $${paramIdx}`;\n params.push(filters.direction);\n paramIdx++;\n }\n if (filters.counterparty) {\n sql += ` AND LOWER(counterparty) = LOWER($${paramIdx})`;\n params.push(filters.counterparty);\n paramIdx++;\n }\n if (filters.status) {\n sql += ` AND status = $${paramIdx}`;\n params.push(filters.status);\n paramIdx++;\n }\n if (filters.network) {\n sql += ` AND network = $${paramIdx}`;\n params.push(filters.network);\n paramIdx++;\n }\n if (filters.since) {\n sql += ` AND created_at >= $${paramIdx}`;\n params.push(filters.since);\n paramIdx++;\n }\n if (filters.until) {\n sql += ` AND created_at <= $${paramIdx}`;\n params.push(filters.until);\n paramIdx++;\n }\n }\n\n sql += \" ORDER BY created_at DESC\";\n\n if (filters?.limit !== undefined) {\n sql += ` LIMIT $${paramIdx}`;\n params.push(filters.limit);\n paramIdx++;\n }\n if (filters?.offset !== undefined) {\n sql += ` OFFSET $${paramIdx}`;\n params.push(filters.offset);\n paramIdx++;\n }\n\n const result = await this.pool.query<PaymentRow>(sql, params);\n return result.rows.map((row) => this.rowToRecord(row));\n }\n\n async getCount(\n direction: PaymentDirection,\n windowMs?: number,\n ): Promise<number> {\n await this.ready();\n\n let sql =\n \"SELECT COUNT(*) as cnt FROM x402_payments WHERE agent_id = $1 AND direction = $2 AND status NOT IN ('failed', 'refunded')\";\n const params: (string | number)[] = [this.agentId, direction];\n let paramIdx = 3;\n\n if (windowMs !== undefined) {\n const cutoff = new Date(Date.now() - windowMs).toISOString();\n sql += ` AND created_at >= $${paramIdx}`;\n params.push(cutoff);\n paramIdx++;\n }\n\n const result = await this.pool.query<{ cnt: string }>(sql, params);\n return parseInt(result.rows[0].cnt, 10);\n }\n\n async clear(): Promise<void> {\n await this.ready();\n await this.pool.query(\"DELETE FROM x402_payments WHERE agent_id = $1\", [\n this.agentId,\n ]);\n }\n\n /** Gracefully shut down the connection pool */\n async close(): Promise<void> {\n await this.pool.end();\n }\n\n private rowToRecord(row: PaymentRow): PaymentRecord {\n let metadata: Record<string, string> = {};\n try {\n // Postgres JSONB is already parsed by pg driver, but handle string case defensively\n metadata =\n typeof row.metadata === \"string\"\n ? (JSON.parse(row.metadata as unknown as string) as Record<string, string>)\n : (row.metadata as Record<string, string>);\n } catch (_metadataParseError) {\n // Non-critical: metadata is optional display data\n }\n\n return {\n id: row.id,\n direction: row.direction as PaymentDirection,\n counterparty: row.counterparty,\n amount: BigInt(row.amount),\n network: row.network,\n txHash: row.tx_hash,\n resource: row.resource,\n status: row.status as PaymentRecord[\"status\"],\n createdAt: row.created_at,\n metadata,\n };\n }\n}\n",
22
- "/**\n * @elizaos/plugin-x402\n *\n * x402 HTTP payment protocol plugin for ElizaOS.\n * Enables agents to send and receive crypto payments (USDC on EVM chains)\n * using the x402 protocol standard.\n *\n * @see https://www.x402.org/\n */\n\nimport type {\n IAgentRuntime,\n Plugin,\n RouteRequest,\n RouteResponse,\n} from \"@elizaos/core\";\n\nimport { checkPaymentHistoryAction } from \"./actions/check-payment-history\";\nimport { setPaymentPolicyAction } from \"./actions/set-payment-policy\";\nimport { payForServiceAction } from \"./actions/pay-for-service\";\nimport { paymentBalanceProvider } from \"./providers/payment-balance\";\nimport { agentCardRoute } from \"./routes/agent-card\";\nimport { X402Service } from \"./services/x402-service\";\nimport { formatUsd } from \"./utils\";\n\n// Re-export public API\nexport { X402Service } from \"./services/x402-service\";\nexport { EvmPaymentSigner } from \"./client/signer\";\nexport { createFetchWithPayment } from \"./client/fetch-with-payment\";\nexport { createPaywallMiddleware } from \"./middleware/paywall\";\nexport {\n verifyPaymentWithFacilitator,\n settlePaymentWithFacilitator,\n} from \"./middleware/facilitator-client\";\nexport { PolicyEngine } from \"./policy/engine\";\nexport { CircuitBreaker } from \"./policy/circuit-breaker\";\nexport { MemoryPaymentStorage } from \"./storage/memory\";\nexport { SqlitePaymentStorage } from \"./storage/sqlite\";\nexport { PostgresPaymentStorage } from \"./storage/postgres\";\nexport { NETWORK_REGISTRY, resolveNetwork, networkKeyFromCaip2 } from \"./networks\";\nexport { payForServiceAction } from \"./actions/pay-for-service\";\nexport { checkPaymentHistoryAction } from \"./actions/check-payment-history\";\nexport { setPaymentPolicyAction } from \"./actions/set-payment-policy\";\nexport { agentCardRoute } from \"./routes/agent-card\";\nexport { paymentBalanceProvider } from \"./providers/payment-balance\";\nexport { formatUsd, truncateAddress, usdToBaseUnits, ONE_DAY_MS } from \"./utils\";\nexport type * from \"./types\";\n\n/** GET /x402/summary — Return 24h payment summary as JSON */\nasync function handleSummary(\n _req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime,\n): Promise<void> {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n if (!service || !service.isActive()) {\n res.status(503).json({ error: \"x402 service not active\" });\n return;\n }\n\n const summary = await service.getSummary();\n res.status(200).json({\n wallet: service.getWalletAddress() ?? \"\",\n network: service.getNetwork(),\n totalSpent: formatUsd(summary.totalSpent),\n totalSpentRaw: summary.totalSpent.toString(),\n totalEarned: formatUsd(summary.totalEarned),\n totalEarnedRaw: summary.totalEarned.toString(),\n outgoingCount: summary.outgoingCount,\n incomingCount: summary.incomingCount,\n windowMs: summary.windowMs,\n circuitBreaker: service.getCircuitBreakerState(),\n });\n}\n\n/** GET /x402/history — Return recent payment transactions */\nasync function handleHistory(\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime,\n): Promise<void> {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n if (!service || !service.isActive()) {\n res.status(503).json({ error: \"x402 service not active\" });\n return;\n }\n\n const limitStr =\n (Array.isArray(req.query?.limit)\n ? req.query.limit[0]\n : req.query?.limit) ?? \"20\";\n const limit = Math.min(Math.max(parseInt(limitStr, 10) || 20, 1), 100);\n\n const transactions = await service.getRecentTransactions(limit);\n\n // Serialize BigInt amounts as strings for JSON transport\n const serialized = transactions.map((txn) => ({\n id: txn.id,\n direction: txn.direction,\n counterparty: txn.counterparty,\n amount: txn.amount.toString(),\n amountUsd: formatUsd(txn.amount),\n network: txn.network,\n txHash: txn.txHash,\n resource: txn.resource,\n status: txn.status,\n createdAt: txn.createdAt,\n metadata: txn.metadata,\n }));\n\n res.status(200).json({ transactions: serialized, count: serialized.length });\n}\n\n/** GET /x402/export — Export all payments as CSV */\nasync function handleExport(\n _req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime,\n): Promise<void> {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n if (!service || !service.isActive()) {\n res.status(503).json({ error: \"x402 service not active\" });\n return;\n }\n\n const transactions = await service.getRecentTransactions(10000);\n\n const csvHeader =\n \"id,direction,counterparty,amount_base_units,amount_usd,network,tx_hash,resource,status,created_at\";\n const csvRows = transactions.map(\n (txn) =>\n `${txn.id},${txn.direction},${txn.counterparty},${txn.amount.toString()},${formatUsd(txn.amount)},${txn.network},${txn.txHash},${escapeCSV(txn.resource)},${txn.status},${txn.createdAt}`,\n );\n\n const csv = [csvHeader, ...csvRows].join(\"\\n\");\n\n if (res.setHeader) {\n res.setHeader(\"Content-Type\", \"text/csv\");\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"x402-payments-${new Date().toISOString().slice(0, 10)}.csv\"`,\n );\n }\n res.send(csv);\n}\n\n/** Escape a value for CSV (wrap in quotes if it contains commas or quotes) */\nfunction escapeCSV(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport const x402Plugin: Plugin = {\n name: \"x402\",\n description:\n \"x402 HTTP payment protocol - send and receive crypto payments (USDC on EVM chains)\",\n\n config: {\n X402_PRIVATE_KEY: null,\n X402_NETWORK: null,\n X402_PAY_TO: null,\n X402_FACILITATOR_URL: null,\n X402_MAX_PAYMENT_USD: null,\n X402_MAX_TOTAL_USD: null,\n X402_ENABLED: null,\n },\n\n services: [X402Service],\n actions: [payForServiceAction, checkPaymentHistoryAction, setPaymentPolicyAction],\n providers: [paymentBalanceProvider],\n\n routes: [\n agentCardRoute,\n {\n type: \"GET\" as const,\n path: \"/x402/summary\",\n name: \"x402-summary\",\n public: false,\n handler: handleSummary,\n },\n {\n type: \"GET\" as const,\n path: \"/x402/history\",\n name: \"x402-history\",\n public: false,\n handler: handleHistory,\n },\n {\n type: \"GET\" as const,\n path: \"/x402/export\",\n name: \"x402-export\",\n public: false,\n handler: handleExport,\n },\n ],\n};\n\nexport default x402Plugin;\n"
5
+ "/**\n * Configuration for x402 micropayment system\n * Route-specific pricing is now defined locally in each route definition\n *\n * Payment Verification Methods:\n *\n * 1. Direct Blockchain Proof (X-Payment-Proof header)\n * - User sends payment transaction on-chain\n * - Transaction signature is verified against blockchain\n * - Supports: Solana, Base, Polygon\n * - Format: base64-encoded JSON with signature and authorization\n *\n * 2. Facilitator Payment ID (X-Payment-Id header)\n * - Third-party service handles payment\n * - Service returns payment ID after successful payment\n * - ID is verified through facilitator API\n * - Configured via X402_FACILITATOR_URL environment variable\n * - Example: X402_FACILITATOR_URL=https://facilitator.x402.ai\n *\n * 3. Standard X-Payment / PAYMENT-SIGNATURE (x402-fetch / CDP-style)\n * - Base64(JSON) or raw JSON: `{ x402Version, accepted, payload }`\n * - Verified and settled with POST `{ paymentPayload, paymentRequirements }`\n * to facilitator `/verify` then `/settle`\n * - Override endpoints with `X402_FACILITATOR_VERIFY_URL` and\n * `X402_FACILITATOR_SETTLE_URL`; otherwise append `/verify` and `/settle`\n * to `X402_FACILITATOR_URL`.\n *\n * The facilitator endpoint should implement:\n * GET /verify/{paymentId}\n * - 200 OK: Payment is valid (with optional { valid: true } JSON body)\n * - 404 Not Found: Payment ID doesn't exist\n * - 410 Gone: Payment already used (prevents replay attacks)\n *\n * Seller-side replay: proof / payment ID keys are atomically reserved in the\n * SQL-backed runtime cache by default (`X402_REPLAY_DURABLE`, see x402 docs),\n * then marked consumed after successful verification. Disable with\n * `X402_REPLAY_DURABLE=0` for in-memory TTL-only behavior (dev / tests).\n */\n\nimport { logger } from \"@elizaos/core\";\nimport type { X402ScanNetwork } from \"./x402-types.js\";\n\n/** Networks supported by built-in x402 presets and verification */\nexport type Network = \"BASE\" | \"SOLANA\" | \"POLYGON\" | \"BSC\";\n\n/**\n * Built-in networks supported by default\n */\nexport const BUILT_IN_NETWORKS = [\"BASE\", \"SOLANA\", \"POLYGON\", \"BSC\"] as const;\n\n// Default network configuration\nexport const DEFAULT_NETWORK: Network = \"SOLANA\";\n\n/**\n * Convert our Network type to x402scan-compliant network names\n * @throws {Error} If network is not supported by x402scan\n */\nexport function toX402Network(network: Network): X402ScanNetwork {\n const networkMap: Partial<Record<Network, X402ScanNetwork>> = {\n BASE: \"base\",\n SOLANA: \"solana\",\n POLYGON: \"polygon\",\n BSC: \"bsc\",\n };\n\n const mappedNetwork = networkMap[network];\n if (!mappedNetwork) {\n throw new Error(\n `Network '${network}' is not supported by x402scan. ` +\n `Supported networks: ${BUILT_IN_NETWORKS.join(\", \")}`,\n );\n }\n\n return mappedNetwork;\n}\n\n/** Shipped fallbacks — not your treasury; startup validation warns / errors in production. */\nexport const BUNDLED_EXAMPLE_EVM_PAYOUT =\n \"0x066E94e1200aa765d0A6392777D543Aa6Dea606C\";\nexport const BUNDLED_EXAMPLE_SOLANA_PAYOUT =\n \"3nMBmufBUBVnk28sTp3NsrSJsdVGTyLZYmsqpMFaUT9J\";\n\nexport function paymentAddressIsBundledExample(\n network: Network,\n paymentAddress: string,\n): boolean {\n const a = paymentAddress.trim();\n if (!a) return false;\n if (network === \"SOLANA\") return a === BUNDLED_EXAMPLE_SOLANA_PAYOUT;\n if (network === \"BASE\" || network === \"POLYGON\" || network === \"BSC\") {\n return a.toLowerCase() === BUNDLED_EXAMPLE_EVM_PAYOUT.toLowerCase();\n }\n return false;\n}\n\n/**\n * Network-specific wallet addresses\n * Uses existing environment variables from your project configuration\n */\nexport const PAYMENT_ADDRESSES: Partial<Record<Network, string>> = {\n BASE:\n process.env.BASE_PUBLIC_KEY ||\n process.env.PAYMENT_WALLET_BASE ||\n BUNDLED_EXAMPLE_EVM_PAYOUT,\n SOLANA:\n process.env.SOLANA_PUBLIC_KEY ||\n process.env.PAYMENT_WALLET_SOLANA ||\n BUNDLED_EXAMPLE_SOLANA_PAYOUT,\n POLYGON:\n process.env.POLYGON_PUBLIC_KEY || process.env.PAYMENT_WALLET_POLYGON || \"\",\n BSC:\n process.env.BSC_PUBLIC_KEY ||\n process.env.PAYMENT_WALLET_BSC ||\n BUNDLED_EXAMPLE_EVM_PAYOUT,\n};\n\n/**\n * Get the base URL for the current server\n * Used to construct full resource URLs for x402 responses\n */\nexport function getBaseUrl(): string {\n // Check for explicit base URL setting\n if (process.env.X402_BASE_URL) {\n return process.env.X402_BASE_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n }\n\n return \"https://x402.elizacloud.ai\";\n}\n\n/**\n * Convert a route path to a full resource URL\n */\nexport function toResourceUrl(path: string): string {\n const baseUrl = getBaseUrl();\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${baseUrl}${cleanPath}`;\n}\n\n/**\n * Token configuration for Solana\n */\nexport const SOLANA_TOKENS = {\n USDC: {\n symbol: \"USDC\",\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n decimals: 6,\n },\n AI16Z: {\n symbol: \"ai16z\",\n address: \"HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC\",\n decimals: 6,\n },\n DEGENAI: {\n symbol: \"degenai\",\n address: \"Gu3LDkn7Vx3bmCzLafYNKcDxv2mH7YN44NJZFXnypump\",\n decimals: 6,\n },\n ELIZAOS: {\n symbol: \"elizaOS\",\n address: \"DuMbhu7mvQvqQHGcnikDgb4XegXJRyhUBfdU22uELiZA\",\n decimals: 6,\n },\n} as const;\n\n/**\n * Token configuration for Base (EVM)\n */\nexport const BASE_TOKENS = {\n USDC: {\n symbol: \"USDC\",\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n decimals: 6,\n },\n ELIZAOS: {\n symbol: \"elizaOS\",\n address: \"0xea17Df5Cf6D172224892B5477A16ACb111182478\",\n decimals: 18,\n },\n} as const;\n\n/**\n * Token configuration for Polygon (EVM)\n */\nexport const POLYGON_TOKENS = {\n USDC: {\n symbol: \"USDC\",\n address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n decimals: 6,\n },\n} as const;\n\n/**\n * Token configuration for BNB Smart Chain (EVM)\n */\nexport const BSC_TOKENS = {\n USDC: {\n symbol: \"USDC\",\n address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\",\n decimals: 18,\n },\n} as const;\n\n/**\n * Default asset for each network (used in x402 responses)\n */\nexport const NETWORK_ASSETS: Partial<Record<Network, string>> = {\n BASE: \"USDC\", // USDC on Base\n SOLANA: \"USDC\", // USDC on Solana (default, but also supports ai16z and degenai)\n POLYGON: \"USDC\", // USDC on Polygon\n BSC: \"USDC\", // Binance-Peg USDC on BNB Smart Chain\n};\n\n/**\n * Get all accepted assets for a network\n * @throws {Error} If network is not supported\n */\nexport function getNetworkAssets(network: Network): string[] {\n if (network === \"SOLANA\") {\n return Object.values(SOLANA_TOKENS).map((t) => t.symbol);\n }\n if (network === \"BASE\") {\n return Object.values(BASE_TOKENS).map((t) => t.symbol);\n }\n if (network === \"POLYGON\") {\n return Object.values(POLYGON_TOKENS).map((t) => t.symbol);\n }\n if (network === \"BSC\") {\n return Object.values(BSC_TOKENS).map((t) => t.symbol);\n }\n\n const defaultAsset = NETWORK_ASSETS[network];\n if (!defaultAsset) {\n throw new Error(\n `Network '${network}' is not configured. ` +\n `Supported networks: ${BUILT_IN_NETWORKS.join(\", \")}`,\n );\n }\n\n return [defaultAsset];\n}\n\n// Default/legacy wallet address (uses default network)\nexport const PAYMENT_RECEIVER_ADDRESS =\n PAYMENT_ADDRESSES[DEFAULT_NETWORK] || \"\";\n\n/**\n * Named payment config definition - stores individual fields, CAIP-19 constructed on-demand\n */\nexport interface PaymentConfigDefinition {\n network: Network;\n assetNamespace: string; // e.g., \"erc20\", \"spl-token\", \"slip44\"\n assetReference: string; // e.g., contract address or token mint\n paymentAddress: string; // Recipient address\n symbol: string; // Display symbol (USDC, ETH, etc.)\n chainId?: string; // Optional chain ID for CAIP-2 (e.g., \"8453\" for Base)\n}\n\n/**\n * Payment configuration registry - named configs for easy reference\n */\nexport const PAYMENT_CONFIGS: Record<string, PaymentConfigDefinition> = {\n base_usdc: {\n network: \"BASE\",\n assetNamespace: \"erc20\",\n assetReference: BASE_TOKENS.USDC.address,\n paymentAddress: PAYMENT_ADDRESSES.BASE ?? BUNDLED_EXAMPLE_EVM_PAYOUT,\n symbol: \"USDC\",\n chainId: \"8453\",\n },\n solana_usdc: {\n network: \"SOLANA\",\n assetNamespace: \"spl-token\",\n assetReference: SOLANA_TOKENS.USDC.address,\n paymentAddress: PAYMENT_ADDRESSES.SOLANA ?? BUNDLED_EXAMPLE_SOLANA_PAYOUT,\n symbol: \"USDC\",\n },\n polygon_usdc: {\n network: \"POLYGON\",\n assetNamespace: \"erc20\",\n assetReference: POLYGON_TOKENS.USDC.address,\n paymentAddress: PAYMENT_ADDRESSES.POLYGON || \"\",\n symbol: \"USDC\",\n chainId: \"137\",\n },\n bsc_usdc: {\n network: \"BSC\",\n assetNamespace: \"erc20\",\n assetReference: BSC_TOKENS.USDC.address,\n paymentAddress: PAYMENT_ADDRESSES.BSC ?? BUNDLED_EXAMPLE_EVM_PAYOUT,\n symbol: \"USDC\",\n chainId: \"56\",\n },\n base_elizaos: {\n network: \"BASE\",\n assetNamespace: \"erc20\",\n assetReference: BASE_TOKENS.ELIZAOS.address,\n paymentAddress: PAYMENT_ADDRESSES.BASE ?? BUNDLED_EXAMPLE_EVM_PAYOUT,\n symbol: \"elizaOS\",\n chainId: \"8453\",\n },\n solana_elizaos: {\n network: \"SOLANA\",\n assetNamespace: \"spl-token\",\n assetReference: SOLANA_TOKENS.ELIZAOS.address,\n paymentAddress: PAYMENT_ADDRESSES.SOLANA ?? BUNDLED_EXAMPLE_SOLANA_PAYOUT,\n symbol: \"elizaOS\",\n },\n solana_degenai: {\n network: \"SOLANA\",\n assetNamespace: \"spl-token\",\n assetReference: SOLANA_TOKENS.DEGENAI.address,\n paymentAddress: PAYMENT_ADDRESSES.SOLANA ?? BUNDLED_EXAMPLE_SOLANA_PAYOUT,\n symbol: \"degenai\",\n },\n};\n\n/**\n * Construct CAIP-19 asset ID from payment config fields\n */\nexport function getCAIP19FromConfig(config: PaymentConfigDefinition): string {\n // Build CAIP-2 chain ID: namespace:reference\n const chainNamespace = config.network === \"SOLANA\" ? \"solana\" : \"eip155\";\n const chainReference =\n config.chainId ||\n (config.network === \"BASE\"\n ? \"8453\"\n : config.network === \"POLYGON\"\n ? \"137\"\n : config.network === \"BSC\"\n ? \"56\"\n : \"1\");\n const chainId = `${chainNamespace}:${chainReference}`;\n\n // Build asset part: namespace:reference\n const assetId = `${config.assetNamespace}:${config.assetReference}`;\n\n // Full CAIP-19: chain_id/asset_namespace:asset_reference\n return `${chainId}/${assetId}`;\n}\n\n/**\n * Mutable registry for custom payment configs\n * Plugins can register configs via registerX402Config()\n */\nconst CUSTOM_PAYMENT_CONFIGS: Record<string, PaymentConfigDefinition> = {};\n\n/**\n * Register a custom payment configuration\n * Plugins call this in their init() function\n *\n * A second call with the same `name` (or the same `agentId`+`name` for scoped\n * keys) throws unless `override: true` is set, so two plugins cannot silently\n * replace each other in `CUSTOM_PAYMENT_CONFIGS`.\n *\n * @example\n * ```typescript\n * registerX402Config('base_ai16z', {\n * network: 'BASE',\n * assetNamespace: 'erc20',\n * assetReference: '0x...',\n * paymentAddress: process.env.BASE_PUBLIC_KEY,\n * symbol: 'AI16Z',\n * chainId: '8453'\n * });\n *\n * // Agent-specific override\n * registerX402Config('base_usdc', {...}, { agentId: runtime.agentId });\n * ```\n */\nexport function registerX402Config(\n name: string,\n config: PaymentConfigDefinition,\n options?: { override?: boolean; agentId?: string },\n): void {\n // Prevent accidental override of built-in configs\n if (PAYMENT_CONFIGS[name] && !options?.override) {\n throw new Error(\n `Payment config '${name}' already exists. Use override: true to replace it.`,\n );\n }\n\n const registryKey = options?.agentId ? `${options.agentId}:${name}` : name;\n if (CUSTOM_PAYMENT_CONFIGS[registryKey] && !options?.override) {\n throw new Error(\n `Payment config '${registryKey}' is already registered. Use override: true to replace it.`,\n );\n }\n\n CUSTOM_PAYMENT_CONFIGS[registryKey] = config;\n\n logger.debug(\n { registryKey, symbol: config.symbol, network: config.network },\n \"[x402] registered payment config\",\n );\n}\n\n/**\n * Get payment config - checks custom registry then built-in\n * Supports agent-specific configs via agentId parameter\n */\nexport function getPaymentConfig(\n name: string,\n agentId?: string,\n): PaymentConfigDefinition {\n // Check agent-specific config first\n if (agentId) {\n const agentConfig = CUSTOM_PAYMENT_CONFIGS[`${agentId}:${name}`];\n if (agentConfig) return agentConfig;\n }\n\n // Check custom global configs\n const customConfig = CUSTOM_PAYMENT_CONFIGS[name];\n if (customConfig) return customConfig;\n\n // Check built-in configs\n const builtInConfig = PAYMENT_CONFIGS[name];\n if (!builtInConfig) {\n const available = [\n ...Object.keys(PAYMENT_CONFIGS),\n ...Object.keys(CUSTOM_PAYMENT_CONFIGS).filter((k) => !k.includes(\":\")),\n ];\n throw new Error(\n `Unknown payment config '${name}'. Available: ${available.join(\", \")}`,\n );\n }\n return builtInConfig;\n}\n\n/**\n * List all available payment configs (built-in + custom)\n * Optionally filter to agent-specific configs\n */\nexport function listX402Configs(agentId?: string): string[] {\n const configs = new Set([\n ...Object.keys(PAYMENT_CONFIGS),\n ...Object.keys(CUSTOM_PAYMENT_CONFIGS).filter((k) => !k.includes(\":\")),\n ]);\n\n if (agentId) {\n for (const k of Object.keys(CUSTOM_PAYMENT_CONFIGS)) {\n if (k.startsWith(`${agentId}:`)) {\n const short = k.split(\":\")[1];\n if (short) configs.add(short);\n }\n }\n }\n\n return Array.from(configs).sort();\n}\n\n/**\n * Validate payment config name\n */\nexport function validatePaymentConfigName(name: string): boolean {\n return name in PAYMENT_CONFIGS;\n}\n\n// Re-export X402Config from core for convenience\nexport type { X402Config } from \"@elizaos/core\";\n\n/**\n * Get the payment address for a specific network\n * @throws {Error} If network is not configured\n */\nexport function getPaymentAddress(network: Network): string {\n const address = PAYMENT_ADDRESSES[network];\n if (!address) {\n throw new Error(\n `No payment address configured for network '${network}'. ` +\n `Supported networks: ${BUILT_IN_NETWORKS.join(\", \")}. ` +\n `Set ${network}_PUBLIC_KEY in your environment.`,\n );\n }\n return address;\n}\n\n/**\n * Get all network addresses with metadata\n * Only returns networks that have configured addresses\n */\nexport function getNetworkAddresses(networks: Network[]): Array<{\n name: Network;\n address: string;\n facilitatorEndpoint?: string;\n}> {\n return networks\n .filter(\n (network) =>\n PAYMENT_ADDRESSES[network] !== undefined &&\n PAYMENT_ADDRESSES[network] !== \"\",\n )\n .map((network) => ({\n name: network,\n address: PAYMENT_ADDRESSES[network] as string,\n // Add facilitator endpoint for EVM chains if configured\n ...((network === \"BASE\" || network === \"POLYGON\" || network === \"BSC\") &&\n process.env.EVM_FACILITATOR && {\n facilitatorEndpoint: process.env.EVM_FACILITATOR,\n }),\n }));\n}\n\n/**\n * Approximate USD/token map (float) for dashboards or legacy callers.\n * **Atomic amounts** use exact rational math from the same env defaults — see\n * `atomicAmountForPriceInCents` / `getTokenUsdPerTokenRational` in this file.\n */\nexport const TOKEN_PRICES_USD: Record<string, number> = {\n USDC: 1.0,\n ai16z: Number.parseFloat(process.env.AI16Z_PRICE_USD || \"0.5\"),\n degenai: Number.parseFloat(process.env.DEGENAI_PRICE_USD || \"0.01\"),\n elizaOS: Number.parseFloat(process.env.ELIZAOS_PRICE_USD || \"0.05\"),\n ETH: 2000.0, // Simplified; override via env/oracle in future\n};\n\n/**\n * Get token decimals for an asset\n */\n/**\n * Parse a positive USD decimal string (e.g. \"1.25\", optional leading \"$\")\n * into an exact positive rational num/den in dollars (not cents).\n */\nfunction usdDecimalStringToRational(raw: string): { num: bigint; den: bigint } {\n const s = raw.replace(/^\\$/, \"\").trim();\n if (!/^\\d+(\\.\\d+)?$/.test(s)) {\n throw new Error(`Invalid USD decimal: ${raw}`);\n }\n const [wi, fr = \"\"] = s.split(\".\");\n const den = 10n ** BigInt(fr.length);\n const whole = BigInt(wi || \"0\");\n const frac = fr ? BigInt(fr) : 0n;\n const num = whole * den + frac;\n if (num <= 0n) {\n throw new Error(`USD amount must be positive: ${raw}`);\n }\n return { num, den };\n}\n\nfunction envUsdPerTokenRational(\n envKey: string,\n fallback: string,\n): { num: bigint; den: bigint } {\n const v = process.env[envKey]?.trim();\n return usdDecimalStringToRational(v && v.length > 0 ? v : fallback);\n}\n\n/** USD (not cents) per 1 full token, as exact rational num/den */\nfunction getTokenUsdPerTokenRational(\n asset: string,\n _network?: Network,\n): { num: bigint; den: bigint } {\n const upper = asset.toUpperCase();\n if (upper === \"USDC\") return { num: 1n, den: 1n };\n if (asset === \"elizaOS\" || upper === \"ELIZAOS\") {\n return envUsdPerTokenRational(\"ELIZAOS_PRICE_USD\", \"0.05\");\n }\n if (upper === \"DEGENAI\" || asset === \"degenai\") {\n return envUsdPerTokenRational(\"DEGENAI_PRICE_USD\", \"0.01\");\n }\n if (upper === \"AI16Z\" || asset === \"ai16z\") {\n return envUsdPerTokenRational(\"AI16Z_PRICE_USD\", \"0.5\");\n }\n if (upper === \"ETH\") return { num: 2000n, den: 1n };\n return { num: 1n, den: 1n };\n}\n\nfunction getTokenDecimals(asset: string, network?: Network): number {\n // Check network-specific tokens if network is provided\n if (network === \"SOLANA\") {\n const solanaToken = Object.values(SOLANA_TOKENS).find(\n (t) => t.symbol === asset,\n );\n if (solanaToken) return solanaToken.decimals;\n }\n if (network === \"BASE\") {\n const baseToken = Object.values(BASE_TOKENS).find(\n (t) => t.symbol === asset,\n );\n if (baseToken) return baseToken.decimals;\n }\n if (network === \"POLYGON\") {\n const polygonToken = Object.values(POLYGON_TOKENS).find(\n (t) => t.symbol === asset,\n );\n if (polygonToken) return polygonToken.decimals;\n }\n if (network === \"BSC\") {\n const bscToken = Object.values(BSC_TOKENS).find((t) => t.symbol === asset);\n if (bscToken) return bscToken.decimals;\n }\n\n // Check all token configs if no network specified\n const solanaToken = Object.values(SOLANA_TOKENS).find(\n (t) => t.symbol === asset,\n );\n if (solanaToken) return solanaToken.decimals;\n\n const baseToken = Object.values(BASE_TOKENS).find((t) => t.symbol === asset);\n if (baseToken) return baseToken.decimals;\n\n const polygonToken = Object.values(POLYGON_TOKENS).find(\n (t) => t.symbol === asset,\n );\n if (polygonToken) return polygonToken.decimals;\n\n const bscToken = Object.values(BSC_TOKENS).find((t) => t.symbol === asset);\n if (bscToken) return bscToken.decimals;\n\n // Defaults\n if (asset === \"USDC\") return 6;\n if (asset === \"ETH\") return 18;\n\n return 6; // Default to 6 decimals\n}\n\n/**\n * Smallest-unit token amount for x402 `maxAmountRequired` and verification,\n * from integer USD cents and a concrete payment config (symbol + network).\n */\nexport function atomicAmountForPriceInCents(\n priceInCents: number,\n config: PaymentConfigDefinition,\n): string {\n if (!Number.isFinite(priceInCents) || priceInCents <= 0) {\n throw new Error(\"priceInCents must be a positive finite number\");\n }\n const cents = BigInt(Math.floor(priceInCents));\n const { num: p, den: q } = getTokenUsdPerTokenRational(\n config.symbol,\n config.network,\n );\n const dec = getTokenDecimals(config.symbol, config.network);\n if (dec < 0 || dec > 120) {\n throw new Error(\"invalid token decimals for payment config\");\n }\n const scale = 10n ** BigInt(dec);\n const numer = cents * q * scale;\n const denom = 100n * p;\n if (denom === 0n) {\n throw new Error(\"invalid token USD price (zero denominator)\");\n }\n return ((numer + denom - 1n) / denom).toString();\n}\n\n/**\n * Parse price string (e.g., \"$0.10\") as a USD **dollar** amount and convert to\n * the asset’s smallest units (ceil), using the same rational pricing as\n * `atomicAmountForPriceInCents` / env overrides (`ELIZAOS_PRICE_USD`, etc.).\n */\nexport function parsePrice(\n price: string,\n asset: string = \"USDC\",\n network?: Network,\n): string {\n const { num: un, den: ud } = usdDecimalStringToRational(price);\n const { num: p, den: q } = getTokenUsdPerTokenRational(asset, network);\n const dec = getTokenDecimals(asset, network);\n if (dec < 0 || dec > 120) {\n throw new Error(\"invalid token decimals\");\n }\n const scale = 10n ** BigInt(dec);\n const numer = un * q * scale;\n const denom = ud * p;\n if (denom === 0n) {\n throw new Error(\"invalid token USD price (zero denominator)\");\n }\n return ((numer + denom - 1n) / denom).toString();\n}\n\n/**\n * Get token address for any network and asset\n */\nexport function getTokenAddress(\n asset: string,\n network: Network,\n): string | undefined {\n if (network === \"SOLANA\") {\n const token = Object.values(SOLANA_TOKENS).find((t) => t.symbol === asset);\n return token?.address;\n }\n if (network === \"BASE\") {\n const token = Object.values(BASE_TOKENS).find((t) => t.symbol === asset);\n return token?.address;\n }\n if (network === \"POLYGON\") {\n const token = Object.values(POLYGON_TOKENS).find((t) => t.symbol === asset);\n return token?.address;\n }\n if (network === \"BSC\") {\n const token = Object.values(BSC_TOKENS).find((t) => t.symbol === asset);\n return token?.address;\n }\n return undefined;\n}\n\n/**\n * Get the asset for a specific network\n * @throws {Error} If network is not configured\n */\nexport function getNetworkAsset(network: Network): string {\n const asset = NETWORK_ASSETS[network];\n if (!asset) {\n throw new Error(\n `No default asset configured for network '${network}'. ` +\n `Supported networks: ${BUILT_IN_NETWORKS.join(\", \")}`,\n );\n }\n return asset;\n}\n\n/**\n * Get x402 system health status\n * Useful for monitoring and debugging\n */\nexport function getX402Health(): {\n networks: Array<{\n network: Network;\n configured: boolean;\n address: string | null;\n }>;\n facilitator: { url: string | null; configured: boolean };\n} {\n const networks: Network[] = [\"BASE\", \"SOLANA\", \"POLYGON\", \"BSC\"];\n\n return {\n networks: networks.map((network) => ({\n network,\n configured:\n !!PAYMENT_ADDRESSES[network] && PAYMENT_ADDRESSES[network] !== \"\",\n address: PAYMENT_ADDRESSES[network] || null,\n })),\n facilitator: {\n url: process.env.X402_FACILITATOR_URL || null,\n configured: !!process.env.X402_FACILITATOR_URL,\n },\n };\n}\n",
6
+ "import type {\n Character,\n IAgentRuntime,\n PaymentEnabledRoute,\n Route,\n RouteRequest,\n RouteResponse,\n X402Config,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\n/** Route with resolved `x402` object (not `true`) */\ntype X402PaidRoute = PaymentEnabledRoute & { x402: X402Config };\n\nimport {\n type Address,\n type Hex,\n recoverTypedDataAddress,\n type TypedDataDomain,\n} from \"viem\";\nimport { base, bsc, mainnet, polygon } from \"viem/chains\";\nimport {\n atomicAmountForPriceInCents,\n getCAIP19FromConfig,\n getPaymentConfig,\n type Network,\n toResourceUrl,\n toX402Network,\n} from \"./payment-config.js\";\nimport { validateX402Startup } from \"./startup-validator.js\";\nimport type {\n EIP712Authorization,\n EIP712Domain,\n EIP712PaymentProof,\n X402Response as ExpressResponse,\n FacilitatorVerificationResponse,\n FacilitatorVerifyContext,\n PaymentVerificationParams,\n PaymentVerifiedDetails,\n VerifyPaymentResult,\n X402Request,\n X402Runtime,\n} from \"./types.js\";\nimport {\n facilitatorVerifyResponseMatchesRoute,\n isFacilitatorBindingRelaxed,\n} from \"./x402-facilitator-binding.js\";\nimport {\n replayGuardAbortAsync,\n replayGuardCommit,\n replayGuardTryBegin,\n} from \"./x402-replay-guard.js\";\nimport {\n collectReplayKeysToCheck,\n decodePaymentProofForParsing,\n} from \"./x402-replay-keys.js\";\nimport {\n resolveEffectiveX402,\n X402_EVENT_PAYMENT_REQUIRED,\n X402_EVENT_PAYMENT_VERIFIED,\n} from \"./x402-resolve.js\";\nimport {\n buildFacilitatorPaymentRequirements,\n buildStandardPaymentRequired,\n decodeXPaymentHeader,\n findMatchingPaymentConfigForStandardPayload,\n isX402StandardPaymentPayload,\n settlePaymentPayloadViaFacilitatorPost,\n verifyPaymentPayloadViaFacilitatorPost,\n} from \"./x402-standard-payment.js\";\nimport {\n createAccepts,\n createX402Response,\n type OutputSchema,\n type PaymentExtraMetadata,\n type X402Response,\n} from \"./x402-types.js\";\n\n/**\n * x402 **seller** middleware for plugin HTTP routes.\n *\n * **Why one middleware layer:** plugins should not each reimplement 402 bodies,\n * header encodings, facilitator POSTs, replay semantics, or chain RPC checks.\n * This module is the single integration point for “paid route” behavior.\n *\n * **Why multiple verification strategies coexist:** deployments differ—some\n * have on-chain receipts only, some use facilitator payment IDs, some use modern\n * `PAYMENT-SIGNATURE` payloads. Keeping strategies behind one `verifyPayment`\n * function preserves one gate while letting operators choose what their clients send.\n *\n * **Why standard path calls settle:** see `x402-standard-payment.ts`—settlement is\n * the economically meaningful step after verify for facilitator-backed flows.\n *\n * **Why we still emit legacy JSON 402:** backward compatibility for wallets and\n * tools that parse the body; V2 clients additionally read `PAYMENT-REQUIRED`.\n */\n\n/**\n * Set on routes returned by {@link applyPaymentProtection} so HTTP dispatch\n * (`tryHandleRuntimePluginRoute`) does not call {@link createPaymentAwareHandler} again.\n */\nexport const X402_ROUTE_PAYMENT_WRAPPED = Symbol.for(\n \"elizaos.x402.routePaymentWrapped\",\n);\n\nexport function isRoutePaymentWrapped(route: unknown): boolean {\n return (\n typeof route === \"object\" &&\n route !== null &&\n Reflect.get(route, X402_ROUTE_PAYMENT_WRAPPED) === true\n );\n}\n\n/**\n * Debug logging helper - only logs if DEBUG_X402_PAYMENTS is enabled\n */\nconst DEBUG = process.env.DEBUG_X402_PAYMENTS === \"true\";\nfunction formatLogArg(arg: unknown): string {\n if (typeof arg === \"string\") return arg;\n if (typeof arg === \"bigint\") return arg.toString();\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n}\nfunction log(...args: unknown[]) {\n if (DEBUG) logger.debug(args.map(formatLogArg).join(\" \"));\n}\nfunction logSection(title: string) {\n if (DEBUG) {\n logger.debug(`[x402] ${title}`);\n }\n}\nfunction logError(...args: unknown[]) {\n logger.error(args.map(formatLogArg).join(\" \"));\n}\n\n/**\n * EIP-712 TransferWithAuthorization type\n */\nconst TRANSFER_WITH_AUTHORIZATION_TYPES = [\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] as const;\n\n/**\n * EIP-712 ReceiveWithAuthorization type\n */\nconst RECEIVE_WITH_AUTHORIZATION_TYPES = [\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] as const;\n\n/**\n * Get the viem chain object for a network\n */\nfunction getViemChain(network: string) {\n switch (network.toUpperCase()) {\n case \"BASE\":\n return base;\n case \"POLYGON\":\n return polygon;\n case \"BSC\":\n return bsc;\n case \"ETHEREUM\":\n return mainnet;\n default:\n return base;\n }\n}\n\n/**\n * Get RPC URL for a network\n */\nfunction getRpcUrl(network: string, runtime: X402Runtime): string {\n const networkUpper = network.toUpperCase();\n const settingKey = `${networkUpper}_RPC_URL`;\n const customRpc = runtime.getSetting(settingKey);\n if (customRpc && typeof customRpc === \"string\") {\n return customRpc;\n }\n\n switch (networkUpper) {\n case \"BASE\":\n return \"https://mainnet.base.org\";\n case \"POLYGON\":\n return \"https://polygon-rpc.com\";\n case \"BSC\":\n return \"https://bsc-dataseed.binance.org\";\n case \"ETHEREUM\":\n return \"https://eth.llamarpc.com\";\n default:\n return \"https://mainnet.base.org\";\n }\n}\n\n/**\n * Get USDC contract address for a network\n */\nfunction getUsdcContractAddress(network: string): Address {\n switch (network.toUpperCase()) {\n case \"BASE\":\n return \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\";\n case \"POLYGON\":\n return \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\";\n case \"BSC\":\n return \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\";\n case \"ETHEREUM\":\n return \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\";\n default:\n return \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\";\n }\n}\n\nfunction chainIdToNetwork(chainId: number): Network | null {\n if (chainId === 8453) return \"BASE\";\n if (chainId === 137) return \"POLYGON\";\n if (chainId === 56) return \"BSC\";\n return null;\n}\n\nfunction sumOwnerMint(\n balances:\n | Array<{ mint: string; owner?: string; uiTokenAmount: { amount: string } }>\n | null\n | undefined,\n owner: string,\n mint: string,\n): bigint {\n if (!balances?.length) return 0n;\n let s = 0n;\n for (const b of balances) {\n if (b.mint === mint && b.owner === owner) {\n s += BigInt(b.uiTokenAmount?.amount ?? \"0\");\n }\n }\n return s;\n}\n\n/**\n * Verify payment proof from x402 payment provider\n */\nasync function verifyPayment(\n params: PaymentVerificationParams,\n): Promise<VerifyPaymentResult> {\n const {\n paymentProof,\n paymentId,\n route,\n priceInCents,\n paymentConfigNames,\n agentId,\n runtime,\n req,\n } = params;\n\n logSection(\"PAYMENT VERIFICATION\");\n log(\n \"Route:\",\n route,\n \"priceInCents:\",\n priceInCents,\n \"configs:\",\n paymentConfigNames,\n );\n\n if (!paymentProof && !paymentId) {\n logError(\"✗ No payment credentials provided\");\n return { ok: false };\n }\n\n const replayKeys = collectReplayKeysToCheck(paymentProof, paymentId);\n if (!(await replayGuardTryBegin(replayKeys, runtime, agentId))) {\n logError(\n \"✗ Payment credential in use or already consumed (replay protection)\",\n );\n return { ok: false };\n }\n\n let committed = false;\n const finishVerified = async (\n details: PaymentVerifiedDetails,\n ): Promise<VerifyPaymentResult> => {\n committed = true;\n await replayGuardCommit(replayKeys, runtime, agentId);\n return { ok: true, details };\n };\n\n try {\n const configsOrdered = paymentConfigNames.map((n) => ({\n name: n,\n cfg: getPaymentConfig(n, agentId),\n }));\n\n if (paymentProof) {\n try {\n // Standard payloads (PAYMENT-SIGNATURE / X-Payment) are tried first so we\n // do not mis-classify them as legacy JSON proofs or raw tx hashes. Why:\n // the same header value can look like opaque base64; decode + shape\n // detection routes buyers to facilitator verify+settle instead of unsafe\n // local EIP-712 paths.\n const standardDecoded = decodeXPaymentHeader(\n typeof paymentProof === \"string\" ? paymentProof : \"\",\n );\n if (isX402StandardPaymentPayload(standardDecoded)) {\n const match = findMatchingPaymentConfigForStandardPayload(\n standardDecoded,\n paymentConfigNames,\n priceInCents,\n agentId,\n );\n if (!match) {\n // Standard x402 payload had no matching config (wrong network /\n // asset / amount). Reject outright instead of re-evaluating the\n // same payload through legacy JSON / EIP-712 paths with looser\n // routing rules.\n log(\n \"Standard X-Payment payload did not match any allowed payment config\",\n );\n return { ok: false };\n }\n\n const paymentRequirements = buildFacilitatorPaymentRequirements({\n routePath: route,\n priceInCents,\n configName: match.name,\n agentId,\n });\n const postResult = await verifyPaymentPayloadViaFacilitatorPost(\n runtime,\n standardDecoded,\n paymentRequirements,\n );\n if (postResult.ok !== true) {\n log(\n \"Standard X-Payment facilitator verify failed:\",\n postResult.invalidReason,\n );\n // Do not fall through to legacy JSON / local EIP-712 paths with the\n // same header — the facilitator has already rejected this credential.\n return { ok: false };\n }\n const settleResult = await settlePaymentPayloadViaFacilitatorPost(\n runtime,\n standardDecoded,\n paymentRequirements,\n );\n if (settleResult.ok === false) {\n log(\n \"Standard X-Payment facilitator settle failed:\",\n settleResult.invalidReason,\n );\n return { ok: false };\n }\n log(\n \"✓ Standard X-Payment verified and settled via facilitator\",\n match.name,\n );\n return await finishVerified({\n paymentConfig: match.name,\n network: match.cfg.network,\n amountAtomic: paymentRequirements.amount,\n symbol: match.cfg.symbol,\n payer:\n settleResult.payer ??\n postResult.payer ??\n standardDecoded.payload.authorization.from,\n proofId: standardDecoded.payload.signature,\n paymentResponse: settleResult.paymentResponse,\n });\n }\n\n const decodedProof = decodePaymentProofForParsing(paymentProof);\n\n try {\n const jsonProof = JSON.parse(decodedProof) as {\n payload?: {\n signature?: string;\n authorization?: EIP712Authorization;\n domain?: EIP712Domain;\n };\n domain?: EIP712Domain;\n network?: string;\n scheme?: string;\n };\n log(\"Detected JSON payment proof\");\n\n const authData = jsonProof.payload\n ? {\n signature: jsonProof.payload.signature,\n authorization: jsonProof.payload.authorization,\n network: jsonProof.network,\n scheme: jsonProof.scheme,\n domain: jsonProof.payload.domain ?? jsonProof.domain,\n }\n : { ...jsonProof, domain: jsonProof.domain };\n\n const domain =\n (authData as { domain?: EIP712Domain }).domain ?? jsonProof.domain;\n const chainId = domain?.chainId;\n const inferredNet =\n typeof chainId === \"number\" ? chainIdToNetwork(chainId) : null;\n\n const authObj = authData as Record<string, unknown>;\n const hasEip712 =\n typeof authObj.signature === \"string\" &&\n authObj.authorization &&\n typeof authObj.authorization === \"object\";\n\n if (hasEip712) {\n const evmCandidates = configsOrdered.filter(\n (c) =>\n c.cfg.network === \"BASE\" ||\n c.cfg.network === \"POLYGON\" ||\n c.cfg.network === \"BSC\",\n );\n\n for (const { name, cfg } of evmCandidates) {\n if (inferredNet && cfg.network !== inferredNet) continue;\n if (\n domain?.verifyingContract &&\n domain.verifyingContract.toLowerCase() !==\n cfg.assetReference.toLowerCase()\n ) {\n continue;\n }\n\n const atomic = atomicAmountForPriceInCents(priceInCents, cfg);\n const recipient = cfg.paymentAddress;\n const ok = await verifyEvmPayment(\n JSON.stringify(authData),\n recipient,\n atomic,\n cfg.network,\n runtime,\n req,\n {\n eip712TokenContract: cfg.assetReference as Address,\n erc20Contract: cfg.assetReference as Address,\n },\n );\n if (ok) {\n const auth = authObj.authorization as EIP712Authorization;\n log(\n `✓ ${cfg.network} payment verified (EIP-712) config=${name}`,\n );\n return await finishVerified({\n paymentConfig: name,\n network: cfg.network,\n amountAtomic: atomic,\n symbol: cfg.symbol,\n payer: auth?.from,\n proofId:\n typeof authObj.signature === \"string\"\n ? authObj.signature\n : undefined,\n });\n }\n }\n }\n } catch {\n const parts = decodedProof.split(\":\");\n\n if (parts.length >= 3) {\n const [networkRaw, address, signature] = parts;\n const network = networkRaw.toUpperCase();\n log(`Legacy format: ${network}`);\n\n if (network === \"SOLANA\") {\n for (const { name, cfg } of configsOrdered) {\n if (cfg.network !== \"SOLANA\") continue;\n if (address.trim() !== cfg.paymentAddress.trim()) {\n logError(\n \"Solana legacy proof: recipient field must equal the route pay-to address (expected\",\n cfg.paymentAddress,\n \"got\",\n address,\n );\n continue;\n }\n const atomic = atomicAmountForPriceInCents(priceInCents, cfg);\n if (\n await verifySolanaPayment(\n signature,\n cfg.paymentAddress,\n cfg.assetReference,\n atomic,\n runtime,\n )\n ) {\n log(\"✓ Solana payment verified\");\n return await finishVerified({\n paymentConfig: name,\n network: \"SOLANA\",\n amountAtomic: atomic,\n symbol: cfg.symbol,\n proofId: signature,\n });\n }\n }\n } else if (\n network === \"BASE\" ||\n network === \"POLYGON\" ||\n network === \"BSC\"\n ) {\n for (const { name, cfg } of configsOrdered) {\n if (cfg.network !== network) continue;\n if (cfg.assetNamespace !== \"erc20\") continue;\n const atomic = atomicAmountForPriceInCents(priceInCents, cfg);\n if (\n await verifyEvmPayment(\n signature,\n cfg.paymentAddress,\n atomic,\n network,\n runtime,\n req,\n {\n erc20Contract: cfg.assetReference as Address,\n eip712TokenContract: cfg.assetReference as Address,\n },\n )\n ) {\n log(`✓ ${network} payment verified`);\n return await finishVerified({\n paymentConfig: name,\n network: cfg.network,\n amountAtomic: atomic,\n symbol: cfg.symbol,\n proofId: signature,\n });\n }\n }\n }\n } else if (parts.length === 1 && parts[0].length > 50) {\n const sigOnly = parts[0];\n for (const { name, cfg } of configsOrdered) {\n if (cfg.network !== \"SOLANA\") continue;\n const atomic = atomicAmountForPriceInCents(priceInCents, cfg);\n if (\n await verifySolanaPayment(\n sigOnly,\n cfg.paymentAddress,\n cfg.assetReference,\n atomic,\n runtime,\n )\n ) {\n log(\"✓ Solana payment verified (raw signature)\");\n return await finishVerified({\n paymentConfig: name,\n network: \"SOLANA\",\n amountAtomic: atomic,\n symbol: cfg.symbol,\n proofId: sigOnly,\n });\n }\n }\n }\n }\n } catch (error) {\n logError(\n \"Blockchain verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n if (paymentId) {\n try {\n if (\n await verifyPaymentIdViaFacilitator(paymentId, runtime, {\n resource: toResourceUrl(route),\n routePath: route,\n priceInCents,\n paymentConfigNames,\n })\n ) {\n log(\"✓ Facilitator payment verified\");\n return await finishVerified({\n paymentConfig: \"facilitator\",\n network: \"facilitator\",\n amountAtomic: \"\",\n proofId: paymentId,\n });\n }\n } catch (error) {\n logError(\n \"Facilitator verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n\n logError(\"✗ All payment verification strategies failed\");\n return { ok: false };\n } finally {\n if (!committed) await replayGuardAbortAsync(replayKeys, runtime, agentId);\n }\n}\n\n/**\n * Sanitize and validate payment ID format\n */\nfunction sanitizePaymentId(paymentId: string): string {\n // Remove any whitespace\n const cleaned = paymentId.trim();\n\n // Validate format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(cleaned)) {\n throw new Error(\"Invalid payment ID format\");\n }\n\n // Limit length to prevent abuse\n if (cleaned.length > 128) {\n throw new Error(\"Payment ID too long\");\n }\n\n return cleaned;\n}\n\n/**\n * Verify payment ID via facilitator API\n */\nasync function verifyPaymentIdViaFacilitator(\n paymentId: string,\n runtime: X402Runtime,\n ctx?: FacilitatorVerifyContext,\n): Promise<boolean> {\n logSection(\"FACILITATOR VERIFICATION\");\n\n // Sanitize payment ID\n let cleanPaymentId: string;\n try {\n cleanPaymentId = sanitizePaymentId(paymentId);\n log(\"Payment ID:\", cleanPaymentId);\n } catch (error) {\n logError(\n \"Invalid payment ID:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n\n const facilitatorUrlSetting = runtime.getSetting(\"X402_FACILITATOR_URL\");\n const facilitatorUrl =\n typeof facilitatorUrlSetting === \"string\"\n ? facilitatorUrlSetting\n : \"https://x402.elizacloud.ai/api/facilitator\";\n\n if (!facilitatorUrl) {\n logError(\"⚠️ No facilitator URL configured\");\n return false;\n }\n\n try {\n const cleanUrl = facilitatorUrl.replace(/\\/$/, \"\");\n const verifyPath = `${cleanUrl}/verify/${encodeURIComponent(cleanPaymentId)}`;\n const url = new URL(verifyPath);\n if (ctx) {\n url.searchParams.set(\"resource\", ctx.resource);\n url.searchParams.set(\"routePath\", ctx.routePath);\n url.searchParams.set(\"priceInCents\", String(ctx.priceInCents));\n url.searchParams.set(\"paymentConfigs\", ctx.paymentConfigNames.join(\",\"));\n }\n const endpoint = url.toString();\n log(\"Verifying at:\", endpoint);\n\n const response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"ElizaOS-X402-Client/1.0\",\n },\n signal: AbortSignal.timeout(10000),\n });\n\n const responseText = await response.text();\n const responseData: FacilitatorVerificationResponse = responseText\n ? JSON.parse(responseText)\n : {};\n\n if (response.ok) {\n const isValid =\n responseData?.valid !== false && responseData?.verified !== false;\n if (isValid) {\n if (\n ctx &&\n !facilitatorVerifyResponseMatchesRoute(\n responseData,\n ctx,\n isFacilitatorBindingRelaxed(),\n )\n ) {\n logError(\n isFacilitatorBindingRelaxed()\n ? \"✗ Facilitator response failed route binding checks\"\n : \"✗ Facilitator strict binding failed (response must include matching resource, routePath or route, priceInCents, paymentConfig). Set X402_FACILITATOR_RELAXED_BINDING=1 if your facilitator cannot echo these fields yet.\",\n );\n return false;\n }\n log(\"✓ Facilitator verified payment\");\n return true;\n } else {\n logError(\"✗ Payment invalid per facilitator\");\n return false;\n }\n } else if (response.status === 404) {\n logError(\"✗ Payment ID not found (404)\");\n return false;\n } else if (response.status === 410) {\n logError(\"✗ Payment ID already used (410 - replay attack prevented)\");\n return false;\n } else {\n logError(\n `✗ Facilitator error: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n logError(\"✗ Facilitator request timed out (10s)\");\n } else {\n logError(\n \"✗ Facilitator verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n }\n return false;\n }\n}\n\n/**\n * Sanitize Solana signature\n */\nfunction sanitizeSolanaSignature(signature: string): string {\n const cleaned = signature.trim();\n\n // Solana signatures are base58, typically 87-88 characters\n if (!/^[1-9A-HJ-NP-Za-km-z]{87,88}$/.test(cleaned)) {\n throw new Error(\"Invalid Solana signature format\");\n }\n\n return cleaned;\n}\n\n/**\n * Verify a Solana SPL transfer landed on-chain for the expected mint, recipient, and amount.\n */\nasync function verifySolanaPayment(\n signature: string,\n expectedRecipient: string,\n expectedMint: string,\n expectedAmountAtomic: string,\n runtime: X402Runtime,\n): Promise<boolean> {\n let cleanSignature: string;\n try {\n cleanSignature = sanitizeSolanaSignature(signature);\n log(\n \"Verifying Solana transaction:\",\n `${cleanSignature.substring(0, 20)}...`,\n );\n } catch (error) {\n logError(\n \"Invalid signature:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n\n try {\n const { Connection } = await import(\"@solana/web3.js\");\n const rpcUrlSetting = runtime.getSetting(\"SOLANA_RPC_URL\");\n const rpcUrl =\n typeof rpcUrlSetting === \"string\"\n ? rpcUrlSetting\n : \"https://api.mainnet-beta.solana.com\";\n const connection = new Connection(rpcUrl);\n\n const tx = await connection.getTransaction(cleanSignature, {\n maxSupportedTransactionVersion: 0,\n });\n\n if (!tx) {\n logError(\"Transaction not found on Solana blockchain\");\n return false;\n }\n\n if (tx.meta?.err) {\n logError(\"Transaction failed on-chain:\", tx.meta.err);\n return false;\n }\n\n const meta = tx.meta;\n const pre = sumOwnerMint(\n meta?.preTokenBalances as Parameters<typeof sumOwnerMint>[0],\n expectedRecipient,\n expectedMint,\n );\n const post = sumOwnerMint(\n meta?.postTokenBalances as Parameters<typeof sumOwnerMint>[0],\n expectedRecipient,\n expectedMint,\n );\n const delta = post - pre;\n const need = BigInt(expectedAmountAtomic);\n if (delta < need) {\n logError(\n \"Solana SPL credit too low:\",\n delta.toString(),\n \"vs required\",\n need.toString(),\n );\n return false;\n }\n\n log(\"✓ Solana SPL transfer verified\");\n return true;\n } catch (error) {\n logError(\n \"Solana verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n}\n\n/**\n * Sanitize and parse payment proof data\n */\nfunction sanitizePaymentProof(paymentData: string): string {\n const cleaned = paymentData.trim();\n\n // Limit size to prevent DoS\n if (cleaned.length > 10000) {\n throw new Error(\"Payment proof too large\");\n }\n\n return cleaned;\n}\n\ntype EvmPaymentVerifyOpts = {\n /** On-chain tx: `receipt.to` must be this ERC-20 contract */\n erc20Contract?: Address;\n /** EIP-712: domain `verifyingContract` must match this token */\n eip712TokenContract?: Address;\n};\n\n/**\n * Verify an EVM transaction or EIP-712 signature\n */\nasync function verifyEvmPayment(\n paymentData: string,\n expectedRecipient: string,\n expectedAmountAtomic: string,\n network: string,\n runtime: X402Runtime,\n req?: X402Request,\n opts?: EvmPaymentVerifyOpts,\n): Promise<boolean> {\n let cleanPaymentData: string;\n try {\n cleanPaymentData = sanitizePaymentProof(paymentData);\n log(\n `Verifying ${network} payment:`,\n `${cleanPaymentData.substring(0, 20)}...`,\n );\n } catch (error) {\n logError(\n \"Invalid payment data:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n\n try {\n if (cleanPaymentData.match(/^0x[a-fA-F0-9]{64}$/)) {\n log(\"Detected transaction hash format\");\n return await verifyEvmTransaction(\n cleanPaymentData,\n expectedRecipient,\n expectedAmountAtomic,\n network,\n runtime,\n opts?.erc20Contract,\n );\n }\n\n try {\n const parsed: unknown = JSON.parse(cleanPaymentData);\n if (typeof parsed === \"object\" && parsed !== null) {\n const proof = parsed as Partial<EIP712PaymentProof>;\n if (proof.signature || (proof.v && proof.r && proof.s)) {\n log(\"Detected EIP-712 signature format\");\n const allowEip712 =\n process.env.X402_ALLOW_EIP712_SIGNATURE_VERIFICATION === \"true\" ||\n process.env.X402_ALLOW_EIP712_SIGNATURE_VERIFICATION === \"1\";\n if (!allowEip712) {\n logError(\n \"EIP-712 authorization proofs are disabled (they do not prove on-chain settlement). Set X402_ALLOW_EIP712_SIGNATURE_VERIFICATION=1 only if you accept that risk.\",\n );\n return false;\n }\n const token = opts?.eip712TokenContract;\n if (!token) {\n logError(\"EIP-712 verification missing expected token contract\");\n return false;\n }\n return await verifyEip712Authorization(\n parsed,\n expectedRecipient,\n expectedAmountAtomic,\n token,\n network,\n runtime,\n req,\n );\n }\n }\n } catch {\n // Not JSON, continue\n }\n\n if (cleanPaymentData.match(/^0x[a-fA-F0-9]{130}$/)) {\n logError(\"Raw signature detected but authorization parameters missing\");\n return false;\n }\n\n logError(\"Unrecognized EVM payment format\");\n return false;\n } catch (error) {\n logError(\n \"EVM verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n}\n\n/**\n * Verify a regular EVM transaction (on-chain ERC-20 transfer / transferFrom).\n * `expectedAmountAtomic` is the minimum token amount in smallest units (string integer).\n */\nasync function verifyEvmTransaction(\n txHash: string,\n expectedRecipient: string,\n expectedAmountAtomic: string,\n network: string,\n runtime: X402Runtime,\n tokenContract?: Address,\n): Promise<boolean> {\n log(\"Verifying on-chain transaction:\", txHash);\n\n try {\n const rpcUrl = getRpcUrl(network, runtime);\n const chain = getViemChain(network);\n\n const { createPublicClient, http, decodeFunctionData, parseAbi } =\n await import(\"viem\");\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n const receipt = await publicClient.getTransactionReceipt({\n hash: txHash as Hex,\n });\n\n if (receipt.status !== \"success\") {\n logError(\"Transaction failed on-chain\");\n return false;\n }\n\n const tx = await publicClient.getTransaction({ hash: txHash as Hex });\n\n const targetContract = tokenContract ?? getUsdcContractAddress(network);\n const expectedUnits = BigInt(expectedAmountAtomic);\n\n if (receipt.to?.toLowerCase() !== targetContract.toLowerCase()) {\n logError(\"Transaction not to expected token contract:\", receipt.to);\n return false;\n }\n\n log(\"Detected ERC-20 token transfer\");\n\n if (tx.input === \"0x\") {\n logError(\"No input data in transaction\");\n return false;\n }\n\n try {\n const erc20Abi = parseAbi([\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n ]);\n\n const decoded = decodeFunctionData({\n abi: erc20Abi,\n data: tx.input as Hex,\n });\n\n const functionName = decoded.functionName;\n log(\"Decoded function:\", functionName);\n\n let transferTo: Address;\n let transferAmount: bigint;\n\n if (functionName === \"transfer\") {\n const [to, amount] = decoded.args as [Address, bigint];\n transferTo = to;\n transferAmount = amount;\n } else if (functionName === \"transferFrom\") {\n const [_from, to, amount] = decoded.args as [Address, Address, bigint];\n transferTo = to;\n transferAmount = amount;\n } else {\n logError(\"Unknown ERC-20 function:\", functionName);\n return false;\n }\n\n log(\"Transfer to:\", transferTo, \"Amount:\", transferAmount.toString());\n\n if (transferTo.toLowerCase() !== expectedRecipient.toLowerCase()) {\n logError(\n \"ERC-20 transfer recipient mismatch:\",\n transferTo,\n \"vs\",\n expectedRecipient,\n );\n return false;\n }\n\n if (transferAmount < expectedUnits) {\n logError(\n \"ERC-20 transfer amount too low:\",\n transferAmount.toString(),\n \"vs\",\n expectedUnits.toString(),\n );\n return false;\n }\n\n log(\"✓ ERC-20 transaction verified\");\n return true;\n } catch (decodeError) {\n logError(\n \"Failed to decode ERC-20 transfer:\",\n decodeError instanceof Error\n ? decodeError.message\n : String(decodeError),\n );\n return false;\n }\n } catch (error) {\n logError(\n \"Transaction verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n}\n\n/**\n * Verify EIP-712 authorization signature (ERC-3009 TransferWithAuthorization)\n */\nasync function verifyEip712Authorization(\n paymentData: unknown,\n expectedRecipient: string,\n expectedAmountAtomic: string,\n expectedVerifyingContract: Address,\n network: string,\n runtime: X402Runtime,\n req?: X402Request,\n): Promise<boolean> {\n log(\"Verifying EIP-712 authorization signature\");\n\n // Type guard for payment data\n if (typeof paymentData !== \"object\" || paymentData === null) {\n logError(\"Invalid payment data: must be an object\");\n return false;\n }\n\n const proofData = paymentData as EIP712PaymentProof;\n log(\"Payment data:\", JSON.stringify(proofData, null, 2));\n\n try {\n let signature: string;\n let authorization: EIP712Authorization;\n\n if (proofData.signature && typeof proofData.signature === \"string\") {\n signature = proofData.signature;\n authorization = proofData.authorization as EIP712Authorization;\n } else if (proofData.v && proofData.r && proofData.s) {\n signature = `0x${proofData.r}${proofData.s}${proofData.v.toString(16).padStart(2, \"0\")}`;\n authorization = proofData.authorization as EIP712Authorization;\n } else {\n logError(\"No valid signature found in payment data\");\n return false;\n }\n\n if (!authorization || typeof authorization !== \"object\") {\n logError(\"No authorization data found in payment data\");\n return false;\n }\n\n // Validate authorization fields\n if (\n !authorization.from ||\n !authorization.to ||\n !authorization.value ||\n !authorization.nonce\n ) {\n logError(\"Authorization missing required fields\");\n return false;\n }\n\n log(\"Authorization:\", {\n from: `${authorization.from?.substring(0, 10)}...`,\n to: `${authorization.to?.substring(0, 10)}...`,\n value: authorization.value,\n });\n\n // Null check before toLowerCase()\n if (!authorization.to) {\n logError('Authorization missing \"to\" field');\n return false;\n }\n\n if (authorization.to.toLowerCase() !== expectedRecipient.toLowerCase()) {\n logError(\n \"Recipient mismatch:\",\n authorization.to,\n \"vs\",\n expectedRecipient,\n );\n return false;\n }\n\n const need = BigInt(expectedAmountAtomic);\n const authValue = BigInt(authorization.value);\n if (authValue < need) {\n logError(\"Amount too low:\", authValue.toString(), \"vs\", need.toString());\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n const validAfter = Number.parseInt(authorization.validAfter || \"0\", 10);\n const validBefore = Number.parseInt(\n authorization.validBefore || String(now + 86400),\n 10,\n );\n\n if (now < validAfter) {\n logError(\"Authorization not yet valid:\", now, \"<\", validAfter);\n return false;\n }\n\n if (now > validBefore) {\n logError(\"Authorization expired:\", now, \">\", validBefore);\n return false;\n }\n\n log(\"✓ EIP-712 authorization parameters valid\");\n\n logSection(\"Cryptographic Signature Verification\");\n\n try {\n let verifyingContract: Address;\n let chainId: number;\n let domainName = \"USD Coin\";\n let domainVersion = \"2\";\n\n const expectedChainId = getViemChain(network).id;\n\n if (proofData.domain && typeof proofData.domain === \"object\") {\n const domain = proofData.domain as EIP712Domain;\n log(\"Using domain from payment data:\", domain);\n if (\n (domain.verifyingContract as string).toLowerCase() !==\n expectedVerifyingContract.toLowerCase()\n ) {\n logError(\n \"EIP-712 verifyingContract does not match route token:\",\n domain.verifyingContract,\n expectedVerifyingContract,\n );\n return false;\n }\n if (domain.chainId !== expectedChainId) {\n logError(\n \"EIP-712 chainId mismatch:\",\n domain.chainId,\n \"expected\",\n expectedChainId,\n );\n return false;\n }\n verifyingContract = domain.verifyingContract as Address;\n chainId = domain.chainId;\n if (domain.name) domainName = domain.name;\n if (domain.version) domainVersion = domain.version;\n } else {\n log(\"No domain in payment data — using expected token + network chain\");\n verifyingContract = expectedVerifyingContract;\n chainId = expectedChainId;\n const usdc = getUsdcContractAddress(network);\n if (expectedVerifyingContract.toLowerCase() === usdc.toLowerCase()) {\n domainName = \"USD Coin\";\n } else {\n domainName = \"Token\";\n }\n }\n\n log(\"Verifying contract:\", verifyingContract, \"chainId:\", chainId);\n\n const domain: TypedDataDomain = {\n name: domainName,\n version: domainVersion,\n chainId,\n verifyingContract,\n };\n\n log(\"Domain for verification:\", domain);\n\n const types = {\n TransferWithAuthorization: TRANSFER_WITH_AUTHORIZATION_TYPES,\n };\n\n const message = {\n from: authorization.from as Address,\n to: authorization.to as Address,\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter || 0),\n validBefore: BigInt(\n authorization.validBefore || Math.floor(Date.now() / 1000) + 86400,\n ),\n nonce: authorization.nonce as Hex,\n };\n\n log(\"Message:\", {\n from: message.from,\n to: message.to,\n value: message.value.toString(),\n });\n\n try {\n const recoveredAddress = await recoverTypedDataAddress({\n domain,\n types,\n primaryType: \"TransferWithAuthorization\",\n message,\n signature: signature as Hex,\n });\n\n log(\n \"Recovered signer:\",\n recoveredAddress,\n \"Expected:\",\n authorization.from,\n );\n\n const signerMatches =\n recoveredAddress.toLowerCase() === authorization.from.toLowerCase();\n\n if (!signerMatches) {\n try {\n const wrongTypeRecovered = await recoverTypedDataAddress({\n domain,\n types: {\n ReceiveWithAuthorization: RECEIVE_WITH_AUTHORIZATION_TYPES,\n },\n primaryType: \"ReceiveWithAuthorization\",\n message,\n signature: signature as Hex,\n });\n\n if (\n wrongTypeRecovered.toLowerCase() ===\n authorization.from.toLowerCase()\n ) {\n logError(\"❌ CLIENT ERROR: Wrong EIP-712 type used\");\n return false;\n }\n } catch (_e) {\n log(\"Could not recover with ReceiveWithAuthorization either\");\n }\n }\n\n log(\"Signature match:\", signerMatches ? \"✓ Valid\" : \"✗ Invalid\");\n\n if (!signerMatches) {\n const userAgent = req?.headers?.[\"user-agent\"];\n const isX402Gateway =\n typeof userAgent === \"string\" && userAgent.includes(\"X402-Gateway\");\n\n if (isX402Gateway) {\n log(\"🔍 Detected X402 Gateway User-Agent\");\n const trustedSignersSetting = runtime.getSetting(\n \"X402_TRUSTED_GATEWAY_SIGNERS\",\n );\n const trustedSigners =\n typeof trustedSignersSetting === \"string\"\n ? trustedSignersSetting\n : \"0x2EB8323f66eE172315503de7325D04c676089267\";\n const signerWhitelist = trustedSigners\n .split(\",\")\n .map((addr: string) => addr.trim().toLowerCase());\n\n if (signerWhitelist.includes(recoveredAddress.toLowerCase())) {\n log(\"✅ Signature verified: signed by authorized X402 Gateway\");\n return true;\n } else {\n logError(\n `✗ Gateway signer NOT in whitelist: ${recoveredAddress}`,\n );\n logError(\n `Add to X402_TRUSTED_GATEWAY_SIGNERS to allow: ${recoveredAddress}`,\n );\n return false;\n }\n } else {\n logError(\"✗ Signature verification failed: signer mismatch\");\n logError(\n `Expected: ${authorization.from}, Actual: ${recoveredAddress}`,\n );\n return false;\n }\n } else {\n log(\"✓ Signature cryptographically verified\");\n return true;\n }\n } catch (error) {\n logError(\n \"✗ Signature verification failed:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n } catch (error) {\n logError(\n \"EIP-712 verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n } catch (error) {\n logError(\n \"EIP-712 verification error:\",\n error instanceof Error ? error.message : String(error),\n );\n return false;\n }\n}\n\n/**\n * Create a payment-aware route handler\n */\nexport function createPaymentAwareHandler(\n route: PaymentEnabledRoute,\n): NonNullable<Route[\"handler\"]> {\n const originalHandler = route.handler;\n\n return async (\n req: RouteRequest,\n res: RouteResponse,\n runtime: IAgentRuntime,\n ) => {\n const typedReq = req as X402Request;\n const typedRes = res as ExpressResponse;\n const typedRuntime = runtime as X402Runtime;\n\n if (route.x402 == null) {\n if (originalHandler) {\n return originalHandler(req, res, runtime);\n }\n return;\n }\n\n const testMode =\n process.env.X402_TEST_MODE === \"true\" ||\n process.env.X402_TEST_MODE === \"1\";\n if (testMode) {\n logger.warn(\n \"[@elizaos/agent x402] X402_TEST_MODE is set — skipping payment verification (development only)\",\n );\n if (originalHandler) {\n return originalHandler(req, res, runtime);\n }\n return;\n }\n\n const x402Cfg = resolveEffectiveX402(route, typedRuntime);\n if (!x402Cfg) {\n if (!typedRes.headersSent) {\n typedRes.status(500).json({\n error: \"x402 misconfiguration\",\n message:\n \"Could not resolve x402 price/paymentConfigs. For `x402: true`, set character.settings.x402.defaultPriceInCents and defaultPaymentConfigs. For partial x402 on the route, supply priceInCents and paymentConfigs or the matching character defaults.\",\n path: route.path,\n });\n }\n return;\n }\n\n const payRoute: X402PaidRoute = { ...route, x402: x402Cfg };\n\n logSection(`X402 Payment Check - ${route.path}`);\n log(\"Method:\", typedReq.method);\n\n if (route.validator) {\n try {\n const validationResult = await route.validator(typedReq);\n\n if (!validationResult.valid) {\n logError(\"✗ Validation failed:\", validationResult.error?.message);\n\n const x402Response = buildX402Response(payRoute, typedRuntime);\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_REQUIRED, {\n path: route.path,\n configNames: payRoute.x402.paymentConfigs ?? [\"base_usdc\"],\n reason: \"validator_failed\",\n });\n\n const errorMessage = validationResult.error?.details\n ? `${validationResult.error.message}: ${JSON.stringify(validationResult.error.details)}`\n : validationResult.error?.message || \"Invalid request parameters\";\n\n setStandardPaymentRequiredHeaders(\n typedRes,\n payRoute,\n typedRuntime,\n errorMessage,\n );\n return typedRes.status(402).json({\n ...x402Response,\n error: errorMessage,\n });\n }\n\n log(\"✓ Validation passed\");\n } catch (error) {\n logError(\n \"✗ Validation error:\",\n error instanceof Error ? error.message : String(error),\n );\n\n const x402Response = buildX402Response(payRoute, typedRuntime);\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_REQUIRED, {\n path: route.path,\n configNames: payRoute.x402.paymentConfigs ?? [\"base_usdc\"],\n reason: \"validator_error\",\n });\n setStandardPaymentRequiredHeaders(\n typedRes,\n payRoute,\n typedRuntime,\n \"Validation error\",\n );\n return typedRes.status(402).json({\n ...x402Response,\n error: `Validation error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n const requestHeaders = typedReq.headers ?? {};\n const requestQuery = typedReq.query ?? {};\n\n log(\"Headers:\", JSON.stringify(requestHeaders, null, 2));\n log(\"Query:\", JSON.stringify(requestQuery, null, 2));\n if (typedReq.method === \"POST\" && typedReq.body) {\n log(\"Body:\", JSON.stringify(typedReq.body, null, 2));\n }\n\n const paymentProof =\n requestHeaders[\"x-payment-proof\"] ||\n requestHeaders[\"x-payment\"] ||\n requestHeaders[\"payment-signature\"] ||\n requestQuery.paymentProof;\n const paymentId = requestHeaders[\"x-payment-id\"] || requestQuery.paymentId;\n\n log(\"Payment credentials:\", {\n \"x-payment-proof\": !!requestHeaders[\"x-payment-proof\"],\n \"x-payment\": !!requestHeaders[\"x-payment\"],\n \"payment-signature\": !!requestHeaders[\"payment-signature\"],\n \"x-payment-id\": !!paymentId,\n found: !!(paymentProof || paymentId),\n });\n\n if (paymentProof || paymentId) {\n log(\"Payment credentials received:\", {\n proofLength: paymentProof ? String(paymentProof).length : 0,\n paymentId,\n });\n\n try {\n const cfgNames = payRoute.x402.paymentConfigs ?? [\"base_usdc\"];\n const outcome = await verifyPayment({\n paymentProof:\n typeof paymentProof === \"string\" ? paymentProof : undefined,\n paymentId: typeof paymentId === \"string\" ? paymentId : undefined,\n route: route.path,\n priceInCents: payRoute.x402.priceInCents,\n paymentConfigNames: cfgNames,\n agentId: typedRuntime.agentId\n ? String(typedRuntime.agentId)\n : undefined,\n runtime: typedRuntime,\n req: typedReq,\n });\n\n if (outcome.ok) {\n log(\"✓ PAYMENT VERIFIED - executing handler\");\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_VERIFIED, {\n path: route.path,\n priceInCents: payRoute.x402.priceInCents,\n paymentConfigs: payRoute.x402.paymentConfigs,\n payer: outcome.details.payer,\n amountAtomic: outcome.details.amountAtomic,\n network: outcome.details.network,\n proofId: outcome.details.proofId,\n paymentConfig: outcome.details.paymentConfig,\n symbol: outcome.details.symbol,\n });\n if (outcome.details.paymentResponse && typedRes.setHeader) {\n typedRes.setHeader(\n \"PAYMENT-RESPONSE\",\n outcome.details.paymentResponse,\n );\n typedRes.setHeader(\n \"Access-Control-Expose-Headers\",\n \"PAYMENT-REQUIRED, PAYMENT-RESPONSE, Payment-Required, Payment-Response\",\n );\n }\n if (originalHandler) {\n return originalHandler(req as never, res as never, runtime);\n }\n return;\n }\n logError(\"✗ PAYMENT VERIFICATION FAILED\");\n const x402Base = buildX402Response(payRoute, typedRuntime);\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_REQUIRED, {\n path: route.path,\n configNames: cfgNames,\n reason: \"verification_failed\",\n });\n setStandardPaymentRequiredHeaders(\n typedRes,\n payRoute,\n typedRuntime,\n \"Payment verification failed\",\n );\n typedRes.status(402).json({\n ...x402Base,\n error: \"Payment verification failed\",\n message:\n \"The provided payment proof is invalid or has expired, or the amount or token does not match this route.\",\n });\n return;\n } catch (error) {\n logError(\n \"✗ PAYMENT VERIFICATION ERROR:\",\n error instanceof Error ? error.message : String(error),\n );\n let x402Base: X402Response;\n try {\n x402Base = buildX402Response(payRoute, typedRuntime);\n } catch {\n x402Base = createX402Response({\n error: \"Payment verification error\",\n });\n }\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_REQUIRED, {\n path: route.path,\n configNames: payRoute.x402.paymentConfigs ?? [\"base_usdc\"],\n reason: \"verification_error\",\n });\n setStandardPaymentRequiredHeaders(\n typedRes,\n payRoute,\n typedRuntime,\n \"Payment verification error\",\n );\n typedRes.status(402).json({\n ...x402Base,\n error: \"Payment verification error\",\n message: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n }\n\n log(\"No payment credentials - returning 402\");\n\n try {\n const x402Response = buildX402Response(payRoute, typedRuntime);\n void typedRuntime.emitEvent(X402_EVENT_PAYMENT_REQUIRED, {\n path: route.path,\n configNames: payRoute.x402.paymentConfigs ?? [\"base_usdc\"],\n reason: \"payment_required\",\n });\n log(\"Payment options:\", {\n paymentConfigs: payRoute.x402.paymentConfigs || [\"base_usdc\"],\n priceInCents: payRoute.x402.priceInCents,\n count: x402Response.accepts?.length || 0,\n });\n log(\"402 Response:\", JSON.stringify(x402Response, null, 2));\n\n setStandardPaymentRequiredHeaders(\n typedRes,\n payRoute,\n typedRuntime,\n \"Payment Required\",\n );\n typedRes.status(402).json(x402Response);\n } catch (error) {\n logError(\n \"✗ Failed to build x402 response:\",\n error instanceof Error ? error.message : String(error),\n );\n typedRes.status(402).json(\n createX402Response({\n error: `Payment Required: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n }),\n );\n }\n };\n}\n\n/**\n * Attach x402 **V2** `PAYMENT-REQUIRED` while still returning the **legacy JSON** 402 body.\n *\n * **Why both:** many readers still consume `accepts` from JSON (`x402Version: 1`);\n * V2 buyers expect a base64 `PaymentRequired` object in `PAYMENT-REQUIRED`\n * (`x402Version: 2`, CAIP-2 `network`, etc.). Shipping both avoids breaking older\n * integrations while giving spec-aligned clients a deterministic header to parse.\n *\n * **Why base64:** per x402 V2 HTTP docs, header values are base64-encoded JSON so\n * proxies and intermediaries do not mangle structured characters.\n */\nfunction setStandardPaymentRequiredHeaders(\n res: ExpressResponse,\n route: X402PaidRoute,\n runtime?: X402Runtime,\n error = \"Payment Required\",\n): void {\n if (!res.setHeader || res.headersSent) return;\n const paymentConfigNames = route.x402.paymentConfigs || [\"base_usdc\"];\n const agentId = runtime?.agentId ? String(runtime.agentId) : undefined;\n const paymentRequired = buildStandardPaymentRequired({\n routePath: route.path,\n description: generateDescription(route),\n priceInCents: route.x402.priceInCents,\n paymentConfigNames,\n agentId,\n error,\n });\n const encoded = Buffer.from(JSON.stringify(paymentRequired), \"utf8\").toString(\n \"base64\",\n );\n res.setHeader(\"PAYMENT-REQUIRED\", encoded);\n res.setHeader(\n \"Access-Control-Expose-Headers\",\n \"PAYMENT-REQUIRED, PAYMENT-RESPONSE, Payment-Required, Payment-Response\",\n );\n}\n\n/**\n * Build x402scan-compliant response for a route\n */\nfunction buildX402Response(\n route: X402PaidRoute,\n runtime?: X402Runtime,\n): X402Response {\n if (!route.x402.priceInCents) {\n throw new Error(\"Route x402.priceInCents is required for x402 response\");\n }\n\n const paymentConfigs = route.x402.paymentConfigs || [\"base_usdc\"];\n const agentId = runtime?.agentId ? String(runtime.agentId) : undefined;\n\n const accepts = paymentConfigs.flatMap((configName) => {\n const config = getPaymentConfig(configName, agentId);\n const caip19 = getCAIP19FromConfig(config);\n const maxAmountRequired = atomicAmountForPriceInCents(\n route.x402.priceInCents,\n config,\n );\n\n const inputSchema = buildInputSchemaFromRoute(route);\n\n const method = route.type === \"POST\" ? \"POST\" : \"GET\";\n\n const outputSchema: OutputSchema = {\n input: {\n type: \"http\",\n method: method,\n bodyType: method === \"POST\" ? \"json\" : undefined,\n pathParams: inputSchema.pathParams,\n queryParams: inputSchema.queryParams,\n bodyFields: inputSchema.bodyFields,\n headerFields: {\n \"X-Payment\": {\n type: \"string\",\n required: false,\n description:\n \"Standard x402 payment header (base64-encoded JSON or raw JSON with x402Version, accepted, payload) — verified via facilitator POST when configured\",\n },\n \"X-Payment-Proof\": {\n type: \"string\",\n required: false,\n description:\n \"Legacy payment proof (tx hash, colon-delimited, or JSON)\",\n },\n \"X-Payment-Id\": {\n type: \"string\",\n required: false,\n description: \"Optional payment ID for tracking\",\n },\n },\n },\n output: {\n type: \"object\",\n description: \"API response data (varies by endpoint)\",\n },\n };\n\n const extra: PaymentExtraMetadata = {\n priceInCents: route.x402.priceInCents || 0,\n priceUSD: `$${((route.x402.priceInCents || 0) / 100).toFixed(2)}`,\n symbol: config.symbol,\n paymentConfig: configName,\n expiresIn: 300, // Payment window in seconds\n };\n\n // Add EIP-712 domain for EVM chains (helps client developers)\n if (\n config.network === \"BASE\" ||\n config.network === \"POLYGON\" ||\n config.network === \"BSC\"\n ) {\n const isUsdc = config.symbol?.toUpperCase() === \"USDC\";\n const tokenName = isUsdc ? \"USD Coin\" : config.symbol || \"Token\";\n extra.name = tokenName;\n extra.version = \"2\";\n extra.eip712Domain = {\n name: tokenName,\n version: \"2\",\n chainId: Number.parseInt(config.chainId || \"1\", 10),\n verifyingContract: config.assetReference,\n };\n }\n\n return createAccepts({\n network: toX402Network(config.network),\n maxAmountRequired,\n resource: toResourceUrl(route.path),\n description: generateDescription(route),\n payTo: config.paymentAddress,\n asset: caip19,\n mimeType: \"application/json\",\n maxTimeoutSeconds: 300,\n outputSchema,\n extra,\n });\n });\n\n return createX402Response({\n accepts,\n error: \"Payment Required\",\n });\n}\n\n/**\n * Extract path parameter names from Express-style route path\n */\nfunction extractPathParams(path: string): string[] {\n const matches = path.matchAll(/:([^/]+)/g);\n return Array.from(matches, (m) => m[1]);\n}\n\n/**\n * OpenAPI schema types for type safety\n */\ninterface OpenAPIPropertySchema {\n type?: string;\n description?: string;\n enum?: string[];\n pattern?: string;\n properties?: Record<string, OpenAPIPropertySchema>;\n}\n\ninterface OpenAPIObjectSchema extends OpenAPIPropertySchema {\n type: \"object\";\n required?: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOpenAPIObjectSchema(schema: unknown): schema is OpenAPIObjectSchema {\n if (!isRecord(schema) || schema.type !== \"object\") {\n return false;\n }\n const properties = schema.properties;\n return (\n properties === undefined ||\n (isRecord(properties) &&\n Object.values(properties).every(\n (property) => property === undefined || isRecord(property),\n ))\n );\n}\n\n/**\n * Field definition for schema conversion\n */\ninterface FieldDefinition {\n type?: string;\n required?: boolean;\n description?: string;\n enum?: string[];\n pattern?: string;\n properties?: Record<string, FieldDefinition>;\n}\n\n/**\n * Convert OpenAPI schema to FieldDef format\n */\nfunction convertOpenAPISchemaToFieldDef(\n schema: OpenAPIObjectSchema | OpenAPIPropertySchema,\n): Record<string, FieldDefinition> {\n if (\"properties\" in schema && schema.properties) {\n const fields: Record<string, FieldDefinition> = {};\n for (const [key, value] of Object.entries(schema.properties)) {\n fields[key] = {\n type: value.type,\n required:\n \"required\" in schema && schema.required\n ? schema.required.includes(key)\n : false,\n description: value.description,\n enum: value.enum,\n pattern: value.pattern,\n properties: value.properties\n ? convertOpenAPISchemaToFieldDef(value)\n : undefined,\n };\n }\n return fields;\n }\n return {};\n}\n\n/**\n * Input schema structure\n */\ninterface InputSchema {\n pathParams?: Record<string, FieldDefinition>;\n queryParams?: Record<string, FieldDefinition>;\n bodyFields?: Record<string, FieldDefinition>;\n}\n\n/**\n * Build input schema from route\n */\nfunction buildInputSchemaFromRoute(route: PaymentEnabledRoute): InputSchema {\n const schema: InputSchema = {};\n\n if (route.openapi?.parameters) {\n const pathParams: Record<string, FieldDefinition> = {};\n for (const p of route.openapi.parameters.filter((x) => x.in === \"path\")) {\n pathParams[p.name] = {\n type: p.schema.type,\n required: p.required ?? true,\n description: p.description,\n enum: p.schema.enum,\n pattern: p.schema.pattern,\n };\n }\n if (Object.keys(pathParams).length > 0) schema.pathParams = pathParams;\n } else {\n const paramNames = extractPathParams(route.path);\n if (paramNames.length > 0) {\n const pathParams: Record<string, FieldDefinition> = {};\n for (const name of paramNames) {\n pathParams[name] = {\n type: \"string\",\n required: true,\n description: `Path parameter: ${name}`,\n };\n }\n schema.pathParams = pathParams;\n }\n }\n\n if (route.openapi?.parameters) {\n const queryParams: Record<string, FieldDefinition> = {};\n for (const p of route.openapi.parameters.filter((x) => x.in === \"query\")) {\n queryParams[p.name] = {\n type: p.schema.type,\n required: p.required ?? false,\n description: p.description,\n enum: p.schema.enum,\n pattern: p.schema.pattern,\n };\n }\n if (Object.keys(queryParams).length > 0) schema.queryParams = queryParams;\n }\n\n if (route.openapi?.requestBody?.content?.[\"application/json\"]?.schema) {\n const requestBodySchema =\n route.openapi.requestBody.content[\"application/json\"].schema;\n if (isOpenAPIObjectSchema(requestBodySchema)) {\n schema.bodyFields = convertOpenAPISchemaToFieldDef(requestBodySchema);\n }\n }\n\n return schema;\n}\n\n/**\n * Auto-generate description from route path if not provided\n */\nfunction generateDescription(route: PaymentEnabledRoute): string {\n if (route.description) return route.description;\n\n const pathParts = route.path.split(\"/\").filter(Boolean);\n const action = route.type.toLowerCase() === \"get\" ? \"Get\" : \"Execute\";\n const resource =\n pathParts[pathParts.length - 1]?.replace(/^:/, \"\") || \"resource\";\n return `${action} ${resource}`;\n}\n\n// Re-export types from core\nexport type { X402RequestValidator, X402ValidationResult } from \"@elizaos/core\";\n\n/**\n * Apply payment protection to an array of routes\n * Runs comprehensive startup validation before applying protection. Pass\n * `character`/`agentId` so routes that use the `x402: true` shorthand (which\n * resolves price + paymentConfigs from `character.settings.x402`) can validate\n * without errors.\n */\nexport function applyPaymentProtection(\n routes: Route[],\n context?: { character?: Character; agentId?: string },\n): Route[] {\n if (!Array.isArray(routes)) {\n throw new Error(\"routes must be an array\");\n }\n\n const validation = validateX402Startup(routes, context?.character, {\n agentId: context?.agentId,\n });\n\n if (!validation.valid) {\n throw new Error(\n `\\nx402 Configuration Invalid (${validation.errors.length} error${validation.errors.length > 1 ? \"s\" : \"\"}):\\n\\n` +\n validation.errors.map((e) => ` • ${e}`).join(\"\\n\") +\n \"\\n\\nPlease fix these errors and try again.\\n\",\n );\n }\n\n return routes.map((route) => {\n const x402Route = route as PaymentEnabledRoute;\n if (x402Route.x402 != null) {\n if (isRoutePaymentWrapped(route)) {\n return route;\n }\n\n logger.debug(\n { path: x402Route.path, x402: x402Route.x402 },\n \"[x402] payment protection enabled\",\n );\n\n const wrappedRoute: Route & { [X402_ROUTE_PAYMENT_WRAPPED]: true } = {\n ...route,\n handler: createPaymentAwareHandler(x402Route),\n [X402_ROUTE_PAYMENT_WRAPPED]: true,\n };\n return wrappedRoute;\n }\n return route;\n });\n}\n",
7
+ "/**\n * Startup validation for x402 payment system\n * Validates payment configs and routes before the server starts\n */\n\nimport type {\n Character,\n CharacterX402Settings,\n PaymentEnabledRoute,\n Route,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport {\n BUILT_IN_NETWORKS,\n getPaymentConfig,\n getX402Health,\n listX402Configs,\n paymentAddressIsBundledExample,\n} from \"./payment-config.js\";\n\n/**\n * Validation result with warnings and errors\n */\nexport interface StartupValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate a payment config is properly configured\n */\nfunction validatePaymentConfig(\n configName: string,\n agentId?: string,\n): {\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n const config = getPaymentConfig(configName, agentId);\n\n // Check required fields\n if (!config.network) {\n errors.push(`Config '${configName}': missing 'network'`);\n }\n if (!config.assetNamespace) {\n errors.push(`Config '${configName}': missing 'assetNamespace'`);\n }\n if (!config.assetReference) {\n errors.push(`Config '${configName}': missing 'assetReference'`);\n }\n if (!config.paymentAddress) {\n errors.push(\n `Config '${configName}': missing 'paymentAddress' (wallet address required)`,\n );\n }\n if (!config.symbol) {\n errors.push(`Config '${configName}': missing 'symbol'`);\n }\n\n // Validate address format\n if (config.paymentAddress) {\n // Solana addresses: base58, 32-44 chars\n if (config.network === \"SOLANA\") {\n if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(config.paymentAddress)) {\n errors.push(`Config '${configName}': invalid Solana address format`);\n }\n }\n // EVM addresses: 0x + 40 hex chars\n else if (\n config.network === \"BASE\" ||\n config.network === \"POLYGON\" ||\n config.assetNamespace === \"erc20\"\n ) {\n if (!/^0x[a-fA-F0-9]{40}$/.test(config.paymentAddress)) {\n errors.push(\n `Config '${configName}': invalid EVM address format (should be 0x...)`,\n );\n }\n }\n\n // Check if address looks like default/example\n if (\n config.paymentAddress === \"0x0000000000000000000000000000000000000000\"\n ) {\n warnings.push(\n `Config '${configName}': using zero address (0x0...0) - is this intentional?`,\n );\n }\n }\n\n // Validate asset reference (contract address / token mint)\n if (config.assetReference && config.assetNamespace === \"erc20\") {\n if (!/^0x[a-fA-F0-9]{40}$/.test(config.assetReference)) {\n errors.push(\n `Config '${configName}': invalid ERC20 token address format`,\n );\n }\n }\n\n if (paymentAddressIsBundledExample(config.network, config.paymentAddress)) {\n if (process.env.NODE_ENV === \"production\") {\n errors.push(\n `Config '${configName}': paymentAddress is the bundled dev example for ${config.network}. Set ${config.network}_PUBLIC_KEY or PAYMENT_WALLET_${config.network} to your payout wallet before production.`,\n );\n } else {\n warnings.push(\n `Config '${configName}': paymentAddress matches the bundled dev example for ${config.network} — set env payout keys for real settlement.`,\n );\n }\n }\n\n // Check if network is built-in (warn if custom)\n if (\n !(BUILT_IN_NETWORKS as readonly string[]).includes(\n config.network as string,\n )\n ) {\n warnings.push(\n `Config '${configName}': using custom network '${config.network}' ` +\n `(not in built-in networks: ${BUILT_IN_NETWORKS.join(\", \")})`,\n );\n }\n } catch (error) {\n errors.push(\n `Config '${configName}': ${error instanceof Error ? error.message : \"unknown error\"}`,\n );\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate an x402 route configuration\n */\nfunction validateX402Route(\n route: Route,\n character?: Character,\n agentId?: string,\n): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n const x402Route = route as PaymentEnabledRoute;\n\n if (!route.path) {\n errors.push(`Route missing 'path' property`);\n return { errors, warnings };\n }\n\n const routePath = route.path;\n\n if (x402Route.x402 == null) {\n return { errors, warnings };\n }\n\n const cx = character?.settings?.x402 as CharacterX402Settings | undefined;\n const raw = x402Route.x402;\n let priceInCents: number | undefined;\n let paymentConfigs: string[] | undefined;\n\n if (raw === true) {\n priceInCents = cx?.defaultPriceInCents;\n paymentConfigs = cx?.defaultPaymentConfigs as string[] | undefined;\n if (priceInCents == null) {\n errors.push(\n `${routePath}: x402: true requires character.settings.x402.defaultPriceInCents`,\n );\n }\n if (!paymentConfigs?.length) {\n errors.push(\n `${routePath}: x402: true requires character.settings.x402.defaultPaymentConfigs (non-empty array)`,\n );\n }\n } else if (typeof raw === \"object\" && !Array.isArray(raw)) {\n priceInCents = raw.priceInCents ?? cx?.defaultPriceInCents;\n paymentConfigs = (raw.paymentConfigs ?? cx?.defaultPaymentConfigs) as\n | string[]\n | undefined;\n if (priceInCents == null) {\n errors.push(\n `${routePath}: x402.priceInCents is required (or set character.settings.x402.defaultPriceInCents)`,\n );\n }\n if (!paymentConfigs?.length) {\n errors.push(\n `${routePath}: x402.paymentConfigs is required (or set character.settings.x402.defaultPaymentConfigs)`,\n );\n }\n } else {\n errors.push(`${routePath}: x402 must be true or a configuration object`);\n }\n\n if (priceInCents !== undefined && priceInCents !== null) {\n if (typeof priceInCents !== \"number\") {\n errors.push(`${routePath}: resolved x402.priceInCents must be a number`);\n } else if (priceInCents <= 0) {\n errors.push(`${routePath}: x402.priceInCents must be > 0`);\n } else if (!Number.isInteger(priceInCents)) {\n errors.push(`${routePath}: x402.priceInCents must be an integer (cents)`);\n } else if (priceInCents > 10000) {\n warnings.push(\n `${routePath}: price is $${(priceInCents / 100).toFixed(2)} — is this intentional?`,\n );\n }\n }\n\n if (paymentConfigs && !Array.isArray(paymentConfigs)) {\n errors.push(`${routePath}: x402.paymentConfigs must be an array`);\n } else if (paymentConfigs?.length === 0) {\n errors.push(`${routePath}: x402.paymentConfigs cannot be empty`);\n } else if (paymentConfigs?.length) {\n const availableConfigs = listX402Configs(agentId);\n for (const configName of paymentConfigs) {\n if (typeof configName !== \"string\") {\n errors.push(\n `${routePath}: x402.paymentConfigs contains non-string value`,\n );\n } else if (!availableConfigs.includes(configName)) {\n errors.push(\n `${routePath}: unknown payment config '${configName}'. Available: ${availableConfigs.join(\", \")}`,\n );\n } else {\n const configValidation = validatePaymentConfig(configName, agentId);\n errors.push(\n ...configValidation.errors.map((e) => `${routePath}: ${e}`),\n );\n warnings.push(\n ...configValidation.warnings.map((w) => `${routePath}: ${w}`),\n );\n }\n }\n }\n\n if (!route.handler) {\n errors.push(\n `${routePath}: route has x402 protection but no handler function`,\n );\n }\n\n return { errors, warnings };\n}\n\n/**\n * Validate environment configuration\n */\nfunction validateEnvironment(): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check network configuration\n const health = getX402Health();\n\n for (const network of health.networks) {\n if (!network.configured || !network.address) {\n warnings.push(\n `Network '${network.network}' not configured. ` +\n `Set ${network.network}_PUBLIC_KEY in .env to accept payments on this network.`,\n );\n }\n }\n\n // Check facilitator configuration (optional)\n if (!health.facilitator.configured) {\n warnings.push(\n \"X402_FACILITATOR_URL not set. Direct blockchain verification will be used. \" +\n \"Consider setting up a facilitator for better UX.\",\n );\n }\n\n if (\n process.env.NODE_ENV === \"production\" &&\n (process.env.X402_TEST_MODE === \"true\" ||\n process.env.X402_TEST_MODE === \"1\")\n ) {\n warnings.push(\n \"X402_TEST_MODE is set while NODE_ENV=production — clients can bypass payment verification; unset X402_TEST_MODE in production.\",\n );\n }\n\n return { errors, warnings };\n}\n\n/**\n * Comprehensive startup validation\n * Call this before starting the server to catch configuration issues early\n */\nexport function validateX402Startup(\n routes: Route[],\n character?: Character,\n options?: { agentId?: string },\n): StartupValidationResult {\n const allErrors: string[] = [];\n const allWarnings: string[] = [];\n\n let protectedRouteCount = 0;\n for (const route of routes) {\n const x402Route = route as PaymentEnabledRoute;\n if (x402Route.x402 != null) {\n protectedRouteCount++;\n const routeValidation = validateX402Route(\n route,\n character,\n options?.agentId,\n );\n allErrors.push(...routeValidation.errors);\n allWarnings.push(...routeValidation.warnings);\n }\n }\n\n if (protectedRouteCount > 0) {\n const envValidation = validateEnvironment();\n allErrors.push(...envValidation.errors);\n allWarnings.push(...envValidation.warnings);\n\n logger.info(\n `[x402] validated ${protectedRouteCount}/${routes.length} protected route(s); ` +\n `configs=${listX402Configs(options?.agentId).length}, ` +\n `errors=${allErrors.length}, warnings=${allWarnings.length}`,\n );\n }\n\n return {\n valid: allErrors.length === 0,\n errors: allErrors,\n warnings: allWarnings,\n };\n}\n\n/**\n * Validate routes and throw if invalid\n * This is used by applyPaymentProtection to fail fast on startup\n */\nexport function validateAndThrowIfInvalid(\n routes: Route[],\n character?: Character,\n options?: { agentId?: string },\n): void {\n const result = validateX402Startup(routes, character, options);\n\n if (!result.valid) {\n throw new Error(\n `x402 Configuration Invalid (${result.errors.length} error${result.errors.length > 1 ? \"s\" : \"\"}):\\n\\n` +\n result.errors.map((e) => ` • ${e}`).join(\"\\n\") +\n \"\\n\\nPlease fix these errors and try again.\",\n );\n }\n}\n",
8
+ "import type {\n FacilitatorVerificationResponse,\n FacilitatorVerifyContext,\n} from \"./types.js\";\n\n/**\n * When true, facilitator JSON must echo `resource`, route, `priceInCents`, and\n * `paymentConfig` so a generic 200 cannot unlock unrelated routes.\n * Set `X402_FACILITATOR_RELAXED_BINDING=1` if your facilitator does not return these fields yet.\n */\nexport function isFacilitatorBindingRelaxed(): boolean {\n return (\n process.env.X402_FACILITATOR_RELAXED_BINDING === \"true\" ||\n process.env.X402_FACILITATOR_RELAXED_BINDING === \"1\"\n );\n}\n\nfunction relaxedPayloadMatchesContext(\n data: FacilitatorVerificationResponse,\n ctx: FacilitatorVerifyContext,\n): boolean {\n if (typeof data.resource === \"string\" && data.resource !== ctx.resource) {\n return false;\n }\n if (typeof data.routePath === \"string\" && data.routePath !== ctx.routePath) {\n return false;\n }\n if (typeof data.route === \"string\" && data.route !== ctx.routePath) {\n return false;\n }\n if (\n typeof data.priceInCents === \"number\" &&\n Number.isFinite(data.priceInCents) &&\n data.priceInCents !== ctx.priceInCents\n ) {\n return false;\n }\n if (typeof data.paymentConfig === \"string\") {\n if (!ctx.paymentConfigNames.includes(data.paymentConfig)) {\n return false;\n }\n }\n if (Array.isArray(data.paymentConfigs)) {\n for (const n of data.paymentConfigs) {\n if (typeof n === \"string\" && !ctx.paymentConfigNames.includes(n)) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction strictPaymentConfigOk(\n data: FacilitatorVerificationResponse,\n ctx: FacilitatorVerifyContext,\n): boolean {\n if (typeof data.paymentConfig === \"string\") {\n return ctx.paymentConfigNames.includes(data.paymentConfig);\n }\n if (Array.isArray(data.paymentConfigs) && data.paymentConfigs.length > 0) {\n const names = data.paymentConfigs.filter(\n (x): x is string => typeof x === \"string\",\n );\n if (names.length === 0) return false;\n return names.every((n) => ctx.paymentConfigNames.includes(n));\n }\n return false;\n}\n\nfunction strictPayloadMatchesContext(\n data: FacilitatorVerificationResponse,\n ctx: FacilitatorVerifyContext,\n): boolean {\n if (typeof data.resource !== \"string\" || data.resource !== ctx.resource) {\n return false;\n }\n const routeOk =\n (typeof data.routePath === \"string\" && data.routePath === ctx.routePath) ||\n (typeof data.route === \"string\" && data.route === ctx.routePath);\n if (!routeOk) {\n return false;\n }\n if (\n typeof data.priceInCents !== \"number\" ||\n !Number.isFinite(data.priceInCents) ||\n data.priceInCents !== ctx.priceInCents\n ) {\n return false;\n }\n if (!strictPaymentConfigOk(data, ctx)) {\n return false;\n }\n return true;\n}\n\nexport function facilitatorVerifyResponseMatchesRoute(\n data: FacilitatorVerificationResponse,\n ctx: FacilitatorVerifyContext,\n relaxed: boolean,\n): boolean {\n return relaxed\n ? relaxedPayloadMatchesContext(data, ctx)\n : strictPayloadMatchesContext(data, ctx);\n}\n",
9
+ "/**\n * Replay + in-flight guard for x402 verification.\n *\n * - **In-flight (`inflight`)**: in-memory only; prevents concurrent duplicate\n * verification in the same process (TOCTOU between check and verify).\n * - **Consumed**: when `X402_REPLAY_DURABLE` is not disabled and `runtime` is\n * passed, credentials are recorded via `runtime.setCache` / `getCache` so they\n * survive restarts and work across multiple server processes sharing the DB.\n * Entries do not expire (same tx hash / payment id must not unlock paid routes twice).\n * - **Fallback**: set `X402_REPLAY_DURABLE=0` (or `false` / `off`) to use only an\n * in-memory TTL map (`X402_REPLAY_WINDOW_MS` / `X402_REPLAY_TTL_MS`, default 10m).\n * If `runtime` is omitted (e.g. isolated unit tests), that same in-memory path is used.\n */\n\nimport { type AgentRuntime, logger } from \"@elizaos/core\";\n\nimport {\n durableReplayAbortReservation,\n durableReplayCommitReservation,\n durableReplayTryReserve,\n} from \"./x402-replay-durable.js\";\n\nconst inflight = new Set<string>();\nconst consumedMemory = new Map<string, number>();\nconst durableReservationOwners = new Map<string, string>();\n\nfunction replayWindowMs(): number {\n const raw =\n process.env.X402_REPLAY_WINDOW_MS ?? process.env.X402_REPLAY_TTL_MS;\n const n = Number.parseInt(raw ?? \"600000\", 10);\n return Number.isFinite(n) && n > 0 ? n : 600_000;\n}\n\nfunction pruneConsumedMemory(now: number): void {\n for (const [k, exp] of consumedMemory) {\n if (exp <= now) consumedMemory.delete(k);\n }\n}\n\n/** When true (default), use runtime cache for consumed credentials. */\nexport function isDurableReplayEnabled(): boolean {\n const v = process.env.X402_REPLAY_DURABLE?.trim().toLowerCase();\n if (v === \"0\" || v === \"false\" || v === \"off\") return false;\n return true;\n}\n\n/**\n * Reserve canonical replay keys for the duration of verification.\n * Returns false if any key is already consumed, or already in-flight in this process.\n */\nexport async function replayGuardTryBegin(\n keys: string[],\n runtime?: AgentRuntime,\n agentId?: string,\n): Promise<boolean> {\n if (keys.length === 0) return true;\n const now = Date.now();\n const useDurable = isDurableReplayEnabled() && runtime != null;\n\n try {\n let durableOwner: string | null = null;\n if (useDurable) {\n const reservation = await durableReplayTryReserve(runtime, agentId, keys);\n if (!reservation.ok) return false;\n durableOwner = reservation.owner;\n } else {\n pruneConsumedMemory(now);\n for (const k of keys) {\n const exp = consumedMemory.get(k);\n if (exp != null && exp > now) return false;\n }\n }\n\n for (const k of keys) {\n if (inflight.has(k)) {\n // Already in-flight in this process — release the durable reservation\n // we just took so it does not linger until TTL expiry and block\n // subsequent legitimate attempts for the same credential.\n if (durableOwner && runtime) {\n await durableReplayAbortReservation(\n runtime,\n agentId,\n keys,\n durableOwner,\n );\n }\n return false;\n }\n }\n if (durableOwner) {\n for (const k of keys) durableReservationOwners.set(k, durableOwner);\n }\n for (const k of keys) inflight.add(k);\n return true;\n } catch (err) {\n logger.error(\n `[x402] replayGuardTryBegin failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return false;\n }\n}\n\n/** Release reservation after a failed or abandoned verification attempt. */\nexport function replayGuardAbort(keys: string[]): void {\n for (const k of keys) {\n inflight.delete(k);\n durableReservationOwners.delete(k);\n }\n}\n\n/** Release a durable reservation after a failed or abandoned verification attempt. */\nexport async function replayGuardAbortAsync(\n keys: string[],\n runtime?: AgentRuntime,\n agentId?: string,\n): Promise<void> {\n const owner = keys\n .map((k) => durableReservationOwners.get(k))\n .find((x): x is string => typeof x === \"string\");\n replayGuardAbort(keys);\n if (owner && runtime) {\n await durableReplayAbortReservation(runtime, agentId, keys, owner);\n }\n}\n\n/** Mark keys consumed after a successful verification (clears in-flight). */\nexport async function replayGuardCommit(\n keys: string[],\n runtime?: AgentRuntime,\n agentId?: string,\n): Promise<void> {\n const useDurable = isDurableReplayEnabled() && runtime != null;\n const exp = Date.now() + replayWindowMs();\n // Require all keys to map to the same owner. If owners diverge, the\n // in-process map raced with another request — drop the owner so the durable\n // layer skips the owner-bound path instead of recording wrong lineage.\n let owner: string | undefined;\n let ownerConsistent = true;\n for (const k of keys) {\n const o = durableReservationOwners.get(k);\n if (typeof o !== \"string\") continue;\n if (owner === undefined) {\n owner = o;\n } else if (owner !== o) {\n ownerConsistent = false;\n break;\n }\n }\n for (const k of keys) {\n inflight.delete(k);\n durableReservationOwners.delete(k);\n }\n if (useDurable && keys.length > 0 && runtime) {\n await durableReplayCommitReservation(\n runtime,\n agentId,\n keys,\n ownerConsistent ? owner : undefined,\n );\n } else if (!useDurable) {\n for (const k of keys) consumedMemory.set(k, exp);\n }\n}\n",
10
+ "import { createHash, randomUUID } from \"node:crypto\";\nimport { type AgentRuntime, logger } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\n\nfunction sha256Utf8(s: string): string {\n return createHash(\"sha256\").update(s, \"utf8\").digest(\"hex\");\n}\n\n/** Stored in the runtime cache while verification owns a durable reservation. */\nexport type X402ReplayInflightPayload = {\n state: \"inflight\";\n owner: string;\n reservedAt: number;\n expiresAt: number;\n};\n\n/** Stored in the runtime cache after a successful payment verification. */\nexport type X402ReplayConsumedPayload = {\n state: \"consumed\";\n consumedAt: number;\n};\n\nexport type X402ReplayPayload =\n | X402ReplayInflightPayload\n | X402ReplayConsumedPayload;\n\nexport type DurableReplayReservation =\n | { ok: true; owner: string; atomic: boolean }\n | { ok: false };\n\ntype QueryableDb = {\n execute: (query: unknown) => Promise<unknown>;\n};\n\n/**\n * Stable cache key for a replay credential, scoped by agent so two agents never\n * share the same cache row.\n */\nexport function durableReplayCacheKey(\n agentId: string | undefined,\n replayKey: string,\n): string {\n const agent = agentId && agentId.trim().length > 0 ? agentId.trim() : \"_\";\n return `x402:replay:v1:${sha256Utf8(`${agent}::${replayKey}`)}`;\n}\n\nfunction replayReservationTtlMs(): number {\n const raw = process.env.X402_REPLAY_RESERVATION_TTL_MS;\n const n = Number.parseInt(raw ?? \"120000\", 10);\n return Number.isFinite(n) && n > 0 ? n : 120_000;\n}\n\nfunction resultHadRows(result: unknown): boolean {\n if (Array.isArray(result)) return result.length > 0;\n if (typeof result === \"object\" && result !== null) {\n const rows = (result as { rows?: unknown }).rows;\n if (Array.isArray(rows)) return rows.length > 0;\n const rowCount = (result as { rowCount?: unknown }).rowCount;\n if (typeof rowCount === \"number\") return rowCount > 0;\n }\n return false;\n}\n\nasync function getSqlDb(runtime: AgentRuntime): Promise<QueryableDb | null> {\n const db = await runtime.adapter?.getConnection?.();\n if (\n db &&\n typeof db === \"object\" &&\n typeof (db as { execute?: unknown }).execute === \"function\"\n ) {\n return db as QueryableDb;\n }\n return null;\n}\n\nasync function insertInflightReservation(\n db: QueryableDb,\n agentId: string,\n cacheKey: string,\n payload: X402ReplayInflightPayload,\n): Promise<boolean> {\n const result = await db.execute(sql`\n INSERT INTO cache (key, agent_id, value)\n VALUES (${cacheKey}, ${agentId}, ${JSON.stringify(payload)}::jsonb)\n ON CONFLICT (key, agent_id) DO NOTHING\n RETURNING key\n `);\n return resultHadRows(result);\n}\n\nasync function stealExpiredInflightReservation(\n db: QueryableDb,\n agentId: string,\n cacheKey: string,\n payload: X402ReplayInflightPayload,\n now: number,\n): Promise<boolean> {\n const result = await db.execute(sql`\n UPDATE cache\n SET value = ${JSON.stringify(payload)}::jsonb\n WHERE key = ${cacheKey}\n AND agent_id = ${agentId}\n AND value->>'state' = 'inflight'\n AND COALESCE((value->>'expiresAt')::bigint, 0) <= ${now}\n RETURNING key\n `);\n return resultHadRows(result);\n}\n\nasync function releaseSqlReservations(\n db: QueryableDb,\n agentId: string,\n cacheKeys: string[],\n owner: string,\n): Promise<void> {\n for (const cacheKey of cacheKeys) {\n await db.execute(sql`\n DELETE FROM cache\n WHERE key = ${cacheKey}\n AND agent_id = ${agentId}\n AND value->>'state' = 'inflight'\n AND value->>'owner' = ${owner}\n `);\n }\n}\n\nasync function commitSqlReservations(\n db: QueryableDb,\n agentId: string,\n cacheKeys: string[],\n owner: string,\n): Promise<void> {\n const payload: X402ReplayConsumedPayload = {\n state: \"consumed\",\n consumedAt: Date.now(),\n };\n for (const cacheKey of cacheKeys) {\n const result = await db.execute(sql`\n UPDATE cache\n SET value = ${JSON.stringify(payload)}::jsonb\n WHERE key = ${cacheKey}\n AND agent_id = ${agentId}\n AND value->>'state' = 'inflight'\n AND value->>'owner' = ${owner}\n RETURNING key\n `);\n if (!resultHadRows(result)) {\n logger.error(\n `[x402] durable replay: failed to commit reserved replay key ${cacheKey}`,\n );\n }\n }\n}\n\nfunction isConsumed(value: X402ReplayPayload | undefined): boolean {\n if (!value) return false;\n return value.state === \"consumed\" || \"consumedAt\" in value;\n}\n\nexport async function durableReplayTryReserve(\n runtime: AgentRuntime,\n agentId: string | undefined,\n keys: string[],\n): Promise<DurableReplayReservation> {\n if (keys.length === 0) return { ok: true, owner: randomUUID(), atomic: true };\n\n const db = await getSqlDb(runtime);\n const resolvedAgentId =\n agentId && agentId.trim().length > 0\n ? agentId.trim()\n : runtime.agentId\n ? String(runtime.agentId)\n : undefined;\n\n if (db && resolvedAgentId) {\n const owner = randomUUID();\n const now = Date.now();\n const payload: X402ReplayInflightPayload = {\n state: \"inflight\",\n owner,\n reservedAt: now,\n expiresAt: now + replayReservationTtlMs(),\n };\n const acquired: string[] = [];\n try {\n for (const replayKey of keys) {\n const cacheKey = durableReplayCacheKey(resolvedAgentId, replayKey);\n if (\n (await insertInflightReservation(\n db,\n resolvedAgentId,\n cacheKey,\n payload,\n )) ||\n (await stealExpiredInflightReservation(\n db,\n resolvedAgentId,\n cacheKey,\n payload,\n now,\n ))\n ) {\n acquired.push(cacheKey);\n continue;\n }\n\n await releaseSqlReservations(db, resolvedAgentId, acquired, owner);\n return { ok: false };\n }\n return { ok: true, owner, atomic: true };\n } catch (err) {\n await releaseSqlReservations(db, resolvedAgentId, acquired, owner).catch(\n () => {},\n );\n logger.error(\n `[x402] durable replay: atomic reservation failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return { ok: false };\n }\n }\n\n const owner = randomUUID();\n for (const replayKey of keys) {\n const cacheKey = durableReplayCacheKey(agentId, replayKey);\n const v = await runtime.getCache<X402ReplayPayload>(cacheKey);\n if (isConsumed(v)) return { ok: false };\n if (v?.state === \"inflight\" && v.expiresAt > Date.now()) {\n return { ok: false };\n }\n }\n const now = Date.now();\n const payload: X402ReplayInflightPayload = {\n state: \"inflight\",\n owner,\n reservedAt: now,\n expiresAt: now + replayReservationTtlMs(),\n };\n for (const replayKey of keys) {\n await runtime.setCache(durableReplayCacheKey(agentId, replayKey), payload);\n }\n return { ok: true, owner, atomic: false };\n}\n\nexport async function durableReplayAbortReservation(\n runtime: AgentRuntime,\n agentId: string | undefined,\n keys: string[],\n owner?: string,\n): Promise<void> {\n if (!owner || keys.length === 0) return;\n const db = await getSqlDb(runtime);\n const resolvedAgentId =\n agentId && agentId.trim().length > 0\n ? agentId.trim()\n : runtime.agentId\n ? String(runtime.agentId)\n : undefined;\n if (db && resolvedAgentId) {\n await releaseSqlReservations(\n db,\n resolvedAgentId,\n keys.map((k) => durableReplayCacheKey(resolvedAgentId, k)),\n owner,\n );\n return;\n }\n for (const replayKey of keys) {\n const cacheKey = durableReplayCacheKey(agentId, replayKey);\n const v = await runtime.getCache<X402ReplayPayload>(cacheKey);\n if (v?.state === \"inflight\" && v.owner === owner) {\n await runtime.deleteCache(cacheKey);\n }\n }\n}\n\nexport async function durableReplayCommitReservation(\n runtime: AgentRuntime,\n agentId: string | undefined,\n keys: string[],\n owner?: string,\n): Promise<void> {\n if (keys.length === 0) return;\n const db = await getSqlDb(runtime);\n const resolvedAgentId =\n agentId && agentId.trim().length > 0\n ? agentId.trim()\n : runtime.agentId\n ? String(runtime.agentId)\n : undefined;\n if (db && resolvedAgentId && owner) {\n await commitSqlReservations(\n db,\n resolvedAgentId,\n keys.map((k) => durableReplayCacheKey(resolvedAgentId, k)),\n owner,\n );\n return;\n }\n\n const payload: X402ReplayConsumedPayload = {\n state: \"consumed\",\n consumedAt: Date.now(),\n };\n for (const replayKey of keys) {\n const ok = await runtime.setCache(\n durableReplayCacheKey(agentId, replayKey),\n payload,\n );\n if (!ok) {\n logger.error(\n `[x402] durable replay: setCache failed for replay key ${replayKey.slice(\n 0,\n 80,\n )} (payment may be retryable if this persists)`,\n );\n }\n }\n}\n",
11
+ "import { createHash } from \"node:crypto\";\n\nfunction sha256Utf8(s: string): string {\n return createHash(\"sha256\").update(s, \"utf8\").digest(\"hex\");\n}\n\n/**\n * Replay key for facilitator payment IDs (sanitized id → stable hash).\n */\nexport function paymentIdReplayKey(paymentId: string): string | null {\n const cleaned = paymentId.trim();\n if (!/^[a-zA-Z0-9_-]+$/.test(cleaned) || cleaned.length > 128) return null;\n return `fac:${sha256Utf8(cleaned)}`;\n}\n\nfunction looksMostlyPrintableAscii(s: string): boolean {\n if (!s || s.length > 100_000) return false;\n let ok = 0;\n for (let i = 0; i < s.length; i++) {\n const code = s.charCodeAt(i);\n if (\n code === 9 ||\n code === 10 ||\n code === 13 ||\n (code >= 32 && code < 127)\n ) {\n ok++;\n }\n }\n return ok / s.length > 0.85;\n}\n\nfunction tryBase64Utf8(proof: string): string | null {\n const t = proof.trim();\n if (t.length < 8 || !/^[A-Za-z0-9+/=_-]+$/.test(t.replace(/\\s/g, \"\"))) {\n return null;\n }\n const buf = Buffer.from(t, \"base64\");\n if (buf.length === 0) return null;\n const decoded = buf.toString(\"utf8\");\n if (!decoded || decoded.includes(\"\\0\")) return null;\n if (!looksMostlyPrintableAscii(decoded)) return null;\n return decoded;\n}\n\n/**\n * For route handlers: only treat the proof as base64-wrapped UTF-8 when it passes\n * the same heuristics as replay-key extraction. Raw `0x…` tx hashes and colon proofs\n * stay intact (unlike unconditional `Buffer.from(s, \"base64\")`).\n */\nexport function decodePaymentProofForParsing(proof: string): string {\n return tryBase64Utf8(proof) ?? proof;\n}\n\nfunction addEvmTxHashes(s: string, into: Set<string>): void {\n const matches = s.match(/0x[a-fA-F0-9]{64}/g);\n if (!matches) return;\n for (const h of matches) into.add(`evm-tx:${h.toLowerCase()}`);\n}\n\nfunction addSolanaTxSignatures(s: string, into: Set<string>): void {\n const parts = s.split(\":\");\n if (parts.length >= 3 && parts[0]?.toUpperCase() === \"SOLANA\") {\n const sig = parts[2]?.trim();\n if (sig && /^[1-9A-HJ-NP-Za-km-z]{87,88}$/.test(sig)) {\n into.add(`sol-tx:${sig}`);\n }\n }\n const trimmed = s.trim().split(/\\s+/)[0] ?? \"\";\n if (/^[1-9A-HJ-NP-Za-km-z]{87,88}$/.test(trimmed)) {\n into.add(`sol-tx:${trimmed}`);\n }\n}\n\nfunction addEip712StableKey(s: string, into: Set<string>): void {\n let obj: unknown;\n try {\n obj = JSON.parse(s);\n } catch {\n return;\n }\n if (typeof obj !== \"object\" || obj === null) return;\n const root = obj as Record<string, unknown>;\n const payload = root.payload as Record<string, unknown> | undefined;\n const auth = (payload?.authorization ?? root.authorization) as\n | Record<string, unknown>\n | undefined;\n if (!auth || typeof auth !== \"object\") return;\n const domain = (payload?.domain ?? root.domain) as\n | Record<string, unknown>\n | undefined;\n if (\n typeof auth.from !== \"string\" ||\n typeof auth.to !== \"string\" ||\n typeof auth.value !== \"string\" ||\n typeof auth.nonce !== \"string\"\n ) {\n return;\n }\n const contract =\n domain && typeof domain.verifyingContract === \"string\"\n ? domain.verifyingContract.toLowerCase()\n : \"\";\n const chainId =\n domain && typeof domain.chainId === \"number\" ? domain.chainId : -1;\n const stable = JSON.stringify({\n c: contract,\n ch: chainId,\n f: auth.from.toLowerCase(),\n t: auth.to.toLowerCase(),\n v: auth.value,\n n: auth.nonce,\n });\n into.add(`eip712:${sha256Utf8(stable)}`);\n}\n\n/**\n * Canonical replay keys derivable from a payment proof string (raw or base64-wrapped).\n * Same on-chain tx / Solana signature / EIP-712 intent maps to the same key regardless\n * of outer encoding (e.g. base64 vs plain).\n */\nexport function replayKeysFromProofString(proof: string): string[] {\n const keys = new Set<string>();\n const variants = new Set<string>([proof]);\n const decoded = tryBase64Utf8(proof);\n if (decoded) variants.add(decoded);\n for (const v of variants) {\n addEvmTxHashes(v, keys);\n addSolanaTxSignatures(v, keys);\n addEip712StableKey(v, keys);\n }\n return [...keys];\n}\n\n/**\n * All replay keys to consult before verification and to mark after a successful one.\n */\nexport function collectReplayKeysToCheck(\n paymentProof?: string,\n paymentId?: string,\n): string[] {\n const keys = new Set<string>();\n if (paymentId) {\n const pk = paymentIdReplayKey(paymentId);\n if (pk) keys.add(pk);\n }\n if (paymentProof) {\n for (const k of replayKeysFromProofString(paymentProof)) keys.add(k);\n }\n return [...keys];\n}\n",
12
+ "import type {\n AgentRuntime,\n Character,\n CharacterX402Settings,\n PaymentEnabledRoute,\n X402Config,\n} from \"@elizaos/core\";\n\nexport const X402_EVENT_PAYMENT_VERIFIED = \"PAYMENT_VERIFIED\";\nexport const X402_EVENT_PAYMENT_REQUIRED = \"PAYMENT_REQUIRED\";\n\nfunction readCharacterX402(\n settings: Character[\"settings\"] | undefined,\n): CharacterX402Settings | undefined {\n if (!settings || typeof settings !== \"object\") return undefined;\n const raw = (settings as Record<string, unknown>).x402;\n if (!raw || typeof raw !== \"object\") return undefined;\n return raw as CharacterX402Settings;\n}\n\n/** Resolves `x402: true` / partial route config using `character.settings.x402`. */\nexport function resolveEffectiveX402(\n route: PaymentEnabledRoute,\n runtime: AgentRuntime,\n): X402Config | null {\n const cx = readCharacterX402(runtime.character?.settings);\n const raw = route.x402;\n if (raw === true) {\n if (cx?.defaultPriceInCents == null || !cx.defaultPaymentConfigs?.length)\n return null;\n return {\n priceInCents: cx.defaultPriceInCents,\n paymentConfigs: [...cx.defaultPaymentConfigs],\n };\n }\n if (raw && typeof raw === \"object\") {\n const price = raw.priceInCents ?? cx?.defaultPriceInCents;\n const configs = raw.paymentConfigs ?? cx?.defaultPaymentConfigs;\n if (price == null || !configs?.length) return null;\n return { priceInCents: price, paymentConfigs: [...configs] };\n }\n return null;\n}\n",
13
+ "/**\n * Standard x402 **buyer → seller** payloads carried in `PAYMENT-SIGNATURE`, `X-Payment`,\n * or legacy `X-Payment` headers (often base64-wrapped JSON).\n *\n * **Why this file exists:** the agent historically verified “proof strings” (tx\n * hashes, legacy formats, facilitator payment IDs). Modern clients instead send\n * a structured **payment payload** plus expect the seller to validate it against\n * **payment requirements** through a facilitator (`POST /verify`, `POST /settle`).\n * Centralizing decode, requirement construction, and HTTP calls here keeps\n * `payment-wrapper.ts` readable and avoids duplicating facilitator contracts.\n *\n * **Why verify *and* settle:** authorization-like payloads are not settlement.\n * Unlocking paid HTTP work only after settle succeeds matches facilitator-centric\n * flows and closes the “valid signature, no transfer” gap.\n *\n * **Why URL helpers are flexible:** facilitator vendors mount `/verify` and\n * `/settle` under different prefixes; Eliza Cloud uses `/api/v1/x402/*` while\n * other stacks use a single base URL with trailing paths. Explicit override envs\n * exist so production does not depend on one hardcoded layout.\n */\n\nimport {\n atomicAmountForPriceInCents,\n getPaymentConfig,\n type PaymentConfigDefinition,\n toResourceUrl,\n toX402Network,\n} from \"./payment-config.js\";\nimport type { X402Runtime } from \"./types.js\";\n\n/** Decoded X-Payment body (x402-fetch / CDP-style clients). */\nexport type X402StandardPaymentPayload = {\n x402Version: number;\n accepted: {\n scheme: string;\n network: string;\n asset: string;\n amount?: string;\n maxAmountRequired?: string;\n payTo: string;\n };\n payload: {\n signature: string;\n authorization: {\n from: string;\n to: string;\n value: string;\n validAfter?: string;\n validBefore: string;\n nonce: string;\n };\n };\n};\n\nexport type FacilitatorPaymentRequirements = {\n scheme: string;\n network: string;\n asset: string;\n amount: string;\n payTo: string;\n maxTimeoutSeconds?: number;\n extra?: Record<string, unknown>;\n};\n\nexport type StandardPaymentRequiredAccept = {\n scheme: \"exact\";\n network: string;\n maxAmountRequired: string;\n resource: string;\n description: string;\n mimeType: string;\n payTo: string;\n maxTimeoutSeconds: number;\n asset: string;\n extra?: Record<string, unknown>;\n};\n\nexport type StandardPaymentRequired = {\n x402Version: 2;\n accepts: StandardPaymentRequiredAccept[];\n error?: string;\n};\n\nfunction looksMostlyPrintableAscii(s: string): boolean {\n if (!s || s.length > 100_000) return false;\n let ok = 0;\n for (let i = 0; i < s.length; i++) {\n const code = s.charCodeAt(i);\n if (\n code === 9 ||\n code === 10 ||\n code === 13 ||\n (code >= 32 && code < 127)\n ) {\n ok++;\n }\n }\n return ok / s.length > 0.85;\n}\n\nfunction tryBase64Utf8Json(raw: string): unknown | null {\n const t = raw.trim();\n if (t.length < 8 || !/^[A-Za-z0-9+/=_-]+$/.test(t.replace(/\\s/g, \"\"))) {\n return null;\n }\n const buf = Buffer.from(t, \"base64\");\n if (buf.length === 0) return null;\n const decoded = buf.toString(\"utf8\");\n if (!decoded || decoded.includes(\"\\0\")) return null;\n if (!looksMostlyPrintableAscii(decoded)) return null;\n try {\n return JSON.parse(decoded) as unknown;\n } catch {\n return null;\n }\n}\n\n/**\n * Decode `X-Payment` / `X-PAYMENT` value: base64(JSON) first, then raw JSON.\n */\nexport function decodeXPaymentHeader(raw: string): unknown | null {\n const t = raw.trim();\n if (!t) return null;\n if (t.startsWith(\"{\") || t.startsWith(\"[\")) {\n try {\n return JSON.parse(t) as unknown;\n } catch {\n return null;\n }\n }\n return tryBase64Utf8Json(t);\n}\n\nexport function isX402StandardPaymentPayload(\n v: unknown,\n): v is X402StandardPaymentPayload {\n if (typeof v !== \"object\" || v === null) return false;\n const o = v as Record<string, unknown>;\n if (typeof o.x402Version !== \"number\") return false;\n const acc = o.accepted;\n if (typeof acc !== \"object\" || acc === null) return false;\n const a = acc as Record<string, unknown>;\n if (typeof a.scheme !== \"string\") return false;\n if (typeof a.network !== \"string\") return false;\n if (typeof a.asset !== \"string\") return false;\n if (typeof a.amount !== \"string\" && typeof a.maxAmountRequired !== \"string\") {\n return false;\n }\n if (typeof a.payTo !== \"string\") return false;\n const pl = o.payload;\n if (typeof pl !== \"object\" || pl === null) return false;\n const p = pl as Record<string, unknown>;\n if (typeof p.signature !== \"string\") return false;\n const auth = p.authorization;\n if (typeof auth !== \"object\" || auth === null) return false;\n const u = auth as Record<string, unknown>;\n return (\n typeof u.from === \"string\" &&\n typeof u.to === \"string\" &&\n typeof u.value === \"string\" &&\n typeof u.nonce === \"string\" &&\n typeof u.validBefore === \"string\"\n );\n}\n\nexport function toStandardNetwork(\n network: PaymentConfigDefinition[\"network\"],\n): string {\n if (network === \"BASE\") return \"eip155:8453\";\n if (network === \"POLYGON\") return \"eip155:137\";\n if (network === \"BSC\") return \"eip155:56\";\n return \"solana:mainnet\";\n}\n\nfunction acceptedNetworkMatches(\n acceptedNetwork: string,\n cfg: PaymentConfigDefinition,\n): boolean {\n const n = acceptedNetwork.trim();\n if (cfg.network === \"SOLANA\") {\n return (\n n === \"solana\" ||\n n === \"solana:mainnet\" ||\n n === \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\" ||\n n.toLowerCase().includes(\"solana\")\n );\n }\n const caip = toStandardNetwork(cfg.network);\n const short = toX402Network(cfg.network);\n return n === caip || n.toLowerCase() === short || n === `caip2:${caip}`;\n}\n\nfunction assetMatchesAccepted(\n acceptedAsset: string,\n cfg: PaymentConfigDefinition,\n): boolean {\n const a = acceptedAsset.trim().toLowerCase();\n const ref = cfg.assetReference.trim().toLowerCase();\n if (a === ref) return true;\n if (a.includes(ref)) return true;\n if (ref.includes(a) && a.startsWith(\"0x\")) return true;\n return false;\n}\n\nexport function standardAssetForConfig(cfg: PaymentConfigDefinition): string {\n if (cfg.assetNamespace === \"erc20\") {\n return cfg.assetReference;\n }\n return cfg.assetReference;\n}\n\nexport function buildStandardPaymentRequiredAccept(params: {\n routePath: string;\n description: string;\n priceInCents: number;\n configName: string;\n agentId?: string;\n}): StandardPaymentRequiredAccept {\n const cfg = getPaymentConfig(params.configName, params.agentId);\n const maxAmountRequired = atomicAmountForPriceInCents(\n params.priceInCents,\n cfg,\n );\n const extra: Record<string, unknown> = {\n name:\n cfg.symbol?.toUpperCase() === \"USDC\" ? \"USD Coin\" : cfg.symbol || \"Token\",\n version: \"2\",\n paymentConfig: params.configName,\n };\n return {\n scheme: \"exact\",\n network: toStandardNetwork(cfg.network),\n maxAmountRequired,\n resource: toResourceUrl(params.routePath),\n description: params.description,\n mimeType: \"application/json\",\n payTo: cfg.paymentAddress,\n maxTimeoutSeconds: 300,\n asset: standardAssetForConfig(cfg),\n extra,\n };\n}\n\nexport function buildStandardPaymentRequired(params: {\n routePath: string;\n description: string;\n priceInCents: number;\n paymentConfigNames: string[];\n agentId?: string;\n error?: string;\n}): StandardPaymentRequired {\n return {\n x402Version: 2,\n error: params.error,\n accepts: params.paymentConfigNames.map((configName) =>\n buildStandardPaymentRequiredAccept({\n routePath: params.routePath,\n description: params.description,\n priceInCents: params.priceInCents,\n configName,\n agentId: params.agentId,\n }),\n ),\n };\n}\n\n/**\n * Build facilitator `paymentRequirements` for this route/config (must match what we advertise in `accepts`).\n */\nexport function buildFacilitatorPaymentRequirements(params: {\n routePath: string;\n priceInCents: number;\n configName: string;\n agentId?: string;\n}): FacilitatorPaymentRequirements {\n const cfg = getPaymentConfig(params.configName, params.agentId);\n const amount = atomicAmountForPriceInCents(params.priceInCents, cfg);\n const network = toStandardNetwork(cfg.network);\n return {\n scheme: \"exact\",\n network,\n asset: standardAssetForConfig(cfg),\n amount,\n payTo: cfg.paymentAddress,\n maxTimeoutSeconds: 300,\n extra: {\n name:\n cfg.symbol?.toUpperCase() === \"USDC\"\n ? \"USD Coin\"\n : cfg.symbol || \"Token\",\n version: \"2\",\n resource: toResourceUrl(params.routePath),\n },\n };\n}\n\nexport function findMatchingPaymentConfigForStandardPayload(\n payload: X402StandardPaymentPayload,\n paymentConfigNames: string[],\n priceInCents: number,\n agentId?: string,\n): { name: string; cfg: PaymentConfigDefinition } | null {\n const { accepted } = payload;\n if (accepted.scheme !== \"exact\" && accepted.scheme !== \"upto\") {\n return null;\n }\n const acceptedAmount = accepted.amount ?? accepted.maxAmountRequired;\n if (!acceptedAmount) return null;\n let payAmount: bigint;\n try {\n payAmount = BigInt(acceptedAmount);\n } catch {\n return null;\n }\n\n for (const name of paymentConfigNames) {\n const cfg = getPaymentConfig(name, agentId);\n if (!acceptedNetworkMatches(accepted.network, cfg)) continue;\n if (!assetMatchesAccepted(accepted.asset, cfg)) continue;\n if (\n accepted.payTo.trim().toLowerCase() !==\n cfg.paymentAddress.trim().toLowerCase()\n ) {\n continue;\n }\n const required = BigInt(atomicAmountForPriceInCents(priceInCents, cfg));\n if (payAmount < required) continue;\n return { name, cfg };\n }\n return null;\n}\n\n/**\n * Resolve facilitator HTTP endpoints without assuming one vendor’s URL layout.\n *\n * **Why the branching:** Eliza Cloud historically exposed `/api/facilitator` while\n * verify/settle live under `/api/v1/x402/*`; other deployments use a single base\n * with `/verify` and `/settle`. The logic below preserves backwards compatibility\n * and still supports plain base URLs.\n */\nfunction getFacilitatorEndpoint(\n runtime: X402Runtime,\n endpoint: \"verify\" | \"settle\",\n): string | null {\n const explicit = runtime.getSetting(\n endpoint === \"verify\"\n ? \"X402_FACILITATOR_VERIFY_URL\"\n : \"X402_FACILITATOR_SETTLE_URL\",\n );\n if (typeof explicit === \"string\" && explicit.trim()) {\n return explicit.trim().replace(/\\/$/, \"\");\n }\n const fuSetting = runtime.getSetting(\"X402_FACILITATOR_URL\");\n const fu =\n typeof fuSetting === \"string\" && fuSetting.trim()\n ? fuSetting.trim()\n : \"https://x402.elizacloud.ai/api/v1/x402\";\n try {\n const clean = fu.replace(/\\/$/, \"\");\n const u = new URL(clean);\n if (u.pathname.endsWith(\"/api/facilitator\")) {\n return `${u.origin}/api/v1/x402/${endpoint}`;\n }\n if (u.pathname.endsWith(`/${endpoint}`)) return clean;\n return `${clean}/${endpoint}`;\n } catch {\n return null;\n }\n}\n\nexport function getFacilitatorVerifyPostUrl(\n runtime: X402Runtime,\n): string | null {\n return getFacilitatorEndpoint(runtime, \"verify\");\n}\n\nexport function getFacilitatorSettlePostUrl(\n runtime: X402Runtime,\n): string | null {\n return getFacilitatorEndpoint(runtime, \"settle\");\n}\n\nexport type FacilitatorVerifyPostResult =\n | { ok: true; payer?: string }\n | { ok: false; invalidReason?: string };\n\nexport type FacilitatorSettlePostResult =\n | { ok: true; paymentResponse: string; transaction?: string; payer?: string }\n | { ok: false; invalidReason?: string };\n\n/**\n * POST `{ paymentPayload, paymentRequirements }` to facilitator verify (Eliza Cloud–compatible).\n */\nexport async function verifyPaymentPayloadViaFacilitatorPost(\n runtime: X402Runtime,\n paymentPayload: X402StandardPaymentPayload,\n paymentRequirements: FacilitatorPaymentRequirements,\n): Promise<FacilitatorVerifyPostResult> {\n const url = getFacilitatorVerifyPostUrl(runtime);\n if (!url) {\n return { ok: false, invalidReason: \"no_facilitator_verify_url\" };\n }\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"ElizaOS-X402-Agent/1.0\",\n },\n body: JSON.stringify({ paymentPayload, paymentRequirements }),\n signal: AbortSignal.timeout(15_000),\n });\n const text = await res.text();\n let body: { isValid?: boolean; payer?: string; invalidReason?: string } =\n {};\n if (text) {\n try {\n body = JSON.parse(text) as typeof body;\n } catch {\n return { ok: false, invalidReason: \"invalid_verify_response_json\" };\n }\n }\n if (!res.ok && res.status !== 400) {\n return {\n ok: false,\n invalidReason: `verify_http_${res.status}`,\n };\n }\n if (body.isValid === true) {\n return { ok: true, payer: body.payer };\n }\n return {\n ok: false,\n invalidReason: body.invalidReason ?? \"verify_rejected\",\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, invalidReason: `verify_fetch_error:${msg}` };\n }\n}\n\nexport async function settlePaymentPayloadViaFacilitatorPost(\n runtime: X402Runtime,\n paymentPayload: X402StandardPaymentPayload,\n paymentRequirements: FacilitatorPaymentRequirements,\n): Promise<FacilitatorSettlePostResult> {\n const url = getFacilitatorSettlePostUrl(runtime);\n if (!url) {\n return { ok: false, invalidReason: \"no_facilitator_settle_url\" };\n }\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"ElizaOS-X402-Agent/1.0\",\n },\n body: JSON.stringify({ paymentPayload, paymentRequirements }),\n signal: AbortSignal.timeout(30_000),\n });\n const text = await res.text();\n let body: Record<string, unknown> = {};\n if (text) {\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n return { ok: false, invalidReason: \"invalid_settle_response_json\" };\n }\n }\n\n if (!res.ok) {\n return {\n ok: false,\n invalidReason:\n typeof body.errorReason === \"string\"\n ? body.errorReason\n : typeof body.invalidReason === \"string\"\n ? body.invalidReason\n : `settle_http_${res.status}`,\n };\n }\n\n // Must match verify semantics: do not treat bare HTTP 200 or `{}` as\n // settlement. Require explicit `success: true` or `isValid: true` (some\n // facilitators return `{ success: false }` on 200 for business errors).\n const explicitFailure = body.success === false || body.isValid === false;\n const explicitSuccess = body.success === true || body.isValid === true;\n const success = !explicitFailure && explicitSuccess;\n if (!success) {\n return {\n ok: false,\n invalidReason:\n typeof body.errorReason === \"string\"\n ? body.errorReason\n : typeof body.invalidReason === \"string\"\n ? body.invalidReason\n : `settle_http_${res.status}`,\n };\n }\n\n const paymentResponse = Buffer.from(JSON.stringify(body), \"utf8\").toString(\n \"base64\",\n );\n return {\n ok: true,\n paymentResponse,\n transaction:\n typeof body.transaction === \"string\" ? body.transaction : undefined,\n payer: typeof body.payer === \"string\" ? body.payer : undefined,\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return { ok: false, invalidReason: `settle_fetch_error:${msg}` };\n }\n}\n",
14
+ "/**\n * x402scan Validation Schema Types\n * Stricter schema required for listing on x402scan\n * Allows UI-based resource invocation\n */\n\n/**\n * Field definition for input/output schema\n */\nexport type FieldDef = {\n type?: string;\n required?: boolean | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, FieldDef>; // for nested objects\n};\n\n/**\n * JSON Schema type for API output\n */\nexport type OutputSchemaType = {\n type?: \"object\" | \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n description?: string;\n properties?: Record<string, FieldDef>;\n items?: FieldDef;\n};\n\n/**\n * Output schema describing input and output expectations for the paid endpoint\n */\nexport type OutputSchema = {\n input: {\n type: \"http\";\n method: \"GET\" | \"POST\";\n bodyType?: \"json\" | \"form-data\" | \"multipart-form-data\" | \"text\" | \"binary\";\n pathParams?: Record<string, FieldDef>;\n queryParams?: Record<string, FieldDef>;\n bodyFields?: Record<string, FieldDef>;\n headerFields?: Record<string, FieldDef>;\n };\n output?: OutputSchemaType;\n};\n\n/**\n * Valid x402scan network types (as per their API specification)\n */\nexport type X402ScanNetwork =\n | \"base-sepolia\"\n | \"base\"\n | \"avalanche-fuji\"\n | \"avalanche\"\n | \"iotex\"\n | \"solana-devnet\"\n | \"solana\"\n | \"sei\"\n | \"sei-testnet\"\n | \"polygon\"\n | \"polygon-amoy\"\n | \"bsc\"\n | \"bsc-testnet\"\n | \"peaq\";\n\n/**\n * EIP-712 domain information for EVM chains\n */\nexport type EIP712DomainInfo = {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n};\n\n/**\n * Extra metadata for payment configuration\n */\nexport type PaymentExtraMetadata = {\n priceInCents: number;\n priceUSD: string;\n symbol: string;\n paymentConfig: string;\n expiresIn: number;\n name?: string;\n version?: string;\n eip712Domain?: EIP712DomainInfo;\n [key: string]: string | number | EIP712DomainInfo | undefined;\n};\n\n/**\n * Accepts object defining payment terms for a resource\n */\nexport type Accepts = {\n scheme: \"exact\";\n network: X402ScanNetwork;\n maxAmountRequired: string;\n resource: string; // Must be a full URL (https://...)\n description: string;\n mimeType: string;\n payTo: string; // Wallet address - must be valid for the network\n maxTimeoutSeconds: number;\n asset: string;\n\n // Optional schema describing the input and output expectations\n outputSchema?: OutputSchema;\n\n // Optional additional custom data\n extra?: PaymentExtraMetadata;\n};\n\n/**\n * X402 Response structure\n */\nexport type X402Response = {\n x402Version: number;\n error?: string;\n accepts?: Array<Accepts>;\n payer?: string;\n};\n\n/**\n * Validation result type\n */\nexport type ValidationResult = {\n valid: boolean;\n errors: string[];\n};\n\n/**\n * Valid x402scan networks\n */\nconst VALID_NETWORKS: X402ScanNetwork[] = [\n \"base-sepolia\",\n \"base\",\n \"avalanche-fuji\",\n \"avalanche\",\n \"iotex\",\n \"solana-devnet\",\n \"solana\",\n \"sei\",\n \"sei-testnet\",\n \"polygon\",\n \"polygon-amoy\",\n \"bsc\",\n \"bsc-testnet\",\n \"peaq\",\n];\n\n/**\n * Validate URL format\n */\nfunction isValidUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\n/**\n * Validate wallet address format based on network\n */\nfunction isValidWalletAddress(\n address: string,\n network: X402ScanNetwork,\n): boolean {\n if (!address || typeof address !== \"string\") return false;\n\n // Solana addresses are base58 encoded, typically 32-44 characters\n if (network.includes(\"solana\")) {\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\n }\n\n // EVM-compatible chains use 0x addresses\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Validate that an Accepts object conforms to the x402scan schema\n */\nexport function validateAccepts(accepts: Partial<Accepts>): ValidationResult {\n const errors: string[] = [];\n\n // Required fields\n if (accepts.scheme !== \"exact\") {\n errors.push('scheme must be \"exact\"');\n }\n\n if (\n !accepts.network ||\n !VALID_NETWORKS.includes(accepts.network as X402ScanNetwork)\n ) {\n errors.push(`network must be one of: ${VALID_NETWORKS.join(\", \")}`);\n }\n\n if (\n !accepts.maxAmountRequired ||\n typeof accepts.maxAmountRequired !== \"string\"\n ) {\n errors.push(\"maxAmountRequired is required and must be a string\");\n }\n\n if (!accepts.resource || typeof accepts.resource !== \"string\") {\n errors.push(\"resource is required and must be a string (full URL)\");\n } else if (!isValidUrl(accepts.resource)) {\n errors.push(\n \"resource must be a valid URL (must start with http:// or https://)\",\n );\n }\n\n if (!accepts.description || typeof accepts.description !== \"string\") {\n errors.push(\"description is required and must be a string\");\n }\n\n if (!accepts.mimeType || typeof accepts.mimeType !== \"string\") {\n errors.push(\n 'mimeType is required and must be a string (e.g., \"application/json\")',\n );\n }\n\n if (!accepts.payTo || typeof accepts.payTo !== \"string\") {\n errors.push(\"payTo is required and must be a string (wallet address)\");\n } else if (\n accepts.network &&\n !isValidWalletAddress(accepts.payTo, accepts.network as X402ScanNetwork)\n ) {\n errors.push(\n `payTo must be a valid wallet address for network ${accepts.network}`,\n );\n }\n\n if (\n !accepts.maxTimeoutSeconds ||\n typeof accepts.maxTimeoutSeconds !== \"number\"\n ) {\n errors.push(\"maxTimeoutSeconds is required and must be a number\");\n }\n\n if (!accepts.asset || typeof accepts.asset !== \"string\") {\n errors.push('asset is required and must be a string (e.g., \"USDC\", \"ETH\")');\n }\n\n // Validate outputSchema if present\n if (accepts.outputSchema) {\n const schema = accepts.outputSchema;\n\n if (schema.input.type !== \"http\") {\n errors.push('outputSchema.input.type must be \"http\"');\n }\n\n if (\n !schema.input.method ||\n ![\"GET\", \"POST\"].includes(schema.input.method)\n ) {\n errors.push('outputSchema.input.method must be \"GET\" or \"POST\"');\n }\n\n if (schema.input.bodyType) {\n const validBodyTypes = [\n \"json\",\n \"form-data\",\n \"multipart-form-data\",\n \"text\",\n \"binary\",\n ];\n if (!validBodyTypes.includes(schema.input.bodyType)) {\n errors.push(\n `outputSchema.input.bodyType must be one of: ${validBodyTypes.join(\", \")}`,\n );\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Validate that an X402Response conforms to the x402scan schema\n */\nexport function validateX402Response(\n response: Partial<X402Response>,\n): ValidationResult {\n const errors: string[] = [];\n\n // x402Version is required\n if (typeof response.x402Version !== \"number\") {\n errors.push(\"x402Version is required and must be a number\");\n }\n\n // If accepts is provided, validate each entry\n if (response.accepts) {\n if (!Array.isArray(response.accepts)) {\n errors.push(\"accepts must be an array\");\n } else {\n response.accepts.forEach((accepts, index) => {\n const validation = validateAccepts(accepts);\n if (!validation.valid) {\n errors.push(`accepts[${index}]: ${validation.errors.join(\", \")}`);\n }\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Create a validated Accepts object with sensible defaults\n */\nexport function createAccepts(params: {\n network: X402ScanNetwork;\n maxAmountRequired: string;\n resource: string;\n description: string;\n payTo: string;\n asset: string;\n mimeType?: string;\n maxTimeoutSeconds?: number;\n outputSchema?: OutputSchema;\n extra?: PaymentExtraMetadata;\n}): Accepts {\n const accepts: Accepts = {\n scheme: \"exact\",\n network: params.network,\n maxAmountRequired: params.maxAmountRequired,\n resource: params.resource,\n description: params.description,\n mimeType: params.mimeType || \"application/json\",\n payTo: params.payTo,\n maxTimeoutSeconds: params.maxTimeoutSeconds || 300, // 5 minutes default\n asset: params.asset,\n };\n\n if (params.outputSchema) {\n accepts.outputSchema = params.outputSchema;\n }\n\n if (params.extra) {\n accepts.extra = params.extra;\n }\n\n // Validate before returning\n const validation = validateAccepts(accepts);\n if (!validation.valid) {\n throw new Error(`Invalid Accepts object: ${validation.errors.join(\", \")}`);\n }\n\n return accepts;\n}\n\n/**\n * Create a validated X402Response\n */\nexport function createX402Response(params: {\n accepts?: Accepts[];\n error?: string;\n payer?: string;\n}): X402Response {\n const response: X402Response = {\n x402Version: 1,\n ...params,\n };\n\n // Validate before returning\n const validation = validateX402Response(response);\n if (!validation.valid) {\n throw new Error(`Invalid X402Response: ${validation.errors.join(\", \")}`);\n }\n\n return response;\n}\n",
15
+ "/**\n * x402 Payment Middleware for ElizaOS\n *\n * Provides micropayment protection for plugin routes using the x402 protocol.\n *\n * **Why this module exists (product):** plugin authors should declare `x402` on\n * routes and get a consistent gate—402 with payment options, verification, and\n * optional facilitator settlement—without reimplementing payment math, replay\n * safety, or HTTP header quirks in every plugin.\n *\n * **Why both “legacy JSON 402” and V2 headers:** older clients and scanners read\n * the JSON body; protocol V2 buyers read `PAYMENT-REQUIRED` / `PAYMENT-RESPONSE`.\n * Serving both avoids breaking existing integrations while still interoperating\n * with modern wallets.\n *\n * @example\n * ```typescript\n * import { applyPaymentProtection } from '@elizaos/plugin-x402';\n *\n * // In your plugin:\n * export const routes: Route[] = [\n * {\n * type: 'GET',\n * path: '/api/analytics/trending',\n * public: true,\n * x402: {\n * priceInCents: 10,\n * paymentConfigs: ['base_usdc', 'solana_usdc']\n * },\n * handler: async (req, res, runtime) => {\n * // Your handler logic\n * }\n * }\n * ];\n * ```\n */\n\nexport type {\n BuiltInPaymentConfig,\n CharacterX402Settings,\n PaymentEnabledRoute,\n X402Config,\n X402RequestValidator,\n X402ValidationResult,\n} from \"@elizaos/core\";\n\nexport type { Network } from \"./payment-config.js\";\nexport {\n atomicAmountForPriceInCents,\n BUILT_IN_NETWORKS,\n getBaseUrl,\n getPaymentAddress,\n getPaymentConfig,\n getX402Health,\n listX402Configs,\n PAYMENT_ADDRESSES,\n PAYMENT_CONFIGS,\n type PaymentConfigDefinition,\n registerX402Config,\n toResourceUrl,\n toX402Network,\n} from \"./payment-config.js\";\nexport {\n applyPaymentProtection,\n createPaymentAwareHandler,\n isRoutePaymentWrapped,\n X402_ROUTE_PAYMENT_WRAPPED,\n} from \"./payment-wrapper.js\";\nexport {\n type StartupValidationResult,\n validateAndThrowIfInvalid,\n validateX402Startup,\n} from \"./startup-validator.js\";\nexport {\n resolveEffectiveX402,\n X402_EVENT_PAYMENT_REQUIRED,\n X402_EVENT_PAYMENT_VERIFIED,\n} from \"./x402-resolve.js\";\n\nexport {\n type Accepts,\n createAccepts,\n createX402Response,\n type OutputSchema,\n validateAccepts,\n validateX402Response,\n type X402Response,\n type X402ScanNetwork,\n} from \"./x402-types.js\";\n\nimport type { Plugin } from \"@elizaos/core\";\n\n/**\n * elizaOS plugin descriptor for x402.\n *\n * The middleware exported above is the actual integration surface — plugins\n * declare `x402` on their routes and the agent's HTTP dispatch wraps them via\n * `applyPaymentProtection` / `createPaymentAwareHandler`. This Plugin object\n * exists so the runtime's plugin loader can register `@elizaos/plugin-x402` as\n * a first-class auto-loadable plugin (config: `x402.enabled`).\n */\nconst x402Plugin: Plugin = {\n name: \"x402\",\n description:\n \"x402 micropayment middleware for elizaOS plugin HTTP routes (HTTP 402 / payment-required).\",\n actions: [],\n providers: [],\n evaluators: [],\n services: [],\n // Middleware-only plugin no service instances or persistent resources to dispose.\n dispose: async (_runtime) => {},\n};\n\nexport default x402Plugin;\nexport { x402Plugin };\n"
23
16
  ],
24
- "mappings": "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",
25
- "debugId": "2EC8B924AB46A7D764756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "9C2A4CF3E2DCA87864756E2164756E21",
26
19
  "names": []
27
20
  }