diff --git a/src/agents/coordinator.ts b/src/agents/coordinator.ts index 71d3b8ea2..70a0ba5a4 100644 --- a/src/agents/coordinator.ts +++ b/src/agents/coordinator.ts @@ -97,6 +97,15 @@ export class DkgCoordinatorAgent { return await Coordinator.getRitualState(ritualId); } + public static async getRitualInitTime( + provider: ethers.providers.Web3Provider, + ritualId: number + ): Promise { + const Coordinator = await this.connectReadOnly(provider); + const ritual = await Coordinator.rituals(ritualId); + return ritual[2]; + } + public static async onRitualEndEvent( provider: ethers.providers.Web3Provider, ritualId: number, diff --git a/src/dkg.ts b/src/dkg.ts index 70cce3823..8ead375cd 100644 --- a/src/dkg.ts +++ b/src/dkg.ts @@ -122,15 +122,28 @@ export class DkgClient { ); if (waitUntilEnd) { + const initTimestamp = await DkgCoordinatorAgent.getRitualInitTime(web3Provider, ritualId) const timeout = await DkgCoordinatorAgent.getTimeout(web3Provider); - const bufferedTimeout = timeout * 1.1; + const endTime = initTimestamp + timeout; + + // Wait until the current time is past the endTime + while (Math.floor(Date.now() / 1000) < endTime) { + await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for 1 second before checking again + } + + // Wait until current block time is also past the endTime + let currentBlockTime; + do { + const block = await web3Provider.getBlock('latest'); + currentBlockTime = block.timestamp; + if (currentBlockTime < endTime) { + await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for 1 second before checking again + } + } while (currentBlockTime < endTime); + try { - const isSuccessful = await Promise.race([ - DkgClient.waitUntilRitualEnd(web3Provider, ritualId), - new Promise((_, reject) => - setTimeout(() => reject(new Error('Ritual initialization timed out')), bufferedTimeout) - ), - ]); + const isSuccessful = await + DkgClient.waitUntilRitualEnd(web3Provider, ritualId) if (!isSuccessful) { throw new Error(`Ritual initialization failed. Ritual id ${ritualId}`);