mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-02-22 23:08:07 +01:00
REF: electrum batching for getBalance
This commit is contained in:
parent
4ef3340b52
commit
70e4fff25d
6 changed files with 51 additions and 19 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
generated
10
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -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…
Add table
Reference in a new issue