@okxweb3/app-x402-core 0.1.2 → 0.2.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 (57) hide show
  1. package/dist/cjs/OKXFacilitatorClient-Bqyw9fzj.d.ts +69 -0
  2. package/dist/cjs/client/index.d.ts +1 -1
  3. package/dist/cjs/client/index.js +34 -0
  4. package/dist/cjs/client/index.js.map +1 -1
  5. package/dist/cjs/facilitator/index.d.ts +2 -2
  6. package/dist/cjs/facilitator/index.js +166 -4
  7. package/dist/cjs/facilitator/index.js.map +1 -1
  8. package/dist/cjs/http/index.d.ts +5 -3
  9. package/dist/cjs/http/index.js +1241 -7
  10. package/dist/cjs/http/index.js.map +1 -1
  11. package/dist/cjs/index-2gWfiUbK.d.ts +713 -0
  12. package/dist/cjs/index.d.ts +2 -2
  13. package/dist/cjs/index.js +166 -4
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/{mechanisms-sojpSwWW.d.ts → mechanisms-LhI9qkRo.d.ts} +509 -1
  16. package/dist/cjs/server/index.d.ts +4 -2
  17. package/dist/cjs/server/index.js +1256 -7
  18. package/dist/cjs/server/index.js.map +1 -1
  19. package/dist/cjs/subscription/index.d.ts +3 -0
  20. package/dist/cjs/subscription/index.js +600 -0
  21. package/dist/cjs/subscription/index.js.map +1 -0
  22. package/dist/cjs/types/index.d.ts +1 -1
  23. package/dist/cjs/utils/index.d.ts +1 -1
  24. package/dist/cjs/{x402HTTPResourceServer-CcsAkcgI.d.ts → x402HTTPResourceServer-B0mXzV8r.d.ts} +114 -1
  25. package/dist/esm/OKXFacilitatorClient-z-cCE5Db.d.mts +69 -0
  26. package/dist/esm/chunk-4KASWSSY.mjs +257 -0
  27. package/dist/esm/chunk-4KASWSSY.mjs.map +1 -0
  28. package/dist/esm/chunk-CKXR4QVD.mjs +274 -0
  29. package/dist/esm/chunk-CKXR4QVD.mjs.map +1 -0
  30. package/dist/esm/{chunk-XBQG2CDV.mjs → chunk-EYS4TWVA.mjs} +617 -9
  31. package/dist/esm/chunk-EYS4TWVA.mjs.map +1 -0
  32. package/dist/esm/client/index.d.mts +1 -1
  33. package/dist/esm/client/index.mjs +3 -2
  34. package/dist/esm/client/index.mjs.map +1 -1
  35. package/dist/esm/facilitator/index.d.mts +2 -2
  36. package/dist/esm/facilitator/index.mjs +2 -1
  37. package/dist/esm/facilitator/index.mjs.map +1 -1
  38. package/dist/esm/http/index.d.mts +5 -3
  39. package/dist/esm/http/index.mjs +3 -2
  40. package/dist/esm/index-DKbqlTu_.d.mts +713 -0
  41. package/dist/esm/index.d.mts +2 -2
  42. package/dist/esm/index.mjs +2 -1
  43. package/dist/esm/{mechanisms-sojpSwWW.d.mts → mechanisms-LhI9qkRo.d.mts} +509 -1
  44. package/dist/esm/server/index.d.mts +4 -2
  45. package/dist/esm/server/index.mjs +3 -2
  46. package/dist/esm/subscription/index.d.mts +3 -0
  47. package/dist/esm/subscription/index.mjs +309 -0
  48. package/dist/esm/subscription/index.mjs.map +1 -0
  49. package/dist/esm/types/index.d.mts +1 -1
  50. package/dist/esm/utils/index.d.mts +1 -1
  51. package/dist/esm/{x402HTTPResourceServer-DBeutKxq.d.mts → x402HTTPResourceServer-56Tq3Jup.d.mts} +114 -1
  52. package/package.json +12 -1
  53. package/dist/cjs/OKXFacilitatorClient-BvyQB1QM.d.ts +0 -59
  54. package/dist/esm/OKXFacilitatorClient-D5E3LX50.d.mts +0 -59
  55. package/dist/esm/chunk-O3IYMTNT.mjs +0 -118
  56. package/dist/esm/chunk-O3IYMTNT.mjs.map +0 -1
  57. package/dist/esm/chunk-XBQG2CDV.mjs.map +0 -1
@@ -37,11 +37,35 @@ module.exports = __toCommonJS(facilitator_exports);
37
37
 
38
38
  // src/facilitator/OKXFacilitatorClient.ts
39
39
  var import_node_crypto = __toESM(require("crypto"));
40
+
41
+ // src/subscription/codec/typed-data.ts
42
+ var import_viem = require("viem");
43
+ var ZERO_BYTES32 = `0x${"0".repeat(64)}`;
44
+ function parseChainIdFromNetwork(network) {
45
+ const parts = network.split(":");
46
+ if (parts.length !== 2 || parts[0] !== "eip155") {
47
+ throw new Error(`parseChainIdFromNetwork: expected "eip155:<chainId>", got "${network}"`);
48
+ }
49
+ const id = Number(parts[1]);
50
+ if (!Number.isInteger(id) || id <= 0) {
51
+ throw new Error(`parseChainIdFromNetwork: invalid chainId "${parts[1]}"`);
52
+ }
53
+ return id;
54
+ }
55
+
56
+ // src/subscription/codec/payload.ts
57
+ function asSubscriptionPaymentInner(payload) {
58
+ const inner = payload.payload;
59
+ if (!inner || !inner.permitSingle || !inner.terms || !inner.permitSingleSignature || !inner.termsSignature) {
60
+ throw new Error(
61
+ "asSubscriptionPaymentInner: payload.payload is missing required permitSingle/terms fields"
62
+ );
63
+ }
64
+ return inner;
65
+ }
66
+
67
+ // src/facilitator/OKXFacilitatorClient.ts
40
68
  var OKXFacilitatorClient = class {
41
- /**
42
- *
43
- * @param config
44
- */
45
69
  constructor(config) {
46
70
  this.config = {
47
71
  baseUrl: "https://web3.okx.com",
@@ -143,6 +167,144 @@ var OKXFacilitatorClient = class {
143
167
  const data = json.data ?? json;
144
168
  return data;
145
169
  }
170
+ // ── SubscriptionFacilitatorClient (period) ─────────────
171
+ //
172
+ // Subscription endpoints share OKX's HMAC-SHA256 auth (createHeaders) so
173
+ // production sellers route ALL facilitator HTTP through this single
174
+ // client — exact/upto/aggr_deferred go via verify/settle, period
175
+ // goes via these five methods.
176
+ /**
177
+ * Build `{chainIndex, terms, permit, termsSig, permitSig, syncSettle}` —
178
+ * request body shared by subscribe / change endpoints.
179
+ */
180
+ buildWriteBody(payload, requirements, syncSettle) {
181
+ const inner = asSubscriptionPaymentInner(payload);
182
+ return {
183
+ chainIndex: parseChainIdFromNetwork(requirements.network),
184
+ terms: inner.terms,
185
+ permit: inner.permitSingle,
186
+ termsSig: inner.termsSignature,
187
+ permitSig: inner.permitSingleSignature,
188
+ syncSettle: syncSettle ?? true
189
+ };
190
+ }
191
+ async subscribe(paymentPayload, paymentRequirements, syncSettle) {
192
+ const path = "/api/v6/pay/x402/subscriptions";
193
+ const body = JSON.stringify(
194
+ this.buildWriteBody(paymentPayload, paymentRequirements, syncSettle)
195
+ );
196
+ const res = await fetch(this.config.baseUrl + path, {
197
+ method: "POST",
198
+ headers: this.createHeaders("POST", path, body),
199
+ body
200
+ });
201
+ if (!res.ok) throw new Error(`OKX subscribe failed: ${res.status}`);
202
+ return await res.json();
203
+ }
204
+ async changeSubscription(paymentPayload, paymentRequirements, oldSubId, syncSettle) {
205
+ const path = "/api/v6/pay/x402/subscriptions/change";
206
+ const inner = asSubscriptionPaymentInner(paymentPayload);
207
+ const body = JSON.stringify({
208
+ chainIndex: parseChainIdFromNetwork(paymentRequirements.network),
209
+ oldSubId,
210
+ newTerms: inner.terms,
211
+ permit: inner.permitSingle,
212
+ termsSig: inner.termsSignature,
213
+ permitSig: inner.permitSingleSignature,
214
+ syncSettle: syncSettle ?? true
215
+ });
216
+ const res = await fetch(this.config.baseUrl + path, {
217
+ method: "POST",
218
+ headers: this.createHeaders("POST", path, body),
219
+ body
220
+ });
221
+ if (!res.ok) throw new Error(`OKX changeSubscription failed: ${res.status}`);
222
+ return await res.json();
223
+ }
224
+ async cancelSubscription(subId, cancelAuth, syncSettle) {
225
+ const path = "/api/v6/pay/x402/subscriptions/cancel";
226
+ const body = JSON.stringify({ subId, cancelAuth, syncSettle: syncSettle ?? true });
227
+ const res = await fetch(this.config.baseUrl + path, {
228
+ method: "POST",
229
+ headers: this.createHeaders("POST", path, body),
230
+ body
231
+ });
232
+ if (!res.ok) throw new Error(`OKX cancelSubscription failed: ${res.status}`);
233
+ return await res.json();
234
+ }
235
+ async cancelPendingChange(subId, cancelAuth, syncSettle) {
236
+ const path = "/api/v6/pay/x402/subscriptions/cancel-pending-change";
237
+ const body = JSON.stringify({ subId, cancelAuth, syncSettle: syncSettle ?? true });
238
+ const res = await fetch(this.config.baseUrl + path, {
239
+ method: "POST",
240
+ headers: this.createHeaders("POST", path, body),
241
+ body
242
+ });
243
+ if (!res.ok) throw new Error(`OKX cancelPendingChange failed: ${res.status}`);
244
+ return await res.json();
245
+ }
246
+ async chargeSubscription(subId, syncSettle) {
247
+ const path = "/api/v6/pay/x402/subscriptions/charge";
248
+ const body = JSON.stringify({ subId, syncSettle: syncSettle ?? true });
249
+ const res = await fetch(this.config.baseUrl + path, {
250
+ method: "POST",
251
+ headers: this.createHeaders("POST", path, body),
252
+ body
253
+ });
254
+ if (!res.ok) {
255
+ const errBody = await res.text().catch(() => "");
256
+ throw new Error(`OKX chargeSubscription failed: ${res.status} ${errBody}`);
257
+ }
258
+ return await res.json();
259
+ }
260
+ async finalizeExpired(subId, syncSettle) {
261
+ const path = "/api/v6/pay/x402/subscriptions/finalize-expired";
262
+ const body = JSON.stringify({ subId, syncSettle: syncSettle ?? true });
263
+ const res = await fetch(this.config.baseUrl + path, {
264
+ method: "POST",
265
+ headers: this.createHeaders("POST", path, body),
266
+ body
267
+ });
268
+ if (!res.ok) {
269
+ const errBody = await res.text().catch(() => "");
270
+ throw new Error(`OKX finalizeExpired failed: ${res.status} ${errBody}`);
271
+ }
272
+ return await res.json();
273
+ }
274
+ async getCharges(subId, limit = 50, offset = 0) {
275
+ const q = new URLSearchParams({ subId, limit: String(limit), offset: String(offset) });
276
+ const path = `/api/v6/pay/x402/subscriptions/charges?${q.toString()}`;
277
+ const res = await fetch(this.config.baseUrl + path, {
278
+ headers: this.createHeaders("GET", path)
279
+ });
280
+ if (!res.ok) {
281
+ const errBody = await res.text().catch(() => "");
282
+ throw new Error(`OKX getCharges failed: ${res.status} ${errBody}`);
283
+ }
284
+ return await res.json();
285
+ }
286
+ async getPendingChange(subId) {
287
+ const path = `/api/v6/pay/x402/subscriptions/pending?subId=${encodeURIComponent(subId)}`;
288
+ const res = await fetch(this.config.baseUrl + path, {
289
+ headers: this.createHeaders("GET", path)
290
+ });
291
+ if (!res.ok) {
292
+ const errBody = await res.text().catch(() => "");
293
+ throw new Error(`OKX getPendingChange failed: ${res.status} ${errBody}`);
294
+ }
295
+ return await res.json();
296
+ }
297
+ async getSubscription(subId) {
298
+ const path = `/api/v6/pay/x402/subscriptions/detail?subId=${encodeURIComponent(subId)}`;
299
+ const res = await fetch(this.config.baseUrl + path, {
300
+ headers: this.createHeaders("GET", path)
301
+ });
302
+ if (!res.ok) {
303
+ const body = await res.text().catch(() => "");
304
+ throw new Error(`OKX getSubscription failed: ${res.status} ${body}`);
305
+ }
306
+ return await res.json();
307
+ }
146
308
  };
147
309
 
148
310
  // src/index.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/facilitator/index.ts","../../../src/facilitator/OKXFacilitatorClient.ts","../../../src/index.ts","../../../src/facilitator/x402Facilitator.ts"],"sourcesContent":["export * from \"./x402Facilitator\";\nexport { OKXFacilitatorClient } from \"./OKXFacilitatorClient\";\nexport type { OKXConfig } from \"./OKXFacilitatorClient\";\n","import crypto from \"node:crypto\";\nimport type { FacilitatorClient } from \"../http/httpFacilitatorClient.js\";\nimport type {\n VerifyResponse,\n SettleResponse,\n SettleStatusResponse,\n SupportedResponse,\n} from \"../types/facilitator.js\";\nimport type { PaymentPayload, PaymentRequirements } from \"../types/payments.js\";\n\nexport interface OKXConfig {\n apiKey: string;\n secretKey: string;\n passphrase: string;\n baseUrl?: string;\n /**\n * OKX exact-scheme extension: when true, the settle call tells the facilitator to\n * wait for on-chain confirmation before responding (syncSettle=true in request body).\n * The facilitator then returns status=\"success\" directly (no polling needed).\n * When false (default), the facilitator responds with status=\"pending\" immediately.\n */\n syncSettle?: boolean;\n}\n\n/**\n * OKX facilitator client implementing the FacilitatorClient interface.\n * Uses HMAC-SHA256 signing per OKX REST API authentication spec.\n */\nexport class OKXFacilitatorClient implements FacilitatorClient {\n private config: Required<Omit<OKXConfig, \"syncSettle\">> & Pick<OKXConfig, \"syncSettle\">;\n\n /**\n *\n * @param config\n */\n constructor(config: OKXConfig) {\n this.config = {\n baseUrl: \"https://web3.okx.com\",\n ...config,\n };\n }\n\n /**\n *\n * @param method\n * @param path\n * @param body\n */\n private createHeaders(method: string, path: string, body?: string): Record<string, string> {\n const timestamp = new Date().toISOString();\n const prehash = timestamp + method + path + (body ?? \"\");\n const sign = crypto\n .createHmac(\"sha256\", this.config.secretKey)\n .update(prehash)\n .digest(\"base64\");\n\n return {\n \"OK-ACCESS-KEY\": this.config.apiKey,\n \"OK-ACCESS-SIGN\": sign,\n \"OK-ACCESS-TIMESTAMP\": timestamp,\n \"OK-ACCESS-PASSPHRASE\": this.config.passphrase,\n \"Content-Type\": \"application/json\",\n };\n }\n\n /**\n *\n */\n async getSupported(): Promise<SupportedResponse> {\n const path = \"/api/v6/pay/x402/supported\";\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) throw new Error(`OKX getSupported failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n // OKX API wraps responses in { code, data, msg } envelope\n const data = (json.data ?? json) as SupportedResponse;\n return data;\n }\n\n /**\n *\n * @param payload\n * @param requirements\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const path = \"/api/v6/pay/x402/verify\";\n const body = JSON.stringify({\n x402Version: 2,\n paymentPayload: payload,\n paymentRequirements: requirements,\n });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX verify failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as VerifyResponse;\n return data;\n }\n\n /**\n *\n * @param payload\n * @param requirements\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const path = \"/api/v6/pay/x402/settle\";\n // Include OKX-extension syncSettle field when configured:\n // syncSettle=true → facilitator waits for on-chain confirmation, returns status=\"success\"\n // syncSettle=false → facilitator returns immediately with status=\"pending\" (default)\n const bodyObj: Record<string, unknown> = {\n x402Version: 2,\n paymentPayload: payload,\n paymentRequirements: requirements,\n };\n if (this.config.syncSettle !== undefined) {\n bodyObj.syncSettle = this.config.syncSettle;\n }\n const body = JSON.stringify(bodyObj);\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX settle failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as SettleResponse;\n return data;\n }\n\n /**\n * Query on-chain settlement status by transaction hash.\n *\n * @param txHash - The transaction hash to query\n * @returns Settlement status response\n */\n async getSettleStatus(txHash: string): Promise<SettleStatusResponse> {\n const path = `/api/v6/pay/x402/settle/status?txHash=${encodeURIComponent(txHash)}`;\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) throw new Error(`OKX getSettleStatus failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as SettleStatusResponse;\n return data;\n }\n}\n","export const x402Version = 2;\nexport { OKXFacilitatorClient } from \"./facilitator/OKXFacilitatorClient\";\nexport type { OKXConfig } from \"./facilitator/OKXFacilitatorClient\";","import { x402Version } from \"..\";\nimport { SettleResponse, VerifyResponse } from \"../types/facilitator\";\nimport { FacilitatorExtension } from \"../types/extensions\";\nimport { SchemeNetworkFacilitator, FacilitatorContext } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network } from \"../types\";\nimport { type SchemeData } from \"../utils\";\n\n/**\n * Facilitator Hook Context Interfaces\n */\n\nexport interface FacilitatorVerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorVerifyResultContext extends FacilitatorVerifyContext {\n result: VerifyResponse;\n}\n\nexport interface FacilitatorVerifyFailureContext extends FacilitatorVerifyContext {\n error: Error;\n}\n\nexport interface FacilitatorSettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorSettleResultContext extends FacilitatorSettleContext {\n result: SettleResponse;\n}\n\nexport interface FacilitatorSettleFailureContext extends FacilitatorSettleContext {\n error: Error;\n}\n\n/**\n * Facilitator Hook Type Definitions\n */\n\nexport type FacilitatorBeforeVerifyHook = (\n context: FacilitatorVerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterVerifyHook = (context: FacilitatorVerifyResultContext) => Promise<void>;\n\nexport type FacilitatorOnVerifyFailureHook = (\n context: FacilitatorVerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type FacilitatorBeforeSettleHook = (\n context: FacilitatorSettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterSettleHook = (context: FacilitatorSettleResultContext) => Promise<void>;\n\nexport type FacilitatorOnSettleFailureHook = (\n context: FacilitatorSettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Facilitator client for the x402 payment protocol.\n * Manages payment scheme registration, verification, and settlement.\n */\nexport class x402Facilitator {\n private readonly registeredFacilitatorSchemes: Map<\n number,\n SchemeData<SchemeNetworkFacilitator>[] // Array to support multiple facilitators per version\n > = new Map();\n private readonly extensions: Map<string, FacilitatorExtension> = new Map();\n\n private beforeVerifyHooks: FacilitatorBeforeVerifyHook[] = [];\n private afterVerifyHooks: FacilitatorAfterVerifyHook[] = [];\n private onVerifyFailureHooks: FacilitatorOnVerifyFailureHook[] = [];\n private beforeSettleHooks: FacilitatorBeforeSettleHook[] = [];\n private afterSettleHooks: FacilitatorAfterSettleHook[] = [];\n private onSettleFailureHooks: FacilitatorOnSettleFailureHook[] = [];\n\n /**\n * Registers a scheme facilitator for the current x402 version.\n * Networks are stored and used for getSupported() - no need to specify them later.\n *\n * @param networks - Single network or array of networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n register(networks: Network | Network[], facilitator: SchemeNetworkFacilitator): x402Facilitator {\n const networksArray = Array.isArray(networks) ? networks : [networks];\n return this._registerScheme(x402Version, networksArray, facilitator);\n }\n\n /**\n * Registers a protocol extension.\n *\n * @param extension - The extension object to register\n * @returns The x402Facilitator instance for chaining\n */\n registerExtension(extension: FacilitatorExtension): x402Facilitator {\n this.extensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Gets the list of registered extension keys.\n *\n * @returns Array of extension key strings\n */\n getExtensions(): string[] {\n return Array.from(this.extensions.keys());\n }\n\n /**\n * Gets a registered extension by key.\n *\n * @param key - The extension key to look up\n * @returns The extension object, or undefined if not registered\n */\n getExtension<T extends FacilitatorExtension = FacilitatorExtension>(key: string): T | undefined {\n return this.extensions.get(key) as T | undefined;\n }\n\n /**\n * Register a hook to execute before facilitator payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeVerify(hook: FacilitatorBeforeVerifyHook): x402Facilitator {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment verification (isValid: true).\n * This hook is NOT called when verification fails (isValid: false) - use onVerifyFailure for that.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterVerify(hook: FacilitatorAfterVerifyHook): x402Facilitator {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator payment verification fails.\n * Called when: verification returns isValid: false, or an exception is thrown during verification.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onVerifyFailure(hook: FacilitatorOnVerifyFailureHook): x402Facilitator {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before facilitator payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeSettle(hook: FacilitatorBeforeSettleHook): x402Facilitator {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterSettle(hook: FacilitatorAfterSettleHook): x402Facilitator {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onSettleFailure(hook: FacilitatorOnSettleFailureHook): x402Facilitator {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Gets supported payment kinds, extensions, and signers.\n * Uses networks registered during register() calls - no parameters needed.\n * Returns flat array format for backward compatibility with V1 clients.\n *\n * @returns Supported response with kinds as array (with version in each element), extensions, and signers\n */\n getSupported(): {\n kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }>;\n extensions: string[];\n signers: Record<string, string[]>;\n } {\n const kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }> = [];\n const signersByFamily: Record<string, Set<string>> = {};\n\n // Iterate over registered scheme data (array supports multiple facilitators per version)\n for (const [version, schemeDataArray] of this.registeredFacilitatorSchemes) {\n for (const schemeData of schemeDataArray) {\n const { facilitator, networks } = schemeData;\n const scheme = facilitator.scheme;\n\n // Iterate over stored concrete networks\n for (const network of networks) {\n const extra = facilitator.getExtra(network);\n kinds.push({\n x402Version: version,\n scheme,\n network,\n ...(extra && { extra }),\n });\n\n // Collect signers by CAIP family for this network\n const family = facilitator.caipFamily;\n if (!signersByFamily[family]) {\n signersByFamily[family] = new Set();\n }\n facilitator.getSigners(network).forEach(signer => signersByFamily[family].add(signer));\n }\n }\n }\n\n // Convert signer sets to arrays\n const signers: Record<string, string[]> = {};\n for (const [family, signerSet] of Object.entries(signersByFamily)) {\n signers[family] = Array.from(signerSet);\n }\n\n return {\n kinds,\n extensions: this.getExtensions(),\n signers,\n };\n }\n\n /**\n * Verifies a payment payload against requirements.\n *\n * @param paymentPayload - The payment payload to verify\n * @param paymentRequirements - The payment requirements to verify against\n * @returns Promise resolving to the verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: FacilitatorVerifyContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n };\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const facilitatorContext = this.buildFacilitatorContext();\n const verifyResult = await schemeNetworkFacilitator.verify(\n paymentPayload,\n paymentRequirements,\n facilitatorContext,\n );\n\n // Check if verification failed (isValid: false)\n if (!verifyResult.isValid) {\n const failureContext: FacilitatorVerifyFailureContext = {\n ...context,\n error: new Error(verifyResult.invalidReason || \"Verification failed\"),\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n // If recovered, execute afterVerify hooks with recovered result\n const recoveredContext: FacilitatorVerifyResultContext = {\n ...context,\n result: result.result,\n };\n for (const hook of this.afterVerifyHooks) {\n await hook(recoveredContext);\n }\n return result.result;\n }\n }\n\n return verifyResult;\n }\n\n // Execute afterVerify hooks only for successful verification\n const resultContext: FacilitatorVerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: FacilitatorVerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settles a payment based on the payload and requirements.\n *\n * @param paymentPayload - The payment payload to settle\n * @param paymentRequirements - The payment requirements for settlement\n * @returns Promise resolving to the settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const context: FacilitatorSettleContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Settlement aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const facilitatorContext = this.buildFacilitatorContext();\n const settleResult = await schemeNetworkFacilitator.settle(\n paymentPayload,\n paymentRequirements,\n facilitatorContext,\n );\n\n // Execute afterSettle hooks\n const resultContext: FacilitatorSettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: FacilitatorSettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Builds a FacilitatorContext from the registered extensions map.\n * Passed to mechanism verify/settle so they can access extension capabilities.\n *\n * @returns A FacilitatorContext backed by this facilitator's registered extensions\n */\n private buildFacilitatorContext(): FacilitatorContext {\n const extensionsMap = this.extensions;\n return {\n getExtension<T extends FacilitatorExtension = FacilitatorExtension>(\n key: string,\n ): T | undefined {\n return extensionsMap.get(key) as T | undefined;\n },\n };\n }\n\n /**\n * Internal method to register a scheme facilitator.\n *\n * @param x402Version - The x402 protocol version\n * @param networks - Array of concrete networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n private _registerScheme(\n x402Version: number,\n networks: Network[],\n facilitator: SchemeNetworkFacilitator,\n ): x402Facilitator {\n if (!this.registeredFacilitatorSchemes.has(x402Version)) {\n this.registeredFacilitatorSchemes.set(x402Version, []);\n }\n const schemeDataArray = this.registeredFacilitatorSchemes.get(x402Version)!;\n\n // Add new scheme data (supports multiple facilitators with same scheme name)\n schemeDataArray.push({\n facilitator,\n networks: new Set(networks),\n pattern: this.derivePattern(networks),\n });\n\n return this;\n }\n\n /**\n * Derives a wildcard pattern from an array of networks.\n * If all networks share the same namespace, returns wildcard pattern.\n * Otherwise returns the first network for exact matching.\n *\n * @param networks - Array of networks\n * @returns Derived pattern for matching\n */\n private derivePattern(networks: Network[]): Network {\n if (networks.length === 0) return \"\" as Network;\n if (networks.length === 1) return networks[0];\n\n // Extract namespaces (e.g., \"eip155\" from \"eip155:196\")\n const namespaces = networks.map(n => n.split(\":\")[0]);\n const uniqueNamespaces = new Set(namespaces);\n\n // If all same namespace, use wildcard\n if (uniqueNamespaces.size === 1) {\n return `${namespaces[0]}:*` as Network;\n }\n\n // Mixed namespaces - use first network for exact matching\n return networks[0];\n }\n}\n"],"mappings":"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","names":["crypto","hook","x402Version"]}
1
+ {"version":3,"sources":["../../../src/facilitator/index.ts","../../../src/facilitator/OKXFacilitatorClient.ts","../../../src/subscription/codec/typed-data.ts","../../../src/subscription/codec/payload.ts","../../../src/index.ts","../../../src/facilitator/x402Facilitator.ts"],"sourcesContent":["export * from \"./x402Facilitator\";\nexport { OKXFacilitatorClient } from \"./OKXFacilitatorClient\";\nexport type { OKXConfig } from \"./OKXFacilitatorClient\";\n","import crypto from \"node:crypto\";\nimport type { FacilitatorClient } from \"../http/httpFacilitatorClient.js\";\nimport type {\n FacilitatorCancelData,\n FacilitatorCancelPendingData,\n FacilitatorChangeData,\n FacilitatorChargeData,\n FacilitatorEnvelope,\n FacilitatorFinalizeExpiredData,\n FacilitatorGetChargesData,\n FacilitatorGetSubscriptionData,\n FacilitatorPendingChangeRow,\n FacilitatorSubscribeData,\n} from \"../subscription/facilitator-client.js\";\nimport { parseChainIdFromNetwork } from \"../subscription/codec/typed-data.js\";\nimport { asSubscriptionPaymentInner } from \"../subscription/codec/payload.js\";\nimport type { CancelAuth, PendingChangeCancelAuth } from \"../subscription/types.js\";\nimport type {\n VerifyResponse,\n SettleResponse,\n SettleStatusResponse,\n SupportedResponse,\n} from \"../types/facilitator.js\";\nimport type { PaymentPayload, PaymentRequirements } from \"../types/payments.js\";\n\nexport interface OKXConfig {\n apiKey: string;\n secretKey: string;\n passphrase: string;\n baseUrl?: string;\n /**\n * OKX exact-scheme extension: when true, the settle call tells the facilitator to\n * wait for on-chain confirmation before responding (syncSettle=true in request body).\n * The facilitator then returns status=\"success\" directly (no polling needed).\n * When false (default), the facilitator responds with status=\"pending\" immediately.\n */\n syncSettle?: boolean;\n}\n\n/**\n * OKX facilitator client implementing the FacilitatorClient interface.\n * Uses HMAC-SHA256 signing per OKX REST API authentication spec.\n */\nexport class OKXFacilitatorClient implements FacilitatorClient {\n private config: Required<Omit<OKXConfig, \"syncSettle\">> & Pick<OKXConfig, \"syncSettle\">;\n\n constructor(config: OKXConfig) {\n this.config = {\n baseUrl: \"https://web3.okx.com\",\n ...config,\n };\n }\n\n /**\n *\n * @param method\n * @param path\n * @param body\n */\n private createHeaders(method: string, path: string, body?: string): Record<string, string> {\n const timestamp = new Date().toISOString();\n const prehash = timestamp + method + path + (body ?? \"\");\n const sign = crypto\n .createHmac(\"sha256\", this.config.secretKey)\n .update(prehash)\n .digest(\"base64\");\n\n return {\n \"OK-ACCESS-KEY\": this.config.apiKey,\n \"OK-ACCESS-SIGN\": sign,\n \"OK-ACCESS-TIMESTAMP\": timestamp,\n \"OK-ACCESS-PASSPHRASE\": this.config.passphrase,\n \"Content-Type\": \"application/json\",\n };\n }\n\n /**\n *\n */\n async getSupported(): Promise<SupportedResponse> {\n const path = \"/api/v6/pay/x402/supported\";\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) throw new Error(`OKX getSupported failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n // OKX API wraps responses in { code, data, msg } envelope\n const data = (json.data ?? json) as SupportedResponse;\n return data;\n }\n\n /**\n *\n * @param payload\n * @param requirements\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const path = \"/api/v6/pay/x402/verify\";\n const body = JSON.stringify({\n x402Version: 2,\n paymentPayload: payload,\n paymentRequirements: requirements,\n });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX verify failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as VerifyResponse;\n return data;\n }\n\n /**\n *\n * @param payload\n * @param requirements\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const path = \"/api/v6/pay/x402/settle\";\n // Include OKX-extension syncSettle field when configured:\n // syncSettle=true → facilitator waits for on-chain confirmation, returns status=\"success\"\n // syncSettle=false → facilitator returns immediately with status=\"pending\" (default)\n const bodyObj: Record<string, unknown> = {\n x402Version: 2,\n paymentPayload: payload,\n paymentRequirements: requirements,\n };\n if (this.config.syncSettle !== undefined) {\n bodyObj.syncSettle = this.config.syncSettle;\n }\n const body = JSON.stringify(bodyObj);\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX settle failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as SettleResponse;\n return data;\n }\n\n /**\n * Query on-chain settlement status by transaction hash.\n *\n * @param txHash - The transaction hash to query\n * @returns Settlement status response\n */\n async getSettleStatus(txHash: string): Promise<SettleStatusResponse> {\n const path = `/api/v6/pay/x402/settle/status?txHash=${encodeURIComponent(txHash)}`;\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) throw new Error(`OKX getSettleStatus failed: ${res.status}`);\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as SettleStatusResponse;\n return data;\n }\n\n // ── SubscriptionFacilitatorClient (period) ─────────────\n //\n // Subscription endpoints share OKX's HMAC-SHA256 auth (createHeaders) so\n // production sellers route ALL facilitator HTTP through this single\n // client — exact/upto/aggr_deferred go via verify/settle, period\n // goes via these five methods.\n\n /**\n * Build `{chainIndex, terms, permit, termsSig, permitSig, syncSettle}` —\n * request body shared by subscribe / change endpoints.\n */\n private buildWriteBody(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n syncSettle?: boolean,\n ): Record<string, unknown> {\n const inner = asSubscriptionPaymentInner(payload);\n return {\n chainIndex: parseChainIdFromNetwork(requirements.network),\n terms: inner.terms,\n permit: inner.permitSingle,\n termsSig: inner.termsSignature,\n permitSig: inner.permitSingleSignature,\n syncSettle: syncSettle ?? true,\n };\n }\n\n async subscribe(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorSubscribeData>> {\n const path = \"/api/v6/pay/x402/subscriptions\";\n const body = JSON.stringify(\n this.buildWriteBody(paymentPayload, paymentRequirements, syncSettle),\n );\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX subscribe failed: ${res.status}`);\n return (await res.json()) as FacilitatorEnvelope<FacilitatorSubscribeData>;\n }\n\n async changeSubscription(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n oldSubId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorChangeData>> {\n const path = \"/api/v6/pay/x402/subscriptions/change\";\n const inner = asSubscriptionPaymentInner(paymentPayload);\n const body = JSON.stringify({\n chainIndex: parseChainIdFromNetwork(paymentRequirements.network),\n oldSubId,\n newTerms: inner.terms,\n permit: inner.permitSingle,\n termsSig: inner.termsSignature,\n permitSig: inner.permitSingleSignature,\n syncSettle: syncSettle ?? true,\n });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX changeSubscription failed: ${res.status}`);\n return (await res.json()) as FacilitatorEnvelope<FacilitatorChangeData>;\n }\n\n async cancelSubscription(\n subId: string,\n cancelAuth: CancelAuth,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorCancelData>> {\n const path = \"/api/v6/pay/x402/subscriptions/cancel\";\n const body = JSON.stringify({ subId, cancelAuth, syncSettle: syncSettle ?? true });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX cancelSubscription failed: ${res.status}`);\n return (await res.json()) as FacilitatorEnvelope<FacilitatorCancelData>;\n }\n\n async cancelPendingChange(\n subId: string,\n cancelAuth: PendingChangeCancelAuth,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorCancelPendingData>> {\n const path = \"/api/v6/pay/x402/subscriptions/cancel-pending-change\";\n const body = JSON.stringify({ subId, cancelAuth, syncSettle: syncSettle ?? true });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) throw new Error(`OKX cancelPendingChange failed: ${res.status}`);\n return (await res.json()) as FacilitatorEnvelope<FacilitatorCancelPendingData>;\n }\n\n async chargeSubscription(\n subId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorChargeData>> {\n const path = \"/api/v6/pay/x402/subscriptions/charge\";\n const body = JSON.stringify({ subId, syncSettle: syncSettle ?? true });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n throw new Error(`OKX chargeSubscription failed: ${res.status} ${errBody}`);\n }\n return (await res.json()) as FacilitatorEnvelope<FacilitatorChargeData>;\n }\n\n async finalizeExpired(\n subId: string,\n syncSettle?: boolean,\n ): Promise<FacilitatorEnvelope<FacilitatorFinalizeExpiredData>> {\n const path = \"/api/v6/pay/x402/subscriptions/finalize-expired\";\n const body = JSON.stringify({ subId, syncSettle: syncSettle ?? true });\n const res = await fetch(this.config.baseUrl + path, {\n method: \"POST\",\n headers: this.createHeaders(\"POST\", path, body),\n body,\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n throw new Error(`OKX finalizeExpired failed: ${res.status} ${errBody}`);\n }\n return (await res.json()) as FacilitatorEnvelope<FacilitatorFinalizeExpiredData>;\n }\n\n async getCharges(\n subId: string,\n limit = 50,\n offset = 0,\n ): Promise<FacilitatorEnvelope<FacilitatorGetChargesData>> {\n const q = new URLSearchParams({ subId, limit: String(limit), offset: String(offset) });\n const path = `/api/v6/pay/x402/subscriptions/charges?${q.toString()}`;\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n throw new Error(`OKX getCharges failed: ${res.status} ${errBody}`);\n }\n return (await res.json()) as FacilitatorEnvelope<FacilitatorGetChargesData>;\n }\n\n async getPendingChange(\n subId: string,\n ): Promise<FacilitatorEnvelope<FacilitatorPendingChangeRow | null>> {\n const path = `/api/v6/pay/x402/subscriptions/pending?subId=${encodeURIComponent(subId)}`;\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n throw new Error(`OKX getPendingChange failed: ${res.status} ${errBody}`);\n }\n return (await res.json()) as FacilitatorEnvelope<FacilitatorPendingChangeRow | null>;\n }\n\n async getSubscription(\n subId: string,\n ): Promise<FacilitatorEnvelope<FacilitatorGetSubscriptionData>> {\n const path = `/api/v6/pay/x402/subscriptions/detail?subId=${encodeURIComponent(subId)}`;\n const res = await fetch(this.config.baseUrl + path, {\n headers: this.createHeaders(\"GET\", path),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`OKX getSubscription failed: ${res.status} ${body}`);\n }\n return (await res.json()) as FacilitatorEnvelope<FacilitatorGetSubscriptionData>;\n }\n}\n","import { encodeAbiParameters, keccak256, type Hex, type TypedDataDomain } from \"viem\";\n\nimport type { PaymentRequirements } from \"../../types/payments\";\nimport type { CancelInitiator, PlanInitialCharge } from \"../types\";\nimport type { PermitSingleData, SubscriptionTerms } from \"./payload\";\n\n/** 32-byte zero hash, used as the sentinel for empty bytes32 fields. */\nexport const ZERO_BYTES32: Hex = `0x${\"0\".repeat(64)}`;\n\n/**\n * Permit2 PermitSingle (AllowanceTransfer) EIP-712 schema. Used for the\n * continuous-pull authorization signed by the buyer. The Permit2 domain has\n * NO `version` field — only `name=\"Permit2\"`, `chainId`, `verifyingContract`.\n */\nexport const PERMIT2_TYPES = {\n PermitSingle: [\n { name: \"details\", type: \"PermitDetails\" },\n { name: \"spender\", type: \"address\" },\n { name: \"sigDeadline\", type: \"uint256\" },\n ],\n PermitDetails: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint160\" },\n { name: \"expiration\", type: \"uint48\" },\n { name: \"nonce\", type: \"uint48\" },\n ],\n} as const;\n\n/**\n * SubscriptionTerms EIP-712 schema. 17 fields; field ORDER + integer widths\n * must mirror the contract. TypeHash:\n * 0xa5223de56e7694cf776c7d4f74c0323f42bf9e65655fe49affefbdfd40ec97ae\n * (verify against contract `SUBSCRIPTION_TERMS_TYPEHASH()`)\n */\nexport const SUBSCRIPTION_TERMS_TYPES = {\n SubscriptionTerms: [\n { name: \"payer\", type: \"address\" },\n { name: \"merchant\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n { name: \"amountPerPeriod\", type: \"uint160\" },\n { name: \"periodSec\", type: \"uint64\" },\n { name: \"maxPeriods\", type: \"uint32\" },\n { name: \"startAt\", type: \"uint64\" },\n { name: \"initialChargePeriods\", type: \"uint32\" },\n { name: \"initialChargeAmount\", type: \"uint160\" },\n { name: \"termsDeadline\", type: \"uint64\" },\n { name: \"permitHash\", type: \"bytes32\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"planTier\", type: \"uint8\" },\n { name: \"changeFromSubId\", type: \"bytes32\" },\n { name: \"changeEffectiveAt\", type: \"uint8\" },\n { name: \"periodMode\", type: \"uint8\" },\n ],\n} as const;\n\n/**\n * CancelAuth EIP-712 schema (subscription contract domain):\n * `CancelAuth(uint8 action, bytes32 subId, uint8 initiator, bytes32 nonce, uint64 deadline)`\n */\nexport const CANCEL_AUTH_TYPES = {\n CancelAuth: [\n { name: \"action\", type: \"uint8\" },\n { name: \"subId\", type: \"bytes32\" },\n { name: \"initiator\", type: \"uint8\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"deadline\", type: \"uint64\" },\n ],\n} as const;\n\n/**\n * PendingChangeCancelAuth EIP-712 schema (subscription contract domain):\n * `PendingChangeCancelAuth(bytes32 subId, bytes32 newSubId, bytes32 nonce, uint64 deadline)`\n */\nexport const PENDING_CHANGE_CANCEL_AUTH_TYPES = {\n PendingChangeCancelAuth: [\n { name: \"subId\", type: \"bytes32\" },\n { name: \"newSubId\", type: \"bytes32\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"deadline\", type: \"uint64\" },\n ],\n} as const;\n\nexport interface SubscriptionPlanExtra {\n id: string;\n tier: number;\n name?: string;\n}\n\n/**\n * Buyer's intent to switch from `fromSubId` to a new plan. Present on\n * PaymentRequirements.extra ONLY when the requirements are a change offer\n * for an upgrade/downgrade.\n */\nexport interface ChangeFromExtra {\n fromSubId: Hex;\n fromPlanId: Hex;\n fromPlanTier: number;\n direction: \"upgrade\" | \"downgrade\";\n effectiveAt: \"immediate\" | \"period_end\";\n}\n\nexport interface SubscriptionContractAddresses {\n subscription: string;\n permit2: string;\n}\n\n/**\n * Typed view of the `extra` field on subscription PaymentRequirements. The\n * evm scheme is responsible for producing PaymentRequirements whose `extra`\n * matches this shape; codec helpers consume it via this type rather than\n * Record<string, unknown> to keep field access type-safe.\n *\n * Index signature lets this be assigned directly to\n * `PaymentRequirements.extra: Record<string, unknown>` without a cast.\n */\nexport interface SubscriptionRequirementsExtra {\n contracts: SubscriptionContractAddresses;\n facilitator: string;\n amountPerPeriod: string;\n periodSec: number;\n /** uint8 — 0 fixed_seconds (default) / 1 calendar_month. */\n periodMode?: number;\n maxPeriods: number;\n startAt?: number;\n initialCharge?: PlanInitialCharge | null;\n plan: SubscriptionPlanExtra;\n changeFrom?: ChangeFromExtra;\n domain: TypedDataDomain;\n [key: string]: unknown;\n}\n\nexport interface TypedDataEnvelope<TPrimary extends string, TMessage> {\n domain: TypedDataDomain;\n types: Record<string, ReadonlyArray<{ name: string; type: string }>>;\n primaryType: TPrimary;\n message: TMessage;\n}\n\nexport interface BuildPermit2TypedDataInput {\n /** PaymentRequirements with subscription `extra`. */\n selected: PaymentRequirements;\n /** uint48 — current nonce from allowance-status (NOT +1). */\n nonce: number;\n /** uint48 unix seconds — Permit2 allowance expiration. */\n expiration: number;\n /** uint256 decimal — outer signature expiry. */\n sigDeadline: string;\n /** Override amount; default = initialChargeAmount + (maxPeriods - initialChargePeriods) * amountPerPeriod. */\n amount?: string;\n}\n\nexport interface BuildSubscriptionTermsTypedDataInput {\n selected: PaymentRequirements;\n payer: string;\n startAt: number;\n /** uint64 unix seconds — terms signature validity. */\n termsDeadline: number;\n /** bytes32 — random anti-replay; reuse the same hex string ≤ once. */\n salt: Hex;\n /** bytes32 — keccak256 of the PermitSingle struct hash; bind permit. */\n permitHash: Hex;\n changeFrom?: ChangeFromExtra;\n /** Override domain for special cases; defaults to `selected.extra.domain`. */\n domain?: TypedDataDomain;\n}\n\nexport interface BuildCancelAuthTypedDataInput {\n subId: Hex;\n initiator: CancelInitiator;\n /** uint64 unix seconds. */\n deadline: number;\n /** bytes32. */\n nonce: Hex;\n domain: TypedDataDomain;\n}\n\nexport interface BuildPendingChangeCancelAuthTypedDataInput {\n subId: Hex;\n /** The pending change's target newSubId — must match `pendingPlanChange.newSubId`. */\n newSubId: Hex;\n deadline: number;\n nonce: Hex;\n domain: TypedDataDomain;\n}\n\nconst CANCEL_INITIATOR_TO_ENUM: Record<CancelInitiator, 0 | 1> = {\n payer: 0,\n merchant: 1,\n};\n\nfunction getSubscriptionExtra(req: PaymentRequirements): SubscriptionRequirementsExtra {\n const extra = req.extra as Partial<SubscriptionRequirementsExtra> | undefined;\n if (!extra || !extra.contracts || !extra.plan || !extra.domain) {\n throw new Error(\n \"subscription codec: PaymentRequirements.extra is missing contracts/plan/domain\",\n );\n }\n return extra as SubscriptionRequirementsExtra;\n}\n\n/**\n * Default permit.amount:\n * amount ≥ reservedAmount + newCommit\n * newCommit = initialChargeAmount + (maxPeriods - initialChargePeriods) * amountPerPeriod\n *\n * `reservedAmount` (existing on-chain commitments) is NOT included here —\n * Buyer SDK should add it on top from `allowance-status.reservedAmount` if a\n * concurrent sub already holds budget against the same (payer, token).\n */\nfunction defaultPermitAmount(extra: SubscriptionRequirementsExtra): string {\n const initialChargePeriods = BigInt(extra.initialCharge?.periodCount ?? 0);\n const initialChargeAmount = BigInt(extra.initialCharge?.totalAmount ?? \"0\");\n const remainingPeriods = BigInt(extra.maxPeriods) - initialChargePeriods;\n const remainingAmount =\n remainingPeriods > 0n ? remainingPeriods * BigInt(extra.amountPerPeriod) : 0n;\n return (initialChargeAmount + remainingAmount).toString();\n}\n\n/**\n * Build the Permit2 PermitSingle (AllowanceTransfer) typed data the wallet\n * signs. `spender = subscription contract`; `amount` covers the entire\n * remaining commitment (default), so the subscription contract can pull from\n * the same Permit2 allowance on every charge without re-signing.\n *\n * Permit2's EIP-712 domain has NO `version` field.\n */\nexport function buildPermit2TypedData(\n input: BuildPermit2TypedDataInput,\n): TypedDataEnvelope<\"PermitSingle\", Record<string, unknown>> {\n const extra = getSubscriptionExtra(input.selected);\n const amount = input.amount ?? defaultPermitAmount(extra);\n const chainId = parseChainIdFromNetwork(input.selected.network);\n\n return {\n domain: {\n name: \"Permit2\",\n chainId,\n verifyingContract: extra.contracts.permit2 as Hex,\n },\n types: PERMIT2_TYPES as unknown as TypedDataEnvelope<\n \"PermitSingle\",\n Record<string, unknown>\n >[\"types\"],\n primaryType: \"PermitSingle\",\n message: {\n details: {\n token: input.selected.asset,\n amount,\n expiration: input.expiration,\n nonce: input.nonce,\n },\n spender: extra.contracts.subscription,\n sigDeadline: input.sigDeadline,\n },\n };\n}\n\n/**\n * Compute the EIP-712 struct hash of a PermitSingle message — what\n * `terms.permitHash` must equal byte-for-byte. The facilitator verifies this\n * via `permit_hash_mismatch`.\n *\n * permitDetailsHash = keccak256(\n * PERMIT_DETAILS_TYPEHASH ‖ token ‖ amount ‖ expiration ‖ nonce\n * )\n * permitSingleHash = keccak256(\n * PERMIT_SINGLE_TYPEHASH ‖ permitDetailsHash ‖ spender ‖ sigDeadline\n * )\n */\nexport function computePermitSingleStructHash(permit: PermitSingleData): Hex {\n // PermitDetails(address token,uint160 amount,uint48 expiration,uint48 nonce)\n const PERMIT_DETAILS_TYPEHASH = keccak256(\n new TextEncoder().encode(\n \"PermitDetails(address token,uint160 amount,uint48 expiration,uint48 nonce)\",\n ),\n );\n const detailsHash = keccak256(\n encodeAbiParameters(\n [\n { type: \"bytes32\" },\n { type: \"address\" },\n { type: \"uint160\" },\n { type: \"uint48\" },\n { type: \"uint48\" },\n ],\n [\n PERMIT_DETAILS_TYPEHASH,\n permit.details.token as Hex,\n BigInt(permit.details.amount),\n Number(permit.details.expiration),\n Number(permit.details.nonce),\n ],\n ),\n );\n\n // PermitSingle(PermitDetails details,address spender,uint256 sigDeadline)PermitDetails(...)\n const PERMIT_SINGLE_TYPEHASH = keccak256(\n new TextEncoder().encode(\n \"PermitSingle(PermitDetails details,address spender,uint256 sigDeadline)\" +\n \"PermitDetails(address token,uint160 amount,uint48 expiration,uint48 nonce)\",\n ),\n );\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }, { type: \"address\" }, { type: \"uint256\" }],\n [PERMIT_SINGLE_TYPEHASH, detailsHash, permit.spender as Hex, BigInt(permit.sigDeadline)],\n ),\n );\n}\n\n/**\n * Build the EIP-712 typed-data object the wallet signs to commit to the\n * subscription terms (17 fields). `permitHash` MUST be the struct hash of\n * the PermitSingle the buyer signed for permit2 (compute it via\n * `computePermitSingleStructHash`) — the contract verifies this binding to\n * defeat detached-signature swap attacks.\n */\nexport function buildSubscriptionTermsTypedData(\n input: BuildSubscriptionTermsTypedDataInput,\n): TypedDataEnvelope<\"SubscriptionTerms\", SubscriptionTerms> {\n const extra = getSubscriptionExtra(input.selected);\n const domain = input.domain ?? extra.domain;\n\n // changeEffectiveAt: 0=none(create), 1=immediate(upgrade), 2=period_end(downgrade)\n let changeEffectiveAt = 0;\n if (input.changeFrom?.effectiveAt === \"immediate\") changeEffectiveAt = 1;\n else if (input.changeFrom?.effectiveAt === \"period_end\") changeEffectiveAt = 2;\n\n const message: SubscriptionTerms = {\n payer: input.payer,\n merchant: input.selected.payTo,\n facilitator: extra.facilitator,\n token: input.selected.asset,\n amountPerPeriod: extra.amountPerPeriod,\n periodSec: extra.periodSec,\n maxPeriods: extra.maxPeriods,\n startAt: input.startAt,\n initialChargePeriods: extra.initialCharge?.periodCount ?? 0,\n initialChargeAmount: extra.initialCharge?.totalAmount ?? \"0\",\n termsDeadline: input.termsDeadline,\n permitHash: input.permitHash,\n salt: input.salt,\n planTier: extra.plan.tier,\n changeFromSubId: input.changeFrom?.fromSubId ?? ZERO_BYTES32,\n changeEffectiveAt,\n periodMode: extra.periodMode ?? 0,\n };\n\n return {\n domain,\n types: SUBSCRIPTION_TERMS_TYPES as unknown as TypedDataEnvelope<\n \"SubscriptionTerms\",\n SubscriptionTerms\n >[\"types\"],\n primaryType: \"SubscriptionTerms\",\n message,\n };\n}\n\nexport function buildCancelAuthTypedData(\n input: BuildCancelAuthTypedDataInput,\n): TypedDataEnvelope<\"CancelAuth\", Record<string, unknown>> {\n return {\n domain: input.domain,\n types: CANCEL_AUTH_TYPES as unknown as TypedDataEnvelope<\n \"CancelAuth\",\n Record<string, unknown>\n >[\"types\"],\n primaryType: \"CancelAuth\",\n message: {\n action: 0,\n subId: input.subId,\n initiator: CANCEL_INITIATOR_TO_ENUM[input.initiator],\n nonce: input.nonce,\n deadline: input.deadline,\n },\n };\n}\n\nexport function buildPendingChangeCancelAuthTypedData(\n input: BuildPendingChangeCancelAuthTypedDataInput,\n): TypedDataEnvelope<\"PendingChangeCancelAuth\", Record<string, unknown>> {\n return {\n domain: input.domain,\n types: PENDING_CHANGE_CANCEL_AUTH_TYPES as unknown as TypedDataEnvelope<\n \"PendingChangeCancelAuth\",\n Record<string, unknown>\n >[\"types\"],\n primaryType: \"PendingChangeCancelAuth\",\n message: {\n subId: input.subId,\n newSubId: input.newSubId,\n nonce: input.nonce,\n deadline: input.deadline,\n },\n };\n}\n\n/**\n * Parse the chainId from a CAIP-2 network identifier (`eip155:<chainId>`).\n * Throws if not an EVM CAIP — the subscription scheme is EVM-only.\n */\nexport function parseChainIdFromNetwork(network: string): number {\n const parts = network.split(\":\");\n if (parts.length !== 2 || parts[0] !== \"eip155\") {\n throw new Error(`parseChainIdFromNetwork: expected \"eip155:<chainId>\", got \"${network}\"`);\n }\n const id = Number(parts[1]);\n if (!Number.isInteger(id) || id <= 0) {\n throw new Error(`parseChainIdFromNetwork: invalid chainId \"${parts[1]}\"`);\n }\n return id;\n}\n","import type { Hex } from \"viem\";\n\nimport type { PaymentPayload, PaymentRequired, PaymentRequirements } from \"../../types/payments\";\nimport { base64DecodeUtf8, base64EncodeUtf8 } from \"./base64\";\n\n/**\n * Permit2 PermitSingle (AllowanceTransfer) — what the buyer signs to authorize\n * the subscription contract to pull tokens on every charge.\n *\n * PermitSingle(PermitDetails details, address spender, uint256 sigDeadline)\n * PermitDetails(address token, uint160 amount, uint48 expiration, uint48 nonce)\n */\nexport interface PermitSingleData {\n details: {\n token: string;\n /** uint160 as decimal string — covers entire remaining commitment. */\n amount: string;\n /** uint48 unix seconds — Permit2 allowance expiration. */\n expiration: number;\n /** uint48 — Permit2 nonce (current value from allowance-status, NOT +1). */\n nonce: number;\n };\n /** Subscription contract address. */\n spender: string;\n /** uint256 as decimal string — outer signature expiry. */\n sigDeadline: string;\n}\n\n/**\n * SubscriptionTerms — what the buyer's EIP-712 signature commits to. 17\n * fields. Field ORDER MATTERS because it determines the EIP-712 TypeHash:\n * 0xa5223de56e7694cf776c7d4f74c0323f42bf9e65655fe49affefbdfd40ec97ae\n */\nexport interface SubscriptionTerms {\n payer: string;\n merchant: string;\n facilitator: string;\n token: string;\n /** uint160 (atomic units). */\n amountPerPeriod: string;\n /** uint64 seconds; MUST be 0 when periodMode=1 (calendar_month). */\n periodSec: number;\n /** uint32. */\n maxPeriods: number;\n /** uint64 unix seconds; 0 means \"use block.timestamp on-chain\". */\n startAt: number;\n /** uint32; 0 = no separate initial charge. */\n initialChargePeriods: number;\n /** uint160; atomic units. */\n initialChargeAmount: string;\n /** uint64 unix seconds — terms signature validity window. */\n termsDeadline: number;\n /** bytes32 — keccak256 of the PermitSingle EIP-712 struct hash, binds terms to permit. */\n permitHash: Hex;\n /** bytes32 — buyer-generated random anti-replay value. */\n salt: Hex;\n /** uint8 (>0) — plan tier for upgrade/downgrade comparison. */\n planTier: number;\n /** bytes32 — old subId on change, zero on create. */\n changeFromSubId: Hex;\n /** uint8 — 0 none(create) / 1 immediate(upgrade) / 2 period_end(downgrade). */\n changeEffectiveAt: number;\n /** uint8 — 0 fixed_seconds / 1 calendar_month. */\n periodMode: number;\n /**\n * bytes32 — keccak256(utf8(plan.id)). Buyer SDKs sign it as a terms field\n * and the facilitator persists it as the on-chain `planId`. Seller verify\n * MUST cross-check this hash equals `keccak256(utf8(accepted.extra.plan.id))`\n * to defeat plan-spoof attacks.\n */\n planId?: Hex;\n}\n\n/**\n * Concrete payload nested inside `PaymentPayload.payload` for the `period`\n * scheme.\n */\nexport interface SubscriptionPaymentInner {\n permitSingle: PermitSingleData;\n permitSingleSignature: Hex;\n terms: SubscriptionTerms;\n termsSignature: Hex;\n}\n\nexport interface EncodePaymentPayloadInput {\n selected: PaymentRequirements;\n permitSingle: PermitSingleData;\n permitSingleSignature: Hex;\n terms: SubscriptionTerms;\n termsSignature: Hex;\n}\n\n/**\n * Decode the `APP-PAYMENT-REQUIRED` header into the underlying\n * `PaymentRequired.accepts` array. Throws on invalid base64 / JSON.\n */\nexport function parsePaymentRequired(headerValue: string): PaymentRequirements[] {\n const json = base64DecodeUtf8(headerValue);\n const parsed = JSON.parse(json) as PaymentRequired;\n if (!parsed || !Array.isArray(parsed.accepts)) {\n throw new Error(\"parsePaymentRequired: missing or invalid `accepts` array\");\n }\n return parsed.accepts;\n}\n\n/**\n * Build the `PAYMENT-SIGNATURE` header value (base64-encoded JSON). Buyer side.\n */\nexport function encodePaymentPayload(input: EncodePaymentPayloadInput): string {\n const payload: PaymentPayload = {\n x402Version: 2,\n accepted: input.selected,\n payload: {\n permitSingle: input.permitSingle,\n permitSingleSignature: input.permitSingleSignature,\n terms: input.terms,\n termsSignature: input.termsSignature,\n },\n };\n return base64EncodeUtf8(JSON.stringify(payload));\n}\n\n/**\n * Decode the `PAYMENT-SIGNATURE` header value back into a typed PaymentPayload.\n * Throws on invalid base64 / JSON; does not validate field shapes (that is the\n * responsibility of the scheme verify step).\n */\nexport function decodePaymentPayload(headerValue: string): PaymentPayload {\n const json = base64DecodeUtf8(headerValue);\n return JSON.parse(json) as PaymentPayload;\n}\n\n/**\n * Narrow a generic PaymentPayload's `.payload` to the subscription inner.\n * Throws if required fields are missing — single chokepoint between base64\n * decode and verify.\n */\nexport function asSubscriptionPaymentInner(payload: PaymentPayload): SubscriptionPaymentInner {\n const inner = payload.payload as Partial<SubscriptionPaymentInner>;\n if (\n !inner ||\n !inner.permitSingle ||\n !inner.terms ||\n !inner.permitSingleSignature ||\n !inner.termsSignature\n ) {\n throw new Error(\n \"asSubscriptionPaymentInner: payload.payload is missing required permitSingle/terms fields\",\n );\n }\n return inner as SubscriptionPaymentInner;\n}\n","export const x402Version = 2;\nexport { OKXFacilitatorClient } from \"./facilitator/OKXFacilitatorClient\";\nexport type { OKXConfig } from \"./facilitator/OKXFacilitatorClient\";","import { x402Version } from \"..\";\nimport { SettleResponse, VerifyResponse } from \"../types/facilitator\";\nimport { FacilitatorExtension } from \"../types/extensions\";\nimport { SchemeNetworkFacilitator, FacilitatorContext } from \"../types/mechanisms\";\nimport { PaymentPayload, PaymentRequirements } from \"../types/payments\";\nimport { Network } from \"../types\";\nimport { type SchemeData } from \"../utils\";\n\n/**\n * Facilitator Hook Context Interfaces\n */\n\nexport interface FacilitatorVerifyContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorVerifyResultContext extends FacilitatorVerifyContext {\n result: VerifyResponse;\n}\n\nexport interface FacilitatorVerifyFailureContext extends FacilitatorVerifyContext {\n error: Error;\n}\n\nexport interface FacilitatorSettleContext {\n paymentPayload: PaymentPayload;\n requirements: PaymentRequirements;\n}\n\nexport interface FacilitatorSettleResultContext extends FacilitatorSettleContext {\n result: SettleResponse;\n}\n\nexport interface FacilitatorSettleFailureContext extends FacilitatorSettleContext {\n error: Error;\n}\n\n/**\n * Facilitator Hook Type Definitions\n */\n\nexport type FacilitatorBeforeVerifyHook = (\n context: FacilitatorVerifyContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterVerifyHook = (context: FacilitatorVerifyResultContext) => Promise<void>;\n\nexport type FacilitatorOnVerifyFailureHook = (\n context: FacilitatorVerifyFailureContext,\n) => Promise<void | { recovered: true; result: VerifyResponse }>;\n\nexport type FacilitatorBeforeSettleHook = (\n context: FacilitatorSettleContext,\n) => Promise<void | { abort: true; reason: string }>;\n\nexport type FacilitatorAfterSettleHook = (context: FacilitatorSettleResultContext) => Promise<void>;\n\nexport type FacilitatorOnSettleFailureHook = (\n context: FacilitatorSettleFailureContext,\n) => Promise<void | { recovered: true; result: SettleResponse }>;\n\n/**\n * Facilitator client for the x402 payment protocol.\n * Manages payment scheme registration, verification, and settlement.\n */\nexport class x402Facilitator {\n private readonly registeredFacilitatorSchemes: Map<\n number,\n SchemeData<SchemeNetworkFacilitator>[] // Array to support multiple facilitators per version\n > = new Map();\n private readonly extensions: Map<string, FacilitatorExtension> = new Map();\n\n private beforeVerifyHooks: FacilitatorBeforeVerifyHook[] = [];\n private afterVerifyHooks: FacilitatorAfterVerifyHook[] = [];\n private onVerifyFailureHooks: FacilitatorOnVerifyFailureHook[] = [];\n private beforeSettleHooks: FacilitatorBeforeSettleHook[] = [];\n private afterSettleHooks: FacilitatorAfterSettleHook[] = [];\n private onSettleFailureHooks: FacilitatorOnSettleFailureHook[] = [];\n\n /**\n * Registers a scheme facilitator for the current x402 version.\n * Networks are stored and used for getSupported() - no need to specify them later.\n *\n * @param networks - Single network or array of networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n register(networks: Network | Network[], facilitator: SchemeNetworkFacilitator): x402Facilitator {\n const networksArray = Array.isArray(networks) ? networks : [networks];\n return this._registerScheme(x402Version, networksArray, facilitator);\n }\n\n /**\n * Registers a protocol extension.\n *\n * @param extension - The extension object to register\n * @returns The x402Facilitator instance for chaining\n */\n registerExtension(extension: FacilitatorExtension): x402Facilitator {\n this.extensions.set(extension.key, extension);\n return this;\n }\n\n /**\n * Gets the list of registered extension keys.\n *\n * @returns Array of extension key strings\n */\n getExtensions(): string[] {\n return Array.from(this.extensions.keys());\n }\n\n /**\n * Gets a registered extension by key.\n *\n * @param key - The extension key to look up\n * @returns The extension object, or undefined if not registered\n */\n getExtension<T extends FacilitatorExtension = FacilitatorExtension>(key: string): T | undefined {\n return this.extensions.get(key) as T | undefined;\n }\n\n /**\n * Register a hook to execute before facilitator payment verification.\n * Can abort verification by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeVerify(hook: FacilitatorBeforeVerifyHook): x402Facilitator {\n this.beforeVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment verification (isValid: true).\n * This hook is NOT called when verification fails (isValid: false) - use onVerifyFailure for that.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterVerify(hook: FacilitatorAfterVerifyHook): x402Facilitator {\n this.afterVerifyHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator payment verification fails.\n * Called when: verification returns isValid: false, or an exception is thrown during verification.\n * Can recover from failure by returning { recovered: true, result: VerifyResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onVerifyFailure(hook: FacilitatorOnVerifyFailureHook): x402Facilitator {\n this.onVerifyFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute before facilitator payment settlement.\n * Can abort settlement by returning { abort: true, reason: string }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onBeforeSettle(hook: FacilitatorBeforeSettleHook): x402Facilitator {\n this.beforeSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute after successful facilitator payment settlement.\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onAfterSettle(hook: FacilitatorAfterSettleHook): x402Facilitator {\n this.afterSettleHooks.push(hook);\n return this;\n }\n\n /**\n * Register a hook to execute when facilitator payment settlement fails.\n * Can recover from failure by returning { recovered: true, result: SettleResponse }\n *\n * @param hook - The hook function to register\n * @returns The x402Facilitator instance for chaining\n */\n onSettleFailure(hook: FacilitatorOnSettleFailureHook): x402Facilitator {\n this.onSettleFailureHooks.push(hook);\n return this;\n }\n\n /**\n * Gets supported payment kinds, extensions, and signers.\n * Uses networks registered during register() calls - no parameters needed.\n * Returns flat array format for backward compatibility with V1 clients.\n *\n * @returns Supported response with kinds as array (with version in each element), extensions, and signers\n */\n getSupported(): {\n kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }>;\n extensions: string[];\n signers: Record<string, string[]>;\n } {\n const kinds: Array<{\n x402Version: number;\n scheme: string;\n network: string;\n extra?: Record<string, unknown>;\n }> = [];\n const signersByFamily: Record<string, Set<string>> = {};\n\n // Iterate over registered scheme data (array supports multiple facilitators per version)\n for (const [version, schemeDataArray] of this.registeredFacilitatorSchemes) {\n for (const schemeData of schemeDataArray) {\n const { facilitator, networks } = schemeData;\n const scheme = facilitator.scheme;\n\n // Iterate over stored concrete networks\n for (const network of networks) {\n const extra = facilitator.getExtra(network);\n kinds.push({\n x402Version: version,\n scheme,\n network,\n ...(extra && { extra }),\n });\n\n // Collect signers by CAIP family for this network\n const family = facilitator.caipFamily;\n if (!signersByFamily[family]) {\n signersByFamily[family] = new Set();\n }\n facilitator.getSigners(network).forEach(signer => signersByFamily[family].add(signer));\n }\n }\n }\n\n // Convert signer sets to arrays\n const signers: Record<string, string[]> = {};\n for (const [family, signerSet] of Object.entries(signersByFamily)) {\n signers[family] = Array.from(signerSet);\n }\n\n return {\n kinds,\n extensions: this.getExtensions(),\n signers,\n };\n }\n\n /**\n * Verifies a payment payload against requirements.\n *\n * @param paymentPayload - The payment payload to verify\n * @param paymentRequirements - The payment requirements to verify against\n * @returns Promise resolving to the verification response\n */\n async verify(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const context: FacilitatorVerifyContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeVerify hooks\n for (const hook of this.beforeVerifyHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n return {\n isValid: false,\n invalidReason: result.reason,\n };\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const facilitatorContext = this.buildFacilitatorContext();\n const verifyResult = await schemeNetworkFacilitator.verify(\n paymentPayload,\n paymentRequirements,\n facilitatorContext,\n );\n\n // Check if verification failed (isValid: false)\n if (!verifyResult.isValid) {\n const failureContext: FacilitatorVerifyFailureContext = {\n ...context,\n error: new Error(verifyResult.invalidReason || \"Verification failed\"),\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n // If recovered, execute afterVerify hooks with recovered result\n const recoveredContext: FacilitatorVerifyResultContext = {\n ...context,\n result: result.result,\n };\n for (const hook of this.afterVerifyHooks) {\n await hook(recoveredContext);\n }\n return result.result;\n }\n }\n\n return verifyResult;\n }\n\n // Execute afterVerify hooks only for successful verification\n const resultContext: FacilitatorVerifyResultContext = {\n ...context,\n result: verifyResult,\n };\n\n for (const hook of this.afterVerifyHooks) {\n await hook(resultContext);\n }\n\n return verifyResult;\n } catch (error) {\n const failureContext: FacilitatorVerifyFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onVerifyFailure hooks\n for (const hook of this.onVerifyFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Settles a payment based on the payload and requirements.\n *\n * @param paymentPayload - The payment payload to settle\n * @param paymentRequirements - The payment requirements for settlement\n * @returns Promise resolving to the settlement response\n */\n async settle(\n paymentPayload: PaymentPayload,\n paymentRequirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const context: FacilitatorSettleContext = {\n paymentPayload,\n requirements: paymentRequirements,\n };\n\n // Execute beforeSettle hooks\n for (const hook of this.beforeSettleHooks) {\n const result = await hook(context);\n if (result && \"abort\" in result && result.abort) {\n throw new Error(`Settlement aborted: ${result.reason}`);\n }\n }\n\n try {\n const schemeDataArray = this.registeredFacilitatorSchemes.get(paymentPayload.x402Version);\n if (!schemeDataArray) {\n throw new Error(\n `No facilitator registered for x402 version: ${paymentPayload.x402Version}`,\n );\n }\n\n // Find matching facilitator from array\n let schemeNetworkFacilitator: SchemeNetworkFacilitator | undefined;\n for (const schemeData of schemeDataArray) {\n if (schemeData.facilitator.scheme === paymentRequirements.scheme) {\n // Check if network matches\n if (schemeData.networks.has(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n // Try pattern matching\n const patternRegex = new RegExp(\"^\" + schemeData.pattern.replace(\"*\", \".*\") + \"$\");\n if (patternRegex.test(paymentRequirements.network)) {\n schemeNetworkFacilitator = schemeData.facilitator;\n break;\n }\n }\n }\n\n if (!schemeNetworkFacilitator) {\n throw new Error(\n `No facilitator registered for scheme: ${paymentRequirements.scheme} and network: ${paymentRequirements.network}`,\n );\n }\n\n const facilitatorContext = this.buildFacilitatorContext();\n const settleResult = await schemeNetworkFacilitator.settle(\n paymentPayload,\n paymentRequirements,\n facilitatorContext,\n );\n\n // Execute afterSettle hooks\n const resultContext: FacilitatorSettleResultContext = {\n ...context,\n result: settleResult,\n };\n\n for (const hook of this.afterSettleHooks) {\n await hook(resultContext);\n }\n\n return settleResult;\n } catch (error) {\n const failureContext: FacilitatorSettleFailureContext = {\n ...context,\n error: error as Error,\n };\n\n // Execute onSettleFailure hooks\n for (const hook of this.onSettleFailureHooks) {\n const result = await hook(failureContext);\n if (result && \"recovered\" in result && result.recovered) {\n return result.result;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Builds a FacilitatorContext from the registered extensions map.\n * Passed to mechanism verify/settle so they can access extension capabilities.\n *\n * @returns A FacilitatorContext backed by this facilitator's registered extensions\n */\n private buildFacilitatorContext(): FacilitatorContext {\n const extensionsMap = this.extensions;\n return {\n getExtension<T extends FacilitatorExtension = FacilitatorExtension>(\n key: string,\n ): T | undefined {\n return extensionsMap.get(key) as T | undefined;\n },\n };\n }\n\n /**\n * Internal method to register a scheme facilitator.\n *\n * @param x402Version - The x402 protocol version\n * @param networks - Array of concrete networks this facilitator supports\n * @param facilitator - The scheme network facilitator to register\n * @returns The x402Facilitator instance for chaining\n */\n private _registerScheme(\n x402Version: number,\n networks: Network[],\n facilitator: SchemeNetworkFacilitator,\n ): x402Facilitator {\n if (!this.registeredFacilitatorSchemes.has(x402Version)) {\n this.registeredFacilitatorSchemes.set(x402Version, []);\n }\n const schemeDataArray = this.registeredFacilitatorSchemes.get(x402Version)!;\n\n // Add new scheme data (supports multiple facilitators with same scheme name)\n schemeDataArray.push({\n facilitator,\n networks: new Set(networks),\n pattern: this.derivePattern(networks),\n });\n\n return this;\n }\n\n /**\n * Derives a wildcard pattern from an array of networks.\n * If all networks share the same namespace, returns wildcard pattern.\n * Otherwise returns the first network for exact matching.\n *\n * @param networks - Array of networks\n * @returns Derived pattern for matching\n */\n private derivePattern(networks: Network[]): Network {\n if (networks.length === 0) return \"\" as Network;\n if (networks.length === 1) return networks[0];\n\n // Extract namespaces (e.g., \"eip155\" from \"eip155:196\")\n const namespaces = networks.map(n => n.split(\":\")[0]);\n const uniqueNamespaces = new Set(namespaces);\n\n // If all same namespace, use wildcard\n if (uniqueNamespaces.size === 1) {\n return `${namespaces[0]}:*` as Network;\n }\n\n // Mixed namespaces - use first network for exact matching\n return networks[0];\n }\n}\n"],"mappings":"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","names":["crypto","hook","x402Version"]}
@@ -1,7 +1,9 @@
1
- import { c as PaymentRequired, S as SettleResponse, P as PaymentPayload } from '../mechanisms-sojpSwWW.js';
2
- export { d as FacilitatorClient, e as FacilitatorConfig, f as FacilitatorResponseError, H as HTTPFacilitatorClient, g as getFacilitatorResponseError } from '../mechanisms-sojpSwWW.js';
3
- export { C as CompiledRoute, D as DynamicPayTo, a as DynamicPrice, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseBody, e as HTTPResponseInstructions, f as HTTPTransportContext, O as OnSettlementTimeoutHook, P as PaymentOption, g as PaywallConfig, h as PaywallProvider, i as ProcessSettleFailureResponse, j as ProcessSettleResultResponse, k as ProcessSettleSuccessResponse, l as ProtectedRequestHook, R as RouteConfig, m as RouteConfigurationError, n as RouteValidationError, o as RoutesConfig, S as SettlementFailedResponseBody, U as UnpaidResponseBody, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-CcsAkcgI.js';
1
+ import { c as PaymentRequired, S as SettleResponse, P as PaymentPayload } from '../mechanisms-LhI9qkRo.js';
2
+ export { d as FacilitatorClient, e as FacilitatorConfig, f as FacilitatorResponseError, H as HTTPFacilitatorClient, g as getFacilitatorResponseError } from '../mechanisms-LhI9qkRo.js';
3
+ export { C as CompiledRoute, D as DynamicPayTo, a as DynamicPrice, H as HTTPAdapter, b as HTTPProcessResult, c as HTTPRequestContext, d as HTTPResponseBody, e as HTTPResponseInstructions, f as HTTPTransportContext, O as OnSettlementTimeoutHook, P as PaymentOption, g as PaywallConfig, h as PaywallProvider, i as ProcessSettleFailureResponse, j as ProcessSettleResultResponse, k as ProcessSettleSuccessResponse, l as ProtectedRequestHook, R as RouteConfig, m as RouteConfigurationError, n as RouteValidationError, o as RoutesConfig, S as SettlementFailedResponseBody, U as UnpaidResponseBody, x as x402HTTPResourceServer } from '../x402HTTPResourceServer-B0mXzV8r.js';
4
4
  export { PaymentRequiredContext, PaymentRequiredHook, x402HTTPClient } from '../client/index.js';
5
+ import '../index-2gWfiUbK.js';
6
+ import 'viem';
5
7
 
6
8
  type QueryParamMethods = "GET" | "HEAD" | "DELETE";
7
9
  type BodyMethods = "POST" | "PUT" | "PATCH";