aboutsummaryrefslogtreecommitdiffstats
path: root/packages/web3-wrapper/src/web3_wrapper.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web3-wrapper/src/web3_wrapper.ts')
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts42
1 files changed, 35 insertions, 7 deletions
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
index c60d5fe33..40a554522 100644
--- a/packages/web3-wrapper/src/web3_wrapper.ts
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -19,6 +19,8 @@ import * as Web3 from 'web3';
import { Web3WrapperErrors } from './types';
+const BASE_TEN = 10;
+
/**
* A wrapper around the Web3.js 0.x library that provides a consistent, clean promise-based interface.
*/
@@ -48,7 +50,7 @@ export class Web3Wrapper {
* @return The amount in units.
*/
public static toUnitAmount(amount: BigNumber, decimals: number): BigNumber {
- const aUnit = new BigNumber(10).pow(decimals);
+ const aUnit = new BigNumber(BASE_TEN).pow(decimals);
const unit = amount.div(aUnit);
return unit;
}
@@ -61,7 +63,7 @@ export class Web3Wrapper {
* @return The amount in baseUnits.
*/
public static toBaseUnitAmount(amount: BigNumber, decimals: number): BigNumber {
- const unit = new BigNumber(10).pow(decimals);
+ const unit = new BigNumber(BASE_TEN).pow(decimals);
const baseUnitAmount = amount.times(unit);
const hasDecimals = baseUnitAmount.decimalPlaces() !== 0;
if (hasDecimals) {
@@ -180,8 +182,8 @@ export class Web3Wrapper {
public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
const code = await promisify<string>(this._web3.eth.getCode)(address);
// Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients
- const codeIsEmpty = /^0x0{0,40}$/i.test(code);
- return !codeIsEmpty;
+ const isCodeEmpty = /^0x0{0,40}$/i.test(code);
+ return !isCodeEmpty;
}
/**
* Sign a message with a specific address's private key (`eth_sign`)
@@ -326,6 +328,10 @@ export class Web3Wrapper {
}
/**
* Waits for a transaction to be mined and returns the transaction receipt.
+ * Note that just because a transaction was mined does not mean it was
+ * successful. You need to check the status code of the transaction receipt
+ * to find out if it was successful, or use the helper method
+ * awaitTransactionSuccessAsync.
* @param txHash Transaction hash
* @param pollingIntervalMs How often (in ms) should we check if the transaction is mined.
* @param timeoutMs How long (in ms) to poll for transaction mined until aborting.
@@ -336,16 +342,16 @@ export class Web3Wrapper {
pollingIntervalMs: number = 1000,
timeoutMs?: number,
): Promise<TransactionReceiptWithDecodedLogs> {
- let timeoutExceeded = false;
+ let wasTimeoutExceeded = false;
if (timeoutMs) {
- setTimeout(() => (timeoutExceeded = true), timeoutMs);
+ setTimeout(() => (wasTimeoutExceeded = true), timeoutMs);
}
const txReceiptPromise = new Promise(
(resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
const intervalId = intervalUtils.setAsyncExcludingInterval(
async () => {
- if (timeoutExceeded) {
+ if (wasTimeoutExceeded) {
intervalUtils.clearAsyncExcludingInterval(intervalId);
return reject(Web3WrapperErrors.TransactionMiningTimeout);
}
@@ -375,6 +381,28 @@ export class Web3Wrapper {
const txReceipt = await txReceiptPromise;
return txReceipt;
}
+ /**
+ * Waits for a transaction to be mined and returns the transaction receipt.
+ * Unlike awaitTransactionMinedAsync, it will throw if the receipt has a
+ * status that is not equal to 1. A status of 0 or null indicates that the
+ * transaction was mined, but failed. See:
+ * https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt
+ * @param txHash Transaction hash
+ * @param pollingIntervalMs How often (in ms) should we check if the transaction is mined.
+ * @param timeoutMs How long (in ms) to poll for transaction mined until aborting.
+ * @return Transaction receipt with decoded log args.
+ */
+ public async awaitTransactionSuccessAsync(
+ txHash: string,
+ pollingIntervalMs: number = 1000,
+ timeoutMs?: number,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const receipt = await this.awaitTransactionMinedAsync(txHash, pollingIntervalMs, timeoutMs);
+ if (receipt.status !== 1) {
+ throw new Error(`Transaction failed: ${txHash}`);
+ }
+ return receipt;
+ }
private async _sendRawPayloadAsync<A>(payload: Partial<JSONRPCRequestPayload>): Promise<A> {
const sendAsync = this._web3.currentProvider.sendAsync.bind(this._web3.currentProvider);
const response = await promisify<JSONRPCResponsePayload>(sendAsync)(payload);