From 4930f7ac14ca7050c77bb46448340300116e81ab Mon Sep 17 00:00:00 2001 From: Otto Allmendinger Date: Mon, 13 Oct 2025 10:07:38 +0200 Subject: [PATCH 1/3] feat(secp256k1): export factory functions Export ECPairFactory and BIP32Factory to support reuse of factories with different ecc implementations. Issue: BTC-2668 Co-authored-by: llm-git --- modules/secp256k1/src/index.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/secp256k1/src/index.ts b/modules/secp256k1/src/index.ts index fb1aa6a129..7eafbdb717 100644 --- a/modules/secp256k1/src/index.ts +++ b/modules/secp256k1/src/index.ts @@ -176,4 +176,16 @@ const ECPair: ECPairAPI = ECPairFactory(ecc); const bip32: BIP32API = BIP32Factory(ecc); const musig: MuSig = MuSigFactory(crypto); -export { ecc, ECPair, ECPairAPI, ECPairInterface, bip32, BIP32API, BIP32Interface, musig, MuSig }; +export { + ecc, + ECPair, + ECPairAPI, + ECPairFactory, + ECPairInterface, + bip32, + BIP32API, + BIP32Factory, + BIP32Interface, + musig, + MuSig, +}; From b1ae0fc7e52b83677e228a236b4f8e0844fd9b6f Mon Sep 17 00:00:00 2001 From: Otto Allmendinger Date: Fri, 10 Oct 2025 16:38:25 +0200 Subject: [PATCH 2/3] feat(abstract-utxo): use secp256k1 for bip32 operations Replace uses of `utxo-lib` bip32 functionality with direct imports from `@bitgo/secp256k1`. This change maintains compatibility while using the preferred library for BIP32 operations. Issue: BTC-2668 Co-authored-by: llm-git --- modules/abstract-utxo/package.json | 1 + modules/abstract-utxo/src/abstractUtxoCoin.ts | 6 +++--- modules/abstract-utxo/src/descriptor/builder/parse.ts | 5 ++--- .../src/descriptor/createWallet/createDescriptorWallet.ts | 6 +++--- modules/abstract-utxo/src/keychains.ts | 8 ++++---- .../src/offlineVault/OfflineVaultHalfSigned.ts | 4 ++-- .../src/offlineVault/OfflineVaultSignable.ts | 8 ++++---- modules/abstract-utxo/src/recovery/crossChainRecovery.ts | 2 +- .../src/transaction/fixedScript/explainTransaction.ts | 5 +++-- .../src/transaction/fixedScript/signTransaction.ts | 3 ++- modules/abstract-utxo/src/transaction/signTransaction.ts | 2 +- modules/abstract-utxo/src/verifyKey.ts | 2 +- modules/utxo-core/package.json | 1 + modules/utxo-core/src/bip32utils.ts | 2 +- modules/utxo-core/src/descriptor/psbt/sign.ts | 4 ++-- modules/utxo-core/src/testutil/descriptor/descriptors.ts | 2 +- modules/utxo-core/src/testutil/key.utils.ts | 4 ++-- modules/utxo-core/test/bip32utils.ts | 3 ++- modules/utxo-core/test/paygo/psbt/payGoAddressProof.ts | 3 ++- 19 files changed, 38 insertions(+), 33 deletions(-) diff --git a/modules/abstract-utxo/package.json b/modules/abstract-utxo/package.json index d8f8af1572..f64210b2a4 100644 --- a/modules/abstract-utxo/package.json +++ b/modules/abstract-utxo/package.json @@ -42,6 +42,7 @@ ] }, "dependencies": { + "@bitgo/secp256k1": "^1.5.0", "@bitgo/blockapis": "^1.12.0", "@bitgo/sdk-api": "^1.70.1", "@bitgo/sdk-core": "^36.12.0", diff --git a/modules/abstract-utxo/src/abstractUtxoCoin.ts b/modules/abstract-utxo/src/abstractUtxoCoin.ts index a258c44eb7..d3368f686e 100644 --- a/modules/abstract-utxo/src/abstractUtxoCoin.ts +++ b/modules/abstract-utxo/src/abstractUtxoCoin.ts @@ -3,7 +3,8 @@ import { randomBytes } from 'crypto'; import _ from 'lodash'; import * as utxolib from '@bitgo/utxo-lib'; -import { bip32, bitgo, getMainnet, isMainnet, isTestnet } from '@bitgo/utxo-lib'; +import { bip32 } from '@bitgo/secp256k1'; +import { bitgo, getMainnet, isMainnet, isTestnet } from '@bitgo/utxo-lib'; import { AddressCoinSpecific, AddressTypeChainMismatchError, @@ -46,7 +47,6 @@ import { Wallet, isValidPrv, isValidXprv, - bitcoin, } from '@bitgo/sdk-core'; import { @@ -1160,7 +1160,7 @@ export abstract class AbstractUtxoCoin extends BaseCoin { throw new Error('invalid private key'); } if (publicKey) { - const genPubKey = bitcoin.HDNode.fromBase58(prv).neutered().toBase58(); + const genPubKey = bip32.fromBase58(prv).neutered().toBase58(); if (genPubKey !== publicKey) { throw new Error('public key does not match private key'); } diff --git a/modules/abstract-utxo/src/descriptor/builder/parse.ts b/modules/abstract-utxo/src/descriptor/builder/parse.ts index 8b6a120693..ca5c6f8fbc 100644 --- a/modules/abstract-utxo/src/descriptor/builder/parse.ts +++ b/modules/abstract-utxo/src/descriptor/builder/parse.ts @@ -1,5 +1,4 @@ -import { BIP32Interface } from '@bitgo/utxo-lib'; -import * as utxolib from '@bitgo/utxo-lib'; +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; import { Descriptor } from '@bitgo/wasm-miniscript'; import { DescriptorBuilder, getDescriptorFromBuilder } from './builder'; @@ -55,7 +54,7 @@ function parseMulti(node: unknown): { }); return { threshold, - keys: keyWithPath.map((k) => utxolib.bip32.fromBase58(k.xpub)), + keys: keyWithPath.map((k) => bip32.fromBase58(k.xpub)), path: paths[0], }; } diff --git a/modules/abstract-utxo/src/descriptor/createWallet/createDescriptorWallet.ts b/modules/abstract-utxo/src/descriptor/createWallet/createDescriptorWallet.ts index a6aeefdea7..a98320fee2 100644 --- a/modules/abstract-utxo/src/descriptor/createWallet/createDescriptorWallet.ts +++ b/modules/abstract-utxo/src/descriptor/createWallet/createDescriptorWallet.ts @@ -1,5 +1,5 @@ import { BitGoAPI } from '@bitgo/sdk-api'; -import * as utxolib from '@bitgo/utxo-lib'; +import { bip32 } from '@bitgo/secp256k1'; import { Wallet } from '@bitgo/sdk-core'; import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; @@ -56,12 +56,12 @@ export async function createDescriptorWalletWithWalletPassphrase( if (!userKeychain.prv) { throw new Error('Missing private key'); } - const userKey = utxolib.bip32.fromBase58(userKeychain.prv); + const userKey = bip32.fromBase58(userKeychain.prv); const cosigners = [backupKeychain, bitgoKeychain].map((keychain) => { if (!keychain.pub) { throw new Error('Missing public key'); } - return utxolib.bip32.fromBase58(keychain.pub); + return bip32.fromBase58(keychain.pub); }); return createDescriptorWallet(bitgo, coin, { ...params, diff --git a/modules/abstract-utxo/src/keychains.ts b/modules/abstract-utxo/src/keychains.ts index b23d08dd40..e0e945063e 100644 --- a/modules/abstract-utxo/src/keychains.ts +++ b/modules/abstract-utxo/src/keychains.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import * as t from 'io-ts'; -import * as utxolib from '@bitgo/utxo-lib'; +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; import { IRequestTracer, IWallet, KeyIndices, promiseProps, Triple } from '@bitgo/sdk-core'; import { AbstractUtxoCoin } from './abstractUtxoCoin'; @@ -48,12 +48,12 @@ export function toKeychainTriple(keychains: UtxoNamedKeychains): Triple | Triple -): Triple { +): Triple { if (Array.isArray(keychains)) { return keychains.map((keychain: { pub: string } | string) => { const v = typeof keychain === 'string' ? keychain : keychain.pub; - return utxolib.bip32.fromBase58(v); - }) as Triple; + return bip32.fromBase58(v); + }) as Triple; } return toBip32Triple(toKeychainTriple(keychains)); diff --git a/modules/abstract-utxo/src/offlineVault/OfflineVaultHalfSigned.ts b/modules/abstract-utxo/src/offlineVault/OfflineVaultHalfSigned.ts index a53206b8f4..e7c8d624e8 100644 --- a/modules/abstract-utxo/src/offlineVault/OfflineVaultHalfSigned.ts +++ b/modules/abstract-utxo/src/offlineVault/OfflineVaultHalfSigned.ts @@ -1,5 +1,5 @@ +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; import * as utxolib from '@bitgo/utxo-lib'; -import { BIP32Interface } from '@bitgo/utxo-lib'; import { BaseCoin } from '@bitgo/sdk-core'; import { getNetworkFromChain } from '../names'; @@ -23,7 +23,7 @@ export function createHalfSigned( ): OfflineVaultHalfSigned { const network = getNetworkFromChain(coin); if (typeof prv === 'string') { - prv = utxolib.bip32.fromBase58(prv); + prv = bip32.fromBase58(prv); } prv = BaseCoin.deriveKeyWithSeedBip32(prv, derivationId).key; if (!OfflineVaultSignable.is(tx)) { diff --git a/modules/abstract-utxo/src/offlineVault/OfflineVaultSignable.ts b/modules/abstract-utxo/src/offlineVault/OfflineVaultSignable.ts index e3fcc4fb89..da7108997c 100644 --- a/modules/abstract-utxo/src/offlineVault/OfflineVaultSignable.ts +++ b/modules/abstract-utxo/src/offlineVault/OfflineVaultSignable.ts @@ -1,4 +1,4 @@ -import * as utxolib from '@bitgo/utxo-lib'; +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; import { Triple } from '@bitgo/sdk-core'; import * as t from 'io-ts'; @@ -28,8 +28,8 @@ export type OfflineVaultUnsigned = t.TypeOf; type WithXpub = { xpub: string }; type NamedKeys = { user: WithXpub; backup: WithXpub; bitgo: WithXpub }; -export function toKeyTriple(xpubs: NamedKeys): Triple { +export function toKeyTriple(xpubs: NamedKeys): Triple { return [xpubs.user.xpub, xpubs.backup.xpub, xpubs.bitgo.xpub].map((xpub) => - utxolib.bip32.fromBase58(xpub) - ) as Triple; + bip32.fromBase58(xpub) + ) as Triple; } diff --git a/modules/abstract-utxo/src/recovery/crossChainRecovery.ts b/modules/abstract-utxo/src/recovery/crossChainRecovery.ts index 2a1c36e0e5..a09eccebbc 100644 --- a/modules/abstract-utxo/src/recovery/crossChainRecovery.ts +++ b/modules/abstract-utxo/src/recovery/crossChainRecovery.ts @@ -1,5 +1,5 @@ import * as utxolib from '@bitgo/utxo-lib'; -import { bip32, BIP32Interface } from '@bitgo/utxo-lib'; +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; import { Dimensions } from '@bitgo/unspents'; import { BitGoBase, IWallet, Keychain, Triple, Wallet } from '@bitgo/sdk-core'; import { decrypt } from '@bitgo/sdk-api'; diff --git a/modules/abstract-utxo/src/transaction/fixedScript/explainTransaction.ts b/modules/abstract-utxo/src/transaction/fixedScript/explainTransaction.ts index 21130ea2d6..ac568931f7 100644 --- a/modules/abstract-utxo/src/transaction/fixedScript/explainTransaction.ts +++ b/modules/abstract-utxo/src/transaction/fixedScript/explainTransaction.ts @@ -1,6 +1,7 @@ import * as utxolib from '@bitgo/utxo-lib'; import { bip322 } from '@bitgo/utxo-core'; -import { bip32, BIP32Interface, bitgo } from '@bitgo/utxo-lib'; +import { BIP32Interface, bip32 } from '@bitgo/secp256k1'; +import { bitgo } from '@bitgo/utxo-lib'; import { Triple } from '@bitgo/sdk-core'; import * as utxocore from '@bitgo/utxo-core'; @@ -302,7 +303,7 @@ export function explainPsbt sum + getNewSignatureCountForInput(signatures), 0); } -type Key = Buffer | utxolib.BIP32Interface | utxolib.ECPairInterface; +type Key = Buffer | BIP32Interface | ECPairInterface; /** Convenience function to sign a PSBT with a key */ export function signWithKey(psbt: WasmPsbt, key: Key): SignPsbtResult { diff --git a/modules/utxo-core/src/testutil/descriptor/descriptors.ts b/modules/utxo-core/src/testutil/descriptor/descriptors.ts index 09144f8ecd..21a58501bf 100644 --- a/modules/utxo-core/src/testutil/descriptor/descriptors.ts +++ b/modules/utxo-core/src/testutil/descriptor/descriptors.ts @@ -1,7 +1,7 @@ import assert from 'assert'; +import { bip32, BIP32Interface } from '@bitgo/secp256k1'; import { Miniscript, Descriptor, ast } from '@bitgo/wasm-miniscript'; -import { bip32, BIP32Interface } from '@bitgo/utxo-lib'; import { DescriptorMap, PsbtParams } from '../../descriptor'; import { getKeyTriple, Triple, KeyTriple } from '../key.utils'; diff --git a/modules/utxo-core/src/testutil/key.utils.ts b/modules/utxo-core/src/testutil/key.utils.ts index e526099dce..ebea557b74 100644 --- a/modules/utxo-core/src/testutil/key.utils.ts +++ b/modules/utxo-core/src/testutil/key.utils.ts @@ -1,7 +1,7 @@ import * as crypto from 'crypto'; +import { bip32, BIP32Interface } from '@bitgo/secp256k1'; import * as utxolib from '@bitgo/utxo-lib'; -import { BIP32Interface } from '@bitgo/utxo-lib'; export type Triple = [T, T, T]; @@ -13,7 +13,7 @@ export type KeyTriple = Triple; */ export function getKey(seed?: string): BIP32Interface { const finalSeed = seed === undefined ? crypto.randomBytes(32) : crypto.createHash('sha256').update(seed).digest(); - return utxolib.bip32.fromSeed(finalSeed); + return bip32.fromSeed(finalSeed); } /** diff --git a/modules/utxo-core/test/bip32utils.ts b/modules/utxo-core/test/bip32utils.ts index 0f5b94b088..f322eb013a 100644 --- a/modules/utxo-core/test/bip32utils.ts +++ b/modules/utxo-core/test/bip32utils.ts @@ -1,6 +1,7 @@ import * as crypto from 'crypto'; import * as assert from 'assert'; +import { bip32 } from '@bitgo/secp256k1'; import * as utxolib from '@bitgo/utxo-lib'; import { signMessage, verifyMessage } from '../src/bip32utils'; @@ -10,7 +11,7 @@ describe('bip32utils', function () { return Array.from({ length }).map((_, i) => crypto.createHash('sha256').update(`${i}`).digest()); } it('signMessage/verifyMessage', function () { - const keys = getSeedBuffers(4).map((seed) => utxolib.bip32.fromSeed(seed)); + const keys = getSeedBuffers(4).map((seed) => bip32.fromSeed(seed)); const messages = ['hello', 'goodbye', Buffer.from('\x01\x02\x03'), Buffer.from('')]; keys.forEach((key) => { messages.forEach((message) => { diff --git a/modules/utxo-core/test/paygo/psbt/payGoAddressProof.ts b/modules/utxo-core/test/paygo/psbt/payGoAddressProof.ts index 1bd8518f78..15ecc1aff3 100644 --- a/modules/utxo-core/test/paygo/psbt/payGoAddressProof.ts +++ b/modules/utxo-core/test/paygo/psbt/payGoAddressProof.ts @@ -1,6 +1,7 @@ import assert from 'assert'; import crypto from 'crypto'; +import { bip32 } from '@bitgo/secp256k1'; import * as utxolib from '@bitgo/utxo-lib'; import { decodeProprietaryKey } from 'bip174/src/lib/proprietaryKeyVal'; import { KeyValue } from 'bip174/src/lib/interfaces'; @@ -19,7 +20,7 @@ import { NIL_UUID } from '../../../src/paygo/attestation'; // To construct our PSBTs export const network = utxolib.networks.bitcoin; -const keys = [1, 2, 3].map((v) => utxolib.bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), network)); +const keys = [1, 2, 3].map((v) => bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), network)); const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]); // PSBT INPUTS AND OUTPUTS From ceed183bf78e70816c05801091e56eb936d9e03b Mon Sep 17 00:00:00 2001 From: Otto Allmendinger Date: Fri, 10 Oct 2025 17:38:00 +0200 Subject: [PATCH 3/3] feat(utxo-lib): use @bitgo/secp256k1 instead of internal noble_ecc Replace internal noble_ecc wrapper with direct imports from @bitgo/secp256k1. This removes redundant code while maintaining the same functionality. Deprecated exports are preserved for backward compatibility. Issue: BTC-2668 Co-authored-by: llm-git --- modules/utxo-lib/package.json | 7 +- modules/utxo-lib/src/bitgo/Musig2.ts | 2 +- modules/utxo-lib/src/bitgo/UtxoPsbt.ts | 2 +- modules/utxo-lib/src/bitgo/keyutil.ts | 3 +- .../utxo-lib/src/bitgo/legacysafe/index.ts | 2 +- modules/utxo-lib/src/bitgo/outputScripts.ts | 2 +- modules/utxo-lib/src/bitgo/signature.ts | 5 +- modules/utxo-lib/src/bitgo/wallet/Psbt.ts | 2 +- .../utxo-lib/src/bitgo/wallet/WalletKeys.ts | 2 +- .../src/bitgo/wallet/WalletUnspentSigner.ts | 2 +- .../src/bitgo/wallet/psbt/PsbtOutputs.ts | 2 +- .../src/bitgo/wallet/psbt/RootNodes.ts | 3 +- modules/utxo-lib/src/index.ts | 19 +- modules/utxo-lib/src/noble_ecc.ts | 178 ------------------ modules/utxo-lib/src/payments/p2tr.ts | 10 +- modules/utxo-lib/src/taproot.ts | 2 +- .../src/templates/taprootnofn/output.ts | 2 +- modules/utxo-lib/src/testutil/keys.ts | 3 +- modules/utxo-lib/src/testutil/mock.ts | 9 +- modules/utxo-lib/src/transaction_builder.ts | 2 +- modules/utxo-lib/test/bitgo/keyutil.ts | 3 +- .../utxo-lib/test/bitgo/psbt/Musig2Util.ts | 3 +- .../test/bitgo/psbt/SignVerifyPsbtAndTx.ts | 2 +- modules/utxo-lib/test/bitgo/signature.ts | 2 +- .../utxo-lib/test/bitgo/signatureModify.ts | 3 +- .../generate/outputScripts.util.ts | 2 +- .../test/integration_local_rpc/parse.ts | 2 +- modules/utxo-lib/test/taproot.spec.ts | 4 +- modules/utxo-lib/test/transaction_util.ts | 2 +- 29 files changed, 49 insertions(+), 233 deletions(-) delete mode 100644 modules/utxo-lib/src/noble_ecc.ts diff --git a/modules/utxo-lib/package.json b/modules/utxo-lib/package.json index be80d24c22..534fd3df6c 100644 --- a/modules/utxo-lib/package.json +++ b/modules/utxo-lib/package.json @@ -47,19 +47,14 @@ ], "dependencies": { "@bitgo/blake2b": "^3.2.4", + "@bitgo/secp256k1": "^1.5.0", "@brandonblack/musig": "^0.0.1-alpha.0", - "@noble/curves": "1.8.1", - "@noble/secp256k1": "1.6.3", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", - "bip32": "^3.0.1", "bitcoin-ops": "^1.3.0", "bitcoinjs-lib": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.11", "bs58check": "^2.1.2", "cashaddress": "^1.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ecpair": "npm:@bitgo/ecpair@2.1.0-rc.0", "fastpriorityqueue": "^0.7.1", "typeforce": "^1.11.3", "varuint-bitcoin": "^1.1.2" diff --git a/modules/utxo-lib/src/bitgo/Musig2.ts b/modules/utxo-lib/src/bitgo/Musig2.ts index 80314308cf..23e922c7f5 100644 --- a/modules/utxo-lib/src/bitgo/Musig2.ts +++ b/modules/utxo-lib/src/bitgo/Musig2.ts @@ -7,7 +7,7 @@ import { checkXOnlyPublicKey, toXOnlyPublicKey, } from './outputScripts'; -import { ecc, musig } from '../noble_ecc'; +import { ecc, musig } from '@bitgo/secp256k1'; import { Tuple } from './types'; import { calculateTapTweak, tapTweakPubkey } from '../taproot'; import { Transaction } from '../index'; diff --git a/modules/utxo-lib/src/bitgo/UtxoPsbt.ts b/modules/utxo-lib/src/bitgo/UtxoPsbt.ts index f2438b6174..fa37aa25ac 100644 --- a/modules/utxo-lib/src/bitgo/UtxoPsbt.ts +++ b/modules/utxo-lib/src/bitgo/UtxoPsbt.ts @@ -10,9 +10,9 @@ import { import { checkForInput } from 'bip174/src/lib/utils'; import { BufferWriter, varuint } from 'bitcoinjs-lib/src/bufferutils'; import { SessionKey } from '@brandonblack/musig'; -import { BIP32Factory, BIP32Interface } from 'bip32'; import * as bs58check from 'bs58check'; import { decodeProprietaryKey, encodeProprietaryKey } from 'bip174/src/lib/proprietaryKeyVal'; +import { BIP32Factory, BIP32Interface } from '@bitgo/secp256k1'; import { taproot, diff --git a/modules/utxo-lib/src/bitgo/keyutil.ts b/modules/utxo-lib/src/bitgo/keyutil.ts index d92fc7a1a2..da2b0a4ea6 100644 --- a/modules/utxo-lib/src/bitgo/keyutil.ts +++ b/modules/utxo-lib/src/bitgo/keyutil.ts @@ -1,7 +1,6 @@ -import { ECPairInterface } from 'ecpair'; import * as bs58check from 'bs58check'; import { Network } from '../networks'; -import { bip32, ECPair } from '../noble_ecc'; +import { bip32, ECPair, ECPairInterface } from '@bitgo/secp256k1'; /** * Create an ECPair from the raw private key bytes diff --git a/modules/utxo-lib/src/bitgo/legacysafe/index.ts b/modules/utxo-lib/src/bitgo/legacysafe/index.ts index 24ce4dac3a..f65e020645 100644 --- a/modules/utxo-lib/src/bitgo/legacysafe/index.ts +++ b/modules/utxo-lib/src/bitgo/legacysafe/index.ts @@ -5,7 +5,7 @@ * */ import * as assert from 'assert'; -import { ecc as eccLib } from '../../noble_ecc'; +import { ecc as eccLib } from '@bitgo/secp256k1'; import { isBitcoin, Network } from '../../networks'; import { isTriple } from '../types'; import * as bitcoinjs from 'bitcoinjs-lib'; diff --git a/modules/utxo-lib/src/bitgo/outputScripts.ts b/modules/utxo-lib/src/bitgo/outputScripts.ts index 2f9b9aa212..831beade3e 100644 --- a/modules/utxo-lib/src/bitgo/outputScripts.ts +++ b/modules/utxo-lib/src/bitgo/outputScripts.ts @@ -7,7 +7,7 @@ import * as taproot from '../taproot'; import { isTriple, Triple, Tuple } from './types'; -import { ecc as eccLib } from '../noble_ecc'; +import { ecc as eccLib } from '@bitgo/secp256k1'; import { getDepthFirstTaptree, getTweakedOutputKey } from '../taproot'; export { scriptTypeForChain } from './wallet/chains'; diff --git a/modules/utxo-lib/src/bitgo/signature.ts b/modules/utxo-lib/src/bitgo/signature.ts index 100b948302..680319ac97 100644 --- a/modules/utxo-lib/src/bitgo/signature.ts +++ b/modules/utxo-lib/src/bitgo/signature.ts @@ -1,6 +1,5 @@ -import { BIP32Interface } from 'bip32'; - import { Transaction, taproot, TxOutput, ScriptSignature } from 'bitcoinjs-lib'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { UtxoTransaction } from './UtxoTransaction'; import { UtxoTransactionBuilder } from './UtxoTransactionBuilder'; @@ -15,7 +14,7 @@ import { } from './outputScripts'; import { Triple } from './types'; import { getMainnet, Network, networks } from '../networks'; -import { ecc as eccLib } from '../noble_ecc'; +import { ecc as eccLib } from '@bitgo/secp256k1'; import { parseSignatureScript2Of3 } from './parseInput'; import { getTaprootOutputKey } from '../taproot'; diff --git a/modules/utxo-lib/src/bitgo/wallet/Psbt.ts b/modules/utxo-lib/src/bitgo/wallet/Psbt.ts index 5a2bad2c4a..ef6ff7b32b 100644 --- a/modules/utxo-lib/src/bitgo/wallet/Psbt.ts +++ b/modules/utxo-lib/src/bitgo/wallet/Psbt.ts @@ -2,8 +2,8 @@ import * as assert from 'assert'; import { GlobalXpub, PartialSig, PsbtInput, TapScriptSig } from 'bip174/src/lib/interfaces'; import { checkForInput } from 'bip174/src/lib/utils'; -import { BIP32Interface } from 'bip32'; import * as bs58check from 'bs58check'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { UtxoPsbt } from '../UtxoPsbt'; import { Psbt } from '../../'; import { UtxoTransaction } from '../UtxoTransaction'; diff --git a/modules/utxo-lib/src/bitgo/wallet/WalletKeys.ts b/modules/utxo-lib/src/bitgo/wallet/WalletKeys.ts index 875750ab78..f76f742f90 100644 --- a/modules/utxo-lib/src/bitgo/wallet/WalletKeys.ts +++ b/modules/utxo-lib/src/bitgo/wallet/WalletKeys.ts @@ -9,7 +9,7 @@ * Since we never use other derivations for utxo address scripts, the classes defined here only * allow exactly one level of derivation. */ -import { BIP32Interface } from 'bip32'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { Triple } from '../types'; diff --git a/modules/utxo-lib/src/bitgo/wallet/WalletUnspentSigner.ts b/modules/utxo-lib/src/bitgo/wallet/WalletUnspentSigner.ts index 82e5cc4d9d..d3e186f386 100644 --- a/modules/utxo-lib/src/bitgo/wallet/WalletUnspentSigner.ts +++ b/modules/utxo-lib/src/bitgo/wallet/WalletUnspentSigner.ts @@ -1,4 +1,4 @@ -import { BIP32Interface } from 'bip32'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { DerivedWalletKeys, eqPublicKey, RootWalletKeys, WalletKeys } from './WalletKeys'; import { Triple } from '../types'; diff --git a/modules/utxo-lib/src/bitgo/wallet/psbt/PsbtOutputs.ts b/modules/utxo-lib/src/bitgo/wallet/psbt/PsbtOutputs.ts index 92d34dfd69..299adefeaf 100644 --- a/modules/utxo-lib/src/bitgo/wallet/psbt/PsbtOutputs.ts +++ b/modules/utxo-lib/src/bitgo/wallet/psbt/PsbtOutputs.ts @@ -5,9 +5,9 @@ import { isBufferArray, Triple } from '../../types'; import { createOutputScript2of3, scriptTypes2Of3 } from '../../outputScripts'; import { UtxoPsbt } from '../../UtxoPsbt'; -import { BIP32Interface } from 'bip32'; import { checkForOutput } from 'bip174/src/lib/utils'; import { PsbtOutput } from 'bip174/src/lib/interfaces'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { getSortedRootNodes } from './RootNodes'; /** diff --git a/modules/utxo-lib/src/bitgo/wallet/psbt/RootNodes.ts b/modules/utxo-lib/src/bitgo/wallet/psbt/RootNodes.ts index 95a8bd73d3..ff0f8b5c35 100644 --- a/modules/utxo-lib/src/bitgo/wallet/psbt/RootNodes.ts +++ b/modules/utxo-lib/src/bitgo/wallet/psbt/RootNodes.ts @@ -7,8 +7,7 @@ import * as bs58check from 'bs58check'; import { UtxoPsbt } from '../../UtxoPsbt'; import { isTriple, Triple } from '../../types'; -import { BIP32Factory, BIP32Interface } from 'bip32'; -import { ecc as eccLib } from '../../../noble_ecc'; +import { BIP32Factory, BIP32Interface, ecc as eccLib } from '@bitgo/secp256k1'; import { ParsedScriptType2Of3 } from '../../parseInput'; import { Network } from '../../../networks'; import { createOutputScript2of3 } from '../../outputScripts'; diff --git a/modules/utxo-lib/src/index.ts b/modules/utxo-lib/src/index.ts index 1383bd6515..acf0535137 100644 --- a/modules/utxo-lib/src/index.ts +++ b/modules/utxo-lib/src/index.ts @@ -14,7 +14,24 @@ export * as taproot from './taproot'; export * as testutil from './testutil'; -export * from './noble_ecc'; +import { bip32, BIP32API, BIP32Interface, ecc, ECPair, ECPairInterface, ECPairAPI } from '@bitgo/secp256k1'; + +export { + // @deprecated use import { bip32 } from '@bitgo/secp256k1' instead + bip32, + // @deprecated use import { BIP32API } from '@bitgo/secp256k1' instead + BIP32API, + // @deprecated use import { BIP32Interface } from '@bitgo/secp256k1' instead + BIP32Interface, + // @deprecated use import { ecc } from '@bitgo/secp256k1' instead + ecc, + // @deprecated use import { ECPair } from '@bitgo/secp256k1' instead + ECPair, + // @deprecated use import { ECPairAPI } from '@bitgo/secp256k1' instead + ECPairAPI, + // @deprecated use import { ECPairInterface } from '@bitgo/secp256k1' instead + ECPairInterface, +}; export * as p2trPayments from './payments'; diff --git a/modules/utxo-lib/src/noble_ecc.ts b/modules/utxo-lib/src/noble_ecc.ts deleted file mode 100644 index 4e97e1a3f8..0000000000 --- a/modules/utxo-lib/src/noble_ecc.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { ECPairAPI, ECPairFactory, ECPairInterface } from 'ecpair'; -import * as necc from '@noble/secp256k1'; -import { BIP32API, BIP32Factory, BIP32Interface } from 'bip32'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore base_crypto is exported as a subPath export, ignoring since compiler complains about importing like this -import * as baseCrypto from '@brandonblack/musig/base_crypto'; -import { MuSig, MuSigFactory } from '@brandonblack/musig'; -const createHmac = require('create-hmac'); -const createHash = require('create-hash'); - -necc.utils.sha256Sync = (...messages: Uint8Array[]): Uint8Array => { - const sha256 = createHash('sha256'); - for (const message of messages) sha256.update(message); - return sha256.digest(); -}; - -necc.utils.hmacSha256Sync = (key: Uint8Array, ...messages: Uint8Array[]): Uint8Array => { - const hash = createHmac('sha256', Buffer.from(key)); - messages.forEach((m) => hash.update(m)); - return Uint8Array.from(hash.digest()); -}; - -const defaultTrue = (param?: boolean): boolean => param !== false; - -function throwToNull(fn: () => Type): Type | null { - try { - return fn(); - } catch (e) { - return null; - } -} - -function isPoint(p: Uint8Array, xOnly: boolean): boolean { - if ((p.length === 32) !== xOnly) return false; - try { - return !!necc.Point.fromHex(p); - } catch (e) { - return false; - } -} - -function toBigInt(b: Uint8Array | Buffer): bigint { - const buff = Buffer.from(b); - if (buff.length !== 32) { - throw new Error('Invalid size ${buff.length}'); - } - return BigInt(`0x${buff.toString('hex')}`); -} - -const ecc = { - isPoint: (p: Uint8Array): boolean => isPoint(p, false), - isPrivate: (d: Uint8Array): boolean => necc.utils.isValidPrivateKey(d), - isXOnlyPoint: (p: Uint8Array): boolean => isPoint(p, true), - - xOnlyPointAddTweak: (p: Uint8Array, tweak: Uint8Array): { parity: 0 | 1; xOnlyPubkey: Uint8Array } | null => - throwToNull(() => { - const P = necc.utils.pointAddScalar(p, tweak, true); - const parity = P[0] % 2 === 1 ? 1 : 0; - return { parity, xOnlyPubkey: P.slice(1) }; - }), - - pointFromScalar: (sk: Uint8Array, compressed?: boolean): Uint8Array | null => - throwToNull(() => necc.getPublicKey(sk, defaultTrue(compressed))), - - pointCompress: (p: Uint8Array, compressed?: boolean): Uint8Array => { - return necc.Point.fromHex(p).toRawBytes(defaultTrue(compressed)); - }, - - pointMultiply: (a: Uint8Array, tweak: Uint8Array, compressed?: boolean): Uint8Array | null => - throwToNull(() => necc.utils.pointMultiply(a, tweak, defaultTrue(compressed))), - - pointAdd: (a: Uint8Array, b: Uint8Array, compressed?: boolean): Uint8Array | null => - throwToNull(() => { - const A = necc.Point.fromHex(a); - const B = necc.Point.fromHex(b); - return A.add(B).toRawBytes(defaultTrue(compressed)); - }), - - pointAddScalar: (p: Uint8Array, tweak: Uint8Array, compressed?: boolean): Uint8Array | null => - throwToNull(() => necc.utils.pointAddScalar(p, tweak, defaultTrue(compressed))), - - privateAdd: (d: Uint8Array, tweak: Uint8Array): Uint8Array | null => - throwToNull(() => { - const res = necc.utils.privateAdd(d, tweak); - // tiny-secp256k1 returns null rather than allowing a 0 private key to be returned - // ECPair.testEcc() requires that behavior. - if (res?.every((i) => i === 0)) return null; - return res; - }), - - privateNegate: (d: Uint8Array): Uint8Array => necc.utils.privateNegate(d), - - sign: (h: Uint8Array, d: Uint8Array, e?: Uint8Array): Uint8Array => { - return necc.signSync(h, d, { der: false, extraEntropy: e }); - }, - - signSchnorr: (h: Uint8Array, d: Uint8Array, e: Uint8Array = Buffer.alloc(32, 0x00)): Uint8Array => { - return necc.schnorr.signSync(h, d, e); - }, - - verify: (h: Uint8Array, Q: Uint8Array, signature: Uint8Array, strict?: boolean): boolean => { - return necc.verify(signature, h, Q, { strict }); - }, - - verifySchnorr: (h: Uint8Array, Q: Uint8Array, signature: Uint8Array): boolean => { - return necc.schnorr.verifySync(signature, h, Q); - }, -}; - -const crypto = { - ...baseCrypto, - pointMultiplyUnsafe(p: Uint8Array, a: Uint8Array, compress: boolean): Uint8Array | null { - try { - const product = necc.Point.fromHex(p).multiplyAndAddUnsafe(necc.Point.ZERO, toBigInt(a), BigInt(1)); - if (!product) return null; - return product.toRawBytes(compress); - } catch { - return null; - } - }, - pointMultiplyAndAddUnsafe(p1: Uint8Array, a: Uint8Array, p2: Uint8Array, compress: boolean): Uint8Array | null { - try { - const p2p = necc.Point.fromHex(p2); - const p = necc.Point.fromHex(p1).multiplyAndAddUnsafe(p2p, toBigInt(a), BigInt(1)); - if (!p) return null; - return p.toRawBytes(compress); - } catch { - return null; - } - }, - pointAdd(a: Uint8Array, b: Uint8Array, compress: boolean): Uint8Array | null { - try { - return necc.Point.fromHex(a).add(necc.Point.fromHex(b)).toRawBytes(compress); - } catch { - return null; - } - }, - pointAddTweak(p: Uint8Array, tweak: Uint8Array, compress: boolean): Uint8Array | null { - try { - const P = necc.Point.fromHex(p); - const t = baseCrypto.readSecret(tweak); - const Q = necc.Point.BASE.multiplyAndAddUnsafe(P, t, BigInt(1)); - if (!Q) throw new Error('Tweaked point at infinity'); - return Q.toRawBytes(compress); - } catch { - return null; - } - }, - pointCompress(p: Uint8Array, compress = true): Uint8Array { - return necc.Point.fromHex(p).toRawBytes(compress); - }, - liftX(p: Uint8Array): Uint8Array | null { - try { - return necc.Point.fromHex(p).toRawBytes(false); - } catch { - return null; - } - }, - getPublicKey(s: Uint8Array, compress: boolean): Uint8Array | null { - try { - return necc.getPublicKey(s, compress); - } catch { - return null; - } - }, - taggedHash: necc.utils.taggedHashSync, - sha256(...messages: Uint8Array[]): Uint8Array { - const sha256 = createHash('sha256'); - for (const message of messages) sha256.update(message); - return sha256.digest(); - }, -}; - -const ECPair: ECPairAPI = ECPairFactory(ecc); -const bip32: BIP32API = BIP32Factory(ecc); -const musig: MuSig = MuSigFactory(crypto); - -export { ecc, ECPair, ECPairAPI, ECPairInterface, bip32, BIP32API, BIP32Interface, musig, MuSig }; diff --git a/modules/utxo-lib/src/payments/p2tr.ts b/modules/utxo-lib/src/payments/p2tr.ts index 80005c6f26..b47c3b8afb 100644 --- a/modules/utxo-lib/src/payments/p2tr.ts +++ b/modules/utxo-lib/src/payments/p2tr.ts @@ -4,8 +4,7 @@ import { networks } from '../networks'; import { script as bscript, Payment, PaymentOpts, lazy } from 'bitcoinjs-lib'; import * as taproot from '../taproot'; -import { musig } from '../noble_ecc'; -import { secp256k1 as necc } from '@noble/curves/secp256k1'; +import { musig, ecc } from '@bitgo/secp256k1'; const typef = require('typeforce'); const OPS = bscript.OPS; @@ -22,12 +21,7 @@ const H = Buffer.from('50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ac const EMPTY_BUFFER = Buffer.alloc(0); function isPlainPubkey(pubKey: Uint8Array): boolean { - if (pubKey.length !== 33) return false; - try { - return !!necc.ProjectivePoint.fromHex(pubKey); - } catch (e) { - return false; - } + return ecc.isPoint(pubKey); } function isPlainPubkeys(pubkeys: Buffer[]) { diff --git a/modules/utxo-lib/src/taproot.ts b/modules/utxo-lib/src/taproot.ts index 7d6de52249..f1657ecd73 100644 --- a/modules/utxo-lib/src/taproot.ts +++ b/modules/utxo-lib/src/taproot.ts @@ -6,7 +6,7 @@ import { TapTree as PsbtTapTree, TapLeaf as PsbtTapLeaf } from 'bip174/src/lib/i import assert = require('assert'); import FastPriorityQueue = require('fastpriorityqueue'); import { script as bscript, crypto as bcrypto, payments as bpayments } from 'bitcoinjs-lib'; -import { ecc as eccLib } from './noble_ecc'; +import { ecc as eccLib } from '@bitgo/secp256k1'; const varuint = require('varuint-bitcoin'); /** diff --git a/modules/utxo-lib/src/templates/taprootnofn/output.ts b/modules/utxo-lib/src/templates/taprootnofn/output.ts index 6c6e7cae63..0fabb3bd4d 100644 --- a/modules/utxo-lib/src/templates/taprootnofn/output.ts +++ b/modules/utxo-lib/src/templates/taprootnofn/output.ts @@ -3,7 +3,7 @@ import { Stack } from '../../'; import { script as bscript } from '../../'; import { opcodes } from '../../'; -import { ecc } from '../../noble_ecc'; +import { ecc } from '@bitgo/secp256k1'; export function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean { const chunks = bscript.decompile(script) as Stack; diff --git a/modules/utxo-lib/src/testutil/keys.ts b/modules/utxo-lib/src/testutil/keys.ts index cb305e7e4a..25eae045bb 100644 --- a/modules/utxo-lib/src/testutil/keys.ts +++ b/modules/utxo-lib/src/testutil/keys.ts @@ -1,9 +1,8 @@ -import { BIP32API, BIP32Factory, BIP32Interface } from 'bip32'; import * as crypto from 'crypto'; import { Triple } from '../bitgo/types'; import { RootWalletKeys } from '../bitgo/wallet/WalletKeys'; -import { ecc, ECPair, ECPairInterface } from '../noble_ecc'; +import { BIP32API, BIP32Factory, BIP32Interface, ecc, ECPair, ECPairInterface } from '@bitgo/secp256k1'; import { networks } from '../networks'; const bip32: BIP32API = BIP32Factory(ecc); diff --git a/modules/utxo-lib/src/testutil/mock.ts b/modules/utxo-lib/src/testutil/mock.ts index fcfbe5a323..21ac8e5491 100644 --- a/modules/utxo-lib/src/testutil/mock.ts +++ b/modules/utxo-lib/src/testutil/mock.ts @@ -1,6 +1,5 @@ import { ok as assert } from 'assert'; -import { BIP32Interface } from 'bip32'; -import * as noble from '@noble/secp256k1'; +import { BIP32Interface } from '@bitgo/secp256k1'; import * as utxolib from '..'; import { getMainnet, Network, networks } from '../networks'; @@ -56,11 +55,7 @@ export function mockPrevTx( }); // Don't require the prevTx for signing and finalizing for non-segwit input utxolib.bitgo.withUnsafeNonSegwit(psbtFromNetwork, () => { - psbtFromNetwork.signInput(0, { - publicKey: pubkey, - sign: (hash: Buffer, lowR?: boolean) => - Buffer.from(noble.signSync(hash, keypair.privateKey as Buffer, { canonical: !lowR, der: false })), - }); + psbtFromNetwork.signInput(0, keypair); psbtFromNetwork.validateSignaturesOfAllInputs(); psbtFromNetwork.finalizeAllInputs(); }); diff --git a/modules/utxo-lib/src/transaction_builder.ts b/modules/utxo-lib/src/transaction_builder.ts index 1cf67d601f..a57c0c11e0 100644 --- a/modules/utxo-lib/src/transaction_builder.ts +++ b/modules/utxo-lib/src/transaction_builder.ts @@ -11,7 +11,7 @@ import { script as bscript } from './'; import { opcodes as ops } from './'; import { taproot } from './'; import { TxOutput, Transaction } from './'; -import { ECPair, ecc as eccLib } from './noble_ecc'; +import { ECPair, ecc as eccLib } from '@bitgo/secp256k1'; export interface Signer { privateKey?: Buffer; diff --git a/modules/utxo-lib/test/bitgo/keyutil.ts b/modules/utxo-lib/test/bitgo/keyutil.ts index 01cdbcd9ac..ddfca1ae0f 100644 --- a/modules/utxo-lib/test/bitgo/keyutil.ts +++ b/modules/utxo-lib/test/bitgo/keyutil.ts @@ -3,13 +3,12 @@ import { networks } from '../../src'; const assert = require('assert'); const crypto = require('crypto'); -import { ECPairInterface } from 'ecpair'; import { convertExtendedKeyNetwork, privateKeyBufferFromECPair, privateKeyBufferToECPair, } from '../../src/bitgo/keyutil'; -import { bip32, ECPair } from '../../src/noble_ecc'; +import { bip32, ECPair, ECPairInterface } from '@bitgo/secp256k1'; describe('privateKeyBufferFromECPair', function () { it('pads short private keys', function () { diff --git a/modules/utxo-lib/test/bitgo/psbt/Musig2Util.ts b/modules/utxo-lib/test/bitgo/psbt/Musig2Util.ts index 591c365379..80c0413242 100644 --- a/modules/utxo-lib/test/bitgo/psbt/Musig2Util.ts +++ b/modules/utxo-lib/test/bitgo/psbt/Musig2Util.ts @@ -32,8 +32,7 @@ import { toXOnlyPublicKey, } from '../../../src/bitgo/outputScripts'; import { mockWalletUnspent, replayProtectionKeyPair } from '../../../src/testutil'; -import { bip32, networks } from '../../../src'; -import { BIP32Interface } from 'bip32'; +import { bip32, BIP32Interface, networks } from '../../../src'; import { isPsbtInputFinalized } from '../../../src/bitgo/PsbtUtil'; export const network = networks.bitcoin; diff --git a/modules/utxo-lib/test/bitgo/psbt/SignVerifyPsbtAndTx.ts b/modules/utxo-lib/test/bitgo/psbt/SignVerifyPsbtAndTx.ts index dd238836c4..6234202a42 100644 --- a/modules/utxo-lib/test/bitgo/psbt/SignVerifyPsbtAndTx.ts +++ b/modules/utxo-lib/test/bitgo/psbt/SignVerifyPsbtAndTx.ts @@ -10,7 +10,7 @@ import { Triple, UtxoTransaction, } from '../../../src/bitgo'; -import { BIP32Interface } from 'bip32'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { constructPsbt, constructTxnBuilder, diff --git a/modules/utxo-lib/test/bitgo/signature.ts b/modules/utxo-lib/test/bitgo/signature.ts index 5cba5b2e0b..5bb35a8a74 100644 --- a/modules/utxo-lib/test/bitgo/signature.ts +++ b/modules/utxo-lib/test/bitgo/signature.ts @@ -1,5 +1,5 @@ import * as assert from 'assert'; -import { BIP32Interface } from 'bip32'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { script as bscript, classify, TxOutput } from '../../src'; import { getKeyName } from '../../src/testutil'; diff --git a/modules/utxo-lib/test/bitgo/signatureModify.ts b/modules/utxo-lib/test/bitgo/signatureModify.ts index 67b16dbac2..56276d8282 100644 --- a/modules/utxo-lib/test/bitgo/signatureModify.ts +++ b/modules/utxo-lib/test/bitgo/signatureModify.ts @@ -1,9 +1,8 @@ /* eslint-disable no-redeclare */ import { script, ScriptSignature, TxOutput } from 'bitcoinjs-lib'; import { isPlaceholderSignature, parseSignatureScript, UtxoTransaction } from '../../src/bitgo'; -import { secp256k1 } from '@noble/curves/secp256k1'; -const n = BigInt(secp256k1.CURVE.n); +const n = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'); const nDiv2 = n / BigInt(2); function bytesToBigInt(bytes: Uint8Array): bigint { diff --git a/modules/utxo-lib/test/integration_local_rpc/generate/outputScripts.util.ts b/modules/utxo-lib/test/integration_local_rpc/generate/outputScripts.util.ts index 56188bfc83..3d88e00afa 100644 --- a/modules/utxo-lib/test/integration_local_rpc/generate/outputScripts.util.ts +++ b/modules/utxo-lib/test/integration_local_rpc/generate/outputScripts.util.ts @@ -1,5 +1,5 @@ -import { BIP32Interface } from 'bip32'; import { Transaction, TxOutput } from 'bitcoinjs-lib'; +import { BIP32Interface } from '@bitgo/secp256k1'; import * as utxolib from '../../../src'; import { createOutputScript2of3, diff --git a/modules/utxo-lib/test/integration_local_rpc/parse.ts b/modules/utxo-lib/test/integration_local_rpc/parse.ts index fe16aa0bdc..0834408ffa 100644 --- a/modules/utxo-lib/test/integration_local_rpc/parse.ts +++ b/modules/utxo-lib/test/integration_local_rpc/parse.ts @@ -1,6 +1,6 @@ import * as assert from 'assert/strict'; import { describe, it } from 'mocha'; -import { BIP32Interface } from 'bip32'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { isTestnet, TxOutput, getNetworkList, getNetworkName, networks } from '../../src'; import { getDefaultCosigner } from '../../src/testutil'; diff --git a/modules/utxo-lib/test/taproot.spec.ts b/modules/utxo-lib/test/taproot.spec.ts index f320e1c6cd..3655742790 100644 --- a/modules/utxo-lib/test/taproot.spec.ts +++ b/modules/utxo-lib/test/taproot.spec.ts @@ -1,6 +1,6 @@ import * as assert from 'assert'; -import { ECPairAPI, ECPairFactory } from 'ecpair'; -import { ecc, taproot } from '../src'; +import { ECPairAPI, ECPairFactory, ecc } from '@bitgo/secp256k1'; +import { taproot } from '../src'; import { createTaprootOutputScript, getTaprootOutputKey } from '../src/taproot'; const ECPair: ECPairAPI = ECPairFactory(ecc); diff --git a/modules/utxo-lib/test/transaction_util.ts b/modules/utxo-lib/test/transaction_util.ts index 26e24288a8..9f3e58a405 100644 --- a/modules/utxo-lib/test/transaction_util.ts +++ b/modules/utxo-lib/test/transaction_util.ts @@ -1,6 +1,6 @@ -import { BIP32Interface } from 'bip32'; import * as assert from 'assert'; import { TxOutput } from 'bitcoinjs-lib'; +import { BIP32Interface } from '@bitgo/secp256k1'; import { networks, Network } from '../src';