diff --git a/packages/caliper-ethereum/lib/ethereum.js b/packages/caliper-ethereum/lib/ethereum.js index 420b3715e7..dda81b25d8 100644 --- a/packages/caliper-ethereum/lib/ethereum.js +++ b/packages/caliper-ethereum/lib/ethereum.js @@ -101,12 +101,22 @@ class Ethereum extends BlockchainInterface { */ async getContext(name, args) { let context = { + chainId: 1, clientIndex: this.clientIndex, + gasPrice: 0, contracts: {}, nonces: {}, web3: this.web3 }; + context.gasPrice = this.ethereumConfig.gasPrice !== undefined ? + this.ethereumConfig.gasPrice : + await this.web3.eth.getGasPrice(); + + context.chainId = this.ethereumConfig.chainId !== undefined ? + this.ethereumConfig.chainId : + await this.web3.eth.getChainId(); + for (const key of Object.keys(args.contracts)) { context.contracts[key] = { contract: new this.web3.eth.Contract(args.contracts[key].abi, args.contracts[key].address), @@ -212,6 +222,21 @@ class Ethereum extends BlockchainInterface { context.nonces[context.fromAddress] = nonce + 1; params.nonce = nonce; } + + if (context.gasPrice !== undefined) { + // leaving this value unset causes web3 to fetch gasPrice on the + // fly this can cause transactions to be reordered, which in + // turn causes nonce failures + params.gasPrice = context.gasPrice; + } + + if (context.chainId !== undefined) { + // leaving this value unset causes web3 to fetch chainId on the + // fly this can cause transactions to be reordered, which in + // turn causes nonce failures + params.chainId = context.chainId; + } + if (methodCall.args) { if (contractInfo.gas && contractInfo.gas[methodCall.verb]) { params.gas = contractInfo.gas[methodCall.verb];