bolt12-utils 0.1.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 (51) hide show
  1. package/dist/bech32.d.ts +31 -0
  2. package/dist/bech32.d.ts.map +1 -0
  3. package/dist/bech32.js +161 -0
  4. package/dist/bech32.js.map +1 -0
  5. package/dist/bigsize.d.ts +22 -0
  6. package/dist/bigsize.d.ts.map +1 -0
  7. package/dist/bigsize.js +87 -0
  8. package/dist/bigsize.js.map +1 -0
  9. package/dist/fields.d.ts +61 -0
  10. package/dist/fields.d.ts.map +1 -0
  11. package/dist/fields.js +99 -0
  12. package/dist/fields.js.map +1 -0
  13. package/dist/generated.d.ts +179 -0
  14. package/dist/generated.d.ts.map +1 -0
  15. package/dist/generated.js +565 -0
  16. package/dist/generated.js.map +1 -0
  17. package/dist/index.d.ts +47 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +125 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/merkle.d.ts +55 -0
  22. package/dist/merkle.d.ts.map +1 -0
  23. package/dist/merkle.js +144 -0
  24. package/dist/merkle.js.map +1 -0
  25. package/dist/offer.d.ts +45 -0
  26. package/dist/offer.d.ts.map +1 -0
  27. package/dist/offer.js +288 -0
  28. package/dist/offer.js.map +1 -0
  29. package/dist/payer_proof.d.ts +89 -0
  30. package/dist/payer_proof.d.ts.map +1 -0
  31. package/dist/payer_proof.js +576 -0
  32. package/dist/payer_proof.js.map +1 -0
  33. package/dist/tlv.d.ts +26 -0
  34. package/dist/tlv.d.ts.map +1 -0
  35. package/dist/tlv.js +65 -0
  36. package/dist/tlv.js.map +1 -0
  37. package/dist/utils.d.ts +12 -0
  38. package/dist/utils.d.ts.map +1 -0
  39. package/dist/utils.js +52 -0
  40. package/dist/utils.js.map +1 -0
  41. package/package.json +47 -0
  42. package/src/bech32.ts +187 -0
  43. package/src/bigsize.ts +97 -0
  44. package/src/fields.ts +147 -0
  45. package/src/generated.ts +697 -0
  46. package/src/index.ts +132 -0
  47. package/src/merkle.ts +163 -0
  48. package/src/offer.ts +328 -0
  49. package/src/payer_proof.ts +727 -0
  50. package/src/tlv.ts +75 -0
  51. package/src/utils.ts +49 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * BOLT12 bech32 encoding/decoding.
3
+ *
4
+ * BOLT12 uses bech32-style encoding WITHOUT a checksum:
5
+ * <hrp> "1" <bech32-data>
6
+ *
7
+ * The human-readable prefix (hrp) is one of: lno, lnr, lni, lnp.
8
+ * The data part uses the standard bech32 alphabet to encode 5-bit groups
9
+ * which are then converted to 8-bit bytes.
10
+ *
11
+ * BOLT12 also supports "+" continuation: a "+" followed by optional
12
+ * whitespace can join multiple lines.
13
+ */
14
+ export type Bolt12HRP = 'lno' | 'lnr' | 'lni' | 'lnp';
15
+ export interface Bolt12Decoded {
16
+ hrp: Bolt12HRP;
17
+ data: Uint8Array;
18
+ }
19
+ /**
20
+ * Convert 8-bit bytes to 5-bit bech32 groups.
21
+ */
22
+ export declare function bytesToBech32(data: Uint8Array): number[];
23
+ /**
24
+ * Decode a BOLT12 string into its hrp and raw TLV bytes.
25
+ */
26
+ export declare function decodeBolt12(input: string): Bolt12Decoded;
27
+ /**
28
+ * Encode raw TLV bytes into a BOLT12 bech32 string.
29
+ */
30
+ export declare function encodeBolt12(hrp: Bolt12HRP, data: Uint8Array): string;
31
+ //# sourceMappingURL=bech32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bech32.d.ts","sourceRoot":"","sources":["../src/bech32.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CAClB;AA+CD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAGxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CA0FzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAOrE"}
package/dist/bech32.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * BOLT12 bech32 encoding/decoding.
4
+ *
5
+ * BOLT12 uses bech32-style encoding WITHOUT a checksum:
6
+ * <hrp> "1" <bech32-data>
7
+ *
8
+ * The human-readable prefix (hrp) is one of: lno, lnr, lni, lnp.
9
+ * The data part uses the standard bech32 alphabet to encode 5-bit groups
10
+ * which are then converted to 8-bit bytes.
11
+ *
12
+ * BOLT12 also supports "+" continuation: a "+" followed by optional
13
+ * whitespace can join multiple lines.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.bytesToBech32 = bytesToBech32;
17
+ exports.decodeBolt12 = decodeBolt12;
18
+ exports.encodeBolt12 = encodeBolt12;
19
+ const BECH32_ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
20
+ const ALPHABET_MAP = {};
21
+ for (let i = 0; i < BECH32_ALPHABET.length; i++) {
22
+ ALPHABET_MAP[BECH32_ALPHABET[i]] = i;
23
+ }
24
+ /**
25
+ * Convert between bit groups (e.g., 5-bit to 8-bit).
26
+ * Padding bits (if any) must be zero.
27
+ */
28
+ function convertBits(data, fromBits, toBits, strict = true) {
29
+ let value = 0;
30
+ let bits = 0;
31
+ const maxV = (1 << toBits) - 1;
32
+ const result = [];
33
+ for (let i = 0; i < data.length; i++) {
34
+ value = (value << fromBits) | data[i];
35
+ bits += fromBits;
36
+ while (bits >= toBits) {
37
+ bits -= toBits;
38
+ result.push((value >> bits) & maxV);
39
+ }
40
+ }
41
+ if (strict) {
42
+ // Check that padding bits are zero
43
+ if (bits > 0) {
44
+ const pad = (value << (toBits - bits)) & maxV;
45
+ if (bits >= fromBits) {
46
+ throw new Error('Excess padding in bech32 data');
47
+ }
48
+ if (pad !== 0) {
49
+ throw new Error('Non-zero padding in bech32 data');
50
+ }
51
+ }
52
+ }
53
+ else {
54
+ if (bits > 0) {
55
+ result.push((value << (toBits - bits)) & maxV);
56
+ }
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Convert 8-bit bytes to 5-bit bech32 groups.
62
+ */
63
+ function bytesToBech32(data) {
64
+ const arr = Array.from(data);
65
+ return convertBits(arr, 8, 5, false);
66
+ }
67
+ /**
68
+ * Decode a BOLT12 string into its hrp and raw TLV bytes.
69
+ */
70
+ function decodeBolt12(input) {
71
+ if (typeof input !== 'string') {
72
+ throw new Error('Input must be a string');
73
+ }
74
+ // Handle "+" continuation: "+" optionally followed by whitespace joins parts
75
+ let str = '';
76
+ let i = 0;
77
+ while (i < input.length) {
78
+ if (input[i] === '+') {
79
+ // The character before '+' must be a valid bech32 char
80
+ if (i === 0) {
81
+ throw new Error('Invalid "+" at start');
82
+ }
83
+ const prevChar = str[str.length - 1].toLowerCase();
84
+ if (!(prevChar in ALPHABET_MAP)) {
85
+ throw new Error('Invalid character before "+"');
86
+ }
87
+ i++; // skip '+'
88
+ // skip optional whitespace (space, newline, carriage return)
89
+ while (i < input.length && (input[i] === ' ' || input[i] === '\n' || input[i] === '\r')) {
90
+ i++;
91
+ }
92
+ if (i >= input.length) {
93
+ throw new Error('Invalid "+" at end');
94
+ }
95
+ // The character after whitespace must be a valid bech32 char
96
+ const nextChar = input[i].toLowerCase();
97
+ if (!(nextChar in ALPHABET_MAP)) {
98
+ throw new Error('Invalid character after "+"');
99
+ }
100
+ continue;
101
+ }
102
+ if (input[i] === '\n' || input[i] === '\r') {
103
+ i++;
104
+ continue;
105
+ }
106
+ str += input[i];
107
+ i++;
108
+ }
109
+ if (str.indexOf(' ') !== -1) {
110
+ throw new Error('Invalid whitespace in bolt12 string');
111
+ }
112
+ // Must not be mixed case
113
+ if (str !== str.toLowerCase() && str !== str.toUpperCase()) {
114
+ throw new Error('Mixed case in bolt12 string');
115
+ }
116
+ str = str.toLowerCase();
117
+ // Must start with "ln"
118
+ if (!str.startsWith('ln')) {
119
+ throw new Error('Not a lightning payment request');
120
+ }
121
+ // Find separator "1"
122
+ const sepIdx = str.lastIndexOf('1');
123
+ if (sepIdx === -1) {
124
+ throw new Error('No separator found');
125
+ }
126
+ const hrp = str.slice(0, sepIdx);
127
+ const dataStr = str.slice(sepIdx + 1);
128
+ if (!['lno', 'lnr', 'lni', 'lnp'].includes(hrp)) {
129
+ throw new Error(`Unknown prefix: ${hrp}`);
130
+ }
131
+ if (dataStr.length === 0) {
132
+ throw new Error('Empty data section');
133
+ }
134
+ // Decode bech32 characters to 5-bit values
135
+ const words = [];
136
+ for (let j = 0; j < dataStr.length; j++) {
137
+ const c = dataStr[j];
138
+ if (!(c in ALPHABET_MAP)) {
139
+ throw new Error(`Invalid bech32 character: ${c}`);
140
+ }
141
+ words.push(ALPHABET_MAP[c]);
142
+ }
143
+ // Convert 5-bit to 8-bit
144
+ const bytes = convertBits(words, 5, 8, true);
145
+ return {
146
+ hrp: hrp,
147
+ data: new Uint8Array(bytes),
148
+ };
149
+ }
150
+ /**
151
+ * Encode raw TLV bytes into a BOLT12 bech32 string.
152
+ */
153
+ function encodeBolt12(hrp, data) {
154
+ const words = bytesToBech32(data);
155
+ let result = hrp + '1';
156
+ for (const w of words) {
157
+ result += BECH32_ALPHABET[w];
158
+ }
159
+ return result;
160
+ }
161
+ //# sourceMappingURL=bech32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bech32.js","sourceRoot":"","sources":["../src/bech32.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * BigSize encoding/decoding as defined in BOLT 1.
3
+ *
4
+ * BigSize is a variable-length unsigned integer encoding:
5
+ * 0x00-0xfc: 1 byte (value itself)
6
+ * 0xfd + u16: 3 bytes (values 0xfd-0xffff)
7
+ * 0xfe + u32: 5 bytes (values 0x10000-0xffffffff)
8
+ * 0xff + u64: 9 bytes (values 0x100000000+)
9
+ */
10
+ export interface BigSizeResult {
11
+ value: bigint;
12
+ bytesRead: number;
13
+ }
14
+ /**
15
+ * Read a BigSize value from a buffer at the given offset.
16
+ */
17
+ export declare function readBigSize(buf: Uint8Array, offset?: number): BigSizeResult;
18
+ /**
19
+ * Encode a BigSize value into bytes.
20
+ */
21
+ export declare function writeBigSize(value: bigint): Uint8Array;
22
+ //# sourceMappingURL=bigsize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigsize.d.ts","sourceRoot":"","sources":["../src/bigsize.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,GAAE,MAAU,GAAG,aAAa,CA8C9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA2BtD"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * BigSize encoding/decoding as defined in BOLT 1.
4
+ *
5
+ * BigSize is a variable-length unsigned integer encoding:
6
+ * 0x00-0xfc: 1 byte (value itself)
7
+ * 0xfd + u16: 3 bytes (values 0xfd-0xffff)
8
+ * 0xfe + u32: 5 bytes (values 0x10000-0xffffffff)
9
+ * 0xff + u64: 9 bytes (values 0x100000000+)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.readBigSize = readBigSize;
13
+ exports.writeBigSize = writeBigSize;
14
+ /**
15
+ * Read a BigSize value from a buffer at the given offset.
16
+ */
17
+ function readBigSize(buf, offset = 0) {
18
+ if (offset >= buf.length) {
19
+ throw new Error('Truncated bigsize: no data');
20
+ }
21
+ const first = buf[offset];
22
+ if (first < 0xfd) {
23
+ return { value: BigInt(first), bytesRead: 1 };
24
+ }
25
+ if (first === 0xfd) {
26
+ if (offset + 3 > buf.length) {
27
+ throw new Error('Truncated bigsize: expected 2 more bytes');
28
+ }
29
+ const val = (buf[offset + 1] << 8) | buf[offset + 2];
30
+ if (val < 0xfd) {
31
+ throw new Error('Non-minimal bigsize encoding');
32
+ }
33
+ return { value: BigInt(val), bytesRead: 3 };
34
+ }
35
+ if (first === 0xfe) {
36
+ if (offset + 5 > buf.length) {
37
+ throw new Error('Truncated bigsize: expected 4 more bytes');
38
+ }
39
+ const dv = new DataView(buf.buffer, buf.byteOffset + offset + 1, 4);
40
+ const val = dv.getUint32(0);
41
+ if (val < 0x10000) {
42
+ throw new Error('Non-minimal bigsize encoding');
43
+ }
44
+ return { value: BigInt(val), bytesRead: 5 };
45
+ }
46
+ // first === 0xff
47
+ if (offset + 9 > buf.length) {
48
+ throw new Error('Truncated bigsize: expected 8 more bytes');
49
+ }
50
+ const dv = new DataView(buf.buffer, buf.byteOffset + offset + 1, 8);
51
+ const hi = BigInt(dv.getUint32(0)) << 32n;
52
+ const lo = BigInt(dv.getUint32(4));
53
+ const val = hi | lo;
54
+ if (val < 0x100000000n) {
55
+ throw new Error('Non-minimal bigsize encoding');
56
+ }
57
+ return { value: val, bytesRead: 9 };
58
+ }
59
+ /**
60
+ * Encode a BigSize value into bytes.
61
+ */
62
+ function writeBigSize(value) {
63
+ if (value < 0xfdn) {
64
+ return new Uint8Array([Number(value)]);
65
+ }
66
+ if (value <= 0xffffn) {
67
+ const buf = new Uint8Array(3);
68
+ buf[0] = 0xfd;
69
+ buf[1] = Number((value >> 8n) & 0xffn);
70
+ buf[2] = Number(value & 0xffn);
71
+ return buf;
72
+ }
73
+ if (value <= 0xffffffffn) {
74
+ const buf = new Uint8Array(5);
75
+ buf[0] = 0xfe;
76
+ const dv = new DataView(buf.buffer, 1, 4);
77
+ dv.setUint32(0, Number(value));
78
+ return buf;
79
+ }
80
+ const buf = new Uint8Array(9);
81
+ buf[0] = 0xff;
82
+ const dv = new DataView(buf.buffer, 1, 8);
83
+ dv.setUint32(0, Number(value >> 32n));
84
+ dv.setUint32(4, Number(value & 0xffffffffn));
85
+ return buf;
86
+ }
87
+ //# sourceMappingURL=bigsize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigsize.js","sourceRoot":"","sources":["../src/bigsize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * High-level typed field extraction for BOLT12 messages.
3
+ *
4
+ * Provides a convenient API to access decoded offer fields by name
5
+ * instead of manually searching TLV records by type number.
6
+ *
7
+ * @deprecated Use the auto-generated types from `./generated.js` instead.
8
+ * The generated module provides spec-compliant field names (e.g. `offer_description`
9
+ * instead of `description`) and covers offer, invoice_request, invoice, and
10
+ * invoice_error message types. This hand-written module only covers offers.
11
+ *
12
+ * Migration:
13
+ * import { extractOfferFields, type OfferFields } from './generated.js';
14
+ */
15
+ import type { TlvRecord } from './tlv.js';
16
+ /**
17
+ * Parsed chain hash with known name.
18
+ * @deprecated Use `Uint8Array[]` from generated `OfferFields.offer_chains` instead.
19
+ */
20
+ export interface Chain {
21
+ hash: string;
22
+ name: string;
23
+ }
24
+ /**
25
+ * Typed offer fields extracted from TLV records.
26
+ * @deprecated Use `GeneratedOfferFields` from `./generated.js` instead.
27
+ */
28
+ export interface OfferFields {
29
+ /** Chain hashes this offer is valid for (default: bitcoin mainnet). */
30
+ chains?: Chain[];
31
+ /** Arbitrary metadata bytes (hex). */
32
+ metadata?: string;
33
+ /** ISO 4217 currency code if amount is not in msat. */
34
+ currency?: string;
35
+ /** Amount in msat (or currency minor units if currency is set). */
36
+ amount?: bigint;
37
+ /** Human-readable description. */
38
+ description?: string;
39
+ /** Feature bits as raw bytes (hex). */
40
+ features?: string;
41
+ /** Absolute expiry as seconds since Unix epoch. */
42
+ absolute_expiry?: bigint;
43
+ /** Whether blinded paths are present. */
44
+ has_paths: boolean;
45
+ /** Raw paths data (hex). */
46
+ paths?: string;
47
+ /** Human-readable issuer name. */
48
+ issuer?: string;
49
+ /** Maximum quantity a payer can request. */
50
+ quantity_max?: bigint;
51
+ /** Issuer's compressed public key (hex, 33 bytes). */
52
+ issuer_id?: string;
53
+ /** The raw TLV records for advanced access. */
54
+ records: TlvRecord[];
55
+ }
56
+ /**
57
+ * Extract typed fields from offer TLV records.
58
+ * @deprecated Use `extractOfferFields` from `./generated.js` instead.
59
+ */
60
+ export declare function extractOfferFields(records: TlvRecord[]): OfferFields;
61
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsB1C;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAiBD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAgDpE"}
package/dist/fields.js ADDED
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * High-level typed field extraction for BOLT12 messages.
4
+ *
5
+ * Provides a convenient API to access decoded offer fields by name
6
+ * instead of manually searching TLV records by type number.
7
+ *
8
+ * @deprecated Use the auto-generated types from `./generated.js` instead.
9
+ * The generated module provides spec-compliant field names (e.g. `offer_description`
10
+ * instead of `description`) and covers offer, invoice_request, invoice, and
11
+ * invoice_error message types. This hand-written module only covers offers.
12
+ *
13
+ * Migration:
14
+ * import { extractOfferFields, type OfferFields } from './generated.js';
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.extractOfferFields = extractOfferFields;
18
+ /** Read a truncated big-endian unsigned integer. */
19
+ function tu64(data) {
20
+ if (data.length === 0) {
21
+ return 0n;
22
+ }
23
+ let val = 0n;
24
+ for (let i = 0; i < data.length; i++) {
25
+ val = (val << 8n) | BigInt(data[i]);
26
+ }
27
+ return val;
28
+ }
29
+ function toHex(buf) {
30
+ let hex = '';
31
+ for (let i = 0; i < buf.length; i++) {
32
+ hex += ('0' + buf[i].toString(16)).slice(-2);
33
+ }
34
+ return hex;
35
+ }
36
+ const KNOWN_CHAINS = {
37
+ '6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000': 'bitcoin',
38
+ '43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000': 'testnet',
39
+ '06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f': 'regtest',
40
+ };
41
+ function parseChains(data) {
42
+ const chains = [];
43
+ for (let i = 0; i < data.length; i += 32) {
44
+ const hash = toHex(data.slice(i, i + 32));
45
+ chains.push({ hash, name: KNOWN_CHAINS[hash] || 'unknown' });
46
+ }
47
+ return chains;
48
+ }
49
+ /**
50
+ * Extract typed fields from offer TLV records.
51
+ * @deprecated Use `extractOfferFields` from `./generated.js` instead.
52
+ */
53
+ function extractOfferFields(records) {
54
+ const fields = {
55
+ has_paths: false,
56
+ records,
57
+ };
58
+ const utf8 = new TextDecoder('utf-8', { fatal: false });
59
+ for (const rec of records) {
60
+ switch (rec.type) {
61
+ case 2n:
62
+ fields.chains = parseChains(rec.value);
63
+ break;
64
+ case 4n:
65
+ fields.metadata = toHex(rec.value);
66
+ break;
67
+ case 6n:
68
+ fields.currency = utf8.decode(rec.value);
69
+ break;
70
+ case 8n:
71
+ fields.amount = tu64(rec.value);
72
+ break;
73
+ case 10n:
74
+ fields.description = utf8.decode(rec.value);
75
+ break;
76
+ case 12n:
77
+ fields.features = toHex(rec.value);
78
+ break;
79
+ case 14n:
80
+ fields.absolute_expiry = tu64(rec.value);
81
+ break;
82
+ case 16n:
83
+ fields.has_paths = true;
84
+ fields.paths = toHex(rec.value);
85
+ break;
86
+ case 18n:
87
+ fields.issuer = utf8.decode(rec.value);
88
+ break;
89
+ case 20n:
90
+ fields.quantity_max = tu64(rec.value);
91
+ break;
92
+ case 22n:
93
+ fields.issuer_id = toHex(rec.value);
94
+ break;
95
+ }
96
+ }
97
+ return fields;
98
+ }
99
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @fileoverview Auto-generated BOLT12 TLV types, constants, and field extractors.
3
+ * @generated from specs/bolt12.csv by tools/generate-ts.ts
4
+ *
5
+ * DO NOT EDIT — changes will be overwritten on next generation.
6
+ *
7
+ * Re-generate with:
8
+ * npx tsx tools/generate-ts.ts --spec specs/bolt12.csv --output js/src/generated.ts
9
+ *
10
+ * Source: lightning-rfc/12-offer-encoding.md (https://github.com/lightning/bolts)
11
+ */
12
+ import type { TlvRecord } from './tlv.js';
13
+ /** Subtype: blinded_payinfo */
14
+ export interface BlindedPayinfo {
15
+ fee_base_msat: number;
16
+ fee_proportional_millionths: number;
17
+ cltv_expiry_delta: number;
18
+ htlc_minimum_msat: bigint;
19
+ htlc_maximum_msat: bigint;
20
+ features: Uint8Array;
21
+ }
22
+ /** Subtype: fallback_address */
23
+ export interface FallbackAddress {
24
+ version: number;
25
+ address: Uint8Array;
26
+ }
27
+ export declare const OFFER_CHAINS = 2n;
28
+ export declare const OFFER_METADATA = 4n;
29
+ export declare const OFFER_CURRENCY = 6n;
30
+ export declare const OFFER_AMOUNT = 8n;
31
+ export declare const OFFER_DESCRIPTION = 10n;
32
+ export declare const OFFER_FEATURES = 12n;
33
+ export declare const OFFER_ABSOLUTE_EXPIRY = 14n;
34
+ export declare const OFFER_PATHS = 16n;
35
+ export declare const OFFER_ISSUER = 18n;
36
+ export declare const OFFER_QUANTITY_MAX = 20n;
37
+ export declare const OFFER_ISSUER_ID = 22n;
38
+ export declare const KNOWN_OFFER_TYPES: Set<bigint>;
39
+ /** Map from TLV type number to field name for offer. */
40
+ export declare const OFFER_TLV_NAMES: ReadonlyMap<bigint, string>;
41
+ /** Typed fields for a decoded offer. */
42
+ export interface OfferFields {
43
+ offer_chains?: Uint8Array[];
44
+ offer_metadata?: Uint8Array;
45
+ offer_currency?: string;
46
+ offer_amount?: bigint;
47
+ offer_description?: string;
48
+ offer_features?: Uint8Array;
49
+ offer_absolute_expiry?: bigint;
50
+ offer_paths?: Uint8Array;
51
+ offer_issuer?: string;
52
+ offer_quantity_max?: bigint;
53
+ offer_issuer_id?: Uint8Array;
54
+ /** Raw TLV records for advanced access. */
55
+ records: TlvRecord[];
56
+ }
57
+ /**
58
+ * Extract typed fields from offer TLV records.
59
+ */
60
+ export declare function extractOfferFields(records: TlvRecord[]): OfferFields;
61
+ export declare const INVREQ_METADATA = 0n;
62
+ export declare const INVREQ_CHAIN = 80n;
63
+ export declare const INVREQ_AMOUNT = 82n;
64
+ export declare const INVREQ_FEATURES = 84n;
65
+ export declare const INVREQ_QUANTITY = 86n;
66
+ export declare const INVREQ_PAYER_ID = 88n;
67
+ export declare const INVREQ_PAYER_NOTE = 89n;
68
+ export declare const INVREQ_PATHS = 90n;
69
+ export declare const INVREQ_BIP_353_NAME = 91n;
70
+ export declare const SIGNATURE = 240n;
71
+ export declare const KNOWN_INVOICE_REQUEST_TYPES: Set<bigint>;
72
+ /** Map from TLV type number to field name for invoice_request. */
73
+ export declare const INVOICE_REQUEST_TLV_NAMES: ReadonlyMap<bigint, string>;
74
+ /** Typed fields for a decoded invoice_request. */
75
+ export interface InvoiceRequestFields {
76
+ invreq_metadata?: Uint8Array;
77
+ offer_chains?: Uint8Array[];
78
+ offer_metadata?: Uint8Array;
79
+ offer_currency?: string;
80
+ offer_amount?: bigint;
81
+ offer_description?: string;
82
+ offer_features?: Uint8Array;
83
+ offer_absolute_expiry?: bigint;
84
+ offer_paths?: Uint8Array;
85
+ offer_issuer?: string;
86
+ offer_quantity_max?: bigint;
87
+ offer_issuer_id?: Uint8Array;
88
+ invreq_chain?: Uint8Array;
89
+ invreq_amount?: bigint;
90
+ invreq_features?: Uint8Array;
91
+ invreq_quantity?: bigint;
92
+ invreq_payer_id?: Uint8Array;
93
+ invreq_payer_note?: string;
94
+ invreq_paths?: Uint8Array;
95
+ invreq_bip_353_name?: {
96
+ name: Uint8Array;
97
+ domain: Uint8Array;
98
+ };
99
+ signature?: Uint8Array;
100
+ /** Raw TLV records for advanced access. */
101
+ records: TlvRecord[];
102
+ }
103
+ /**
104
+ * Extract typed fields from invoice_request TLV records.
105
+ */
106
+ export declare function extractInvoiceRequestFields(records: TlvRecord[]): InvoiceRequestFields;
107
+ export declare const INVOICE_PATHS = 160n;
108
+ export declare const INVOICE_BLINDEDPAY = 162n;
109
+ export declare const INVOICE_CREATED_AT = 164n;
110
+ export declare const INVOICE_RELATIVE_EXPIRY = 166n;
111
+ export declare const INVOICE_PAYMENT_HASH = 168n;
112
+ export declare const INVOICE_AMOUNT = 170n;
113
+ export declare const INVOICE_FALLBACKS = 172n;
114
+ export declare const INVOICE_FEATURES = 174n;
115
+ export declare const INVOICE_NODE_ID = 176n;
116
+ export declare const KNOWN_INVOICE_TYPES: Set<bigint>;
117
+ /** Map from TLV type number to field name for invoice. */
118
+ export declare const INVOICE_TLV_NAMES: ReadonlyMap<bigint, string>;
119
+ /** Typed fields for a decoded invoice. */
120
+ export interface InvoiceFields {
121
+ invreq_metadata?: Uint8Array;
122
+ offer_chains?: Uint8Array[];
123
+ offer_metadata?: Uint8Array;
124
+ offer_currency?: string;
125
+ offer_amount?: bigint;
126
+ offer_description?: string;
127
+ offer_features?: Uint8Array;
128
+ offer_absolute_expiry?: bigint;
129
+ offer_paths?: Uint8Array;
130
+ offer_issuer?: string;
131
+ offer_quantity_max?: bigint;
132
+ offer_issuer_id?: Uint8Array;
133
+ invreq_chain?: Uint8Array;
134
+ invreq_amount?: bigint;
135
+ invreq_features?: Uint8Array;
136
+ invreq_quantity?: bigint;
137
+ invreq_payer_id?: Uint8Array;
138
+ invreq_payer_note?: string;
139
+ invreq_paths?: Uint8Array;
140
+ invreq_bip_353_name?: {
141
+ name: Uint8Array;
142
+ domain: Uint8Array;
143
+ };
144
+ invoice_paths?: Uint8Array;
145
+ invoice_blindedpay?: Uint8Array;
146
+ invoice_created_at?: bigint;
147
+ invoice_relative_expiry?: bigint;
148
+ invoice_payment_hash?: Uint8Array;
149
+ invoice_amount?: bigint;
150
+ invoice_fallbacks?: Uint8Array;
151
+ invoice_features?: Uint8Array;
152
+ invoice_node_id?: Uint8Array;
153
+ signature?: Uint8Array;
154
+ /** Raw TLV records for advanced access. */
155
+ records: TlvRecord[];
156
+ }
157
+ /**
158
+ * Extract typed fields from invoice TLV records.
159
+ */
160
+ export declare function extractInvoiceFields(records: TlvRecord[]): InvoiceFields;
161
+ export declare const ERRONEOUS_FIELD = 1n;
162
+ export declare const SUGGESTED_VALUE = 3n;
163
+ export declare const ERROR = 5n;
164
+ export declare const KNOWN_INVOICE_ERROR_TYPES: Set<bigint>;
165
+ /** Map from TLV type number to field name for invoice_error. */
166
+ export declare const INVOICE_ERROR_TLV_NAMES: ReadonlyMap<bigint, string>;
167
+ /** Typed fields for a decoded invoice_error. */
168
+ export interface InvoiceErrorFields {
169
+ erroneous_field?: bigint;
170
+ suggested_value?: Uint8Array;
171
+ error?: string;
172
+ /** Raw TLV records for advanced access. */
173
+ records: TlvRecord[];
174
+ }
175
+ /**
176
+ * Extract typed fields from invoice_error TLV records.
177
+ */
178
+ export declare function extractInvoiceErrorFields(records: TlvRecord[]): InvoiceErrorFields;
179
+ //# sourceMappingURL=generated.d.ts.map