diff --git a/src/sdk/market/pricefeeds/RedstoneUpdater.ts b/src/sdk/market/pricefeeds/RedstoneUpdater.ts index 2cd3251c..4f589a00 100644 --- a/src/sdk/market/pricefeeds/RedstoneUpdater.ts +++ b/src/sdk/market/pricefeeds/RedstoneUpdater.ts @@ -8,7 +8,7 @@ import { encodeAbiParameters, toBytes } from "viem"; import { SDKConstruct } from "../../base"; import type { GearboxSDK } from "../../GearboxSDK"; import type { ILogger, RawTx } from "../../types"; -import { childLogger } from "../../utils"; +import { childLogger, retry } from "../../utils"; import type { RedstonePriceFeedContract } from "./RedstonePriceFeed"; interface TimestampedCalldata { @@ -194,7 +194,10 @@ export class RedstoneUpdater extends SDKConstruct { urls: this.#gateways, }); - const dataPayload = await wrapper.prepareRedstonePayload(true); + const dataPayload = await retry( + () => wrapper.prepareRedstonePayload(true), + { attempts: 5, interval: this.#historicalTimestampMs ? 30_500 : 250 }, + ); const parsed = RedstonePayload.parse(toBytes(`0x${dataPayload}`)); const packagesByDataFeedId = groupDataPackages(parsed.signedDataPackages); diff --git a/src/sdk/utils/index.ts b/src/sdk/utils/index.ts index af80749b..84352ec4 100644 --- a/src/sdk/utils/index.ts +++ b/src/sdk/utils/index.ts @@ -7,3 +7,4 @@ export * from "./filterDust"; export * from "./formatter"; export * from "./json"; export * from "./mappers"; +export * from "./retry"; diff --git a/src/sdk/utils/retry.ts b/src/sdk/utils/retry.ts new file mode 100644 index 00000000..50b147e3 --- /dev/null +++ b/src/sdk/utils/retry.ts @@ -0,0 +1,24 @@ +export interface RetryOptions { + attempts?: number; + interval?: number; +} + +export async function retry( + fn: () => Promise, + options: RetryOptions = {}, +): Promise { + const { attempts = 3, interval = 200 } = options; + let cause: any; + for (let i = 0; i < attempts; i++) { + try { + const result = await fn(); + return result; + } catch (e) { + cause = e; + await new Promise(resolve => { + setTimeout(resolve, interval); + }); + } + } + throw new Error(`all attempts failed: ${cause}`); +}