aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/web3-wrapper/CHANGELOG.json13
-rw-r--r--packages/web3-wrapper/package.json1
-rw-r--r--packages/web3-wrapper/src/index.ts3
-rw-r--r--packages/web3-wrapper/src/marshaller.ts18
-rw-r--r--packages/web3-wrapper/src/types.ts27
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts26
-rw-r--r--packages/web3-wrapper/test/web3_wrapper_test.ts14
7 files changed, 90 insertions, 12 deletions
diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json
index b938f6986..cc65c2a7d 100644
--- a/packages/web3-wrapper/CHANGELOG.json
+++ b/packages/web3-wrapper/CHANGELOG.json
@@ -1,5 +1,18 @@
[
{
+ "version": "3.1.5",
+ "changes": [
+ {
+ "note": "Add unmarshalling of transaction receipts",
+ "pr": 1291
+ },
+ {
+ "note": "Return `undefined` instead of `null` if transaction receipt not found",
+ "pr": 1291
+ }
+ ]
+ },
+ {
"timestamp": 1542208198,
"version": "3.1.4",
"changes": [
diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json
index 2469f7627..8d4d7ec35 100644
--- a/packages/web3-wrapper/package.json
+++ b/packages/web3-wrapper/package.json
@@ -10,6 +10,7 @@
"scripts": {
"build": "tsc -b",
"build:ci": "yarn build",
+ "watch_without_deps": "tsc -w",
"clean": "shx rm -rf lib generated_docs",
"lint": "tslint --format stylish --project .",
"test": "yarn run_mocha",
diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts
index 679563a2b..4d20ba9be 100644
--- a/packages/web3-wrapper/src/index.ts
+++ b/packages/web3-wrapper/src/index.ts
@@ -52,6 +52,9 @@ export {
CallDataRPC,
BlockWithoutTransactionDataRPC,
BlockWithTransactionDataRPC,
+ TransactionReceiptStatusRPC,
+ TransactionReceiptRPC,
+ LogEntryRPC,
TransactionRPC,
TxDataRPC,
} from './types';
diff --git a/packages/web3-wrapper/src/marshaller.ts b/packages/web3-wrapper/src/marshaller.ts
index 299c6a64c..7bd274c85 100644
--- a/packages/web3-wrapper/src/marshaller.ts
+++ b/packages/web3-wrapper/src/marshaller.ts
@@ -9,6 +9,7 @@ import {
LogEntry,
RawLogEntry,
Transaction,
+ TransactionReceipt,
TxData,
} from 'ethereum-types';
import ethUtil = require('ethereumjs-util');
@@ -21,6 +22,7 @@ import {
BlockWithTransactionDataRPC,
CallDataRPC,
CallTxDataBaseRPC,
+ TransactionReceiptRPC,
TransactionRPC,
TxDataRPC,
} from './types';
@@ -92,6 +94,22 @@ export const marshaller = {
return tx;
},
/**
+ * Unmarshall transaction receipt
+ * @param txReceiptRpc transaction receipt to unmarshall
+ * @return unmarshalled transaction receipt
+ */
+ unmarshalTransactionReceipt(txReceiptRpc: TransactionReceiptRPC): TransactionReceipt {
+ const txReceipt = {
+ ...txReceiptRpc,
+ blockNumber: utils.convertHexToNumber(txReceiptRpc.blockNumber),
+ transactionIndex: utils.convertHexToNumber(txReceiptRpc.transactionIndex),
+ cumulativeGasUsed: utils.convertHexToNumber(txReceiptRpc.cumulativeGasUsed),
+ gasUsed: utils.convertHexToNumber(txReceiptRpc.gasUsed),
+ logs: _.map(txReceiptRpc.logs, marshaller.unmarshalLog.bind(marshaller)),
+ };
+ return txReceipt;
+ },
+ /**
* Unmarshall transaction data
* @param txDataRpc transaction data to unmarshall
* @return unmarshalled transaction data
diff --git a/packages/web3-wrapper/src/types.ts b/packages/web3-wrapper/src/types.ts
index e81039186..eb5a35f07 100644
--- a/packages/web3-wrapper/src/types.ts
+++ b/packages/web3-wrapper/src/types.ts
@@ -41,6 +41,33 @@ export interface TransactionRPC {
input: string;
}
+export interface TransactionReceiptRPC {
+ blockHash: string;
+ blockNumber: string;
+ transactionHash: string;
+ transactionIndex: string;
+ from: string;
+ to: string;
+ status: TransactionReceiptStatusRPC;
+ cumulativeGasUsed: string;
+ gasUsed: string;
+ contractAddress: string | null;
+ logs: LogEntryRPC[];
+}
+
+export interface LogEntryRPC {
+ logIndex: string | null;
+ transactionIndex: string | null;
+ transactionHash: string;
+ blockHash: string | null;
+ blockNumber: string | null;
+ address: string;
+ data: string;
+ topics: string[];
+}
+
+export type TransactionReceiptStatusRPC = null | string | 0 | 1;
+
export interface CallTxDataBaseRPC {
to?: string;
value?: string;
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
index be1713f20..f1247e48a 100644
--- a/packages/web3-wrapper/src/web3_wrapper.ts
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -27,6 +27,7 @@ import {
BlockWithoutTransactionDataRPC,
BlockWithTransactionDataRPC,
NodeType,
+ TransactionReceiptRPC,
TransactionRPC,
Web3WrapperErrors,
} from './types';
@@ -212,20 +213,23 @@ export class Web3Wrapper {
return networkId;
}
/**
- * Retrieves the transaction receipt for a given transaction hash
+ * Retrieves the transaction receipt for a given transaction hash if found
* @param txHash Transaction hash
- * @returns The transaction receipt, including it's status (0: failed, 1: succeeded or undefined: not found)
+ * @returns The transaction receipt, including it's status (0: failed, 1: succeeded). Returns undefined if transaction not found.
*/
- public async getTransactionReceiptAsync(txHash: string): Promise<TransactionReceipt> {
+ public async getTransactionReceiptIfExistsAsync(txHash: string): Promise<TransactionReceipt | undefined> {
assert.isHexString('txHash', txHash);
- const transactionReceipt = await this.sendRawPayloadAsync<TransactionReceipt>({
+ const transactionReceiptRpc = await this.sendRawPayloadAsync<TransactionReceiptRPC>({
method: 'eth_getTransactionReceipt',
params: [txHash],
});
- if (!_.isNull(transactionReceipt)) {
- transactionReceipt.status = Web3Wrapper._normalizeTxReceiptStatus(transactionReceipt.status);
+ if (!_.isNull(transactionReceiptRpc)) {
+ transactionReceiptRpc.status = Web3Wrapper._normalizeTxReceiptStatus(transactionReceiptRpc.status);
+ const transactionReceipt = marshaller.unmarshalTransactionReceipt(transactionReceiptRpc);
+ return transactionReceipt;
+ } else {
+ return undefined;
}
- return transactionReceipt;
}
/**
* Retrieves the transaction data for a given transaction
@@ -572,8 +576,8 @@ export class Web3Wrapper {
assert.isNumber('timeoutMs', timeoutMs);
}
// Immediately check if the transaction has already been mined.
- let transactionReceipt = await this.getTransactionReceiptAsync(txHash);
- if (!_.isNull(transactionReceipt) && !_.isNull(transactionReceipt.blockNumber)) {
+ let transactionReceipt = await this.getTransactionReceiptIfExistsAsync(txHash);
+ if (!_.isUndefined(transactionReceipt) && !_.isNull(transactionReceipt.blockNumber)) {
const logsWithDecodedArgs = _.map(
transactionReceipt.logs,
this.abiDecoder.tryToDecodeLogOrNoop.bind(this.abiDecoder),
@@ -600,8 +604,8 @@ export class Web3Wrapper {
return reject(Web3WrapperErrors.TransactionMiningTimeout);
}
- transactionReceipt = await this.getTransactionReceiptAsync(txHash);
- if (!_.isNull(transactionReceipt)) {
+ transactionReceipt = await this.getTransactionReceiptIfExistsAsync(txHash);
+ if (!_.isUndefined(transactionReceipt)) {
intervalUtils.clearAsyncExcludingInterval(intervalId);
const logsWithDecodedArgs = _.map(
transactionReceipt.logs,
diff --git a/packages/web3-wrapper/test/web3_wrapper_test.ts b/packages/web3-wrapper/test/web3_wrapper_test.ts
index 164253777..935c67636 100644
--- a/packages/web3-wrapper/test/web3_wrapper_test.ts
+++ b/packages/web3-wrapper/test/web3_wrapper_test.ts
@@ -1,5 +1,5 @@
import * as chai from 'chai';
-import { BlockParamLiteral, JSONRPCErrorCallback, JSONRPCRequestPayload } from 'ethereum-types';
+import { BlockParamLiteral, JSONRPCErrorCallback, JSONRPCRequestPayload, TransactionReceipt } from 'ethereum-types';
import * as Ganache from 'ganache-core';
import * as _ from 'lodash';
import 'mocha';
@@ -98,6 +98,18 @@ describe('Web3Wrapper tests', () => {
expect(typeof blockNumber).to.be.equal('number');
});
});
+ describe('#getTransactionReceiptAsync/awaitTransactionSuccessAsync', () => {
+ it('get block number', async () => {
+ const payload = { from: addresses[0], to: addresses[1], value: 1 };
+ const txHash = await web3Wrapper.sendTransactionAsync(payload);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ const receiptIfExists = await web3Wrapper.getTransactionReceiptIfExistsAsync(txHash);
+ expect(receiptIfExists).to.not.be.undefined();
+ const receipt = receiptIfExists as TransactionReceipt;
+ expect(receipt.transactionIndex).to.be.a('number');
+ expect(receipt.transactionHash).to.be.equal(txHash);
+ });
+ });
describe('#getBlockIfExistsAsync', () => {
it('gets block when supplied a valid BlockParamLiteral value', async () => {
const blockParamLiteral = BlockParamLiteral.Earliest;