61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
const fs = require('fs');
|
|
|
|
module.exports = class Account {
|
|
constructor(web3) {
|
|
this.web3 = web3;
|
|
this.sender = null;
|
|
}
|
|
|
|
async init(argv) {
|
|
if (argv["account"]) {
|
|
if (!argv["passfile"]) {
|
|
console.error("the ---passfile option must be specified when using the --account option");
|
|
process.exit(1);
|
|
}
|
|
|
|
if (argv["sender"]) {
|
|
console.warn("--account used, --sender will be ignored");
|
|
}
|
|
|
|
this.sender = this.loadAccount(argv["account"], argv["passfile"]);
|
|
} else {
|
|
this.sender = argv["sender"] || await this.getDefaultSender();
|
|
}
|
|
}
|
|
|
|
async getDefaultSender() {
|
|
let accounts = await this.web3.eth.getAccounts();
|
|
return accounts[0];
|
|
}
|
|
|
|
|
|
loadAccount(account, passfile) {
|
|
let json = fs.readFileSync(account, "utf-8");
|
|
let pass = fs.readFileSync(passfile, "utf-8").split("\n")[0].replace("\r", "");
|
|
return this.web3.eth.accounts.decrypt(json, pass);
|
|
}
|
|
|
|
async sendMethod(methodCall, to) {
|
|
let receipt;
|
|
|
|
if (typeof(this.sender) == "string") {
|
|
let gasAmount = await methodCall.estimateGas({from: this.sender});
|
|
receipt = await methodCall.send({from: this.sender, gas: gasAmount});
|
|
} else {
|
|
let gasAmount = await methodCall.estimateGas({from: this.sender.address});
|
|
let data = methodCall.encodeABI();
|
|
let signedTx = await this.sender.signTransaction({to: to, data: data, gas: gasAmount});
|
|
receipt = await this.web3.eth.sendSignedTransaction(signedTx.rawTransaction);
|
|
}
|
|
|
|
return receipt;
|
|
}
|
|
|
|
senderAddress() {
|
|
if (typeof(this.sender) == "string") {
|
|
return this.sender;
|
|
} else {
|
|
return this.sender.address;
|
|
}
|
|
}
|
|
} |