diff --git a/src.ts/providers/abstract-provider.ts b/src.ts/providers/abstract-provider.ts index e70730e764..604fc13b70 100644 --- a/src.ts/providers/abstract-provider.ts +++ b/src.ts/providers/abstract-provider.ts @@ -41,6 +41,16 @@ export type Filter = { topics?: Array>, } +// @TODO: This is not supported as an EventType yet, as it will +// need some additional work to adhere to the serialized +// format for events. But we want to allow it for getLogs +// for now. +export type FilterByBlock = { + blockHash?: string, + address?: string, + topics?: Array>, +} + export interface Log { blockNumber?: number; blockHash?: string; @@ -134,7 +144,7 @@ export abstract class Provider implements OnceBlockable { abstract getTransaction(transactionHash: string): Promise; abstract getTransactionReceipt(transactionHash: string): Promise; - abstract getLogs(filter: Filter): Promise>; + abstract getLogs(filter: Filter | FilterByBlock): Promise>; abstract resolveName(name: string | Promise): Promise; abstract lookupAddress(address: string | Promise): Promise; diff --git a/src.ts/providers/base-provider.ts b/src.ts/providers/base-provider.ts index 625a0439f9..cc03f95a7d 100644 --- a/src.ts/providers/base-provider.ts +++ b/src.ts/providers/base-provider.ts @@ -23,7 +23,7 @@ import { Provider } from './abstract-provider'; import { Block, BlockTag, - EventType, Filter, + EventType, Filter, FilterByBlock, Listener, Log, TransactionReceipt, TransactionRequest, TransactionResponse @@ -366,7 +366,16 @@ const formatFilter = { topics: allowNull(checkTopics, undefined), }; +const formatFilterByBlock = { + blockHash: allowNull(checkHash, undefined), + address: allowNull(getAddress, undefined), + topics: allowNull(checkTopics, undefined), +}; + function checkFilter(filter: any): any { + if (filter && filter.blockHash) { + return check(formatFilterByBlock, filter); + } return check(formatFilter, filter); } @@ -1071,7 +1080,7 @@ export class BaseProvider extends Provider { }); } - getLogs(filter: Filter): Promise> { + getLogs(filter: Filter | FilterByBlock): Promise> { return this.ready.then(() => { return resolveProperties(filter).then((filter) => { return this._resolveNames(filter, ['address']).then((filter) => { diff --git a/src.ts/providers/etherscan-provider.ts b/src.ts/providers/etherscan-provider.ts index b728af973e..3aa388f1cc 100644 --- a/src.ts/providers/etherscan-provider.ts +++ b/src.ts/providers/etherscan-provider.ts @@ -237,6 +237,16 @@ export class EtherscanProvider extends BaseProvider{ url += '&toBlock=' + checkLogTag(params.filter.toBlock); } + if (params.filter.blockHash) { + try { + errors.throwError("Etherscan does not support blockHash filters", errors.UNSUPPORTED_OPERATION, { + operation: "getLogs(blockHash)" + }); + } catch (error) { + return Promise.reject(error); + } + } + if (params.filter.address) { url += '&address=' + params.filter.address; }