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[],