embark/lib/cmds/blockchain/dev_funds.js

110 lines
3.9 KiB
JavaScript
Raw Normal View History

const async = require('async');
2018-07-16 16:48:32 +00:00
const Web3 = require('web3');
const {getWeiBalanceFromString, buildUrl} = require('../../utils/utils.js');
const {readFileSync, dappPath} = require('../../core/fs');
class DevFunds {
constructor(blockchainConfig) {
this.web3 = null;
this.blockchainConfig = blockchainConfig;
this.accounts = [];
this.numAccounts = this.blockchainConfig.account.numAccounts || 0;
2018-07-16 16:48:32 +00:00
this.password = readFileSync(dappPath('config/development/password'));
this.password = 'dev_password';
this.existingNumAccounts = 0;
this.web3 = new Web3();
this.balance = Web3.utils.toWei("1", "ether");
2018-07-16 16:48:32 +00:00
if(this.blockchainConfig.account.balance){
console.dir('[blockchain/dev_funds]: converting balance from ' + this.blockchainConfig.account.balance);
this.balance = getWeiBalanceFromString(this.blockchainConfig.account.balance, this.web3);
console.dir('[blockchain/dev_funds]: converted balance to ' + this.balance);
}
}
connectToNode(cb) {
2018-07-16 16:48:32 +00:00
this.web3.setProvider(new Web3.providers.WebsocketProvider(buildUrl('ws', this.blockchainConfig.wsHost, this.blockchainConfig.wsPort), {headers: {Origin: "http://localhost:8000"}}));
this.web3.eth.getAccounts().then((accounts) => {
2018-07-16 16:48:32 +00:00
this.web3.eth.defaultAccount = accounts[0];
this.existingNumAccounts = accounts.length;
cb();
});
}
createAccounts(numAccounts, password, cb) {
2018-07-16 16:48:32 +00:00
console.dir("creating " + (numAccounts - this.existingNumAccounts) + " new accounts with password " + password);
async.timesLimit((numAccounts - this.existingNumAccounts), 1, (_, next) => {
console.dir("--- creating new account");
2018-07-16 16:48:32 +00:00
this.web3.eth.personal.newAccount(password, next);
}, (err, accounts) => {
2018-07-16 16:48:32 +00:00
if(err) console.error(err);
console.dir("-- accounts created are ");
console.dir(accounts);
this.accounts = accounts;
cb(err);
});
}
unlockAccounts(password, cb) {
async.each(this.accounts, (account, next) => {
2018-07-16 16:48:32 +00:00
console.dir('-- unlocking account ' + account + ' with password ' + password);
this.web3.eth.personal.unlockAccount(account, password).then(() => next()).catch(next);
}, cb);
}
fundAccounts(balance, cb) {
2018-07-16 16:48:32 +00:00
console.dir('-- funding accounts...');
async.each(this.accounts, (account, next) => {
2018-07-16 16:48:32 +00:00
console.dir("-- funding account " + account + " with balance " + balance);
this.web3.eth.sendTransaction({to: account, value: balance}).then((result) => {
console.dir('FUNDING ACCT result: ' + JSON.stringify(result));
next();
2018-07-16 16:48:32 +00:00
}).catch(next);
}, (err) => {
console.dir('-- FINISHED FUNDING ACCOUNTS, err= ' + err);
cb(err);
});
}
createFundAndUnlockAccounts(cb) {
async.waterfall([
2018-07-16 16:48:32 +00:00
(next) => {
console.dir('--- CONNECTING TO NODE');
this.connectToNode(next);
},
2018-07-16 16:48:32 +00:00
(next) => {
console.dir('--- CREATING THE ACCOUNTS');
this.createAccounts(this.numAccounts, this.password, next);
},
2018-07-16 16:48:32 +00:00
(next) => {
console.dir('--- UNLOCKING THE ACCOUNTS');
this.unlockAccounts(this.password, next);
},
2018-07-16 16:48:32 +00:00
(next) => {
console.dir('--- FUNDING THE ACCOUNTS');
this.fundAccounts(this.balance, next);
}
], (err) => {
console.trace(`--- COMPLETED THE ACCOUNTS (${this.accounts.join(', ')} and funded with ${this.balance} wei)`);
if(err) console.error('Error creating, unlocking, and funding accounts', err);
// this.web3.eth.getAccounts().then((accounts) => {
// let numAccts = accounts.length;
// accounts.forEach((account) => {
// this.web3.eth.getBalance(account).then((balance) => {
// console.dir('[contracts/dev_funds]: account ' + account + ' has balance of ' + balance);
// if(--numAccts === 0) cb(err);
// });
// });
// });
cb(err);
});
}
}
module.exports = DevFunds;