@argonprotocol/bitcoin 1.3.2 → 1.3.3

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.
@@ -0,0 +1,746 @@
1
+ import { Address, OutScript, NETWORK, TEST_NETWORK, Transaction, p2wpkh, p2wsh, p2sh, p2pkh } from '@scure/btc-signer';
2
+ export { Address, Transaction, p2pk, p2pkh, p2sh, p2wpkh, p2wsh } from '@scure/btc-signer';
3
+ import { hexToU8a, u8aToHex, u8aEq } from '@argonprotocol/mainchain';
4
+ import { HDKey } from '@scure/bip32';
5
+ export { HDKey } from '@scure/bip32';
6
+ import * as secp256k1 from '@noble/secp256k1';
7
+ import * as bip39 from '@scure/bip39';
8
+ export { bip39 };
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+
16
+ // ts/wasm/bitcoin_bindings_bg.wasm
17
+ var bitcoin_bindings_bg_exports = {};
18
+ __export(bitcoin_bindings_bg_exports, {
19
+ default: () => bitcoin_bindings_bg_default
20
+ });
21
+ var bitcoin_bindings_bg_default = "./bitcoin_bindings_bg-WMK2AQRE.wasm";
22
+
23
+ // ts/wasm/bitcoin_bindings_bg.js
24
+ var wasm;
25
+ function __wbg_set_wasm(val) {
26
+ wasm = val;
27
+ }
28
+ var lTextDecoder = typeof TextDecoder === "undefined" ? (0, module.require)("util").TextDecoder : TextDecoder;
29
+ var cachedTextDecoder = new lTextDecoder("utf-8", { ignoreBOM: true, fatal: true });
30
+ cachedTextDecoder.decode();
31
+ var cachedUint8ArrayMemory0 = null;
32
+ function getUint8ArrayMemory0() {
33
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
34
+ cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
35
+ }
36
+ return cachedUint8ArrayMemory0;
37
+ }
38
+ function getStringFromWasm0(ptr, len) {
39
+ ptr = ptr >>> 0;
40
+ return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
41
+ }
42
+ var WASM_VECTOR_LEN = 0;
43
+ var lTextEncoder = typeof TextEncoder === "undefined" ? (0, module.require)("util").TextEncoder : TextEncoder;
44
+ var cachedTextEncoder = new lTextEncoder("utf-8");
45
+ var encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) {
46
+ return cachedTextEncoder.encodeInto(arg, view);
47
+ } : function(arg, view) {
48
+ const buf = cachedTextEncoder.encode(arg);
49
+ view.set(buf);
50
+ return {
51
+ read: arg.length,
52
+ written: buf.length
53
+ };
54
+ };
55
+ function passStringToWasm0(arg, malloc, realloc) {
56
+ if (realloc === void 0) {
57
+ const buf = cachedTextEncoder.encode(arg);
58
+ const ptr2 = malloc(buf.length, 1) >>> 0;
59
+ getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf);
60
+ WASM_VECTOR_LEN = buf.length;
61
+ return ptr2;
62
+ }
63
+ let len = arg.length;
64
+ let ptr = malloc(len, 1) >>> 0;
65
+ const mem = getUint8ArrayMemory0();
66
+ let offset = 0;
67
+ for (; offset < len; offset++) {
68
+ const code = arg.charCodeAt(offset);
69
+ if (code > 127) break;
70
+ mem[ptr + offset] = code;
71
+ }
72
+ if (offset !== len) {
73
+ if (offset !== 0) {
74
+ arg = arg.slice(offset);
75
+ }
76
+ ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
77
+ const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
78
+ const ret = encodeString(arg, view);
79
+ offset += ret.written;
80
+ ptr = realloc(ptr, len, offset, 1) >>> 0;
81
+ }
82
+ WASM_VECTOR_LEN = offset;
83
+ return ptr;
84
+ }
85
+ function takeFromExternrefTable0(idx) {
86
+ const value = wasm.__wbindgen_export_3.get(idx);
87
+ wasm.__externref_table_dealloc(idx);
88
+ return value;
89
+ }
90
+ function createCosignPubkey(vault_pubkey_hex, vault_claim_pubkey_hex, owner_pubkey_hex, vault_claim_height, open_claim_height, created_at_height, bitcoin_network) {
91
+ let deferred5_0;
92
+ let deferred5_1;
93
+ try {
94
+ const ptr0 = passStringToWasm0(vault_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
95
+ const len0 = WASM_VECTOR_LEN;
96
+ const ptr1 = passStringToWasm0(vault_claim_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
97
+ const len1 = WASM_VECTOR_LEN;
98
+ const ptr2 = passStringToWasm0(owner_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
99
+ const len2 = WASM_VECTOR_LEN;
100
+ const ret = wasm.createCosignPubkey(ptr0, len0, ptr1, len1, ptr2, len2, vault_claim_height, open_claim_height, created_at_height, bitcoin_network);
101
+ var ptr4 = ret[0];
102
+ var len4 = ret[1];
103
+ if (ret[3]) {
104
+ ptr4 = 0;
105
+ len4 = 0;
106
+ throw takeFromExternrefTable0(ret[2]);
107
+ }
108
+ deferred5_0 = ptr4;
109
+ deferred5_1 = len4;
110
+ return getStringFromWasm0(ptr4, len4);
111
+ } finally {
112
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
113
+ }
114
+ }
115
+ function calculateFee(vault_pubkey_hex, vault_claim_pubkey_hex, owner_pubkey_hex, vault_claim_height, open_claim_height, created_at_height, bitcoin_network, fee_rate_sats_per_vb, to_script_pubkey) {
116
+ const ptr0 = passStringToWasm0(vault_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
117
+ const len0 = WASM_VECTOR_LEN;
118
+ const ptr1 = passStringToWasm0(vault_claim_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
119
+ const len1 = WASM_VECTOR_LEN;
120
+ const ptr2 = passStringToWasm0(owner_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
121
+ const len2 = WASM_VECTOR_LEN;
122
+ const ptr3 = passStringToWasm0(to_script_pubkey, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
123
+ const len3 = WASM_VECTOR_LEN;
124
+ const ret = wasm.calculateFee(ptr0, len0, ptr1, len1, ptr2, len2, vault_claim_height, open_claim_height, created_at_height, bitcoin_network, fee_rate_sats_per_vb, ptr3, len3);
125
+ if (ret[2]) {
126
+ throw takeFromExternrefTable0(ret[1]);
127
+ }
128
+ return BigInt.asUintN(64, ret[0]);
129
+ }
130
+ function signPsbtDerived(psbt_hex, xpriv_b58, xpriv_hd_path, finalize) {
131
+ let deferred5_0;
132
+ let deferred5_1;
133
+ try {
134
+ const ptr0 = passStringToWasm0(psbt_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
135
+ const len0 = WASM_VECTOR_LEN;
136
+ const ptr1 = passStringToWasm0(xpriv_b58, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
137
+ const len1 = WASM_VECTOR_LEN;
138
+ const ptr2 = passStringToWasm0(xpriv_hd_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
139
+ const len2 = WASM_VECTOR_LEN;
140
+ const ret = wasm.signPsbtDerived(ptr0, len0, ptr1, len1, ptr2, len2, finalize);
141
+ var ptr4 = ret[0];
142
+ var len4 = ret[1];
143
+ if (ret[3]) {
144
+ ptr4 = 0;
145
+ len4 = 0;
146
+ throw takeFromExternrefTable0(ret[2]);
147
+ }
148
+ deferred5_0 = ptr4;
149
+ deferred5_1 = len4;
150
+ return getStringFromWasm0(ptr4, len4);
151
+ } finally {
152
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
153
+ }
154
+ }
155
+ function signPsbt(psbt_hex, bitcoin_network, private_key_hex, finalize) {
156
+ let deferred4_0;
157
+ let deferred4_1;
158
+ try {
159
+ const ptr0 = passStringToWasm0(psbt_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
160
+ const len0 = WASM_VECTOR_LEN;
161
+ const ptr1 = passStringToWasm0(private_key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
162
+ const len1 = WASM_VECTOR_LEN;
163
+ const ret = wasm.signPsbt(ptr0, len0, bitcoin_network, ptr1, len1, finalize);
164
+ var ptr3 = ret[0];
165
+ var len3 = ret[1];
166
+ if (ret[3]) {
167
+ ptr3 = 0;
168
+ len3 = 0;
169
+ throw takeFromExternrefTable0(ret[2]);
170
+ }
171
+ deferred4_0 = ptr3;
172
+ deferred4_1 = len3;
173
+ return getStringFromWasm0(ptr3, len3);
174
+ } finally {
175
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
176
+ }
177
+ }
178
+ function getCosignPsbt(txid, vout, satoshis, vault_pubkey_hex, vault_claim_pubkey_hex, owner_pubkey_hex, vault_claim_height, open_claim_height, created_at_height, bitcoin_network, to_script_pubkey_hex, bitcoin_network_fee) {
179
+ let deferred7_0;
180
+ let deferred7_1;
181
+ try {
182
+ const ptr0 = passStringToWasm0(txid, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
183
+ const len0 = WASM_VECTOR_LEN;
184
+ const ptr1 = passStringToWasm0(vault_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
185
+ const len1 = WASM_VECTOR_LEN;
186
+ const ptr2 = passStringToWasm0(vault_claim_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
187
+ const len2 = WASM_VECTOR_LEN;
188
+ const ptr3 = passStringToWasm0(owner_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
189
+ const len3 = WASM_VECTOR_LEN;
190
+ const ptr4 = passStringToWasm0(to_script_pubkey_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
191
+ const len4 = WASM_VECTOR_LEN;
192
+ const ret = wasm.getCosignPsbt(ptr0, len0, vout, satoshis, ptr1, len1, ptr2, len2, ptr3, len3, vault_claim_height, open_claim_height, created_at_height, bitcoin_network, ptr4, len4, bitcoin_network_fee);
193
+ var ptr6 = ret[0];
194
+ var len6 = ret[1];
195
+ if (ret[3]) {
196
+ ptr6 = 0;
197
+ len6 = 0;
198
+ throw takeFromExternrefTable0(ret[2]);
199
+ }
200
+ deferred7_0 = ptr6;
201
+ deferred7_1 = len6;
202
+ return getStringFromWasm0(ptr6, len6);
203
+ } finally {
204
+ wasm.__wbindgen_free(deferred7_0, deferred7_1, 1);
205
+ }
206
+ }
207
+ var BitcoinNetwork = Object.freeze({
208
+ /**
209
+ * Mainnet Bitcoin.
210
+ */
211
+ Bitcoin: 0,
212
+ "0": "Bitcoin",
213
+ /**
214
+ * Bitcoin's testnet network.
215
+ */
216
+ Testnet: 1,
217
+ "1": "Testnet",
218
+ /**
219
+ * Bitcoin's signet network
220
+ */
221
+ Signet: 2,
222
+ "2": "Signet",
223
+ /**
224
+ * Bitcoin's regtest network.
225
+ */
226
+ Regtest: 3,
227
+ "3": "Regtest"
228
+ });
229
+
230
+ // ts/wasm/bitcoin_bindings.js
231
+ __wbg_set_wasm(bitcoin_bindings_bg_exports);
232
+
233
+ // node_modules/@scure/base/lib/esm/index.js
234
+ function isBytes(a) {
235
+ return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
236
+ }
237
+ function isArrayOf(isString, arr) {
238
+ if (!Array.isArray(arr))
239
+ return false;
240
+ if (arr.length === 0)
241
+ return true;
242
+ if (isString) {
243
+ return arr.every((item) => typeof item === "string");
244
+ } else {
245
+ return arr.every((item) => Number.isSafeInteger(item));
246
+ }
247
+ }
248
+ function afn(input) {
249
+ if (typeof input !== "function")
250
+ throw new Error("function expected");
251
+ return true;
252
+ }
253
+ function astr(label, input) {
254
+ if (typeof input !== "string")
255
+ throw new Error(`${label}: string expected`);
256
+ return true;
257
+ }
258
+ function anumber(n) {
259
+ if (!Number.isSafeInteger(n))
260
+ throw new Error(`invalid integer: ${n}`);
261
+ }
262
+ function aArr(input) {
263
+ if (!Array.isArray(input))
264
+ throw new Error("array expected");
265
+ }
266
+ function astrArr(label, input) {
267
+ if (!isArrayOf(true, input))
268
+ throw new Error(`${label}: array of strings expected`);
269
+ }
270
+ function anumArr(label, input) {
271
+ if (!isArrayOf(false, input))
272
+ throw new Error(`${label}: array of numbers expected`);
273
+ }
274
+ // @__NO_SIDE_EFFECTS__
275
+ function chain(...args) {
276
+ const id = (a) => a;
277
+ const wrap = (a, b) => (c) => a(b(c));
278
+ const encode = args.map((x) => x.encode).reduceRight(wrap, id);
279
+ const decode = args.map((x) => x.decode).reduce(wrap, id);
280
+ return { encode, decode };
281
+ }
282
+ // @__NO_SIDE_EFFECTS__
283
+ function alphabet(letters) {
284
+ const lettersA = letters.split("") ;
285
+ const len = lettersA.length;
286
+ astrArr("alphabet", lettersA);
287
+ const indexes = new Map(lettersA.map((l, i) => [l, i]));
288
+ return {
289
+ encode: (digits) => {
290
+ aArr(digits);
291
+ return digits.map((i) => {
292
+ if (!Number.isSafeInteger(i) || i < 0 || i >= len)
293
+ throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`);
294
+ return lettersA[i];
295
+ });
296
+ },
297
+ decode: (input) => {
298
+ aArr(input);
299
+ return input.map((letter) => {
300
+ astr("alphabet.decode", letter);
301
+ const i = indexes.get(letter);
302
+ if (i === void 0)
303
+ throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`);
304
+ return i;
305
+ });
306
+ }
307
+ };
308
+ }
309
+ // @__NO_SIDE_EFFECTS__
310
+ function join(separator = "") {
311
+ astr("join", separator);
312
+ return {
313
+ encode: (from) => {
314
+ astrArr("join.decode", from);
315
+ return from.join(separator);
316
+ },
317
+ decode: (to) => {
318
+ astr("join.decode", to);
319
+ return to.split(separator);
320
+ }
321
+ };
322
+ }
323
+ var gcd = (a, b) => b === 0 ? a : gcd(b, a % b);
324
+ var radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));
325
+ var powers = /* @__PURE__ */ (() => {
326
+ let res = [];
327
+ for (let i = 0; i < 40; i++)
328
+ res.push(2 ** i);
329
+ return res;
330
+ })();
331
+ function convertRadix2(data, from, to, padding) {
332
+ aArr(data);
333
+ if (from <= 0 || from > 32)
334
+ throw new Error(`convertRadix2: wrong from=${from}`);
335
+ if (to <= 0 || to > 32)
336
+ throw new Error(`convertRadix2: wrong to=${to}`);
337
+ if (/* @__PURE__ */ radix2carry(from, to) > 32) {
338
+ throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${/* @__PURE__ */ radix2carry(from, to)}`);
339
+ }
340
+ let carry = 0;
341
+ let pos = 0;
342
+ const max = powers[from];
343
+ const mask = powers[to] - 1;
344
+ const res = [];
345
+ for (const n of data) {
346
+ anumber(n);
347
+ if (n >= max)
348
+ throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);
349
+ carry = carry << from | n;
350
+ if (pos + from > 32)
351
+ throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);
352
+ pos += from;
353
+ for (; pos >= to; pos -= to)
354
+ res.push((carry >> pos - to & mask) >>> 0);
355
+ const pow = powers[pos];
356
+ if (pow === void 0)
357
+ throw new Error("invalid carry");
358
+ carry &= pow - 1;
359
+ }
360
+ carry = carry << to - pos & mask;
361
+ if (!padding && pos >= from)
362
+ throw new Error("Excess padding");
363
+ if (!padding && carry > 0)
364
+ throw new Error(`Non-zero padding: ${carry}`);
365
+ if (padding && pos > 0)
366
+ res.push(carry >>> 0);
367
+ return res;
368
+ }
369
+ // @__NO_SIDE_EFFECTS__
370
+ function radix2(bits, revPadding = false) {
371
+ anumber(bits);
372
+ if (/* @__PURE__ */ radix2carry(8, bits) > 32 || /* @__PURE__ */ radix2carry(bits, 8) > 32)
373
+ throw new Error("radix2: carry overflow");
374
+ return {
375
+ encode: (bytes) => {
376
+ if (!isBytes(bytes))
377
+ throw new Error("radix2.encode input should be Uint8Array");
378
+ return convertRadix2(Array.from(bytes), 8, bits, !revPadding);
379
+ },
380
+ decode: (digits) => {
381
+ anumArr("radix2.decode", digits);
382
+ return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));
383
+ }
384
+ };
385
+ }
386
+ function unsafeWrapper(fn) {
387
+ afn(fn);
388
+ return function(...args) {
389
+ try {
390
+ return fn.apply(null, args);
391
+ } catch (e) {
392
+ }
393
+ };
394
+ }
395
+ var BECH_ALPHABET = /* @__PURE__ */ chain(/* @__PURE__ */ alphabet("qpzry9x8gf2tvdw0s3jn54khce6mua7l"), /* @__PURE__ */ join(""));
396
+ var POLYMOD_GENERATORS = [996825010, 642813549, 513874426, 1027748829, 705979059];
397
+ function bech32Polymod(pre) {
398
+ const b = pre >> 25;
399
+ let chk = (pre & 33554431) << 5;
400
+ for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {
401
+ if ((b >> i & 1) === 1)
402
+ chk ^= POLYMOD_GENERATORS[i];
403
+ }
404
+ return chk;
405
+ }
406
+ function bechChecksum(prefix, words, encodingConst = 1) {
407
+ const len = prefix.length;
408
+ let chk = 1;
409
+ for (let i = 0; i < len; i++) {
410
+ const c = prefix.charCodeAt(i);
411
+ if (c < 33 || c > 126)
412
+ throw new Error(`Invalid prefix (${prefix})`);
413
+ chk = bech32Polymod(chk) ^ c >> 5;
414
+ }
415
+ chk = bech32Polymod(chk);
416
+ for (let i = 0; i < len; i++)
417
+ chk = bech32Polymod(chk) ^ prefix.charCodeAt(i) & 31;
418
+ for (let v of words)
419
+ chk = bech32Polymod(chk) ^ v;
420
+ for (let i = 0; i < 6; i++)
421
+ chk = bech32Polymod(chk);
422
+ chk ^= encodingConst;
423
+ return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false));
424
+ }
425
+ // @__NO_SIDE_EFFECTS__
426
+ function genBech32(encoding) {
427
+ const ENCODING_CONST = 1 ;
428
+ const _words = /* @__PURE__ */ radix2(5);
429
+ const fromWords = _words.decode;
430
+ const toWords = _words.encode;
431
+ const fromWordsUnsafe = unsafeWrapper(fromWords);
432
+ function encode(prefix, words, limit = 90) {
433
+ astr("bech32.encode prefix", prefix);
434
+ if (isBytes(words))
435
+ words = Array.from(words);
436
+ anumArr("bech32.encode", words);
437
+ const plen = prefix.length;
438
+ if (plen === 0)
439
+ throw new TypeError(`Invalid prefix length ${plen}`);
440
+ const actualLength = plen + 7 + words.length;
441
+ if (limit !== false && actualLength > limit)
442
+ throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);
443
+ const lowered = prefix.toLowerCase();
444
+ const sum = bechChecksum(lowered, words, ENCODING_CONST);
445
+ return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;
446
+ }
447
+ function decode(str, limit = 90) {
448
+ astr("bech32.decode input", str);
449
+ const slen = str.length;
450
+ if (slen < 8 || limit !== false && slen > limit)
451
+ throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);
452
+ const lowered = str.toLowerCase();
453
+ if (str !== lowered && str !== str.toUpperCase())
454
+ throw new Error(`String must be lowercase or uppercase`);
455
+ const sepIndex = lowered.lastIndexOf("1");
456
+ if (sepIndex === 0 || sepIndex === -1)
457
+ throw new Error(`Letter "1" must be present between prefix and data only`);
458
+ const prefix = lowered.slice(0, sepIndex);
459
+ const data = lowered.slice(sepIndex + 1);
460
+ if (data.length < 6)
461
+ throw new Error("Data must be at least 6 characters long");
462
+ const words = BECH_ALPHABET.decode(data).slice(0, -6);
463
+ const sum = bechChecksum(prefix, words, ENCODING_CONST);
464
+ if (!data.endsWith(sum))
465
+ throw new Error(`Invalid checksum in ${str}: expected "${sum}"`);
466
+ return { prefix, words };
467
+ }
468
+ const decodeUnsafe = unsafeWrapper(decode);
469
+ function decodeToBytes(str) {
470
+ const { prefix, words } = decode(str, false);
471
+ return { prefix, words, bytes: fromWords(words) };
472
+ }
473
+ function encodeFromBytes(prefix, bytes) {
474
+ return encode(prefix, toWords(bytes));
475
+ }
476
+ return {
477
+ encode,
478
+ decode,
479
+ encodeFromBytes,
480
+ decodeToBytes,
481
+ decodeUnsafe,
482
+ fromWords,
483
+ fromWordsUnsafe,
484
+ toWords
485
+ };
486
+ }
487
+ var bech32 = /* @__PURE__ */ genBech32();
488
+ function getBip32Version(network) {
489
+ if (!network) {
490
+ return void 0;
491
+ }
492
+ if (network === BitcoinNetwork.Testnet || network === BitcoinNetwork.Signet) {
493
+ return {
494
+ private: 70615956,
495
+ // tprv
496
+ public: 70617039
497
+ // tpub
498
+ };
499
+ }
500
+ if (network === BitcoinNetwork.Regtest) {
501
+ return {
502
+ private: 70615956,
503
+ // rprv
504
+ public: 70617039
505
+ // rpub
506
+ };
507
+ }
508
+ return void 0;
509
+ }
510
+ function getChildXpriv(bip39Seed, hdPath, network) {
511
+ const root = HDKey.fromMasterSeed(bip39Seed, getBip32Version(network));
512
+ return root.derive(hdPath);
513
+ }
514
+ function getXpubFromXpriv(xpriv) {
515
+ return xpriv.publicExtendedKey;
516
+ }
517
+ function getCompressedPubkey(pubkey) {
518
+ const pubkeyUint8Array = keyToU8a(pubkey);
519
+ if (pubkeyUint8Array.length === 33) {
520
+ return pubkeyUint8Array;
521
+ }
522
+ const point = secp256k1.Point.fromHex(pubkeyUint8Array);
523
+ return point.toRawBytes(true);
524
+ }
525
+ function getBech32Prefix(network) {
526
+ return getScureNetwork(network).bech32;
527
+ }
528
+ function p2wshScriptHexToAddress(scriptPubKeyHex, network) {
529
+ const script = hexToU8a(scriptPubKeyHex);
530
+ if (Buffer.byteLength(script) !== 34 || script[0] !== 0 || script[1] !== 32) {
531
+ throw new Error("Invalid P2WSH scriptPubKey");
532
+ }
533
+ const witnessProgram = script.slice(2);
534
+ const version = 0;
535
+ const prefix = getBech32Prefix(network);
536
+ return bech32.encode(prefix, [version, ...bech32.toWords(witnessProgram)]);
537
+ }
538
+ function addressBytesHex(address, network) {
539
+ if (address.startsWith("0x")) {
540
+ return address;
541
+ }
542
+ const bech32Prefix = getBech32Prefix(network);
543
+ if (/^[0-9a-fA-F]+$/.test(address) && !address.startsWith("bc") && !address.startsWith(bech32Prefix)) {
544
+ return `0x${address}`;
545
+ }
546
+ const btcNetwork = getScureNetwork(network);
547
+ const decoded = Address(btcNetwork).decode(address);
548
+ const out = OutScript.encode(decoded);
549
+ return u8aToHex(out);
550
+ }
551
+ function keyToU8a(pubkey) {
552
+ return typeof pubkey === "string" ? hexToU8a(pubkey) : pubkey;
553
+ }
554
+ function getScureNetwork(network) {
555
+ if (network === BitcoinNetwork.Bitcoin) {
556
+ return NETWORK;
557
+ } else if (network === BitcoinNetwork.Testnet || network === BitcoinNetwork.Signet) {
558
+ return TEST_NETWORK;
559
+ } else {
560
+ return {
561
+ bech32: "bcrt",
562
+ pubKeyHash: 111,
563
+ scriptHash: 196,
564
+ wif: 239
565
+ };
566
+ }
567
+ }
568
+
569
+ // ts/CosignScript.ts
570
+ var CosignScript = class {
571
+ constructor(lock, network) {
572
+ this.lock = lock;
573
+ this.network = network;
574
+ }
575
+ getFundingPsbt() {
576
+ const { lock, network } = this;
577
+ const tx = new Transaction();
578
+ tx.addOutput({
579
+ script: keyToU8a(lock.p2wshScriptHashHex),
580
+ amount: lock.satoshis
581
+ });
582
+ return tx.toPSBT(0);
583
+ }
584
+ calculateFee(feeRatePerSatVb, toScriptPubkey) {
585
+ toScriptPubkey = addressBytesHex(toScriptPubkey, this.network);
586
+ const { lock, network } = this;
587
+ return calculateFee(
588
+ lock.vaultPubkey,
589
+ lock.vaultClaimPubkey,
590
+ lock.ownerPubkey,
591
+ BigInt(lock.vaultClaimHeight),
592
+ BigInt(lock.openClaimHeight),
593
+ BigInt(lock.createdAtHeight),
594
+ network,
595
+ feeRatePerSatVb,
596
+ toScriptPubkey
597
+ );
598
+ }
599
+ calculateScriptPubkey() {
600
+ const { lock, network } = this;
601
+ return createCosignPubkey(
602
+ lock.vaultPubkey,
603
+ lock.vaultClaimPubkey,
604
+ lock.ownerPubkey,
605
+ BigInt(lock.vaultClaimHeight),
606
+ BigInt(lock.openClaimHeight),
607
+ BigInt(lock.createdAtHeight),
608
+ network
609
+ );
610
+ }
611
+ getCosignPsbt(args) {
612
+ const { lock, network } = this;
613
+ const { releaseRequest, utxoRef } = args;
614
+ releaseRequest.toScriptPubkey = addressBytesHex(releaseRequest.toScriptPubkey, network);
615
+ const psbtStr = getCosignPsbt(
616
+ utxoRef.txid,
617
+ utxoRef.vout,
618
+ lock.satoshis,
619
+ lock.vaultPubkey,
620
+ lock.vaultClaimPubkey,
621
+ lock.ownerPubkey,
622
+ BigInt(lock.vaultClaimHeight),
623
+ BigInt(lock.openClaimHeight),
624
+ BigInt(lock.createdAtHeight),
625
+ network,
626
+ releaseRequest.toScriptPubkey,
627
+ releaseRequest.bitcoinNetworkFee
628
+ );
629
+ return this.psbtFromHex(psbtStr);
630
+ }
631
+ psbtFromHex(psbtHex) {
632
+ const psbtBytes = hexToU8a(psbtHex);
633
+ const tx = Transaction.fromPSBT(psbtBytes);
634
+ if (tx.inputsLength === 0) {
635
+ throw new Error("PSBT has no inputs");
636
+ }
637
+ if (tx.outputsLength === 0) {
638
+ throw new Error("PSBT has no outputs");
639
+ }
640
+ return tx;
641
+ }
642
+ /**
643
+ * Cosigns the PSBT with the vault xpub.
644
+ * @param psbt - The PSBT to cosign.
645
+ * @param lock - The Bitcoin lock containing the vault information.
646
+ * @param vaultXpriv - The vault's extended private key of which the xpub was used to create the vault.
647
+ */
648
+ vaultCosignPsbt(psbt, lock, vaultXpriv) {
649
+ const parentFingerprint = lock.vaultXpubSources.parentFingerprint;
650
+ const vaultFingerprint = vaultXpriv.identifier?.slice(0, 4);
651
+ if (!vaultFingerprint) {
652
+ throw new Error("Could not get vault fingerprint from HDKey");
653
+ }
654
+ if (!u8aEq(parentFingerprint, vaultFingerprint)) {
655
+ throw new Error(
656
+ `Vault xpub fingerprint ${u8aToHex(parentFingerprint)} does not match the vault xpriv fingerprint ${u8aToHex(vaultFingerprint)}`
657
+ );
658
+ }
659
+ const childPath = `${lock.vaultXpubSources.cosignHdIndex}`;
660
+ const pubkey = vaultXpriv.deriveChild(lock.vaultXpubSources.cosignHdIndex).publicKey;
661
+ if (!pubkey) {
662
+ throw new Error(`Failed to derive public key for path ${childPath}`);
663
+ }
664
+ const vaultPubkey = keyToU8a(lock.vaultPubkey);
665
+ if (!u8aEq(vaultPubkey, pubkey)) {
666
+ throw new Error(
667
+ `Vault pubkey ${u8aToHex(vaultPubkey)} does not match the derived pubkey ${u8aToHex(pubkey)} using path ${childPath}`
668
+ );
669
+ }
670
+ const signedPsbt = signPsbtDerived(
671
+ u8aToHex(psbt.toPSBT()),
672
+ vaultXpriv.privateExtendedKey,
673
+ childPath,
674
+ false
675
+ );
676
+ psbt = this.psbtFromHex(signedPsbt);
677
+ return psbt;
678
+ }
679
+ /**
680
+ * Cosigns the transaction.
681
+ */
682
+ cosignAndGenerateTx(args) {
683
+ const { lock } = this;
684
+ const psbt = this.getCosignPsbt(args);
685
+ const { addTx, vaultCosignature, ownerXpriv, ownerXprivChildHdPath } = args;
686
+ psbt.updateInput(0, {
687
+ partialSig: [[keyToU8a(lock.vaultPubkey), vaultCosignature]]
688
+ });
689
+ const derivePubkey = ownerXpriv.publicKey;
690
+ if (!derivePubkey) {
691
+ throw new Error("Failed to derive owner public key");
692
+ }
693
+ const ownerPubkey = keyToU8a(lock.ownerPubkey);
694
+ if (!u8aEq(ownerPubkey, derivePubkey)) {
695
+ throw new Error(
696
+ `Owner pubkey ${u8aToHex(ownerPubkey)} does not match the derived pubkey ${u8aToHex(derivePubkey)}`
697
+ );
698
+ }
699
+ if (addTx) {
700
+ const addTxBytes = hexToU8a(addTx);
701
+ const tx = Transaction.fromPSBT(addTxBytes);
702
+ for (let i = 0; i < tx.outputsLength; i++) {
703
+ const output = tx.getOutput(i);
704
+ const network = getScureNetwork(this.network);
705
+ const scripts = [
706
+ p2wpkh(ownerPubkey, network).script,
707
+ p2wsh(p2wpkh(ownerPubkey, network), network).script,
708
+ p2sh(p2pkh(ownerPubkey, network), network).script,
709
+ p2pkh(ownerPubkey, network).script
710
+ ];
711
+ if (scripts.some((x) => x && output.script && u8aEq(output.script, x))) {
712
+ psbt.addInput({
713
+ txid: tx.id,
714
+ index: i,
715
+ witnessUtxo: {
716
+ script: output.script,
717
+ amount: output.amount
718
+ }
719
+ });
720
+ }
721
+ }
722
+ }
723
+ const psbtBytes = u8aToHex(psbt.toPSBT());
724
+ const signedPsbt = ownerXprivChildHdPath ? signPsbtDerived(psbtBytes, ownerXpriv.privateExtendedKey, ownerXprivChildHdPath, true) : signPsbt(psbtBytes, this.network, u8aToHex(ownerXpriv.privateKey, void 0, false), true);
725
+ return this.psbtFromHex(signedPsbt);
726
+ }
727
+ };
728
+ function getBitcoinNetworkFromApi(network) {
729
+ if (network.isBitcoin) {
730
+ return BitcoinNetwork.Bitcoin;
731
+ } else if (network.isTestnet) {
732
+ return BitcoinNetwork.Testnet;
733
+ } else if (network.isRegtest) {
734
+ return BitcoinNetwork.Regtest;
735
+ }
736
+ throw new Error("Unsupported network: " + network);
737
+ }
738
+ /*! Bundled license information:
739
+
740
+ @scure/base/lib/esm/index.js:
741
+ (*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
742
+ */
743
+
744
+ export { BitcoinNetwork, CosignScript, addressBytesHex, getBech32Prefix, getBip32Version, getBitcoinNetworkFromApi, getChildXpriv, getCompressedPubkey, getScureNetwork, getXpubFromXpriv, keyToU8a, p2wshScriptHexToAddress };
745
+ //# sourceMappingURL=index.js.map
746
+ //# sourceMappingURL=index.js.map