diff --git a/lib/plugins/wallet/zcashd/zcashd.js b/lib/plugins/wallet/zcashd/zcashd.js index 867b4ee7..759fc639 100644 --- a/lib/plugins/wallet/zcashd/zcashd.js +++ b/lib/plugins/wallet/zcashd/zcashd.js @@ -1,4 +1,5 @@ const _ = require('lodash/fp') +const pRetry = require('p-retry') const jsonRpc = require('../../common/json-rpc') const coinUtils = require('../../../coin-utils') @@ -54,34 +55,28 @@ function sendCoins (account, address, cryptoAtoms, cryptoCode) { const coins = cryptoAtoms.shift(-unitScale).toFixed(8) const checkSendStatus = function (opid) { return new Promise((resolve, reject) => { - function checker(timeout) { - setTimeout(() => { - fetch('z_getoperationstatus', [[opid]]) - .then(res => { - const status = _.get('status', res[0]) - switch(status) { - case 'success': - resolve(res[0]) - break - case 'failed': - reject(res[0].error) - break - case 'executing': - if (timeout > 0) { - checker(timeout - 500) - } else { - reject(res) - } - } - }) - }, 500) - } - checker(10000) + fetch('z_getoperationstatus', [[opid]]) + .then(res => { + const status = _.get('status', res[0]) + switch (status) { + case 'success': + resolve(res[0]) + break + case 'failed': + throw new pRetry.AbortError(res[0].error) + case 'executing': + reject(res[0].error) + break + } + }) }) - } + } + const checker = async () => { + return pRetry(checkSendStatus, { retries: 20, minTimeout: 300, factor: 1.05 }) + } return checkCryptoCode(cryptoCode) .then(() => fetch('z_sendmany', ["ANY_TADDR", [{address, amount: coins}]])) - .then(checkSendStatus) + .then(checker) .then((res) => { return { fee: _.get('params.fee', res), diff --git a/package-lock.json b/package-lock.json index 057972f1..5f0b6bb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2316,6 +2316,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -8123,6 +8128,16 @@ "timed-out": "^4.0.0", "url-parse-lax": "^1.0.0", "url-to-options": "^1.0.1" + }, + "dependencies": { + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + } } }, "graceful-fs": { @@ -12713,12 +12728,13 @@ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "p-retry": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.4.0.tgz", + "integrity": "sha512-gVB/tBsG+3AHI1SyDHRrX6n9ZL0Bcbifps9W9/Bgu3Oyu4/OrAh8SvDzDsvpP0oxfCt3oWNT+0fQ9LyUGwBTLg==", "requires": { - "p-finally": "^1.0.0" + "@types/retry": "^0.12.0", + "retry": "^0.12.0" } }, "p-try": { diff --git a/package.json b/package.json index 97547c28..96edb13b 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "nocache": "^2.1.0", "numeral": "^2.0.3", "p-each-series": "^1.0.0", + "p-retry": "^4.4.0", "pg-native": "^3.0.0", "pg-promise": "^7.4.1", "pify": "^3.0.0",