aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web3-wrapper
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web3-wrapper')
-rw-r--r--packages/web3-wrapper/CHANGELOG.json17
-rw-r--r--packages/web3-wrapper/package.json2
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts69
3 files changed, 81 insertions, 7 deletions
diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json
index 54a816e23..bd4bf06dd 100644
--- a/packages/web3-wrapper/CHANGELOG.json
+++ b/packages/web3-wrapper/CHANGELOG.json
@@ -3,6 +3,18 @@
"version": "0.7.0",
"changes": [
{
+ "note": "Add `web3Wrapper.getContractCodeAsync`",
+ "pr": 675
+ },
+ {
+ "note": "Add `web3Wrapper.getTransactionTraceAsync`",
+ "pr": 675
+ },
+ {
+ "note": "Add `web3Wrapper.getBlockWithTransactionDataAsync`",
+ "pr": 675
+ },
+ {
"note": "Add exported uniqueVersionIds object",
"pr": 622
},
@@ -17,6 +29,11 @@
{
"note": "Add new setHeadAsync method",
"pr": 622
+ },
+ {
+ "note":
+ "Improve performance of awaitTransactionMinedAsync by immediately checking if the transaction was already mined instead of waiting for the first interval.",
+ "pr": 688
}
]
},
diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json
index 694f07e45..de2b72ac6 100644
--- a/packages/web3-wrapper/package.json
+++ b/packages/web3-wrapper/package.json
@@ -15,7 +15,7 @@
"test": "yarn run_mocha",
"rebuild_and_test": "run-s clean build test",
"test:circleci": "yarn test:coverage",
- "run_mocha": "mocha lib/test/**/*_test.js --bail --exit",
+ "run_mocha": "mocha --require source-map-support/register lib/test/**/*_test.js --bail --exit",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
index 559bf3ea9..5d2eedcb3 100644
--- a/packages/web3-wrapper/src/web3_wrapper.ts
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -2,6 +2,7 @@ import { AbiDecoder, addressUtils, BigNumber, intervalUtils, promisify } from '@
import {
BlockParam,
BlockWithoutTransactionData,
+ BlockWithTransactionData,
CallData,
ContractAbi,
FilterObject,
@@ -10,8 +11,10 @@ import {
LogEntry,
Provider,
RawLogEntry,
+ TraceParams,
TransactionReceipt,
TransactionReceiptWithDecodedLogs,
+ TransactionTrace,
TxData,
} from 'ethereum-types';
import * as _ from 'lodash';
@@ -187,12 +190,34 @@ export class Web3Wrapper {
* @returns Whether or not contract code was found at the supplied address
*/
public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
- const code = await promisify<string>(this._web3.eth.getCode)(address);
+ const code = await this.getContractCodeAsync(address);
// Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients
const isCodeEmpty = /^0x0{0,40}$/i.test(code);
return !isCodeEmpty;
}
/**
+ * Gets the contract code by address
+ * @param address Address of the contract
+ * @return Code of the contract
+ */
+ public async getContractCodeAsync(address: string): Promise<string> {
+ const code = await promisify<string>(this._web3.eth.getCode)(address);
+ return code;
+ }
+ /**
+ * Gets the debug trace of a transaction
+ * @param txHash Hash of the transactuon to get a trace for
+ * @param traceParams Config object allowing you to specify if you need memory/storage/stack traces.
+ * @return Transaction trace
+ */
+ public async getTransactionTraceAsync(txHash: string, traceParams: TraceParams): Promise<TransactionTrace> {
+ const trace = await this._sendRawPayloadAsync<TransactionTrace>({
+ method: 'debug_traceTransaction',
+ params: [txHash, traceParams],
+ });
+ return trace;
+ }
+ /**
* Sign a message with a specific address's private key (`eth_sign`)
* @param address Address of signer
* @param message Message to sign
@@ -211,13 +236,30 @@ export class Web3Wrapper {
return blockNumber;
}
/**
- * Fetch a specific Ethereum block
+ * Fetch a specific Ethereum block without transaction data
* @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
* @returns The requested block without transaction data
*/
public async getBlockAsync(blockParam: string | BlockParam): Promise<BlockWithoutTransactionData> {
- const block = await promisify<BlockWithoutTransactionData>(this._web3.eth.getBlock)(blockParam);
- return block;
+ const shouldIncludeTransactionData = false;
+ const blockWithoutTransactionData = await promisify<BlockWithoutTransactionData>(this._web3.eth.getBlock)(
+ blockParam,
+ shouldIncludeTransactionData,
+ );
+ return blockWithoutTransactionData;
+ }
+ /**
+ * Fetch a specific Ethereum block with transaction data
+ * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
+ * @returns The requested block with transaction data
+ */
+ public async getBlockWithTransactionDataAsync(blockParam: string | BlockParam): Promise<BlockWithTransactionData> {
+ const shouldIncludeTransactionData = true;
+ const blockWithTransactionData = await promisify<BlockWithTransactionData>(this._web3.eth.getBlock)(
+ blockParam,
+ shouldIncludeTransactionData,
+ );
+ return blockWithTransactionData;
}
/**
* Fetch a block's timestamp
@@ -360,6 +402,21 @@ export class Web3Wrapper {
pollingIntervalMs: number = 1000,
timeoutMs?: number,
): Promise<TransactionReceiptWithDecodedLogs> {
+ // Immediately check if the transaction has already been mined.
+ let transactionReceipt = await this.getTransactionReceiptAsync(txHash);
+ if (!_.isNull(transactionReceipt)) {
+ const logsWithDecodedArgs = _.map(
+ transactionReceipt.logs,
+ this.abiDecoder.tryToDecodeLogOrNoop.bind(this.abiDecoder),
+ );
+ const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
+ ...transactionReceipt,
+ logs: logsWithDecodedArgs,
+ };
+ return transactionReceiptWithDecodedLogArgs;
+ }
+
+ // Otherwise, check again every pollingIntervalMs.
let wasTimeoutExceeded = false;
if (timeoutMs) {
setTimeout(() => (wasTimeoutExceeded = true), timeoutMs);
@@ -374,7 +431,7 @@ export class Web3Wrapper {
return reject(Web3WrapperErrors.TransactionMiningTimeout);
}
- const transactionReceipt = await this.getTransactionReceiptAsync(txHash);
+ transactionReceipt = await this.getTransactionReceiptAsync(txHash);
if (!_.isNull(transactionReceipt)) {
intervalUtils.clearAsyncExcludingInterval(intervalId);
const logsWithDecodedArgs = _.map(
@@ -469,4 +526,4 @@ export class Web3Wrapper {
const decimal = this._web3.toDecimal(hex);
return decimal;
}
-}
+} // tslint:disable-line:max-file-line-count