@ic-pay/icpay-sdk 1.3.96 → 1.4.13

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 (49) hide show
  1. package/dist/index.d.ts +47 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +790 -325
  4. package/dist/index.js.map +1 -1
  5. package/dist/protected.d.ts.map +1 -1
  6. package/dist/protected.js.map +1 -1
  7. package/dist/types/index.d.ts +48 -2
  8. package/dist/types/index.d.ts.map +1 -1
  9. package/dist/x402/builders.d.ts +60 -0
  10. package/dist/x402/builders.d.ts.map +1 -0
  11. package/dist/x402/builders.js +210 -0
  12. package/dist/x402/builders.js.map +1 -0
  13. package/dist/x402/common.d.ts +23 -0
  14. package/dist/x402/common.d.ts.map +1 -0
  15. package/dist/x402/common.js +108 -0
  16. package/dist/x402/common.js.map +1 -0
  17. package/dist/x402/encode.d.ts +23 -0
  18. package/dist/x402/encode.d.ts.map +1 -0
  19. package/dist/x402/encode.js +71 -0
  20. package/dist/x402/encode.js.map +1 -0
  21. package/dist/x402/facilitator.d.ts +88 -0
  22. package/dist/x402/facilitator.d.ts.map +1 -0
  23. package/dist/x402/facilitator.js +214 -0
  24. package/dist/x402/facilitator.js.map +1 -0
  25. package/dist/x402/fetchWithPayment.d.ts +43 -0
  26. package/dist/x402/fetchWithPayment.d.ts.map +1 -0
  27. package/dist/x402/fetchWithPayment.js +117 -0
  28. package/dist/x402/fetchWithPayment.js.map +1 -0
  29. package/dist/x402/schemas.d.ts +34 -0
  30. package/dist/x402/schemas.d.ts.map +1 -0
  31. package/dist/x402/schemas.js +126 -0
  32. package/dist/x402/schemas.js.map +1 -0
  33. package/dist/x402/settle-payment.d.ts +120 -0
  34. package/dist/x402/settle-payment.d.ts.map +1 -0
  35. package/dist/x402/settle-payment.js +177 -0
  36. package/dist/x402/settle-payment.js.map +1 -0
  37. package/dist/x402/sign.d.ts +13 -0
  38. package/dist/x402/sign.d.ts.map +1 -0
  39. package/dist/x402/sign.js +221 -0
  40. package/dist/x402/sign.js.map +1 -0
  41. package/dist/x402/types.d.ts +58 -0
  42. package/dist/x402/types.d.ts.map +1 -0
  43. package/dist/x402/types.js +3 -0
  44. package/dist/x402/types.js.map +1 -0
  45. package/dist/x402/verify-payment.d.ts +70 -0
  46. package/dist/x402/verify-payment.d.ts.map +1 -0
  47. package/dist/x402/verify-payment.js +123 -0
  48. package/dist/x402/verify-payment.js.map +1 -0
  49. package/package.json +9 -9
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.facilitator = facilitator;
4
+ const json_js_1 = require("../utils/json.js");
5
+ const withCache_js_1 = require("../utils/promise/withCache.js");
6
+ const schemas_js_1 = require("./schemas.js");
7
+ const DEFAULT_BASE_URL = "https://api.thirdweb.com/v1/payments/x402";
8
+ /**
9
+ * Creates a facilitator for the x402 payment protocol.
10
+ * You can use this with `settlePayment` or with any x402 middleware to enable settling transactions with your thirdweb server wallet.
11
+ *
12
+ * @param config - The configuration for the facilitator
13
+ * @returns a x402 compatible FacilitatorConfig
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { facilitator } from "thirdweb/x402";
18
+ * import { createThirdwebClient } from "thirdweb";
19
+ * import { paymentMiddleware } from 'x402-hono'
20
+ *
21
+ * const client = createThirdwebClient({
22
+ * secretKey: "your-secret-key",
23
+ * });
24
+ * const thirdwebX402Facilitator = facilitator({
25
+ * client: client,
26
+ * serverWalletAddress: "0x1234567890123456789012345678901234567890",
27
+ * });
28
+ *
29
+ * // add the facilitator to any x402 payment middleware
30
+ * const middleware = paymentMiddleware(
31
+ * "0x1234567890123456789012345678901234567890",
32
+ * {
33
+ * "/api/paywall": {
34
+ * price: "$0.01",
35
+ * network: "base-sepolia",
36
+ * config: {
37
+ * description: "Access to paid content",
38
+ * },
39
+ * },
40
+ * },
41
+ * thirdwebX402Facilitator,
42
+ * );
43
+ * ```
44
+ *
45
+ * #### Configuration Options
46
+ *
47
+ * ```ts
48
+ * const thirdwebX402Facilitator = facilitator({
49
+ * client: client,
50
+ * serverWalletAddress: "0x1234567890123456789012345678901234567890",
51
+ * // Optional: Wait behavior for settlements
52
+ * // - "simulated": Only simulate the transaction (fastest)
53
+ * // - "submitted": Wait until transaction is submitted
54
+ * // - "confirmed": Wait for full on-chain confirmation (slowest, default)
55
+ * waitUntil: "confirmed",
56
+ * });
57
+
58
+ * ```
59
+ *
60
+ * @bridge x402
61
+ */
62
+ function facilitator(config) {
63
+ const secretKey = config.client.secretKey;
64
+ if (!secretKey) {
65
+ throw new Error("Client secret key is required for the x402 facilitator");
66
+ }
67
+ const serverWalletAddress = config.serverWalletAddress;
68
+ if (!serverWalletAddress) {
69
+ throw new Error("Server wallet address is required for the x402 facilitator");
70
+ }
71
+ const facilitator = {
72
+ url: (config.baseUrl ?? DEFAULT_BASE_URL),
73
+ address: serverWalletAddress,
74
+ createAuthHeaders: async () => {
75
+ return {
76
+ verify: {
77
+ "x-secret-key": secretKey,
78
+ },
79
+ settle: {
80
+ "x-secret-key": secretKey,
81
+ ...(config.vaultAccessToken
82
+ ? { "x-vault-access-token": config.vaultAccessToken }
83
+ : {}),
84
+ },
85
+ supported: {
86
+ "x-secret-key": secretKey,
87
+ },
88
+ list: {
89
+ "x-secret-key": secretKey,
90
+ },
91
+ };
92
+ },
93
+ /**
94
+ * Verifies a payment payload with the facilitator service
95
+ *
96
+ * @param payload - The payment payload to verify
97
+ * @param paymentRequirements - The payment requirements to verify against
98
+ * @returns A promise that resolves to the verification response
99
+ */
100
+ async verify(payload, paymentRequirements) {
101
+ const url = config.baseUrl ?? DEFAULT_BASE_URL;
102
+ let headers = { "Content-Type": "application/json" };
103
+ const authHeaders = await facilitator.createAuthHeaders();
104
+ headers = { ...headers, ...authHeaders.verify };
105
+ const res = await fetch(`${url}/verify`, {
106
+ method: "POST",
107
+ headers,
108
+ body: (0, json_js_1.stringify)({
109
+ x402Version: payload.x402Version,
110
+ paymentPayload: payload,
111
+ paymentRequirements: paymentRequirements,
112
+ }),
113
+ });
114
+ if (res.status !== 200) {
115
+ const text = `${res.statusText} ${await res.text()}`;
116
+ throw new Error(`Failed to verify payment: ${res.status} ${text}`);
117
+ }
118
+ const data = await res.json();
119
+ return data;
120
+ },
121
+ /**
122
+ * Settles a payment with the facilitator service
123
+ *
124
+ * @param payload - The payment payload to settle
125
+ * @param paymentRequirements - The payment requirements for the settlement
126
+ * @returns A promise that resolves to the settlement response
127
+ */
128
+ async settle(payload, paymentRequirements, waitUntil) {
129
+ const url = config.baseUrl ?? DEFAULT_BASE_URL;
130
+ let headers = { "Content-Type": "application/json" };
131
+ const authHeaders = await facilitator.createAuthHeaders();
132
+ headers = { ...headers, ...authHeaders.settle };
133
+ const waitUntilParam = waitUntil || config.waitUntil;
134
+ const res = await fetch(`${url}/settle`, {
135
+ method: "POST",
136
+ headers,
137
+ body: JSON.stringify({
138
+ x402Version: payload.x402Version,
139
+ paymentPayload: payload,
140
+ paymentRequirements: paymentRequirements,
141
+ ...(waitUntilParam ? { waitUntil: waitUntilParam } : {}),
142
+ }),
143
+ });
144
+ if (res.status !== 200) {
145
+ const text = `${res.statusText} ${await res.text()}`;
146
+ throw new Error(`Failed to settle payment: ${res.status} ${text}`);
147
+ }
148
+ const data = await res.json();
149
+ return data;
150
+ },
151
+ /**
152
+ * Gets the supported payment kinds from the facilitator service.
153
+ *
154
+ * @returns A promise that resolves to the supported payment kinds
155
+ */
156
+ async supported(filters) {
157
+ const url = config.baseUrl ?? DEFAULT_BASE_URL;
158
+ return (0, withCache_js_1.withCache)(async () => {
159
+ let headers = { "Content-Type": "application/json" };
160
+ const authHeaders = await facilitator.createAuthHeaders();
161
+ headers = { ...headers, ...authHeaders.supported };
162
+ const supportedUrl = new URL(`${url}/supported`);
163
+ if (filters?.chainId) {
164
+ supportedUrl.searchParams.set("chainId", filters.chainId.toString());
165
+ }
166
+ if (filters?.tokenAddress) {
167
+ supportedUrl.searchParams.set("tokenAddress", filters.tokenAddress);
168
+ }
169
+ const res = await fetch(supportedUrl.toString(), { headers });
170
+ if (res.status !== 200) {
171
+ throw new Error(`Failed to get supported payment kinds: ${res.statusText}`);
172
+ }
173
+ const data = await res.json();
174
+ return data;
175
+ }, {
176
+ cacheKey: `supported-payment-kinds-${url}-${filters?.chainId}-${filters?.tokenAddress}2`,
177
+ cacheTime: 1000 * 60 * 60 * 1, // 1 hour
178
+ });
179
+ },
180
+ async accepts(args) {
181
+ const url = config.baseUrl ?? DEFAULT_BASE_URL;
182
+ let headers = { "Content-Type": "application/json" };
183
+ const authHeaders = await facilitator.createAuthHeaders();
184
+ headers = { ...headers, ...authHeaders.verify }; // same as verify
185
+ const caip2ChainId = (0, schemas_js_1.networkToCaip2ChainId)(args.network);
186
+ const res = await fetch(`${url}/accepts`, {
187
+ method: "POST",
188
+ headers,
189
+ body: (0, json_js_1.stringify)({
190
+ resourceUrl: args.resourceUrl,
191
+ method: args.method,
192
+ network: caip2ChainId,
193
+ price: args.price,
194
+ routeConfig: args.routeConfig,
195
+ serverWalletAddress: facilitator.address,
196
+ recipientAddress: args.payTo,
197
+ extraMetadata: args.extraMetadata,
198
+ }),
199
+ });
200
+ if (res.status !== 402) {
201
+ throw new Error(`Failed to construct payment requirements: ${res.statusText} - ${await res.text()}`);
202
+ }
203
+ return {
204
+ status: res.status,
205
+ responseBody: (await res.json()),
206
+ responseHeaders: {
207
+ "Content-Type": "application/json",
208
+ },
209
+ };
210
+ },
211
+ };
212
+ return facilitator;
213
+ }
214
+ //# sourceMappingURL=facilitator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/x402/facilitator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ThirdwebClient } from "../client/client.js";
2
+ import type { Wallet } from "../wallets/interfaces/wallet.js";
3
+ /**
4
+ * Enables the payment of APIs using the x402 payment protocol.
5
+ *
6
+ * This function wraps the native fetch API to automatically handle 402 Payment Required responses
7
+ * by creating and sending a payment header. It will:
8
+ * 1. Make the initial request
9
+ * 2. If a 402 response is received, parse the payment requirements
10
+ * 3. Verify the payment amount is within the allowed maximum
11
+ * 4. Create a payment header using the provided wallet client
12
+ * 5. Retry the request with the payment header
13
+ *
14
+ * @param fetch - The fetch function to wrap (typically globalThis.fetch)
15
+ * @param client - The thirdweb client used to access RPC infrastructure
16
+ * @param wallet - The wallet used to sign payment messages
17
+ * @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
18
+ * @returns A wrapped fetch function that handles 402 responses automatically
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { wrapFetchWithPayment } from "thirdweb/x402";
23
+ * import { createThirdwebClient } from "thirdweb";
24
+ * import { createWallet } from "thirdweb/wallets";
25
+ *
26
+ * const client = createThirdwebClient({ clientId: "your-client-id" });
27
+ * const wallet = createWallet("io.metamask");
28
+ * await wallet.connect({ client })
29
+ *
30
+ * const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
31
+ *
32
+ * // Make a request that may require payment
33
+ * const response = await fetchWithPay('https://api.example.com/paid-endpoint');
34
+ * ```
35
+ *
36
+ * @throws {Error} If the payment amount exceeds the maximum allowed value
37
+ * @throws {Error} If a payment has already been attempted for this request
38
+ * @throws {Error} If there's an error creating the payment header
39
+ *
40
+ * @bridge x402
41
+ */
42
+ export declare function wrapFetchWithPayment(fetch: typeof globalThis.fetch, client: ThirdwebClient, wallet: Wallet, maxValue?: bigint): (input: RequestInfo, init?: RequestInit) => Promise<Response>;
43
+ //# sourceMappingURL=fetchWithPayment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWithPayment.d.ts","sourceRoot":"","sources":["../../src/x402/fetchWithPayment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,EAC9B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAA4B,IAExB,OAAO,WAAW,EAAE,OAAO,WAAW,uBAyFrD"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapFetchWithPayment = wrapFetchWithPayment;
4
+ const utils_js_1 = require("../chains/utils.js");
5
+ const schemas_js_1 = require("./schemas.js");
6
+ const sign_js_1 = require("./sign.js");
7
+ /**
8
+ * Enables the payment of APIs using the x402 payment protocol.
9
+ *
10
+ * This function wraps the native fetch API to automatically handle 402 Payment Required responses
11
+ * by creating and sending a payment header. It will:
12
+ * 1. Make the initial request
13
+ * 2. If a 402 response is received, parse the payment requirements
14
+ * 3. Verify the payment amount is within the allowed maximum
15
+ * 4. Create a payment header using the provided wallet client
16
+ * 5. Retry the request with the payment header
17
+ *
18
+ * @param fetch - The fetch function to wrap (typically globalThis.fetch)
19
+ * @param client - The thirdweb client used to access RPC infrastructure
20
+ * @param wallet - The wallet used to sign payment messages
21
+ * @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
22
+ * @returns A wrapped fetch function that handles 402 responses automatically
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { wrapFetchWithPayment } from "thirdweb/x402";
27
+ * import { createThirdwebClient } from "thirdweb";
28
+ * import { createWallet } from "thirdweb/wallets";
29
+ *
30
+ * const client = createThirdwebClient({ clientId: "your-client-id" });
31
+ * const wallet = createWallet("io.metamask");
32
+ * await wallet.connect({ client })
33
+ *
34
+ * const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
35
+ *
36
+ * // Make a request that may require payment
37
+ * const response = await fetchWithPay('https://api.example.com/paid-endpoint');
38
+ * ```
39
+ *
40
+ * @throws {Error} If the payment amount exceeds the maximum allowed value
41
+ * @throws {Error} If a payment has already been attempted for this request
42
+ * @throws {Error} If there's an error creating the payment header
43
+ *
44
+ * @bridge x402
45
+ */
46
+ function wrapFetchWithPayment(fetch, client, wallet, maxValue = BigInt(1 * 10 ** 6)) {
47
+ return async (input, init) => {
48
+ const response = await fetch(input, init);
49
+ if (response.status !== 402) {
50
+ return response;
51
+ }
52
+ const { x402Version, accepts, error } = (await response.json());
53
+ const parsedPaymentRequirements = accepts
54
+ .map((x) => schemas_js_1.RequestedPaymentRequirementsSchema.parse(x))
55
+ .filter((x) => x.scheme === "exact"); // TODO (402): accept other schemes
56
+ const account = wallet.getAccount();
57
+ let chain = wallet.getChain();
58
+ if (!account || !chain) {
59
+ throw new Error("Wallet not connected. Please connect your wallet to continue.");
60
+ }
61
+ const selectedPaymentRequirements = defaultPaymentRequirementsSelector(parsedPaymentRequirements, chain.id, "exact", error);
62
+ if (!selectedPaymentRequirements) {
63
+ throw new Error(`No suitable payment requirements found for chain ${chain.id}. ${error}`);
64
+ }
65
+ if (BigInt(selectedPaymentRequirements.maxAmountRequired) > maxValue) {
66
+ throw new Error(`Payment amount exceeds maximum allowed (currently set to ${maxValue} in base units)`);
67
+ }
68
+ const caip2ChainId = (0, schemas_js_1.networkToCaip2ChainId)(selectedPaymentRequirements.network);
69
+ const paymentChainId = (0, schemas_js_1.extractEvmChainId)(caip2ChainId);
70
+ // TODO (402): support solana
71
+ if (paymentChainId === null) {
72
+ throw new Error(`Unsupported chain ID: ${selectedPaymentRequirements.network}`);
73
+ }
74
+ // switch to the payment chain if it's not the current chain
75
+ if (paymentChainId !== chain.id) {
76
+ await wallet.switchChain((0, utils_js_1.getCachedChain)(paymentChainId));
77
+ chain = wallet.getChain();
78
+ if (!chain) {
79
+ throw new Error(`Failed to switch chain (${paymentChainId})`);
80
+ }
81
+ }
82
+ const paymentHeader = await (0, sign_js_1.createPaymentHeader)(client, account, selectedPaymentRequirements, x402Version);
83
+ const initParams = init || {};
84
+ if (initParams.__is402Retry) {
85
+ throw new Error("Payment already attempted");
86
+ }
87
+ const newInit = {
88
+ ...initParams,
89
+ headers: {
90
+ ...(initParams.headers || {}),
91
+ "X-PAYMENT": paymentHeader,
92
+ "Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
93
+ },
94
+ __is402Retry: true,
95
+ };
96
+ const secondResponse = await fetch(input, newInit);
97
+ return secondResponse;
98
+ };
99
+ }
100
+ function defaultPaymentRequirementsSelector(paymentRequirements, chainId, scheme, error) {
101
+ if (!paymentRequirements.length) {
102
+ throw new Error(`No valid payment requirements found in server 402 response. ${error}`);
103
+ }
104
+ // find the payment requirements matching the connected wallet chain
105
+ const matchingPaymentRequirements = paymentRequirements.find((x) => (0, schemas_js_1.extractEvmChainId)((0, schemas_js_1.networkToCaip2ChainId)(x.network)) === chainId &&
106
+ x.scheme === scheme);
107
+ if (matchingPaymentRequirements) {
108
+ return matchingPaymentRequirements;
109
+ }
110
+ else {
111
+ // if no matching payment requirements, use the first payment requirement
112
+ // and switch the wallet to that chain
113
+ const firstPaymentRequirement = paymentRequirements.find((x) => x.scheme === scheme);
114
+ return firstPaymentRequirement;
115
+ }
116
+ }
117
+ //# sourceMappingURL=fetchWithPayment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWithPayment.js","sourceRoot":"","sources":["../../src/x402/fetchWithPayment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type ExactEvmPayload } from "x402/types";
2
+ import { z } from "zod";
3
+ import type { Chain } from "../chains/types.js";
4
+ declare const FacilitatorNetworkSchema: any;
5
+ export type FacilitatorNetwork = z.infer<typeof FacilitatorNetworkSchema>;
6
+ export declare const RequestedPaymentPayloadSchema: any;
7
+ export type RequestedPaymentPayload = z.infer<typeof RequestedPaymentPayloadSchema>;
8
+ export type UnsignedPaymentPayload = Omit<RequestedPaymentPayload, "payload"> & {
9
+ payload: Omit<ExactEvmPayload, "signature"> & {
10
+ signature: undefined;
11
+ };
12
+ };
13
+ export declare const RequestedPaymentRequirementsSchema: any;
14
+ export type RequestedPaymentRequirements = z.infer<typeof RequestedPaymentRequirementsSchema>;
15
+ declare const FacilitatorSettleResponseSchema: any;
16
+ export type FacilitatorSettleResponse = z.infer<typeof FacilitatorSettleResponseSchema>;
17
+ declare const FacilitatorVerifyResponseSchema: any;
18
+ export type FacilitatorVerifyResponse = z.infer<typeof FacilitatorVerifyResponseSchema>;
19
+ export declare const SupportedSignatureTypeSchema: any;
20
+ declare const FacilitatorSupportedResponseSchema: any;
21
+ export type FacilitatorSupportedResponse = z.infer<typeof FacilitatorSupportedResponseSchema>;
22
+ /**
23
+ * Extract numeric chain ID from CAIP-2 EVM chain (e.g., "eip155:1" -> 1)
24
+ */
25
+ export declare function extractEvmChainId(caip2ChainId: Caip2ChainId): number | null;
26
+ /**
27
+ * CAIP-2 compliant blockchain identifier
28
+ * @see https://chainagnostic.org/CAIPs/caip-2
29
+ */
30
+ declare const Caip2ChainIdSchema: any;
31
+ type Caip2ChainId = z.output<typeof Caip2ChainIdSchema>;
32
+ export declare function networkToCaip2ChainId(network: string | Chain): Caip2ChainId;
33
+ export {};
34
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/x402/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAOrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,QAAA,MAAM,wBAAwB,KAAa,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,6BAA6B,KAExC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,6BAA6B,CACrC,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,uBAAuB,EACvB,SAAS,CACV,GAAG;IACF,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC;CACxE,CAAC;AAEF,eAAO,MAAM,kCAAkC,KAG3C,CAAC;AAEL,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,kCAAkC,CAC1C,CAAC;AAEF,QAAA,MAAM,+BAA+B,KAGnC,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,QAAA,MAAM,+BAA+B,KAEnC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,eAAO,MAAM,4BAA4B,KAGvC,CAAC;AAYH,QAAA,MAAM,kCAAkC,KAiBqB,CAAC;AAE9D,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,kCAAkC,CAC1C,CAAC;AAMF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAO3E;AAED;;;GAGG;AACH,QAAA,MAAM,kBAAkB,KA8DrB,CAAC;AAEJ,KAAK,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAExD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAK3E"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupportedSignatureTypeSchema = exports.RequestedPaymentRequirementsSchema = exports.RequestedPaymentPayloadSchema = void 0;
4
+ exports.extractEvmChainId = extractEvmChainId;
5
+ exports.networkToCaip2ChainId = networkToCaip2ChainId;
6
+ const types_1 = require("x402/types");
7
+ const zod_1 = require("zod");
8
+ const FacilitatorNetworkSchema = zod_1.z.string();
9
+ exports.RequestedPaymentPayloadSchema = types_1.PaymentPayloadSchema.extend({
10
+ network: FacilitatorNetworkSchema,
11
+ });
12
+ exports.RequestedPaymentRequirementsSchema = types_1.PaymentRequirementsSchema.extend({
13
+ network: FacilitatorNetworkSchema,
14
+ });
15
+ const FacilitatorSettleResponseSchema = types_1.SettleResponseSchema.extend({
16
+ network: FacilitatorNetworkSchema,
17
+ errorMessage: zod_1.z.string().optional(),
18
+ });
19
+ const FacilitatorVerifyResponseSchema = types_1.VerifyResponseSchema.extend({
20
+ errorMessage: zod_1.z.string().optional(),
21
+ });
22
+ exports.SupportedSignatureTypeSchema = zod_1.z.enum([
23
+ "TransferWithAuthorization",
24
+ "Permit",
25
+ ]);
26
+ const FacilitatorSupportedAssetSchema = zod_1.z.object({
27
+ address: zod_1.z.string(),
28
+ decimals: zod_1.z.number(),
29
+ eip712: zod_1.z.object({
30
+ name: zod_1.z.string(),
31
+ version: zod_1.z.string(),
32
+ primaryType: exports.SupportedSignatureTypeSchema,
33
+ }),
34
+ });
35
+ const FacilitatorSupportedResponseSchema = types_1.SupportedPaymentKindsResponseSchema.extend({
36
+ kinds: zod_1.z.array(zod_1.z.object({
37
+ x402Version: zod_1.z.literal(1),
38
+ scheme: zod_1.z.literal("exact"),
39
+ network: FacilitatorNetworkSchema,
40
+ extra: zod_1.z
41
+ .object({
42
+ defaultAsset: FacilitatorSupportedAssetSchema.optional(),
43
+ supportedAssets: zod_1.z
44
+ .array(FacilitatorSupportedAssetSchema)
45
+ .optional(),
46
+ })
47
+ .optional(),
48
+ })),
49
+ }).describe("Supported payment kinds for this facilitator");
50
+ function isEvmChain(caip2ChainId) {
51
+ return caip2ChainId.startsWith("eip155:");
52
+ }
53
+ /**
54
+ * Extract numeric chain ID from CAIP-2 EVM chain (e.g., "eip155:1" -> 1)
55
+ */
56
+ function extractEvmChainId(caip2ChainId) {
57
+ if (!isEvmChain(caip2ChainId)) {
58
+ return null;
59
+ }
60
+ const parts = caip2ChainId.split(":");
61
+ const chainId = Number(parts[1]);
62
+ return Number.isNaN(chainId) ? null : chainId;
63
+ }
64
+ /**
65
+ * CAIP-2 compliant blockchain identifier
66
+ * @see https://chainagnostic.org/CAIPs/caip-2
67
+ */
68
+ const Caip2ChainIdSchema = zod_1.z
69
+ .union([zod_1.z.string(), zod_1.z.number().int().positive()])
70
+ .transform((value, ctx) => {
71
+ // Handle proper CAIP-2 format (already valid)
72
+ if (typeof value === "string" && value.includes(":")) {
73
+ const [namespace, reference] = value.split(":");
74
+ // Solana mainnet/devnet aliases
75
+ if (namespace === "solana" && reference === "mainnet") {
76
+ return "solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ";
77
+ }
78
+ if (namespace === "solana" && reference === "devnet") {
79
+ return "solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K";
80
+ }
81
+ // Validate CAIP-2 format
82
+ const namespaceRegex = /^[-a-z0-9]{3,8}$/;
83
+ const referenceRegex = /^[-_a-zA-Z0-9]{1,32}$/;
84
+ if (!namespaceRegex.test(namespace ?? "")) {
85
+ ctx.addIssue({
86
+ code: zod_1.z.ZodIssueCode.custom,
87
+ message: `Invalid CAIP-2 namespace: ${namespace}. Must match [-a-z0-9]{3,8}`,
88
+ });
89
+ return zod_1.z.NEVER;
90
+ }
91
+ if (!referenceRegex.test(reference ?? "")) {
92
+ ctx.addIssue({
93
+ code: zod_1.z.ZodIssueCode.custom,
94
+ message: `Invalid CAIP-2 reference: ${reference}. Must match [-_a-zA-Z0-9]{1,32}`,
95
+ });
96
+ return zod_1.z.NEVER;
97
+ }
98
+ return value;
99
+ }
100
+ // Handle number (EVM chain ID fallback)
101
+ if (typeof value === "number") {
102
+ return `eip155:${value}`;
103
+ }
104
+ // Handle string number (EVM chain ID fallback)
105
+ const numValue = Number(value);
106
+ if (!Number.isNaN(numValue) && Number.isInteger(numValue) && numValue > 0) {
107
+ return `eip155:${numValue}`;
108
+ }
109
+ const mappedChainId = types_1.EvmNetworkToChainId.get(value);
110
+ if (mappedChainId) {
111
+ return `eip155:${mappedChainId}`;
112
+ }
113
+ ctx.addIssue({
114
+ code: zod_1.z.ZodIssueCode.custom,
115
+ message: `Invalid chain ID: ${value}. Must be a CAIP-2 identifier (e.g., "eip155:1", "solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ"), a numeric chain ID for EVM, or "solana:mainnet"/"solana:devnet"`,
116
+ });
117
+ return zod_1.z.NEVER;
118
+ })
119
+ .describe("CAIP-2 blockchain identifier (e.g., 'eip155:1' for Ethereum, 'solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' for Solana mainnet). Also accepts numeric EVM chain IDs (e.g., 1, 137) or aliases ('solana:mainnet', 'solana:devnet') for backward compatibility.");
120
+ function networkToCaip2ChainId(network) {
121
+ if (typeof network === "object") {
122
+ return `eip155:${network.id}`;
123
+ }
124
+ return Caip2ChainIdSchema.parse(network);
125
+ }
126
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/x402/schemas.ts"],"names":[],"mappings":"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"}