@bankofai/x402-extensions 1.0.0-beta.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 (52) hide show
  1. package/README.md +28 -0
  2. package/dist/cjs/bazaar/index.d.ts +4 -0
  3. package/dist/cjs/bazaar/index.js +1048 -0
  4. package/dist/cjs/bazaar/index.js.map +1 -0
  5. package/dist/cjs/builder-code/index.d.ts +225 -0
  6. package/dist/cjs/builder-code/index.js +369 -0
  7. package/dist/cjs/builder-code/index.js.map +1 -0
  8. package/dist/cjs/index-B8S563vv.d.ts +929 -0
  9. package/dist/cjs/index-BUV9B9f8.d.ts +929 -0
  10. package/dist/cjs/index.d.ts +373 -0
  11. package/dist/cjs/index.js +3536 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/offer-receipt/index.d.ts +702 -0
  14. package/dist/cjs/offer-receipt/index.js +909 -0
  15. package/dist/cjs/offer-receipt/index.js.map +1 -0
  16. package/dist/cjs/payment-identifier/index.d.ts +345 -0
  17. package/dist/cjs/payment-identifier/index.js +285 -0
  18. package/dist/cjs/payment-identifier/index.js.map +1 -0
  19. package/dist/cjs/sign-in-with-x/index.d.ts +1117 -0
  20. package/dist/cjs/sign-in-with-x/index.js +876 -0
  21. package/dist/cjs/sign-in-with-x/index.js.map +1 -0
  22. package/dist/esm/bazaar/index.d.mts +4 -0
  23. package/dist/esm/bazaar/index.mjs +51 -0
  24. package/dist/esm/bazaar/index.mjs.map +1 -0
  25. package/dist/esm/builder-code/index.d.mts +225 -0
  26. package/dist/esm/builder-code/index.mjs +27 -0
  27. package/dist/esm/builder-code/index.mjs.map +1 -0
  28. package/dist/esm/chunk-4IPDE3NS.mjs +990 -0
  29. package/dist/esm/chunk-4IPDE3NS.mjs.map +1 -0
  30. package/dist/esm/chunk-N74HQTNO.mjs +807 -0
  31. package/dist/esm/chunk-N74HQTNO.mjs.map +1 -0
  32. package/dist/esm/chunk-OWZP4CUR.mjs +333 -0
  33. package/dist/esm/chunk-OWZP4CUR.mjs.map +1 -0
  34. package/dist/esm/chunk-RERA4OZZ.mjs +233 -0
  35. package/dist/esm/chunk-RERA4OZZ.mjs.map +1 -0
  36. package/dist/esm/chunk-TIVMC3ZS.mjs +828 -0
  37. package/dist/esm/chunk-TIVMC3ZS.mjs.map +1 -0
  38. package/dist/esm/index-B8S563vv.d.mts +929 -0
  39. package/dist/esm/index-BUV9B9f8.d.mts +929 -0
  40. package/dist/esm/index.d.mts +373 -0
  41. package/dist/esm/index.mjs +455 -0
  42. package/dist/esm/index.mjs.map +1 -0
  43. package/dist/esm/offer-receipt/index.d.mts +702 -0
  44. package/dist/esm/offer-receipt/index.mjs +97 -0
  45. package/dist/esm/offer-receipt/index.mjs.map +1 -0
  46. package/dist/esm/payment-identifier/index.d.mts +345 -0
  47. package/dist/esm/payment-identifier/index.mjs +39 -0
  48. package/dist/esm/payment-identifier/index.mjs.map +1 -0
  49. package/dist/esm/sign-in-with-x/index.d.mts +1117 -0
  50. package/dist/esm/sign-in-with-x/index.mjs +73 -0
  51. package/dist/esm/sign-in-with-x/index.mjs.map +1 -0
  52. package/package.json +124 -0
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/builder-code/index.ts
21
+ var builder_code_exports = {};
22
+ __export(builder_code_exports, {
23
+ BUILDER_CODE: () => BUILDER_CODE,
24
+ BUILDER_CODE_PATTERN: () => BUILDER_CODE_PATTERN,
25
+ BUILDER_CODE_SCHEMA: () => BUILDER_CODE_SCHEMA,
26
+ BuilderCodeClientExtension: () => BuilderCodeClientExtension,
27
+ BuilderCodeFacilitatorExtension: () => BuilderCodeFacilitatorExtension,
28
+ ERC_8021_MARKER: () => ERC_8021_MARKER,
29
+ SCHEMA_2_ID: () => SCHEMA_2_ID,
30
+ builderCodeResourceServerExtension: () => builderCodeResourceServerExtension,
31
+ declareBuilderCodeExtension: () => declareBuilderCodeExtension,
32
+ encodeBuilderCodeSuffix: () => encodeBuilderCodeSuffix,
33
+ parseBuilderCodeSuffixFromCalldata: () => parseBuilderCodeSuffixFromCalldata
34
+ });
35
+ module.exports = __toCommonJS(builder_code_exports);
36
+
37
+ // src/builder-code/types.ts
38
+ var BUILDER_CODE = "builder-code";
39
+ var ERC_8021_MARKER = "80218021802180218021802180218021";
40
+ var SCHEMA_2_ID = 2;
41
+ var BUILDER_CODE_PATTERN = /^[a-z0-9_]{1,32}$/;
42
+
43
+ // src/builder-code/cbor.ts
44
+ function normalizeServiceCodes(s) {
45
+ if (typeof s === "string") return [s];
46
+ if (Array.isArray(s)) return s;
47
+ return [];
48
+ }
49
+ function encodeCborMap(data) {
50
+ const entries = [];
51
+ let mapSize = 0;
52
+ if (data.a) {
53
+ mapSize++;
54
+ entries.push(encodeCborString("a"));
55
+ entries.push(encodeCborString(data.a));
56
+ }
57
+ if (data.w) {
58
+ mapSize++;
59
+ entries.push(encodeCborString("w"));
60
+ entries.push(encodeCborString(data.w));
61
+ }
62
+ const serviceCodes = normalizeServiceCodes(data.s);
63
+ if (serviceCodes.length > 0) {
64
+ mapSize++;
65
+ entries.push(encodeCborString("s"));
66
+ entries.push(encodeCborArray(serviceCodes));
67
+ }
68
+ const header = encodeCborMajorType(5, mapSize);
69
+ const totalLength = header.length + entries.reduce((sum, e) => sum + e.length, 0);
70
+ const result = new Uint8Array(totalLength);
71
+ let offset = 0;
72
+ result.set(header, offset);
73
+ offset += header.length;
74
+ for (const entry of entries) {
75
+ result.set(entry, offset);
76
+ offset += entry.length;
77
+ }
78
+ return result;
79
+ }
80
+ function encodeCborString(value) {
81
+ const encoded = new TextEncoder().encode(value);
82
+ const header = encodeCborMajorType(3, encoded.length);
83
+ const result = new Uint8Array(header.length + encoded.length);
84
+ result.set(header, 0);
85
+ result.set(encoded, header.length);
86
+ return result;
87
+ }
88
+ function encodeCborArray(values) {
89
+ const header = encodeCborMajorType(4, values.length);
90
+ const encodedValues = values.map(encodeCborString);
91
+ const totalLength = header.length + encodedValues.reduce((sum, e) => sum + e.length, 0);
92
+ const result = new Uint8Array(totalLength);
93
+ let offset = 0;
94
+ result.set(header, offset);
95
+ offset += header.length;
96
+ for (const encoded of encodedValues) {
97
+ result.set(encoded, offset);
98
+ offset += encoded.length;
99
+ }
100
+ return result;
101
+ }
102
+ function encodeCborMajorType(majorType, value) {
103
+ const mt = majorType << 5;
104
+ if (value <= 23) {
105
+ return new Uint8Array([mt | value]);
106
+ }
107
+ if (value <= 255) {
108
+ return new Uint8Array([mt | 24, value]);
109
+ }
110
+ if (value <= 65535) {
111
+ return new Uint8Array([mt | 25, value >> 8 & 255, value & 255]);
112
+ }
113
+ throw new Error(`CBOR value too large: ${value}`);
114
+ }
115
+ function encodeBuilderCodeSuffix(data) {
116
+ const cborBytes = encodeCborMap(data);
117
+ const cborLength = cborBytes.length;
118
+ const lengthHigh = cborLength >> 8 & 255;
119
+ const lengthLow = cborLength & 255;
120
+ const suffixBytes = new Uint8Array(cborLength + 2 + 1 + 16);
121
+ let offset = 0;
122
+ suffixBytes.set(cborBytes, offset);
123
+ offset += cborLength;
124
+ suffixBytes[offset++] = lengthHigh;
125
+ suffixBytes[offset++] = lengthLow;
126
+ suffixBytes[offset++] = SCHEMA_2_ID;
127
+ const markerBytes = hexToBytes(ERC_8021_MARKER);
128
+ suffixBytes.set(markerBytes, offset);
129
+ return `0x${bytesToHex(suffixBytes)}`;
130
+ }
131
+ function hexToBytes(hex) {
132
+ const bytes = new Uint8Array(hex.length / 2);
133
+ for (let i = 0; i < hex.length; i += 2) {
134
+ bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
135
+ }
136
+ return bytes;
137
+ }
138
+ function bytesToHex(bytes) {
139
+ return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
140
+ }
141
+ function parseBuilderCodeSuffixFromCalldata(calldata) {
142
+ const hex = calldata.startsWith("0x") ? calldata.slice(2) : calldata;
143
+ const markerPos = hex.lastIndexOf(ERC_8021_MARKER.toLowerCase());
144
+ if (markerPos < 6) {
145
+ return void 0;
146
+ }
147
+ if (parseInt(hex.slice(markerPos - 2, markerPos), 16) !== SCHEMA_2_ID) {
148
+ return void 0;
149
+ }
150
+ const cborLength = parseInt(hex.slice(markerPos - 6, markerPos - 2), 16);
151
+ const suffixStart = markerPos - 6 - cborLength * 2;
152
+ if (suffixStart < 0 || suffixStart + (cborLength + 19) * 2 !== hex.length) {
153
+ return void 0;
154
+ }
155
+ const bytes = hexToBytes(hex.slice(suffixStart, markerPos - 6));
156
+ let o = 0;
157
+ if (bytes[o] >> 5 !== 5) {
158
+ return void 0;
159
+ }
160
+ const mapInfo = bytes[o++] & 31;
161
+ const mapSize = mapInfo <= 23 ? mapInfo : mapInfo === 24 ? bytes[o++] : void 0;
162
+ if (mapSize === void 0) {
163
+ return void 0;
164
+ }
165
+ const result = {};
166
+ for (let entry = 0; entry < mapSize; entry++) {
167
+ if (bytes[o] >> 5 !== 3) {
168
+ return void 0;
169
+ }
170
+ const keyInfo = bytes[o++] & 31;
171
+ const keyLen = keyInfo <= 23 ? keyInfo : keyInfo === 24 ? bytes[o++] : void 0;
172
+ if (keyLen === void 0) {
173
+ return void 0;
174
+ }
175
+ const key = new TextDecoder().decode(bytes.subarray(o, o + keyLen));
176
+ o += keyLen;
177
+ if (key === "a" || key === "w") {
178
+ if (bytes[o] >> 5 !== 3) {
179
+ return void 0;
180
+ }
181
+ const valueInfo = bytes[o++] & 31;
182
+ const valueLen = valueInfo <= 23 ? valueInfo : valueInfo === 24 ? bytes[o++] : void 0;
183
+ if (valueLen === void 0) {
184
+ return void 0;
185
+ }
186
+ result[key] = new TextDecoder().decode(bytes.subarray(o, o + valueLen));
187
+ o += valueLen;
188
+ continue;
189
+ }
190
+ if (key === "s") {
191
+ if (bytes[o] >> 5 !== 4) {
192
+ return void 0;
193
+ }
194
+ const arrayInfo = bytes[o++] & 31;
195
+ const arraySize = arrayInfo <= 23 ? arrayInfo : arrayInfo === 24 ? bytes[o++] : void 0;
196
+ if (arraySize === void 0) {
197
+ return void 0;
198
+ }
199
+ const codes = [];
200
+ for (let i = 0; i < arraySize; i++) {
201
+ if (bytes[o] >> 5 !== 3) {
202
+ return void 0;
203
+ }
204
+ const itemInfo = bytes[o++] & 31;
205
+ const itemLen = itemInfo <= 23 ? itemInfo : itemInfo === 24 ? bytes[o++] : void 0;
206
+ if (itemLen === void 0) {
207
+ return void 0;
208
+ }
209
+ codes.push(new TextDecoder().decode(bytes.subarray(o, o + itemLen)));
210
+ o += itemLen;
211
+ }
212
+ if (codes.length > 0) {
213
+ result.s = codes;
214
+ }
215
+ continue;
216
+ }
217
+ return void 0;
218
+ }
219
+ return result;
220
+ }
221
+
222
+ // src/builder-code/server.ts
223
+ var BUILDER_CODE_SCHEMA = {
224
+ $schema: "https://json-schema.org/draft/2020-12/schema",
225
+ type: "object",
226
+ properties: {
227
+ a: {
228
+ type: "string",
229
+ pattern: "^[a-z0-9_]{1,32}$",
230
+ description: "App builder code"
231
+ },
232
+ w: {
233
+ type: "string",
234
+ pattern: "^[a-z0-9_]{1,32}$",
235
+ description: "Wallet builder code"
236
+ },
237
+ s: {
238
+ type: "array",
239
+ items: {
240
+ type: "string",
241
+ pattern: "^[a-z0-9_]{1,32}$"
242
+ },
243
+ description: "Service builder codes"
244
+ }
245
+ },
246
+ additionalProperties: false
247
+ };
248
+ function declareBuilderCodeExtension(appCode) {
249
+ if (!BUILDER_CODE_PATTERN.test(appCode)) {
250
+ throw new Error(
251
+ `Invalid builder code: "${appCode}". Must be 1-32 characters, lowercase alphanumeric and underscores only.`
252
+ );
253
+ }
254
+ return {
255
+ info: { a: appCode },
256
+ schema: BUILDER_CODE_SCHEMA
257
+ };
258
+ }
259
+ var builderCodeResourceServerExtension = {
260
+ key: BUILDER_CODE
261
+ };
262
+
263
+ // src/builder-code/client.ts
264
+ var BuilderCodeClientExtension = class {
265
+ /**
266
+ * Creates a client extension that attaches the given service code(s) to payments.
267
+ *
268
+ * Accepts a single code or an array of codes so layered clients (e.g. an MCP
269
+ * middleware) can attribute multiple participants. Codes are normalized to an
270
+ * array and sent as the `s` field.
271
+ *
272
+ * @param serviceCodes - Client service code(s) (`s`), each 1-32 lowercase alphanumeric/underscore characters
273
+ */
274
+ constructor(serviceCodes) {
275
+ this.key = BUILDER_CODE;
276
+ const codes = Array.isArray(serviceCodes) ? serviceCodes : [serviceCodes];
277
+ for (const code of codes) {
278
+ if (!BUILDER_CODE_PATTERN.test(code)) {
279
+ throw new Error(
280
+ `Invalid builder code: "${code}". Must be 1-32 characters, lowercase alphanumeric and underscores only.`
281
+ );
282
+ }
283
+ }
284
+ this.serviceCodes = codes;
285
+ }
286
+ /**
287
+ * Attaches this client's service code(s) (`s`).
288
+ *
289
+ * @param payload - Payment payload to enrich
290
+ * @param _ - Server payment requirements; core merges server extension data
291
+ * @returns Payment payload with builder-code extension data
292
+ */
293
+ async enrichPaymentPayload(payload, _) {
294
+ return {
295
+ ...payload,
296
+ extensions: {
297
+ ...payload.extensions,
298
+ [BUILDER_CODE]: { info: { s: this.serviceCodes } }
299
+ }
300
+ };
301
+ }
302
+ };
303
+
304
+ // src/builder-code/facilitator.ts
305
+ function extractClientExtension(extensions) {
306
+ const info = extensions?.[BUILDER_CODE]?.info;
307
+ if (typeof info !== "object" || info === null || Array.isArray(info)) return void 0;
308
+ return info;
309
+ }
310
+ function resolveServiceCodes(raw) {
311
+ const candidates = typeof raw === "string" ? [raw] : Array.isArray(raw) ? raw : [];
312
+ return candidates.filter(
313
+ (v) => typeof v === "string" && BUILDER_CODE_PATTERN.test(v)
314
+ );
315
+ }
316
+ var BuilderCodeFacilitatorExtension = class {
317
+ /**
318
+ * Creates a facilitator extension that encodes builder-code attribution at settlement.
319
+ *
320
+ * @param config - Optional facilitator builder-code configuration (wallet code `w`)
321
+ */
322
+ constructor(config = {}) {
323
+ this.key = BUILDER_CODE;
324
+ if (config.builderCode && !BUILDER_CODE_PATTERN.test(config.builderCode)) {
325
+ throw new Error(
326
+ `Invalid builder code: "${config.builderCode}". Must be 1-32 characters, lowercase alphanumeric and underscores only.`
327
+ );
328
+ }
329
+ this.config = config;
330
+ }
331
+ /**
332
+ * Builds the ERC-8021 Schema 2 calldata suffix for a settlement transaction.
333
+ *
334
+ * - `a` and `s` are read from the client's payment payload extensions.
335
+ * - `w` is the facilitator's own code when configured.
336
+ *
337
+ * @param ctx - Settlement context with payment-payload extensions
338
+ * @returns Hex-encoded ERC-8021 builder-code calldata suffix, or undefined when no attribution is present
339
+ */
340
+ buildDataSuffix(ctx) {
341
+ const clientExt = extractClientExtension(ctx.paymentPayload.extensions);
342
+ const a = typeof clientExt?.a === "string" && BUILDER_CODE_PATTERN.test(clientExt.a) ? clientExt.a : void 0;
343
+ const s = resolveServiceCodes(clientExt?.s);
344
+ const data = {
345
+ ...this.config.builderCode && { w: this.config.builderCode },
346
+ ...a && { a },
347
+ ...s.length > 0 && { s }
348
+ };
349
+ if (!data.a && !data.w && (!data.s || Array.isArray(data.s) && data.s.length === 0)) {
350
+ return void 0;
351
+ }
352
+ return encodeBuilderCodeSuffix(data);
353
+ }
354
+ };
355
+ // Annotate the CommonJS export names for ESM import in node:
356
+ 0 && (module.exports = {
357
+ BUILDER_CODE,
358
+ BUILDER_CODE_PATTERN,
359
+ BUILDER_CODE_SCHEMA,
360
+ BuilderCodeClientExtension,
361
+ BuilderCodeFacilitatorExtension,
362
+ ERC_8021_MARKER,
363
+ SCHEMA_2_ID,
364
+ builderCodeResourceServerExtension,
365
+ declareBuilderCodeExtension,
366
+ encodeBuilderCodeSuffix,
367
+ parseBuilderCodeSuffixFromCalldata
368
+ });
369
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/builder-code/index.ts","../../../src/builder-code/types.ts","../../../src/builder-code/cbor.ts","../../../src/builder-code/server.ts","../../../src/builder-code/client.ts","../../../src/builder-code/facilitator.ts"],"sourcesContent":["/**\n * Builder Code Extension for x402 (ERC-8021)\n *\n * Enables attribution tracking for x402 payments by appending ERC-8021\n * Schema 2 builder codes to settlement transaction calldata.\n *\n * Three parties attach their builder code:\n * - Server: Declares `a` (app) in 402 response via declareBuilderCodeExtension()\n * - Client: Echoes `a` and adds `s` (service) via BuilderCodeClientExtension\n * - Facilitator: Optionally adds `w` (wallet) at settlement via BuilderCodeFacilitatorExtension\n *\n * ## Usage\n *\n * ### For Services (Resource Servers)\n *\n * ```typescript\n * import { declareBuilderCodeExtension, BUILDER_CODE } from '@bankofai/x402-extensions/builder-code';\n *\n * extensions: {\n * [BUILDER_CODE]: declareBuilderCodeExtension(\"bc_my_service\"),\n * }\n * ```\n *\n * ### For Clients\n *\n * ```typescript\n * import { BuilderCodeClientExtension } from '@bankofai/x402-extensions/builder-code';\n *\n * client.registerExtension(new BuilderCodeClientExtension(\"bc_my_client\"));\n * ```\n *\n * ### For Facilitators\n *\n * ```typescript\n * import { BuilderCodeFacilitatorExtension } from '@bankofai/x402-extensions/builder-code';\n *\n * facilitator.registerExtension(new BuilderCodeFacilitatorExtension({\n * builderCode: \"bc_my_facilitator\", // optional\n * }));\n * ```\n */\n\n// Types\nexport type {\n BuilderCodeExtensionData,\n BuilderCodeFacilitatorConfig,\n DataSuffixContext,\n} from \"./types\";\n\nexport { BUILDER_CODE, BUILDER_CODE_PATTERN, ERC_8021_MARKER, SCHEMA_2_ID } from \"./types\";\n\n// CBOR encoding\nexport { encodeBuilderCodeSuffix, parseBuilderCodeSuffixFromCalldata } from \"./cbor\";\n\n// Resource Server\nexport {\n BUILDER_CODE_SCHEMA,\n type BuilderCodeRequiredExtension,\n declareBuilderCodeExtension,\n builderCodeResourceServerExtension,\n} from \"./server\";\n\n// Client\nexport { BuilderCodeClientExtension } from \"./client\";\n\n// Facilitator\nexport { BuilderCodeFacilitatorExtension } from \"./facilitator\";\n","/**\n * Type definitions for the Builder Code Extension (ERC-8021)\n *\n * Enables attribution tracking for x402 payments by appending\n * ERC-8021 Schema 2 builder codes to settlement transaction calldata.\n */\n\nimport type { PaymentPayload, PaymentRequirements } from \"@bankofai/x402-core/types\";\n\n/**\n * Extension identifier constant\n */\nexport const BUILDER_CODE = \"builder-code\";\n\n/**\n * ERC-8021 marker bytes (16 bytes) appended at the end of every suffix\n */\nexport const ERC_8021_MARKER = \"80218021802180218021802180218021\";\n\n/**\n * Schema 2 identifier byte\n */\nexport const SCHEMA_2_ID = 0x02;\n\n/**\n * Pattern for valid builder codes (lowercase alphanumeric + underscore, 1-32 chars)\n */\nexport const BUILDER_CODE_PATTERN = /^[a-z0-9_]{1,32}$/;\n\n/**\n * Builder code extension data as it appears in PaymentRequired/PaymentPayload extensions.\n *\n * Maps to ERC-8021 Schema 2 fields:\n * - a: app code (the x402 service that exposed the endpoint)\n * - w: wallet code (the facilitator that settled the payment on-chain)\n * - s: service codes array (related on-chain services the app depends on)\n */\nexport interface BuilderCodeExtensionData {\n /**\n * App builder code — the x402 service that exposed the paid endpoint.\n * Maps to the \"a\" field in ERC-8021 Schema 2.\n * Set by the service in the 402 response.\n */\n a?: string;\n\n /**\n * Wallet builder code — the facilitator that settled the payment on-chain.\n * Maps to the \"w\" field in ERC-8021 Schema 2.\n * Set by the facilitator at settlement time.\n */\n w?: string;\n\n /**\n * Service builder codes — client-provided attribution codes.\n * Maps to the \"s\" field in ERC-8021 Schema 2 (encoded as an array on wire).\n * Accepts a single string or an array of strings; normalized to an array internally.\n */\n s?: string | string[];\n}\n\n/**\n * Configuration for the builder code facilitator extension.\n */\nexport interface BuilderCodeFacilitatorConfig {\n /**\n * The facilitator's own builder code, set as the \"w\" field at settlement when provided.\n */\n builderCode?: string;\n}\n\nexport interface DataSuffixContext {\n paymentPayload: PaymentPayload;\n paymentRequirements: PaymentRequirements;\n}\n","/**\n * ERC-8021 Schema 2 CBOR encoding for builder code suffixes.\n *\n * Schema 2 suffix format:\n * [cbor_data (variable)] [suffix_data_length (2 bytes)] [schema_id = 0x02 (1 byte)] [ERC-8021 marker (16 bytes)]\n *\n * CBOR payload uses single-letter keys:\n * \"a\" — app builder code (string)\n * \"w\" — wallet/facilitator builder code (string)\n * \"s\" — service codes (string array)\n */\n\nimport { type Hex } from \"viem\";\nimport { ERC_8021_MARKER, SCHEMA_2_ID, type BuilderCodeExtensionData } from \"./types\";\n\n/**\n * Normalizes the `s` field (string or array of strings) into an array of strings.\n *\n * @param s - Service code value as a string, array of strings, or undefined\n * @returns Array of service code strings (empty when absent)\n */\nfunction normalizeServiceCodes(s: BuilderCodeExtensionData[\"s\"]): string[] {\n if (typeof s === \"string\") return [s];\n if (Array.isArray(s)) return s;\n return [];\n}\n\n/**\n * Encodes a CBOR map from builder code extension data.\n *\n * Produces a minimal CBOR map with:\n * - \"a\" key (major type 3, length 1) → string value (app/service code)\n * - \"w\" key (major type 3, length 1) → string value (facilitator code)\n * - \"s\" key (major type 3, length 1) → array of strings (related services)\n *\n * Uses hand-rolled CBOR to avoid adding a dependency.\n *\n * @param data - Builder code extension fields to encode\n * @returns CBOR-encoded map bytes\n */\nfunction encodeCborMap(data: BuilderCodeExtensionData): Uint8Array {\n const entries: Uint8Array[] = [];\n let mapSize = 0;\n\n if (data.a) {\n mapSize++;\n entries.push(encodeCborString(\"a\"));\n entries.push(encodeCborString(data.a));\n }\n\n if (data.w) {\n mapSize++;\n entries.push(encodeCborString(\"w\"));\n entries.push(encodeCborString(data.w));\n }\n\n const serviceCodes = normalizeServiceCodes(data.s);\n if (serviceCodes.length > 0) {\n mapSize++;\n entries.push(encodeCborString(\"s\"));\n entries.push(encodeCborArray(serviceCodes));\n }\n\n // CBOR map header\n const header = encodeCborMajorType(5, mapSize); // major type 5 = map\n\n const totalLength = header.length + entries.reduce((sum, e) => sum + e.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n result.set(header, offset);\n offset += header.length;\n\n for (const entry of entries) {\n result.set(entry, offset);\n offset += entry.length;\n }\n\n return result;\n}\n\n/**\n * Encodes a CBOR text string (major type 3).\n *\n * @param value - UTF-8 text to encode\n * @returns CBOR-encoded text string bytes\n */\nfunction encodeCborString(value: string): Uint8Array {\n const encoded = new TextEncoder().encode(value);\n const header = encodeCborMajorType(3, encoded.length); // major type 3 = text string\n const result = new Uint8Array(header.length + encoded.length);\n result.set(header, 0);\n result.set(encoded, header.length);\n return result;\n}\n\n/**\n * Encodes a CBOR array of strings (major type 4).\n *\n * @param values - UTF-8 strings to encode as array elements\n * @returns CBOR-encoded array bytes\n */\nfunction encodeCborArray(values: string[]): Uint8Array {\n const header = encodeCborMajorType(4, values.length); // major type 4 = array\n const encodedValues = values.map(encodeCborString);\n\n const totalLength = header.length + encodedValues.reduce((sum, e) => sum + e.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n result.set(header, offset);\n offset += header.length;\n\n for (const encoded of encodedValues) {\n result.set(encoded, offset);\n offset += encoded.length;\n }\n\n return result;\n}\n\n/**\n * Encodes a CBOR major type with an argument value.\n *\n * CBOR encoding rules:\n * - 0-23: single byte (major type << 5 | value)\n * - 24-255: two bytes (major type << 5 | 24, value)\n * - 256-65535: three bytes (major type << 5 | 25, value high, value low)\n *\n * @param majorType - CBOR major type (0–7)\n * @param value - Argument length or inline value for the header\n * @returns CBOR header bytes\n */\nfunction encodeCborMajorType(majorType: number, value: number): Uint8Array {\n const mt = majorType << 5;\n\n if (value <= 23) {\n return new Uint8Array([mt | value]);\n }\n if (value <= 0xff) {\n return new Uint8Array([mt | 24, value]);\n }\n if (value <= 0xffff) {\n return new Uint8Array([mt | 25, (value >> 8) & 0xff, value & 0xff]);\n }\n\n throw new Error(`CBOR value too large: ${value}`);\n}\n\n/**\n * Builds a complete ERC-8021 Schema 2 data suffix from builder code data.\n *\n * Format: [cbor_data][suffix_data_length (2 bytes)][schema_id (1 byte)][marker (16 bytes)]\n *\n * The suffix_data_length covers the cbor_data only (not itself, schema_id, or marker).\n *\n * @param data - Builder code extension data with \"a\" and/or \"s\" fields\n * @returns Hex-encoded suffix bytes (without 0x prefix) ready to append to calldata\n */\nexport function encodeBuilderCodeSuffix(data: BuilderCodeExtensionData): Hex {\n const cborBytes = encodeCborMap(data);\n const cborLength = cborBytes.length;\n\n // suffix_data_length is 2 bytes, big-endian\n const lengthHigh = (cborLength >> 8) & 0xff;\n const lengthLow = cborLength & 0xff;\n\n // Build the full suffix: [cbor][length 2B][schema_id 1B][marker 16B]\n const suffixBytes = new Uint8Array(cborLength + 2 + 1 + 16);\n let offset = 0;\n\n // CBOR data\n suffixBytes.set(cborBytes, offset);\n offset += cborLength;\n\n // Suffix data length (2 bytes, big-endian)\n suffixBytes[offset++] = lengthHigh;\n suffixBytes[offset++] = lengthLow;\n\n // Schema ID\n suffixBytes[offset++] = SCHEMA_2_ID;\n\n // ERC-8021 marker (16 bytes)\n const markerBytes = hexToBytes(ERC_8021_MARKER);\n suffixBytes.set(markerBytes, offset);\n\n return `0x${bytesToHex(suffixBytes)}`;\n}\n\n/**\n * Converts a hex string (without 0x prefix) to bytes.\n *\n * @param hex - Hex-encoded string (two characters per byte)\n * @returns Decoded byte array\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Converts bytes to a lowercase hex string (without 0x prefix).\n *\n * @param bytes - Raw bytes to encode\n * @returns Lowercase hex string\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Parses ERC-8021 Schema 2 builder code attribution from settlement calldata.\n *\n * @param calldata - Full transaction input data\n * @returns Decoded builder code fields, or undefined if no valid suffix is present\n */\nexport function parseBuilderCodeSuffixFromCalldata(\n calldata: Hex,\n): BuilderCodeExtensionData | undefined {\n const hex = calldata.startsWith(\"0x\") ? calldata.slice(2) : calldata;\n const markerPos = hex.lastIndexOf(ERC_8021_MARKER.toLowerCase());\n if (markerPos < 6) {\n return undefined;\n }\n\n if (parseInt(hex.slice(markerPos - 2, markerPos), 16) !== SCHEMA_2_ID) {\n return undefined;\n }\n\n const cborLength = parseInt(hex.slice(markerPos - 6, markerPos - 2), 16);\n const suffixStart = markerPos - 6 - cborLength * 2;\n if (suffixStart < 0 || suffixStart + (cborLength + 19) * 2 !== hex.length) {\n return undefined;\n }\n\n const bytes = hexToBytes(hex.slice(suffixStart, markerPos - 6));\n let o = 0;\n\n if (bytes[o] >> 5 !== 5) {\n return undefined;\n }\n\n const mapInfo = bytes[o++] & 0x1f;\n const mapSize = mapInfo <= 23 ? mapInfo : mapInfo === 24 ? bytes[o++] : undefined;\n if (mapSize === undefined) {\n return undefined;\n }\n\n const result: BuilderCodeExtensionData = {};\n for (let entry = 0; entry < mapSize; entry++) {\n if (bytes[o] >> 5 !== 3) {\n return undefined;\n }\n\n const keyInfo = bytes[o++] & 0x1f;\n const keyLen = keyInfo <= 23 ? keyInfo : keyInfo === 24 ? bytes[o++] : undefined;\n if (keyLen === undefined) {\n return undefined;\n }\n\n const key = new TextDecoder().decode(bytes.subarray(o, o + keyLen));\n o += keyLen;\n\n if (key === \"a\" || key === \"w\") {\n if (bytes[o] >> 5 !== 3) {\n return undefined;\n }\n\n const valueInfo = bytes[o++] & 0x1f;\n const valueLen = valueInfo <= 23 ? valueInfo : valueInfo === 24 ? bytes[o++] : undefined;\n if (valueLen === undefined) {\n return undefined;\n }\n\n result[key] = new TextDecoder().decode(bytes.subarray(o, o + valueLen));\n o += valueLen;\n continue;\n }\n\n if (key === \"s\") {\n if (bytes[o] >> 5 !== 4) {\n return undefined;\n }\n\n const arrayInfo = bytes[o++] & 0x1f;\n const arraySize = arrayInfo <= 23 ? arrayInfo : arrayInfo === 24 ? bytes[o++] : undefined;\n if (arraySize === undefined) {\n return undefined;\n }\n\n const codes: string[] = [];\n for (let i = 0; i < arraySize; i++) {\n if (bytes[o] >> 5 !== 3) {\n return undefined;\n }\n\n const itemInfo = bytes[o++] & 0x1f;\n const itemLen = itemInfo <= 23 ? itemInfo : itemInfo === 24 ? bytes[o++] : undefined;\n if (itemLen === undefined) {\n return undefined;\n }\n\n codes.push(new TextDecoder().decode(bytes.subarray(o, o + itemLen)));\n o += itemLen;\n }\n\n if (codes.length > 0) {\n result.s = codes;\n }\n continue;\n }\n\n return undefined;\n }\n\n return result;\n}\n","/**\n * Resource Server utilities for the Builder Code Extension.\n */\n\nimport type { ResourceServerExtension } from \"@bankofai/x402-core/types\";\nimport { BUILDER_CODE, BUILDER_CODE_PATTERN, type BuilderCodeExtensionData } from \"./types\";\n\nexport const BUILDER_CODE_SCHEMA = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n type: \"object\",\n properties: {\n a: {\n type: \"string\",\n pattern: \"^[a-z0-9_]{1,32}$\",\n description: \"App builder code\",\n },\n w: {\n type: \"string\",\n pattern: \"^[a-z0-9_]{1,32}$\",\n description: \"Wallet builder code\",\n },\n s: {\n type: \"array\",\n items: {\n type: \"string\",\n pattern: \"^[a-z0-9_]{1,32}$\",\n },\n description: \"Service builder codes\",\n },\n },\n additionalProperties: false,\n} as const;\n\nexport interface BuilderCodeRequiredExtension {\n info: BuilderCodeExtensionData;\n schema: typeof BUILDER_CODE_SCHEMA;\n}\n\n/**\n * Declares the builder-code extension for inclusion in PaymentRequired.extensions.\n *\n * @param appCode - The service's builder code (e.g., \"bc_weather_svc\")\n * @returns Extension declaration with info and schema for PaymentRequired.extensions\n */\nexport function declareBuilderCodeExtension(appCode: string): BuilderCodeRequiredExtension {\n if (!BUILDER_CODE_PATTERN.test(appCode)) {\n throw new Error(\n `Invalid builder code: \"${appCode}\". ` +\n `Must be 1-32 characters, lowercase alphanumeric and underscores only.`,\n );\n }\n\n return {\n info: { a: appCode },\n schema: BUILDER_CODE_SCHEMA,\n };\n}\n\nexport const builderCodeResourceServerExtension: ResourceServerExtension = {\n key: BUILDER_CODE,\n};\n","/**\n * Client-side extension for the Builder Code Extension.\n *\n * Attaches the client's service code (`s`) to the payment payload.\n */\n\nimport type { ClientExtension } from \"@bankofai/x402-core/client\";\nimport type { PaymentPayload, PaymentRequired } from \"@bankofai/x402-core/types\";\nimport { BUILDER_CODE, BUILDER_CODE_PATTERN } from \"./types\";\n\n/**\n * Client extension that adds builder-code attribution to payment payloads.\n *\n * @example\n * ```typescript\n * import { BuilderCodeClientExtension } from '@bankofai/x402-extensions/builder-code';\n *\n * const client = new x402Client();\n * client.registerExtension(new BuilderCodeClientExtension(\"bc_my_client\"));\n * ```\n */\nexport class BuilderCodeClientExtension implements ClientExtension {\n readonly key = BUILDER_CODE;\n private readonly serviceCodes: string[];\n\n /**\n * Creates a client extension that attaches the given service code(s) to payments.\n *\n * Accepts a single code or an array of codes so layered clients (e.g. an MCP\n * middleware) can attribute multiple participants. Codes are normalized to an\n * array and sent as the `s` field.\n *\n * @param serviceCodes - Client service code(s) (`s`), each 1-32 lowercase alphanumeric/underscore characters\n */\n constructor(serviceCodes: string | string[]) {\n const codes = Array.isArray(serviceCodes) ? serviceCodes : [serviceCodes];\n for (const code of codes) {\n if (!BUILDER_CODE_PATTERN.test(code)) {\n throw new Error(\n `Invalid builder code: \"${code}\". ` +\n `Must be 1-32 characters, lowercase alphanumeric and underscores only.`,\n );\n }\n }\n this.serviceCodes = codes;\n }\n\n /**\n * Attaches this client's service code(s) (`s`).\n *\n * @param payload - Payment payload to enrich\n * @param _ - Server payment requirements; core merges server extension data\n * @returns Payment payload with builder-code extension data\n */\n async enrichPaymentPayload(payload: PaymentPayload, _: PaymentRequired): Promise<PaymentPayload> {\n return {\n ...payload,\n extensions: {\n ...payload.extensions,\n [BUILDER_CODE]: { info: { s: this.serviceCodes } },\n },\n };\n }\n}\n","/**\n * Facilitator-side extension for the Builder Code Extension.\n *\n * At settlement time, the facilitator encodes its wallet code into the ERC-8021\n * suffix when configured. App code (`a`) and service code (`s`) are read from\n * the client payment payload extensions.\n */\n\nimport type { FacilitatorExtension } from \"@bankofai/x402-core/types\";\nimport type { Hex } from \"viem\";\nimport { encodeBuilderCodeSuffix } from \"./cbor\";\nimport {\n BUILDER_CODE,\n BUILDER_CODE_PATTERN,\n type BuilderCodeExtensionData,\n type BuilderCodeFacilitatorConfig,\n type DataSuffixContext,\n} from \"./types\";\n\n/**\n * Reads the client builder-code extension object from payment-payload extensions.\n *\n * @param extensions - Extensions map from PaymentPayload\n * @returns Raw builder-code extension object, or undefined if absent\n */\nfunction extractClientExtension(\n extensions?: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const info = (extensions?.[BUILDER_CODE] as { info?: unknown } | undefined)?.info;\n if (typeof info !== \"object\" || info === null || Array.isArray(info)) return undefined;\n return info as Record<string, unknown>;\n}\n\n/**\n * Normalizes `s` from the client payload — accepts a string or an array and keeps\n * every valid entry.\n *\n * @param raw - Client-provided service code value (string or array of strings)\n * @returns Array of valid service codes (empty when missing or all invalid)\n */\nfunction resolveServiceCodes(raw: unknown): string[] {\n const candidates = typeof raw === \"string\" ? [raw] : Array.isArray(raw) ? raw : [];\n return candidates.filter(\n (v): v is string => typeof v === \"string\" && BUILDER_CODE_PATTERN.test(v),\n );\n}\n\n/**\n * Facilitator extension that manages builder code attribution at settlement time.\n *\n * @example\n * ```typescript\n * import { BuilderCodeFacilitatorExtension } from '@bankofai/x402-extensions/builder-code';\n *\n * const facilitator = new x402Facilitator();\n * facilitator.registerExtension(new BuilderCodeFacilitatorExtension({\n * builderCode: \"bc_my_facilitator\", // optional\n * }));\n * ```\n */\nexport class BuilderCodeFacilitatorExtension implements FacilitatorExtension {\n readonly key = BUILDER_CODE;\n private readonly config: BuilderCodeFacilitatorConfig;\n\n /**\n * Creates a facilitator extension that encodes builder-code attribution at settlement.\n *\n * @param config - Optional facilitator builder-code configuration (wallet code `w`)\n */\n constructor(config: BuilderCodeFacilitatorConfig = {}) {\n if (config.builderCode && !BUILDER_CODE_PATTERN.test(config.builderCode)) {\n throw new Error(\n `Invalid builder code: \"${config.builderCode}\". ` +\n `Must be 1-32 characters, lowercase alphanumeric and underscores only.`,\n );\n }\n this.config = config;\n }\n\n /**\n * Builds the ERC-8021 Schema 2 calldata suffix for a settlement transaction.\n *\n * - `a` and `s` are read from the client's payment payload extensions.\n * - `w` is the facilitator's own code when configured.\n *\n * @param ctx - Settlement context with payment-payload extensions\n * @returns Hex-encoded ERC-8021 builder-code calldata suffix, or undefined when no attribution is present\n */\n buildDataSuffix(ctx: DataSuffixContext): Hex | undefined {\n const clientExt = extractClientExtension(ctx.paymentPayload.extensions);\n\n const a =\n typeof clientExt?.a === \"string\" && BUILDER_CODE_PATTERN.test(clientExt.a)\n ? clientExt.a\n : undefined;\n const s = resolveServiceCodes(clientExt?.s);\n\n const data: BuilderCodeExtensionData = {\n ...(this.config.builderCode && { w: this.config.builderCode }),\n ...(a && { a }),\n ...(s.length > 0 && { s }),\n };\n\n if (!data.a && !data.w && (!data.s || (Array.isArray(data.s) && data.s.length === 0))) {\n return undefined;\n }\n\n return encodeBuilderCodeSuffix(data);\n }\n}\n"],"mappings":"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","names":[]}