@elizaos/plugin-x402 2.0.0-alpha.1 → 2.0.0-alpha.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.
@@ -577,6 +577,9 @@ Payments: Inactive (no wallet configured)`,
577
577
  }
578
578
  };
579
579
 
580
+ // routes/agent-card.ts
581
+ import { logger as logger4 } from "@elizaos/core";
582
+
580
583
  // networks.ts
581
584
  var NETWORK_REGISTRY = {
582
585
  base: {
@@ -585,7 +588,8 @@ var NETWORK_REGISTRY = {
585
588
  name: "Base",
586
589
  usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
587
590
  usdcDomainName: "USDC",
588
- usdcPermitVersion: "2"
591
+ usdcPermitVersion: "2",
592
+ rpcUrl: "https://mainnet.base.org"
589
593
  },
590
594
  "base-sepolia": {
591
595
  caip2: "eip155:84532",
@@ -593,7 +597,8 @@ var NETWORK_REGISTRY = {
593
597
  name: "Base Sepolia",
594
598
  usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
595
599
  usdcDomainName: "USDC",
596
- usdcPermitVersion: "2"
600
+ usdcPermitVersion: "2",
601
+ rpcUrl: "https://sepolia.base.org"
597
602
  },
598
603
  ethereum: {
599
604
  caip2: "eip155:1",
@@ -601,7 +606,8 @@ var NETWORK_REGISTRY = {
601
606
  name: "Ethereum",
602
607
  usdcAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
603
608
  usdcDomainName: "USD Coin",
604
- usdcPermitVersion: "2"
609
+ usdcPermitVersion: "2",
610
+ rpcUrl: "https://cloudflare-eth.com"
605
611
  },
606
612
  sepolia: {
607
613
  caip2: "eip155:11155111",
@@ -609,7 +615,8 @@ var NETWORK_REGISTRY = {
609
615
  name: "Sepolia",
610
616
  usdcAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
611
617
  usdcDomainName: "USDC",
612
- usdcPermitVersion: "2"
618
+ usdcPermitVersion: "2",
619
+ rpcUrl: "https://rpc.sepolia.org"
613
620
  }
614
621
  };
615
622
  function resolveNetwork(key) {
@@ -643,8 +650,10 @@ async function handleAgentCard(req, res, runtime) {
643
650
  try {
644
651
  const networkInfo = resolveNetwork(networkKey);
645
652
  caip2Network = networkInfo.caip2;
646
- } catch {
653
+ } catch (err) {
647
654
  caip2Network = networkKey;
655
+ const msg = err instanceof Error ? err.message : String(err);
656
+ logger4.warn("[x402] Agent card: could not resolve network '" + networkKey + "': " + msg);
648
657
  }
649
658
  const character = runtime.character;
650
659
  const agentName = character?.name ?? "ElizaOS Agent";
@@ -706,9 +715,10 @@ var agentCardRoute = {
706
715
 
707
716
  // services/x402-service.ts
708
717
  import { Service } from "@elizaos/core";
709
- import { logger as logger4 } from "@elizaos/core";
718
+ import { logger as logger5 } from "@elizaos/core";
710
719
 
711
720
  // client/signer.ts
721
+ import { createPublicClient, http } from "viem";
712
722
  import { privateKeyToAccount } from "viem/accounts";
713
723
  var PERMIT_TYPES = {
714
724
  Permit: [
@@ -761,12 +771,35 @@ class EvmPaymentSigner {
761
771
  const v = parseInt(raw.slice(128, 130), 16);
762
772
  return { v, r, s };
763
773
  }
774
+ async queryOnChainNonce(usdcAddress, rpcUrl, chainId) {
775
+ const client = createPublicClient({
776
+ transport: http(rpcUrl)
777
+ });
778
+ const result = await client.readContract({
779
+ address: usdcAddress,
780
+ abi: [{
781
+ inputs: [{ name: "owner", type: "address" }],
782
+ name: "nonces",
783
+ outputs: [{ name: "", type: "uint256" }],
784
+ stateMutability: "view",
785
+ type: "function"
786
+ }],
787
+ functionName: "nonces",
788
+ args: [this.account.address]
789
+ });
790
+ return result;
791
+ }
764
792
  async buildPaymentHeader(requirement) {
765
793
  const networkInfo = resolveNetwork(this.network);
766
794
  const amount = BigInt(requirement.maxAmountRequired);
767
795
  const tokenName = requirement.extra?.name ?? networkInfo.usdcDomainName;
768
796
  const tokenVersion = requirement.extra?.version ?? networkInfo.usdcPermitVersion;
769
- const nonce = BigInt(requirement.extra?.nonce ?? "0");
797
+ let nonce;
798
+ if (requirement.extra?.nonce !== undefined) {
799
+ nonce = BigInt(requirement.extra.nonce);
800
+ } else {
801
+ nonce = await this.queryOnChainNonce(requirement.asset, networkInfo.rpcUrl, networkInfo.chainId);
802
+ }
770
803
  const deadline = BigInt(Math.floor(Date.now() / 1000) + requirement.maxTimeoutSeconds);
771
804
  const spender = requirement.payTo;
772
805
  const domain = {
@@ -840,43 +873,43 @@ function selectPaymentOption(accepts, signerNetworkId) {
840
873
  return matching ?? null;
841
874
  }
842
875
  function createFetchWithPayment(options) {
843
- const { signer, policyEngine, circuitBreaker, storage, logger: logger4 } = options;
876
+ const { signer, policyEngine, circuitBreaker, storage, logger: logger5 } = options;
844
877
  return async function fetchWithPayment(input, init) {
845
878
  const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
846
- logger4.debug(`[x402] Making request to ${url}`);
879
+ logger5.debug(`[x402] Making request to ${url}`);
847
880
  const initialResponse = await fetch(input, init);
848
881
  if (initialResponse.status !== 402) {
849
882
  return initialResponse;
850
883
  }
851
- logger4.info(`[x402] Received 402 Payment Required from ${url}`);
884
+ logger5.info(`[x402] Received 402 Payment Required from ${url}`);
852
885
  const paymentRequired = parsePaymentRequired(initialResponse);
853
886
  if (!paymentRequired) {
854
- logger4.error("[x402] Could not parse payment requirement header from 402 response");
887
+ logger5.error("[x402] Could not parse payment requirement header from 402 response");
855
888
  return initialResponse;
856
889
  }
857
890
  if (!paymentRequired.accepts || paymentRequired.accepts.length === 0) {
858
- logger4.error("[x402] No payment options in 402 response");
891
+ logger5.error("[x402] No payment options in 402 response");
859
892
  return initialResponse;
860
893
  }
861
894
  const requirement = selectPaymentOption(paymentRequired.accepts, signer.networkId);
862
895
  if (!requirement) {
863
- logger4.error("[x402] No compatible payment option found");
896
+ logger5.error("[x402] No compatible payment option found");
864
897
  return initialResponse;
865
898
  }
866
899
  const amount = BigInt(requirement.maxAmountRequired);
867
- logger4.info(`[x402] Payment required: ${amount} to ${requirement.payTo} on ${requirement.network}`);
900
+ logger5.info(`[x402] Payment required: ${amount} to ${requirement.payTo} on ${requirement.network}`);
868
901
  const policyResult = await policyEngine.evaluateOutgoing({
869
902
  amount,
870
903
  recipient: requirement.payTo,
871
904
  resource: url
872
905
  });
873
906
  if (!policyResult.allowed) {
874
- logger4.warn(`[x402] Payment blocked by policy: ${policyResult.reason}`);
907
+ logger5.warn(`[x402] Payment blocked by policy: ${policyResult.reason}`);
875
908
  return initialResponse;
876
909
  }
877
910
  const breakerResult = circuitBreaker.check(amount);
878
911
  if (!breakerResult.allowed) {
879
- logger4.warn(`[x402] Payment blocked by circuit breaker: ${breakerResult.reason}`);
912
+ logger5.warn(`[x402] Payment blocked by circuit breaker: ${breakerResult.reason}`);
880
913
  return initialResponse;
881
914
  }
882
915
  let paymentHeader;
@@ -884,11 +917,11 @@ function createFetchWithPayment(options) {
884
917
  paymentHeader = await signer.buildPaymentHeader(requirement);
885
918
  } catch (err) {
886
919
  const message = err instanceof Error ? err.message : String(err);
887
- logger4.error(`[x402] Failed to sign payment: ${message}`);
920
+ logger5.error(`[x402] Failed to sign payment: ${message}`);
888
921
  circuitBreaker.recordFailure();
889
922
  return initialResponse;
890
923
  }
891
- logger4.info("[x402] Retrying request with X-PAYMENT header");
924
+ logger5.info("[x402] Retrying request with X-PAYMENT header");
892
925
  const retryHeaders = new Headers(init?.headers);
893
926
  retryHeaders.set("X-PAYMENT", paymentHeader);
894
927
  const retryInit = {
@@ -900,7 +933,7 @@ function createFetchWithPayment(options) {
900
933
  retryResponse = await fetch(input, retryInit);
901
934
  } catch (err) {
902
935
  const message = err instanceof Error ? err.message : String(err);
903
- logger4.error(`[x402] Retry request failed: ${message}`);
936
+ logger5.error(`[x402] Retry request failed: ${message}`);
904
937
  circuitBreaker.recordFailure();
905
938
  return initialResponse;
906
939
  }
@@ -924,14 +957,14 @@ function createFetchWithPayment(options) {
924
957
  await storage.recordPayment(record);
925
958
  } catch (err) {
926
959
  const message = err instanceof Error ? err.message : String(err);
927
- logger4.error(`[x402] Failed to record payment: ${message}`);
960
+ logger5.error(`[x402] Failed to record payment: ${message}`);
928
961
  }
929
962
  if (retryResponse.ok) {
930
963
  circuitBreaker.recordSuccess(amount);
931
- logger4.info(`[x402] Payment successful: ${amount} to ${requirement.payTo}`);
964
+ logger5.info(`[x402] Payment successful: ${amount} to ${requirement.payTo}`);
932
965
  } else {
933
966
  circuitBreaker.recordFailure();
934
- logger4.warn(`[x402] Payment request returned ${retryResponse.status} after payment`);
967
+ logger5.warn(`[x402] Payment request returned ${retryResponse.status} after payment`);
935
968
  }
936
969
  return retryResponse;
937
970
  };
@@ -1284,7 +1317,7 @@ class SqlitePaymentStorage {
1284
1317
  let metadata = {};
1285
1318
  try {
1286
1319
  metadata = JSON.parse(row.metadata);
1287
- } catch {}
1320
+ } catch (_metadataParseError) {}
1288
1321
  return {
1289
1322
  id: row.id,
1290
1323
  direction: row.direction,
@@ -1358,23 +1391,23 @@ class X402Service extends Service {
1358
1391
  enabled
1359
1392
  };
1360
1393
  if (!enabled) {
1361
- logger4.info("[x402] Service inactive — no private key configured or explicitly disabled");
1394
+ logger5.info("[x402] Service inactive — no private key configured or explicitly disabled");
1362
1395
  return;
1363
1396
  }
1364
1397
  try {
1365
1398
  resolveNetwork(network);
1366
1399
  } catch (err) {
1367
1400
  const message = err instanceof Error ? err.message : String(err);
1368
- logger4.error(`[x402] Invalid network configuration: ${message}`);
1401
+ logger5.error(`[x402] Invalid network configuration: ${message}`);
1369
1402
  this.serviceConfig.enabled = false;
1370
1403
  return;
1371
1404
  }
1372
1405
  try {
1373
1406
  this.signer = new EvmPaymentSigner(privateKey, network);
1374
- logger4.info(`[x402] Wallet initialized: ${this.signer.address} on ${network}`);
1407
+ logger5.info(`[x402] Wallet initialized: ${this.signer.address} on ${network}`);
1375
1408
  } catch (err) {
1376
1409
  const message = err instanceof Error ? err.message : String(err);
1377
- logger4.error(`[x402] Failed to initialize signer: ${message}`);
1410
+ logger5.error(`[x402] Failed to initialize signer: ${message}`);
1378
1411
  this.serviceConfig.enabled = false;
1379
1412
  return;
1380
1413
  }
@@ -1383,14 +1416,14 @@ class X402Service extends Service {
1383
1416
  if (dbPath) {
1384
1417
  try {
1385
1418
  this.storage = new SqlitePaymentStorage(dbPath);
1386
- logger4.info(`[x402] Using SQLite storage at ${dbPath}`);
1419
+ logger5.info(`[x402] Using SQLite storage at ${dbPath}`);
1387
1420
  } catch (err) {
1388
1421
  const message = err instanceof Error ? err.message : String(err);
1389
- logger4.warn(`[x402] Failed to initialize SQLite storage: ${message}. Falling back to memory storage.`);
1422
+ logger5.warn(`[x402] Failed to initialize SQLite storage: ${message}. Falling back to memory storage.`);
1390
1423
  this.storage = new MemoryPaymentStorage;
1391
1424
  }
1392
1425
  } else {
1393
- logger4.info("[x402] Using in-memory storage (set X402_DB_PATH for persistence)");
1426
+ logger5.info("[x402] Using in-memory storage (set X402_DB_PATH for persistence)");
1394
1427
  }
1395
1428
  const policy = {
1396
1429
  outgoing: {
@@ -1414,12 +1447,12 @@ class X402Service extends Service {
1414
1447
  policyEngine: this.policyEngine,
1415
1448
  circuitBreaker: this.circuitBreaker,
1416
1449
  storage: this.storage,
1417
- logger: logger4
1450
+ logger: logger5
1418
1451
  });
1419
- logger4.info(`[x402] Service active — max per-txn: $${this.serviceConfig.maxPaymentUsd}, max daily: $${this.serviceConfig.maxTotalUsd}`);
1452
+ logger5.info(`[x402] Service active — max per-txn: $${this.serviceConfig.maxPaymentUsd}, max daily: $${this.serviceConfig.maxTotalUsd}`);
1420
1453
  }
1421
1454
  async stop() {
1422
- logger4.info("[x402] Service stopping");
1455
+ logger5.info("[x402] Service stopping");
1423
1456
  this.signer = null;
1424
1457
  this.fetchWithPayment = null;
1425
1458
  }
@@ -1456,7 +1489,7 @@ class X402Service extends Service {
1456
1489
  updatePolicy(policy) {
1457
1490
  if (this.policyEngine) {
1458
1491
  this.policyEngine.updatePolicy(policy);
1459
- logger4.info("[x402] Payment policy updated");
1492
+ logger5.info("[x402] Payment policy updated");
1460
1493
  }
1461
1494
  }
1462
1495
  getWalletAddress() {
@@ -1479,7 +1512,7 @@ class X402Service extends Service {
1479
1512
  }
1480
1513
  resetCircuitBreaker() {
1481
1514
  this.circuitBreaker.reset();
1482
- logger4.info("[x402] Circuit breaker reset");
1515
+ logger5.info("[x402] Circuit breaker reset");
1483
1516
  }
1484
1517
  }
1485
1518
  // middleware/facilitator-client.ts
@@ -1816,7 +1849,7 @@ class PostgresPaymentStorage {
1816
1849
  let metadata = {};
1817
1850
  try {
1818
1851
  metadata = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
1819
- } catch {}
1852
+ } catch (_metadataParseError) {}
1820
1853
  return {
1821
1854
  id: row.id,
1822
1855
  direction: row.direction,
@@ -1913,7 +1946,6 @@ var x402Plugin = {
1913
1946
  X402_MAX_TOTAL_USD: null,
1914
1947
  X402_ENABLED: null
1915
1948
  },
1916
- init: async (_config, _runtime) => {},
1917
1949
  services: [X402Service],
1918
1950
  actions: [payForServiceAction, checkPaymentHistoryAction, setPaymentPolicyAction],
1919
1951
  providers: [paymentBalanceProvider],
@@ -1971,4 +2003,4 @@ export {
1971
2003
  CircuitBreaker
1972
2004
  };
1973
2005
 
1974
- //# debugId=8D689045A014B14A64756E2164756E21
2006
+ //# debugId=1B49A85A0DA39F2364756E2164756E21
@@ -1,27 +1,27 @@
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", "../networks.ts", "../routes/agent-card.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": ["../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"],
4
4
  "sourcesContent": [
5
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: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.isActive();\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
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
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: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.isActive();\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
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: IAgentRuntime): Promise<boolean> => {\n const service = runtime.getService<X402Service>(\"x402_payment\");\n return !!service && service.canMakePayments();\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
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\";\n\nexport const paymentBalanceProvider: Provider = {\n name: \"x402_payment_status\",\n description:\n \"Current x402 payment status including wallet, spending, and earning summary\",\n\n get: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state: State,\n ) => {\n const 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 * 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 },\n \"base-sepolia\": {\n caip2: \"eip155:84532\",\n chainId: 84532,\n name: \"Base Sepolia\",\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n usdcDomainName: \"USDC\",\n usdcPermitVersion: \"2\",\n },\n ethereum: {\n caip2: \"eip155:1\",\n chainId: 1,\n name: \"Ethereum\",\n usdcAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n usdcDomainName: \"USD Coin\",\n usdcPermitVersion: \"2\",\n },\n sepolia: {\n caip2: \"eip155:11155111\",\n chainId: 11155111,\n name: \"Sepolia\",\n usdcAddress: \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n usdcDomainName: \"USDC\",\n usdcPermitVersion: \"2\",\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",
11
- "/**\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 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 {\n caip2Network = networkKey;\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",
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 /**\n * Stop the service.\n */\n async stop(): Promise<void> {\n logger.info(\"[x402] Service stopping\");\n this.signer = null;\n this.fetchWithPayment = null;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\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 /**\n * Check if the service is active (configured and enabled).\n */\n isActive(): boolean {\n return this.serviceConfig.enabled && this.signer !== null;\n }\n\n /**\n * Check if the agent can make outgoing payments.\n */\n canMakePayments(): boolean {\n return this.isActive() && this.fetchWithPayment !== null;\n }\n\n /**\n * Update the payment policy.\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 /**\n * Get the wallet address, or null if not configured.\n */\n getWalletAddress(): string | null {\n return this.signer?.address ?? null;\n }\n\n /**\n * Get the configured network key.\n */\n getNetwork(): string {\n return this.serviceConfig.network;\n }\n\n /**\n * Get the configured facilitator URL.\n */\n getFacilitatorUrl(): string {\n return this.serviceConfig.facilitatorUrl;\n }\n\n /**\n * Get the configured pay-to address.\n */\n getPayToAddress(): string {\n return this.serviceConfig.payTo;\n }\n\n /**\n * Get the underlying storage instance.\n * Useful for the paywall middleware to record incoming payments.\n */\n getStorage(): PaymentStorage {\n return this.storage;\n }\n\n /**\n * Get the circuit breaker state.\n */\n getCircuitBreakerState(): string {\n return this.circuitBreaker.getState();\n }\n\n /**\n * Reset the circuit breaker.\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 } 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 /**\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 * NOTE: For production use, the caller should query the USDC contract's\n * nonces(owner) function and pass the result via requirement.extra.nonce.\n * The default of 0 works for fresh wallets that have never used permit.\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 // Defaults to 0 for wallets that have never used permit on this token.\n const nonce = BigInt(requirement.extra?.nonce ?? \"0\");\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",
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
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
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
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
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 {\n // Ignore malformed metadata\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\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\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\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\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 {\n // Ignore malformed metadata\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// ---------------------------------------------------------------------------\n// Route handlers\n// ---------------------------------------------------------------------------\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\n// ---------------------------------------------------------------------------\n// Plugin definition\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 init: async (\n _config: Record<string, string>,\n _runtime: IAgentRuntime,\n ): Promise<void> => {\n // Service initialization is handled by the Service.start() factory.\n // This init hook is available for additional setup if needed.\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"
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"
23
23
  ],
24
- "mappings": "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",
25
- "debugId": "8D689045A014B14A64756E2164756E21",
24
+ "mappings": "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",
25
+ "debugId": "1B49A85A0DA39F2364756E2164756E21",
26
26
  "names": []
27
27
  }
package/package.json CHANGED
@@ -1,104 +1,122 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-x402",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0-alpha.5",
4
4
  "description": "x402 HTTP payment protocol plugin for ElizaOS - send and receive crypto payments",
5
5
  "type": "module",
6
- "main": "typescript/dist/index.js",
7
- "types": "typescript/dist/index.d.ts",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/elizaos-plugins/plugin-x402"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
8
16
  "exports": {
9
17
  "./package.json": "./package.json",
10
18
  ".": {
11
- "types": "./typescript/dist/index.d.ts",
12
- "import": "./typescript/dist/index.js",
13
- "default": "./typescript/dist/index.js"
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
14
22
  }
15
23
  },
24
+ "sideEffects": false,
16
25
  "files": [
17
- "typescript/dist",
18
- "README.md"
26
+ "dist"
19
27
  ],
20
- "keywords": [],
21
- "author": "elizaOS",
22
- "license": "MIT",
23
- "repository": {
24
- "type": "git",
25
- "url": "https://github.com/elizaos-plugins/plugin-x402"
26
- },
27
- "scripts": {
28
- "build": "bun run build:ts",
29
- "build:ts": "cd typescript && bun run build.ts",
30
- "dev": "cd typescript && bun --hot build.ts",
31
- "test": "bun run test:ts",
32
- "test:ts": "cd typescript && vitest run || echo 'TypeScript tests skipped - no tests found'",
33
- "typecheck": "tsc --noEmit -p typescript/tsconfig.json",
34
- "lint": "bunx @biomejs/biome check --write ./typescript",
35
- "lint:check": "bunx @biomejs/biome check ./typescript",
36
- "clean": "rm -rf typescript/dist .turbo typescript/node_modules",
37
- "format": "bunx @biomejs/biome format --write ./typescript",
38
- "format:check": "bunx @biomejs/biome format ./typescript"
28
+ "dependencies": {
29
+ "@elizaos/core": "2.0.0-alpha.3",
30
+ "viem": "^2.21.0",
31
+ "better-sqlite3": "^11.7.0",
32
+ "pg": "^8.13.1"
39
33
  },
40
34
  "devDependencies": {
41
35
  "@biomejs/biome": "^2.3.11",
42
- "@types/bun": "^1.3.5",
36
+ "@types/better-sqlite3": "^7.6.12",
43
37
  "@types/node": "^25.0.3",
44
- "typescript": "^5.9.3",
45
- "@types/better-sqlite3": "7.6.12",
46
- "@types/pg": "8.11.10"
38
+ "@types/pg": "^8.11.10",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "scripts": {
42
+ "build": "bun run build.ts",
43
+ "build:ts": "bun run build.ts",
44
+ "dev": "bun run build.ts --watch",
45
+ "clean": "rm -rf dist .turbo node_modules",
46
+ "format": "bunx @biomejs/biome format --write .",
47
+ "format:check": "bunx @biomejs/biome format .",
48
+ "lint": "bunx @biomejs/biome check --write --unsafe .",
49
+ "lint:check": "bunx @biomejs/biome check .",
50
+ "typecheck": "tsc --noEmit -p tsconfig.json",
51
+ "test": "vitest run",
52
+ "test:ts": "vitest run",
53
+ "test:watch": "vitest"
47
54
  },
48
- "peerDependencies": {
49
- "@elizaos/core": "next"
55
+ "milaidy": {
56
+ "platforms": [
57
+ "node"
58
+ ],
59
+ "runtime": "node",
60
+ "platformDetails": {
61
+ "node": "Default export (Node.js)"
62
+ }
50
63
  },
51
64
  "agentConfig": {
52
- "pluginType": "elizaos:plugin:1.0.0",
53
65
  "pluginParameters": {
66
+ "X402_AGENT_URL": {
67
+ "type": "string",
68
+ "description": "Agent endpoint URL",
69
+ "required": false,
70
+ "sensitive": false
71
+ },
54
72
  "X402_PRIVATE_KEY": {
55
73
  "type": "string",
56
- "description": "Private key for the x402 payment wallet (hex-encoded, starting with 0x).",
74
+ "description": "Private key for X402",
57
75
  "required": true,
58
76
  "sensitive": true
59
77
  },
60
78
  "X402_NETWORK": {
61
79
  "type": "string",
62
- "description": "Network to use for x402 payments (e.g. base-sepolia, base).",
80
+ "description": "Network name (e.g. mainnet, testnet)",
63
81
  "required": false,
64
82
  "sensitive": false
65
83
  },
66
84
  "X402_PAY_TO": {
67
85
  "type": "string",
68
- "description": "Default payment recipient address.",
86
+ "description": "Payment recipient address",
69
87
  "required": false,
70
88
  "sensitive": false
71
89
  },
72
90
  "X402_FACILITATOR_URL": {
73
91
  "type": "string",
74
- "description": "URL of the x402 facilitator service for payment verification.",
92
+ "description": "Facilitator service URL",
75
93
  "required": false,
76
94
  "sensitive": false
77
95
  },
78
96
  "X402_MAX_PAYMENT_USD": {
79
- "type": "string",
80
- "description": "Maximum single payment amount in USD.",
97
+ "type": "number",
98
+ "description": "Maximum single payment in USD",
81
99
  "required": false,
82
100
  "sensitive": false
83
101
  },
84
102
  "X402_MAX_TOTAL_USD": {
85
- "type": "string",
86
- "description": "Maximum total payment amount in USD within the policy window.",
103
+ "type": "number",
104
+ "description": "Maximum total spend in USD",
87
105
  "required": false,
88
106
  "sensitive": false
89
107
  },
90
108
  "X402_ENABLED": {
91
109
  "type": "boolean",
92
- "description": "Whether the x402 plugin is enabled.",
110
+ "description": "Enable or disable this feature",
111
+ "required": false,
112
+ "sensitive": false
113
+ },
114
+ "X402_DB_PATH": {
115
+ "type": "string",
116
+ "description": "Database file path",
93
117
  "required": false,
94
- "default": true,
95
118
  "sensitive": false
96
119
  }
97
120
  }
98
- },
99
- "dependencies": {
100
- "viem": "2.21.0",
101
- "better-sqlite3": "11.7.0",
102
- "pg": "8.13.1"
103
121
  }
104
122
  }
package/README.md DELETED
@@ -1,30 +0,0 @@
1
- # @elizaos/plugin-x402
2
-
3
- x402 HTTP payment protocol plugin for ElizaOS. Enables agents to send and receive crypto payments (USDC on EVM chains) using the [x402 protocol standard](https://www.x402.org/).
4
-
5
- ## Features
6
-
7
- - **Send payments** — Pay for x402-protected HTTP resources
8
- - **Receive payments** — Serve paywalled endpoints with automatic USDC settlement
9
- - **Multiple storage backends** — Memory, SQLite, and PostgreSQL
10
- - **Payment policies** — Configurable spending limits and circuit breakers
11
- - **Facilitator integration** — Payment verification via x402 facilitator service
12
- - **REST API** — Endpoints for payment history, summaries, and CSV export
13
-
14
- ## Configuration
15
-
16
- | Variable | Description | Required |
17
- |----------|-------------|----------|
18
- | `X402_PRIVATE_KEY` | Wallet private key (hex, 0x-prefixed) | Yes |
19
- | `X402_NETWORK` | Network name (e.g. `base-sepolia`, `base`) | No |
20
- | `X402_PAY_TO` | Default payment recipient address | No |
21
- | `X402_FACILITATOR_URL` | Facilitator service URL | No |
22
- | `X402_MAX_PAYMENT_USD` | Max single payment (USD) | No |
23
- | `X402_MAX_TOTAL_USD` | Max total payments (USD) | No |
24
- | `X402_ENABLED` | Enable/disable plugin | No |
25
-
26
- ## Usage
27
-
28
- ```typescript
29
- import { x402Plugin } from "@elizaos/plugin-x402";
30
- ```
File without changes