From 9e5113e1b6f22a6989e0eb66f793f62621641fe5 Mon Sep 17 00:00:00 2001 From: vinnyhoward Date: Thu, 8 Jan 2026 16:56:03 -0700 Subject: [PATCH] fix(assets-controllers): parallelize chain processing in token detection --- .../src/TokenDetectionController.ts | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/assets-controllers/src/TokenDetectionController.ts b/packages/assets-controllers/src/TokenDetectionController.ts index f16b34f7007..fcc8022a236 100644 --- a/packages/assets-controllers/src/TokenDetectionController.ts +++ b/packages/assets-controllers/src/TokenDetectionController.ts @@ -586,26 +586,32 @@ export class TokenDetectionController extends StaticIntervalPollingController { - for (const { chainId, networkClientId } of chainsToDetectUsingRpc) { - if (!this.#shouldDetectTokens(chainId)) { - continue; - } + // Execute all chains in parallel for better performance + const detectionPromises = chainsToDetectUsingRpc.map( + async ({ chainId, networkClientId }) => { + if (!this.#shouldDetectTokens(chainId)) { + return; + } - const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({ - chainId, - selectedAddress: addressToDetect, - }); - const tokenDetectionPromises = tokenCandidateSlices.map((tokensSlice) => - this.#addDetectedTokens({ - tokensSlice, - selectedAddress: addressToDetect, - networkClientId, + const tokenCandidateSlices = this.#getSlicesOfTokensToDetect({ chainId, - }), - ); + selectedAddress: addressToDetect, + }); + const tokenDetectionPromises = tokenCandidateSlices.map((tokensSlice) => + this.#addDetectedTokens({ + tokensSlice, + selectedAddress: addressToDetect, + networkClientId, + chainId, + }), + ); - await Promise.all(tokenDetectionPromises); - } + await Promise.all(tokenDetectionPromises); + }, + ); + + // Use allSettled to ensure one failing chain doesn't block others + await Promise.allSettled(detectionPromises); } /**