From 1d2b7626139b4fbebb0127871ee9e4e20a6fdb28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Tue, 5 Jul 2022 21:22:00 +0100 Subject: [PATCH] fix: enqueue sweeping requests and loosen sweep polling --- lib/plugins.js | 4 ++-- lib/plugins/wallet/geth/base.js | 10 +++++++++- lib/poller.js | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index 0fbff479..45a83f77 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -805,8 +805,8 @@ function plugins (settings, deviceId) { } function sweepHd () { - const sql = `select id, crypto_code, hd_index from cash_out_txs - where hd_index is not null and not swept and status in ('confirmed', 'instant')` + const sql = `SELECT id, crypto_code, hd_index FROM cash_out_txs + WHERE hd_index IS NOT NULL AND NOT swept AND status IN ('confirmed', 'instant') AND created < now() - interval '1 week'` return db.any(sql) .then(rows => Promise.all(rows.map(sweepHdRow))) diff --git a/lib/plugins/wallet/geth/base.js b/lib/plugins/wallet/geth/base.js index b3994a9a..d86b1253 100644 --- a/lib/plugins/wallet/geth/base.js +++ b/lib/plugins/wallet/geth/base.js @@ -8,6 +8,8 @@ const { FeeMarketEIP1559Transaction } = require('@ethereumjs/tx') const { default: Common, Chain, Hardfork } = require('@ethereumjs/common') const util = require('ethereumjs-util') const coins = require('@lamassu/coins') +const { default: PQueue } = require('p-queue') + const pify = require('pify') const BN = require('../../../bn') const ABI = require('../../tokens') @@ -33,6 +35,11 @@ module.exports = { checkBlockchainStatus } +const SWEEP_QUEUE = new PQueue({ + concurrency: 3, + interval: 250, +}) + function connect (url) { web3.setProvider(new web3.providers.HttpProvider(url)) } @@ -173,13 +180,14 @@ function sweep (account, cryptoCode, hdIndex, settings, operatorId) { const wallet = paymentHdNode(account).deriveChild(hdIndex).getWallet() const fromAddress = wallet.getChecksumAddressString() - return confirmedBalance(fromAddress, cryptoCode) + return SWEEP_QUEUE.add(() => confirmedBalance(fromAddress, cryptoCode) .then(r => { if (r.eq(0)) return return generateTx(defaultAddress(account), wallet, r, true, cryptoCode) .then(signedTx => pify(web3.eth.sendSignedTransaction)(signedTx)) }) + ) } function newAddress (account, info, tx, settings, operatorId) { diff --git a/lib/poller.js b/lib/poller.js index 9cbd38bd..c6293a48 100644 --- a/lib/poller.js +++ b/lib/poller.js @@ -24,7 +24,7 @@ const LIVE_INCOMING_TX_INTERVAL = 5 * T.seconds const INCOMING_TX_INTERVAL_FILTER = 1 * T.minute const LIVE_INCOMING_TX_INTERVAL_FILTER = 10 * T.seconds const UNNOTIFIED_INTERVAL = 10 * T.seconds -const SWEEP_HD_INTERVAL = T.minute +const SWEEP_HD_INTERVAL = 5 * T.minute const TRADE_INTERVAL = 60 * T.seconds const PONG_INTERVAL = 10 * T.seconds const LOGS_CLEAR_INTERVAL = 1 * T.day