Browse Source

REF: electrum batching for getBalance

fixqramount
Overtorment 6 years ago
parent
commit
70e4fff25d
  1. 44
      BlueElectrum.js
  2. 2
      Electrum.test.js
  3. 2
      HDWallet.test.js
  4. 10
      WatchOnlyWallet.test.js
  5. 10
      package-lock.json
  6. 2
      package.json

44
BlueElectrum.js

@ -157,22 +157,37 @@ async function getTransactionsFullByAddress(address) {
/**
*
* @param addresses {Array}
* @param batchsize {Number}
* @returns {Promise<{balance: number, unconfirmed_balance: number, addresses: object}>}
*/
async function multiGetBalanceByAddress(addresses) {
async function multiGetBalanceByAddress(addresses, batchsize) {
batchsize = batchsize || 100;
if (!mainClient) throw new Error('Electrum client is not connected');
let balance = 0;
let unconfirmedBalance = 0;
let addressesAssoc = {};
for (let addr of addresses) {
let b = await getBalanceByAddress(addr);
let ret = { balance: 0, unconfirmed_balance: 0, addresses: {} };
balance += b.confirmed;
unconfirmedBalance += b.unconfirmed;
addressesAssoc[addr] = b;
let chunks = splitIntoChunks(addresses, batchsize);
for (let chunk of chunks) {
let scripthashes = [];
let scripthash2addr = {};
for (let addr of chunk) {
let script = bitcoin.address.toOutputScript(addr);
let hash = bitcoin.crypto.sha256(script);
let reversedHash = Buffer.from(reverse(hash));
reversedHash = reversedHash.toString('hex');
scripthashes.push(reversedHash);
scripthash2addr[reversedHash] = addr;
}
let balances = await mainClient.blockchainScripthash_getBalanceBatch(scripthashes);
for (let bal of balances) {
ret.balance += +bal.result.confirmed;
ret.unconfirmed_balance += +bal.result.unconfirmed;
ret.addresses[scripthash2addr[bal.param]] = bal.result;
}
}
return { balance, unconfirmed_balance: unconfirmedBalance, addresses: addressesAssoc };
return ret;
}
/**
@ -233,6 +248,15 @@ module.exports.forceDisconnect = () => {
module.exports.hardcodedPeers = hardcodedPeers;
let splitIntoChunks = function(arr, chunkSize) {
let groups = [];
let i;
for (i = 0; i < arr.length; i += chunkSize) {
groups.push(arr.slice(i, i + chunkSize));
}
return groups;
};
/*

2
Electrum.test.js

@ -76,7 +76,7 @@ describe('Electrum', () => {
assert.strictEqual(txs[0].height, 563077);
});
it.only('BlueElectrum can do getTransactionsFullByAddress()', async function() {
it('BlueElectrum can do getTransactionsFullByAddress()', async function() {
let txs = await BlueElectrum.getTransactionsFullByAddress('bc1qt4t9xl2gmjvxgmp5gev6m8e6s9c85979ta7jeh');
for (let tx of txs) {
assert.ok(tx.address === 'bc1qt4t9xl2gmjvxgmp5gev6m8e6s9c85979ta7jeh');

2
HDWallet.test.js

@ -84,7 +84,7 @@ it('HD (BIP49) can work with a gap', async function() {
});
it('Segwit HD (BIP49) can batch fetch many txs', async function() {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 240 * 1000;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 300 * 1000;
let hd = new HDSegwitP2SHWallet();
hd._xpub = 'ypub6WZ2c7YJ1SQ1rBYftwMqwV9bBmybXzETFxWmkzMz25bCf6FkDdXjNgR7zRW8JGSnoddNdUH7ZQS7JeQAddxdGpwgPskcsXFcvSn1JdGVcPQ'; // cant fetch txs
await hd.fetchBalance();

10
WatchOnlyWallet.test.js

@ -101,4 +101,14 @@ describe('Watch only wallet', () => {
assert.strictEqual(w.getTransactions().length, 4);
assert.ok((await w.getAddressAsync()).startsWith('1'));
});
it('can fetch large HD', async () => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 500 * 1000;
let w = new WatchOnlyWallet();
w.setSecret('ypub6WnnYxkQCGeowv4BXq9Y9PHaXgHMJg9TkFaDJkunhcTAfbDw8z3LvV9kFNHGjeVaEoGdsSJgaMWpUBvYvpYGMJd43gTK5opecVVkvLwKttx');
await w.fetchBalance();
await w.fetchTransactions();
assert.ok(w.getTransactions().length >= 167);
});
});

10
package-lock.json

@ -5902,8 +5902,8 @@
"integrity": "sha512-1o25iFRf/dbgauTWalEzmD1EmRN3a2CzP/K7UVpYLEBduk96LF0FyUdCcf4Ry2mAWJ1VxyblFjC93q6qlLwA2A=="
},
"electrum-client": {
"version": "git+https://github.com/Overtorment/node-electrum-client.git#59712b3b7dbe666431eeb5649d6f6541529d386a",
"from": "git+https://github.com/Overtorment/node-electrum-client.git"
"version": "git+https://github.com/Overtorment/rn-electrum-client.git#989d785b23adf21e5176ef09a1906a7aad316b61",
"from": "git+https://github.com/Overtorment/rn-electrum-client.git"
},
"elliptic": {
"version": "6.4.1",
@ -14524,8 +14524,7 @@
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true,
"optional": true
"dev": true
},
"braces": {
"version": "2.3.2",
@ -14798,8 +14797,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
"dev": true,
"optional": true
"dev": true
},
"micromatch": {
"version": "3.1.10",

2
package.json

@ -52,7 +52,7 @@
"buffer-reverse": "1.0.1",
"crypto-js": "3.1.9-1",
"dayjs": "1.8.13",
"electrum-client": "git+https://github.com/Overtorment/node-electrum-client.git",
"electrum-client": "git+https://github.com/Overtorment/rn-electrum-client.git",
"eslint-config-prettier": "4.2.0",
"eslint-config-standard": "12.0.0",
"eslint-config-standard-react": "7.0.2",

Loading…
Cancel
Save