@leather.io/bitcoin 0.8.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/dist/index.js ADDED
@@ -0,0 +1,516 @@
1
+ // src/bip322/bip322-utils.ts
2
+ import ecc from "@bitcoinerlab/secp256k1";
3
+ import { sha256 } from "@noble/hashes/sha256";
4
+ import { hexToBytes as hexToBytes2, utf8ToBytes } from "@stacks/common";
5
+ import * as bitcoin from "bitcoinjs-lib";
6
+ import { ECPairFactory } from "ecpair";
7
+ import { encode } from "varuint-bitcoin";
8
+ import { isString } from "@leather.io/utils";
9
+
10
+ // src/bitcoin.utils.ts
11
+ import { hexToBytes } from "@noble/hashes/utils";
12
+ import { HDKey } from "@scure/bip32";
13
+ import { mnemonicToSeedSync } from "@scure/bip39";
14
+ import * as btc2 from "@scure/btc-signer";
15
+ import { DerivationPathDepth as DerivationPathDepth2, extractAccountIndexFromPath } from "@leather.io/crypto";
16
+ import { defaultWalletKeyId, isDefined, whenNetwork } from "@leather.io/utils";
17
+
18
+ // src/bitcoin.network.ts
19
+ import * as bitcoinJs from "bitcoinjs-lib";
20
+ var bitcoinMainnet = {
21
+ bech32: "bc",
22
+ pubKeyHash: 0,
23
+ scriptHash: 5,
24
+ wif: 128
25
+ };
26
+ var bitcoinTestnet = {
27
+ bech32: "tb",
28
+ pubKeyHash: 111,
29
+ scriptHash: 196,
30
+ wif: 239
31
+ };
32
+ var bitcoinRegtest = {
33
+ bech32: "bcrt",
34
+ pubKeyHash: 111,
35
+ scriptHash: 196,
36
+ wif: 239
37
+ };
38
+ var btcSignerLibNetworks = {
39
+ mainnet: bitcoinMainnet,
40
+ testnet: bitcoinTestnet,
41
+ regtest: bitcoinRegtest,
42
+ // Signet originally was going to have its own prefix but authors decided to
43
+ // copy testnet
44
+ signet: bitcoinTestnet
45
+ };
46
+ function getBtcSignerLibNetworkConfigByMode(network) {
47
+ return btcSignerLibNetworks[network];
48
+ }
49
+ var bitcoinJsLibNetworks = {
50
+ mainnet: bitcoinJs.networks.bitcoin,
51
+ testnet: bitcoinJs.networks.testnet,
52
+ regtest: bitcoinJs.networks.regtest,
53
+ signet: bitcoinJs.networks.testnet
54
+ };
55
+ function getBitcoinJsLibNetworkConfigByMode(network) {
56
+ return bitcoinJsLibNetworks[network];
57
+ }
58
+
59
+ // src/p2tr-address-gen.ts
60
+ import * as btc from "@scure/btc-signer";
61
+ import { DerivationPathDepth } from "@leather.io/crypto";
62
+ function getTaprootAccountDerivationPath(network, accountIndex) {
63
+ return `m/86'/${getBitcoinCoinTypeIndexByNetwork(network)}'/${accountIndex}'`;
64
+ }
65
+ function getTaprootAddressIndexDerivationPath(network, accountIndex, addressIndex) {
66
+ return getTaprootAccountDerivationPath(network, accountIndex) + `/0/${addressIndex}`;
67
+ }
68
+ function deriveTaprootAccount(keychain, network) {
69
+ if (keychain.depth !== DerivationPathDepth.Root)
70
+ throw new Error("Keychain passed is not an account");
71
+ return (accountIndex) => ({
72
+ type: "p2tr",
73
+ network,
74
+ accountIndex,
75
+ derivationPath: getTaprootAccountDerivationPath(network, accountIndex),
76
+ keychain: keychain.derive(getTaprootAccountDerivationPath(network, accountIndex))
77
+ });
78
+ }
79
+ function getTaprootPayment(publicKey, network) {
80
+ return btc.p2tr(
81
+ ecdsaPublicKeyToSchnorr(publicKey),
82
+ void 0,
83
+ getBtcSignerLibNetworkConfigByMode(network)
84
+ );
85
+ }
86
+ function getTaprootPaymentFromAddressIndex(keychain, network) {
87
+ if (keychain.depth !== DerivationPathDepth.AddressIndex)
88
+ throw new Error("Keychain passed is not an address index");
89
+ if (!keychain.publicKey) throw new Error("Keychain has no public key");
90
+ return getTaprootPayment(keychain.publicKey, network);
91
+ }
92
+
93
+ // src/bitcoin.utils.ts
94
+ function initBitcoinAccount(derivationPath, policy) {
95
+ const xpub = extractExtendedPublicKeyFromPolicy(policy);
96
+ const network = inferNetworkFromPath(derivationPath);
97
+ return {
98
+ keychain: HDKey.fromExtendedKey(xpub, getHdKeyVersionsFromNetwork(network)),
99
+ network,
100
+ derivationPath,
101
+ type: inferPaymentTypeFromPath(derivationPath),
102
+ accountIndex: extractAccountIndexFromPath(derivationPath)
103
+ };
104
+ }
105
+ var bitcoinNetworkToCoreNetworkMap = {
106
+ mainnet: "mainnet",
107
+ testnet: "testnet",
108
+ regtest: "testnet",
109
+ signet: "testnet"
110
+ };
111
+ function bitcoinNetworkModeToCoreNetworkMode(mode) {
112
+ return bitcoinNetworkToCoreNetworkMap[mode];
113
+ }
114
+ var coinTypeMap = {
115
+ mainnet: 0,
116
+ testnet: 1
117
+ };
118
+ function getBitcoinCoinTypeIndexByNetwork(network) {
119
+ return coinTypeMap[bitcoinNetworkModeToCoreNetworkMode(network)];
120
+ }
121
+ function deriveAddressIndexKeychainFromAccount(keychain) {
122
+ if (keychain.depth !== DerivationPathDepth2.Account)
123
+ throw new Error("Keychain passed is not an account");
124
+ return (index) => keychain.deriveChild(0).deriveChild(index);
125
+ }
126
+ function deriveAddressIndexZeroFromAccount(keychain) {
127
+ return deriveAddressIndexKeychainFromAccount(keychain)(0);
128
+ }
129
+ var ecdsaPublicKeyLength = 33;
130
+ function ecdsaPublicKeyToSchnorr(pubKey) {
131
+ if (pubKey.byteLength !== ecdsaPublicKeyLength) throw new Error("Invalid public key length");
132
+ return pubKey.slice(1);
133
+ }
134
+ var toXOnly = (pubKey) => pubKey.length === 32 ? pubKey : pubKey.subarray(1, 33);
135
+ function decodeBitcoinTx(tx) {
136
+ return btc2.RawTx.decode(hexToBytes(tx));
137
+ }
138
+ function getAddressFromOutScript(script2, bitcoinNetwork) {
139
+ const outputScript = btc2.OutScript.decode(script2);
140
+ if (outputScript.type === "pk" || outputScript.type === "tr") {
141
+ return btc2.Address(bitcoinNetwork).encode({
142
+ type: outputScript.type,
143
+ pubkey: outputScript.pubkey
144
+ });
145
+ }
146
+ if (outputScript.type === "ms" || outputScript.type === "tr_ms") {
147
+ return btc2.Address(bitcoinNetwork).encode({
148
+ type: outputScript.type,
149
+ pubkeys: outputScript.pubkeys,
150
+ m: outputScript.m
151
+ });
152
+ }
153
+ if (outputScript.type === "tr_ns") {
154
+ return btc2.Address(bitcoinNetwork).encode({
155
+ type: outputScript.type,
156
+ pubkeys: outputScript.pubkeys
157
+ });
158
+ }
159
+ if (outputScript.type === "unknown") {
160
+ return "unknown";
161
+ }
162
+ return btc2.Address(bitcoinNetwork).encode({
163
+ type: outputScript.type,
164
+ hash: outputScript.hash
165
+ });
166
+ }
167
+ var paymentTypeMap = {
168
+ wpkh: "p2wpkh",
169
+ wsh: "p2wpkh-p2sh",
170
+ tr: "p2tr",
171
+ pkh: "p2pkh",
172
+ sh: "p2sh"
173
+ };
174
+ function btcSignerLibPaymentTypeToPaymentTypeMap(payment) {
175
+ return paymentTypeMap[payment];
176
+ }
177
+ function isBtcSignerLibPaymentType(payment) {
178
+ return payment in paymentTypeMap;
179
+ }
180
+ function parseKnownPaymentType(payment) {
181
+ return isBtcSignerLibPaymentType(payment) ? btcSignerLibPaymentTypeToPaymentTypeMap(payment) : payment;
182
+ }
183
+ function whenPaymentType(mode) {
184
+ return (paymentMap) => paymentMap[parseKnownPaymentType(mode)];
185
+ }
186
+ function inferPaymentTypeFromPath(path) {
187
+ if (path.startsWith("m/84")) return "p2wpkh";
188
+ if (path.startsWith("m/86")) return "p2tr";
189
+ if (path.startsWith("m/44")) return "p2pkh";
190
+ throw new Error(`Unable to infer payment type from path=${path}`);
191
+ }
192
+ function inferNetworkFromPath(path) {
193
+ return path.split("/")[2].startsWith("0") ? "mainnet" : "testnet";
194
+ }
195
+ function extractExtendedPublicKeyFromPolicy(policy) {
196
+ return policy.split("]")[1];
197
+ }
198
+ function createWalletIdDecoratedPath(policy, walletId) {
199
+ return policy.split("]")[0].replace("[", "").replace("m", walletId);
200
+ }
201
+ function getHdKeyVersionsFromNetwork(network) {
202
+ return whenNetwork(network)({
203
+ mainnet: void 0,
204
+ testnet: {
205
+ private: 0,
206
+ public: 70617039
207
+ }
208
+ });
209
+ }
210
+ function getBitcoinInputAddress(input, bitcoinNetwork) {
211
+ if (isDefined(input.witnessUtxo))
212
+ return getAddressFromOutScript(input.witnessUtxo.script, bitcoinNetwork);
213
+ if (isDefined(input.nonWitnessUtxo) && isDefined(input.index))
214
+ return getAddressFromOutScript(
215
+ input.nonWitnessUtxo.outputs[input.index]?.script,
216
+ bitcoinNetwork
217
+ );
218
+ return "";
219
+ }
220
+ function getInputPaymentType(input, network) {
221
+ const address2 = getBitcoinInputAddress(input, getBtcSignerLibNetworkConfigByMode(network));
222
+ if (address2 === "") throw new Error("Input address cannot be empty");
223
+ if (address2.startsWith("bc1p") || address2.startsWith("tb1p") || address2.startsWith("bcrt1p"))
224
+ return "p2tr";
225
+ if (address2.startsWith("bc1q") || address2.startsWith("tb1q") || address2.startsWith("bcrt1q"))
226
+ return "p2wpkh";
227
+ throw new Error("Unable to infer payment type from input address");
228
+ }
229
+ function lookUpLedgerKeysByPath(getDerivationPath) {
230
+ return (ledgerKeyMap, network) => (accountIndex) => {
231
+ const path = getDerivationPath(network, accountIndex);
232
+ const account = ledgerKeyMap[path.replace("m", defaultWalletKeyId)];
233
+ if (!account) return;
234
+ return initBitcoinAccount(path, account.policy);
235
+ };
236
+ }
237
+ function getTaprootAddress({ index, keychain, network }) {
238
+ if (!keychain) throw new Error("Expected keychain to be provided");
239
+ if (keychain.depth !== DerivationPathDepth2.Account)
240
+ throw new Error("Expects keychain to be on the account index");
241
+ const addressIndex = deriveAddressIndexKeychainFromAccount(keychain)(index);
242
+ if (!addressIndex.publicKey) {
243
+ throw new Error("Expected publicKey to be defined");
244
+ }
245
+ const payment = getTaprootPayment(addressIndex.publicKey, network);
246
+ if (!payment.address) throw new Error("Expected address to be defined");
247
+ return payment.address;
248
+ }
249
+ function mnemonicToRootNode(secretKey) {
250
+ const seed = mnemonicToSeedSync(secretKey);
251
+ return HDKey.fromMasterSeed(seed);
252
+ }
253
+ function getPsbtTxInputs(psbtTx) {
254
+ const inputsLength = psbtTx.inputsLength;
255
+ const inputs = [];
256
+ for (let i = 0; i < inputsLength; i++) inputs.push(psbtTx.getInput(i));
257
+ return inputs;
258
+ }
259
+ function getPsbtTxOutputs(psbtTx) {
260
+ const outputsLength = psbtTx.outputsLength;
261
+ const outputs = [];
262
+ for (let i = 0; i < outputsLength; i++) outputs.push(psbtTx.getOutput(i));
263
+ return outputs;
264
+ }
265
+
266
+ // src/bip322/bip322-utils.ts
267
+ var bip322MessageTag = "BIP0322-signed-message";
268
+ var ECPair = ECPairFactory(ecc);
269
+ bitcoin.initEccLib(ecc);
270
+ function ecPairFromPrivateKey(key) {
271
+ return ECPair.fromPrivateKey(Buffer.from(key));
272
+ }
273
+ var messageTagHash = Uint8Array.from([
274
+ ...sha256(utf8ToBytes(bip322MessageTag)),
275
+ ...sha256(utf8ToBytes(bip322MessageTag))
276
+ ]);
277
+ function hashBip322Message(message) {
278
+ return sha256(
279
+ Uint8Array.from([...messageTagHash, ...isString(message) ? utf8ToBytes(message) : message])
280
+ );
281
+ }
282
+ var bip322TransactionToSignValues = {
283
+ prevoutHash: hexToBytes2("0000000000000000000000000000000000000000000000000000000000000000"),
284
+ prevoutIndex: 4294967295,
285
+ sequence: 0
286
+ };
287
+ function encodeVarString(b) {
288
+ return Buffer.concat([encode(b.byteLength), b]);
289
+ }
290
+ var supportedMessageSigningPaymentTypes = ["p2wpkh", "p2tr"];
291
+ function isSupportedMessageSigningPaymentType(paymentType) {
292
+ return supportedMessageSigningPaymentTypes.includes(paymentType);
293
+ }
294
+ function encodeMessageWitnessData(witnessArray) {
295
+ const len = encode(witnessArray.length);
296
+ return Buffer.concat([len, ...witnessArray.map((witness) => encodeVarString(witness))]);
297
+ }
298
+ function tapTweakHash(pubKey, h) {
299
+ return bitcoin.crypto.taggedHash("TapTweak", Buffer.concat(h ? [pubKey, h] : [pubKey]));
300
+ }
301
+ function tweakSigner(signer, opts = {}) {
302
+ let privateKey = signer.privateKey;
303
+ if (!privateKey) {
304
+ throw new Error("Private key is required for tweaking signer!");
305
+ }
306
+ if (signer.publicKey[0] === 3) {
307
+ privateKey = ecc.privateNegate(privateKey);
308
+ }
309
+ const tweakedPrivateKey = ecc.privateAdd(
310
+ privateKey,
311
+ tapTweakHash(toXOnly(signer.publicKey), opts.tweakHash)
312
+ );
313
+ if (!tweakedPrivateKey) {
314
+ throw new Error("Invalid tweaked private key!");
315
+ }
316
+ return ECPair.fromPrivateKey(Buffer.from(tweakedPrivateKey), {
317
+ network: opts.network
318
+ });
319
+ }
320
+
321
+ // src/bip322/sign-message-bip322-bitcoinjs.ts
322
+ import { base64 } from "@scure/base";
323
+ import * as bitcoin2 from "bitcoinjs-lib";
324
+ function createNativeSegwitBitcoinJsSigner(privateKey) {
325
+ return ecPairFromPrivateKey(privateKey);
326
+ }
327
+ function createTaprootBitcoinJsSigner(privateKey) {
328
+ return tweakSigner(ecPairFromPrivateKey(privateKey));
329
+ }
330
+ function createToSpendTx(address2, message, network) {
331
+ const { prevoutHash, prevoutIndex, sequence } = bip322TransactionToSignValues;
332
+ const script2 = bitcoin2.address.toOutputScript(
333
+ address2,
334
+ getBitcoinJsLibNetworkConfigByMode(network)
335
+ );
336
+ const hash = hashBip322Message(message);
337
+ const commands = [0, Buffer.from(hash)];
338
+ const scriptSig = bitcoin2.script.compile(commands);
339
+ const virtualToSpend = new bitcoin2.Transaction();
340
+ virtualToSpend.version = 0;
341
+ virtualToSpend.addInput(Buffer.from(prevoutHash), prevoutIndex, sequence, scriptSig);
342
+ virtualToSpend.addOutput(script2, 0);
343
+ return { virtualToSpend, script: script2 };
344
+ }
345
+ function createToSignTx(toSpendTxHex, script2, network) {
346
+ const virtualToSign = new bitcoin2.Psbt({ network: getBitcoinJsLibNetworkConfigByMode(network) });
347
+ virtualToSign.setVersion(0);
348
+ const prevTxHash = toSpendTxHex;
349
+ const prevOutIndex = 0;
350
+ const toSignScriptSig = bitcoin2.script.compile([bitcoin2.script.OPS.OP_RETURN]);
351
+ virtualToSign.addInput({
352
+ hash: prevTxHash,
353
+ index: prevOutIndex,
354
+ sequence: 0,
355
+ witnessUtxo: { script: script2, value: 0 }
356
+ });
357
+ virtualToSign.addOutput({ script: toSignScriptSig, value: 0 });
358
+ return virtualToSign;
359
+ }
360
+ async function signBip322MessageSimple(args) {
361
+ const { address: address2, message, network, signPsbt } = args;
362
+ const { virtualToSpend, script: script2 } = createToSpendTx(address2, message, network);
363
+ const virtualToSign = createToSignTx(virtualToSpend.getHash(), script2, network);
364
+ const signedTx = await signPsbt(virtualToSign);
365
+ const asBitcoinJsTransaction = bitcoin2.Psbt.fromBuffer(Buffer.from(signedTx.toPSBT()));
366
+ asBitcoinJsTransaction.finalizeInput(0);
367
+ const toSignTx = asBitcoinJsTransaction.extractTransaction();
368
+ const result = encodeMessageWitnessData(toSignTx.ins[0].witness);
369
+ return {
370
+ virtualToSpend,
371
+ virtualToSign: toSignTx,
372
+ unencodedSig: result,
373
+ signature: base64.encode(result)
374
+ };
375
+ }
376
+
377
+ // src/p2wpkh-address-gen.ts
378
+ import { HDKey as HDKey2 } from "@scure/bip32";
379
+ import * as btc3 from "@scure/btc-signer";
380
+ import { DerivationPathDepth as DerivationPathDepth3 } from "@leather.io/crypto";
381
+ function getNativeSegwitAccountDerivationPath(network, accountIndex) {
382
+ return `m/84'/${getBitcoinCoinTypeIndexByNetwork(network)}'/${accountIndex}'`;
383
+ }
384
+ function getNativeSegwitAddressIndexDerivationPath(network, accountIndex, addressIndex) {
385
+ return getNativeSegwitAccountDerivationPath(network, accountIndex) + `/0/${addressIndex}`;
386
+ }
387
+ function deriveNativeSegwitAccountFromRootKeychain(keychain, network) {
388
+ if (keychain.depth !== DerivationPathDepth3.Root) throw new Error("Keychain passed is not a root");
389
+ return (accountIndex) => ({
390
+ type: "p2wpkh",
391
+ network,
392
+ accountIndex,
393
+ derivationPath: getNativeSegwitAccountDerivationPath(network, accountIndex),
394
+ keychain: keychain.derive(getNativeSegwitAccountDerivationPath(network, accountIndex))
395
+ });
396
+ }
397
+ function getNativeSegWitPaymentFromAddressIndex(keychain, network) {
398
+ if (keychain.depth !== DerivationPathDepth3.AddressIndex)
399
+ throw new Error("Keychain passed is not an address index");
400
+ if (!keychain.publicKey) throw new Error("Keychain does not have a public key");
401
+ return btc3.p2wpkh(keychain.publicKey, getBtcSignerLibNetworkConfigByMode(network));
402
+ }
403
+ function deriveNativeSegWitReceiveAddressIndex({
404
+ xpub,
405
+ network
406
+ }) {
407
+ if (!xpub) return;
408
+ const keychain = HDKey2.fromExtendedKey(xpub);
409
+ if (!keychain) return;
410
+ const zeroAddressIndex = deriveAddressIndexZeroFromAccount(keychain);
411
+ return getNativeSegWitPaymentFromAddressIndex(zeroAddressIndex, network);
412
+ }
413
+
414
+ // src/p2wsh-p2sh-address-gen.ts
415
+ import { ripemd160 } from "@noble/hashes/ripemd160";
416
+ import { sha256 as sha2562 } from "@noble/hashes/sha256";
417
+ import { base58check } from "@scure/base";
418
+ import { deriveBip39MnemonicFromSeed, deriveRootBip32Keychain } from "@leather.io/crypto";
419
+ var deriveBtcBip49SeedFromMnemonic = deriveBip39MnemonicFromSeed;
420
+ var deriveRootBtcKeychain = deriveRootBip32Keychain;
421
+ function decodeCompressedWifPrivateKey(key) {
422
+ const compressedWifFormatPrivateKey = base58check(sha2562).decode(key);
423
+ return compressedWifFormatPrivateKey.slice(1, compressedWifFormatPrivateKey.length - 1);
424
+ }
425
+ var payToScriptHashMainnetPrefix = 5;
426
+ var payToScriptHashTestnetPrefix = 196;
427
+ var payToScriptHashPrefixMap = {
428
+ mainnet: payToScriptHashMainnetPrefix,
429
+ testnet: payToScriptHashTestnetPrefix
430
+ };
431
+ function hash160(input) {
432
+ return ripemd160(sha2562(input));
433
+ }
434
+ function makePayToScriptHashKeyHash(publicKey) {
435
+ return hash160(publicKey);
436
+ }
437
+ function makePayToScriptHashAddressBytes(keyHash) {
438
+ const redeemScript = Uint8Array.from([
439
+ ...Uint8Array.of(0),
440
+ ...Uint8Array.of(keyHash.length),
441
+ ...keyHash
442
+ ]);
443
+ return hash160(redeemScript);
444
+ }
445
+ function makePayToScriptHashAddress(addressBytes, network) {
446
+ const networkByte = payToScriptHashPrefixMap[network];
447
+ const addressWithPrefix = Uint8Array.from([networkByte, ...addressBytes]);
448
+ return base58check(sha2562).encode(addressWithPrefix);
449
+ }
450
+ function publicKeyToPayToScriptHashAddress(publicKey, network) {
451
+ const hash = makePayToScriptHashKeyHash(publicKey);
452
+ const addrBytes = makePayToScriptHashAddressBytes(hash);
453
+ return makePayToScriptHashAddress(addrBytes, network);
454
+ }
455
+ export {
456
+ bip322TransactionToSignValues,
457
+ bitcoinNetworkModeToCoreNetworkMode,
458
+ bitcoinNetworkToCoreNetworkMap,
459
+ btcSignerLibPaymentTypeToPaymentTypeMap,
460
+ coinTypeMap,
461
+ createNativeSegwitBitcoinJsSigner,
462
+ createTaprootBitcoinJsSigner,
463
+ createToSpendTx,
464
+ createWalletIdDecoratedPath,
465
+ decodeBitcoinTx,
466
+ decodeCompressedWifPrivateKey,
467
+ deriveAddressIndexKeychainFromAccount,
468
+ deriveAddressIndexZeroFromAccount,
469
+ deriveBtcBip49SeedFromMnemonic,
470
+ deriveNativeSegWitReceiveAddressIndex,
471
+ deriveNativeSegwitAccountFromRootKeychain,
472
+ deriveRootBtcKeychain,
473
+ deriveTaprootAccount,
474
+ ecPairFromPrivateKey,
475
+ ecdsaPublicKeyLength,
476
+ ecdsaPublicKeyToSchnorr,
477
+ encodeMessageWitnessData,
478
+ extractExtendedPublicKeyFromPolicy,
479
+ getAddressFromOutScript,
480
+ getBitcoinCoinTypeIndexByNetwork,
481
+ getBitcoinInputAddress,
482
+ getBitcoinJsLibNetworkConfigByMode,
483
+ getBtcSignerLibNetworkConfigByMode,
484
+ getHdKeyVersionsFromNetwork,
485
+ getInputPaymentType,
486
+ getNativeSegWitPaymentFromAddressIndex,
487
+ getNativeSegwitAccountDerivationPath,
488
+ getNativeSegwitAddressIndexDerivationPath,
489
+ getPsbtTxInputs,
490
+ getPsbtTxOutputs,
491
+ getTaprootAccountDerivationPath,
492
+ getTaprootAddress,
493
+ getTaprootAddressIndexDerivationPath,
494
+ getTaprootPayment,
495
+ getTaprootPaymentFromAddressIndex,
496
+ hashBip322Message,
497
+ inferNetworkFromPath,
498
+ inferPaymentTypeFromPath,
499
+ initBitcoinAccount,
500
+ isBtcSignerLibPaymentType,
501
+ isSupportedMessageSigningPaymentType,
502
+ lookUpLedgerKeysByPath,
503
+ makePayToScriptHashAddress,
504
+ makePayToScriptHashAddressBytes,
505
+ makePayToScriptHashKeyHash,
506
+ mnemonicToRootNode,
507
+ parseKnownPaymentType,
508
+ payToScriptHashTestnetPrefix,
509
+ paymentTypeMap,
510
+ publicKeyToPayToScriptHashAddress,
511
+ signBip322MessageSimple,
512
+ toXOnly,
513
+ tweakSigner,
514
+ whenPaymentType
515
+ };
516
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bip322/bip322-utils.ts","../src/bitcoin.utils.ts","../src/bitcoin.network.ts","../src/p2tr-address-gen.ts","../src/bip322/sign-message-bip322-bitcoinjs.ts","../src/p2wpkh-address-gen.ts","../src/p2wsh-p2sh-address-gen.ts"],"sourcesContent":["import ecc from '@bitcoinerlab/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hexToBytes, utf8ToBytes } from '@stacks/common';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport { ECPairFactory } from 'ecpair';\nimport { encode } from 'varuint-bitcoin';\n\nimport { PaymentTypes } from '@leather.io/rpc';\nimport { isString } from '@leather.io/utils';\n\nimport { toXOnly } from '../bitcoin.utils';\n\nconst bip322MessageTag = 'BIP0322-signed-message';\n\nconst ECPair = ECPairFactory(ecc);\nbitcoin.initEccLib(ecc);\n\nexport function ecPairFromPrivateKey(key: Uint8Array) {\n return ECPair.fromPrivateKey(Buffer.from(key));\n}\n\n// See tagged hashes section of BIP-340\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#design\nconst messageTagHash = Uint8Array.from([\n ...sha256(utf8ToBytes(bip322MessageTag)),\n ...sha256(utf8ToBytes(bip322MessageTag)),\n]);\n\nexport function hashBip322Message(message: Uint8Array | string) {\n return sha256(\n Uint8Array.from([...messageTagHash, ...(isString(message) ? utf8ToBytes(message) : message)])\n );\n}\n\nexport const bip322TransactionToSignValues = {\n prevoutHash: hexToBytes('0000000000000000000000000000000000000000000000000000000000000000'),\n prevoutIndex: 0xffffffff,\n sequence: 0,\n};\n\nfunction encodeVarString(b: Buffer) {\n return Buffer.concat([encode(b.byteLength), b]);\n}\n\nconst supportedMessageSigningPaymentTypes: PaymentTypes[] = ['p2wpkh', 'p2tr'];\n\nexport function isSupportedMessageSigningPaymentType(paymentType: string) {\n return supportedMessageSigningPaymentTypes.includes(paymentType as PaymentTypes);\n}\n\n/**\n * Encode witness data for a BIP322 message\n * TODO: Refactor to remove `Buffer` use\n */\nexport function encodeMessageWitnessData(witnessArray: Buffer[]) {\n const len = encode(witnessArray.length);\n return Buffer.concat([len, ...witnessArray.map(witness => encodeVarString(witness))]);\n}\n\nfunction tapTweakHash(pubKey: Buffer, h: Buffer | undefined): Buffer {\n return bitcoin.crypto.taggedHash('TapTweak', Buffer.concat(h ? [pubKey, h] : [pubKey]));\n}\n\nexport function tweakSigner(signer: bitcoin.Signer, opts: any = {}): bitcoin.Signer {\n // @ts-expect-error privateKey exists on signer\n let privateKey: Uint8Array | undefined = signer.privateKey!;\n if (!privateKey) {\n throw new Error('Private key is required for tweaking signer!');\n }\n if (signer.publicKey[0] === 3) {\n privateKey = ecc.privateNegate(privateKey);\n }\n\n const tweakedPrivateKey = ecc.privateAdd(\n privateKey,\n tapTweakHash(toXOnly(signer.publicKey), opts.tweakHash)\n );\n if (!tweakedPrivateKey) {\n throw new Error('Invalid tweaked private key!');\n }\n\n return ECPair.fromPrivateKey(Buffer.from(tweakedPrivateKey), {\n network: opts.network,\n });\n}\n","import { hexToBytes } from '@noble/hashes/utils';\nimport { HDKey, Versions } from '@scure/bip32';\nimport { mnemonicToSeedSync } from '@scure/bip39';\nimport * as btc from '@scure/btc-signer';\nimport { TransactionInput, TransactionOutput } from '@scure/btc-signer/psbt';\n\nimport { DerivationPathDepth, extractAccountIndexFromPath } from '@leather.io/crypto';\nimport { BitcoinNetworkModes, NetworkModes } from '@leather.io/models';\nimport type { PaymentTypes } from '@leather.io/rpc';\nimport { defaultWalletKeyId, isDefined, whenNetwork } from '@leather.io/utils';\n\nimport { BtcSignerNetwork, getBtcSignerLibNetworkConfigByMode } from './bitcoin.network';\nimport { getTaprootPayment } from './p2tr-address-gen';\n\nexport interface BitcoinAccount {\n type: PaymentTypes;\n derivationPath: string;\n keychain: HDKey;\n accountIndex: number;\n network: BitcoinNetworkModes;\n}\nexport function initBitcoinAccount(derivationPath: string, policy: string): BitcoinAccount {\n const xpub = extractExtendedPublicKeyFromPolicy(policy);\n const network = inferNetworkFromPath(derivationPath);\n return {\n keychain: HDKey.fromExtendedKey(xpub, getHdKeyVersionsFromNetwork(network)),\n network,\n derivationPath,\n type: inferPaymentTypeFromPath(derivationPath),\n accountIndex: extractAccountIndexFromPath(derivationPath),\n };\n}\n\n/**\n * Represents a map of `BitcoinNetworkModes` to `NetworkModes`. While Bitcoin\n * has a number of networks, its often only necessary to consider the higher\n * level concepts of mainnet and testnet\n */\nexport const bitcoinNetworkToCoreNetworkMap: Record<BitcoinNetworkModes, NetworkModes> = {\n mainnet: 'mainnet',\n testnet: 'testnet',\n regtest: 'testnet',\n signet: 'testnet',\n};\nexport function bitcoinNetworkModeToCoreNetworkMode(mode: BitcoinNetworkModes) {\n return bitcoinNetworkToCoreNetworkMap[mode];\n}\n\n/**\n * Map representing the \"Coin Type\" section of a derivation path.\n * Consider example below, Coin type is one, thus testnet\n * @example\n * `m/86'/1'/0'/0/0`\n */\nexport const coinTypeMap: Record<NetworkModes, 0 | 1> = {\n mainnet: 0,\n testnet: 1,\n};\n\nexport function getBitcoinCoinTypeIndexByNetwork(network: BitcoinNetworkModes) {\n return coinTypeMap[bitcoinNetworkModeToCoreNetworkMode(network)];\n}\n\nexport function deriveAddressIndexKeychainFromAccount(keychain: HDKey) {\n if (keychain.depth !== DerivationPathDepth.Account)\n throw new Error('Keychain passed is not an account');\n\n return (index: number) => keychain.deriveChild(0).deriveChild(index);\n}\n\nexport function deriveAddressIndexZeroFromAccount(keychain: HDKey) {\n return deriveAddressIndexKeychainFromAccount(keychain)(0);\n}\n\nexport const ecdsaPublicKeyLength = 33;\n\nexport function ecdsaPublicKeyToSchnorr(pubKey: Uint8Array) {\n if (pubKey.byteLength !== ecdsaPublicKeyLength) throw new Error('Invalid public key length');\n return pubKey.slice(1);\n}\n\n// Basically same as above, to remove\nexport const toXOnly = (pubKey: Buffer) => (pubKey.length === 32 ? pubKey : pubKey.subarray(1, 33));\n\nexport function decodeBitcoinTx(tx: string): ReturnType<typeof btc.RawTx.decode> {\n return btc.RawTx.decode(hexToBytes(tx));\n}\n\nexport function getAddressFromOutScript(script: Uint8Array, bitcoinNetwork: BtcSignerNetwork) {\n const outputScript = btc.OutScript.decode(script);\n\n if (outputScript.type === 'pk' || outputScript.type === 'tr') {\n return btc.Address(bitcoinNetwork).encode({\n type: outputScript.type,\n pubkey: outputScript.pubkey,\n });\n }\n if (outputScript.type === 'ms' || outputScript.type === 'tr_ms') {\n return btc.Address(bitcoinNetwork).encode({\n type: outputScript.type,\n pubkeys: outputScript.pubkeys,\n m: outputScript.m,\n });\n }\n if (outputScript.type === 'tr_ns') {\n return btc.Address(bitcoinNetwork).encode({\n type: outputScript.type,\n pubkeys: outputScript.pubkeys,\n });\n }\n if (outputScript.type === 'unknown') {\n return 'unknown';\n }\n return btc.Address(bitcoinNetwork).encode({\n type: outputScript.type,\n hash: outputScript.hash,\n });\n}\n\n/**\n * Payment type identifiers, as described by `@scure/btc-signer` library\n */\nexport type BtcSignerLibPaymentTypeIdentifers = 'wpkh' | 'wsh' | 'tr' | 'pkh' | 'sh';\n\nexport const paymentTypeMap: Record<BtcSignerLibPaymentTypeIdentifers, PaymentTypes> = {\n wpkh: 'p2wpkh',\n wsh: 'p2wpkh-p2sh',\n tr: 'p2tr',\n pkh: 'p2pkh',\n sh: 'p2sh',\n};\n\nexport function btcSignerLibPaymentTypeToPaymentTypeMap(\n payment: BtcSignerLibPaymentTypeIdentifers\n) {\n return paymentTypeMap[payment];\n}\n\nexport function isBtcSignerLibPaymentType(\n payment: string\n): payment is BtcSignerLibPaymentTypeIdentifers {\n return payment in paymentTypeMap;\n}\n\nexport function parseKnownPaymentType(payment: BtcSignerLibPaymentTypeIdentifers | PaymentTypes) {\n return isBtcSignerLibPaymentType(payment)\n ? btcSignerLibPaymentTypeToPaymentTypeMap(payment)\n : payment;\n}\n\nexport type PaymentTypeMap<T> = Record<PaymentTypes, T>;\nexport function whenPaymentType(mode: PaymentTypes | BtcSignerLibPaymentTypeIdentifers) {\n return <T extends unknown>(paymentMap: PaymentTypeMap<T>): T =>\n paymentMap[parseKnownPaymentType(mode)];\n}\n\n/**\n * Infers the Bitcoin payment type from the derivation path.\n * Below we see path has 86 in it, per convention, this refers to taproot payments\n * @example\n * `m/86'/1'/0'/0/0`\n */\nexport function inferPaymentTypeFromPath(path: string): PaymentTypes {\n if (path.startsWith('m/84')) return 'p2wpkh';\n if (path.startsWith('m/86')) return 'p2tr';\n if (path.startsWith('m/44')) return 'p2pkh';\n throw new Error(`Unable to infer payment type from path=${path}`);\n}\n\nexport function inferNetworkFromPath(path: string): NetworkModes {\n return path.split('/')[2].startsWith('0') ? 'mainnet' : 'testnet';\n}\n\nexport function extractExtendedPublicKeyFromPolicy(policy: string) {\n return policy.split(']')[1];\n}\n\nexport function createWalletIdDecoratedPath(policy: string, walletId: string) {\n return policy.split(']')[0].replace('[', '').replace('m', walletId);\n}\n\n// Primarily used to get the correct `Version` when passing Ledger Bitcoin\n// extended public keys to the HDKey constructor\nexport function getHdKeyVersionsFromNetwork(network: NetworkModes) {\n return whenNetwork(network)({\n mainnet: undefined,\n testnet: {\n private: 0x00000000,\n public: 0x043587cf,\n } as Versions,\n });\n}\n\nexport function getBitcoinInputAddress(input: TransactionInput, bitcoinNetwork: BtcSignerNetwork) {\n if (isDefined(input.witnessUtxo))\n return getAddressFromOutScript(input.witnessUtxo.script, bitcoinNetwork);\n if (isDefined(input.nonWitnessUtxo) && isDefined(input.index))\n return getAddressFromOutScript(\n input.nonWitnessUtxo.outputs[input.index]?.script,\n bitcoinNetwork\n );\n return '';\n}\n\nexport function getInputPaymentType(\n input: TransactionInput,\n network: BitcoinNetworkModes\n): PaymentTypes {\n const address = getBitcoinInputAddress(input, getBtcSignerLibNetworkConfigByMode(network));\n if (address === '') throw new Error('Input address cannot be empty');\n if (address.startsWith('bc1p') || address.startsWith('tb1p') || address.startsWith('bcrt1p'))\n return 'p2tr';\n if (address.startsWith('bc1q') || address.startsWith('tb1q') || address.startsWith('bcrt1q'))\n return 'p2wpkh';\n throw new Error('Unable to infer payment type from input address');\n}\n\n// Ledger wallets are keyed by their derivation path. To reuse the look up logic\n// between payment types, this factory fn accepts a fn that generates the path\nexport function lookUpLedgerKeysByPath(\n getDerivationPath: (network: BitcoinNetworkModes, accountIndex: number) => string\n) {\n return (\n ledgerKeyMap: Record<string, { policy: string } | undefined>,\n network: BitcoinNetworkModes\n ) =>\n (accountIndex: number) => {\n const path = getDerivationPath(network, accountIndex);\n // Single wallet mode, hardcoded default walletId\n const account = ledgerKeyMap[path.replace('m', defaultWalletKeyId)];\n if (!account) return;\n return initBitcoinAccount(path, account.policy);\n };\n}\n\nexport interface GetTaprootAddressArgs {\n index: number;\n keychain?: HDKey;\n network: BitcoinNetworkModes;\n}\nexport function getTaprootAddress({ index, keychain, network }: GetTaprootAddressArgs) {\n if (!keychain) throw new Error('Expected keychain to be provided');\n\n if (keychain.depth !== DerivationPathDepth.Account)\n throw new Error('Expects keychain to be on the account index');\n\n const addressIndex = deriveAddressIndexKeychainFromAccount(keychain)(index);\n\n if (!addressIndex.publicKey) {\n throw new Error('Expected publicKey to be defined');\n }\n\n const payment = getTaprootPayment(addressIndex.publicKey, network);\n\n if (!payment.address) throw new Error('Expected address to be defined');\n\n return payment.address;\n}\n\nexport function mnemonicToRootNode(secretKey: string) {\n const seed = mnemonicToSeedSync(secretKey);\n return HDKey.fromMasterSeed(seed);\n}\n\nexport function getPsbtTxInputs(psbtTx: btc.Transaction): TransactionInput[] {\n const inputsLength = psbtTx.inputsLength;\n const inputs: TransactionInput[] = [];\n for (let i = 0; i < inputsLength; i++) inputs.push(psbtTx.getInput(i));\n return inputs;\n}\n\nexport function getPsbtTxOutputs(psbtTx: btc.Transaction): TransactionOutput[] {\n const outputsLength = psbtTx.outputsLength;\n const outputs: TransactionOutput[] = [];\n for (let i = 0; i < outputsLength; i++) outputs.push(psbtTx.getOutput(i));\n return outputs;\n}\n","import * as bitcoinJs from 'bitcoinjs-lib';\n\nimport { BitcoinNetworkModes } from '@leather.io/models';\n\n// See this PR https://github.com/paulmillr/@scure/btc-signer/pull/15\n// Atttempting to add these directly to the library\nexport interface BtcSignerNetwork {\n bech32: string;\n pubKeyHash: number;\n scriptHash: number;\n wif: number;\n}\n\nconst bitcoinMainnet: BtcSignerNetwork = {\n bech32: 'bc',\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n wif: 0x80,\n};\n\nconst bitcoinTestnet: BtcSignerNetwork = {\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n wif: 0xef,\n};\n\nconst bitcoinRegtest: BtcSignerNetwork = {\n bech32: 'bcrt',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n wif: 0xef,\n};\n\nconst btcSignerLibNetworks: Record<BitcoinNetworkModes, BtcSignerNetwork> = {\n mainnet: bitcoinMainnet,\n testnet: bitcoinTestnet,\n regtest: bitcoinRegtest,\n // Signet originally was going to have its own prefix but authors decided to\n // copy testnet\n signet: bitcoinTestnet,\n};\n\nexport function getBtcSignerLibNetworkConfigByMode(network: BitcoinNetworkModes) {\n return btcSignerLibNetworks[network];\n}\n\nconst bitcoinJsLibNetworks: Record<BitcoinNetworkModes, bitcoinJs.Network> = {\n mainnet: bitcoinJs.networks.bitcoin,\n testnet: bitcoinJs.networks.testnet,\n regtest: bitcoinJs.networks.regtest,\n signet: bitcoinJs.networks.testnet,\n};\n\nexport function getBitcoinJsLibNetworkConfigByMode(network: BitcoinNetworkModes) {\n return bitcoinJsLibNetworks[network];\n}\n","import { HDKey } from '@scure/bip32';\nimport * as btc from '@scure/btc-signer';\n\nimport { DerivationPathDepth } from '@leather.io/crypto';\nimport { BitcoinNetworkModes } from '@leather.io/models';\n\nimport { getBtcSignerLibNetworkConfigByMode } from './bitcoin.network';\nimport {\n BitcoinAccount,\n ecdsaPublicKeyToSchnorr,\n getBitcoinCoinTypeIndexByNetwork,\n} from './bitcoin.utils';\n\nexport function getTaprootAccountDerivationPath(\n network: BitcoinNetworkModes,\n accountIndex: number\n) {\n return `m/86'/${getBitcoinCoinTypeIndexByNetwork(network)}'/${accountIndex}'`;\n}\n\nexport function getTaprootAddressIndexDerivationPath(\n network: BitcoinNetworkModes,\n accountIndex: number,\n addressIndex: number\n) {\n return getTaprootAccountDerivationPath(network, accountIndex) + `/0/${addressIndex}`;\n}\n\nexport function deriveTaprootAccount(keychain: HDKey, network: BitcoinNetworkModes) {\n if (keychain.depth !== DerivationPathDepth.Root)\n throw new Error('Keychain passed is not an account');\n\n return (accountIndex: number): BitcoinAccount => ({\n type: 'p2tr',\n network,\n accountIndex,\n derivationPath: getTaprootAccountDerivationPath(network, accountIndex),\n keychain: keychain.derive(getTaprootAccountDerivationPath(network, accountIndex)),\n });\n}\n\nexport function getTaprootPayment(publicKey: Uint8Array, network: BitcoinNetworkModes) {\n return btc.p2tr(\n ecdsaPublicKeyToSchnorr(publicKey),\n undefined,\n getBtcSignerLibNetworkConfigByMode(network)\n );\n}\n\nexport function getTaprootPaymentFromAddressIndex(keychain: HDKey, network: BitcoinNetworkModes) {\n if (keychain.depth !== DerivationPathDepth.AddressIndex)\n throw new Error('Keychain passed is not an address index');\n\n if (!keychain.publicKey) throw new Error('Keychain has no public key');\n\n return getTaprootPayment(keychain.publicKey, network);\n}\n","import { base64 } from '@scure/base';\nimport * as btc from '@scure/btc-signer';\nimport * as bitcoin from 'bitcoinjs-lib';\n\nimport { BitcoinNetworkModes } from '@leather.io/models';\n\nimport { getBitcoinJsLibNetworkConfigByMode } from '../bitcoin.network';\nimport {\n bip322TransactionToSignValues,\n ecPairFromPrivateKey,\n encodeMessageWitnessData,\n hashBip322Message,\n tweakSigner,\n} from './bip322-utils';\n\nexport function createNativeSegwitBitcoinJsSigner(privateKey: Buffer) {\n return ecPairFromPrivateKey(privateKey);\n}\n\nexport function createTaprootBitcoinJsSigner(privateKey: Buffer) {\n return tweakSigner(ecPairFromPrivateKey(privateKey));\n}\n\nexport function createToSpendTx(address: string, message: string, network: BitcoinNetworkModes) {\n const { prevoutHash, prevoutIndex, sequence } = bip322TransactionToSignValues;\n\n const script = bitcoin.address.toOutputScript(\n address,\n getBitcoinJsLibNetworkConfigByMode(network)\n );\n\n const hash = hashBip322Message(message);\n const commands = [0, Buffer.from(hash)];\n const scriptSig = bitcoin.script.compile(commands);\n\n const virtualToSpend = new bitcoin.Transaction();\n virtualToSpend.version = 0;\n virtualToSpend.addInput(Buffer.from(prevoutHash), prevoutIndex, sequence, scriptSig);\n virtualToSpend.addOutput(script, 0);\n return { virtualToSpend, script };\n}\n\nfunction createToSignTx(toSpendTxHex: Buffer, script: Buffer, network: BitcoinNetworkModes) {\n const virtualToSign = new bitcoin.Psbt({ network: getBitcoinJsLibNetworkConfigByMode(network) });\n virtualToSign.setVersion(0);\n const prevTxHash = toSpendTxHex;\n const prevOutIndex = 0;\n const toSignScriptSig = bitcoin.script.compile([bitcoin.script.OPS.OP_RETURN]);\n\n virtualToSign.addInput({\n hash: prevTxHash,\n index: prevOutIndex,\n sequence: 0,\n witnessUtxo: { script, value: 0 },\n });\n\n virtualToSign.addOutput({ script: toSignScriptSig, value: 0 });\n return virtualToSign;\n}\n\ninterface SignBip322MessageSimple {\n address: string;\n message: string;\n network: BitcoinNetworkModes;\n signPsbt(psbt: bitcoin.Psbt): Promise<btc.Transaction>;\n}\nexport async function signBip322MessageSimple(args: SignBip322MessageSimple) {\n const { address, message, network, signPsbt } = args;\n\n const { virtualToSpend, script } = createToSpendTx(address, message, network);\n\n const virtualToSign = createToSignTx(virtualToSpend.getHash(), script, network);\n\n const signedTx = await signPsbt(virtualToSign);\n\n const asBitcoinJsTransaction = bitcoin.Psbt.fromBuffer(Buffer.from(signedTx.toPSBT()));\n\n asBitcoinJsTransaction.finalizeInput(0);\n\n // sign the tx\n // section 5.1\n // github.com/LegReq/bip0322-signatures/blob/master/BIP0322_signing.ipynb\n const toSignTx = asBitcoinJsTransaction.extractTransaction();\n\n const result = encodeMessageWitnessData(toSignTx.ins[0].witness);\n\n return {\n virtualToSpend,\n virtualToSign: toSignTx,\n unencodedSig: result,\n signature: base64.encode(result),\n };\n}\n","import { HDKey } from '@scure/bip32';\nimport * as btc from '@scure/btc-signer';\n\nimport { DerivationPathDepth } from '@leather.io/crypto';\nimport { BitcoinNetworkModes } from '@leather.io/models';\n\nimport { getBtcSignerLibNetworkConfigByMode } from './bitcoin.network';\nimport {\n BitcoinAccount,\n deriveAddressIndexZeroFromAccount,\n getBitcoinCoinTypeIndexByNetwork,\n} from './bitcoin.utils';\n\nexport function getNativeSegwitAccountDerivationPath(\n network: BitcoinNetworkModes,\n accountIndex: number\n) {\n return `m/84'/${getBitcoinCoinTypeIndexByNetwork(network)}'/${accountIndex}'`;\n}\n\nexport function getNativeSegwitAddressIndexDerivationPath(\n network: BitcoinNetworkModes,\n accountIndex: number,\n addressIndex: number\n) {\n return getNativeSegwitAccountDerivationPath(network, accountIndex) + `/0/${addressIndex}`;\n}\n\nexport function deriveNativeSegwitAccountFromRootKeychain(\n keychain: HDKey,\n network: BitcoinNetworkModes\n) {\n if (keychain.depth !== DerivationPathDepth.Root) throw new Error('Keychain passed is not a root');\n return (accountIndex: number): BitcoinAccount => ({\n type: 'p2wpkh',\n network,\n accountIndex,\n derivationPath: getNativeSegwitAccountDerivationPath(network, accountIndex),\n keychain: keychain.derive(getNativeSegwitAccountDerivationPath(network, accountIndex)),\n });\n}\n\nexport function getNativeSegWitPaymentFromAddressIndex(\n keychain: HDKey,\n network: BitcoinNetworkModes\n) {\n if (keychain.depth !== DerivationPathDepth.AddressIndex)\n throw new Error('Keychain passed is not an address index');\n\n if (!keychain.publicKey) throw new Error('Keychain does not have a public key');\n\n return btc.p2wpkh(keychain.publicKey, getBtcSignerLibNetworkConfigByMode(network));\n}\n\ninterface DeriveNativeSegWitReceiveAddressIndexArgs {\n xpub: string;\n network: BitcoinNetworkModes;\n}\nexport function deriveNativeSegWitReceiveAddressIndex({\n xpub,\n network,\n}: DeriveNativeSegWitReceiveAddressIndexArgs) {\n if (!xpub) return;\n const keychain = HDKey.fromExtendedKey(xpub);\n if (!keychain) return;\n const zeroAddressIndex = deriveAddressIndexZeroFromAccount(keychain);\n return getNativeSegWitPaymentFromAddressIndex(zeroAddressIndex, network);\n}\n","import { ripemd160 } from '@noble/hashes/ripemd160';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { base58check } from '@scure/base';\n\nimport { deriveBip39MnemonicFromSeed, deriveRootBip32Keychain } from '@leather.io/crypto';\nimport { NetworkModes } from '@leather.io/models';\n\n/**\n * @deprecated\n * Use `deriveBip39MnemonicFromSeed` from `@leather.io/crypto`\n */\nexport const deriveBtcBip49SeedFromMnemonic = deriveBip39MnemonicFromSeed;\n\n/**\n * @deprecated\n * Use `deriveRootBip32Keychain` from `@leather.io/crypto`\n */\nexport const deriveRootBtcKeychain = deriveRootBip32Keychain;\n\nexport function decodeCompressedWifPrivateKey(key: string) {\n // https://en.bitcoinwiki.org/wiki/Wallet_import_format\n // Decode Compressed WIF format private key\n const compressedWifFormatPrivateKey = base58check(sha256).decode(key);\n // Drop leading network byte, trailing public key SEC format byte\n return compressedWifFormatPrivateKey.slice(1, compressedWifFormatPrivateKey.length - 1);\n}\n\n// https://en.bitcoin.it/wiki/List_of_address_prefixes\nconst payToScriptHashMainnetPrefix = 0x05;\nexport const payToScriptHashTestnetPrefix = 0xc4;\n\nconst payToScriptHashPrefixMap: Record<NetworkModes, number> = {\n mainnet: payToScriptHashMainnetPrefix,\n testnet: payToScriptHashTestnetPrefix,\n};\n\nfunction hash160(input: Uint8Array) {\n return ripemd160(sha256(input));\n}\n\nexport function makePayToScriptHashKeyHash(publicKey: Uint8Array) {\n return hash160(publicKey);\n}\n\nexport function makePayToScriptHashAddressBytes(keyHash: Uint8Array) {\n const redeemScript = Uint8Array.from([\n ...Uint8Array.of(0x00),\n ...Uint8Array.of(keyHash.length),\n ...keyHash,\n ]);\n return hash160(redeemScript);\n}\n\nexport function makePayToScriptHashAddress(addressBytes: Uint8Array, network: NetworkModes) {\n const networkByte = payToScriptHashPrefixMap[network];\n const addressWithPrefix = Uint8Array.from([networkByte, ...addressBytes]);\n return base58check(sha256).encode(addressWithPrefix);\n}\n\nexport function publicKeyToPayToScriptHashAddress(publicKey: Uint8Array, network: NetworkModes) {\n const hash = makePayToScriptHashKeyHash(publicKey);\n const addrBytes = makePayToScriptHashAddressBytes(hash);\n return makePayToScriptHashAddress(addrBytes, network);\n}\n"],"mappings":"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","names":["hexToBytes","btc","DerivationPathDepth","DerivationPathDepth","script","address","hexToBytes","bitcoin","address","script","HDKey","btc","DerivationPathDepth","DerivationPathDepth","HDKey","sha256"]}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@leather.io/bitcoin",
3
+ "author": "Leather.io contact@leather.io",
4
+ "description": "Shared bitcoin utilities",
5
+ "version": "0.8.0",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/leather.io/mono/tree/dev/packages/bitcoin",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git@github.com:leather.io/mono.git",
11
+ "directory": "packages/bitcoin"
12
+ },
13
+ "type": "module",
14
+ "exports": {
15
+ ".": "./dist/index.js"
16
+ },
17
+ "bugs": "https://github.com/leather-io/mono/issues",
18
+ "dependencies": {
19
+ "@bitcoinerlab/secp256k1": "1.0.2",
20
+ "@noble/hashes": "1.4.0",
21
+ "@noble/secp256k1": "2.1.0",
22
+ "@scure/base": "1.1.6",
23
+ "@scure/bip32": "1.4.0",
24
+ "@scure/bip39": "1.3.0",
25
+ "@scure/btc-signer": "1.3.2",
26
+ "@stacks/common": "6.13.0",
27
+ "@stacks/transactions": "6.15.0",
28
+ "bip32": "4.0.0",
29
+ "bitcoinjs-lib": "6.1.5",
30
+ "ecpair": "2.1.0",
31
+ "varuint-bitcoin": "1.1.2",
32
+ "@leather.io/constants": "0.8.0",
33
+ "@leather.io/crypto": "1.0.2",
34
+ "@leather.io/utils": "0.9.0",
35
+ "@leather.io/models": "0.10.0"
36
+ },
37
+ "devDependencies": {
38
+ "@vitest/coverage-istanbul": "0.34.6",
39
+ "eslint": "8.53.0",
40
+ "prettier": "3.3.0",
41
+ "tslib": "2.6.2",
42
+ "tsup": "8.1.0",
43
+ "typescript": "5.4.5",
44
+ "vitest": "0.34.6",
45
+ "@leather.io/eslint-config": "0.6.0",
46
+ "@leather.io/rpc": "2.0.0",
47
+ "@leather.io/tsconfig-config": "0.5.0",
48
+ "@leather.io/prettier-config": "0.5.0"
49
+ },
50
+ "keywords": [
51
+ "bitcoin",
52
+ "leather",
53
+ "leather wallet"
54
+ ],
55
+ "prettier": "@leather.io/prettier-config",
56
+ "publishConfig": {
57
+ "access": "public"
58
+ },
59
+ "scripts": {
60
+ "build": "tsup",
61
+ "build:watch": "tsup --watch",
62
+ "format": "prettier . --write --ignore-path ../../.prettierignore",
63
+ "format:check": "prettier . --check --ignore-path ../../.prettierignore",
64
+ "lint": "eslint . --fix --ignore-path ../../.eslintignore",
65
+ "lint:fix": "eslint . --fix --ignore-path ../../.eslintignore",
66
+ "test:coverage": "vitest run --coverage",
67
+ "test:unit": "vitest run",
68
+ "typecheck": "tsc --noEmit -p ./tsconfig.json"
69
+ }
70
+ }