From b4a5990a2d4d41e98b211fc8da97b7dc19fbd518 Mon Sep 17 00:00:00 2001 From: weboko Date: Tue, 25 Apr 2023 12:15:19 +0200 Subject: [PATCH] add custom fetcher --- src/rln_contract.ts | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/rln_contract.ts b/src/rln_contract.ts index b39463f..158a948 100644 --- a/src/rln_contract.ts +++ b/src/rln_contract.ts @@ -16,6 +16,7 @@ type ContractOptions = { export class RLNContract { private _contract: ethers.Contract; private membersFilter: ethers.EventFilter; + private provider: ethers.Signer | ethers.providers.Provider; private _members: Member[] = []; @@ -32,6 +33,7 @@ export class RLNContract { } constructor({ address, provider }: ContractOptions) { + this.provider = provider; this._contract = new ethers.Contract(address, RLN_ABI, provider); this.membersFilter = this.contract.filters.MemberRegistered(); } @@ -48,10 +50,10 @@ export class RLNContract { rlnInstance: RLNInstance, fromBlock?: number ): Promise { - const registeredMemberEvents = await this.contract.queryFilter( - this.membersFilter, - fromBlock - ); + const registeredMemberEvents = await queryFilter(this.contract, { + fromBlock, + membersFilter, + }); for (const event of registeredMemberEvents) { this.addMemberFromEvent(rlnInstance, event); @@ -102,3 +104,34 @@ export class RLNContract { return txRegisterReceipt?.events?.[0]; } } + +type CustomQueryOptions = { + fromBlock?: number; + membersFilter: ethers.EventFilter; +}; + +const STEP = 3000; // this value should be tested on other networks +async function queryFilter( + contract: ethers.Contract, + options: CustomQueryOptions +): Promise { + const { fromBlock, membersFilter } = options; + + if (!fromBlock) { + return contract.queryFilter(membersFilter); + } + + if (!contract.signer.provider) { + throw Error("No provider found on the contract's signer."); + } + + const toBlock = await contract.signer.provider.getBlockNumber(); + + if (fromBlock - toBlock < STEP) { + return contract.queryFilter(membersFilter); + } + + // handle other cases +} + +// tmp.contract.queryFilter(tmp.membersFilter, 7109391, 8888520).then(console.log)