From 6593a92cc4a3bc9dfd9a5d45e7553f471f7ef374 Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Mon, 9 Jul 2018 16:50:38 -0400 Subject: [PATCH] add interval in case deployment gets stuck --- lib/contracts/blockchain.js | 50 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/lib/contracts/blockchain.js b/lib/contracts/blockchain.js index df4a247b..fe04ff9e 100644 --- a/lib/contracts/blockchain.js +++ b/lib/contracts/blockchain.js @@ -241,13 +241,55 @@ class Blockchain { } deployContractFromObject(deployContractObject, params, cb) { + const self = this; + let hash; + let calledBacked = false; + + function callback() { + if (calledBacked) { + return; + } + if (interval) { + clearInterval(interval); + } + calledBacked = true; + cb(...arguments); + } + + // This interval is there to compensate for the event that sometimes doesn't get triggered when using WebSocket + // FIXME The issue somehow only happens when the blockchain node is started in the same terminal + const interval = setInterval(() => { + if (!hash) { + return; // Wait until we receive the hash + } + self.web3.eth.getTransactionReceipt(hash, (err, receipt) => { + if (!err && !receipt) { + return; // Transaction is not yet complete + } + callback(err, receipt); + }); + }, 500); + deployContractObject.send({ from: params.from, gas: params.gas, gasPrice: params.gasPrice - }).on('receipt', function(receipt) { - if (receipt.contractAddress !== undefined) { - cb(null, receipt); + }, function (err, transactionHash) { + if (err) { + return callback(err); } - }).on('error', cb); + hash = transactionHash; + }) + .on('receipt', function (receipt) { + if (receipt.contractAddress !== undefined) { + callback(null, receipt); + } + }) + .then(function (_contract) { + if (!hash) { + return; // Somehow we didn't get the receipt yet... Interval will catch it + } + self.web3.eth.getTransactionReceipt(hash, callback); + }) + .catch(callback); } assertNodeConnection(noLogs, cb) {