Skip to content

Commit 18cc2c2

Browse files
committed
fix(private-rpc): withOverrides no longer monkey-patches methods nor wraps every chain API. It now builds an overridden networkConfig with the resolved RPC URL and a cloned chainConfig whose rpcUrls.default.http and rpcUrls['public'].http use the override. All downstream consumers (state manager, chain APIs, contracts) automatically use the overridden RPC via the standard construction path. No per-method wrapping needed.
1 parent c922755 commit 18cc2c2

File tree

7 files changed

+94
-73
lines changed

7 files changed

+94
-73
lines changed

packages/networks/src/chains/ChronicleYellowstone.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,27 @@ export const WagmiConfig = createConfig({
4141
[viemChainConfig.id]: http(),
4242
},
4343
});
44+
45+
/**
46+
* Resolve the effective RPC URL from an optional override.
47+
*/
48+
export function resolveRpcUrl(overrideRpc?: string): string {
49+
return overrideRpc ?? RPC_URL;
50+
}
51+
52+
/**
53+
* Build a Chain config using the base Chronicle Yellowstone config,
54+
* applying an optional RPC override to both default and public http URLs.
55+
*/
56+
export function buildViemChainConfig(overrideRpc?: string): Chain {
57+
const rpc = resolveRpcUrl(overrideRpc);
58+
const base = viemChainConfig;
59+
return {
60+
...base,
61+
rpcUrls: {
62+
...base.rpcUrls,
63+
default: { ...base.rpcUrls.default, http: [rpc] },
64+
public: { ...(base.rpcUrls as any)['public'], http: [rpc] },
65+
},
66+
} as Chain;
67+
}

packages/networks/src/networks/vNaga/envs/base/BaseNetworkEnvironment.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface BaseEnvironmentOptions<T, M> {
1515
minimumThreshold?: number;
1616
httpProtocol?: 'http://' | 'https://';
1717
requiredAttestation?: boolean;
18+
rpcUrlOverride?: string;
1819
}
1920

2021
export abstract class BaseNetworkEnvironment<T, M> {
@@ -24,9 +25,9 @@ export abstract class BaseNetworkEnvironment<T, M> {
2425
this.config = {
2526
minimumThreshold: options.minimumThreshold || 3,
2627
network: options.network,
27-
rpcUrl: this.getRpcUrl(),
28+
rpcUrl: this.getRpcUrl(options.rpcUrlOverride),
2829
abiSignatures: options.abiSignatures,
29-
chainConfig: this.getChainConfig(),
30+
chainConfig: this.getChainConfig(options.rpcUrlOverride),
3031
httpProtocol: options.httpProtocol || 'https://',
3132
networkSpecificConfigs: options.networkSpecificConfigs,
3233
endpoints: this.getEndpoints(),
@@ -51,8 +52,8 @@ export abstract class BaseNetworkEnvironment<T, M> {
5152
return this.config.services;
5253
}
5354

54-
protected abstract getRpcUrl(): string;
55-
protected abstract getChainConfig(): Chain;
55+
protected abstract getRpcUrl(overrideRpc?: string): string;
56+
protected abstract getChainConfig(overrideRpc?: string): Chain;
5657
protected abstract getEndpoints(): NagaEndpointsType;
5758
protected abstract getDefaultRealmId(): bigint;
5859
}

packages/networks/src/networks/vNaga/envs/naga-dev/naga-dev.env.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class NagaDevEnvironment extends BaseNetworkEnvironment<
2020
NagaDevSignatures,
2121
NagaDevSpecificConfigs
2222
> {
23-
constructor() {
23+
constructor(options?: { rpcUrlOverride?: string }) {
2424
super({
2525
network: NETWORK,
2626
abiSignatures: nagaDevSignatures,
@@ -34,15 +34,16 @@ export class NagaDevEnvironment extends BaseNetworkEnvironment<
3434
minimumThreshold: MINIMUM_THRESHOLD,
3535
httpProtocol: PROTOCOL,
3636
requiredAttestation: false,
37+
rpcUrlOverride: options?.rpcUrlOverride,
3738
});
3839
}
3940

40-
protected getRpcUrl(): string {
41-
return chainInfo.RPC_URL;
41+
protected getRpcUrl(overrideRpc?: string): string {
42+
return chainInfo.resolveRpcUrl(overrideRpc);
4243
}
4344

44-
protected getChainConfig(): Chain {
45-
return chainInfo.viemChainConfig;
45+
protected getChainConfig(overrideRpc?: string): Chain {
46+
return chainInfo.buildViemChainConfig(overrideRpc);
4647
}
4748

4849
protected getEndpoints(): NagaEndpointsType {

packages/networks/src/networks/vNaga/envs/naga-local/naga-local.env.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class NagaLocalEnvironment extends BaseNetworkEnvironment<
2121
NagaLocalSignatures,
2222
NagaLocalSpecificConfigs
2323
> {
24-
constructor() {
24+
constructor(options?: { rpcUrlOverride?: string }) {
2525
super({
2626
network: NETWORK,
2727
abiSignatures: signatures, // Note: Uses locally generated signatures
@@ -36,15 +36,25 @@ export class NagaLocalEnvironment extends BaseNetworkEnvironment<
3636
minimumThreshold: MINIMUM_THRESHOLD,
3737
httpProtocol: PROTOCOL, // Note: HTTP not HTTPS
3838
requiredAttestation: false,
39+
rpcUrlOverride: options?.rpcUrlOverride,
3940
});
4041
}
4142

42-
protected getRpcUrl(): string {
43-
return chainInfo.RPC_URL; // Note: Uses Anvil instead of ChronicleYellowstone
43+
protected getRpcUrl(overrideRpc?: string): string {
44+
return overrideRpc ?? chainInfo.RPC_URL; // Note: Uses Anvil instead of ChronicleYellowstone
4445
}
4546

46-
protected getChainConfig(): Chain {
47-
return chainInfo.viemChainConfig; // Note: Anvil chain config
47+
protected getChainConfig(overrideRpc?: string): Chain {
48+
const rpc = overrideRpc ?? chainInfo.RPC_URL;
49+
const base = chainInfo.viemChainConfig; // Note: Anvil chain config
50+
return {
51+
...base,
52+
rpcUrls: {
53+
...base.rpcUrls,
54+
default: { ...base.rpcUrls.default, http: [rpc] },
55+
public: { ...(base.rpcUrls as any)['public'], http: [rpc] },
56+
},
57+
} as Chain;
4858
}
4959

5060
protected getEndpoints(): NagaEndpointsType {

packages/networks/src/networks/vNaga/envs/naga-staging/naga-staging.env.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class NagaStagingEnvironment extends BaseNetworkEnvironment<
2020
NagaStagingSignatures,
2121
NagaStagingSpecificConfigs
2222
> {
23-
constructor() {
23+
constructor(options?: { rpcUrlOverride?: string }) {
2424
super({
2525
network: NETWORK,
2626
abiSignatures: nagaStagingSignatures,
@@ -34,15 +34,16 @@ export class NagaStagingEnvironment extends BaseNetworkEnvironment<
3434
minimumThreshold: MINIMUM_THRESHOLD,
3535
httpProtocol: PROTOCOL,
3636
requiredAttestation: true,
37+
rpcUrlOverride: options?.rpcUrlOverride,
3738
});
3839
}
3940

40-
protected getRpcUrl(): string {
41-
return chainInfo.RPC_URL;
41+
protected getRpcUrl(overrideRpc?: string): string {
42+
return chainInfo.resolveRpcUrl(overrideRpc);
4243
}
4344

44-
protected getChainConfig(): Chain {
45-
return chainInfo.viemChainConfig;
45+
protected getChainConfig(overrideRpc?: string): Chain {
46+
return chainInfo.buildViemChainConfig(overrideRpc);
4647
}
4748

4849
protected getEndpoints(): NagaEndpointsType {

packages/networks/src/networks/vNaga/envs/naga-test/naga-test.env.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class NagaTestEnvironment extends BaseNetworkEnvironment<
2020
NagaTestSignatures,
2121
NagaTestSpecificConfigs
2222
> {
23-
constructor() {
23+
constructor(options?: { rpcUrlOverride?: string }) {
2424
super({
2525
network: NETWORK,
2626
abiSignatures: nagaTestSignatures,
@@ -34,15 +34,16 @@ export class NagaTestEnvironment extends BaseNetworkEnvironment<
3434
minimumThreshold: MINIMUM_THRESHOLD,
3535
httpProtocol: PROTOCOL,
3636
requiredAttestation: true,
37+
rpcUrlOverride: options?.rpcUrlOverride,
3738
});
3839
}
3940

40-
protected getRpcUrl(): string {
41-
return chainInfo.RPC_URL;
41+
protected getRpcUrl(overrideRpc?: string): string {
42+
return chainInfo.resolveRpcUrl(overrideRpc);
4243
}
4344

44-
protected getChainConfig(): Chain {
45-
return chainInfo.viemChainConfig;
45+
protected getChainConfig(overrideRpc?: string): Chain {
46+
return chainInfo.buildViemChainConfig(overrideRpc);
4647
}
4748

4849
protected getEndpoints(): NagaEndpointsType {

packages/networks/src/networks/vNaga/shared/factories/BaseModuleFactory.ts

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { z } from 'zod';
1616
import { LitNetworkModuleBase } from '../../../types';
1717
import type { ExpectedAccountOrWalletClient } from '../managers/contract-manager/createContractsManager';
1818
import type { INetworkConfig } from '../interfaces/NetworkContext';
19+
import { createChainManagerFactory } from './BaseChainManagerFactory';
1920

2021
// Shared utilities
2122
import { NetworkError } from '@lit-protocol/constants';
@@ -1102,56 +1103,38 @@ export function createBaseModule<T, M>(config: BaseModuleConfig<T, M>) {
11021103
withOverrides: (overrides: { rpcUrl?: string }) => {
11031104
const resolvedRpcUrl = overrides.rpcUrl ?? baseModule.getRpcUrl();
11041105

1105-
const wrapped = {
1106-
...baseModule,
1107-
1108-
getRpcUrl: () => resolvedRpcUrl,
1109-
1110-
getChainConfig: () => {
1111-
const chain = baseModule.getChainConfig();
1112-
return {
1113-
...chain,
1114-
rpcUrls: {
1115-
...chain.rpcUrls,
1116-
default: {
1117-
...chain.rpcUrls.default,
1118-
http: [resolvedRpcUrl],
1119-
},
1120-
['public']: {
1121-
...(chain.rpcUrls as any)['public'],
1122-
http: [resolvedRpcUrl],
1123-
},
1124-
},
1125-
} as typeof chain;
1126-
},
1127-
1128-
createStateManager: async <StateT, ModuleT>(params: {
1129-
callback: (params: CallbackParams) => Promise<StateT>;
1130-
networkModule: ModuleT;
1131-
}): Promise<Awaited<ReturnType<typeof createStateManager<StateT>>>> => {
1132-
const createReadOnlyChainManager = () => {
1133-
const dummyAccount = privateKeyToAccount(DEV_PRIVATE_KEY);
1134-
return createChainManager(dummyAccount);
1135-
};
1136-
1137-
const overriddenNetworkConfig = {
1138-
...networkConfig,
1139-
rpcUrl: resolvedRpcUrl,
1140-
chainConfig: wrapped.getChainConfig(),
1141-
} as typeof networkConfig;
1142-
1143-
return await createStateManager<StateT>({
1144-
networkConfig: overriddenNetworkConfig,
1145-
callback: params.callback,
1146-
networkModule: wrapped as unknown as LitNetworkModuleBase,
1147-
createReadOnlyChainManager,
1148-
});
1106+
// Build an overridden network config and a chain manager bound to it
1107+
const overriddenChainConfig = {
1108+
...networkConfig.chainConfig,
1109+
rpcUrls: {
1110+
...networkConfig.chainConfig.rpcUrls,
1111+
default: {
1112+
...networkConfig.chainConfig.rpcUrls.default,
1113+
http: [resolvedRpcUrl],
1114+
},
1115+
['public']: {
1116+
...(networkConfig.chainConfig.rpcUrls as any)['public'],
1117+
http: [resolvedRpcUrl],
1118+
},
11491119
},
1150-
} as typeof baseModule & {
1151-
withOverrides: (o: { rpcUrl?: string }) => any;
1152-
};
1153-
1154-
return wrapped;
1120+
} as typeof networkConfig.chainConfig;
1121+
1122+
const overriddenNetworkConfig = {
1123+
...networkConfig,
1124+
rpcUrl: resolvedRpcUrl,
1125+
chainConfig: overriddenChainConfig,
1126+
} as typeof networkConfig;
1127+
1128+
const createChainManagerOverridden = (account: ExpectedAccountOrWalletClient) =>
1129+
createChainManagerFactory(overriddenNetworkConfig, account);
1130+
1131+
// Rebuild a fresh module bound to the overridden config
1132+
return createBaseModule({
1133+
networkConfig: overriddenNetworkConfig,
1134+
moduleName,
1135+
createChainManager: createChainManagerOverridden,
1136+
verifyReleaseId: baseModule.getVerifyReleaseId(),
1137+
});
11551138
},
11561139
};
11571140

0 commit comments

Comments
 (0)