From b885a35ff37207d0a1eaa9052193c8b7026a6bea Mon Sep 17 00:00:00 2001 From: Kenny Joseph Date: Tue, 14 May 2024 12:51:31 -0400 Subject: [PATCH 1/7] paginate wallet address import --- packages/bitcore-client/src/client.ts | 32 +++++--- packages/bitcore-client/src/utils.ts | 1 + .../bitcore-client/test/unit/wallet.test.ts | 79 +++++++++++++++++++ 3 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 packages/bitcore-client/src/utils.ts diff --git a/packages/bitcore-client/src/client.ts b/packages/bitcore-client/src/client.ts index 0f082eead19..14357a5a2f6 100644 --- a/packages/bitcore-client/src/client.ts +++ b/packages/bitcore-client/src/client.ts @@ -1,8 +1,8 @@ import requestStream from 'request'; import request from 'request-promise-native'; import * as secp256k1 from 'secp256k1'; -import * as stream from 'stream'; import { URL } from 'url'; +import * as utils from './utils'; let usingBrowser = (global as any).window; const URLClass = usingBrowser ? usingBrowser.URL : URL; const bitcoreLib = require('crypto-wallet-core').BitcoreLib; @@ -19,13 +19,12 @@ export class Client { return await request(params); } catch (err) { if (err.statusCode) { - throw new Error(`${err.statusCode} - ${params.url} - "${JSON.stringify(err.error)}"`); + throw new Error(`${err.statusCode} - ${params.method}: ${params.url} - "${JSON.stringify(err.error)}"`); } else if (err.error instanceof Error) { throw err.error; } throw err; } - } _buildQueryString( params: any) { @@ -170,18 +169,27 @@ export class Client { return result; } - async importAddresses(params) { + async importAddresses(params: { pubKey: string; payload: Array<{ address: string }> }): Promise { const { payload, pubKey } = params; const url = `${this.apiUrl}/wallet/${pubKey}`; - const signature = this.sign({ method: 'POST', url, payload }); - return this._request({ - method: 'POST', - url, - headers: { 'x-signature': signature }, - body: payload, - json: true - }); + for (let i = 0; i < payload.length; i += 100) { + const body = payload.slice(i, i + 100); + console.log(`Importing addresses ${i + 1}-${i + body.length} of ${payload.length}`); + if (i >= 100) { + await utils.sleep(1000); // cooldown + } + + const signature = this.sign({ method: 'POST', url, payload: body }); + + await this._request({ + method: 'POST', + url, + headers: { 'x-signature': signature }, + body, + json: true + }); + } } async broadcast(params) { diff --git a/packages/bitcore-client/src/utils.ts b/packages/bitcore-client/src/utils.ts new file mode 100644 index 00000000000..d5ff38a9191 --- /dev/null +++ b/packages/bitcore-client/src/utils.ts @@ -0,0 +1 @@ +export const sleep = (ms) => new Promise(r => setTimeout(r, ms)); \ No newline at end of file diff --git a/packages/bitcore-client/test/unit/wallet.test.ts b/packages/bitcore-client/test/unit/wallet.test.ts index bb24d0b5bf9..6fe380f2ff8 100644 --- a/packages/bitcore-client/test/unit/wallet.test.ts +++ b/packages/bitcore-client/test/unit/wallet.test.ts @@ -1,8 +1,10 @@ import sinon from 'sinon'; import chai from 'chai'; +import crypto from 'crypto'; import * as CWC from 'crypto-wallet-core'; import { Wallet, AddressTypes } from '../../src/wallet'; import { Client } from '../../src/client'; +import * as utils from '../../src/utils'; const should = chai.should(); @@ -247,5 +249,82 @@ describe('Wallet', function() { }); } }); + + describe.only('importKeys', function() { + walletName = 'BitcoreClientTestImportKeys'; + let requestStub; + let sleepStub; + + beforeEach(async function() { + wallet = await Wallet.create({ + name: walletName, + chain: 'BTC', + network: 'testnet', + phrase: 'snap impact summer because must pipe weasel gorilla actor acid web whip', + password: 'abc123', + storageType, + }); + await wallet.unlock('abc123'); + requestStub = sandbox.stub(wallet.client, '_request').resolves(); + sleepStub = sandbox.stub(utils, 'sleep').resolves(); + }); + + it('should import 1 key', async function() { + const keys = []; + for (let i = 0; i < 1; i++) { + const pk = crypto.randomBytes(32).toString('hex'); + keys.push({ + privKey: pk, + address: libMap.BTC.PrivateKey(pk).toAddress().toString() + }); + } + await wallet.importKeys({ + keys, + rederiveAddys: false + }); + + requestStub.callCount.should.equal(1); + sleepStub.callCount.should.equal(0); + requestStub.args.flatMap(arg => arg[0].body).should.deep.equal(keys.map(k => ({ address: k.address }))); + }); + + it('should import <100 keys', async function() { + const keys = []; + for (let i = 0; i < 100; i++) { + const pk = crypto.randomBytes(32).toString('hex'); + keys.push({ + privKey: pk, + address: libMap.BTC.PrivateKey(pk).toAddress().toString() + }); + } + await wallet.importKeys({ + keys, + rederiveAddys: false + }); + + requestStub.callCount.should.equal(1); + sleepStub.callCount.should.equal(0); + requestStub.args.flatMap(arg => arg[0].body).should.deep.equal(keys.map(k => ({ address: k.address }))); + }); + + it('should import >100 keys', async function() { + const keys = []; + for (let i = 0; i < 101; i++) { + const pk = crypto.randomBytes(32).toString('hex'); + keys.push({ + privKey: pk, + address: libMap.BTC.PrivateKey(pk).toAddress().toString() + }); + } + await wallet.importKeys({ + keys, + rederiveAddys: false + }); + + requestStub.callCount.should.equal(2); + sleepStub.callCount.should.equal(1); + requestStub.args.flatMap(arg => arg[0].body).should.deep.equal(keys.map(k => ({ address: k.address }))); + }); + }); }); From f8e1b94cf261360d0b45a6ba1ae783737e3f4d8b Mon Sep 17 00:00:00 2001 From: Justin Langston Date: Tue, 14 May 2024 13:47:45 -0400 Subject: [PATCH 2/7] v10.0.34 --- lerna.json | 2 +- packages/bitcore-client/package-lock.json | 4 ++-- packages/bitcore-client/package.json | 4 ++-- packages/bitcore-node/package-lock.json | 10 +++++----- packages/bitcore-node/package.json | 8 ++++---- packages/bitcore-wallet-client/package-lock.json | 4 ++-- packages/bitcore-wallet-client/package.json | 6 +++--- packages/bitcore-wallet-service/package-lock.json | 6 +++--- packages/bitcore-wallet-service/package.json | 4 ++-- packages/bitcore-wallet/package-lock.json | 4 ++-- packages/bitcore-wallet/package.json | 4 ++-- packages/crypto-wallet-core/package-lock.json | 2 +- packages/crypto-wallet-core/package.json | 2 +- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lerna.json b/lerna.json index 4c39c701518..ad74a241773 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "2.9.1", - "version": "10.0.33", + "version": "10.0.34", "packages": [ "packages/[^insight]*" ] diff --git a/packages/bitcore-client/package-lock.json b/packages/bitcore-client/package-lock.json index d18671b5719..e74b3f4855b 100644 --- a/packages/bitcore-client/package-lock.json +++ b/packages/bitcore-client/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-client", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-client", - "version": "10.0.33", + "version": "10.0.34", "dependencies": { "async": "2.5.0", "bcrypt": "5.1.0", diff --git a/packages/bitcore-client/package.json b/packages/bitcore-client/package.json index 358166dafeb..6fc64aac732 100644 --- a/packages/bitcore-client/package.json +++ b/packages/bitcore-client/package.json @@ -1,7 +1,7 @@ { "name": "bitcore-client", "description": "Wallet client for Bitcore node", - "version": "10.0.33", + "version": "10.0.34", "author": "Justin Langston ", "main": "./ts_build/src/index.js", "types": "./ts_build/src/index.d.ts", @@ -25,7 +25,7 @@ "bcrypt": "5.1.0", "bitcore-mnemonic": "^10.0.28", "commander": "11.1.0", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "elliptic": "^6.5.3", "ethers": "5.7.1", "level-js": "4.0.2", diff --git a/packages/bitcore-node/package-lock.json b/packages/bitcore-node/package-lock.json index 6c52a8f7916..3572ded60eb 100644 --- a/packages/bitcore-node/package-lock.json +++ b/packages/bitcore-node/package-lock.json @@ -1,16 +1,16 @@ { "name": "bitcore-node", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-node", - "version": "10.0.33", + "version": "10.0.34", "license": "MIT", "dependencies": { "abi-decoder": "2.4.0", - "bitcore-client": "^10.0.33", + "bitcore-client": "^10.0.34", "bitcore-lib": "^10.0.28", "bitcore-lib-cash": "^10.0.28", "bitcore-lib-doge": "^10.0.32", @@ -18,11 +18,11 @@ "bitcore-p2p": "^10.0.28", "bitcore-p2p-cash": "^10.0.28", "bitcore-p2p-doge": "^10.0.32", - "bitcore-wallet-client": "^10.0.33", + "bitcore-wallet-client": "^10.0.34", "body-parser": "1.18.3", "cors": "2.8.4", "crypto-rpc": "https://github.com/bitpay/crypto-rpc.git#2c94b2a671021ff8c76d08233147fe197f0794de", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "heapdump": "0.3.15", "http": "0.0.0", "lodash": "4.17.11", diff --git a/packages/bitcore-node/package.json b/packages/bitcore-node/package.json index d247550b493..fb42f8f7dce 100644 --- a/packages/bitcore-node/package.json +++ b/packages/bitcore-node/package.json @@ -4,7 +4,7 @@ "engines": { "node": ">=18.0.0" }, - "version": "10.0.33", + "version": "10.0.34", "author": "Justin Langston ", "contributors": [ "Justin Langston ", @@ -91,7 +91,7 @@ }, "dependencies": { "abi-decoder": "2.4.0", - "bitcore-client": "^10.0.33", + "bitcore-client": "^10.0.34", "bitcore-lib": "^10.0.28", "bitcore-lib-cash": "^10.0.28", "bitcore-lib-doge": "^10.0.32", @@ -99,11 +99,11 @@ "bitcore-p2p": "^10.0.28", "bitcore-p2p-cash": "^10.0.28", "bitcore-p2p-doge": "^10.0.32", - "bitcore-wallet-client": "^10.0.33", + "bitcore-wallet-client": "^10.0.34", "body-parser": "1.18.3", "cors": "2.8.4", "crypto-rpc": "https://github.com/bitpay/crypto-rpc.git#2c94b2a671021ff8c76d08233147fe197f0794de", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "heapdump": "0.3.15", "http": "0.0.0", "lodash": "4.17.11", diff --git a/packages/bitcore-wallet-client/package-lock.json b/packages/bitcore-wallet-client/package-lock.json index e6cb8d4688f..e0ee707a9b9 100644 --- a/packages/bitcore-wallet-client/package-lock.json +++ b/packages/bitcore-wallet-client/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet-client", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-wallet-client", - "version": "10.0.33", + "version": "10.0.34", "license": "MIT", "dependencies": { "ajv": "6.12.0", diff --git a/packages/bitcore-wallet-client/package.json b/packages/bitcore-wallet-client/package.json index 53b833dcd11..c60e5789606 100644 --- a/packages/bitcore-wallet-client/package.json +++ b/packages/bitcore-wallet-client/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet-client", "description": "Client for bitcore-wallet-service", "author": "BitPay Inc", - "version": "10.0.33", + "version": "10.0.34", "license": "MIT", "main": "ts_build/index.js", "types": "ts_build/index.d.js", @@ -31,7 +31,7 @@ "async": "0.9.2", "bip38": "1.4.0", "bitcore-mnemonic": "^10.0.28", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "json-stable-stringify": "1.0.1", "lodash": "4.17.20", "preconditions": "2.2.3", @@ -44,7 +44,7 @@ "devDependencies": { "@types/lodash": "^4.14.136", "@types/node": "^18.11.18", - "bitcore-wallet-service": "^10.0.33", + "bitcore-wallet-service": "^10.0.34", "browserify": "^13.1.0", "chai": "^1.9.1", "coveralls": "^3.0.2", diff --git a/packages/bitcore-wallet-service/package-lock.json b/packages/bitcore-wallet-service/package-lock.json index 6129b9e7bbe..d6d81eb389b 100644 --- a/packages/bitcore-wallet-service/package-lock.json +++ b/packages/bitcore-wallet-service/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet-service", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitcore-wallet-service", - "version": "10.0.33", + "version": "10.0.34", "license": "MIT", "dependencies": { "@sendgrid/mail": "6.5.4", @@ -19,7 +19,7 @@ "body-parser": "1.19.0", "compression": "1.7.4", "cors": "2.8.5", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "email-validator": "1.2.3", "ethers": "4.0.0-beta.3", "express": "4.17.1", diff --git a/packages/bitcore-wallet-service/package.json b/packages/bitcore-wallet-service/package.json index 18edec75a99..14cb7097b57 100644 --- a/packages/bitcore-wallet-service/package.json +++ b/packages/bitcore-wallet-service/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet-service", "description": "A service for Mutisig HD Bitcoin Wallets", "author": "BitPay Inc", - "version": "10.0.33", + "version": "10.0.34", "license": "MIT", "main": "ts_build/index.js", "types": "./ts_build/index.d.ts", @@ -50,7 +50,7 @@ "body-parser": "1.19.0", "compression": "1.7.4", "cors": "2.8.5", - "crypto-wallet-core": "^10.0.33", + "crypto-wallet-core": "^10.0.34", "email-validator": "1.2.3", "ethers": "4.0.0-beta.3", "express": "4.17.1", diff --git a/packages/bitcore-wallet/package-lock.json b/packages/bitcore-wallet/package-lock.json index 21c75ff9913..a9595d4d315 100644 --- a/packages/bitcore-wallet/package-lock.json +++ b/packages/bitcore-wallet/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-wallet", - "version": "10.0.33", + "version": "10.0.34", "dependencies": { "async": "^2.5.0", "commander": "^2.6.0", diff --git a/packages/bitcore-wallet/package.json b/packages/bitcore-wallet/package.json index 23c2ea6a621..40c2d7a69a1 100644 --- a/packages/bitcore-wallet/package.json +++ b/packages/bitcore-wallet/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet", "description": "A CLI Mutisig HD Bitcoin Wallet, demo for Bitcore Wallet Service", "author": "BitPay Inc", - "version": "10.0.33", + "version": "10.0.34", "keywords": [ "bitcoin", "copay", @@ -19,7 +19,7 @@ "dependencies": { "async": "^2.5.0", "bitcore-lib": "^10.0.28", - "bitcore-wallet-client": "^10.0.33", + "bitcore-wallet-client": "^10.0.34", "commander": "^2.6.0", "lodash": "^3.3.1", "moment": "^2.9.0", diff --git a/packages/crypto-wallet-core/package-lock.json b/packages/crypto-wallet-core/package-lock.json index ba1ec33300d..78b396a2768 100644 --- a/packages/crypto-wallet-core/package-lock.json +++ b/packages/crypto-wallet-core/package-lock.json @@ -1,6 +1,6 @@ { "name": "crypto-wallet-core", - "version": "10.0.33", + "version": "10.0.34", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/crypto-wallet-core/package.json b/packages/crypto-wallet-core/package.json index 659da0ceed2..a431deae1e5 100644 --- a/packages/crypto-wallet-core/package.json +++ b/packages/crypto-wallet-core/package.json @@ -1,6 +1,6 @@ { "name": "crypto-wallet-core", - "version": "10.0.33", + "version": "10.0.34", "description": "A multi-currency support library for address derivation, private key creation, and transaction creation", "main": "./ts_build/src/index.js", "types": "./ts_build/src/index.d.ts", From b37b26ef5eb626db3a9cb8316281a9eff01b593c Mon Sep 17 00:00:00 2001 From: lyambo Date: Tue, 14 May 2024 16:56:51 -0400 Subject: [PATCH 3/7] add arb, base, and op to blockchainmonitor --- packages/bitcore-wallet-service/src/lib/blockchainmonitor.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/bitcore-wallet-service/src/lib/blockchainmonitor.ts b/packages/bitcore-wallet-service/src/lib/blockchainmonitor.ts index ff97e9e9cd1..11ba7334cd8 100644 --- a/packages/bitcore-wallet-service/src/lib/blockchainmonitor.ts +++ b/packages/bitcore-wallet-service/src/lib/blockchainmonitor.ts @@ -70,7 +70,10 @@ export class BlockchainMonitor { matic: {}, xrp: {}, doge: {}, - ltc: {} + ltc: {}, + arb: {}, + base: {}, + op: {}, }; const chainNetworkPairs = []; From 5bbe222756031843c6f26af8fc1a380985c5d97c Mon Sep 17 00:00:00 2001 From: Justin Langston Date: Tue, 14 May 2024 17:17:27 -0400 Subject: [PATCH 4/7] v10.0.35 --- lerna.json | 2 +- packages/bitcore-node/package-lock.json | 6 +++--- packages/bitcore-node/package.json | 4 ++-- packages/bitcore-wallet-client/package-lock.json | 4 ++-- packages/bitcore-wallet-client/package.json | 4 ++-- packages/bitcore-wallet-service/package-lock.json | 4 ++-- packages/bitcore-wallet-service/package.json | 2 +- packages/bitcore-wallet/package-lock.json | 4 ++-- packages/bitcore-wallet/package.json | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lerna.json b/lerna.json index ad74a241773..07d3f4b517b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "2.9.1", - "version": "10.0.34", + "version": "10.0.35", "packages": [ "packages/[^insight]*" ] diff --git a/packages/bitcore-node/package-lock.json b/packages/bitcore-node/package-lock.json index 3572ded60eb..03d7752b7b7 100644 --- a/packages/bitcore-node/package-lock.json +++ b/packages/bitcore-node/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-node", - "version": "10.0.34", + "version": "10.0.35", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-node", - "version": "10.0.34", + "version": "10.0.35", "license": "MIT", "dependencies": { "abi-decoder": "2.4.0", @@ -18,7 +18,7 @@ "bitcore-p2p": "^10.0.28", "bitcore-p2p-cash": "^10.0.28", "bitcore-p2p-doge": "^10.0.32", - "bitcore-wallet-client": "^10.0.34", + "bitcore-wallet-client": "^10.0.35", "body-parser": "1.18.3", "cors": "2.8.4", "crypto-rpc": "https://github.com/bitpay/crypto-rpc.git#2c94b2a671021ff8c76d08233147fe197f0794de", diff --git a/packages/bitcore-node/package.json b/packages/bitcore-node/package.json index fb42f8f7dce..4734cdceab9 100644 --- a/packages/bitcore-node/package.json +++ b/packages/bitcore-node/package.json @@ -4,7 +4,7 @@ "engines": { "node": ">=18.0.0" }, - "version": "10.0.34", + "version": "10.0.35", "author": "Justin Langston ", "contributors": [ "Justin Langston ", @@ -99,7 +99,7 @@ "bitcore-p2p": "^10.0.28", "bitcore-p2p-cash": "^10.0.28", "bitcore-p2p-doge": "^10.0.32", - "bitcore-wallet-client": "^10.0.34", + "bitcore-wallet-client": "^10.0.35", "body-parser": "1.18.3", "cors": "2.8.4", "crypto-rpc": "https://github.com/bitpay/crypto-rpc.git#2c94b2a671021ff8c76d08233147fe197f0794de", diff --git a/packages/bitcore-wallet-client/package-lock.json b/packages/bitcore-wallet-client/package-lock.json index e0ee707a9b9..8720c25b3ab 100644 --- a/packages/bitcore-wallet-client/package-lock.json +++ b/packages/bitcore-wallet-client/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet-client", - "version": "10.0.34", + "version": "10.0.35", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-wallet-client", - "version": "10.0.34", + "version": "10.0.35", "license": "MIT", "dependencies": { "ajv": "6.12.0", diff --git a/packages/bitcore-wallet-client/package.json b/packages/bitcore-wallet-client/package.json index c60e5789606..ded5a948fd2 100644 --- a/packages/bitcore-wallet-client/package.json +++ b/packages/bitcore-wallet-client/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet-client", "description": "Client for bitcore-wallet-service", "author": "BitPay Inc", - "version": "10.0.34", + "version": "10.0.35", "license": "MIT", "main": "ts_build/index.js", "types": "ts_build/index.d.js", @@ -44,7 +44,7 @@ "devDependencies": { "@types/lodash": "^4.14.136", "@types/node": "^18.11.18", - "bitcore-wallet-service": "^10.0.34", + "bitcore-wallet-service": "^10.0.35", "browserify": "^13.1.0", "chai": "^1.9.1", "coveralls": "^3.0.2", diff --git a/packages/bitcore-wallet-service/package-lock.json b/packages/bitcore-wallet-service/package-lock.json index d6d81eb389b..f853db29b2d 100644 --- a/packages/bitcore-wallet-service/package-lock.json +++ b/packages/bitcore-wallet-service/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet-service", - "version": "10.0.34", + "version": "10.0.35", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bitcore-wallet-service", - "version": "10.0.34", + "version": "10.0.35", "license": "MIT", "dependencies": { "@sendgrid/mail": "6.5.4", diff --git a/packages/bitcore-wallet-service/package.json b/packages/bitcore-wallet-service/package.json index 14cb7097b57..4f3499247b6 100644 --- a/packages/bitcore-wallet-service/package.json +++ b/packages/bitcore-wallet-service/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet-service", "description": "A service for Mutisig HD Bitcoin Wallets", "author": "BitPay Inc", - "version": "10.0.34", + "version": "10.0.35", "license": "MIT", "main": "ts_build/index.js", "types": "./ts_build/index.d.ts", diff --git a/packages/bitcore-wallet/package-lock.json b/packages/bitcore-wallet/package-lock.json index a9595d4d315..817ae777f9f 100644 --- a/packages/bitcore-wallet/package-lock.json +++ b/packages/bitcore-wallet/package-lock.json @@ -1,12 +1,12 @@ { "name": "bitcore-wallet", - "version": "10.0.34", + "version": "10.0.35", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bitcore-wallet", - "version": "10.0.34", + "version": "10.0.35", "dependencies": { "async": "^2.5.0", "commander": "^2.6.0", diff --git a/packages/bitcore-wallet/package.json b/packages/bitcore-wallet/package.json index 40c2d7a69a1..dfcebeefdaa 100644 --- a/packages/bitcore-wallet/package.json +++ b/packages/bitcore-wallet/package.json @@ -2,7 +2,7 @@ "name": "bitcore-wallet", "description": "A CLI Mutisig HD Bitcoin Wallet, demo for Bitcore Wallet Service", "author": "BitPay Inc", - "version": "10.0.34", + "version": "10.0.35", "keywords": [ "bitcoin", "copay", @@ -19,7 +19,7 @@ "dependencies": { "async": "^2.5.0", "bitcore-lib": "^10.0.28", - "bitcore-wallet-client": "^10.0.34", + "bitcore-wallet-client": "^10.0.35", "commander": "^2.6.0", "lodash": "^3.3.1", "moment": "^2.9.0", From ff8a4219b5fdad262388da5cae1f5e463452f5c4 Mon Sep 17 00:00:00 2001 From: lyambo Date: Wed, 15 May 2024 14:38:58 -0400 Subject: [PATCH 5/7] add chain to copayer --- packages/bitcore-wallet-service/src/lib/model/copayer.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/bitcore-wallet-service/src/lib/model/copayer.ts b/packages/bitcore-wallet-service/src/lib/model/copayer.ts index c5fff94b33e..34403f2ad23 100644 --- a/packages/bitcore-wallet-service/src/lib/model/copayer.ts +++ b/packages/bitcore-wallet-service/src/lib/model/copayer.ts @@ -63,11 +63,12 @@ export class Copayer { const x = new Copayer(); x.version = 2; - x.createdOn = Math.floor(Date.now() / 1000); + x.createdOn = Math.floor(Date.now() / 1000); x.coin = opts.coin; + x.chain = opts.chain || opts.coin; x.xPubKey = opts.xPubKey; x.hardwareSourcePublicKey = opts.hardwareSourcePublicKey; - x.id = Copayer._xPubToCopayerId(opts.coin, x.xPubKey); + x.id = Copayer._xPubToCopayerId(opts.chain, x.xPubKey); x.name = opts.name; x.requestPubKey = opts.requestPubKey; x.signature = opts.signature; From 51cd3c14ca98e479fdcf68b0867bbce355f5c3ef Mon Sep 17 00:00:00 2001 From: lyambo Date: Thu, 16 May 2024 09:25:27 -0400 Subject: [PATCH 6/7] ecsp stream handling --- .../src/providers/chain-state/evm/api/ecsp.ts | 18 +++++++++--- .../chain-state/evm/models/transaction.ts | 26 ++++++++--------- .../chain-state/external/providers/moralis.ts | 28 ++++++++++++++++++- .../chain-state/external/streams/apiStream.ts | 16 ++++++++--- .../external/streams/nodeStream.ts | 3 +- .../src/lib/model/copayer.ts | 2 +- 6 files changed, 69 insertions(+), 24 deletions(-) diff --git a/packages/bitcore-node/src/providers/chain-state/evm/api/ecsp.ts b/packages/bitcore-node/src/providers/chain-state/evm/api/ecsp.ts index 3e68250d943..403f7e88c65 100644 --- a/packages/bitcore-node/src/providers/chain-state/evm/api/ecsp.ts +++ b/packages/bitcore-node/src/providers/chain-state/evm/api/ecsp.ts @@ -208,7 +208,10 @@ export class BaseEVMExternalStateProvider extends InternalStateProvider implemen }).bind(this); const txStream = new NodeQueryStream(block?.transactions || [], getTransaction, args); // stream results into response - await NodeQueryStream.onStream(txStream, req!, res!); + const result = await NodeQueryStream.onStream(txStream, req!, res!); + if (result?.success === false) { + logger.error('Error mid-stream (streamTransactions): %o', result.error); + } } catch (err) { logger.error('Error streaming transactions from historical node %o', err); throw err; @@ -220,14 +223,18 @@ export class BaseEVMExternalStateProvider extends InternalStateProvider implemen const { tokenAddress } = args; try { // Calculate confirmations with tip height + let result; const tip = await this.getLocalTip(params); args.tipHeight = tip ? tip.height : 0; if (!args.tokenAddress) { const txStream = MoralisAPI.streamTransactionsByAddress({ chain, network, address, args }); - await ExternalApiStream.onStream(txStream, req!, res!); + result = await ExternalApiStream.onStream(txStream, req!, res!); } else { const tokenTransfers = MoralisAPI.streamERC20TransactionsByAddress({ chain, network, address, tokenAddress, args }); - await ExternalApiStream.onStream(tokenTransfers, req!, res!); + result = await ExternalApiStream.onStream(tokenTransfers, req!, res!); + } + if (result?.success === false) { + logger.error('Error mid-stream (streamAddressTransactions): %o', result.error); } } catch (err) { logger.error('Error streaming address transactions from external provider: %o', err); @@ -258,7 +265,10 @@ export class BaseEVMExternalStateProvider extends InternalStateProvider implemen // Pipe all txStreams to the mergedStream ExternalApiStream.mergeStreams(txStreams, mergedStream); // Ensure mergeStream resolves - await _mergedStream; + const result = await _mergedStream; + if (result?.success === false) { + logger.error('Error mid-stream (streamWalletTransactions): %o', result.error); + } } catch (err) { logger.error('Error streaming wallet transactions from external provider: %o', err); throw err; diff --git a/packages/bitcore-node/src/providers/chain-state/evm/models/transaction.ts b/packages/bitcore-node/src/providers/chain-state/evm/models/transaction.ts index c75e29a5c35..75172f44c48 100644 --- a/packages/bitcore-node/src/providers/chain-state/evm/models/transaction.ts +++ b/packages/bitcore-node/src/providers/chain-state/evm/models/transaction.ts @@ -159,8 +159,8 @@ export class EVMTransactionModel extends BaseTransaction { } } - getAllTouchedAddresses(tx: Partial): { tos: IEVMCachedAddress[], froms: IEVMCachedAddress[] } { - const {to, from, effects} = tx; + getAllTouchedAddresses(tx: Partial): { tos: IEVMCachedAddress[], froms: IEVMCachedAddress[] } { + const { to, from, effects } = tx; let toBatch = new Set(); let fromBatch = new Set(); const addToBatch = (batch: Set, obj: IEVMCachedAddress) => { @@ -179,7 +179,7 @@ export class EVMTransactionModel extends BaseTransaction { // Handle ERC20s addToBatch(toBatch, { address: effect.to, tokenAddress: effect.contractAddress }); addToBatch(fromBatch, { address: effect.from, tokenAddress: effect.contractAddress }); - } + } } } @@ -254,7 +254,7 @@ export class EVMTransactionModel extends BaseTransaction { walletsAddys.map(w => w.wallet), w => w.toHexString() ); - + // If config value is set then only store needed tx properties let leanTx: IEVMTransaction | IEVMTransactionInProcess = tx; if ((Config.chainConfig({ chain, network }) as IEVMNetworkConfig).leanTransactionStorage) { @@ -325,7 +325,7 @@ export class EVMTransactionModel extends BaseTransaction { ...erc20Data }; } - } catch (e) {} + } catch (e) { } try { const erc721Data: IAbiDecodeResponse = getErc721Decoder().decodeMethod(input); if (erc721Data) { @@ -334,7 +334,7 @@ export class EVMTransactionModel extends BaseTransaction { ...erc721Data }; } - } catch (e) {} + } catch (e) { } try { const invoiceData: IAbiDecodeResponse = getInvoiceDecoder().decodeMethod(input); if (invoiceData) { @@ -343,7 +343,7 @@ export class EVMTransactionModel extends BaseTransaction { ...invoiceData }; } - } catch (e) {} + } catch (e) { } try { const multisendData: IAbiDecodeResponse = getMultisendDecoder().decodeMethod(input); if (multisendData) { @@ -352,7 +352,7 @@ export class EVMTransactionModel extends BaseTransaction { ...multisendData }; } - } catch (e) {} + } catch (e) { } try { const multisigData: IAbiDecodeResponse = getMultisigDecoder().decodeMethod(input); if (multisigData) { @@ -361,10 +361,10 @@ export class EVMTransactionModel extends BaseTransaction { ...multisigData }; } - } catch (e) {} + } catch (e) { } return undefined; } - + /** * Creates an object with param names as keys instead of an array of objects * @param abi @@ -530,7 +530,7 @@ export class EVMTransactionModel extends BaseTransaction { tx: IEVMTransactionInProcess | Partial>, options?: TransformOptions ): EVMTransactionJSON | string { - + let transaction: EVMTransactionJSON = { txid: tx.txid || '', network: tx.network || '', @@ -548,7 +548,7 @@ export class EVMTransactionModel extends BaseTransaction { from: tx.from || '', effects: tx.effects || [] }; - + // Add non-lean properties if we aren't excluding them const config = (Config.chainConfig({ chain: tx.chain as string, network: tx.network as string }) as IEVMNetworkConfig); if (config && !config.leanTransactionStorage) { @@ -558,7 +558,7 @@ export class EVMTransactionModel extends BaseTransaction { data: dataStr, abiType: tx.abiType || valueOrDefault(decodedData, undefined), internal: tx.internal - ? tx.internal.map(t => ({ ...t, decodedData: this.abiDecode(t.action.input || '0x') })) + ? tx.internal.map(t => ({ ...t, decodedData: this.abiDecode(t?.action?.input || '0x') })) : [], calls: tx.calls ? tx.calls.map(t => ({ ...t, decodedData: this.abiDecode(t.input || '0x') })) : [] }; diff --git a/packages/bitcore-node/src/providers/chain-state/external/providers/moralis.ts b/packages/bitcore-node/src/providers/chain-state/external/providers/moralis.ts index d5b66d51a05..12e862c9f7e 100644 --- a/packages/bitcore-node/src/providers/chain-state/external/providers/moralis.ts +++ b/packages/bitcore-node/src/providers/chain-state/external/providers/moralis.ts @@ -2,6 +2,7 @@ import request = require('request'); import config from '../../../../config'; import { isDateValid } from '../../../../utils/check'; import { EVMTransactionStorage } from '../../evm/models/transaction'; +import { ErigonTraceResponse } from '../../evm/p2p/rpcs/erigonRpc'; import { EVMTransactionJSON, Transaction } from '../../evm/types'; import moralisChains from '../defaults'; import { ExternalApiStream as apiStream } from '../streams/apiStream'; @@ -151,11 +152,36 @@ const transformTransaction = (tx) => { to: tx.to_address, from: tx.from_address, data: tx.input, - internal: tx.internal_transactions, + internal: tx?.internal_transactions.map(t => transformInternalTransaction(t)), effects: tx.effects, }; } +const transformInternalTransaction = (tx) => { + return { + action: { + callType: tx.type?.toLowerCase(), + from: tx.from, + gas: tx.gas, + input: tx.input, + to: tx.to, + value: tx.value, + }, + blockHash: tx.block_hash, + blockNumber: Number(tx.block_number), + error: tx.error, + result: { + gasUsed: tx.gas_used, + output: tx.output + }, + subtraces: tx.subtraces, + traceAddress: tx.traceAddress || [], + transactionHash: tx.transaction_hash, + transactionPosition: tx.transactionPosition || 0, + type: tx.type?.toLowerCase() + } as ErigonTraceResponse; +} + const transformTokenTransfer = (transfer) => { let _transfer = transformTransaction(transfer); return { diff --git a/packages/bitcore-node/src/providers/chain-state/external/streams/apiStream.ts b/packages/bitcore-node/src/providers/chain-state/external/streams/apiStream.ts index d59b642ee7b..9b80646ebd5 100644 --- a/packages/bitcore-node/src/providers/chain-state/external/streams/apiStream.ts +++ b/packages/bitcore-node/src/providers/chain-state/external/streams/apiStream.ts @@ -71,8 +71,9 @@ export class ExternalApiStream extends Readable { } // handles events emitted by the streamed response, request from client, and response to client - static onStream(stream: Readable, req: Request, res: Response): Promise { - return new Promise((resolve, reject) => { + static onStream(stream: Readable, req: Request, res: Response): + Promise<{ success: boolean, error?: any }> { + return new Promise<{ success: boolean, error?: any }>((resolve, reject) => { let closed = false; let isFirst = true; @@ -88,7 +89,14 @@ export class ExternalApiStream extends Readable { stream.on('error', function (err) { if (!closed) { closed = true; - return reject(err); + if (!isFirst) { + res.write(',\n{"error": "An error occurred during data stream"}\n]'); + res.end(); + res.destroy(); + return resolve({ success: false, error: err }); + } else { + return reject(err); + } } return; }); @@ -115,7 +123,7 @@ export class ExternalApiStream extends Readable { closed = true; } res.end(); - resolve(true); + resolve({ success: true }); } }); }); diff --git a/packages/bitcore-node/src/providers/chain-state/external/streams/nodeStream.ts b/packages/bitcore-node/src/providers/chain-state/external/streams/nodeStream.ts index f2240bfbdea..8d374c8af0d 100644 --- a/packages/bitcore-node/src/providers/chain-state/external/streams/nodeStream.ts +++ b/packages/bitcore-node/src/providers/chain-state/external/streams/nodeStream.ts @@ -37,7 +37,8 @@ export class NodeQueryStream extends Readable { } } - static onStream(stream: Readable, req: Request, res: Response): Promise { + static onStream(stream: Readable, req: Request, res: Response): + Promise<{ success: boolean, error?: any }> { return ExternalApiStream.onStream(stream, req, res); } diff --git a/packages/bitcore-wallet-service/src/lib/model/copayer.ts b/packages/bitcore-wallet-service/src/lib/model/copayer.ts index 34403f2ad23..f144fc65f7c 100644 --- a/packages/bitcore-wallet-service/src/lib/model/copayer.ts +++ b/packages/bitcore-wallet-service/src/lib/model/copayer.ts @@ -63,7 +63,7 @@ export class Copayer { const x = new Copayer(); x.version = 2; - x.createdOn = Math.floor(Date.now() / 1000); + x.createdOn = Math.floor(Date.now() / 1000); x.coin = opts.coin; x.chain = opts.chain || opts.coin; x.xPubKey = opts.xPubKey; From 141a14ab1d03ef005d6a051a96087412f2e83ea6 Mon Sep 17 00:00:00 2001 From: lyambo Date: Thu, 16 May 2024 14:14:37 -0400 Subject: [PATCH 7/7] remove .only --- packages/bitcore-client/test/unit/wallet.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bitcore-client/test/unit/wallet.test.ts b/packages/bitcore-client/test/unit/wallet.test.ts index 6fe380f2ff8..1ccd47406bb 100644 --- a/packages/bitcore-client/test/unit/wallet.test.ts +++ b/packages/bitcore-client/test/unit/wallet.test.ts @@ -250,7 +250,7 @@ describe('Wallet', function() { } }); - describe.only('importKeys', function() { + describe('importKeys', function() { walletName = 'BitcoreClientTestImportKeys'; let requestStub; let sleepStub;