|
|
|
@ -101,9 +101,13 @@ class TxRunner { |
|
|
|
|
return callback('Invalid account selected') |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
executionContext.vm().stateManager.getAccount(Buffer.from(from.replace('0x', ''), 'hex'), (err, res) => { |
|
|
|
|
if (err) { |
|
|
|
|
callback('Account not found') |
|
|
|
|
} else { |
|
|
|
|
var tx = new EthJSTX({ |
|
|
|
|
timestamp: timestamp, |
|
|
|
|
nonce: new BN(account.nonce++), |
|
|
|
|
nonce: new BN(res.nonce), |
|
|
|
|
gasPrice: new BN(1), |
|
|
|
|
gasLimit: gasLimit, |
|
|
|
|
to: to, |
|
|
|
@ -127,20 +131,28 @@ class TxRunner { |
|
|
|
|
}) |
|
|
|
|
if (!useCall) { |
|
|
|
|
++self.blockNumber |
|
|
|
|
this.runBlockInVm(tx, block, callback) |
|
|
|
|
} else { |
|
|
|
|
executionContext.vm().stateManager.checkpoint(() => { }) |
|
|
|
|
executionContext.vm().stateManager.checkpoint(() => { |
|
|
|
|
this.runBlockInVm(tx, block, (err, result) => { |
|
|
|
|
executionContext.vm().stateManager.revert(() => { |
|
|
|
|
callback(err, result) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
executionContext.checkpointAndCommit(() => { |
|
|
|
|
runBlockInVm (tx, block, callback) { |
|
|
|
|
executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function (err, results) { |
|
|
|
|
err = err ? err.message : err |
|
|
|
|
if (err) { |
|
|
|
|
return callback(err) |
|
|
|
|
} |
|
|
|
|
let result = results.results[0] |
|
|
|
|
if (useCall) { |
|
|
|
|
executionContext.vm().stateManager.revert(function () { }) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (result) { |
|
|
|
|
result.status = '0x' + result.vm.exception.toString(16) |
|
|
|
|
} |
|
|
|
@ -153,7 +165,6 @@ class TxRunner { |
|
|
|
|
transactionHash: ethJSUtil.bufferToHex(Buffer.from(tx.hash())) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}, 1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
runInNode (from, to, data, value, gasLimit, useCall, confirmCb, gasEstimationForceSend, promptCb, callback) { |
|
|
|
|