Fixed _getFilter which was dropping topics.

This commit is contained in:
Richard Moore 2022-04-13 23:37:30 -04:00
parent 56d53d02ca
commit fab9e1af5e

View File

@ -747,8 +747,20 @@ export class AbstractProvider implements Provider {
} }
async _getFilter(filter: Filter | FilterByBlockHash): Promise<PerformActionFilter> { async _getFilter(filter: Filter | FilterByBlockHash): Promise<PerformActionFilter> {
// Create a canonical representation of the topics
const topics = (filter.topics || [ ]).map((t) => {
if (t == null) { return null; }
if (Array.isArray(t)) {
return concisify(t.map((t) => t.toLowerCase()));
}
return t.toLowerCase();
});
const blockHash = ("blockHash" in filter) ? filter.blockHash: undefined;
const lookup: { [K in keyof PerformActionFilter]: Promise<PerformActionFilter[K]> } = { }; const lookup: { [K in keyof PerformActionFilter]: Promise<PerformActionFilter[K]> } = { };
// Addresses could be async (ENS names or Addressables)
if (filter.address) { if (filter.address) {
if (Array.isArray(filter.address)) { if (Array.isArray(filter.address)) {
lookup.address = <any>Promise.all(filter.address.map((a) => resolveAddress(a, this))); lookup.address = <any>Promise.all(filter.address.map((a) => resolveAddress(a, this)));
@ -757,6 +769,7 @@ export class AbstractProvider implements Provider {
} }
} }
// Block Tags could be async (i.e. relative)
const addBlockTag = (key: "fromBlock" | "toBlock") => { const addBlockTag = (key: "fromBlock" | "toBlock") => {
if ((<Filter>filter)[key] == null) { return; } if ((<Filter>filter)[key] == null) { return; }
lookup[key] = this._getBlockTag((<Filter>filter)[key]); lookup[key] = this._getBlockTag((<Filter>filter)[key]);
@ -764,14 +777,19 @@ export class AbstractProvider implements Provider {
addBlockTag("fromBlock"); addBlockTag("fromBlock");
addBlockTag("toBlock"); addBlockTag("toBlock");
// Wait for all properties to resolve
const result = await resolveProperties(lookup); const result = await resolveProperties(lookup);
// Make sure things are canonical
if (Array.isArray(result.address)) { result.address.sort(); } if (Array.isArray(result.address)) { result.address.sort(); }
if ((<FilterByBlockHash>filter).blockHash) { result.topics = topics;
if (blockHash) {
if ((<Filter>filter).fromBlock || (<Filter>filter).toBlock) { if ((<Filter>filter).fromBlock || (<Filter>filter).toBlock) {
throw new Error("invalid filter"); throw new Error("invalid filter");
} }
result.blockHash = (<FilterByBlockHash>filter).blockHash; result.blockHash = blockHash;
} }
return result; return result;