utxo-descriptors 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.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/index.cjs +1287 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +54 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +1269 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.cjs +725 -0
- package/dist/parse.cjs.map +1 -0
- package/dist/parse.d.cts +10 -0
- package/dist/parse.d.ts +10 -0
- package/dist/parse.js +723 -0
- package/dist/parse.js.map +1 -0
- package/dist/types-Dr-JC_LD.d.cts +107 -0
- package/dist/types-Dr-JC_LD.d.ts +107 -0
- package/dist/weights-9_pPEdMA.d.cts +68 -0
- package/dist/weights-B0KrRWLe.d.ts +68 -0
- package/dist/weights.cjs +490 -0
- package/dist/weights.cjs.map +1 -0
- package/dist/weights.d.cts +2 -0
- package/dist/weights.d.ts +2 -0
- package/dist/weights.js +483 -0
- package/dist/weights.js.map +1 -0
- package/package.json +67 -0
package/dist/weights.cjs
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/base58.ts
|
|
4
|
+
var ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
5
|
+
var BASE = 58n;
|
|
6
|
+
var BYTE_MAX_PLUS_ONE = 256n;
|
|
7
|
+
var CHAR_TO_VALUE = new Map(
|
|
8
|
+
ALPHABET.split("").map((char, index) => [char, BigInt(index)])
|
|
9
|
+
);
|
|
10
|
+
function base58Decode(text) {
|
|
11
|
+
if (text.length === 0) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
let value = 0n;
|
|
15
|
+
for (const char of text) {
|
|
16
|
+
const digit = CHAR_TO_VALUE.get(char);
|
|
17
|
+
if (digit === void 0) {
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
value = value * BASE + digit;
|
|
21
|
+
}
|
|
22
|
+
const bytes = [];
|
|
23
|
+
while (value > 0n) {
|
|
24
|
+
bytes.unshift(Number(value % BYTE_MAX_PLUS_ONE));
|
|
25
|
+
value /= BYTE_MAX_PLUS_ONE;
|
|
26
|
+
}
|
|
27
|
+
for (const char of text) {
|
|
28
|
+
if (char !== "1") {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
bytes.unshift(0);
|
|
32
|
+
}
|
|
33
|
+
return Uint8Array.from(bytes);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/bech32.ts
|
|
37
|
+
var CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
38
|
+
var BECH32_CONST = 1;
|
|
39
|
+
var BECH32M_CONST = 734539939;
|
|
40
|
+
var GENERATOR = [996825010, 642813549, 513874426, 1027748829, 705979059];
|
|
41
|
+
var CHECKSUM_LENGTH = 6;
|
|
42
|
+
var MIN_HRP_LENGTH = 1;
|
|
43
|
+
function polymod(values) {
|
|
44
|
+
let checksum = 1;
|
|
45
|
+
for (const value of values) {
|
|
46
|
+
const top = checksum >>> 25;
|
|
47
|
+
checksum = (checksum & 33554431) << 5 ^ value;
|
|
48
|
+
for (let bit = 0; bit < GENERATOR.length; bit += 1) {
|
|
49
|
+
const generatorValue = GENERATOR[bit];
|
|
50
|
+
if (generatorValue !== void 0 && (top >>> bit & 1) === 1) {
|
|
51
|
+
checksum ^= generatorValue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return checksum >>> 0;
|
|
56
|
+
}
|
|
57
|
+
function hrpExpand(hrp) {
|
|
58
|
+
const high = [];
|
|
59
|
+
const low = [];
|
|
60
|
+
for (const char of hrp) {
|
|
61
|
+
const code = char.codePointAt(0);
|
|
62
|
+
high.push(code >> 5);
|
|
63
|
+
low.push(code & 31);
|
|
64
|
+
}
|
|
65
|
+
return [...high, 0, ...low];
|
|
66
|
+
}
|
|
67
|
+
function convertBits(data, fromBits, toBits, pad) {
|
|
68
|
+
let accumulator = 0;
|
|
69
|
+
let bits = 0;
|
|
70
|
+
const result = [];
|
|
71
|
+
const maxValue = (1 << toBits) - 1;
|
|
72
|
+
for (const value of data) {
|
|
73
|
+
if (value < 0 || value >>> fromBits !== 0) {
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
accumulator = accumulator << fromBits | value;
|
|
77
|
+
bits += fromBits;
|
|
78
|
+
while (bits >= toBits) {
|
|
79
|
+
bits -= toBits;
|
|
80
|
+
result.push(accumulator >>> bits & maxValue);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (bits >= fromBits || (accumulator << toBits - bits & maxValue) !== 0) {
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
function bech32Decode(address) {
|
|
89
|
+
if (address !== address.toLowerCase() && address !== address.toUpperCase()) {
|
|
90
|
+
return void 0;
|
|
91
|
+
}
|
|
92
|
+
const lowered = address.toLowerCase();
|
|
93
|
+
const separatorIndex = lowered.lastIndexOf("1");
|
|
94
|
+
if (separatorIndex < MIN_HRP_LENGTH || lowered.length - separatorIndex - 1 < CHECKSUM_LENGTH) {
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
const hrp = lowered.slice(0, separatorIndex);
|
|
98
|
+
const dataPart = lowered.slice(separatorIndex + 1);
|
|
99
|
+
const values = [];
|
|
100
|
+
for (const char of dataPart) {
|
|
101
|
+
const value = CHARSET.indexOf(char);
|
|
102
|
+
if (value === -1) {
|
|
103
|
+
return void 0;
|
|
104
|
+
}
|
|
105
|
+
values.push(value);
|
|
106
|
+
}
|
|
107
|
+
const checksum = polymod([...hrpExpand(hrp), ...values]);
|
|
108
|
+
if (checksum !== BECH32_CONST && checksum !== BECH32M_CONST) {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
const words = values.slice(0, values.length - CHECKSUM_LENGTH);
|
|
112
|
+
const [witnessVersion, ...programWords] = words;
|
|
113
|
+
if (witnessVersion === void 0) {
|
|
114
|
+
return void 0;
|
|
115
|
+
}
|
|
116
|
+
const isBech32m = checksum === BECH32M_CONST;
|
|
117
|
+
if (witnessVersion === 0 === isBech32m) {
|
|
118
|
+
return void 0;
|
|
119
|
+
}
|
|
120
|
+
const program = convertBits(programWords, 5, 8);
|
|
121
|
+
if (program === void 0 || program.length < 2 || program.length > 40) {
|
|
122
|
+
return void 0;
|
|
123
|
+
}
|
|
124
|
+
return { hrp, witnessVersion, program: Uint8Array.from(program) };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/chains.ts
|
|
128
|
+
var BITCOIN = {
|
|
129
|
+
name: "bitcoin",
|
|
130
|
+
base58PubKeyHash: 0,
|
|
131
|
+
base58ScriptHash: 5
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/traverse.ts
|
|
135
|
+
function collectTapLeaves(tree, depth = 0) {
|
|
136
|
+
if (tree.kind === "leaf") {
|
|
137
|
+
return [{ key: tree.script.key, depth }];
|
|
138
|
+
}
|
|
139
|
+
return [...collectTapLeaves(tree.left, depth + 1), ...collectTapLeaves(tree.right, depth + 1)];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// src/weights.ts
|
|
143
|
+
var ECDSA_SINGLE_SIG_BYTES = 72;
|
|
144
|
+
var ECDSA_MULTISIG_SIG_BYTES = 73;
|
|
145
|
+
var SCHNORR_KEYPATH_SIG_BYTES = 64;
|
|
146
|
+
var SCHNORR_SCRIPTPATH_SIG_BYTES = 65;
|
|
147
|
+
var COMPRESSED_PUBKEY_BYTES = 33;
|
|
148
|
+
var UNCOMPRESSED_PUBKEY_BYTES = 65;
|
|
149
|
+
var XONLY_PUBKEY_BYTES = 32;
|
|
150
|
+
var P2PKH_SCRIPT_BYTES = 25;
|
|
151
|
+
var P2WPKH_SCRIPT_BYTES = 22;
|
|
152
|
+
var P2SH_SCRIPT_BYTES = 23;
|
|
153
|
+
var P2WSH_SCRIPT_BYTES = 34;
|
|
154
|
+
var P2TR_SCRIPT_BYTES = 34;
|
|
155
|
+
var BASE58_ADDRESS_BYTES = 25;
|
|
156
|
+
var LEGACY_TX_OVERHEAD_BYTES = 40;
|
|
157
|
+
var VOUT_OVERHEAD_BYTES = 8;
|
|
158
|
+
var WEIGHT_SCALE = 4;
|
|
159
|
+
var PUSHDATA_OP_MAX = 76;
|
|
160
|
+
var PUSHDATA_UINT8_MAX = 255;
|
|
161
|
+
var PUSHDATA_UINT16_MAX = 65535;
|
|
162
|
+
var COMPACT_SIZE_UINT16_MIN = 253;
|
|
163
|
+
var COMPACT_SIZE_UINT16_MAX = 65535;
|
|
164
|
+
var COMPACT_SIZE_UINT32_MAX = 4294967295;
|
|
165
|
+
function weightFail(reason, message) {
|
|
166
|
+
return { ok: false, reason, message };
|
|
167
|
+
}
|
|
168
|
+
function compactSizeBytes(value) {
|
|
169
|
+
if (value < COMPACT_SIZE_UINT16_MIN) {
|
|
170
|
+
return 1;
|
|
171
|
+
}
|
|
172
|
+
if (value <= COMPACT_SIZE_UINT16_MAX) {
|
|
173
|
+
return 3;
|
|
174
|
+
}
|
|
175
|
+
if (value <= COMPACT_SIZE_UINT32_MAX) {
|
|
176
|
+
return 5;
|
|
177
|
+
}
|
|
178
|
+
return 9;
|
|
179
|
+
}
|
|
180
|
+
function pushDataPrefixBytes(length) {
|
|
181
|
+
if (length < PUSHDATA_OP_MAX) {
|
|
182
|
+
return 1;
|
|
183
|
+
}
|
|
184
|
+
if (length <= PUSHDATA_UINT8_MAX) {
|
|
185
|
+
return 2;
|
|
186
|
+
}
|
|
187
|
+
if (length <= PUSHDATA_UINT16_MAX) {
|
|
188
|
+
return 3;
|
|
189
|
+
}
|
|
190
|
+
return 5;
|
|
191
|
+
}
|
|
192
|
+
function keyMaterialBytes(kind) {
|
|
193
|
+
switch (kind) {
|
|
194
|
+
case "hex-compressed":
|
|
195
|
+
case "wif-compressed":
|
|
196
|
+
case "xpub":
|
|
197
|
+
case "xprv":
|
|
198
|
+
return COMPRESSED_PUBKEY_BYTES;
|
|
199
|
+
case "hex-uncompressed":
|
|
200
|
+
case "wif-uncompressed":
|
|
201
|
+
return UNCOMPRESSED_PUBKEY_BYTES;
|
|
202
|
+
case "hex-xonly":
|
|
203
|
+
return XONLY_PUBKEY_BYTES;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function simpleOutputScriptBytes(node) {
|
|
207
|
+
switch (node.kind) {
|
|
208
|
+
case "pk":
|
|
209
|
+
return keyMaterialBytes(node.key.kind) + 2;
|
|
210
|
+
case "pkh":
|
|
211
|
+
return P2PKH_SCRIPT_BYTES;
|
|
212
|
+
case "wpkh":
|
|
213
|
+
return P2WPKH_SCRIPT_BYTES;
|
|
214
|
+
case "sh":
|
|
215
|
+
return P2SH_SCRIPT_BYTES;
|
|
216
|
+
case "wsh":
|
|
217
|
+
return P2WSH_SCRIPT_BYTES;
|
|
218
|
+
case "tr":
|
|
219
|
+
return P2TR_SCRIPT_BYTES;
|
|
220
|
+
case "multi": {
|
|
221
|
+
const perKey = node.keys.reduce((sum, key) => {
|
|
222
|
+
const bytes = keyMaterialBytes(key.kind);
|
|
223
|
+
return sum + pushDataPrefixBytes(bytes) + bytes;
|
|
224
|
+
}, 0);
|
|
225
|
+
return 1 + perKey + 2;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function leafInputCost(node) {
|
|
230
|
+
switch (node.kind) {
|
|
231
|
+
case "pk": {
|
|
232
|
+
const scriptSig = pushDataPrefixBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES;
|
|
233
|
+
return { scriptSig, witness: 0 };
|
|
234
|
+
}
|
|
235
|
+
case "pkh": {
|
|
236
|
+
const keyBytes = keyMaterialBytes(node.key.kind);
|
|
237
|
+
const scriptSig = pushDataPrefixBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES + pushDataPrefixBytes(keyBytes) + keyBytes;
|
|
238
|
+
return { scriptSig, witness: 0 };
|
|
239
|
+
}
|
|
240
|
+
case "wpkh": {
|
|
241
|
+
const keyBytes = keyMaterialBytes(node.key.kind);
|
|
242
|
+
const items = 2;
|
|
243
|
+
const witness = compactSizeBytes(items) + compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES + compactSizeBytes(keyBytes) + keyBytes;
|
|
244
|
+
return { scriptSig: 0, witness };
|
|
245
|
+
}
|
|
246
|
+
case "multi": {
|
|
247
|
+
const sigCost = pushDataPrefixBytes(ECDSA_MULTISIG_SIG_BYTES) + ECDSA_MULTISIG_SIG_BYTES;
|
|
248
|
+
return { scriptSig: 1 + node.threshold * sigCost, witness: 0 };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function segwitWitnessBytes(node) {
|
|
253
|
+
switch (node.kind) {
|
|
254
|
+
case "pk": {
|
|
255
|
+
const scriptBytes = simpleOutputScriptBytes(node);
|
|
256
|
+
const items = 2;
|
|
257
|
+
return compactSizeBytes(items) + compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES + compactSizeBytes(scriptBytes) + scriptBytes;
|
|
258
|
+
}
|
|
259
|
+
case "pkh": {
|
|
260
|
+
const keyBytes = keyMaterialBytes(node.key.kind);
|
|
261
|
+
const items = 3;
|
|
262
|
+
return compactSizeBytes(items) + compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES + compactSizeBytes(keyBytes) + keyBytes + compactSizeBytes(P2PKH_SCRIPT_BYTES) + P2PKH_SCRIPT_BYTES;
|
|
263
|
+
}
|
|
264
|
+
case "multi": {
|
|
265
|
+
const scriptBytes = simpleOutputScriptBytes(node);
|
|
266
|
+
const sigCost = compactSizeBytes(ECDSA_MULTISIG_SIG_BYTES) + ECDSA_MULTISIG_SIG_BYTES;
|
|
267
|
+
const items = node.threshold + 2;
|
|
268
|
+
return compactSizeBytes(items) + compactSizeBytes(0) + node.threshold * sigCost + compactSizeBytes(scriptBytes) + scriptBytes;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function computeTrCost(node) {
|
|
273
|
+
const keyPathWitness = compactSizeBytes(1) + compactSizeBytes(SCHNORR_KEYPATH_SIG_BYTES) + SCHNORR_KEYPATH_SIG_BYTES;
|
|
274
|
+
if (node.tree === void 0) {
|
|
275
|
+
return { scriptSig: 0, witness: keyPathWitness };
|
|
276
|
+
}
|
|
277
|
+
const leafWitnesses = collectTapLeaves(node.tree).map(({ depth }) => {
|
|
278
|
+
const leafScriptBytes = 1 + XONLY_PUBKEY_BYTES + 1;
|
|
279
|
+
const controlBlockBytes = 1 + XONLY_PUBKEY_BYTES + XONLY_PUBKEY_BYTES * depth;
|
|
280
|
+
const items = 3;
|
|
281
|
+
return compactSizeBytes(items) + compactSizeBytes(SCHNORR_SCRIPTPATH_SIG_BYTES) + SCHNORR_SCRIPTPATH_SIG_BYTES + compactSizeBytes(leafScriptBytes) + leafScriptBytes + compactSizeBytes(controlBlockBytes) + controlBlockBytes;
|
|
282
|
+
});
|
|
283
|
+
return { scriptSig: 0, witness: Math.max(keyPathWitness, ...leafWitnesses) };
|
|
284
|
+
}
|
|
285
|
+
function computeInputCost(node) {
|
|
286
|
+
switch (node.kind) {
|
|
287
|
+
case "pk":
|
|
288
|
+
case "pkh":
|
|
289
|
+
case "wpkh":
|
|
290
|
+
case "multi":
|
|
291
|
+
return { ok: true, ...leafInputCost(node) };
|
|
292
|
+
case "sh": {
|
|
293
|
+
const { inner } = node;
|
|
294
|
+
if (inner.kind === "wpkh") {
|
|
295
|
+
const redeemBytes = simpleOutputScriptBytes(inner);
|
|
296
|
+
return {
|
|
297
|
+
ok: true,
|
|
298
|
+
scriptSig: pushDataPrefixBytes(redeemBytes) + redeemBytes,
|
|
299
|
+
witness: leafInputCost(inner).witness
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
if (inner.kind === "wsh") {
|
|
303
|
+
const { inner: innerInner } = inner;
|
|
304
|
+
if (innerInner.kind !== "pk" && innerInner.kind !== "pkh" && innerInner.kind !== "multi") {
|
|
305
|
+
return weightFail(
|
|
306
|
+
"unsupported",
|
|
307
|
+
`sh(wsh(${innerInner.kind}(...))) is not a supported nesting`
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
const redeemBytes = P2WSH_SCRIPT_BYTES;
|
|
311
|
+
return {
|
|
312
|
+
ok: true,
|
|
313
|
+
scriptSig: pushDataPrefixBytes(redeemBytes) + redeemBytes,
|
|
314
|
+
witness: segwitWitnessBytes(innerInner)
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
if (inner.kind === "pk" || inner.kind === "pkh" || inner.kind === "multi") {
|
|
318
|
+
const redeemBytes = simpleOutputScriptBytes(inner);
|
|
319
|
+
return {
|
|
320
|
+
ok: true,
|
|
321
|
+
scriptSig: leafInputCost(inner).scriptSig + pushDataPrefixBytes(redeemBytes) + redeemBytes,
|
|
322
|
+
witness: 0
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return weightFail("unsupported", `sh(${inner.kind}(...)) is not a supported nesting`);
|
|
326
|
+
}
|
|
327
|
+
case "wsh": {
|
|
328
|
+
const { inner } = node;
|
|
329
|
+
if (inner.kind === "pk" || inner.kind === "pkh" || inner.kind === "multi") {
|
|
330
|
+
return { ok: true, scriptSig: 0, witness: segwitWitnessBytes(inner) };
|
|
331
|
+
}
|
|
332
|
+
return weightFail("unsupported", `wsh(${inner.kind}(...)) is not a supported nesting`);
|
|
333
|
+
}
|
|
334
|
+
case "tr":
|
|
335
|
+
return { ok: true, ...computeTrCost(node) };
|
|
336
|
+
case "combo":
|
|
337
|
+
return weightFail(
|
|
338
|
+
"ambiguous-script-type",
|
|
339
|
+
"combo() represents multiple candidate script types; describe the specific script you intend to spend instead"
|
|
340
|
+
);
|
|
341
|
+
case "raw":
|
|
342
|
+
return weightFail(
|
|
343
|
+
"opaque-script",
|
|
344
|
+
"raw() has no known spending script, so its input weight cannot be determined"
|
|
345
|
+
);
|
|
346
|
+
case "addr":
|
|
347
|
+
return weightFail(
|
|
348
|
+
"opaque-script",
|
|
349
|
+
"addr() has no known spending script, so its input weight cannot be determined"
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function decodeAddressScriptBytes(address, chain) {
|
|
354
|
+
const segwit = bech32Decode(address);
|
|
355
|
+
if (segwit !== void 0) {
|
|
356
|
+
return { ok: true, value: 2 + segwit.program.length };
|
|
357
|
+
}
|
|
358
|
+
const decoded = base58Decode(address);
|
|
359
|
+
if (decoded?.length === BASE58_ADDRESS_BYTES) {
|
|
360
|
+
const version = decoded[0];
|
|
361
|
+
if (version === chain.base58PubKeyHash) {
|
|
362
|
+
return { ok: true, value: P2PKH_SCRIPT_BYTES };
|
|
363
|
+
}
|
|
364
|
+
if (version === chain.base58ScriptHash) {
|
|
365
|
+
return { ok: true, value: P2SH_SCRIPT_BYTES };
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return weightFail("unsupported", `unrecognized address for chain '${chain.name}': ${address}`);
|
|
369
|
+
}
|
|
370
|
+
function computeOutputScriptBytes(node, options) {
|
|
371
|
+
switch (node.kind) {
|
|
372
|
+
case "pk":
|
|
373
|
+
case "pkh":
|
|
374
|
+
case "wpkh":
|
|
375
|
+
case "sh":
|
|
376
|
+
case "wsh":
|
|
377
|
+
case "tr":
|
|
378
|
+
case "multi":
|
|
379
|
+
return { ok: true, value: simpleOutputScriptBytes(node) };
|
|
380
|
+
case "combo":
|
|
381
|
+
return weightFail(
|
|
382
|
+
"ambiguous-script-type",
|
|
383
|
+
"combo() represents multiple candidate scriptPubKeys; describe the specific script you intend to create instead"
|
|
384
|
+
);
|
|
385
|
+
case "raw":
|
|
386
|
+
if (node.hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(node.hex)) {
|
|
387
|
+
return weightFail("unsupported", "raw() requires an even-length hex string");
|
|
388
|
+
}
|
|
389
|
+
return { ok: true, value: node.hex.length / 2 };
|
|
390
|
+
case "addr":
|
|
391
|
+
return decodeAddressScriptBytes(node.address, options.chain ?? BITCOIN);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function inputWeight(node) {
|
|
395
|
+
const cost = computeInputCost(node);
|
|
396
|
+
if (!cost.ok) {
|
|
397
|
+
return cost;
|
|
398
|
+
}
|
|
399
|
+
const baseBytes = LEGACY_TX_OVERHEAD_BYTES + compactSizeBytes(cost.scriptSig) + cost.scriptSig;
|
|
400
|
+
return { ok: true, weight: baseBytes * WEIGHT_SCALE + cost.witness };
|
|
401
|
+
}
|
|
402
|
+
function outputWeight(node, options = {}) {
|
|
403
|
+
const scriptBytesResult = computeOutputScriptBytes(node, options);
|
|
404
|
+
if (!scriptBytesResult.ok) {
|
|
405
|
+
return scriptBytesResult;
|
|
406
|
+
}
|
|
407
|
+
const weight = (VOUT_OVERHEAD_BYTES + compactSizeBytes(scriptBytesResult.value) + scriptBytesResult.value) * WEIGHT_SCALE;
|
|
408
|
+
return { ok: true, weight };
|
|
409
|
+
}
|
|
410
|
+
function describeInput(node) {
|
|
411
|
+
const cost = computeInputCost(node);
|
|
412
|
+
if (!cost.ok) {
|
|
413
|
+
return cost;
|
|
414
|
+
}
|
|
415
|
+
if (node.kind === "pk") {
|
|
416
|
+
return { ok: true, description: "p2pk" };
|
|
417
|
+
}
|
|
418
|
+
if (node.kind === "pkh") {
|
|
419
|
+
return { ok: true, description: "p2pkh" };
|
|
420
|
+
}
|
|
421
|
+
if (node.kind === "wpkh") {
|
|
422
|
+
return { ok: true, description: "p2wpkh" };
|
|
423
|
+
}
|
|
424
|
+
if (node.kind === "tr" && node.tree === void 0) {
|
|
425
|
+
return { ok: true, description: "p2tr" };
|
|
426
|
+
}
|
|
427
|
+
if (node.kind === "sh" && node.inner.kind === "wpkh") {
|
|
428
|
+
return { ok: true, description: "p2sh-p2wpkh" };
|
|
429
|
+
}
|
|
430
|
+
if (node.kind === "sh" && node.inner.kind === "multi") {
|
|
431
|
+
return {
|
|
432
|
+
ok: true,
|
|
433
|
+
description: { type: "p2sh-multisig", m: node.inner.threshold, n: node.inner.keys.length }
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
if (node.kind === "wsh" && node.inner.kind === "multi") {
|
|
437
|
+
return {
|
|
438
|
+
ok: true,
|
|
439
|
+
description: { type: "p2wsh-multisig", m: node.inner.threshold, n: node.inner.keys.length }
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
if (node.kind === "sh" && node.inner.kind === "wsh" && node.inner.inner.kind === "multi") {
|
|
443
|
+
return {
|
|
444
|
+
ok: true,
|
|
445
|
+
description: {
|
|
446
|
+
type: "p2sh-p2wsh-multisig",
|
|
447
|
+
m: node.inner.inner.threshold,
|
|
448
|
+
n: node.inner.inner.keys.length
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
ok: true,
|
|
454
|
+
description: { type: "raw", scriptSigBytes: cost.scriptSig, witnessBytes: cost.witness }
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
function describeOutput(node, options = {}) {
|
|
458
|
+
const scriptBytesResult = computeOutputScriptBytes(node, options);
|
|
459
|
+
if (!scriptBytesResult.ok) {
|
|
460
|
+
return scriptBytesResult;
|
|
461
|
+
}
|
|
462
|
+
const resolvedNode = node;
|
|
463
|
+
switch (resolvedNode.kind) {
|
|
464
|
+
case "pk":
|
|
465
|
+
return { ok: true, description: "p2pk" };
|
|
466
|
+
case "pkh":
|
|
467
|
+
return { ok: true, description: "p2pkh" };
|
|
468
|
+
case "wpkh":
|
|
469
|
+
return { ok: true, description: "p2wpkh" };
|
|
470
|
+
case "sh":
|
|
471
|
+
return { ok: true, description: "p2sh" };
|
|
472
|
+
case "wsh":
|
|
473
|
+
return { ok: true, description: "p2wsh" };
|
|
474
|
+
case "tr":
|
|
475
|
+
return { ok: true, description: "p2tr" };
|
|
476
|
+
case "multi":
|
|
477
|
+
case "raw":
|
|
478
|
+
case "addr":
|
|
479
|
+
return { ok: true, description: { type: "raw", scriptPubKeyBytes: scriptBytesResult.value } };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
exports.compactSizeBytes = compactSizeBytes;
|
|
484
|
+
exports.describeInput = describeInput;
|
|
485
|
+
exports.describeOutput = describeOutput;
|
|
486
|
+
exports.inputWeight = inputWeight;
|
|
487
|
+
exports.outputWeight = outputWeight;
|
|
488
|
+
exports.pushDataPrefixBytes = pushDataPrefixBytes;
|
|
489
|
+
//# sourceMappingURL=weights.cjs.map
|
|
490
|
+
//# sourceMappingURL=weights.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/base58.ts","../src/bech32.ts","../src/chains.ts","../src/traverse.ts","../src/weights.ts"],"names":[],"mappings":"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","file":"weights.cjs","sourcesContent":["const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\nconst BASE = 58n;\nconst BYTE_MAX_PLUS_ONE = 256n;\nconst CHAR_TO_VALUE = new Map<string, bigint>(\n ALPHABET.split(\"\").map((char, index) => [char, BigInt(index)]),\n);\n\n/**\n * Decodes base58 text into raw bytes without verifying (or removing) any\n * trailing checksum. This package never needs SHA256, so callers that need\n * checksum verification must bring their own; see the README for the exact\n * limitation this implies for `addr()` base58 addresses.\n */\nexport function base58Decode(text: string): Uint8Array | undefined {\n if (text.length === 0) {\n return undefined;\n }\n\n let value = 0n;\n\n for (const char of text) {\n const digit = CHAR_TO_VALUE.get(char);\n\n if (digit === undefined) {\n return undefined;\n }\n\n value = value * BASE + digit;\n }\n\n const bytes: number[] = [];\n\n while (value > 0n) {\n bytes.unshift(Number(value % BYTE_MAX_PLUS_ONE));\n value /= BYTE_MAX_PLUS_ONE;\n }\n\n for (const char of text) {\n if (char !== \"1\") {\n break;\n }\n\n bytes.unshift(0);\n }\n\n return Uint8Array.from(bytes);\n}\n","const CHARSET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\nconst BECH32_CONST = 1;\nconst BECH32M_CONST = 0x2bc830a3;\nconst GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nconst CHECKSUM_LENGTH = 6;\nconst MIN_HRP_LENGTH = 1;\n\nfunction polymod(values: readonly number[]): number {\n let checksum = 1;\n\n for (const value of values) {\n const top = checksum >>> 25;\n\n checksum = ((checksum & 0x1ffffff) << 5) ^ value;\n\n for (let bit = 0; bit < GENERATOR.length; bit += 1) {\n const generatorValue = GENERATOR[bit];\n\n if (generatorValue !== undefined && ((top >>> bit) & 1) === 1) {\n checksum ^= generatorValue;\n }\n }\n }\n\n return checksum >>> 0;\n}\n\nfunction hrpExpand(hrp: string): number[] {\n const high: number[] = [];\n const low: number[] = [];\n\n for (const char of hrp) {\n // Safe by construction: `char` comes from iterating a string, so it is\n // always a non-empty code point.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const code = char.codePointAt(0)!;\n\n high.push(code >> 5);\n low.push(code & 31);\n }\n\n return [...high, 0, ...low];\n}\n\n/** Exported for direct unit testing of its boundaries; not part of the public barrel. */\nexport function convertBits(\n data: readonly number[],\n fromBits: number,\n toBits: number,\n pad: boolean,\n): number[] | undefined {\n let accumulator = 0;\n let bits = 0;\n\n const result: number[] = [];\n const maxValue = (1 << toBits) - 1;\n\n for (const value of data) {\n if (value < 0 || value >>> fromBits !== 0) {\n return undefined;\n }\n\n accumulator = (accumulator << fromBits) | value;\n bits += fromBits;\n\n while (bits >= toBits) {\n bits -= toBits;\n result.push((accumulator >>> bits) & maxValue);\n }\n }\n\n if (pad) {\n if (bits > 0) {\n result.push((accumulator << (toBits - bits)) & maxValue);\n }\n } else if (bits >= fromBits || ((accumulator << (toBits - bits)) & maxValue) !== 0) {\n return undefined;\n }\n\n return result;\n}\n\nexport interface DecodedSegwitAddress {\n readonly hrp: string;\n readonly witnessVersion: number;\n readonly program: Uint8Array;\n}\n\nexport function bech32Decode(address: string): DecodedSegwitAddress | undefined {\n if (address !== address.toLowerCase() && address !== address.toUpperCase()) {\n return undefined;\n }\n\n const lowered = address.toLowerCase();\n const separatorIndex = lowered.lastIndexOf(\"1\");\n\n if (separatorIndex < MIN_HRP_LENGTH || lowered.length - separatorIndex - 1 < CHECKSUM_LENGTH) {\n return undefined;\n }\n\n const hrp = lowered.slice(0, separatorIndex);\n const dataPart = lowered.slice(separatorIndex + 1);\n const values: number[] = [];\n\n for (const char of dataPart) {\n const value = CHARSET.indexOf(char);\n\n if (value === -1) {\n return undefined;\n }\n\n values.push(value);\n }\n\n const checksum = polymod([...hrpExpand(hrp), ...values]);\n\n if (checksum !== BECH32_CONST && checksum !== BECH32M_CONST) {\n return undefined;\n }\n\n const words = values.slice(0, values.length - CHECKSUM_LENGTH);\n const [witnessVersion, ...programWords] = words;\n\n if (witnessVersion === undefined) {\n return undefined;\n }\n\n const isBech32m = checksum === BECH32M_CONST;\n\n if ((witnessVersion === 0) === isBech32m) {\n return undefined;\n }\n\n const program = convertBits(programWords, 5, 8, false);\n\n if (program === undefined || program.length < 2 || program.length > 40) {\n return undefined;\n }\n\n return { hrp, witnessVersion, program: Uint8Array.from(program) };\n}\n","/**\n * Chain parameters as data, not code. `addr()` output weight only needs the\n * base58 version bytes (bech32 addresses carry no chain-specific information\n * relevant to weight). Add a chain by constructing a new `ChainParams`\n * object; nothing else in this package needs to change.\n */\nexport interface ChainParams {\n readonly name: string;\n readonly bech32Hrp: string;\n readonly base58PubKeyHash: number;\n readonly base58ScriptHash: number;\n}\n\nexport const BITCOIN: ChainParams = {\n name: \"bitcoin\",\n bech32Hrp: \"bc\",\n base58PubKeyHash: 0x00,\n base58ScriptHash: 0x05,\n};\n\nexport const BITCOIN_TESTNET: ChainParams = {\n name: \"bitcoin-testnet\",\n bech32Hrp: \"tb\",\n base58PubKeyHash: 0x6f,\n base58ScriptHash: 0xc4,\n};\n\nexport const LITECOIN: ChainParams = {\n name: \"litecoin\",\n bech32Hrp: \"ltc\",\n base58PubKeyHash: 0x30,\n base58ScriptHash: 0x32,\n};\n\nexport const LITECOIN_TESTNET: ChainParams = {\n name: \"litecoin-testnet\",\n bech32Hrp: \"tltc\",\n base58PubKeyHash: 0x6f,\n base58ScriptHash: 0x3a,\n};\n","import type { KeyExpression, ScriptNode, TapTree } from \"./types\";\n\nexport function forEachKey(node: ScriptNode, visit: (key: KeyExpression) => void): void {\n switch (node.kind) {\n case \"pk\":\n case \"pkh\":\n case \"wpkh\":\n case \"combo\":\n visit(node.key);\n\n break;\n case \"sh\":\n case \"wsh\":\n forEachKey(node.inner, visit);\n\n break;\n case \"multi\":\n node.keys.forEach(visit);\n\n break;\n case \"raw\":\n case \"addr\":\n break;\n case \"tr\":\n visit(node.internalKey);\n\n if (node.tree !== undefined) {\n forEachKeyInTree(node.tree, visit);\n }\n\n break;\n }\n}\n\nfunction forEachKeyInTree(tree: TapTree, visit: (key: KeyExpression) => void): void {\n if (tree.kind === \"leaf\") {\n visit(tree.script.key);\n\n return;\n }\n\n forEachKeyInTree(tree.left, visit);\n forEachKeyInTree(tree.right, visit);\n}\n\nexport function anyKeyRanged(node: ScriptNode): boolean {\n let ranged = false;\n\n forEachKey(node, (key) => {\n if (key.isRanged) {\n ranged = true;\n }\n });\n\n return ranged;\n}\n\nexport interface TapLeafWithDepth {\n readonly key: KeyExpression;\n readonly depth: number;\n}\n\n/** Depth is the number of sibling hashes needed in the control block. */\nexport function collectTapLeaves(tree: TapTree, depth = 0): TapLeafWithDepth[] {\n if (tree.kind === \"leaf\") {\n return [{ key: tree.script.key, depth }];\n }\n\n return [...collectTapLeaves(tree.left, depth + 1), ...collectTapLeaves(tree.right, depth + 1)];\n}\n","import { base58Decode } from \"./base58\";\nimport { bech32Decode } from \"./bech32\";\nimport type { ChainParams } from \"./chains\";\nimport { BITCOIN } from \"./chains\";\nimport { collectTapLeaves } from \"./traverse\";\nimport type {\n KeyMaterialKind,\n ScriptNode,\n WeightFailure,\n WeightFailureReason,\n WeightResult,\n} from \"./types\";\n\n/** Conservative single-key ECDSA signature bytes, matching utxo-coinselect's p2pk/p2pkh/p2wpkh constants. */\nconst ECDSA_SINGLE_SIG_BYTES = 72;\n/** Conservative multisig ECDSA signature bytes, matching utxo-coinselect's MultisigWeight default. */\nconst ECDSA_MULTISIG_SIG_BYTES = 73;\n/** Schnorr signature bytes for a Taproot key-path spend under SIGHASH_DEFAULT (no trailing sighash byte). */\nconst SCHNORR_KEYPATH_SIG_BYTES = 64;\n/** Schnorr signature bytes assumed for a Taproot script-path spend, matching utxo-coinselect's P2TR_SCRIPT default. */\nconst SCHNORR_SCRIPTPATH_SIG_BYTES = 65;\nconst COMPRESSED_PUBKEY_BYTES = 33;\nconst UNCOMPRESSED_PUBKEY_BYTES = 65;\nconst XONLY_PUBKEY_BYTES = 32;\nconst P2PKH_SCRIPT_BYTES = 25;\nconst P2WPKH_SCRIPT_BYTES = 22;\nconst P2SH_SCRIPT_BYTES = 23;\nconst P2WSH_SCRIPT_BYTES = 34;\nconst P2TR_SCRIPT_BYTES = 34;\nconst BASE58_ADDRESS_BYTES = 25;\nconst LEGACY_TX_OVERHEAD_BYTES = 40;\nconst VOUT_OVERHEAD_BYTES = 8;\nconst WEIGHT_SCALE = 4;\nconst PUSHDATA_OP_MAX = 0x4c;\nconst PUSHDATA_UINT8_MAX = 0xff;\nconst PUSHDATA_UINT16_MAX = 0xffff;\nconst COMPACT_SIZE_UINT16_MIN = 253;\nconst COMPACT_SIZE_UINT16_MAX = 0xffff;\nconst COMPACT_SIZE_UINT32_MAX = 0xffff_ffff;\n\nfunction weightFail(reason: WeightFailureReason, message: string): WeightFailure {\n return { ok: false, reason, message };\n}\n\n/** Exported for direct unit testing of its boundaries; not part of the public barrel. */\nexport function compactSizeBytes(value: number): number {\n if (value < COMPACT_SIZE_UINT16_MIN) {\n return 1;\n }\n\n if (value <= COMPACT_SIZE_UINT16_MAX) {\n return 3;\n }\n\n if (value <= COMPACT_SIZE_UINT32_MAX) {\n return 5;\n }\n\n return 9;\n}\n\n/** Exported for direct unit testing of its boundaries; not part of the public barrel. */\nexport function pushDataPrefixBytes(length: number): number {\n if (length < PUSHDATA_OP_MAX) {\n return 1;\n }\n\n if (length <= PUSHDATA_UINT8_MAX) {\n return 2;\n }\n\n if (length <= PUSHDATA_UINT16_MAX) {\n return 3;\n }\n\n return 5;\n}\n\nfunction keyMaterialBytes(kind: KeyMaterialKind): number {\n switch (kind) {\n case \"hex-compressed\":\n case \"wif-compressed\":\n case \"xpub\":\n case \"xprv\":\n return COMPRESSED_PUBKEY_BYTES;\n case \"hex-uncompressed\":\n case \"wif-uncompressed\":\n return UNCOMPRESSED_PUBKEY_BYTES;\n case \"hex-xonly\":\n return XONLY_PUBKEY_BYTES;\n }\n}\n\ntype SimpleOutputNode = Extract<\n ScriptNode,\n { readonly kind: \"pk\" | \"pkh\" | \"wpkh\" | \"sh\" | \"wsh\" | \"tr\" | \"multi\" }\n>;\n\n/** Byte length of the scriptPubKey these fragments would produce if used directly as an output. */\nfunction simpleOutputScriptBytes(node: SimpleOutputNode): number {\n switch (node.kind) {\n case \"pk\":\n return keyMaterialBytes(node.key.kind) + 2;\n case \"pkh\":\n return P2PKH_SCRIPT_BYTES;\n case \"wpkh\":\n return P2WPKH_SCRIPT_BYTES;\n case \"sh\":\n return P2SH_SCRIPT_BYTES;\n case \"wsh\":\n return P2WSH_SCRIPT_BYTES;\n case \"tr\":\n return P2TR_SCRIPT_BYTES;\n case \"multi\": {\n const perKey = node.keys.reduce((sum, key) => {\n const bytes = keyMaterialBytes(key.kind);\n\n return sum + pushDataPrefixBytes(bytes) + bytes;\n }, 0);\n\n return 1 + perKey + 2;\n }\n }\n}\n\ninterface Cost {\n readonly scriptSig: number;\n readonly witness: number;\n}\n\ntype LeafInputNode = Extract<ScriptNode, { readonly kind: \"pk\" | \"pkh\" | \"wpkh\" | \"multi\" }>;\n\nfunction leafInputCost(node: LeafInputNode): Cost {\n switch (node.kind) {\n case \"pk\": {\n const scriptSig = pushDataPrefixBytes(ECDSA_SINGLE_SIG_BYTES) + ECDSA_SINGLE_SIG_BYTES;\n\n return { scriptSig, witness: 0 };\n }\n\n case \"pkh\": {\n const keyBytes = keyMaterialBytes(node.key.kind);\n const scriptSig =\n pushDataPrefixBytes(ECDSA_SINGLE_SIG_BYTES) +\n ECDSA_SINGLE_SIG_BYTES +\n pushDataPrefixBytes(keyBytes) +\n keyBytes;\n\n return { scriptSig, witness: 0 };\n }\n\n case \"wpkh\": {\n const keyBytes = keyMaterialBytes(node.key.kind);\n const items = 2;\n const witness =\n compactSizeBytes(items) +\n compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) +\n ECDSA_SINGLE_SIG_BYTES +\n compactSizeBytes(keyBytes) +\n keyBytes;\n\n return { scriptSig: 0, witness };\n }\n\n case \"multi\": {\n const sigCost = pushDataPrefixBytes(ECDSA_MULTISIG_SIG_BYTES) + ECDSA_MULTISIG_SIG_BYTES;\n\n return { scriptSig: 1 + node.threshold * sigCost, witness: 0 };\n }\n }\n}\n\ntype WitnessScriptNode = Extract<ScriptNode, { readonly kind: \"pk\" | \"pkh\" | \"multi\" }>;\n\n/** Complete P2WSH witness bytes (item count, satisfaction items, and the witness script itself). */\nfunction segwitWitnessBytes(node: WitnessScriptNode): number {\n switch (node.kind) {\n case \"pk\": {\n const scriptBytes = simpleOutputScriptBytes(node);\n const items = 2;\n\n return (\n compactSizeBytes(items) +\n compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) +\n ECDSA_SINGLE_SIG_BYTES +\n compactSizeBytes(scriptBytes) +\n scriptBytes\n );\n }\n\n case \"pkh\": {\n const keyBytes = keyMaterialBytes(node.key.kind);\n const items = 3;\n\n return (\n compactSizeBytes(items) +\n compactSizeBytes(ECDSA_SINGLE_SIG_BYTES) +\n ECDSA_SINGLE_SIG_BYTES +\n compactSizeBytes(keyBytes) +\n keyBytes +\n compactSizeBytes(P2PKH_SCRIPT_BYTES) +\n P2PKH_SCRIPT_BYTES\n );\n }\n\n case \"multi\": {\n const scriptBytes = simpleOutputScriptBytes(node);\n const sigCost = compactSizeBytes(ECDSA_MULTISIG_SIG_BYTES) + ECDSA_MULTISIG_SIG_BYTES;\n const items = node.threshold + 2;\n\n return (\n compactSizeBytes(items) +\n compactSizeBytes(0) +\n node.threshold * sigCost +\n compactSizeBytes(scriptBytes) +\n scriptBytes\n );\n }\n }\n}\n\nfunction computeTrCost(node: Extract<ScriptNode, { readonly kind: \"tr\" }>): Cost {\n const keyPathWitness =\n compactSizeBytes(1) + compactSizeBytes(SCHNORR_KEYPATH_SIG_BYTES) + SCHNORR_KEYPATH_SIG_BYTES;\n\n if (node.tree === undefined) {\n return { scriptSig: 0, witness: keyPathWitness };\n }\n\n const leafWitnesses = collectTapLeaves(node.tree).map(({ depth }) => {\n const leafScriptBytes = 1 + XONLY_PUBKEY_BYTES + 1;\n const controlBlockBytes = 1 + XONLY_PUBKEY_BYTES + XONLY_PUBKEY_BYTES * depth;\n const items = 3;\n\n return (\n compactSizeBytes(items) +\n compactSizeBytes(SCHNORR_SCRIPTPATH_SIG_BYTES) +\n SCHNORR_SCRIPTPATH_SIG_BYTES +\n compactSizeBytes(leafScriptBytes) +\n leafScriptBytes +\n compactSizeBytes(controlBlockBytes) +\n controlBlockBytes\n );\n });\n\n return { scriptSig: 0, witness: Math.max(keyPathWitness, ...leafWitnesses) };\n}\n\ntype CostResult = ({ readonly ok: true } & Cost) | WeightFailure;\n\nfunction computeInputCost(node: ScriptNode): CostResult {\n switch (node.kind) {\n case \"pk\":\n case \"pkh\":\n case \"wpkh\":\n case \"multi\":\n return { ok: true, ...leafInputCost(node) };\n case \"sh\": {\n const { inner } = node;\n\n if (inner.kind === \"wpkh\") {\n const redeemBytes = simpleOutputScriptBytes(inner);\n\n return {\n ok: true,\n scriptSig: pushDataPrefixBytes(redeemBytes) + redeemBytes,\n witness: leafInputCost(inner).witness,\n };\n }\n\n if (inner.kind === \"wsh\") {\n const { inner: innerInner } = inner;\n\n if (innerInner.kind !== \"pk\" && innerInner.kind !== \"pkh\" && innerInner.kind !== \"multi\") {\n return weightFail(\n \"unsupported\",\n `sh(wsh(${innerInner.kind}(...))) is not a supported nesting`,\n );\n }\n\n const redeemBytes = P2WSH_SCRIPT_BYTES;\n\n return {\n ok: true,\n scriptSig: pushDataPrefixBytes(redeemBytes) + redeemBytes,\n witness: segwitWitnessBytes(innerInner),\n };\n }\n\n if (inner.kind === \"pk\" || inner.kind === \"pkh\" || inner.kind === \"multi\") {\n const redeemBytes = simpleOutputScriptBytes(inner);\n\n return {\n ok: true,\n scriptSig:\n leafInputCost(inner).scriptSig + pushDataPrefixBytes(redeemBytes) + redeemBytes,\n witness: 0,\n };\n }\n\n return weightFail(\"unsupported\", `sh(${inner.kind}(...)) is not a supported nesting`);\n }\n\n case \"wsh\": {\n const { inner } = node;\n\n if (inner.kind === \"pk\" || inner.kind === \"pkh\" || inner.kind === \"multi\") {\n return { ok: true, scriptSig: 0, witness: segwitWitnessBytes(inner) };\n }\n\n return weightFail(\"unsupported\", `wsh(${inner.kind}(...)) is not a supported nesting`);\n }\n\n case \"tr\":\n return { ok: true, ...computeTrCost(node) };\n case \"combo\":\n return weightFail(\n \"ambiguous-script-type\",\n \"combo() represents multiple candidate script types; describe the specific script you intend to spend instead\",\n );\n case \"raw\":\n return weightFail(\n \"opaque-script\",\n \"raw() has no known spending script, so its input weight cannot be determined\",\n );\n case \"addr\":\n return weightFail(\n \"opaque-script\",\n \"addr() has no known spending script, so its input weight cannot be determined\",\n );\n }\n}\n\nexport interface WeightOptions {\n /** Only used to interpret `addr()` base58 version bytes. Defaults to Bitcoin mainnet. */\n readonly chain?: ChainParams;\n}\n\nfunction decodeAddressScriptBytes(\n address: string,\n chain: ChainParams,\n): { readonly ok: true; readonly value: number } | WeightFailure {\n const segwit = bech32Decode(address);\n\n if (segwit !== undefined) {\n return { ok: true, value: 2 + segwit.program.length };\n }\n\n const decoded = base58Decode(address);\n\n if (decoded?.length === BASE58_ADDRESS_BYTES) {\n const version = decoded[0];\n\n if (version === chain.base58PubKeyHash) {\n return { ok: true, value: P2PKH_SCRIPT_BYTES };\n }\n\n if (version === chain.base58ScriptHash) {\n return { ok: true, value: P2SH_SCRIPT_BYTES };\n }\n }\n\n return weightFail(\"unsupported\", `unrecognized address for chain '${chain.name}': ${address}`);\n}\n\ntype ScriptBytesResult = { readonly ok: true; readonly value: number } | WeightFailure;\n\nfunction computeOutputScriptBytes(node: ScriptNode, options: WeightOptions): ScriptBytesResult {\n switch (node.kind) {\n case \"pk\":\n case \"pkh\":\n case \"wpkh\":\n case \"sh\":\n case \"wsh\":\n case \"tr\":\n case \"multi\":\n return { ok: true, value: simpleOutputScriptBytes(node) };\n case \"combo\":\n return weightFail(\n \"ambiguous-script-type\",\n \"combo() represents multiple candidate scriptPubKeys; describe the specific script you intend to create instead\",\n );\n case \"raw\":\n if (node.hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(node.hex)) {\n return weightFail(\"unsupported\", \"raw() requires an even-length hex string\");\n }\n\n return { ok: true, value: node.hex.length / 2 };\n case \"addr\":\n return decodeAddressScriptBytes(node.address, options.chain ?? BITCOIN);\n }\n}\n\n/** Return the maximum absolute input weight in weight units, under segwit transaction serialization. */\nexport function inputWeight(node: ScriptNode): WeightResult {\n const cost = computeInputCost(node);\n\n if (!cost.ok) {\n return cost;\n }\n\n const baseBytes = LEGACY_TX_OVERHEAD_BYTES + compactSizeBytes(cost.scriptSig) + cost.scriptSig;\n\n return { ok: true, weight: baseBytes * WEIGHT_SCALE + cost.witness };\n}\n\n/** Return the serialized output weight in weight units. */\nexport function outputWeight(node: ScriptNode, options: WeightOptions = {}): WeightResult {\n const scriptBytesResult = computeOutputScriptBytes(node, options);\n\n if (!scriptBytesResult.ok) {\n return scriptBytesResult;\n }\n\n const weight =\n (VOUT_OVERHEAD_BYTES + compactSizeBytes(scriptBytesResult.value) + scriptBytesResult.value) *\n WEIGHT_SCALE;\n\n return { ok: true, weight };\n}\n\nexport interface DescribedMultisig {\n readonly type: \"p2sh-multisig\" | \"p2wsh-multisig\" | \"p2sh-p2wsh-multisig\";\n readonly m: number;\n readonly n: number;\n}\n\nexport interface DescribedRawInput {\n readonly type: \"raw\";\n readonly scriptSigBytes: number;\n readonly witnessBytes: number;\n}\n\nexport type DescribedInput =\n \"p2pk\" | \"p2pkh\" | \"p2wpkh\" | \"p2sh-p2wpkh\" | \"p2tr\" | DescribedMultisig | DescribedRawInput;\n\nexport type DescribeInputResult =\n { readonly ok: true; readonly description: DescribedInput } | WeightFailure;\n\n/**\n * Maps a descriptor fragment to a value structurally assignable to\n * `utxo-coinselect`'s `InputType`, without either package depending on the\n * other. Fails with `opaque-script` for `addr()`/`raw()` (spending script\n * unknown) and `ambiguous-script-type` for `combo()` (multiple candidate\n * scripts). Every other supported fragment always succeeds, falling back to\n * an exact `{ type: \"raw\", ... }` shape when there is no named catalog entry.\n */\nexport function describeInput(node: ScriptNode): DescribeInputResult {\n const cost = computeInputCost(node);\n\n if (!cost.ok) {\n return cost;\n }\n\n if (node.kind === \"pk\") {\n return { ok: true, description: \"p2pk\" };\n }\n\n if (node.kind === \"pkh\") {\n return { ok: true, description: \"p2pkh\" };\n }\n\n if (node.kind === \"wpkh\") {\n return { ok: true, description: \"p2wpkh\" };\n }\n\n if (node.kind === \"tr\" && node.tree === undefined) {\n return { ok: true, description: \"p2tr\" };\n }\n\n if (node.kind === \"sh\" && node.inner.kind === \"wpkh\") {\n return { ok: true, description: \"p2sh-p2wpkh\" };\n }\n\n if (node.kind === \"sh\" && node.inner.kind === \"multi\") {\n return {\n ok: true,\n description: { type: \"p2sh-multisig\", m: node.inner.threshold, n: node.inner.keys.length },\n };\n }\n\n if (node.kind === \"wsh\" && node.inner.kind === \"multi\") {\n return {\n ok: true,\n description: { type: \"p2wsh-multisig\", m: node.inner.threshold, n: node.inner.keys.length },\n };\n }\n\n if (node.kind === \"sh\" && node.inner.kind === \"wsh\" && node.inner.inner.kind === \"multi\") {\n return {\n ok: true,\n description: {\n type: \"p2sh-p2wsh-multisig\",\n m: node.inner.inner.threshold,\n n: node.inner.inner.keys.length,\n },\n };\n }\n\n return {\n ok: true,\n description: { type: \"raw\", scriptSigBytes: cost.scriptSig, witnessBytes: cost.witness },\n };\n}\n\nexport interface DescribedRawOutput {\n readonly type: \"raw\";\n readonly scriptPubKeyBytes: number;\n}\n\nexport type DescribedOutput =\n \"p2pk\" | \"p2pkh\" | \"p2sh\" | \"p2wpkh\" | \"p2wsh\" | \"p2tr\" | DescribedRawOutput;\n\nexport type DescribeOutputResult =\n { readonly ok: true; readonly description: DescribedOutput } | WeightFailure;\n\n/** Maps a descriptor fragment to a value structurally assignable to `utxo-coinselect`'s `OutputType`. */\nexport function describeOutput(\n node: ScriptNode,\n options: WeightOptions = {},\n): DescribeOutputResult {\n const scriptBytesResult = computeOutputScriptBytes(node, options);\n\n if (!scriptBytesResult.ok) {\n return scriptBytesResult;\n }\n\n // computeOutputScriptBytes already failed above for combo(), so every kind\n // reaching this switch other than combo is representable here.\n const resolvedNode = node as Exclude<ScriptNode, { readonly kind: \"combo\" }>;\n\n switch (resolvedNode.kind) {\n case \"pk\":\n return { ok: true, description: \"p2pk\" };\n case \"pkh\":\n return { ok: true, description: \"p2pkh\" };\n case \"wpkh\":\n return { ok: true, description: \"p2wpkh\" };\n case \"sh\":\n return { ok: true, description: \"p2sh\" };\n case \"wsh\":\n return { ok: true, description: \"p2wsh\" };\n case \"tr\":\n return { ok: true, description: \"p2tr\" };\n case \"multi\":\n case \"raw\":\n case \"addr\":\n return { ok: true, description: { type: \"raw\", scriptPubKeyBytes: scriptBytesResult.value } };\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { D as DescribeInputResult, b as DescribeOutputResult, c as DescribedInput, d as DescribedMultisig, e as DescribedOutput, f as DescribedRawInput, g as DescribedRawOutput, W as WeightOptions, l as compactSizeBytes, i as describeInput, j as describeOutput, k as inputWeight, o as outputWeight, p as pushDataPrefixBytes } from './weights-9_pPEdMA.cjs';
|
|
2
|
+
import './types-Dr-JC_LD.cjs';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { D as DescribeInputResult, b as DescribeOutputResult, c as DescribedInput, d as DescribedMultisig, e as DescribedOutput, f as DescribedRawInput, g as DescribedRawOutput, W as WeightOptions, l as compactSizeBytes, i as describeInput, j as describeOutput, k as inputWeight, o as outputWeight, p as pushDataPrefixBytes } from './weights-B0KrRWLe.js';
|
|
2
|
+
import './types-Dr-JC_LD.js';
|