From 02544b66d5222a7da31f1891622aa3f6446d2716 Mon Sep 17 00:00:00 2001 From: Ben Guidarelli Date: Thu, 28 Dec 2023 09:20:30 -0500 Subject: [PATCH] adding overrides for configs (#183) * adding overrides for configs * remove http request timeout on api --- connect/src/circle-api.ts | 2 +- connect/src/config.ts | 36 +++++++++++++++++++++++++++++++++--- connect/src/whscan-api.ts | 7 +++---- connect/src/wormhole.ts | 8 ++++---- examples/src/config.ts | 19 +++++++++++++++++++ 5 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 examples/src/config.ts diff --git a/connect/src/circle-api.ts b/connect/src/circle-api.ts index f6a3bbcd4..7879ef9dc 100644 --- a/connect/src/circle-api.ts +++ b/connect/src/circle-api.ts @@ -1,8 +1,8 @@ import axios from "axios"; -import { CIRCLE_RETRY_INTERVAL } from "./config"; import { retry } from "./tasks"; // Note: mostly ripped off from https://github.com/circlefin/cctp-sample-app/blob/master/src/services/attestationService.ts +export const CIRCLE_RETRY_INTERVAL = 2000; export enum CircleAttestationStatus { complete = "complete", diff --git a/connect/src/config.ts b/connect/src/config.ts index 0fe114fea..dbd40941d 100644 --- a/connect/src/config.ts +++ b/connect/src/config.ts @@ -3,15 +3,22 @@ import { buildConfig, ChainsConfig } from "@wormhole-foundation/sdk-definitions" export const DEFAULT_TASK_TIMEOUT = 60 * 1000; // 1 minute in milliseconds -export const CIRCLE_RETRY_INTERVAL = 2000; -export const WHSCAN_RETRY_INTERVAL = 2000; - export type WormholeConfig = { api: string; circleAPI: string; chains: ChainsConfig; }; +type RecursivePartial = { + [P in keyof T]?: T[P] extends (infer U)[] + ? RecursivePartial[] + : T[P] extends object | undefined + ? RecursivePartial + : T[P]; +}; + +export type ConfigOverrides = RecursivePartial; + export const CONFIG = { Mainnet: { api: "https://api.wormholescan.io", @@ -41,6 +48,29 @@ export function networkPlatformConfigs( ) as ChainsConfig; } +// Apply any overrides to the base config +export function applyOverrides( + network: N, + overrides?: ConfigOverrides, +): WormholeConfig { + let base = CONFIG[network]; + if (!overrides) return base; + + // recurse through the overrides and apply them to the base config + function override(base: any, overrides: any) { + for (const [key, value] of Object.entries(overrides)) { + if (typeof value === "object" && !Array.isArray(value)) { + base[key] = override(base[key], value); + } else { + base[key] = value; + } + } + return base; + } + + return override(base, overrides); +} + const inNode = typeof process !== "undefined"; export const DEFAULT_NETWORK: Network = (inNode && (process.env["NETWORK"] as Network)) || "Testnet"; diff --git a/connect/src/whscan-api.ts b/connect/src/whscan-api.ts index a63f43375..e823611a4 100644 --- a/connect/src/whscan-api.ts +++ b/connect/src/whscan-api.ts @@ -7,9 +7,10 @@ import { deserialize, } from "@wormhole-foundation/sdk-definitions"; import axios from "axios"; -import { WHSCAN_RETRY_INTERVAL } from "./config"; import { retry } from "./tasks"; +export const WHSCAN_RETRY_INTERVAL = 2000; + // TransactionStatus returned by wormholescan export interface TransactionStatus { id: string; @@ -136,9 +137,7 @@ export async function getVaaBytes( try { const { data: { vaaBytes }, - } = await axios.get<{ vaaBytes: string }>(url, { - timeout: 2000, - }); + } = await axios.get<{ vaaBytes: string }>(url); return encoding.b64.decode(vaaBytes); } catch (error) { if (!error) return null; diff --git a/connect/src/wormhole.ts b/connect/src/wormhole.ts index ce286a15f..3a6c86c86 100644 --- a/connect/src/wormhole.ts +++ b/connect/src/wormhole.ts @@ -1,11 +1,11 @@ import { Chain, + ChainToPlatform, Network, Platform, PlatformToChains, chainToPlatform, circle, - ChainToPlatform, } from "@wormhole-foundation/sdk-base"; import { ChainAddress, @@ -24,7 +24,7 @@ import { toNative, } from "@wormhole-foundation/sdk-definitions"; import { getCircleAttestationWithRetry } from "./circle-api"; -import { CONFIG, DEFAULT_TASK_TIMEOUT, WormholeConfig } from "./config"; +import { ConfigOverrides, DEFAULT_TASK_TIMEOUT, WormholeConfig, applyOverrides } from "./config"; import { CircleTransfer } from "./protocols/cctpTransfer"; import { TokenTransfer } from "./protocols/tokenTransfer"; import { retry } from "./tasks"; @@ -49,9 +49,9 @@ export class Wormhole { readonly config: WormholeConfig; - constructor(network: N, platforms: PlatformUtils[], config?: WormholeConfig) { + constructor(network: N, platforms: PlatformUtils[], config?: ConfigOverrides) { this._network = network; - this.config = config ?? CONFIG[network]; + this.config = applyOverrides(network, config); this._chains = new Map(); this._platforms = new Map(); diff --git a/examples/src/config.ts b/examples/src/config.ts new file mode 100644 index 000000000..7ca3e5275 --- /dev/null +++ b/examples/src/config.ts @@ -0,0 +1,19 @@ +import { Wormhole } from "@wormhole-foundation/connect-sdk"; +import { SolanaPlatform } from "@wormhole-foundation/connect-sdk-solana"; + +(async function () { + // Pass a partial WormholeConfig object to override specific + // fields in the default config + const wh = new Wormhole("Testnet", [SolanaPlatform], { + chains: { + Solana: { + contracts: { + coreBridge: "11111111111111111111111111111", + }, + rpc: "https://api.devnet.solana.com", + }, + }, + }); + + console.log(wh.config.chains.Solana); +})();