@armory-sh/client-web3 0.2.9 → 0.2.10

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/dist/index.d.ts CHANGED
@@ -48,6 +48,7 @@ interface X402TransportOptions {
48
48
  maxRetries?: number;
49
49
  }
50
50
  interface Web3X402Client {
51
+ fetch(url: string | Request, init?: RequestInit): Promise<Response>;
51
52
  getAccount(): Web3Account;
52
53
  getNetwork(): NetworkConfig;
53
54
  getVersion(): 1 | 2;
package/dist/index.js CHANGED
@@ -6,7 +6,9 @@ import {
6
6
  encodePaymentV2,
7
7
  isX402V1Requirements,
8
8
  isX402V2Requirements,
9
- combineSignatureV2
9
+ combineSignatureV2,
10
+ V1_HEADERS as V1_HEADERS2,
11
+ V2_HEADERS as V2_HEADERS2
10
12
  } from "@armory-sh/base";
11
13
 
12
14
  // src/eip3009.ts
@@ -236,8 +238,9 @@ var createX402V2Payment = (params) => {
236
238
  };
237
239
  return {
238
240
  x402Version: 2,
241
+ scheme: params.accepted.scheme,
242
+ network: params.accepted.network,
239
243
  resource: params.resource,
240
- accepted: params.accepted,
241
244
  payload: {
242
245
  signature: params.signature,
243
246
  authorization
@@ -359,6 +362,36 @@ var signPaymentV1 = async (state, params) => {
359
362
  };
360
363
  return { v: signature.v, r: signature.r, s: signature.s, payload: legacyPayload };
361
364
  };
365
+ var handlePaymentRequirements = async (requirements, state) => {
366
+ const version = detectVersionFromRequirements(requirements);
367
+ if (version === 1) {
368
+ const req2 = requirements;
369
+ if (isX402V1Requirements(req2)) {
370
+ const x402Req = req2;
371
+ return signPayment({
372
+ amount: x402Req.maxAmountRequired,
373
+ to: x402Req.payTo
374
+ }, state);
375
+ }
376
+ const legacyReq = req2;
377
+ return signPayment({
378
+ amount: legacyReq.amount,
379
+ to: legacyReq.payTo,
380
+ expiry: legacyReq.expiry
381
+ }, state);
382
+ }
383
+ const req = requirements;
384
+ const to = typeof req.payTo === "string" ? req.payTo : "0x0000000000000000000000000000000000000000";
385
+ const from = getAddress(state.account);
386
+ return signPaymentV2(state, {
387
+ from,
388
+ to,
389
+ amount: req.amount,
390
+ nonce: crypto.randomUUID(),
391
+ expiry: Math.floor(Date.now() / 1e3) + DEFAULT_EXPIRY_SECONDS,
392
+ accepted: req
393
+ });
394
+ };
362
395
  var signPaymentV2 = async (state, params) => {
363
396
  const { from, to, amount, nonce, expiry, accepted } = params;
364
397
  const { network, domainName, domainVersion } = state;
@@ -402,7 +435,43 @@ var signPaymentV2 = async (state, params) => {
402
435
  };
403
436
  var createX402Client = (config) => {
404
437
  const state = createClientState(config);
438
+ const fetch2 = async (url, init) => {
439
+ let response = await fetch2(url, init);
440
+ if (response.status === 402) {
441
+ const version = detectX402Version(response, state.version);
442
+ const parsed = await parsePaymentRequired(response, version);
443
+ const selectedRequirements = selectSchemeRequirements(parsed.requirements, "exact");
444
+ if (!selectedRequirements) {
445
+ throw new Error("No supported payment scheme found in requirements");
446
+ }
447
+ const from = getAddress(state.account);
448
+ let result;
449
+ if (version === 1) {
450
+ result = await handlePaymentRequirements(selectedRequirements, state);
451
+ } else {
452
+ const req = selectedRequirements;
453
+ const to = typeof req.payTo === "string" ? req.payTo : "0x0000000000000000000000000000000000000000";
454
+ result = await signPaymentV2(state, {
455
+ from,
456
+ to,
457
+ amount: req.amount,
458
+ nonce: crypto.randomUUID(),
459
+ expiry: Math.floor(Date.now() / 1e3) + DEFAULT_EXPIRY_SECONDS,
460
+ accepted: req
461
+ });
462
+ }
463
+ const paymentHeaders = new Headers(init?.headers);
464
+ if (version === 1) {
465
+ paymentHeaders.set(V1_HEADERS2.PAYMENT, encodePaymentV1(result.payload));
466
+ } else {
467
+ paymentHeaders.set(V2_HEADERS2.PAYMENT_SIGNATURE, encodePaymentV2(result.payload));
468
+ }
469
+ response = await fetch2(url, { ...init, headers: paymentHeaders });
470
+ }
471
+ return response;
472
+ };
405
473
  return {
474
+ fetch: fetch2,
406
475
  getAccount: () => state.account,
407
476
  getNetwork: () => state.network,
408
477
  getVersion: () => state.version,
@@ -435,34 +504,7 @@ var createX402Client = (config) => {
435
504
  return headers;
436
505
  },
437
506
  handlePaymentRequired: async (requirements) => {
438
- const version = detectVersionFromRequirements(requirements);
439
- if (version === 1) {
440
- const req2 = requirements;
441
- if (isX402V1Requirements(req2)) {
442
- const x402Req = req2;
443
- return signPayment({
444
- amount: x402Req.maxAmountRequired,
445
- to: x402Req.payTo
446
- }, state);
447
- }
448
- const legacyReq = req2;
449
- return signPayment({
450
- amount: legacyReq.amount,
451
- to: legacyReq.payTo,
452
- expiry: legacyReq.expiry
453
- }, state);
454
- }
455
- const req = requirements;
456
- const to = typeof req.payTo === "string" ? req.payTo : "0x0000000000000000000000000000000000000000";
457
- const from = getAddress(state.account);
458
- return signPaymentV2(state, {
459
- from,
460
- to,
461
- amount: req.amount,
462
- nonce: crypto.randomUUID(),
463
- expiry: Math.floor(Date.now() / 1e3) + DEFAULT_EXPIRY_SECONDS,
464
- accepted: req
465
- });
507
+ return handlePaymentRequirements(requirements, state);
466
508
  },
467
509
  verifySettlement: (response) => {
468
510
  if ("success" in response) {
@@ -507,8 +549,8 @@ var signPayment = async (options, state) => {
507
549
 
508
550
  // src/transport.ts
509
551
  import {
510
- V1_HEADERS as V1_HEADERS2,
511
- V2_HEADERS as V2_HEADERS2,
552
+ V1_HEADERS as V1_HEADERS3,
553
+ V2_HEADERS as V2_HEADERS3,
512
554
  encodePaymentV1 as encodePaymentV12,
513
555
  encodePaymentV2 as encodePaymentV22,
514
556
  isX402V1Requirements as isX402V1Requirements2,
@@ -518,9 +560,9 @@ var DEFAULT_MAX_RETRIES = 3;
518
560
  var createPaymentHeaders = (payload, version) => {
519
561
  const headers = new Headers();
520
562
  if (version === 1) {
521
- headers.set(V1_HEADERS2.PAYMENT, encodePaymentV12(payload));
563
+ headers.set(V1_HEADERS3.PAYMENT, encodePaymentV12(payload));
522
564
  } else {
523
- headers.set(V2_HEADERS2.PAYMENT_SIGNATURE, encodePaymentV22(payload));
565
+ headers.set(V2_HEADERS3.PAYMENT_SIGNATURE, encodePaymentV22(payload));
524
566
  }
525
567
  return headers;
526
568
  };
@@ -599,8 +641,8 @@ var isV2Settlement = (response) => "status" in response;
599
641
 
600
642
  // src/index.ts
601
643
  import {
602
- V1_HEADERS as V1_HEADERS3,
603
- V2_HEADERS as V2_HEADERS3,
644
+ V1_HEADERS as V1_HEADERS4,
645
+ V2_HEADERS as V2_HEADERS4,
604
646
  encodePaymentV1 as encodePaymentV13,
605
647
  decodePaymentV1,
606
648
  encodeSettlementV1,
@@ -645,8 +687,8 @@ export {
645
687
  EIP712_TYPES,
646
688
  NETWORKS,
647
689
  USDC_DOMAIN,
648
- V1_HEADERS3 as V1_HEADERS,
649
- V2_HEADERS3 as V2_HEADERS,
690
+ V1_HEADERS4 as V1_HEADERS,
691
+ V2_HEADERS4 as V2_HEADERS,
650
692
  adjustVForChainId,
651
693
  combineSignatureV22 as combineSignatureV2,
652
694
  concatenateSignature,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armory-sh/client-web3",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "license": "MIT",
5
5
  "author": "Sawyer Cutler <sawyer@dirtroad.dev>",
6
6
  "type": "module",
@@ -27,7 +27,7 @@
27
27
  "directory": "packages/client-web3"
28
28
  },
29
29
  "dependencies": {
30
- "@armory-sh/base": "^0.2.12",
30
+ "@armory-sh/base": "^0.2.13",
31
31
  "web3": "4.16.0",
32
32
  "web3-types": "1.10.0"
33
33
  },
@@ -36,7 +36,7 @@
36
36
  "bun-types": "latest"
37
37
  },
38
38
  "scripts": {
39
- "build": "tsup",
39
+ "build": "rm -rf dist && tsup",
40
40
  "test": "bun test",
41
41
  "example": "bun run examples/"
42
42
  }