@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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
884
|
+
logger5.info(`[x402] Received 402 Payment Required from ${url}`);
|
|
852
885
|
const paymentRequired = parsePaymentRequired(initialResponse);
|
|
853
886
|
if (!paymentRequired) {
|
|
854
|
-
|
|
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
|
-
|
|
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
|
-
|
|
896
|
+
logger5.error("[x402] No compatible payment option found");
|
|
864
897
|
return initialResponse;
|
|
865
898
|
}
|
|
866
899
|
const amount = BigInt(requirement.maxAmountRequired);
|
|
867
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
920
|
+
logger5.error(`[x402] Failed to sign payment: ${message}`);
|
|
888
921
|
circuitBreaker.recordFailure();
|
|
889
922
|
return initialResponse;
|
|
890
923
|
}
|
|
891
|
-
|
|
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
|
-
|
|
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
|
-
|
|
960
|
+
logger5.error(`[x402] Failed to record payment: ${message}`);
|
|
928
961
|
}
|
|
929
962
|
if (retryResponse.ok) {
|
|
930
963
|
circuitBreaker.recordSuccess(amount);
|
|
931
|
-
|
|
964
|
+
logger5.info(`[x402] Payment successful: ${amount} to ${requirement.payTo}`);
|
|
932
965
|
} else {
|
|
933
966
|
circuitBreaker.recordFailure();
|
|
934
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
1450
|
+
logger: logger5
|
|
1418
1451
|
});
|
|
1419
|
-
|
|
1452
|
+
logger5.info(`[x402] Service active — max per-txn: $${this.serviceConfig.maxPaymentUsd}, max daily: $${this.serviceConfig.maxTotalUsd}`);
|
|
1420
1453
|
}
|
|
1421
1454
|
async stop() {
|
|
1422
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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", "../
|
|
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 *
|
|
11
|
-
"/**\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 *
|
|
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 //
|
|
19
|
-
"/** Client for the x402 facilitator service (verify + settle). */\n\nimport type { FacilitatorVerifyResult, PaymentRequirement } from \"../types\";\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\
|
|
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 //
|
|
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
|
|
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": "
|
|
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.
|
|
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": "
|
|
7
|
-
"
|
|
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": "./
|
|
12
|
-
"import": "./
|
|
13
|
-
"default": "./
|
|
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
|
-
"
|
|
18
|
-
"README.md"
|
|
26
|
+
"dist"
|
|
19
27
|
],
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
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/
|
|
36
|
+
"@types/better-sqlite3": "^7.6.12",
|
|
43
37
|
"@types/node": "^25.0.3",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
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
|
-
"
|
|
49
|
-
"
|
|
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
|
|
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
|
|
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": "
|
|
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": "
|
|
92
|
+
"description": "Facilitator service URL",
|
|
75
93
|
"required": false,
|
|
76
94
|
"sensitive": false
|
|
77
95
|
},
|
|
78
96
|
"X402_MAX_PAYMENT_USD": {
|
|
79
|
-
"type": "
|
|
80
|
-
"description": "Maximum single payment
|
|
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": "
|
|
86
|
-
"description": "Maximum total
|
|
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": "
|
|
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
|