From 0f9c7a8c691a01c6f822e89f5916026fd4b924fa Mon Sep 17 00:00:00 2001 From: Ben Guidarelli Date: Thu, 28 Dec 2023 09:09:28 -0500 Subject: [PATCH] adding overrides for configs --- connect/src/config.ts | 33 +++++++++++++++++++++++ connect/src/wormhole.ts | 8 +++--- core/base/src/constants/nativeChainIds.ts | 3 +++ examples/src/config.ts | 19 +++++++++++++ platforms/solana/src/platform.ts | 1 + 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 examples/src/config.ts diff --git a/connect/src/config.ts b/connect/src/config.ts index 0fe114fea4..ce0d0716c2 100644 --- a/connect/src/config.ts +++ b/connect/src/config.ts @@ -12,6 +12,16 @@ export type WormholeConfig; }; +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 +51,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/wormhole.ts b/connect/src/wormhole.ts index ce286a15f0..3a6c86c86b 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/core/base/src/constants/nativeChainIds.ts b/core/base/src/constants/nativeChainIds.ts index 2ea6887cf4..f79ea1b035 100644 --- a/core/base/src/constants/nativeChainIds.ts +++ b/core/base/src/constants/nativeChainIds.ts @@ -281,6 +281,9 @@ export function platformNativeChainIdToNetworkChain< const candidates = nativeChainIdToNetworkChain( chainId as PlatformToNativeChainIds

, ) as readonly (readonly [Network, Chain])[]; + + console.log(platform, chainId, candidates); + const mustBeSingleton = candidates.filter(([_, chain]) => chainToPlatform(chain) === platform); if (mustBeSingleton.length !== 1) throw new Error(`Platform ${platform} has multiple chains with native chain id ${chainId}`); diff --git a/examples/src/config.ts b/examples/src/config.ts new file mode 100644 index 0000000000..7ca3e52754 --- /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); +})(); diff --git a/platforms/solana/src/platform.ts b/platforms/solana/src/platform.ts index 10cf937389..0b6e429332 100644 --- a/platforms/solana/src/platform.ts +++ b/platforms/solana/src/platform.ts @@ -197,6 +197,7 @@ export class SolanaPlatform extends PlatformContext< } static chainFromChainId(genesisHash: string): [Network, SolanaChains] { + console.log(genesisHash); const netChain = nativeChainIds.platformNativeChainIdToNetworkChain( SolanaPlatform._platform, genesisHash,