Skip to content

Commit ead49b9

Browse files
authored
Config: Add partial ChainConfig overrides as arugment to getChain helper (#520)
* add partial config overrides as argument to getChain helper * add example of config overrides
1 parent 19ddfd3 commit ead49b9

File tree

10 files changed

+123
-49
lines changed

10 files changed

+123
-49
lines changed

connect/src/config.ts

+41-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { Network, Platform } from "@wormhole-foundation/sdk-base";
1+
import type { Chain, Network, Platform } from "@wormhole-foundation/sdk-base";
22
import { circle } from "@wormhole-foundation/sdk-base";
3-
import type { ChainsConfig } from "@wormhole-foundation/sdk-definitions";
3+
import type { ChainConfig, ChainsConfig } from "@wormhole-foundation/sdk-definitions";
44
import { buildConfig } from "@wormhole-foundation/sdk-definitions";
55

66
export const DEFAULT_TASK_TIMEOUT = 60 * 1000; // 1 minute in milliseconds
@@ -11,16 +11,6 @@ export type WormholeConfig<N extends Network = Network, P extends Platform = Pla
1111
chains: ChainsConfig<N, P>;
1212
};
1313

14-
type RecursivePartial<T> = {
15-
[P in keyof T]?: T[P] extends (infer U)[]
16-
? RecursivePartial<U>[]
17-
: T[P] extends object | undefined
18-
? RecursivePartial<T[P]>
19-
: T[P];
20-
};
21-
22-
export type ConfigOverrides<N extends Network> = RecursivePartial<WormholeConfig<N>>;
23-
2414
export const CONFIG = {
2515
Mainnet: {
2616
api: "https://api.wormholescan.io",
@@ -50,28 +40,53 @@ export function networkPlatformConfigs<N extends Network, P extends Platform>(
5040
) as ChainsConfig<N, P>;
5141
}
5242

43+
type RecursivePartial<T> = {
44+
[P in keyof T]?: T[P] extends (infer U)[]
45+
? RecursivePartial<U>[]
46+
: T[P] extends object | undefined
47+
? RecursivePartial<T[P]>
48+
: T[P];
49+
};
50+
export type WormholeConfigOverrides<N extends Network> = RecursivePartial<WormholeConfig<N>>;
51+
export type ChainsConfigOverrides<N extends Network, P extends Platform> = RecursivePartial<
52+
ChainsConfig<N, P>
53+
>;
54+
export type ChainConfigOverrides<N extends Network, C extends Chain> = RecursivePartial<
55+
ChainConfig<N, C>
56+
>;
57+
5358
// Apply any overrides to the base config
54-
export function applyOverrides<N extends Network>(
59+
export function applyWormholeConfigOverrides<N extends Network>(
5560
network: N,
56-
overrides?: ConfigOverrides<N>,
61+
overrides?: WormholeConfigOverrides<N>,
5762
): WormholeConfig {
5863
let base = CONFIG[network];
5964
if (!overrides) return base;
65+
return override(base, overrides);
66+
}
67+
68+
// Apply any overrides to the base config
69+
export function applyChainsConfigConfigOverrides<N extends Network, P extends Platform>(
70+
network: N,
71+
platform: P,
72+
overrides?: ChainsConfigOverrides<N, P>,
73+
): ChainsConfig<N, P> {
74+
const base = networkPlatformConfigs(network, platform);
75+
if (!overrides) return base;
76+
return override(base, overrides);
77+
}
6078

61-
// recurse through the overrides and apply them to the base config
62-
function override(base: any, overrides: any) {
63-
if (!base) base = {};
64-
for (const [key, value] of Object.entries(overrides)) {
65-
if (typeof value === "object" && !Array.isArray(value)) {
66-
base[key] = override(base[key], value);
67-
} else {
68-
base[key] = value;
69-
}
79+
// recurse through the overrides and apply them to the base config
80+
function override(base: any, overrides: any) {
81+
if (!base) base = {};
82+
for (const [key, value] of Object.entries(overrides)) {
83+
if (typeof value === "object" && !Array.isArray(value)) {
84+
base[key] = override(base[key], value);
85+
} else {
86+
base[key] = value;
7087
}
71-
return base;
7288
}
73-
74-
return override(base, overrides);
89+
return base;
7590
}
7691

7792
const inNode = typeof process !== "undefined";

connect/src/wormhole.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import {
2222
toNative,
2323
} from "@wormhole-foundation/sdk-definitions";
2424
import { getCircleAttestationWithRetry } from "./circle-api.js";
25-
import type { ConfigOverrides, WormholeConfig } from "./config.js";
26-
import { DEFAULT_TASK_TIMEOUT, applyOverrides } from "./config.js";
25+
import { WormholeConfig, applyWormholeConfigOverrides, WormholeConfigOverrides } from "./config.js";
26+
import { DEFAULT_TASK_TIMEOUT } from "./config.js";
2727
import { CircleTransfer } from "./protocols/cctpTransfer.js";
2828
import { TokenTransfer } from "./protocols/tokenTransfer.js";
2929
import type { RouteConstructor } from "./routes/index.js";
@@ -48,9 +48,9 @@ export class Wormhole<N extends Network> {
4848

4949
readonly config: WormholeConfig<N>;
5050

51-
constructor(network: N, platforms: PlatformUtils<any>[], config?: ConfigOverrides<N>) {
51+
constructor(network: N, platforms: PlatformUtils<any>[], config?: WormholeConfigOverrides<N>) {
5252
this._network = network;
53-
this.config = applyOverrides(network, config) as WormholeConfig<N>;
53+
this.config = applyWormholeConfigOverrides(network, config) as WormholeConfig<N>;
5454

5555
this._chains = new Map();
5656
this._platforms = new Map();

examples/src/platforms.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import evm from "@wormhole-foundation/sdk/platforms/evm";
1212
);
1313
console.log(blindDeserializePayload(msg!.payload));
1414

15-
const sepolia = evm.getChain("Testnet", "Sepolia");
15+
const sepolia = evm.getChain("Testnet", "Sepolia", {
16+
rpc: "https://eth-sepolia-public.unifra.io",
17+
});
1618
const tb = await sepolia.getTokenBridge();
1719
const address = await tb.getWrappedNative();
1820
console.log(address.toString());

sdk/src/index.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import type {
2-
ConfigOverrides,
32
Network,
3+
WormholeConfigOverrides,
44
Platform,
55
ProtocolName,
6+
ChainConfigOverrides,
67
} from "@wormhole-foundation/sdk-connect";
78
import {
89
ChainContext,
@@ -14,10 +15,6 @@ import {
1415
Wormhole,
1516
} from "@wormhole-foundation/sdk-connect";
1617

17-
export * from "@wormhole-foundation/sdk-connect";
18-
19-
export * from "./addresses.js";
20-
2118
/**
2219
* PlatformDefinition is a type that contains the types necessary to
2320
* interact with the platform or any of the enabled chains that run on the it.
@@ -31,6 +28,7 @@ export interface PlatformDefinition<P extends Platform> {
3128
getChain: <N extends Network, C extends PlatformToChains<P>>(
3229
network: N,
3330
chain: C,
31+
overrides?: ChainConfigOverrides<N, C>,
3432
) => ChainContext<N, C, P>;
3533
/** Provides a local signer that implements the Signer interface for the platform */
3634
getSigner: (rpc: RpcConnection<P>, key: string, ...args: any) => Promise<Signer>;
@@ -98,8 +96,11 @@ export async function loadProtocols<P extends Platform>(
9896
export async function wormhole<N extends Network>(
9997
network: N,
10098
platforms: PlatformLoader<any>[],
101-
config?: ConfigOverrides<N>,
99+
config?: WormholeConfigOverrides<N>,
102100
): Promise<Wormhole<N>> {
103101
const loaded = (await loadPlatforms(platforms)).map((p) => p.Platform);
104102
return new Wormhole(network, loaded, config);
105103
}
104+
105+
export * from "@wormhole-foundation/sdk-connect";
106+
export * from "./addresses.js";

sdk/src/platforms/algorand.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
import * as _algorand from "@wormhole-foundation/sdk-algorand";
2+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
23
import { PlatformDefinition } from "../index.js";
34

45
/** Platform and protocol definitions for Algorand */
5-
const algorand: PlatformDefinition<"Algorand"> = {
6+
const algorand: PlatformDefinition<typeof _algorand._platform> = {
67
Address: _algorand.AlgorandAddress,
78
Platform: _algorand.AlgorandPlatform,
89
getSigner: _algorand.getAlgorandSigner,
910
protocols: {
1011
WormholeCore: () => import("@wormhole-foundation/sdk-algorand-core"),
1112
TokenBridge: () => import("@wormhole-foundation/sdk-algorand-tokenbridge"),
1213
},
13-
getChain: (n, c) => new _algorand.AlgorandChain(c, new _algorand.AlgorandPlatform(n)),
14+
getChain: (network, chain, overrides?) =>
15+
new _algorand.AlgorandChain(
16+
chain,
17+
new _algorand.AlgorandPlatform(
18+
network,
19+
applyChainsConfigConfigOverrides(network, _algorand._platform, {
20+
[chain]: overrides,
21+
}),
22+
),
23+
),
1424
};
1525

1626
export default algorand;

sdk/src/platforms/aptos.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
import * as _aptos from "@wormhole-foundation/sdk-aptos";
22
import { PlatformDefinition } from "../index.js";
3+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
34

45
/** Platform and protocol definitions for Aptos */
5-
const aptos: PlatformDefinition<"Aptos"> = {
6+
const aptos: PlatformDefinition<typeof _aptos._platform> = {
67
Address: _aptos.AptosAddress,
78
Platform: _aptos.AptosPlatform,
89
getSigner: _aptos.getAptosSigner,
910
protocols: {
1011
WormholeCore: () => import("@wormhole-foundation/sdk-aptos-core"),
1112
TokenBridge: () => import("@wormhole-foundation/sdk-aptos-tokenbridge"),
1213
},
13-
getChain: (n, c) => new _aptos.AptosChain(c, new _aptos.AptosPlatform(n)),
14+
getChain: (network, chain, overrides?) =>
15+
new _aptos.AptosChain(
16+
chain,
17+
new _aptos.AptosPlatform(
18+
network,
19+
applyChainsConfigConfigOverrides(network, _aptos._platform, {
20+
[chain]: overrides,
21+
}),
22+
),
23+
),
1424
};
1525

1626
export default aptos;

sdk/src/platforms/cosmwasm.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
12
import * as _cosmwasm from "@wormhole-foundation/sdk-cosmwasm";
23
import type { PlatformDefinition } from "../index.js";
3-
const cosmwasm: PlatformDefinition<"Cosmwasm"> = {
4+
const cosmwasm: PlatformDefinition<typeof _cosmwasm._platform> = {
45
Address: _cosmwasm.CosmwasmAddress,
56
Platform: _cosmwasm.CosmwasmPlatform,
67
getSigner: _cosmwasm.getCosmwasmSigner,
@@ -9,6 +10,15 @@ const cosmwasm: PlatformDefinition<"Cosmwasm"> = {
910
TokenBridge: () => import("@wormhole-foundation/sdk-cosmwasm-tokenbridge"),
1011
IbcBridge: () => import("@wormhole-foundation/sdk-cosmwasm-ibc"),
1112
},
12-
getChain: (n, c) => new _cosmwasm.CosmwasmChain(c, new _cosmwasm.CosmwasmPlatform(n)),
13+
getChain: (network, chain, overrides?) =>
14+
new _cosmwasm.CosmwasmChain(
15+
chain,
16+
new _cosmwasm.CosmwasmPlatform(
17+
network,
18+
applyChainsConfigConfigOverrides(network, _cosmwasm._platform, {
19+
[chain]: overrides,
20+
}),
21+
),
22+
),
1323
};
1424
export default cosmwasm;

sdk/src/platforms/evm.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
12
import * as _evm from "@wormhole-foundation/sdk-evm";
23
import type { PlatformDefinition } from "../index.js";
34

45
/** Platform and protocol definitions for Evm */
5-
const evm: PlatformDefinition<"Evm"> = {
6+
const evm: PlatformDefinition<typeof _evm._platform> = {
67
Address: _evm.EvmAddress,
78
Platform: _evm.EvmPlatform,
89
getSigner: _evm.getEvmSigner,
@@ -12,7 +13,16 @@ const evm: PlatformDefinition<"Evm"> = {
1213
PorticoBridge: () => import("@wormhole-foundation/sdk-evm-portico"),
1314
CircleBridge: () => import("@wormhole-foundation/sdk-evm-cctp"),
1415
},
15-
getChain: (n, c) => new _evm.EvmChain(c, new _evm.EvmPlatform(n)),
16+
getChain: (network, chain, overrides?) =>
17+
new _evm.EvmChain(
18+
chain,
19+
new _evm.EvmPlatform(
20+
network,
21+
applyChainsConfigConfigOverrides(network, _evm._platform, {
22+
[chain]: overrides,
23+
}),
24+
),
25+
),
1626
};
1727

1828
export default evm;

sdk/src/platforms/solana.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
12
import * as _solana from "@wormhole-foundation/sdk-solana";
23
import type { PlatformDefinition } from "../index.js";
34
/** Platform and protocol definitons for Solana */
4-
const solana: PlatformDefinition<"Solana"> = {
5+
const solana: PlatformDefinition<typeof _solana._platform> = {
56
Address: _solana.SolanaAddress,
67
Platform: _solana.SolanaPlatform,
78
getSigner: _solana.getSolanaSignAndSendSigner,
@@ -10,6 +11,13 @@ const solana: PlatformDefinition<"Solana"> = {
1011
TokenBridge: () => import("@wormhole-foundation/sdk-solana-tokenbridge"),
1112
CircleBridge: () => import("@wormhole-foundation/sdk-solana-cctp"),
1213
},
13-
getChain: (n, c) => new _solana.SolanaChain(c, new _solana.SolanaPlatform(n)),
14+
getChain: (network, chain, overrides?) =>
15+
new _solana.SolanaChain(
16+
chain,
17+
new _solana.SolanaPlatform(
18+
network,
19+
applyChainsConfigConfigOverrides(network, _solana._platform, { [chain]: overrides }),
20+
),
21+
),
1422
};
1523
export default solana;

sdk/src/platforms/sui.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
1+
import { applyChainsConfigConfigOverrides } from "@wormhole-foundation/sdk-connect";
12
import * as _sui from "@wormhole-foundation/sdk-sui";
23
import type { PlatformDefinition } from "../index.js";
34
/** Platform and protocol definitions for Sui */
4-
const sui: PlatformDefinition<"Sui"> = {
5+
const sui: PlatformDefinition<typeof _sui._platform> = {
56
Address: _sui.SuiAddress,
67
Platform: _sui.SuiPlatform,
78
getSigner: _sui.getSuiSigner,
89
protocols: {
910
WormholeCore: () => import("@wormhole-foundation/sdk-sui-core"),
1011
TokenBridge: () => import("@wormhole-foundation/sdk-sui-tokenbridge"),
1112
},
12-
getChain: (n, c) => new _sui.SuiChain(c, new _sui.SuiPlatform(n)),
13+
getChain: (network, chain, overrides?) =>
14+
new _sui.SuiChain(
15+
chain,
16+
new _sui.SuiPlatform(
17+
network,
18+
applyChainsConfigConfigOverrides(network, _sui._platform, { [chain]: overrides }),
19+
),
20+
),
1321
};
1422
export default sui;

0 commit comments

Comments
 (0)