diff --git a/src/modules/token-slot-detection/token-slot-detection.service.ts b/src/modules/token-slot-detection/token-slot-detection.service.ts index 39b570b2..997a437b 100644 --- a/src/modules/token-slot-detection/token-slot-detection.service.ts +++ b/src/modules/token-slot-detection/token-slot-detection.service.ts @@ -7,6 +7,7 @@ import { type HealthCheckState, type ServiceHealthCheckResult, } from "@/health-check"; +import { StorageService } from "@/storage"; import { fromEntries } from "remeda"; import { Service } from "typedi"; import { @@ -27,6 +28,7 @@ export class TokenSlotDetectionService { private readonly logger: Logger, private readonly apiCallService: ApiCallService, private readonly chainsService: ChainsService, + private readonly storageService: StorageService, ) { logger.setCaller(TokenSlotDetectionService); } @@ -110,37 +112,50 @@ export class TokenSlotDetectionService { let slot: Hex = "0x3"; try { - const axiosClient = this.apiCallService.getAxios( - TOKEN_SLOT_DETECTION_SERVER_BASE_URL, + const tokenSlotKey = `token-slot-key::${tokenAddress.toLowerCase()}::${chainId}`; + + const cacheInfo = await this.storageService.getCache<{ slot: Hex }>( + tokenSlotKey, ); - const { data: response } = await withTrace( - "simulation.detectTokenBalanceStorageSlot", - async () => - await this.apiCallService.get( - axiosClient, - `/${chainId}/${tokenAddress}`, - ), - { - chainId, - tokenAddress, - accountAddress, - }, - )(); + if (cacheInfo?.slot && isHex(cacheInfo.slot)) { + slot = cacheInfo.slot; + } else { + const axiosClient = this.apiCallService.getAxios( + TOKEN_SLOT_DETECTION_SERVER_BASE_URL, + ); - if (!response.success) { - this.logger.error("Failed to fetch token slot", { - tokenAddress, - chainId, - errorMessage: response.error, + const { data: response } = await withTrace( + "simulation.detectTokenBalanceStorageSlot", + async () => + await this.apiCallService.get( + axiosClient, + `/${chainId}/${tokenAddress}`, + ), + { + chainId, + tokenAddress, + accountAddress, + }, + )(); + + if (!response.success) { + this.logger.error("Failed to fetch token slot", { + tokenAddress, + chainId, + errorMessage: response.error, + }); + + throw new BadRequestException( + "Failed to simulate your supertransaction. Error: Token overrides failed", + ); + } + + slot = response.msg.slot; + await this.storageService.setCache(tokenSlotKey, { + slot, }); - - throw new BadRequestException( - "Failed to simulate your supertransaction. Error: Token overrides failed", - ); } - - slot = response.msg.slot; } catch (error) { const err = error as { data: { success: false; error: string } };