|
|
@ -12,16 +12,15 @@ var helper = require('../../../../lib/helper.js') |
|
|
|
* |
|
|
|
* |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class Recorder { |
|
|
|
class Recorder { |
|
|
|
constructor (executionContext, udapp, fileManager, config) { |
|
|
|
constructor (blockchain, fileManager, config) { |
|
|
|
var self = this |
|
|
|
var self = this |
|
|
|
self.event = new EventManager() |
|
|
|
self.event = new EventManager() |
|
|
|
self.executionContext = executionContext |
|
|
|
self.blockchain = blockchain |
|
|
|
self.data = { _listen: true, _replay: false, journal: [], _createdContracts: {}, _createdContractsReverse: {}, _usedAccounts: {}, _abis: {}, _contractABIReferences: {}, _linkReferences: {} } |
|
|
|
self.data = { _listen: true, _replay: false, journal: [], _createdContracts: {}, _createdContractsReverse: {}, _usedAccounts: {}, _abis: {}, _contractABIReferences: {}, _linkReferences: {} } |
|
|
|
this.udapp = udapp |
|
|
|
|
|
|
|
this.fileManager = fileManager |
|
|
|
this.fileManager = fileManager |
|
|
|
this.config = config |
|
|
|
this.config = config |
|
|
|
|
|
|
|
|
|
|
|
this.udapp.event.register('initiatingTransaction', (timestamp, tx, payLoad) => { |
|
|
|
this.blockchain.event.register('initiatingTransaction', (timestamp, tx, payLoad) => { |
|
|
|
if (tx.useCall) return |
|
|
|
if (tx.useCall) return |
|
|
|
var { from, to, value } = tx |
|
|
|
var { from, to, value } = tx |
|
|
|
|
|
|
|
|
|
|
@ -59,7 +58,7 @@ class Recorder { |
|
|
|
if (thistimestamp) record.parameters[p] = `created{${thistimestamp}}` |
|
|
|
if (thistimestamp) record.parameters[p] = `created{${thistimestamp}}` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
this.udapp.getAccounts((error, accounts) => { |
|
|
|
this.blockchain.getAccounts((error, accounts) => { |
|
|
|
if (error) return console.log(error) |
|
|
|
if (error) return console.log(error) |
|
|
|
record.from = `account{${accounts.indexOf(from)}}` |
|
|
|
record.from = `account{${accounts.indexOf(from)}}` |
|
|
|
self.data._usedAccounts[record.from] = from |
|
|
|
self.data._usedAccounts[record.from] = from |
|
|
@ -68,11 +67,11 @@ class Recorder { |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
this.udapp.event.register('transactionExecuted', (error, from, to, data, call, txResult, timestamp) => { |
|
|
|
this.blockchain.event.register('transactionExecuted', (error, from, to, data, call, txResult, timestamp) => { |
|
|
|
if (error) return console.log(error) |
|
|
|
if (error) return console.log(error) |
|
|
|
if (call) return |
|
|
|
if (call) return |
|
|
|
|
|
|
|
|
|
|
|
const rawAddress = this.executionContext.isVM() ? txResult.result.createdAddress : txResult.result.contractAddress |
|
|
|
const rawAddress = this.blockchain.getAddressFromTransactionResult(txResult) |
|
|
|
if (!rawAddress) return // not a contract creation
|
|
|
|
if (!rawAddress) return // not a contract creation
|
|
|
|
const stringAddress = this.addressToString(rawAddress) |
|
|
|
const stringAddress = this.addressToString(rawAddress) |
|
|
|
const address = ethutil.toChecksumAddress(stringAddress) |
|
|
|
const address = ethutil.toChecksumAddress(stringAddress) |
|
|
@ -80,7 +79,7 @@ class Recorder { |
|
|
|
this.data._createdContracts[address] = timestamp |
|
|
|
this.data._createdContracts[address] = timestamp |
|
|
|
this.data._createdContractsReverse[timestamp] = address |
|
|
|
this.data._createdContractsReverse[timestamp] = address |
|
|
|
}) |
|
|
|
}) |
|
|
|
this.executionContext.event.register('contextChanged', this.clearAll.bind(this)) |
|
|
|
this.blockchain.event.register('contextChanged', this.clearAll.bind(this)) |
|
|
|
this.event.register('newTxRecorded', (count) => { |
|
|
|
this.event.register('newTxRecorded', (count) => { |
|
|
|
this.event.trigger('recorderCountChange', [count]) |
|
|
|
this.event.trigger('recorderCountChange', [count]) |
|
|
|
}) |
|
|
|
}) |
|
|
@ -183,7 +182,6 @@ class Recorder { |
|
|
|
* @param {Object} accounts |
|
|
|
* @param {Object} accounts |
|
|
|
* @param {Object} options |
|
|
|
* @param {Object} options |
|
|
|
* @param {Object} abis |
|
|
|
* @param {Object} abis |
|
|
|
* @param {Object} udapp |
|
|
|
|
|
|
|
* @param {Function} newContractFn |
|
|
|
* @param {Function} newContractFn |
|
|
|
* |
|
|
|
* |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -195,8 +193,7 @@ class Recorder { |
|
|
|
var record = self.resolveAddress(tx.record, accounts, options) |
|
|
|
var record = self.resolveAddress(tx.record, accounts, options) |
|
|
|
var abi = abis[tx.record.abi] |
|
|
|
var abi = abis[tx.record.abi] |
|
|
|
if (!abi) { |
|
|
|
if (!abi) { |
|
|
|
alertCb('cannot find ABI for ' + tx.record.abi + '. Execution stopped at ' + index) |
|
|
|
return alertCb('cannot find ABI for ' + tx.record.abi + '. Execution stopped at ' + index) |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
/* Resolve Library */ |
|
|
|
/* Resolve Library */ |
|
|
|
if (record.linkReferences && Object.keys(record.linkReferences).length) { |
|
|
|
if (record.linkReferences && Object.keys(record.linkReferences).length) { |
|
|
@ -220,8 +217,7 @@ class Recorder { |
|
|
|
} |
|
|
|
} |
|
|
|
if (!fnABI) { |
|
|
|
if (!fnABI) { |
|
|
|
alertCb('cannot resolve abi of ' + JSON.stringify(record, null, '\t') + '. Execution stopped at ' + index) |
|
|
|
alertCb('cannot resolve abi of ' + JSON.stringify(record, null, '\t') + '. Execution stopped at ' + index) |
|
|
|
cb('cannot resolve abi') |
|
|
|
return cb('cannot resolve abi') |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
if (tx.record.parameters) { |
|
|
|
if (tx.record.parameters) { |
|
|
|
/* check if we have some params to resolve */ |
|
|
|
/* check if we have some params to resolve */ |
|
|
@ -239,35 +235,32 @@ class Recorder { |
|
|
|
tx.record.parameters[index] = value |
|
|
|
tx.record.parameters[index] = value |
|
|
|
}) |
|
|
|
}) |
|
|
|
} catch (e) { |
|
|
|
} catch (e) { |
|
|
|
alertCb('cannot resolve input parameters ' + JSON.stringify(tx.record.parameters) + '. Execution stopped at ' + index) |
|
|
|
return alertCb('cannot resolve input parameters ' + JSON.stringify(tx.record.parameters) + '. Execution stopped at ' + index) |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
var data = format.encodeData(fnABI, tx.record.parameters, tx.record.bytecode) |
|
|
|
var data = format.encodeData(fnABI, tx.record.parameters, tx.record.bytecode) |
|
|
|
if (data.error) { |
|
|
|
if (data.error) { |
|
|
|
alertCb(data.error + '. Record:' + JSON.stringify(record, null, '\t') + '. Execution stopped at ' + index) |
|
|
|
alertCb(data.error + '. Record:' + JSON.stringify(record, null, '\t') + '. Execution stopped at ' + index) |
|
|
|
cb(data.error) |
|
|
|
return cb(data.error) |
|
|
|
return |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
logCallBack(`(${index}) ${JSON.stringify(record, null, '\t')}`) |
|
|
|
|
|
|
|
logCallBack(`(${index}) data: ${data.data}`) |
|
|
|
|
|
|
|
record.data = { dataHex: data.data, funArgs: tx.record.parameters, funAbi: fnABI, contractBytecode: tx.record.bytecode, contractName: tx.record.contractName, timestamp: tx.timestamp } |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
self.udapp.runTx(record, confirmationCb, continueCb, promptCb, |
|
|
|
logCallBack(`(${index}) ${JSON.stringify(record, null, '\t')}`) |
|
|
|
|
|
|
|
logCallBack(`(${index}) data: ${data.data}`) |
|
|
|
|
|
|
|
record.data = { dataHex: data.data, funArgs: tx.record.parameters, funAbi: fnABI, contractBytecode: tx.record.bytecode, contractName: tx.record.contractName, timestamp: tx.timestamp } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.blockchain.runTransaction (record, continueCb, promptCb, confirmationCb, |
|
|
|
function (err, txResult) { |
|
|
|
function (err, txResult) { |
|
|
|
if (err) { |
|
|
|
if (err) { |
|
|
|
console.error(err) |
|
|
|
console.error(err) |
|
|
|
logCallBack(err + '. Execution failed at ' + index) |
|
|
|
return logCallBack(err + '. Execution failed at ' + index) |
|
|
|
} else { |
|
|
|
} |
|
|
|
const rawAddress = self.executionContext.isVM() ? txResult.result.createdAddress : txResult.result.contractAddress |
|
|
|
const rawAddress = self.blockchain.getAddressFromTransactionResult(txResult) |
|
|
|
if (rawAddress) { |
|
|
|
if (rawAddress) { |
|
|
|
const stringAddress = self.addressToString(rawAddress) |
|
|
|
const stringAddress = self.addressToString(rawAddress) |
|
|
|
const address = ethutil.toChecksumAddress(stringAddress) |
|
|
|
const address = ethutil.toChecksumAddress(stringAddress) |
|
|
|
// save back created addresses for the convertion from tokens to real adresses
|
|
|
|
// save back created addresses for the convertion from tokens to real adresses
|
|
|
|
self.data._createdContracts[address] = tx.timestamp |
|
|
|
self.data._createdContracts[address] = tx.timestamp |
|
|
|
self.data._createdContractsReverse[tx.timestamp] = address |
|
|
|
self.data._createdContractsReverse[tx.timestamp] = address |
|
|
|
newContractFn(abi, address, record.contractName) |
|
|
|
newContractFn(abi, address, record.contractName) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
cb(err) |
|
|
|
cb(err) |
|
|
|
} |
|
|
|
} |
|
|
|