From 6482da7e2557356cdec0c13c1db3caa59547ed68 Mon Sep 17 00:00:00 2001 From: dylmanning Date: Thu, 30 Jan 2025 22:26:47 +1100 Subject: [PATCH] Chunk contract calls --- src/pointsService.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/pointsService.ts b/src/pointsService.ts index 0209d65..4a3de28 100644 --- a/src/pointsService.ts +++ b/src/pointsService.ts @@ -195,16 +195,31 @@ export class FractalityPointsService { _getBatchUserAssets = async (users: string[]): Promise => { if (!this.blockchainConnection) throw new Error('Blockchain connection not initialized') const { contract } = this.blockchainConnection - const balancePromises = users.map((user) => contract.balanceOf(user)) - const allUserShares = await Promise.all(balancePromises) - const assetPromises = allUserShares.map((shareAmount) => contract.convertToAssets(shareAmount)) - const allUserAssets = await Promise.all(assetPromises) + + // NOTE: Letting 3 calls run in parallel to avoid hitting the rate limit + const balancePromises: Promise[] = users.map((user) => contract.balanceOf(user)) + const allUserShares: bigint[] = await this._chunkedPromiseAll(balancePromises, 3) + const assetPromises: Promise[] = allUserShares.map((shareAmount) => + contract.convertToAssets(shareAmount) + ) + const allUserAssets: bigint[] = await this._chunkedPromiseAll(assetPromises, 3) + return users.map((user, index) => ({ address: user, balance: allUserAssets[index] })) as UserBalance[] } + async _chunkedPromiseAll(items: Promise[], chunkSize: number): Promise { + const results: R[] = [] + for (let i = 0; i < items.length; i += chunkSize) { + const chunk = items.slice(i, i + chunkSize) + const result = await Promise.all(chunk) + results.push(...result) + } + return results + } + _batchUpdateUserPoints = async ( newUserPoints: UserBalance[], userAssets: UserBalance[],