diff --git a/package.json b/package.json index 3ba42c9..391e915 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@bitgo/sdk-api": "^1.45.1", "@bitgo/sdk-coin-btc": "^2.0.6", "@bitgo/sdk-core": "^26.8.0", + "@ledgerhq/hw-transport-node-hid": "^6.28.6", "@noble/hashes": "^1.4.0", "@scure/base": "^1.1.6", "@scure/btc-signer": "^1.3.1", @@ -41,6 +42,7 @@ "bitcoinjs-lib": "^6.1.5", "decimal.js": "^10.4.3", "dotenv": "^16.4.5", + "ledger-bitcoin": "^0.2.3", "lint": "^0.8.19", "lodash": "^4.17.21", "ls-lint": "^0.1.2", diff --git a/src/constants.ts b/src/constants.ts index d8d3c12..430a47d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,8 +1,8 @@ /** @format */ // test values for the integration tests -export const TEST_BITCOIN_AMOUNT = 0.01; -export const TEST_FEE_AMOUNT = 0.01; +export const TEST_BITCOIN_AMOUNT = 0.001; +export const TEST_FEE_AMOUNT = 0.1; export const TEST_ATTESTOR_PUBLIC_KEY = '4caaf4bb366239b0a8b7a5e5a44d043b5f66ae7364895317af8847ac6fadbd2b'; export const TEST_FEE_PUBLIC_KEY = '03c9fc819e3c26ec4a58639add07f6372e810513f5d3d7374c25c65fdf1aefe4c5'; export const TEST_VAULT_UUID = '0xcf5f227dd384a590362b417153876d9d22b31b2ed1e22065e270b82437cf1880'; diff --git a/src/index.ts b/src/index.ts index ead5ba4..e4b442b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,6 +28,7 @@ import { import { BitGoAddress } from './models.js'; import { getNativeSegwitPublicKeys, getTaprootMultisigScript, getTaprootPublicKeys } from './payment-functions.js'; import { bitcoinToSats } from './utilities.js'; +import { createScripts, testLedger } from './ledger.js'; dotenv.config(); @@ -63,6 +64,69 @@ async function createNativeSegwitAddress(bitGoWallet: Wallet, label: string) { } } +async function createMultisigWallet() { + const { + BITCOIN_NETWORK, + BITGO_ACCESS_TOKEN, + BITGO_WALLET_PASSPHRASE, + BITGO_WALLET_ID, + BITGO_NATIVE_SEGWIT_ADDRESS, + BITGO_TAPROOT_ADDRESS, + USER_XPUB, + BACKUP_XPUB, + BITGO_XPUB, + } = process.env; + + if ( + !BITCOIN_NETWORK || + !BITGO_ACCESS_TOKEN || + !BITGO_WALLET_PASSPHRASE || + !BITGO_WALLET_ID || + !BITGO_NATIVE_SEGWIT_ADDRESS || + !BITGO_TAPROOT_ADDRESS || + !USER_XPUB || + !BACKUP_XPUB || + !BITGO_XPUB + ) { + throw new Error('Please provide all the required Environment Variables.'); + } + + let environmentName: EnvironmentName; + let coinType: string; + let coinInstance: CoinConstructor; + let bitcoinNetwork: Network; + + switch (BITCOIN_NETWORK) { + case 'bitcoin': + environmentName = 'prod'; + coinType = 'btc'; + coinInstance = Btc.createInstance; + bitcoinNetwork = bitcoin; + break; + case 'testnet': + environmentName = 'test'; + coinType = 'tbtc'; + coinInstance = Tbtc.createInstance; + bitcoinNetwork = testnet; + break; + default: + throw new Error('Invalid BITCOIN_NETWORK Value. Please provide either "bitcoin" or "testnet".'); + } + + const attestorGroupXPublicKey = 'xpub43f9a14c790c0b86ce78bec919e96725e56aee8e0a0fdd8138aa7b351930b3c1'; + + let bitGoAPI: BitGoAPI; + try { + bitGoAPI = new BitGoAPI({ accessToken: BITGO_ACCESS_TOKEN, env: environmentName }); + } catch (error) { + throw new Error(`Error while initializing BitGo API: ${error}`); + } + + bitGoAPI.coin(coinType).wallets().generateWallet({ label: 'Test Wallet' }); + + bitGoAPI.register(coinType, coinInstance); +} + async function getBitGoDetails() { const { BITCOIN_NETWORK, @@ -119,6 +183,8 @@ async function getBitGoDetails() { throw new Error(`Error while initializing BitGo API: ${error}`); } + bitGoAPI.coin(coinType).wallets().generateWallet({ label: 'Test Wallet' }); + bitGoAPI.register(coinType, coinInstance); let bitGoWallet: Wallet; @@ -146,141 +212,10 @@ async function getBitGoDetails() { async function main() { try { - const { - bitGoAPI, - bitGoWallet, - bitGoKeyChain, - bitGoWalletPassphrase, - nativeSegwitAddress, - taprootAddress, - userXPUB, - backupXPUB, - bitGoXPUB, - bitcoinNetwork, - } = await getBitGoDetails(); - - console.log(`Current Balance: ${bitGoWallet.balance()}`); - - const { addresses: bitGoAddresses } = await bitGoWallet.addresses(); - - const bitGoNativeSegwitAddress = findBitGoAddress(bitGoAddresses, nativeSegwitAddress); - const bitGoTaprootAddress = findBitGoAddress(bitGoAddresses, taprootAddress); - - // this returns the public keys of the user, backup and bitgo for the native segwit multisig address - const nativeSegwitPublicKeys = getNativeSegwitPublicKeys( - bitGoNativeSegwitAddress, - userXPUB, - backupXPUB, - bitGoXPUB, - bitcoinNetwork - ); - - // this returns the public keys of the user, backup and bitgo for a new taproot multisig address - const taprootPublicKeys = getTaprootPublicKeys(bitGoTaprootAddress, userXPUB, backupXPUB, bitGoXPUB); - - // not sure if this is the correct way to create a taproot multisig address from the public keys - const taprootMultisig = getTaprootMultisigScript(taprootPublicKeys, bitcoinNetwork); - - // this creates a multisig transaction using the user's taproot public key and the attestor group's public key - const multisigTransaction = await createMultisigTransaction( - taprootMultisig.tweakedPubkey, // this is the user's taproot public key - Buffer.from(TEST_ATTESTOR_PUBLIC_KEY, 'hex'), - TEST_VAULT_UUID, - bitcoinNetwork - ); - - if (!multisigTransaction.address) throw new Error('Error while creating Multisig Transaction.'); - - // ### ORIGINAL FUNDING TRANSACTION FLOW ### - - // #1 Create a Funding Transaction to fund the Multisig Transaction - // const fundingTransaction = await createFundingTransaction( - // TEST_BITCOIN_AMOUNT, - // bitcoinNetwork, - // multisigTransaction.address, - // bitGoNativeSegwitAddress.address, - // nativeSegwitPublicKeys, - // TEST_FEE_RATE, - // TEST_FEE_PUBLIC_KEY, - // TEST_FEE_AMOUNT - // ); - - // #2 Sign the Funding Transaction - - // #3 Finalize the Funding Transaction - // const transaction = Transaction.fromPSBT(fundingTransaction); - // transaction.finalize(); - - // #4 Broadcast the Funding Transaction - // const broadcastResponse = await broadcastTransaction(bytesToHex(fundingTransaction)); - - // ### BITGO API FLOW ### - - // #1 Create an Array of Recipients for the Transaction - const feeRecipientAddress = getFeeRecipientAddress(TEST_FEE_PUBLIC_KEY, bitcoinNetwork); - const recipients = [ - { amount: bitcoinToSats(TEST_BITCOIN_AMOUNT), address: multisigTransaction.address }, - { amount: bitcoinToSats(TEST_BITCOIN_AMOUNT * TEST_FEE_AMOUNT), address: feeRecipientAddress }, - ]; - - // #2 Prebuild the Transaction - const transactionPrebuild = await bitGoWallet.prebuildTransaction({ - recipients: recipients, - walletPassphrase: bitGoWalletPassphrase, - }); - - // #3 Sign the Transaction - const signedTransaction = await bitGoWallet.signTransaction({ - txPrebuild: transactionPrebuild, - keychain: bitGoKeyChain[0], - walletPassphrase: bitGoWalletPassphrase, - }); - - const FullySignedTransaction = signedTransaction as FullySignedTransaction; - - // #4 Submit the Transaction - const submitResponse = await bitGoWallet.submitTransaction({ txHex: FullySignedTransaction.txHex }); - - // ### ORIGINAL CLOSING TRANSACTION FLOW ### - - // #1 Create a Closing Transaction - const closingTransaction = await createClosingTransaction( - TEST_BITCOIN_AMOUNT, - bitcoinNetwork, - 'fundingTransactionID', // this is the ID of the funding transaction - multisigTransaction, - bitGoNativeSegwitAddress.address, - TEST_FEE_RATE, - TEST_FEE_PUBLIC_KEY, - TEST_FEE_AMOUNT - ); - - // #2 Sign the Closing Transaction - - // #3 Send the Closing Transaction PSBT to the Attestor Group - - // ### BITGO API FLOW ### - - // #1 Prebuild the Transaction - const closingTransactionPreBuild = await bitGoWallet.prebuildTransaction({ - recipients: [ - { amount: bitcoinToSats(TEST_BITCOIN_AMOUNT), address: bitGoNativeSegwitAddress.address }, - { amount: bitcoinToSats(TEST_BITCOIN_AMOUNT * TEST_FEE_AMOUNT), address: feeRecipientAddress }, - ], - unspents: ['fundingTransactionID:index'], // this is how the unspent can be referenced in the BitGo API - walletPassphrase: bitGoWalletPassphrase, - }); - - // #2 Sign the Transaction - const signedClosingTransaction = await bitGoWallet.signTransaction({ - txPrebuild: transactionPrebuild, - keychain: bitGoKeyChain[0], - walletPassphrase: bitGoWalletPassphrase, - }); - - // #3 Send the Closing Transaction PSBT to the Attestor Group + await testLedger(); + // createScripts(); } catch (error) { - console.error(`Error while running BitGoAPI flow: ${error}`); + throw new Error(`Error running: ${error}`); } } diff --git a/src/ledger.ts b/src/ledger.ts new file mode 100644 index 0000000..35ca5bf --- /dev/null +++ b/src/ledger.ts @@ -0,0 +1,243 @@ +/** @format */ + +import { BitGoAPI } from '@bitgo/sdk-api'; +import Transport from '@ledgerhq/hw-transport-node-hid'; +import { AppClient, DefaultWalletPolicy, WalletPolicy } from 'ledger-bitcoin'; +import { BIP32Factory } from 'bip32'; +import * as ecc from 'tiny-secp256k1'; +import { testnet } from 'bitcoinjs-lib/src/networks.js'; +import { p2wpkh } from 'bitcoinjs-lib/src/payments/p2wpkh.js'; +import { p2tr } from 'bitcoinjs-lib/src/payments/p2tr.js'; +import { Payment, crypto, initEccLib } from 'bitcoinjs-lib'; +import { bytesToHex, randomBytes } from '@noble/hashes/utils'; + +initEccLib(ecc); +const bip32 = BIP32Factory(ecc); + +type BitcoinNetworkName = 'Mainnet' | 'Testnet'; + +const TEST_EXTENDED_PRIVATE_KEY = + 'tprv8ZgxMBicQKsPdUfw7LM946yzMWhPrDtmBpB3R5Czx3u98TB2bXgUnkGQbPrNaQ8VQsbjNYseSsggRETuFExqhHoAoqCbrcpVj8pWShR5eQy'; +const TEST_EXTENDED_PUBLIC_KEY = + 'tpubD6NzVbkrYhZ4Wwhizz1jTWe6vYDL1Z5fm7mphbFJNKhXxwRoDvW4yEtGmWJ6n9JE86wpvQsDpzn5t49uenYStgAqwgmKNjDe1D71TdAjy8o'; + +export function createScripts(): { + nativeSegwitPublicKey: Buffer; + nativeSegwitScript: Payment; + taprootPublicKey: Buffer; + taprootScript: Payment; +} { + const bitcoinNetwork = testnet; + + const seedBytes = randomBytes(32); + console.log('Seed Bytes:', bytesToHex(seedBytes)); + + const node = bip32.fromSeed(Buffer.from(seedBytes), bitcoinNetwork); + + const extendedPrivateKey = node.toBase58(); + console.log('Extended private key:', extendedPrivateKey); + + const extendedPublicKey = node.neutered().toBase58(); + console.log('Extended public key:', extendedPublicKey); + + const nativeSegwitPublicKey = node.derivePath("m/48'/1'/0'/2'").publicKey; + console.log('derivation path:', "m/48'/1'/0'/2'"); + console.log('Native Segwit Public key:', bytesToHex(nativeSegwitPublicKey)); + + const nativeSegwitScript = p2wpkh({ pubkey: nativeSegwitPublicKey, network: bitcoinNetwork }); + console.log('Native Segwit Script:', nativeSegwitScript.address); + + const taprootPublicKey = node.derivePath("m/48'/1'/0'/2").publicKey; + const childNode = node.derivePath("48'/1'/0'/2"); + console.log('derivation path:', "m/48'/1'/0'/2"); + console.log('Taproot Public key:', bytesToHex(taprootPublicKey)); + + const taprootScript = p2tr({ pubkey: taprootPublicKey.subarray(1), network: bitcoinNetwork }); + console.log('Taproot Script:', taprootScript.address); + + return { nativeSegwitPublicKey, nativeSegwitScript, taprootPublicKey, taprootScript }; +} + +export function getScripts(): { + masterFingerPrint: string; + extendedPrivateKey: string; + extendedPublicKey: string; + nativeSegwitPublicKeyBuffer: Buffer; + nativeSegwitScript: Payment; + taprootPublicKeyBuffer: Buffer; + taprootScript: Payment; +} { + const bitcoinNetwork = testnet; + + const extendedPrivateKey = TEST_EXTENDED_PRIVATE_KEY; + const extendedPublicKey = TEST_EXTENDED_PUBLIC_KEY; + + const node = bip32.fromBase58(extendedPrivateKey, bitcoinNetwork); + const masterFingerPrint = node.fingerprint.toString('hex'); + console.log('Master Fingerprint', masterFingerPrint); + + const nativeSegwitPublicKey = '03f78d72404f69d1a51dd0a7d9678ad4bc996a4aaa6209754e851178bb88114ebe'; + const nativeSegwitPublicKeyBuffer = Buffer.from(nativeSegwitPublicKey, 'hex'); + + const taprootPublicKey = '031659fc866efa6444657305c60b44e3695045e19dde669658a41a11b7b44f72ec'; + const taprootPublicKeyBuffer = Buffer.from(taprootPublicKey, 'hex'); + + const nativeSegwitScript = p2wpkh({ pubkey: nativeSegwitPublicKeyBuffer, network: bitcoinNetwork }); + console.log('Native Segwit Script:', nativeSegwitScript); + + const taprootScript = p2tr({ pubkey: taprootPublicKeyBuffer.subarray(1), network: bitcoinNetwork }); + console.log('Taproot Script:', taprootScript); + + return { + masterFingerPrint, + extendedPrivateKey, + extendedPublicKey, + nativeSegwitPublicKeyBuffer, + nativeSegwitScript, + taprootPublicKeyBuffer, + taprootScript, + }; +} + +export async function main(transport: any) { + const bitcoinNetworkName: BitcoinNetworkName = 'Testnet'; + + // ==> Create a new instance of the AppClient + const ledgerApp = new AppClient(transport); + + // ==> Get the master key fingerprint + const fpr = await ledgerApp.getMasterFingerprint(); + + // ==> Get and display on screet the first native segwit address + const ledgerFirstNativeSegwitAccountPubkey = await ledgerApp.getExtendedPubkey("m/84'/1'/0'"); + const ledgerFirstNativeSegwitAccountPolicy = new DefaultWalletPolicy( + 'wpkh(@0/**)', + `[${fpr}/84'/1'/0']${ledgerFirstNativeSegwitAccountPubkey}` + ); + + const ledgerFirstNativeSegwitAccountAddress = await ledgerApp.getWalletAddress( + ledgerFirstNativeSegwitAccountPolicy, + null, + 0, + 0, + true // show address on the wallet's screen + ); + + console.log(`[Ledger][${bitcoinNetworkName}] Native Segwit Address:',${ledgerFirstNativeSegwitAccountAddress}`); + + // ==> Get and display on screen the first taproot address + const ledgerFirstTaprootAccountPubkey = await ledgerApp.getExtendedPubkey("m/86'/1'/0'"); + const ledgerFirstTaprootAccountPolicy = new DefaultWalletPolicy( + 'tr(@0/**)', + `[${fpr}/86'/1'/0']${ledgerFirstTaprootAccountPubkey}` + ); + + const ledgerFirstTaprootAccountAddress = await ledgerApp.getWalletAddress( + ledgerFirstTaprootAccountPolicy, + null, + 0, + 0, + true // show address on the wallet's screen + ); + + console.log(`[Ledger][${bitcoinNetworkName}] Taproot Address:',${ledgerFirstTaprootAccountAddress}`); + + const { + masterFingerPrint, + extendedPrivateKey, + extendedPublicKey, + nativeSegwitPublicKeyBuffer, + nativeSegwitScript, + taprootPublicKeyBuffer, + taprootScript, + } = getScripts(); + + // ==> Try to register a native segwit multisig wallet ########################################################## + const ledgerExtendedPublicKeyNativeSegwit = await ledgerApp.getExtendedPubkey("m/48'/1'/0'/2'"); + + const ledgerKeyInfo = `[${fpr}/48'/1'/0'/2']${ledgerExtendedPublicKeyNativeSegwit}`; + const externalKeyInfo = `[${masterFingerPrint}/48'/1'/0'/2']${extendedPublicKey}`; + + console.log(`[Ledger][${bitcoinNetworkName}] Ledger Key Info: ${ledgerKeyInfo}`); + console.log(`[Ledger][${bitcoinNetworkName}] External Key Info: ${externalKeyInfo}`); + + const multisigPolicy = new WalletPolicy( + 'Attestor Native Segwit Multisig Test Wallet', + 'wsh(sortedmulti(2,@0/**,@1/**))', // a 2-of-2 multisig policy template + [ledgerKeyInfo, externalKeyInfo] + ); + + const [policyId, policyHmac] = await ledgerApp.registerWallet(multisigPolicy); + + console.log(`Policy hmac: ${policyHmac.toString('hex')}. Store it safely (together with the policy).`); + + console.assert(policyId.compare(multisigPolicy.getId()) == 0); // should never fail + + const multisigAddress = await ledgerApp.getWalletAddress(multisigPolicy, policyHmac, 0, 0, true); + console.log(`Taproot Multisig Wallet Address: ${multisigAddress}`); + + // ######################################################################################################### + + // ==> Try to register a taproot multisig wallet ########################################################## + // const ledgerExtendedPublicKey = await ledgerApp.getExtendedPubkey("m/48'/1'/0'/2'"); + // const ledgerDerivedPublicKey = bip32.fromBase58(ledgerExtendedPublicKey, testnet).publicKey.toString('hex'); + + // const externalDerivedPublicKey = bip32 + // .fromBase58(extendedPrivateKey, testnet) + // .derivePath("m/48'/1'/0'/2'") + // .neutered() + // .publicKey.toString('hex'); + + // console.log(`[Ledger][${bitcoinNetworkName}] Ledger Key Info: ${ledgerDerivedPublicKey}`); + // console.log(`[Ledger][${bitcoinNetworkName}] External Key Info: ${externalDerivedPublicKey}`); + + // const multisigPolicy = new WalletPolicy( + // 'Attestor Taproot Multisig Test Wallet', + // 'tr(c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5,sortedmulti_a(2,@0/**,@1/**))', // a 2-of-2 multisig policy template + // [ledgerDerivedPublicKey, externalDerivedPublicKey] + // ); + + // const [policyId, policyHmac] = await ledgerApp.registerWallet(multisigPolicy); + + // console.log(`Policy hmac: ${policyHmac.toString('hex')}. Store it safely (together with the policy).`); + + // console.assert(policyId.compare(multisigPolicy.getId()) == 0); // should never fail + + // const multisigAddress = await ledgerApp.getWalletAddress(multisigPolicy, policyHmac, 0, 0, true); + // console.log(`Taproot Multisig Wallet Address: ${multisigAddress}`); + + // ######################################################################################################### + + // ==> Sign a psbt + + // TODO: set a wallet policy and a valid psbt file in order to test psbt signing + // const psbt = + // '70736274ff010071020000000111b61619d08730f0cf8b5de372cd7ca44f054e045b4ecea02f96712176f420650000000000ffffffff021027000000000000160014f28ec1a3e3df0240b98582ca7754e6948e9bf9308ad00e0000000000160014050d6838a98c0118a3c0c9f6b29113a92786d11b000000000001012b40420f0000000000225120e75653f5ff98c7599371c2281d0bdb779a3226f6965597341ffd7df5002884712215c1b8324240b1e45eaf38372905f0ce78e68eeb0a396989e9b5501fcef67da9e7b94520dc544c17af0887dfc8ca9936755c9fdef0c79bbc8866cd69bf120c71509742d2ad200c0bf55fa1ab72462467b973b13e556b07d2fdd8d7a30cdfc10f337e23c7ac00acc0011720b8324240b1e45eaf38372905f0ce78e68eeb0a396989e9b5501fcef67da9e7b901182020903c29de21211eef47fd1b0940f7ab462d46c518087261ceb7bb2d00810001000000'; // a base64-encoded psbt, or a binary psbt in a Buffer + // const signingPolicy = firstTaprootAccountPolicy; // an instance of WalletPolicy + // const signingPolicyHmac = null; // if not a default wallet policy, this must also be set + // if (!psbt || !signingPolicy) { + // console.log('Nothing to sign :('); + // await transport.close(); + // return; + // } + + // const psbtBuffer = Buffer.from(psbt, 'hex'); + + // result will be a list of triples [i, partialSig], where: + // - i is the input index + // - partialSig is an instance of PartialSignature; it contains a pubkey and a signature, + // and it might contain a tapleaf_hash. + // const result = await app.signPsbt(psbtBuffer, signingPolicy, signingPolicyHmac); + + // console.log('Returned signatures:'); + // console.log(result); + + // await transport.close(); +} + +export async function testLedger() { + Transport.default + .create() + .then((transport) => main(transport)) + .catch(console.error); +} diff --git a/src/payment-functions.ts b/src/payment-functions.ts index e3399ba..375dba9 100644 --- a/src/payment-functions.ts +++ b/src/payment-functions.ts @@ -2,8 +2,8 @@ import { p2ms, p2tr, p2tr_ns, p2wpkh, p2wsh } from '@scure/btc-signer'; import { BIP32Factory } from 'bip32'; -import { Network } from 'bitcoinjs-lib'; import * as ecc from 'tiny-secp256k1'; +import { Network } from 'bitcoinjs-lib'; import { DERIVATION_PATH_NATIVE_SEGWIT_FROM_CHILD, DERIVATION_PATH_NATIVE_SEGWIT_FROM_MASTER, diff --git a/yarn.lock b/yarn.lock index fea1493..c0c5b9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,6 +29,32 @@ dependencies: regenerator-runtime "^0.14.0" +"@bitcoinerlab/descriptors@^1.0.2": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@bitcoinerlab/descriptors/-/descriptors-1.1.1.tgz#0d1a828cea66c51ebc9863d3e5c43c4ffcde2fe5" + integrity sha512-AMFkbBBg9T1iWtEmWB23oADk7zaOQix6wUPLXalhTyFDjhkFXDd6pCRfto/HAdaPg/ccM4GMTVgYLee9WdYFyQ== + dependencies: + "@bitcoinerlab/miniscript" "^1.2.1" + "@bitcoinerlab/secp256k1" "^1.0.5" + bip32 "^4.0.0" + bitcoinjs-lib "^6.1.3" + ecpair "^2.1.0" + +"@bitcoinerlab/miniscript@^1.2.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@bitcoinerlab/miniscript/-/miniscript-1.4.0.tgz#9beda21d4dadb1cb806de6f846470927cfd96f6c" + integrity sha512-BsG3dmwQmgKHnRZecDgUsPjwcpnf1wgaZbolcMTByS10k1zYzIx97W51LzG7GvokRJ+wnzTX/GhC8Y3L2X0CQA== + dependencies: + bip68 "^1.0.4" + +"@bitcoinerlab/secp256k1@^1.0.5": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@bitcoinerlab/secp256k1/-/secp256k1-1.1.1.tgz#938305c30505b67b15f3de53627bc9d8b4cc7680" + integrity sha512-uhjW51WfVLpnHN7+G0saDcM/k9IqcyTbZ+bDgLF3AX8V/a3KXSE9vn7UPBrcdU72tp0J4YPR7BHp2m7MLAZ/1Q== + dependencies: + "@noble/hashes" "^1.1.5" + "@noble/secp256k1" "^1.7.1" + "@bitgo/abstract-utxo@^8.0.6": version "8.0.6" resolved "https://registry.yarnpkg.com/@bitgo/abstract-utxo/-/abstract-utxo-8.0.6.tgz#89f1ff4aa72bd6dd5fafcab9ed04d0e6373a04cb" @@ -368,6 +394,61 @@ resolved "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz" integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== +"@ledgerhq/devices@^8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.3.0.tgz#a1e1a21608e162fb3a512f57863bf9842b29493f" + integrity sha512-h5Scr+yIae8yjPOViCHLdMjpqn4oC2Whrsq8LinRxe48LEGMdPqSV1yY7+3Ch827wtzNpMv+/ilKnd8rY+rTlg== + dependencies: + "@ledgerhq/errors" "^6.16.4" + "@ledgerhq/logs" "^6.12.0" + rxjs "^7.8.1" + semver "^7.3.5" + +"@ledgerhq/errors@^6.16.4": + version "6.16.4" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.16.4.tgz#a38baffe8b096d9fff3ad839cadb55704c8d8e7b" + integrity sha512-M57yFaLYSN+fZCX0E0zUqOmrV6eipK+s5RhijHoUNlHUqrsvUz7iRQgpd5gRgHB5VkIjav7KdaZjKiWGcHovaQ== + +"@ledgerhq/hw-transport-node-hid-noevents@^6.29.6": + version "6.29.6" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.29.6.tgz#a328bdde245283f3ca3b82ffa19f7f31b745a22d" + integrity sha512-H1cGC4TLwSCxve3rbV7qfPJBZfy7VD7k9Czc9HOMDwQ9zHFtaoeiIotIMGjzHjfPtAGauMpAYvrpmEdBBX5sHg== + dependencies: + "@ledgerhq/devices" "^8.3.0" + "@ledgerhq/errors" "^6.16.4" + "@ledgerhq/hw-transport" "^6.30.6" + "@ledgerhq/logs" "^6.12.0" + node-hid "^2.1.2" + +"@ledgerhq/hw-transport-node-hid@^6.28.6": + version "6.28.6" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.28.6.tgz#8a62d1aaf4d62c53639e42171078a082d7cdda50" + integrity sha512-USSTOO0zv9XtguWismP7/StnNS/s7Rz0JOGGaBhKe3Bzl7d5XPncUlmOvoNFzzY/QdasEoFs2QId1+ibJG71Vw== + dependencies: + "@ledgerhq/devices" "^8.3.0" + "@ledgerhq/errors" "^6.16.4" + "@ledgerhq/hw-transport" "^6.30.6" + "@ledgerhq/hw-transport-node-hid-noevents" "^6.29.6" + "@ledgerhq/logs" "^6.12.0" + lodash "^4.17.21" + node-hid "^2.1.2" + usb "2.9.0" + +"@ledgerhq/hw-transport@^6.20.0", "@ledgerhq/hw-transport@^6.30.6": + version "6.30.6" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.30.6.tgz#c6d84672ac4828f311831998f4101ea205215a6d" + integrity sha512-fT0Z4IywiuJuZrZE/+W0blkV5UCotDPFTYKLkKCLzYzuE6javva7D/ajRaIeR+hZ4kTmKF4EqnsmDCXwElez+w== + dependencies: + "@ledgerhq/devices" "^8.3.0" + "@ledgerhq/errors" "^6.16.4" + "@ledgerhq/logs" "^6.12.0" + events "^3.3.0" + +"@ledgerhq/logs@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.12.0.tgz#ad903528bf3687a44da435d7b2479d724d374f5d" + integrity sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA== + "@noble/curves@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" @@ -375,7 +456,7 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/hashes@1.4.0", "@noble/hashes@^1.2.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": +"@noble/hashes@1.4.0", "@noble/hashes@^1.1.5", "@noble/hashes@^1.2.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== @@ -385,6 +466,11 @@ resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== +"@noble/secp256k1@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -559,6 +645,11 @@ "@types/cookiejar" "*" "@types/node" "*" +"@types/w3c-web-usb@^1.0.6": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz#cf89cccd2d93b6245e784c19afe0a9f5038d4528" + integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ== + "@typescript-eslint/eslint-plugin@7.7.0": version "7.7.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz" @@ -865,6 +956,11 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + basic-ftp@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" @@ -924,6 +1020,13 @@ bignumber.js@^9.0.2, bignumber.js@^9.1.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bip174@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bip174/-/bip174-2.1.1.tgz#ef3e968cf76de234a546962bcf572cc150982f9f" @@ -934,6 +1037,11 @@ bip174@^2.1.1: resolved "https://registry.yarnpkg.com/@bitgo-forks/bip174/-/bip174-3.1.0-master.4.tgz#0c8a750cc98097120169e753e7fccc23b1cb9eaa" integrity sha512-WDRNzPSdJGDqQNqfN+L5KHNHFDmNOPYnUnT7NkEkfHWn5m1jSOfcf8Swaslt5P0xcSDiERdN2gZxFc6XtOqRYg== +bip32-path@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/bip32-path/-/bip32-path-0.4.2.tgz#5db0416ad6822712f077836e2557b8697c0c7c99" + integrity sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ== + bip32@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/bip32/-/bip32-3.1.0.tgz#ce90e020d0e6b41e891a0122ff053efabcce1ccc" @@ -956,12 +1064,17 @@ bip32@^4.0.0: typeforce "^1.11.5" wif "^2.0.6" +bip68@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bip68/-/bip68-1.0.4.tgz#78a95c7a43fad183957995cc2e08d79b0c372c4d" + integrity sha512-O1htyufFTYy3EO0JkHg2CLykdXEtV2ssqw47Gq9A0WByp662xpJnMEB9m43LZjsSDjIAOozWRExlFQk2hlV1XQ== + bitcoin-ops@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz#e45de620398e22fd4ca6023de43974ff42240278" integrity sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow== -bitcoinjs-lib@^6.0.0, bitcoinjs-lib@^6.1.5: +bitcoinjs-lib@^6.0.0, bitcoinjs-lib@^6.1.3, bitcoinjs-lib@^6.1.5: version "6.1.5" resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-6.1.5.tgz#3b03509ae7ddd80a440f10fc38c4a97f0a028d8c" integrity sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ== @@ -1001,6 +1114,15 @@ bitcoinjs-lib@^6.0.0, bitcoinjs-lib@^6.1.5: secp256k1 "5.0.0" varuint-bitcoin "^1.0.1" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" @@ -1145,6 +1267,14 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -1218,6 +1348,11 @@ chardet@^0.7.0: resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1469,6 +1604,18 @@ decimal.js@^10.4.3: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -1509,6 +1656,11 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -1584,6 +1736,15 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecpair@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ecpair/-/ecpair-2.1.0.tgz#673f826b1d80d5eb091b8e2010c6b588e8d2cb45" + integrity sha512-cL/mh3MtJutFOvFc27GPZE2pWL3a3k4YvzUWEOvilnfZVlH3Jwgx/7d6tlD7/75tNk8TG2m+7Kgtz0SI1tWcqw== + dependencies: + randombytes "^2.1.0" + typeforce "^1.18.0" + wif "^2.0.6" + "ecpair@npm:@bitgo/ecpair@2.1.0-rc.0": version "2.1.0-rc.0" resolved "https://registry.yarnpkg.com/@bitgo/ecpair/-/ecpair-2.1.0-rc.0.tgz#e281da5cc616cfd2b3c4f845d64c33deea7ebbaa" @@ -1616,6 +1777,13 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" @@ -1866,6 +2034,11 @@ ethereumjs-util@7.1.5: ethereum-cryptography "^0.1.3" rlp "^2.2.4" +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -1874,6 +2047,11 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" @@ -1974,6 +2152,11 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -2088,6 +2271,11 @@ fp-ts@^2.12.2: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.5.tgz#d79b97168aeafcf9612f18bbc017f513ecb20ac9" integrity sha512-N8T8PwMSeTKKtkm9lkj/zSTAnPC/aJIIrQhnHxxkL0KLsRCNUPANksJOlMXxcKKCo7H1ORP3No9EMD+fP0tsdA== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz" @@ -2145,6 +2333,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-all@^3.1.0: version "3.3.1" resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.3.1.tgz#6be2d5d8276902319f640fbf839fbe15b35e7667" @@ -2347,6 +2540,11 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" @@ -2383,6 +2581,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@^6.1.0: version "6.5.2" resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" @@ -2593,6 +2796,17 @@ keyv@^4.5.3, keyv@^4.5.4: dependencies: json-buffer "3.0.1" +ledger-bitcoin@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ledger-bitcoin/-/ledger-bitcoin-0.2.3.tgz#9954f4464f1f439e393d228ae477ad86573d023b" + integrity sha512-sWdvMTR5CkebNlM0Mam9ROdpsD7Y4087kj4cbIaCCq8IXShCQ44vE3j0wTmt+sHp13eETgY63OWN1rkuIfMfuQ== + dependencies: + "@bitcoinerlab/descriptors" "^1.0.2" + "@bitcoinerlab/secp256k1" "^1.0.5" + "@ledgerhq/hw-transport" "^6.20.0" + bip32-path "^0.4.2" + bitcoinjs-lib "^6.1.3" + levn@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" @@ -2682,16 +2896,11 @@ lodash.merge@^4.6.0, lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@~4.17.21: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@~4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz" @@ -2800,6 +3009,11 @@ mimic-fn@^1.0.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2831,11 +3045,16 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -2898,6 +3117,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -2929,11 +3153,23 @@ noble@^1.9.1: bplist-parser "0.0.6" xpc-connection "~0.1.4" +node-abi@^3.3.0: + version "3.62.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" + integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== + dependencies: + semver "^7.3.5" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^3.0.2: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + node-addon-api@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" @@ -2944,11 +3180,25 @@ node-addon-api@^5.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: +node-addon-api@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0, node-gyp-build@^4.5.0: version "4.8.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== +node-hid@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.2.0.tgz#33e039e7530a7bfe2b7a25f0a2f9496af8b02236" + integrity sha512-vj48zh9j555DZzUhMc8tk/qw6xPFrDyPBH1ST1Z/hWaA/juBJw7IuSxPeOgpzNFNU36mGYj+THioRMt1xOdm/g== + dependencies: + bindings "^1.5.0" + node-addon-api "^3.0.2" + prebuild-install "^7.1.1" + nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" @@ -2964,7 +3214,7 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -3172,6 +3422,24 @@ postcss@^8.3.11: picocolors "^1.0.0" source-map-js "^1.2.0" +prebuild-install@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.1.2, prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -3255,6 +3523,14 @@ psl@^1.1.28: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" @@ -3284,6 +3560,16 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-is@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" @@ -3302,7 +3588,7 @@ readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3494,7 +3780,7 @@ secrets.js-grempe@^1.1.0: resolved "https://registry.yarnpkg.com/secrets.js-grempe/-/secrets.js-grempe-1.1.0.tgz#bb3b606dd68637ca244681a10fdee6c512049294" integrity sha512-OsbpZUFTjvQPKHpseAbFPY82U3mVNP4G3WSbJiDtMLjzwsV52MTdc6rTwIooIkg3klf5eCrg62ZuGIz5GaW02A== -semver@^7.3.6, semver@^7.3.7, semver@^7.5.4, semver@^7.6.0: +semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -3563,6 +3849,20 @@ signal-exit@^3.0.2: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-git@^3.15.0: version "3.24.0" resolved "https://registry.npmjs.org/simple-git/-/simple-git-3.24.0.tgz" @@ -3732,6 +4032,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + superagent@3.8.3, superagent@^3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" @@ -3799,6 +4104,27 @@ synckit@^0.8.6: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tcomb@~3.2.29: version "3.2.29" resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c" @@ -3987,6 +4313,15 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +usb@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/usb/-/usb-2.9.0.tgz#8ae3b175f93bee559400bff33491eee63406b6a2" + integrity sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw== + dependencies: + "@types/w3c-web-usb" "^1.0.6" + node-addon-api "^6.0.0" + node-gyp-build "^4.5.0" + usb@^1.1.0: version "1.9.2" resolved "https://registry.yarnpkg.com/usb/-/usb-1.9.2.tgz#fb6b36f744ecc707a196c45a6ec72442cb6f2b73"