diff --git a/__tests__/integration/legacy-wallet.test.js b/__tests__/integration/legacy-wallet.test.js index e05fee8..6d7475f 100644 --- a/__tests__/integration/legacy-wallet.test.js +++ b/__tests__/integration/legacy-wallet.test.js @@ -32,6 +32,25 @@ describe('LegacyWallet', function () { assert.ok(!w.isAddressValid('12345')); assert.ok(w.isAddressValid('bc1quuafy8htjjj263cvpj7md84magzmc8svmh8lrm')); assert.ok(w.isAddressValid('BC1QH6TF004TY7Z7UN2V5NTU4MKF630545GVHS45U7')); + + // taproot: + assert.ok(!w.isAddressValid('bc1pw5dgrnzv')); // v1, data length != 32 + assert.ok(!w.isAddressValid('bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav')); // v1, data length != 32 + assert.ok(!w.isAddressValid('bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd')); // P2TR example with errors (using Bech32 instead of Bech32m) + assert.ok(!w.isAddressValid('bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4')); // invalid char + assert.ok(!w.isAddressValid('BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R')); // invalid char + assert.ok(!w.isAddressValid('bc1pllllllllllllllllllllllllllllllllllllllllllllallllscqlhrddu')); // X is modulo P + 1 (invalid X, but 1 is valid, testing if wrapped modulo (P+1 mod P === 1) will pass) + assert.ok(!w.isAddressValid('bc1pllllllllllllllllllllllllllllllllllllllllllllallllshqcgyklh')); // X is modulo P - 1 (invalid X) + assert.ok(!w.isAddressValid('bc1pqtllllllllllllllllllllllllllllllllllllllllllllhlll7zcsqylfl')); // data length is 33 (valid point in compressed DER format (33 bytes)) + assert.ok(!w.isAddressValid('bc1plllllllllllllllllllllllllllllllllllllllllll0lllu9cegrnmx')); // data is length 31 (valid X value with leading 0x00 trimmed) + + assert.ok(w.isAddressValid('bc1pw38ttcljvgv9x64xpsq99dl9auy8vv50n25xcstuj2cagzcpx3us2m25kg')); + assert.ok(w.isAddressValid('bc1pqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsyjer9e')); + assert.ok(w.isAddressValid('bc1pmfr3p9j00pfxjh0zmgp99y8zftmd3s5pmedqhyptwy6lm87hf5sspknck9')); + assert.ok(w.isAddressValid('bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0')); + + assert.ok(!w.isAddressValid('BC1SW50QGDZ25J')); // v16, valid but unsafe + assert.ok(!w.isAddressValid('bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs')); // v2, valid but unsafe }); it('can fetch balance', async () => { diff --git a/package-lock.json b/package-lock.json index 521798d..5cbf3e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,12 +16,13 @@ "bignumber.js": "^9.0.1", "bip32": "^2.0.6", "bip39": "3.0.4", - "bitcoinjs-lib": "^5.2.0", + "bitcoinjs-lib": "^6.0.1", "bs58check": "^2.1.2", "buffer-reverse": "^1.0.1", "chacha": "^2.1.0", "coinselect": "^3.1.12", "create-hash": "^1.2.0", + "ecpair": "^2.0.1", "electrum-mnemonic": "^2.0.0", "frisbee": "^3.1.2", "util": "^0.12.3" @@ -4346,44 +4347,29 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" }, - "node_modules/bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bitcoin-ops": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" - }, "node_modules/bitcoinjs-lib": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", - "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.0.2.tgz", + "integrity": "sha512-I994pGt9cL5s5OA6mkv1e8IuYcsKN2ORXnWbkqAXLNGvEnOHBhKBSvCjFl7YC2uVoJnfr/iwq7JMrq575SYO5w==", "dependencies": { - "bech32": "^1.1.2", + "bech32": "^2.0.0", "bip174": "^2.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", + "bs58check": "^2.1.2", "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", + "ripemd160": "^2.0.2", "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", + "varuint-bitcoin": "^1.1.2", "wif": "^2.0.1" }, "engines": { "node": ">=8.0.0" } }, + "node_modules/bitcoinjs-lib/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -5630,6 +5616,19 @@ "node": ">=8" } }, + "node_modules/ecpair": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ecpair/-/ecpair-2.0.1.tgz", + "integrity": "sha512-iT3wztQMeE/nDTlfnAg8dAFUfBS7Tq2BXzq3ae6L+pWgFU0fQ3l0woTzdTBrJV3OxBjxbzjq8EQhAbEmJNWFSw==", + "dependencies": { + "randombytes": "^2.1.0", + "typeforce": "^1.18.0", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -10604,11 +10603,6 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "node_modules/merkle-lib": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" - }, "node_modules/metro": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/metro/-/metro-0.59.0.tgz", @@ -13700,14 +13694,6 @@ "node": ">=6" } }, - "node_modules/pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", - "dependencies": { - "bitcoin-ops": "^1.3.0" - } - }, "node_modules/qs": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", @@ -20199,39 +20185,26 @@ } } }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bitcoin-ops": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" - }, "bitcoinjs-lib": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", - "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.0.2.tgz", + "integrity": "sha512-I994pGt9cL5s5OA6mkv1e8IuYcsKN2ORXnWbkqAXLNGvEnOHBhKBSvCjFl7YC2uVoJnfr/iwq7JMrq575SYO5w==", "requires": { - "bech32": "^1.1.2", + "bech32": "^2.0.0", "bip174": "^2.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", + "bs58check": "^2.1.2", "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", + "ripemd160": "^2.0.2", "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", + "varuint-bitcoin": "^1.1.2", "wif": "^2.0.1" + }, + "dependencies": { + "bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + } } }, "bn.js": { @@ -21282,6 +21255,16 @@ } } }, + "ecpair": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ecpair/-/ecpair-2.0.1.tgz", + "integrity": "sha512-iT3wztQMeE/nDTlfnAg8dAFUfBS7Tq2BXzq3ae6L+pWgFU0fQ3l0woTzdTBrJV3OxBjxbzjq8EQhAbEmJNWFSw==", + "requires": { + "randombytes": "^2.1.0", + "typeforce": "^1.18.0", + "wif": "^2.0.6" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -25025,11 +25008,6 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "merkle-lib": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" - }, "metro": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/metro/-/metro-0.59.0.tgz", @@ -27569,14 +27547,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", - "requires": { - "bitcoin-ops": "^1.3.0" - } - }, "qs": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", diff --git a/package.json b/package.json index 6130ffc..eb0152b 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,13 @@ "bignumber.js": "^9.0.1", "bip32": "^2.0.6", "bip39": "3.0.4", - "bitcoinjs-lib": "^5.2.0", + "bitcoinjs-lib": "^6.0.1", "bs58check": "^2.1.2", "buffer-reverse": "^1.0.1", "chacha": "^2.1.0", "coinselect": "^3.1.12", "create-hash": "^1.2.0", + "ecpair": "^2.0.1", "electrum-mnemonic": "^2.0.0", "frisbee": "^3.1.2", "util": "^0.12.3" diff --git a/src/wallet/abstract-hd-electrum-wallet.js b/src/wallet/abstract-hd-electrum-wallet.js index 185d16c..7ea335f 100644 --- a/src/wallet/abstract-hd-electrum-wallet.js +++ b/src/wallet/abstract-hd-electrum-wallet.js @@ -7,6 +7,9 @@ import * as bitcoin from 'bitcoinjs-lib'; import * as BlueElectrum from '../BlueElectrum'; import * as HDNode from 'bip32'; import reverse from 'buffer-reverse'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); /** * Electrum - means that it utilizes Electrum protocol for blockchain data @@ -853,7 +856,7 @@ export class AbstractHDElectrumWallet extends AbstractHDWallet { let keyPair; if (!skipSigning) { // skiping signing related stuff - keyPair = bitcoin.ECPair.fromWIF(this._getWifForAddress(input.address)); + keyPair = ECPair.fromWIF(this._getWifForAddress(input.address)); keypairs[c] = keyPair; } values[c] = input.value; diff --git a/src/wallet/hd-segwit-p2sh-wallet.js b/src/wallet/hd-segwit-p2sh-wallet.js index 8d12005..0f22a31 100644 --- a/src/wallet/hd-segwit-p2sh-wallet.js +++ b/src/wallet/hd-segwit-p2sh-wallet.js @@ -3,6 +3,9 @@ import b58 from 'bs58check'; import { AbstractHDElectrumWallet } from './abstract-hd-electrum-wallet'; import * as bitcoin from 'bitcoinjs-lib'; import * as HDNode from 'bip32'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); /** * HD Wallet (BIP39). @@ -17,7 +20,7 @@ export class HDSegwitP2SHWallet extends AbstractHDElectrumWallet { return true; } - allowSendMax(): boolean { + allowSendMax() { return true; } @@ -36,7 +39,7 @@ export class HDSegwitP2SHWallet extends AbstractHDElectrumWallet { const path = `m/49'/0'/0'/${internal ? 1 : 0}/${index}`; const child = root.derivePath(path); - return bitcoin.ECPair.fromPrivateKey(child.privateKey).toWIF(); + return ECPair.fromPrivateKey(child.privateKey).toWIF(); } _getExternalAddressByIndex(index) { diff --git a/src/wallet/legacy-wallet.js b/src/wallet/legacy-wallet.js index eccbe25..a48b403 100644 --- a/src/wallet/legacy-wallet.js +++ b/src/wallet/legacy-wallet.js @@ -5,6 +5,9 @@ import * as bitcoin from 'bitcoinjs-lib'; import * as BlueElectrum from '../BlueElectrum'; import coinSelectAccumulative from 'coinselect/accumulative'; import coinSelectSplit from 'coinselect/split'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); /** * Has private key and single address like "1ABCD....." @@ -44,7 +47,7 @@ export class LegacyWallet extends AbstractWallet { async generate() { const buf = await randomBytes(32); - this.secret = bitcoin.ECPair.makeRandom({ rng: () => buf }).toWIF(); + this.secret = ECPair.makeRandom({ rng: () => buf }).toWIF(); } async generateFromEntropy(user) { @@ -54,7 +57,7 @@ export class LegacyWallet extends AbstractWallet { const random = await randomBytes(user.length < 32 ? 32 - user.length : 0); const buf = Buffer.concat([user, random], 32); try { - this.secret = bitcoin.ECPair.fromPrivateKey(buf).toWIF(); + this.secret = ECPair.fromPrivateKey(buf).toWIF(); return; } catch (e) { if (i === 5) throw e; @@ -70,7 +73,7 @@ export class LegacyWallet extends AbstractWallet { if (this._address) return this._address; let address; try { - const keyPair = bitcoin.ECPair.fromWIF(this.secret); + const keyPair = ECPair.fromWIF(this.secret); address = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey, }).address; @@ -314,7 +317,7 @@ export class LegacyWallet extends AbstractWallet { inputs.forEach(input => { if (!skipSigning) { // skiping signing related stuff - keyPair = bitcoin.ECPair.fromWIF(this.secret); // secret is WIF + keyPair = ECPair.fromWIF(this.secret); // secret is WIF } values[c] = input.value; c++; @@ -372,12 +375,25 @@ export class LegacyWallet extends AbstractWallet { /** * Validates any address, including legacy, p2sh and bech32 * + * p2tr addresses have extra logic, rejecting all versions >1 + * @see https://github.com/BlueWallet/BlueWallet/issues/3394 + * @see https://github.com/bitcoinjs/bitcoinjs-lib/issues/1750 + * @see https://github.com/bitcoin/bips/blob/edffe529056f6dfd33d8f716fb871467c3c09263/bip-0350.mediawiki#Addresses_for_segregated_witness_outputs + * * @param address * @returns {boolean} */ isAddressValid(address) { try { - bitcoin.address.toOutputScript(address); + bitcoin.address.toOutputScript(address); // throws, no? + + if (!address.toLowerCase().startsWith('bc1')) return true; + const decoded = bitcoin.address.fromBech32(address); + if (decoded.version === 0) return true; + if (decoded.version === 1 && decoded.data.length !== 32) return false; + if (decoded.version === 1 && !ecc.isPoint(Buffer.concat([Buffer.from([2]), decoded.data]))) return false; + if (decoded.version > 1) return false; + // ^^^ some day, when versions above 1 will be actually utilized, we would need to unhardcode this return true; } catch (e) { return false; diff --git a/src/wallet/multisig-hd-wallet.js b/src/wallet/multisig-hd-wallet.js index 983f225..25c12ae 100644 --- a/src/wallet/multisig-hd-wallet.js +++ b/src/wallet/multisig-hd-wallet.js @@ -8,6 +8,9 @@ import * as bitcoin from 'bitcoinjs-lib'; import createHash from 'create-hash'; import reverse from 'buffer-reverse'; import * as mn from 'electrum-mnemonic'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); const MNEMONIC_TO_SEED_OPTS_SEGWIT = { prefix: mn.PREFIXES.segwit, @@ -145,7 +148,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { static isXprvValid(xprv) { try { xprv = MultisigHDWallet.convertMultisigXprvToRegularXprv(xprv); - bitcoin.bip32.fromBase58(xprv); + HDNode.bip32.fromBase58(xprv); return true; } catch (_) { return false; @@ -210,7 +213,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { } static convertXprvToXpub(xprv) { - const restored = bitcoin.bip32.fromBase58(MultisigHDWallet.convertMultisigXprvToRegularXprv(xprv)); + const restored = HDNode.bip32.fromBase58(MultisigHDWallet.convertMultisigXprvToRegularXprv(xprv)); return restored.neutered().toBase58(); } @@ -314,7 +317,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { seed = bip39.mnemonicToSeedSync(mnemonic); } - const root = bitcoin.bip32.fromSeed(seed); + const root = HDNode.fromSeed(seed); const child = root.derivePath(path).neutered(); return child.toBase58(); } @@ -929,7 +932,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { } static isPathValid(path) { - const root = bitcoin.bip32.fromSeed(Buffer.alloc(32)); + const root = HDNode.fromSeed(Buffer.alloc(32)); try { root.derivePath(path); return true; @@ -1049,7 +1052,7 @@ export class MultisigHDWallet extends AbstractHDElectrumWallet { // ^^^ we assume that counterparty has Zpub for specified derivation path const child = root.derivePath(path); if (psbt.inputHasPubkey(cc, child.publicKey)) { - const keyPair = bitcoin.ECPair.fromPrivateKey(child.privateKey); + const keyPair = ECPair.fromPrivateKey(child.privateKey); try { psbt.signInput(cc, keyPair); } catch (_) { } diff --git a/src/wallet/segwit-bech-wallet.js b/src/wallet/segwit-bech-wallet.js index 5c24b73..b785e3c 100644 --- a/src/wallet/segwit-bech-wallet.js +++ b/src/wallet/segwit-bech-wallet.js @@ -1,5 +1,8 @@ import { LegacyWallet } from './legacy-wallet'; import * as bitcoin from 'bitcoinjs-lib'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); export class SegwitBech32Wallet extends LegacyWallet { static type = 'segwitBech32'; @@ -9,7 +12,7 @@ export class SegwitBech32Wallet extends LegacyWallet { if (this._address) return this._address; let address; try { - const keyPair = bitcoin.ECPair.fromWIF(this.secret); + const keyPair = ECPair.fromWIF(this.secret); if (!keyPair.compressed) { console.warn('only compressed public keys are good for segwit'); return false; @@ -76,7 +79,7 @@ export class SegwitBech32Wallet extends LegacyWallet { inputs.forEach(input => { if (!skipSigning) { // skiping signing related stuff - keyPair = bitcoin.ECPair.fromWIF(this.secret); // secret is WIF + keyPair = ECPair.fromWIF(this.secret); // secret is WIF } values[c] = input.value; c++; diff --git a/src/wallet/segwit-p2sh-wallet.js b/src/wallet/segwit-p2sh-wallet.js index b62ac89..c721af3 100644 --- a/src/wallet/segwit-p2sh-wallet.js +++ b/src/wallet/segwit-p2sh-wallet.js @@ -1,5 +1,8 @@ import { LegacyWallet } from './legacy-wallet'; import * as bitcoin from 'bitcoinjs-lib'; +import { ECPairFactory } from 'ecpair'; +const ecc = require('tiny-secp256k1'); +const ECPair = ECPairFactory(ecc); /** * Creates Segwit P2SH Bitcoin address @@ -49,7 +52,7 @@ export class SegwitP2SHWallet extends LegacyWallet { if (this._address) return this._address; let address; try { - const keyPair = bitcoin.ECPair.fromWIF(this.secret); + const keyPair = ECPair.fromWIF(this.secret); const pubKey = keyPair.publicKey; if (!keyPair.compressed) { console.warn('only compressed public keys are good for segwit'); @@ -87,7 +90,7 @@ export class SegwitP2SHWallet extends LegacyWallet { inputs.forEach(input => { if (!skipSigning) { // skiping signing related stuff - keyPair = bitcoin.ECPair.fromWIF(this.secret); // secret is WIF + keyPair = ECPair.fromWIF(this.secret); // secret is WIF } values[c] = input.value; c++;