x402-express-mantle 1.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 (127) hide show
  1. package/README.md +155 -0
  2. package/lib/cjs/client/index.d.ts +243 -0
  3. package/lib/cjs/client/index.js +413 -0
  4. package/lib/cjs/client/index.js.map +1 -0
  5. package/lib/cjs/exact/client/index.d.ts +37 -0
  6. package/lib/cjs/exact/client/index.js +281 -0
  7. package/lib/cjs/exact/client/index.js.map +1 -0
  8. package/lib/cjs/exact/facilitator/index.d.ts +110 -0
  9. package/lib/cjs/exact/facilitator/index.js +714 -0
  10. package/lib/cjs/exact/facilitator/index.js.map +1 -0
  11. package/lib/cjs/exact/server/index.d.ts +87 -0
  12. package/lib/cjs/exact/server/index.js +209 -0
  13. package/lib/cjs/exact/server/index.js.map +1 -0
  14. package/lib/cjs/exact/v1/client/index.d.ts +33 -0
  15. package/lib/cjs/exact/v1/client/index.js +169 -0
  16. package/lib/cjs/exact/v1/client/index.js.map +1 -0
  17. package/lib/cjs/exact/v1/facilitator/index.d.ts +71 -0
  18. package/lib/cjs/exact/v1/facilitator/index.js +384 -0
  19. package/lib/cjs/exact/v1/facilitator/index.js.map +1 -0
  20. package/lib/cjs/facilitator/index.d.ts +192 -0
  21. package/lib/cjs/facilitator/index.js +398 -0
  22. package/lib/cjs/facilitator/index.js.map +1 -0
  23. package/lib/cjs/http/index.d.ts +52 -0
  24. package/lib/cjs/http/index.js +827 -0
  25. package/lib/cjs/http/index.js.map +1 -0
  26. package/lib/cjs/index.d.ts +145 -0
  27. package/lib/cjs/index.js +314 -0
  28. package/lib/cjs/index.js.map +1 -0
  29. package/lib/cjs/mechanisms-CzuGzYsS.d.ts +270 -0
  30. package/lib/cjs/scheme-MoBRXFM8.d.ts +29 -0
  31. package/lib/cjs/server/index.d.ts +2 -0
  32. package/lib/cjs/server/index.js +1305 -0
  33. package/lib/cjs/server/index.js.map +1 -0
  34. package/lib/cjs/signer-5OVDxViv.d.ts +79 -0
  35. package/lib/cjs/signer-BMkbhFYE.d.ts +123 -0
  36. package/lib/cjs/types/index.d.ts +1 -0
  37. package/lib/cjs/types/index.js +66 -0
  38. package/lib/cjs/types/index.js.map +1 -0
  39. package/lib/cjs/types/v1/index.d.ts +1 -0
  40. package/lib/cjs/types/v1/index.js +19 -0
  41. package/lib/cjs/types/v1/index.js.map +1 -0
  42. package/lib/cjs/utils/index.d.ts +48 -0
  43. package/lib/cjs/utils/index.js +116 -0
  44. package/lib/cjs/utils/index.js.map +1 -0
  45. package/lib/cjs/v1/index.d.ts +12 -0
  46. package/lib/cjs/v1/index.js +180 -0
  47. package/lib/cjs/v1/index.js.map +1 -0
  48. package/lib/cjs/x402HTTPResourceServer-D1YtlH_r.d.ts +719 -0
  49. package/lib/esm/chunk-3CEIVWNN.mjs +339 -0
  50. package/lib/esm/chunk-3CEIVWNN.mjs.map +1 -0
  51. package/lib/esm/chunk-BJTO5JO5.mjs +11 -0
  52. package/lib/esm/chunk-BJTO5JO5.mjs.map +1 -0
  53. package/lib/esm/chunk-EEA7DKZI.mjs +111 -0
  54. package/lib/esm/chunk-EEA7DKZI.mjs.map +1 -0
  55. package/lib/esm/chunk-FOUXRQAV.mjs +88 -0
  56. package/lib/esm/chunk-FOUXRQAV.mjs.map +1 -0
  57. package/lib/esm/chunk-IKSTWKEM.mjs +157 -0
  58. package/lib/esm/chunk-IKSTWKEM.mjs.map +1 -0
  59. package/lib/esm/chunk-JYZWCLMP.mjs +305 -0
  60. package/lib/esm/chunk-JYZWCLMP.mjs.map +1 -0
  61. package/lib/esm/chunk-PNSAJQCF.mjs +108 -0
  62. package/lib/esm/chunk-PNSAJQCF.mjs.map +1 -0
  63. package/lib/esm/chunk-PSA4YVU2.mjs +92 -0
  64. package/lib/esm/chunk-PSA4YVU2.mjs.map +1 -0
  65. package/lib/esm/chunk-QLXM7BIB.mjs +23 -0
  66. package/lib/esm/chunk-QLXM7BIB.mjs.map +1 -0
  67. package/lib/esm/chunk-TDLQZ6MP.mjs +86 -0
  68. package/lib/esm/chunk-TDLQZ6MP.mjs.map +1 -0
  69. package/lib/esm/chunk-VE37GDG2.mjs +7 -0
  70. package/lib/esm/chunk-VE37GDG2.mjs.map +1 -0
  71. package/lib/esm/chunk-WWACQNRQ.mjs +7 -0
  72. package/lib/esm/chunk-WWACQNRQ.mjs.map +1 -0
  73. package/lib/esm/chunk-X4W4S5RB.mjs +39 -0
  74. package/lib/esm/chunk-X4W4S5RB.mjs.map +1 -0
  75. package/lib/esm/chunk-Z4QX3O5V.mjs +748 -0
  76. package/lib/esm/chunk-Z4QX3O5V.mjs.map +1 -0
  77. package/lib/esm/chunk-ZYXTTU74.mjs +88 -0
  78. package/lib/esm/chunk-ZYXTTU74.mjs.map +1 -0
  79. package/lib/esm/client/index.d.mts +243 -0
  80. package/lib/esm/client/index.mjs +260 -0
  81. package/lib/esm/client/index.mjs.map +1 -0
  82. package/lib/esm/exact/client/index.d.mts +37 -0
  83. package/lib/esm/exact/client/index.mjs +36 -0
  84. package/lib/esm/exact/client/index.mjs.map +1 -0
  85. package/lib/esm/exact/facilitator/index.d.mts +110 -0
  86. package/lib/esm/exact/facilitator/index.mjs +350 -0
  87. package/lib/esm/exact/facilitator/index.mjs.map +1 -0
  88. package/lib/esm/exact/server/index.d.mts +87 -0
  89. package/lib/esm/exact/server/index.mjs +129 -0
  90. package/lib/esm/exact/server/index.mjs.map +1 -0
  91. package/lib/esm/exact/v1/client/index.d.mts +33 -0
  92. package/lib/esm/exact/v1/client/index.mjs +8 -0
  93. package/lib/esm/exact/v1/client/index.mjs.map +1 -0
  94. package/lib/esm/exact/v1/facilitator/index.d.mts +71 -0
  95. package/lib/esm/exact/v1/facilitator/index.mjs +8 -0
  96. package/lib/esm/exact/v1/facilitator/index.mjs.map +1 -0
  97. package/lib/esm/facilitator/index.d.mts +192 -0
  98. package/lib/esm/facilitator/index.mjs +373 -0
  99. package/lib/esm/facilitator/index.mjs.map +1 -0
  100. package/lib/esm/http/index.d.mts +52 -0
  101. package/lib/esm/http/index.mjs +29 -0
  102. package/lib/esm/http/index.mjs.map +1 -0
  103. package/lib/esm/index.d.mts +145 -0
  104. package/lib/esm/index.mjs +277 -0
  105. package/lib/esm/index.mjs.map +1 -0
  106. package/lib/esm/mechanisms-CzuGzYsS.d.mts +270 -0
  107. package/lib/esm/scheme-fjF-9LhT.d.mts +29 -0
  108. package/lib/esm/server/index.d.mts +2 -0
  109. package/lib/esm/server/index.mjs +563 -0
  110. package/lib/esm/server/index.mjs.map +1 -0
  111. package/lib/esm/signer-5OVDxViv.d.mts +79 -0
  112. package/lib/esm/signer-BMkbhFYE.d.mts +123 -0
  113. package/lib/esm/types/index.d.mts +1 -0
  114. package/lib/esm/types/index.mjs +10 -0
  115. package/lib/esm/types/index.mjs.map +1 -0
  116. package/lib/esm/types/v1/index.d.mts +1 -0
  117. package/lib/esm/types/v1/index.mjs +1 -0
  118. package/lib/esm/types/v1/index.mjs.map +1 -0
  119. package/lib/esm/utils/index.d.mts +48 -0
  120. package/lib/esm/utils/index.mjs +20 -0
  121. package/lib/esm/utils/index.mjs.map +1 -0
  122. package/lib/esm/v1/index.d.mts +12 -0
  123. package/lib/esm/v1/index.mjs +13 -0
  124. package/lib/esm/v1/index.mjs.map +1 -0
  125. package/lib/esm/x402HTTPResourceServer-BIfIK5HS.d.mts +719 -0
  126. package/package.json +39 -0
  127. package/src/index.js +4 -0
@@ -0,0 +1,92 @@
1
+ import {
2
+ authorizationTypes,
3
+ createNonce,
4
+ getEvmChainId
5
+ } from "./chunk-ZYXTTU74.mjs";
6
+
7
+ // src/exact/v1/client/scheme.ts
8
+ import { getAddress } from "viem";
9
+ var ExactEvmSchemeV1 = class {
10
+ /**
11
+ * Creates a new ExactEvmClientV1 instance.
12
+ *
13
+ * @param signer - The EVM signer for client operations
14
+ */
15
+ constructor(signer) {
16
+ this.signer = signer;
17
+ this.scheme = "exact";
18
+ }
19
+ /**
20
+ * Creates a payment payload for the Exact scheme (V1).
21
+ *
22
+ * @param x402Version - The x402 protocol version
23
+ * @param paymentRequirements - The payment requirements
24
+ * @returns Promise resolving to a payment payload
25
+ */
26
+ async createPaymentPayload(x402Version, paymentRequirements) {
27
+ const selectedV1 = paymentRequirements;
28
+ const nonce = createNonce();
29
+ const now = Math.floor(Date.now() / 1e3);
30
+ const authorization = {
31
+ from: this.signer.address,
32
+ to: getAddress(selectedV1.payTo),
33
+ value: selectedV1.maxAmountRequired,
34
+ validAfter: (now - 600).toString(),
35
+ // 10 minutes before
36
+ validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),
37
+ nonce
38
+ };
39
+ const signature = await this.signAuthorization(authorization, selectedV1);
40
+ const payload = {
41
+ authorization,
42
+ signature
43
+ };
44
+ return {
45
+ x402Version,
46
+ scheme: selectedV1.scheme,
47
+ network: selectedV1.network,
48
+ payload
49
+ };
50
+ }
51
+ /**
52
+ * Sign the EIP-3009 authorization using EIP-712
53
+ *
54
+ * @param authorization - The authorization to sign
55
+ * @param requirements - The payment requirements
56
+ * @returns Promise resolving to the signature
57
+ */
58
+ async signAuthorization(authorization, requirements) {
59
+ const chainId = getEvmChainId(requirements.network);
60
+ if (!requirements.extra?.name || !requirements.extra?.version) {
61
+ throw new Error(
62
+ `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
63
+ );
64
+ }
65
+ const { name, version } = requirements.extra;
66
+ const domain = {
67
+ name,
68
+ version,
69
+ chainId,
70
+ verifyingContract: getAddress(requirements.asset)
71
+ };
72
+ const message = {
73
+ from: getAddress(authorization.from),
74
+ to: getAddress(authorization.to),
75
+ value: BigInt(authorization.value),
76
+ validAfter: BigInt(authorization.validAfter),
77
+ validBefore: BigInt(authorization.validBefore),
78
+ nonce: authorization.nonce
79
+ };
80
+ return await this.signer.signTypedData({
81
+ domain,
82
+ types: authorizationTypes,
83
+ primaryType: "TransferWithAuthorization",
84
+ message
85
+ });
86
+ }
87
+ };
88
+
89
+ export {
90
+ ExactEvmSchemeV1
91
+ };
92
+ //# sourceMappingURL=chunk-PSA4YVU2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exact/v1/client/scheme.ts"],"sourcesContent":["import {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { ClientEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { createNonce, getEvmChainId } from \"../../../utils\";\n\n/**\n * EVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClientV1 instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick<PaymentPayload, \"x402Version\" | \"payload\"> & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEvmPayloadV1[\"authorization\"] = {\n from: this.signer.address,\n to: getAddress(selectedV1.payTo),\n value: selectedV1.maxAmountRequired,\n validAfter: (now - 600).toString(), // 10 minutes before\n validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Sign the authorization\n const signature = await this.signAuthorization(authorization, selectedV1);\n\n const payload: ExactEvmPayloadV1 = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n\n /**\n * Sign the EIP-3009 authorization using EIP-712\n *\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\n private async signAuthorization(\n authorization: ExactEvmPayloadV1[\"authorization\"],\n requirements: PaymentRequirementsV1,\n ): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await this.signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n }\n}\n"],"mappings":";;;;;;;AAOA,SAAS,kBAAkB;AASpB,IAAM,mBAAN,MAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3D,YAA6B,QAAyB;AAAzB;AAP7B,SAAS,SAAS;AAAA,EAOqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvD,MAAM,qBACJ,aACA,qBAGA;AACA,UAAM,aAAa;AACnB,UAAM,QAAQ,YAAY;AAC1B,UAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAExC,UAAM,gBAAoD;AAAA,MACxD,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,WAAW,WAAW,KAAK;AAAA,MAC/B,OAAO,WAAW;AAAA,MAClB,aAAa,MAAM,KAAK,SAAS;AAAA;AAAA,MACjC,cAAc,MAAM,WAAW,mBAAmB,SAAS;AAAA,MAC3D;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,KAAK,kBAAkB,eAAe,UAAU;AAExE,UAAM,UAA6B;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,kBACZ,eACA,cACwB;AACxB,UAAM,UAAU,cAAc,aAAa,OAAO;AAElD,QAAI,CAAC,aAAa,OAAO,QAAQ,CAAC,aAAa,OAAO,SAAS;AAC7D,YAAM,IAAI;AAAA,QACR,4FAA4F,aAAa,KAAK;AAAA,MAChH;AAAA,IACF;AAEA,UAAM,EAAE,MAAM,QAAQ,IAAI,aAAa;AAEvC,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,WAAW,aAAa,KAAK;AAAA,IAClD;AAEA,UAAM,UAAU;AAAA,MACd,MAAM,WAAW,cAAc,IAAI;AAAA,MACnC,IAAI,WAAW,cAAc,EAAE;AAAA,MAC/B,OAAO,OAAO,cAAc,KAAK;AAAA,MACjC,YAAY,OAAO,cAAc,UAAU;AAAA,MAC3C,aAAa,OAAO,cAAc,WAAW;AAAA,MAC7C,OAAO,cAAc;AAAA,IACvB;AAEA,WAAO,MAAM,KAAK,OAAO,cAAc;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/v1/index.ts
2
+ var NETWORKS = [
3
+ "abstract",
4
+ "abstract-testnet",
5
+ "base-sepolia",
6
+ "base",
7
+ "avalanche-fuji",
8
+ "avalanche",
9
+ "iotex",
10
+ "sei",
11
+ "sei-testnet",
12
+ "polygon",
13
+ "polygon-amoy",
14
+ "peaq",
15
+ "story",
16
+ "educhain",
17
+ "skale-base-sepolia"
18
+ ];
19
+
20
+ export {
21
+ NETWORKS
22
+ };
23
+ //# sourceMappingURL=chunk-QLXM7BIB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/v1/index.ts"],"sourcesContent":["export { ExactEvmSchemeV1 } from \"../exact/v1\";\n\nexport const NETWORKS: string[] = [\n \"abstract\",\n \"abstract-testnet\",\n \"base-sepolia\",\n \"base\",\n \"avalanche-fuji\",\n \"avalanche\",\n \"iotex\",\n \"sei\",\n \"sei-testnet\",\n \"polygon\",\n \"polygon-amoy\",\n \"peaq\",\n \"story\",\n \"educhain\",\n \"skale-base-sepolia\",\n];\n"],"mappings":";AAEO,IAAM,WAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,86 @@
1
+ // src/utils/index.ts
2
+ var findSchemesByNetwork = (map, network) => {
3
+ let implementationsByScheme = map.get(network);
4
+ if (!implementationsByScheme) {
5
+ for (const [registeredNetworkPattern, implementations] of map.entries()) {
6
+ const pattern = registeredNetworkPattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*");
7
+ const regex = new RegExp(`^${pattern}$`);
8
+ if (regex.test(network)) {
9
+ implementationsByScheme = implementations;
10
+ break;
11
+ }
12
+ }
13
+ }
14
+ return implementationsByScheme;
15
+ };
16
+ var findByNetworkAndScheme = (map, scheme, network) => {
17
+ return findSchemesByNetwork(map, network)?.get(scheme);
18
+ };
19
+ var findFacilitatorBySchemeAndNetwork = (schemeMap, scheme, network) => {
20
+ const schemeData = schemeMap.get(scheme);
21
+ if (!schemeData) return void 0;
22
+ if (schemeData.networks.has(network)) {
23
+ return schemeData.facilitator;
24
+ }
25
+ const patternRegex = new RegExp("^" + schemeData.pattern.replace("*", ".*") + "$");
26
+ if (patternRegex.test(network)) {
27
+ return schemeData.facilitator;
28
+ }
29
+ return void 0;
30
+ };
31
+ var Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;
32
+ function safeBase64Encode(data) {
33
+ if (typeof globalThis !== "undefined" && typeof globalThis.btoa === "function") {
34
+ const bytes = new TextEncoder().encode(data);
35
+ const binaryString = Array.from(bytes, (byte) => String.fromCharCode(byte)).join("");
36
+ return globalThis.btoa(binaryString);
37
+ }
38
+ return Buffer.from(data, "utf8").toString("base64");
39
+ }
40
+ function safeBase64Decode(data) {
41
+ if (typeof globalThis !== "undefined" && typeof globalThis.atob === "function") {
42
+ const binaryString = globalThis.atob(data);
43
+ const bytes = new Uint8Array(binaryString.length);
44
+ for (let i = 0; i < binaryString.length; i++) {
45
+ bytes[i] = binaryString.charCodeAt(i);
46
+ }
47
+ const decoder = new TextDecoder("utf-8");
48
+ return decoder.decode(bytes);
49
+ }
50
+ return Buffer.from(data, "base64").toString("utf-8");
51
+ }
52
+ function deepEqual(obj1, obj2) {
53
+ const normalize = (obj) => {
54
+ if (obj === null || obj === void 0) return JSON.stringify(obj);
55
+ if (typeof obj !== "object") return JSON.stringify(obj);
56
+ if (Array.isArray(obj)) {
57
+ return JSON.stringify(
58
+ obj.map(
59
+ (item) => typeof item === "object" && item !== null ? JSON.parse(normalize(item)) : item
60
+ )
61
+ );
62
+ }
63
+ const sorted = {};
64
+ Object.keys(obj).sort().forEach((key) => {
65
+ const value = obj[key];
66
+ sorted[key] = typeof value === "object" && value !== null ? JSON.parse(normalize(value)) : value;
67
+ });
68
+ return JSON.stringify(sorted);
69
+ };
70
+ try {
71
+ return normalize(obj1) === normalize(obj2);
72
+ } catch {
73
+ return JSON.stringify(obj1) === JSON.stringify(obj2);
74
+ }
75
+ }
76
+
77
+ export {
78
+ findSchemesByNetwork,
79
+ findByNetworkAndScheme,
80
+ findFacilitatorBySchemeAndNetwork,
81
+ Base64EncodedRegex,
82
+ safeBase64Encode,
83
+ safeBase64Decode,
84
+ deepEqual
85
+ };
86
+ //# sourceMappingURL=chunk-TDLQZ6MP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["import { Network } from \"../types\";\n\n/**\n * Scheme data structure for facilitator storage\n */\nexport interface SchemeData<T> {\n facilitator: T;\n networks: Set<Network>;\n pattern: Network;\n}\n\nexport const findSchemesByNetwork = <T>(\n map: Map<string, Map<string, T>>,\n network: Network,\n): Map<string, T> | undefined => {\n // Direct match first\n let implementationsByScheme = map.get(network);\n\n if (!implementationsByScheme) {\n // Try pattern matching for registered network patterns\n for (const [registeredNetworkPattern, implementations] of map.entries()) {\n // Convert the registered network pattern to a regex\n // e.g., \"eip155:*\" becomes /^eip155:.*$/\n const pattern = registeredNetworkPattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars except *\n .replace(/\\\\\\*/g, \".*\"); // Replace escaped * with .*\n\n const regex = new RegExp(`^${pattern}$`);\n\n if (regex.test(network)) {\n implementationsByScheme = implementations;\n break;\n }\n }\n }\n\n return implementationsByScheme;\n};\n\nexport const findByNetworkAndScheme = <T>(\n map: Map<string, Map<string, T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n return findSchemesByNetwork(map, network)?.get(scheme);\n};\n\n/**\n * Finds a facilitator by scheme and network using pattern matching.\n * Works with new SchemeData storage structure.\n *\n * @param schemeMap - Map of scheme names to SchemeData\n * @param scheme - The scheme to find\n * @param network - The network to match against\n * @returns The facilitator if found, undefined otherwise\n */\nexport const findFacilitatorBySchemeAndNetwork = <T>(\n schemeMap: Map<string, SchemeData<T>>,\n scheme: string,\n network: Network,\n): T | undefined => {\n const schemeData = schemeMap.get(scheme);\n if (!schemeData) return undefined;\n\n // Check if network is in the stored networks set\n if (schemeData.networks.has(network)) {\n return schemeData.facilitator;\n }\n\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(network)) {\n return schemeData.facilitator;\n }\n\n return undefined;\n};\n\nexport const Base64EncodedRegex = /^[A-Za-z0-9+/]*={0,2}$/;\n\n/**\n * Encodes a string to base64 format\n *\n * @param data - The string to be encoded to base64\n * @returns The base64 encoded string\n */\nexport function safeBase64Encode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.btoa === \"function\") {\n const bytes = new TextEncoder().encode(data);\n const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(\"\");\n return globalThis.btoa(binaryString);\n }\n return Buffer.from(data, \"utf8\").toString(\"base64\");\n}\n\n/**\n * Decodes a base64 string back to its original format\n *\n * @param data - The base64 encoded string to be decoded\n * @returns The decoded string in UTF-8 format\n */\nexport function safeBase64Decode(data: string): string {\n if (typeof globalThis !== \"undefined\" && typeof globalThis.atob === \"function\") {\n const binaryString = globalThis.atob(data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const decoder = new TextDecoder(\"utf-8\");\n return decoder.decode(bytes);\n }\n return Buffer.from(data, \"base64\").toString(\"utf-8\");\n}\n\n/**\n * Deep equality comparison for payment requirements\n * Uses a normalized JSON.stringify for consistent comparison\n *\n * @param obj1 - First object to compare\n * @param obj2 - Second object to compare\n * @returns True if objects are deeply equal\n */\nexport function deepEqual(obj1: unknown, obj2: unknown): boolean {\n // Normalize and stringify both objects for comparison\n // This handles nested objects, arrays, and different property orders\n const normalize = (obj: unknown): string => {\n // Handle primitives and null/undefined\n if (obj === null || obj === undefined) return JSON.stringify(obj);\n if (typeof obj !== \"object\") return JSON.stringify(obj);\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return JSON.stringify(\n obj.map(item =>\n typeof item === \"object\" && item !== null ? JSON.parse(normalize(item)) : item,\n ),\n );\n }\n\n // Handle objects - sort keys and recursively normalize values\n const sorted: Record<string, unknown> = {};\n Object.keys(obj as Record<string, unknown>)\n .sort()\n .forEach(key => {\n const value = (obj as Record<string, unknown>)[key];\n sorted[key] =\n typeof value === \"object\" && value !== null ? JSON.parse(normalize(value)) : value;\n });\n return JSON.stringify(sorted);\n };\n\n try {\n return normalize(obj1) === normalize(obj2);\n } catch {\n // Fallback to simple comparison if normalization fails\n return JSON.stringify(obj1) === JSON.stringify(obj2);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,7 @@
1
+ // src/index.ts
2
+ var x402Version = 2;
3
+
4
+ export {
5
+ x402Version
6
+ };
7
+ //# sourceMappingURL=chunk-VE37GDG2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export const x402Version = 2;\n"],"mappings":";AAAO,IAAM,cAAc;","names":[]}
@@ -0,0 +1,7 @@
1
+ // src/v1/index.ts
2
+ var NETWORKS = ["solana", "solana-devnet", "solana-testnet"];
3
+
4
+ export {
5
+ NETWORKS
6
+ };
7
+ //# sourceMappingURL=chunk-WWACQNRQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/v1/index.ts"],"sourcesContent":["/**\n * V1 exports for the SVM mechanism\n */\nexport { ExactSvmSchemeV1 } from \"../exact/v1\";\n\nexport const NETWORKS: string[] = [\"solana\", \"solana-devnet\", \"solana-testnet\"];\n"],"mappings":";AAKO,IAAM,WAAqB,CAAC,UAAU,iBAAiB,gBAAgB;","names":[]}
@@ -0,0 +1,39 @@
1
+ // src/types/facilitator.ts
2
+ var VerifyError = class extends Error {
3
+ /**
4
+ * Creates a VerifyError from a failed verification response.
5
+ *
6
+ * @param statusCode - HTTP status code from the facilitator
7
+ * @param response - The verify response containing error details
8
+ */
9
+ constructor(statusCode, response) {
10
+ super(`verification failed: ${response.invalidReason || "unknown reason"}`);
11
+ this.name = "VerifyError";
12
+ this.statusCode = statusCode;
13
+ this.invalidReason = response.invalidReason;
14
+ this.payer = response.payer;
15
+ }
16
+ };
17
+ var SettleError = class extends Error {
18
+ /**
19
+ * Creates a SettleError from a failed settlement response.
20
+ *
21
+ * @param statusCode - HTTP status code from the facilitator
22
+ * @param response - The settle response containing error details
23
+ */
24
+ constructor(statusCode, response) {
25
+ super(`settlement failed: ${response.errorReason || "unknown reason"}`);
26
+ this.name = "SettleError";
27
+ this.statusCode = statusCode;
28
+ this.errorReason = response.errorReason;
29
+ this.payer = response.payer;
30
+ this.transaction = response.transaction;
31
+ this.network = response.network;
32
+ }
33
+ };
34
+
35
+ export {
36
+ VerifyError,
37
+ SettleError
38
+ };
39
+ //# sourceMappingURL=chunk-X4W4S5RB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/facilitator.ts"],"sourcesContent":["import { PaymentPayload, PaymentRequirements } from \"./payments\";\nimport { Network } from \"./\";\n\nexport type VerifyRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type VerifyResponse = {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n};\n\nexport type SettleRequest = {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n};\n\nexport type SettleResponse = {\n success: boolean;\n errorReason?: string;\n payer?: string;\n transaction: string;\n network: Network;\n};\n\nexport type SupportedKind = {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n};\n\nexport type SupportedResponse = {\n kinds: SupportedKind[];\n extensions: string[];\n signers: Record<string, string[]>; // CAIP family pattern → Signer addresses\n};\n\n/**\n * Error thrown when payment verification fails.\n */\nexport class VerifyError extends Error {\n readonly invalidReason?: string;\n readonly payer?: string;\n readonly statusCode: number;\n\n /**\n * Creates a VerifyError from a failed verification response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The verify response containing error details\n */\n constructor(statusCode: number, response: VerifyResponse) {\n super(`verification failed: ${response.invalidReason || \"unknown reason\"}`);\n this.name = \"VerifyError\";\n this.statusCode = statusCode;\n this.invalidReason = response.invalidReason;\n this.payer = response.payer;\n }\n}\n\n/**\n * Error thrown when payment settlement fails.\n */\nexport class SettleError extends Error {\n readonly errorReason?: string;\n readonly payer?: string;\n readonly transaction: string;\n readonly network: Network;\n readonly statusCode: number;\n\n /**\n * Creates a SettleError from a failed settlement response.\n *\n * @param statusCode - HTTP status code from the facilitator\n * @param response - The settle response containing error details\n */\n constructor(statusCode: number, response: SettleResponse) {\n super(`settlement failed: ${response.errorReason || \"unknown reason\"}`);\n this.name = \"SettleError\";\n this.statusCode = statusCode;\n this.errorReason = response.errorReason;\n this.payer = response.payer;\n this.transaction = response.transaction;\n this.network = response.network;\n }\n}\n"],"mappings":";AA2CO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrC,YAAY,YAAoB,UAA0B;AACxD,UAAM,wBAAwB,SAAS,iBAAiB,gBAAgB,EAAE;AAC1E,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAKO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAarC,YAAY,YAAoB,UAA0B;AACxD,UAAM,sBAAsB,SAAS,eAAe,gBAAgB,EAAE;AACtE,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,cAAc,SAAS;AAC5B,SAAK,QAAQ,SAAS;AACtB,SAAK,cAAc,SAAS;AAC5B,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;","names":[]}