agentwallet-sdk 3.5.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +78 -391
  2. package/dist/__tests__/identity.did.test.d.ts +2 -0
  3. package/dist/__tests__/identity.did.test.d.ts.map +1 -0
  4. package/dist/__tests__/identity.did.test.js +56 -0
  5. package/dist/__tests__/identity.did.test.js.map +1 -0
  6. package/dist/__tests__/staking.test.d.ts +2 -0
  7. package/dist/__tests__/staking.test.d.ts.map +1 -0
  8. package/dist/__tests__/staking.test.js +70 -0
  9. package/dist/__tests__/staking.test.js.map +1 -0
  10. package/dist/__tests__/verify.test.d.ts +2 -0
  11. package/dist/__tests__/verify.test.d.ts.map +1 -0
  12. package/dist/__tests__/verify.test.js +57 -0
  13. package/dist/__tests__/verify.test.js.map +1 -0
  14. package/dist/abi.d.ts +46 -396
  15. package/dist/abi.d.ts.map +1 -1
  16. package/dist/abi.js +2 -0
  17. package/dist/abi.js.map +1 -1
  18. package/dist/bridge/abis.d.ts.map +1 -1
  19. package/dist/bridge/abis.js +2 -0
  20. package/dist/bridge/abis.js.map +1 -1
  21. package/dist/bridge/client.d.ts +43 -28
  22. package/dist/bridge/client.d.ts.map +1 -1
  23. package/dist/bridge/client.js +2 -0
  24. package/dist/bridge/client.js.map +1 -1
  25. package/dist/bridge/index.d.ts +0 -1
  26. package/dist/bridge/index.d.ts.map +1 -1
  27. package/dist/bridge/index.js +2 -0
  28. package/dist/bridge/index.js.map +1 -1
  29. package/dist/bridge/types.d.ts +32 -48
  30. package/dist/bridge/types.d.ts.map +1 -1
  31. package/dist/bridge/types.js +2 -0
  32. package/dist/bridge/types.js.map +1 -1
  33. package/dist/identity/did.d.ts +66 -0
  34. package/dist/identity/did.d.ts.map +1 -0
  35. package/dist/identity/did.js +186 -0
  36. package/dist/identity/did.js.map +1 -0
  37. package/dist/identity/erc8004.d.ts +141 -291
  38. package/dist/identity/erc8004.d.ts.map +1 -1
  39. package/dist/identity/erc8004.js +2 -0
  40. package/dist/identity/erc8004.js.map +1 -1
  41. package/dist/identity/index.d.ts +3 -0
  42. package/dist/identity/index.d.ts.map +1 -0
  43. package/dist/identity/index.js +3 -0
  44. package/dist/identity/index.js.map +1 -0
  45. package/dist/index.d.ts +1011 -32545
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +7 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/plugins/elizaos.d.ts +14 -26
  50. package/dist/plugins/elizaos.d.ts.map +1 -1
  51. package/dist/plugins/elizaos.js +2 -0
  52. package/dist/plugins/elizaos.js.map +1 -1
  53. package/dist/policy/SpendingPolicy.d.ts +15 -89
  54. package/dist/policy/SpendingPolicy.d.ts.map +1 -1
  55. package/dist/policy/SpendingPolicy.js +2 -0
  56. package/dist/policy/SpendingPolicy.js.map +1 -1
  57. package/dist/staking/AgentStakingPool.d.ts +100 -0
  58. package/dist/staking/AgentStakingPool.d.ts.map +1 -0
  59. package/dist/staking/AgentStakingPool.js +298 -0
  60. package/dist/staking/AgentStakingPool.js.map +1 -0
  61. package/dist/staking/index.d.ts +2 -0
  62. package/dist/staking/index.d.ts.map +1 -0
  63. package/dist/staking/index.js +2 -0
  64. package/dist/staking/index.js.map +1 -0
  65. package/dist/swap/SwapModule.d.ts +39 -28
  66. package/dist/swap/SwapModule.d.ts.map +1 -1
  67. package/dist/swap/SwapModule.js +2 -0
  68. package/dist/swap/SwapModule.js.map +1 -1
  69. package/dist/swap/abi.d.ts.map +1 -1
  70. package/dist/swap/abi.js +2 -0
  71. package/dist/swap/abi.js.map +1 -1
  72. package/dist/swap/index.d.ts +0 -1
  73. package/dist/swap/index.d.ts.map +1 -1
  74. package/dist/swap/index.js +2 -0
  75. package/dist/swap/index.js.map +1 -1
  76. package/dist/swap/types.d.ts +6 -40
  77. package/dist/swap/types.d.ts.map +1 -1
  78. package/dist/swap/types.js +2 -0
  79. package/dist/swap/types.js.map +1 -1
  80. package/dist/types.d.ts +5 -106
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +2 -0
  83. package/dist/types.js.map +1 -1
  84. package/dist/verify/index.d.ts +2 -0
  85. package/dist/verify/index.d.ts.map +1 -0
  86. package/dist/verify/index.js +2 -0
  87. package/dist/verify/index.js.map +1 -0
  88. package/dist/verify/verifyAgent.d.ts +42 -0
  89. package/dist/verify/verifyAgent.d.ts.map +1 -0
  90. package/dist/verify/verifyAgent.js +216 -0
  91. package/dist/verify/verifyAgent.js.map +1 -0
  92. package/dist/x402/budget.d.ts +15 -23
  93. package/dist/x402/budget.d.ts.map +1 -1
  94. package/dist/x402/budget.js +2 -0
  95. package/dist/x402/budget.js.map +1 -1
  96. package/dist/x402/chains/abstract/index.d.ts +59 -87
  97. package/dist/x402/chains/abstract/index.d.ts.map +1 -1
  98. package/dist/x402/chains/abstract/index.js +2 -0
  99. package/dist/x402/chains/abstract/index.js.map +1 -1
  100. package/dist/x402/client.d.ts +13 -27
  101. package/dist/x402/client.d.ts.map +1 -1
  102. package/dist/x402/client.js +2 -0
  103. package/dist/x402/client.js.map +1 -1
  104. package/dist/x402/index.d.ts +0 -2
  105. package/dist/x402/index.d.ts.map +1 -1
  106. package/dist/x402/index.js +2 -0
  107. package/dist/x402/index.js.map +1 -1
  108. package/dist/x402/middleware.d.ts +4 -4
  109. package/dist/x402/middleware.d.ts.map +1 -1
  110. package/dist/x402/middleware.js +2 -0
  111. package/dist/x402/middleware.js.map +1 -1
  112. package/dist/x402/types.d.ts +5 -88
  113. package/dist/x402/types.d.ts.map +1 -1
  114. package/dist/x402/types.js +2 -0
  115. package/dist/x402/types.js.map +1 -1
  116. package/package.json +31 -12
  117. package/dist/policy/SpendingPolicy.test.d.ts +0 -2
  118. package/dist/policy/SpendingPolicy.test.d.ts.map +0 -1
  119. package/dist/policy/SpendingPolicy.test.js +0 -143
  120. package/dist/policy/SpendingPolicy.test.js.map +0 -1
  121. package/dist/x402/__tests__/budget.test.d.ts +0 -2
  122. package/dist/x402/__tests__/budget.test.d.ts.map +0 -1
  123. package/dist/x402/__tests__/budget.test.js +0 -114
  124. package/dist/x402/__tests__/budget.test.js.map +0 -1
  125. package/dist/x402/__tests__/client.test.d.ts +0 -2
  126. package/dist/x402/__tests__/client.test.d.ts.map +0 -1
  127. package/dist/x402/__tests__/client.test.js +0 -107
  128. package/dist/x402/__tests__/client.test.js.map +0 -1
package/package.json CHANGED
@@ -1,9 +1,28 @@
1
1
  {
2
2
  "name": "agentwallet-sdk",
3
- "version": "3.5.1",
4
- "description": "Non-custodial TypeScript SDK for AI agent wallets x402 payments (Solana, Base, Abstract, Polygon), CCTP cross-chain, token swaps. Private keys never leave your environment.",
3
+ "version": "4.0.0",
4
+ "description": "Non-custodial AI agent wallet SDK. x402 payments, 17-chain CCTP bridging, ERC-6551 identity, SpendingPolicy guardrails, agent DID, staking, trust verification. The agent holds the keys.",
5
+ "type": "module",
5
6
  "main": "dist/index.js",
6
7
  "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./identity": {
14
+ "import": "./dist/identity/index.js",
15
+ "types": "./dist/identity/index.d.ts"
16
+ },
17
+ "./staking": {
18
+ "import": "./dist/staking/index.js",
19
+ "types": "./dist/staking/index.d.ts"
20
+ },
21
+ "./verify": {
22
+ "import": "./dist/verify/index.js",
23
+ "types": "./dist/verify/index.d.ts"
24
+ }
25
+ },
7
26
  "files": [
8
27
  "dist"
9
28
  ],
@@ -18,28 +37,28 @@
18
37
  "ai-agent",
19
38
  "crypto",
20
39
  "web3",
21
- "erc-6551",
40
+ "did",
41
+ "verifiable-credentials",
42
+ "aave",
43
+ "staking",
22
44
  "x402",
23
- "agentic-wallet",
24
- "base",
25
45
  "non-custodial",
26
- "spend-limits",
27
- "machine-payments",
28
46
  "agent-payments",
29
- "autonomous-agent",
30
- "token-bound-account"
47
+ "autonomous-agent"
31
48
  ],
32
49
  "license": "MIT",
33
50
  "repository": {
34
51
  "type": "git",
35
- "url": "https://github.com/agentnexus/agent-wallet-sdk"
52
+ "url": "https://github.com/up2itnow0822/agentwallet-sdk"
36
53
  },
37
- "author": "AgentNexus",
54
+ "author": "up2itnow5280",
38
55
  "dependencies": {
56
+ "@noble/ed25519": "^2.1.0",
57
+ "@noble/hashes": "^1.4.0",
39
58
  "viem": "2.46.0"
40
59
  },
41
60
  "devDependencies": {
42
- "@elizaos/core": "^1.7.2",
61
+ "@types/node": "^20.0.0",
43
62
  "typescript": "5.3.3",
44
63
  "vitest": "4.0.18"
45
64
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=SpendingPolicy.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SpendingPolicy.test.d.ts","sourceRoot":"","sources":["../../src/policy/SpendingPolicy.test.ts"],"names":[],"mappings":""}
@@ -1,143 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { SpendingPolicy } from './SpendingPolicy.js';
3
- // ─── Helpers ─────────────────────────────────────────────────────────────────
4
- function makePayment(overrides = {}) {
5
- return {
6
- merchant: '0xAllowedMerchant',
7
- amount: 10,
8
- ...overrides,
9
- };
10
- }
11
- function makePolicy(config) {
12
- return new SpendingPolicy(config);
13
- }
14
- // ─── MerchantAllowlist ────────────────────────────────────────────────────────
15
- describe('MerchantAllowlist', () => {
16
- it('allowlisted merchant passes', async () => {
17
- const policy = makePolicy({ merchantAllowlist: ['0xallowedmerchant'] });
18
- const result = await policy.check(makePayment({ merchant: '0xAllowedMerchant' }));
19
- expect(result.status).toBe('approved');
20
- });
21
- it('non-allowlisted merchant is blocked', async () => {
22
- const policy = makePolicy({ merchantAllowlist: ['0xallowedmerchant'] });
23
- const result = await policy.check(makePayment({ merchant: '0xEvilMerchant' }));
24
- expect(result.status).toBe('rejected');
25
- expect(result.reason).toMatch(/not on the allowlist/i);
26
- });
27
- it('addMerchant allows previously blocked merchant', async () => {
28
- const policy = makePolicy({ merchantAllowlist: ['0xallowedmerchant'] });
29
- policy.addMerchant('0xNewMerchant');
30
- const result = await policy.check(makePayment({ merchant: '0xNewMerchant' }));
31
- expect(result.status).toBe('approved');
32
- });
33
- it('getMerchantAllowlist returns current allowlist', () => {
34
- const policy = makePolicy({ merchantAllowlist: ['0xA', '0xB'] });
35
- const list = policy.getMerchantAllowlist();
36
- expect(list).toContain('0xa');
37
- expect(list).toContain('0xb');
38
- expect(list.length).toBe(2);
39
- });
40
- });
41
- // ─── RollingSpendCap ──────────────────────────────────────────────────────────
42
- describe('RollingSpendCap', () => {
43
- it('allows payment under the rolling cap', async () => {
44
- const policy = makePolicy({
45
- rollingCap: { maxAmount: 100, windowMs: 86400000 },
46
- });
47
- const result = await policy.check(makePayment({ amount: 50 }));
48
- expect(result.status).toBe('approved');
49
- });
50
- it('blocks payment that would exceed the rolling cap', async () => {
51
- const policy = makePolicy({
52
- rollingCap: { maxAmount: 100, windowMs: 86400000 },
53
- });
54
- // First spend: 80
55
- await policy.check(makePayment({ amount: 80 }));
56
- // Second spend: 30 — total 110 > 100
57
- const result = await policy.check(makePayment({ amount: 30 }));
58
- expect(result.status).toBe('rejected');
59
- expect(result.reason).toMatch(/rolling spend cap exceeded/i);
60
- });
61
- it('allows payment exactly at the rolling cap', async () => {
62
- const policy = makePolicy({
63
- rollingCap: { maxAmount: 100, windowMs: 86400000 },
64
- });
65
- await policy.check(makePayment({ amount: 50 }));
66
- const result = await policy.check(makePayment({ amount: 50 }));
67
- expect(result.status).toBe('approved');
68
- });
69
- });
70
- // ─── DraftThenApprove ─────────────────────────────────────────────────────────
71
- describe('DraftThenApprove', () => {
72
- it('queues payment at or above draft threshold', async () => {
73
- const policy = makePolicy({ draftThreshold: 500 });
74
- const result = await policy.check(makePayment({ amount: 500 }));
75
- expect(result.status).toBe('draft');
76
- expect(result.draftId).toBeTruthy();
77
- });
78
- it('approves payment below draft threshold immediately', async () => {
79
- const policy = makePolicy({ draftThreshold: 500 });
80
- const result = await policy.check(makePayment({ amount: 499 }));
81
- expect(result.status).toBe('approved');
82
- });
83
- it('queued draft appears in getPendingDrafts()', async () => {
84
- const policy = makePolicy({ draftThreshold: 100 });
85
- const result = await policy.check(makePayment({ amount: 200 }));
86
- const pending = policy.getPendingDrafts();
87
- expect(pending.length).toBe(1);
88
- expect(pending[0].draftId).toBe(result.draftId);
89
- });
90
- it('approveDraft marks draft approved and removes from pending', async () => {
91
- const policy = makePolicy({ draftThreshold: 100 });
92
- const result = await policy.check(makePayment({ amount: 200 }));
93
- const draftId = result.draftId;
94
- expect(policy.approveDraft(draftId)).toBe(true);
95
- expect(policy.getPendingDrafts().length).toBe(0);
96
- const draft = policy.getAllDrafts().find((d) => d.draftId === draftId);
97
- expect(draft.approved).toBe(true);
98
- });
99
- });
100
- // ─── AuditTrail ───────────────────────────────────────────────────────────────
101
- describe('AuditTrail', () => {
102
- it('creates an audit entry for every payment attempt', async () => {
103
- const policy = makePolicy({});
104
- await policy.check(makePayment({ amount: 10 }));
105
- await policy.check(makePayment({ amount: 20 }));
106
- const log = policy.getAuditLog();
107
- expect(log.length).toBe(2);
108
- });
109
- it('audit entry records merchant, amount, and status', async () => {
110
- const policy = makePolicy({ merchantAllowlist: ['0xgood'] });
111
- await policy.check(makePayment({ merchant: '0xBad', amount: 99 }));
112
- const entry = policy.getAuditLog()[0];
113
- expect(entry.merchant).toBe('0xBad');
114
- expect(entry.amount).toBe(99);
115
- expect(entry.status).toBe('rejected');
116
- });
117
- it('audit log is append-only (getAuditLog returns copy)', async () => {
118
- const policy = makePolicy({});
119
- await policy.check(makePayment());
120
- const log = policy.getAuditLog();
121
- log.push({ id: 'tamper', timestamp: '', merchant: '', amount: 0, status: 'approved' });
122
- // Original log should still have only 1 entry
123
- expect(policy.getAuditLog().length).toBe(1);
124
- });
125
- });
126
- // ─── FailClosed ───────────────────────────────────────────────────────────────
127
- describe('FailClosed', () => {
128
- it('rejects payment when policy engine throws an error', async () => {
129
- const policy = makePolicy({ merchantAllowlist: ['0xgood'] });
130
- // Corrupt internal state to trigger an error inside _check
131
- // We spy on the private method by monkey-patching to throw
132
- const original = policy._check.bind(policy);
133
- policy._check = async () => {
134
- throw new Error('Simulated internal policy crash');
135
- };
136
- const result = await policy.check(makePayment());
137
- expect(result.status).toBe('rejected');
138
- expect(result.reason).toMatch(/fail-closed/i);
139
- // Restore
140
- policy._check = original;
141
- });
142
- });
143
- //# sourceMappingURL=SpendingPolicy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SpendingPolicy.test.js","sourceRoot":"","sources":["../../src/policy/SpendingPolicy.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=budget.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"budget.test.d.ts","sourceRoot":"","sources":["../../../src/x402/__tests__/budget.test.ts"],"names":[],"mappings":""}
@@ -1,114 +0,0 @@
1
- // [MAX-ADDED] Tests for x402 Budget Tracker
2
- import { describe, it, expect, beforeEach } from 'vitest';
3
- import { X402BudgetTracker } from '../budget.js';
4
- describe('X402BudgetTracker', () => {
5
- let tracker;
6
- beforeEach(() => {
7
- tracker = new X402BudgetTracker({
8
- globalDailyLimit: 100000000n, // 100 USDC
9
- globalPerRequestMax: 10000000n, // 10 USDC
10
- serviceBudgets: [
11
- { service: 'api.example.com', maxPerRequest: 5000000n, dailyLimit: 50000000n },
12
- { service: '*', maxPerRequest: 2000000n, dailyLimit: 20000000n },
13
- ],
14
- });
15
- });
16
- it('allows payments within limits', () => {
17
- const result = tracker.checkBudget('api.example.com', 1000000n);
18
- expect(result.allowed).toBe(true);
19
- });
20
- it('rejects payments exceeding global per-request max', () => {
21
- const result = tracker.checkBudget('api.example.com', 15000000n);
22
- expect(result.allowed).toBe(false);
23
- expect(result.reason).toContain('global per-request max');
24
- });
25
- it('rejects payments exceeding service per-request max', () => {
26
- const result = tracker.checkBudget('api.example.com', 6000000n);
27
- expect(result.allowed).toBe(false);
28
- expect(result.reason).toContain('service per-request max');
29
- });
30
- it('uses wildcard budget for unknown services', () => {
31
- const result = tracker.checkBudget('unknown.com', 3000000n);
32
- expect(result.allowed).toBe(false);
33
- expect(result.reason).toContain('service per-request max');
34
- });
35
- it('tracks daily spending per service', () => {
36
- const log = {
37
- timestamp: Math.floor(Date.now() / 1000),
38
- service: 'api.example.com',
39
- url: 'https://api.example.com/data',
40
- amount: 4000000n,
41
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
42
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
43
- txHash: '0xabc123',
44
- network: 'base:8453',
45
- scheme: 'exact',
46
- success: true,
47
- };
48
- tracker.recordPayment(log);
49
- const summary = tracker.getDailySpendSummary();
50
- expect(summary.global).toBe(4000000n);
51
- expect(summary.byService['api.example.com']).toBe(4000000n);
52
- });
53
- it('rejects when daily limit would be exceeded', () => {
54
- // Spend 48 USDC
55
- for (let i = 0; i < 12; i++) {
56
- tracker.recordPayment({
57
- timestamp: Math.floor(Date.now() / 1000),
58
- service: 'api.example.com',
59
- url: 'https://api.example.com/data',
60
- amount: 4000000n,
61
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
62
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
63
- txHash: '0xabc123',
64
- network: 'base:8453',
65
- scheme: 'exact',
66
- success: true,
67
- });
68
- }
69
- // Next 4 USDC would exceed 50 USDC service daily limit
70
- const result = tracker.checkBudget('api.example.com', 4000000n);
71
- expect(result.allowed).toBe(false);
72
- expect(result.reason).toContain('daily limit');
73
- });
74
- it('returns transaction log with filters', () => {
75
- const now = Math.floor(Date.now() / 1000);
76
- tracker.recordPayment({
77
- timestamp: now - 100,
78
- service: 'api.example.com',
79
- url: 'https://api.example.com/a',
80
- amount: 1000000n,
81
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
82
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
83
- txHash: '0xaaa',
84
- network: 'base:8453',
85
- scheme: 'exact',
86
- success: true,
87
- });
88
- tracker.recordPayment({
89
- timestamp: now,
90
- service: 'other.com',
91
- url: 'https://other.com/b',
92
- amount: 500000n,
93
- token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
94
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
95
- txHash: '0xbbb',
96
- network: 'base:8453',
97
- scheme: 'exact',
98
- success: true,
99
- });
100
- expect(tracker.getTransactionLog()).toHaveLength(2);
101
- expect(tracker.getTransactionLog({ service: 'other.com' })).toHaveLength(1);
102
- expect(tracker.getTransactionLog({ since: now - 50 })).toHaveLength(1);
103
- });
104
- it('allows runtime budget updates', () => {
105
- tracker.setServiceBudget({
106
- service: 'new-api.com',
107
- maxPerRequest: 1000000n,
108
- dailyLimit: 5000000n,
109
- });
110
- expect(tracker.checkBudget('new-api.com', 500000n).allowed).toBe(true);
111
- expect(tracker.checkBudget('new-api.com', 2000000n).allowed).toBe(false);
112
- });
113
- });
114
- //# sourceMappingURL=budget.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"budget.test.js","sourceRoot":"","sources":["../../../src/x402/__tests__/budget.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../src/x402/__tests__/client.test.ts"],"names":[],"mappings":""}
@@ -1,107 +0,0 @@
1
- // [MAX-ADDED] Tests for x402 Client — protocol parsing and payment selection
2
- import { describe, it, expect } from 'vitest';
3
- import { X402Client } from '../client.js';
4
- // Mock wallet (we test protocol logic, not on-chain execution)
5
- const mockWallet = {};
6
- describe('X402Client', () => {
7
- describe('parse402Response', () => {
8
- it('parses base64 PAYMENT-REQUIRED header', async () => {
9
- const client = new X402Client(mockWallet, { autoPay: false });
10
- const paymentRequired = {
11
- x402Version: 1,
12
- resource: { url: '/api/data', description: 'Data API', mimeType: 'application/json' },
13
- accepts: [
14
- {
15
- scheme: 'exact',
16
- network: 'base:8453',
17
- asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
18
- amount: '1000000',
19
- payTo: '0xRecipient',
20
- maxTimeoutSeconds: 30,
21
- extra: {},
22
- },
23
- ],
24
- };
25
- const b64 = btoa(JSON.stringify(paymentRequired));
26
- const response = new Response(null, {
27
- status: 402,
28
- headers: { 'payment-required': b64 },
29
- });
30
- const parsed = await client.parse402Response(response);
31
- expect(parsed).not.toBeNull();
32
- expect(parsed.x402Version).toBe(1);
33
- expect(parsed.accepts).toHaveLength(1);
34
- expect(parsed.accepts[0].scheme).toBe('exact');
35
- expect(parsed.accepts[0].amount).toBe('1000000');
36
- });
37
- it('parses JSON body fallback', async () => {
38
- const client = new X402Client(mockWallet, { autoPay: false });
39
- const paymentRequired = {
40
- x402Version: 1,
41
- resource: { url: '/api/data', description: 'Data', mimeType: 'application/json' },
42
- accepts: [
43
- {
44
- scheme: 'exact',
45
- network: 'base:8453',
46
- asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
47
- amount: '500000',
48
- payTo: '0xRecipient',
49
- maxTimeoutSeconds: 30,
50
- extra: {},
51
- },
52
- ],
53
- };
54
- const response = new Response(JSON.stringify(paymentRequired), {
55
- status: 402,
56
- headers: { 'content-type': 'application/json' },
57
- });
58
- const parsed = await client.parse402Response(response);
59
- expect(parsed).not.toBeNull();
60
- expect(parsed.accepts[0].amount).toBe('500000');
61
- });
62
- it('returns null for unparseable 402', async () => {
63
- const client = new X402Client(mockWallet, { autoPay: false });
64
- const response = new Response('Payment Required', { status: 402 });
65
- const parsed = await client.parse402Response(response);
66
- expect(parsed).toBeNull();
67
- });
68
- });
69
- describe('selectPaymentOption', () => {
70
- it('selects Base USDC exact scheme', () => {
71
- const client = new X402Client(mockWallet);
72
- const accepts = [
73
- { scheme: 'exact', network: 'ethereum:1', asset: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', amount: '1000000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
74
- { scheme: 'exact', network: 'base:8453', asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', amount: '1000000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
75
- ];
76
- const selected = client.selectPaymentOption(accepts);
77
- expect(selected).not.toBeNull();
78
- expect(selected.network).toBe('base:8453');
79
- });
80
- it('prefers lowest amount among compatible options', () => {
81
- const client = new X402Client(mockWallet);
82
- const accepts = [
83
- { scheme: 'exact', network: 'base:8453', asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', amount: '5000000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
84
- { scheme: 'exact', network: 'base:8453', asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', amount: '1000000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
85
- ];
86
- const selected = client.selectPaymentOption(accepts);
87
- expect(selected.amount).toBe('1000000');
88
- });
89
- it('returns null when no compatible option exists', () => {
90
- const client = new X402Client(mockWallet);
91
- const accepts = [
92
- { scheme: 'exact', network: 'solana:mainnet', asset: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', amount: '1000000', payTo: 'sol_addr', maxTimeoutSeconds: 30, extra: {} },
93
- ];
94
- expect(client.selectPaymentOption(accepts)).toBeNull();
95
- });
96
- it('prefers exact scheme over others', () => {
97
- const client = new X402Client(mockWallet);
98
- const accepts = [
99
- { scheme: 'upto', network: 'base:8453', asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', amount: '500000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
100
- { scheme: 'exact', network: 'base:8453', asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', amount: '1000000', payTo: '0x1', maxTimeoutSeconds: 30, extra: {} },
101
- ];
102
- const selected = client.selectPaymentOption(accepts);
103
- expect(selected.scheme).toBe('exact');
104
- });
105
- });
106
- });
107
- //# sourceMappingURL=client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/x402/__tests__/client.test.ts"],"names":[],"mappings":"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"}