Fix bug where if block wasn't found, getBlockAsync would throw. Now it returns undefined

This commit is contained in:
Fabio Berger
2018-09-24 15:02:06 +01:00
parent 8bce407aec
commit d0448c2bbd
7 changed files with 78 additions and 31 deletions

View File

@@ -329,23 +329,28 @@ export class Web3Wrapper {
/**
* 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
* @returns The requested block without transaction data, or undefined if block was not found
*/
public async getBlockAsync(blockParam: string | BlockParam): Promise<BlockWithoutTransactionData> {
public async getBlockIfExistsAsync(
blockParam: string | BlockParam,
): Promise<BlockWithoutTransactionData | undefined> {
Web3Wrapper._assertBlockParamOrString(blockParam);
const encodedBlockParam = marshaller.marshalBlockParam(blockParam);
const method = utils.isHexStrict(blockParam) ? 'eth_getBlockByHash' : 'eth_getBlockByNumber';
const shouldIncludeTransactionData = false;
const blockWithoutTransactionDataWithHexValues = await this._sendRawPayloadAsync<
const blockWithoutTransactionDataWithHexValuesOrNull = await this._sendRawPayloadAsync<
BlockWithoutTransactionDataRPC
>({
method,
params: [encodedBlockParam, shouldIncludeTransactionData],
});
const blockWithoutTransactionData = marshaller.unmarshalIntoBlockWithoutTransactionData(
blockWithoutTransactionDataWithHexValues,
);
return blockWithoutTransactionData;
let blockWithoutTransactionDataIfExists;
if (!_.isNull(blockWithoutTransactionDataWithHexValuesOrNull)) {
blockWithoutTransactionDataIfExists = marshaller.unmarshalIntoBlockWithoutTransactionData(
blockWithoutTransactionDataWithHexValuesOrNull,
);
}
return blockWithoutTransactionDataIfExists;
}
/**
* Fetch a specific Ethereum block with transaction data
@@ -376,8 +381,11 @@ export class Web3Wrapper {
*/
public async getBlockTimestampAsync(blockParam: string | BlockParam): Promise<number> {
Web3Wrapper._assertBlockParamOrString(blockParam);
const { timestamp } = await this.getBlockAsync(blockParam);
return timestamp;
const blockIfExists = await this.getBlockIfExistsAsync(blockParam);
if (_.isUndefined(blockIfExists)) {
throw new Error(`Failed to fetch block with blockParam: ${JSON.stringify(blockParam)}`);
}
return blockIfExists.timestamp;
}
/**
* Retrieve the user addresses available through the backing provider