@x402x/client 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -35
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -87,16 +87,17 @@ function PayButton() {
|
|
|
87
87
|
const extendedWallet = wallet.extend(publicActions);
|
|
88
88
|
|
|
89
89
|
// Uses default facilitator at https://facilitator.x402x.dev/
|
|
90
|
+
// CAIP-2 network identifiers: https://chainlist.org/?testnets=true
|
|
90
91
|
const client = new x402xClient({
|
|
91
92
|
wallet: extendedWallet,
|
|
92
|
-
network: '
|
|
93
|
+
network: 'eip155:84532' // Base Sepolia testnet
|
|
93
94
|
});
|
|
94
95
|
|
|
95
96
|
// Convert USD amount to atomic units
|
|
96
|
-
const atomicAmount = parseDefaultAssetAmount('1', '
|
|
97
|
+
const atomicAmount = parseDefaultAssetAmount('1', 'eip155:84532'); // '1000000'
|
|
97
98
|
|
|
98
99
|
const result = await client.execute({
|
|
99
|
-
hook: TransferHook.getAddress('
|
|
100
|
+
hook: TransferHook.getAddress('eip155:84532'),
|
|
100
101
|
hookData: TransferHook.encode(),
|
|
101
102
|
amount: atomicAmount, // Must be atomic units
|
|
102
103
|
payTo: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb1'
|
|
@@ -125,11 +126,12 @@ Use `parseDefaultAssetAmount()` from `@x402x/extensions` to convert USD amounts:
|
|
|
125
126
|
import { parseDefaultAssetAmount, formatDefaultAssetAmount } from "@x402x/extensions";
|
|
126
127
|
|
|
127
128
|
// Convert USD to atomic units
|
|
128
|
-
|
|
129
|
-
const
|
|
129
|
+
// CAIP-2 format: eip155:<chainId> (e.g., eip155:84532 = Base Sepolia)
|
|
130
|
+
const atomicAmount = parseDefaultAssetAmount("1", "eip155:84532"); // '1000000' (1 USDC)
|
|
131
|
+
const largeAmount = parseDefaultAssetAmount("100", "eip155:84532"); // '100000000' (100 USDC)
|
|
130
132
|
|
|
131
133
|
// Convert atomic units back to USD (for display)
|
|
132
|
-
const displayAmount = formatDefaultAssetAmount("1000000", "
|
|
134
|
+
const displayAmount = formatDefaultAssetAmount("1000000", "eip155:84532"); // '1'
|
|
133
135
|
```
|
|
134
136
|
|
|
135
137
|
### Why Atomic Units?
|
|
@@ -145,10 +147,11 @@ const displayAmount = formatDefaultAssetAmount("1000000", "base-sepolia"); // '1
|
|
|
145
147
|
import { x402xClient } from "@x402x/client";
|
|
146
148
|
import { parseDefaultAssetAmount } from "@x402x/extensions";
|
|
147
149
|
|
|
148
|
-
|
|
150
|
+
// CAIP-2 network identifier for Base Sepolia testnet
|
|
151
|
+
const client = new x402xClient({ wallet, network: "eip155:84532" });
|
|
149
152
|
|
|
150
153
|
// ✅ Correct: Convert first, then pass atomic units
|
|
151
|
-
const atomicAmount = parseDefaultAssetAmount("5", "
|
|
154
|
+
const atomicAmount = parseDefaultAssetAmount("5", "eip155:84532");
|
|
152
155
|
await client.execute({ amount: atomicAmount, payTo: "0x..." });
|
|
153
156
|
|
|
154
157
|
// ❌ Wrong: Don't pass USD amounts directly
|
|
@@ -180,15 +183,16 @@ class x402xClient {
|
|
|
180
183
|
import { x402xClient } from "@x402x/client";
|
|
181
184
|
|
|
182
185
|
// Uses default facilitator at https://facilitator.x402x.dev/
|
|
186
|
+
// CAIP-2 network identifier: eip155:84532 (Base Sepolia testnet)
|
|
183
187
|
const client = new x402xClient({
|
|
184
188
|
wallet: walletClient,
|
|
185
|
-
network: "
|
|
189
|
+
network: "eip155:84532",
|
|
186
190
|
});
|
|
187
191
|
|
|
188
192
|
// Or specify custom facilitator
|
|
189
193
|
const client = new x402xClient({
|
|
190
194
|
wallet: walletClient,
|
|
191
|
-
network: "
|
|
195
|
+
network: "eip155:84532",
|
|
192
196
|
facilitatorUrl: "https://custom-facilitator.example.com",
|
|
193
197
|
timeout: 30000, // optional
|
|
194
198
|
confirmationTimeout: 60000, // optional
|
|
@@ -196,7 +200,7 @@ const client = new x402xClient({
|
|
|
196
200
|
|
|
197
201
|
// Convert USD amount to atomic units
|
|
198
202
|
import { parseDefaultAssetAmount } from "@x402x/extensions";
|
|
199
|
-
const atomicAmount = parseDefaultAssetAmount("1", "
|
|
203
|
+
const atomicAmount = parseDefaultAssetAmount("1", "eip155:84532"); // '1000000'
|
|
200
204
|
|
|
201
205
|
const result = await client.execute({
|
|
202
206
|
hook: "0x...",
|
|
@@ -253,7 +257,8 @@ function PayButton() {
|
|
|
253
257
|
|
|
254
258
|
const handlePay = async () => {
|
|
255
259
|
// Convert USD amount to atomic units
|
|
256
|
-
|
|
260
|
+
// CAIP-2 format: eip155:84532 (Base Sepolia testnet)
|
|
261
|
+
const atomicAmount = parseDefaultAssetAmount('1', 'eip155:84532'); // '1000000'
|
|
257
262
|
|
|
258
263
|
await execute({
|
|
259
264
|
hook: '0x...',
|
|
@@ -336,11 +341,12 @@ import { prepareSettlement } from "@x402x/client";
|
|
|
336
341
|
import { parseDefaultAssetAmount } from "@x402x/extensions";
|
|
337
342
|
|
|
338
343
|
// Convert USD amount to atomic units
|
|
339
|
-
|
|
344
|
+
// CAIP-2 network identifier: eip155:84532 (Base Sepolia testnet)
|
|
345
|
+
const atomicAmount = parseDefaultAssetAmount("1", "eip155:84532"); // '1000000'
|
|
340
346
|
|
|
341
347
|
const settlement = await prepareSettlement({
|
|
342
348
|
wallet: walletClient,
|
|
343
|
-
network: "
|
|
349
|
+
network: "eip155:84532",
|
|
344
350
|
hook: "0x...",
|
|
345
351
|
hookData: "0x...",
|
|
346
352
|
amount: atomicAmount, // Must be atomic units
|
|
@@ -380,16 +386,17 @@ import { x402xClient } from "@x402x/client";
|
|
|
380
386
|
import { TransferHook, parseDefaultAssetAmount } from "@x402x/extensions";
|
|
381
387
|
|
|
382
388
|
// Uses default facilitator at https://facilitator.x402x.dev/
|
|
389
|
+
// CAIP-2 network identifier: eip155:84532 (Base Sepolia testnet)
|
|
383
390
|
const client = new x402xClient({
|
|
384
391
|
wallet: walletClient,
|
|
385
|
-
network: "
|
|
392
|
+
network: "eip155:84532",
|
|
386
393
|
});
|
|
387
394
|
|
|
388
395
|
// Convert USD amount to atomic units
|
|
389
|
-
const atomicAmount = parseDefaultAssetAmount("1", "
|
|
396
|
+
const atomicAmount = parseDefaultAssetAmount("1", "eip155:84532"); // '1000000'
|
|
390
397
|
|
|
391
398
|
const result = await client.execute({
|
|
392
|
-
hook: TransferHook.getAddress("
|
|
399
|
+
hook: TransferHook.getAddress("eip155:84532"),
|
|
393
400
|
hookData: TransferHook.encode(), // Simple transfer mode
|
|
394
401
|
amount: atomicAmount, // Must be atomic units
|
|
395
402
|
payTo: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb1",
|
|
@@ -406,15 +413,16 @@ TransferHook supports distributing funds to multiple recipients by percentage:
|
|
|
406
413
|
import { x402xClient } from "@x402x/client";
|
|
407
414
|
import { TransferHook, parseDefaultAssetAmount, type Split } from "@x402x/extensions";
|
|
408
415
|
|
|
416
|
+
// CAIP-2 network identifier: eip155:84532 (Base Sepolia testnet)
|
|
409
417
|
const client = new x402xClient({
|
|
410
418
|
wallet: walletClient,
|
|
411
|
-
network: "
|
|
419
|
+
network: "eip155:84532",
|
|
412
420
|
});
|
|
413
421
|
|
|
414
422
|
// Payroll example: Pay 3 employees with different shares
|
|
415
|
-
const payrollAmount = parseDefaultAssetAmount("10", "
|
|
423
|
+
const payrollAmount = parseDefaultAssetAmount("10", "eip155:84532"); // '10000000' (10 USDC)
|
|
416
424
|
const result = await client.execute({
|
|
417
|
-
hook: TransferHook.getAddress("
|
|
425
|
+
hook: TransferHook.getAddress("eip155:84532"),
|
|
418
426
|
hookData: TransferHook.encode([
|
|
419
427
|
{ recipient: "0xEmployee1...", bips: 3000 }, // 30%
|
|
420
428
|
{ recipient: "0xEmployee2...", bips: 4000 }, // 40%
|
|
@@ -425,9 +433,9 @@ const result = await client.execute({
|
|
|
425
433
|
});
|
|
426
434
|
|
|
427
435
|
// Revenue split example: Platform takes 30%, creator gets 70%
|
|
428
|
-
const revenueAmount = parseDefaultAssetAmount("100", "
|
|
436
|
+
const revenueAmount = parseDefaultAssetAmount("100", "eip155:84532"); // '100000000' (100 USDC)
|
|
429
437
|
const result2 = await client.execute({
|
|
430
|
-
hook: TransferHook.getAddress("
|
|
438
|
+
hook: TransferHook.getAddress("eip155:84532"),
|
|
431
439
|
hookData: TransferHook.encode([
|
|
432
440
|
{ recipient: "0xPlatform...", bips: 3000 }, // 30%
|
|
433
441
|
]),
|
|
@@ -457,10 +465,11 @@ function MintNFT() {
|
|
|
457
465
|
|
|
458
466
|
const handleMint = async () => {
|
|
459
467
|
// Convert USD amount to atomic units
|
|
460
|
-
|
|
468
|
+
// CAIP-2 format: eip155:84532 (Base Sepolia testnet)
|
|
469
|
+
const atomicAmount = parseDefaultAssetAmount('5', 'eip155:84532'); // '5000000'
|
|
461
470
|
|
|
462
471
|
const result = await execute({
|
|
463
|
-
hook: NFTMintHook.getAddress('
|
|
472
|
+
hook: NFTMintHook.getAddress('eip155:84532'),
|
|
464
473
|
hookData: NFTMintHook.encode({
|
|
465
474
|
collection: '0x...',
|
|
466
475
|
tokenId: 1
|
|
@@ -492,21 +501,22 @@ const hookData = TransferHook.encode([
|
|
|
492
501
|
{ recipient: "0xBob...", bips: 4000 }, // 40% to Bob
|
|
493
502
|
]);
|
|
494
503
|
|
|
504
|
+
// CAIP-2 network identifier: eip155:84532 (Base Sepolia testnet)
|
|
495
505
|
const feeEstimate = await calculateFacilitatorFee(
|
|
496
506
|
"https://facilitator.x402x.dev",
|
|
497
|
-
"
|
|
498
|
-
TransferHook.getAddress("
|
|
507
|
+
"eip155:84532",
|
|
508
|
+
TransferHook.getAddress("eip155:84532"),
|
|
499
509
|
hookData,
|
|
500
510
|
);
|
|
501
511
|
|
|
502
512
|
// 2. Convert USD amount to atomic units
|
|
503
|
-
const atomicAmount = parseDefaultAssetAmount("10", "
|
|
513
|
+
const atomicAmount = parseDefaultAssetAmount("10", "eip155:84532"); // '10000000'
|
|
504
514
|
|
|
505
515
|
// 3. Prepare settlement
|
|
506
516
|
const settlement = await prepareSettlement({
|
|
507
517
|
wallet: walletClient,
|
|
508
|
-
network: "
|
|
509
|
-
hook: TransferHook.getAddress("
|
|
518
|
+
network: "eip155:84532",
|
|
519
|
+
hook: TransferHook.getAddress("eip155:84532"),
|
|
510
520
|
hookData,
|
|
511
521
|
amount: atomicAmount, // Must be atomic units
|
|
512
522
|
payTo: "0xCharity...", // Receives 0% (full split)
|
|
@@ -533,7 +543,8 @@ export function usePayment() {
|
|
|
533
543
|
const status = ref("idle");
|
|
534
544
|
const error = ref(null);
|
|
535
545
|
|
|
536
|
-
|
|
546
|
+
// Default to Base Sepolia testnet (CAIP-2 format)
|
|
547
|
+
const pay = async (walletClient, usdAmount, recipient, network = "eip155:84532") => {
|
|
537
548
|
status.value = "processing";
|
|
538
549
|
error.value = null;
|
|
539
550
|
|
|
@@ -622,10 +633,19 @@ import type {
|
|
|
622
633
|
|
|
623
634
|
## Supported Networks
|
|
624
635
|
|
|
625
|
-
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
-
|
|
636
|
+
x402x uses CAIP-2 network identifiers (format: `eip155:<chainId>`):
|
|
637
|
+
|
|
638
|
+
### Mainnet
|
|
639
|
+
- **Base**: `eip155:8453`
|
|
640
|
+
- **X-Layer**: `eip155:196`
|
|
641
|
+
- **BSC**: `eip155:56`
|
|
642
|
+
|
|
643
|
+
### Testnet
|
|
644
|
+
- **Base Sepolia**: `eip155:84532`
|
|
645
|
+
- **X-Layer Testnet**: `eip155:1952`
|
|
646
|
+
- **BSC Testnet**: `eip155:97`
|
|
647
|
+
|
|
648
|
+
**Reference**: See [CAIP-2](https://chainlist.org/?testnets=true) for a complete list of chain IDs.
|
|
629
649
|
|
|
630
650
|
---
|
|
631
651
|
|
|
@@ -650,6 +670,7 @@ function Component() {
|
|
|
650
670
|
const { pay, status, error } = usePayment();
|
|
651
671
|
|
|
652
672
|
const handlePay = () => {
|
|
673
|
+
// Old v1 format - deprecated
|
|
653
674
|
pay("/api/transfer", "base-sepolia", { amount: "1000000" });
|
|
654
675
|
};
|
|
655
676
|
}
|
|
@@ -668,7 +689,8 @@ function Component() {
|
|
|
668
689
|
|
|
669
690
|
const handlePay = async () => {
|
|
670
691
|
// Convert USD amount to atomic units
|
|
671
|
-
|
|
692
|
+
// CAIP-2 format: eip155:84532 (Base Sepolia testnet)
|
|
693
|
+
const atomicAmount = parseDefaultAssetAmount("1", "eip155:84532"); // '1000000'
|
|
672
694
|
|
|
673
695
|
await execute({
|
|
674
696
|
hook: TransferHook.address,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x402x/client",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Client SDK for x402x Serverless Mode - execute on-chain contracts directly via facilitator",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"license": "Apache-2.0",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"viem": "2.40.3",
|
|
35
|
-
"@x402x/extensions": "2.
|
|
35
|
+
"@x402x/extensions": "2.4.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"react": "^18.0.0",
|