const async = require('async'); const TARGET = 15000000000000000000; const ALREADY_FUNDED = 'alreadyFunded'; function fundAccount(web3, accountAddress, callback) { let accountBalance; let coinbaseAddress; let lastNonce; let gasPrice; async.waterfall([ function getAccountBalance(next) { web3.eth.getBalance(accountAddress, (err, balance) => { if (err) { return next(err); } if (balance >= TARGET) { return next(ALREADY_FUNDED); } accountBalance = balance; next(); }); }, function getNeededParams(next) { async.parallel([ function getCoinbaseAddress(paraCb) { web3.eth.getCoinbase() .then((address) => { coinbaseAddress = address; paraCb(); }).catch(paraCb); }, function getGasPrice(paraCb) { web3.eth.getGasPrice((err, price) => { if (err) { return paraCb(err); } gasPrice = price; paraCb(); }); } ], (err, _result) => { next(err); }); }, function getNonce(next) { web3.eth.getTransactionCount(coinbaseAddress, (err, nonce) => { if (err) { return next(err); } lastNonce = nonce; next(); }); }, function sendTransaction(next) { web3.eth.sendTransaction({ from: coinbaseAddress, to: accountAddress, value: TARGET - accountBalance, gasPrice: gasPrice, nonce: lastNonce }, next); } ], (err) => { if (err && err !== ALREADY_FUNDED) { return callback(err); } callback(); }); } module.exports = fundAccount;