11import { ethers } from "ethers" ;
2- import { resolveChain , getRpcEnvVar } from "@oplabs/talos-client" ;
32
43/**
54 * Ambient network context for the standalone (hardhat-free) action runtime.
@@ -19,36 +18,71 @@ export const CHAIN_NAMES: Record<number, string> = {
1918 98866 : "plume" ,
2019} ;
2120
21+ const CHAIN_IDS : Record < string , number > = Object . fromEntries (
22+ Object . entries ( CHAIN_NAMES ) . map ( ( [ id , name ] ) => [ name , Number ( id ) ] )
23+ ) ;
24+
25+ const RPC_ENV_VARS : Record < number , string > = {
26+ 1 : "MAINNET_PROVIDER_URL" ,
27+ 8453 : "BASE_PROVIDER_URL" ,
28+ 146 : "SONIC_PROVIDER_URL" ,
29+ 560048 : "HOODI_PROVIDER_URL" ,
30+ 999 : "HYPEREVM_PROVIDER_URL" ,
31+ 17000 : "HOLESKY_PROVIDER_URL" ,
32+ 42161 : "ARBITRUM_PROVIDER_URL" ,
33+ 98866 : "PLUME_PROVIDER_URL" ,
34+ } ;
35+
2236let _chainId : number | undefined ;
2337let _networkName : string | undefined ;
2438let _provider : ethers . providers . JsonRpcProvider | undefined ;
2539let _signer : ethers . Signer | undefined ;
2640
41+ type HardhatGlobal = {
42+ hre ?: {
43+ ethers ?: { provider ?: ethers . providers . JsonRpcProvider } ;
44+ network ?: { name ?: string ; config ?: { chainId ?: number } } ;
45+ } ;
46+ } ;
47+
48+ function hardhatRuntime ( ) {
49+ return ( globalThis as typeof globalThis & HardhatGlobal ) . hre ;
50+ }
51+
2752/** Resolve the RPC URL for a chain: LOCAL_PROVIDER_URL on a fork, else the
28- * `*_PROVIDER_URL` env var (via Talos getRpcEnvVar, matching the repo's names) . */
53+ * matching `*_PROVIDER_URL` env var. */
2954export function rpcUrlFor ( nameOrId : string | number ) : {
3055 chainId : number ;
3156 networkName : string ;
3257 url : string ;
3358} {
34- const chain = resolveChain ( nameOrId ) ;
59+ const chainId =
60+ typeof nameOrId === "number"
61+ ? nameOrId
62+ : / ^ \d + $ / . test ( nameOrId )
63+ ? Number ( nameOrId )
64+ : CHAIN_IDS [ nameOrId . toLowerCase ( ) ] ;
65+ const networkName = CHAIN_NAMES [ chainId ] ;
66+ if ( ! networkName ) {
67+ throw new Error ( `Unsupported chain: ${ nameOrId } ` ) ;
68+ }
3569 let url : string | undefined ;
3670 if ( process . env . FORK === "true" && process . env . LOCAL_PROVIDER_URL ) {
3771 url = process . env . LOCAL_PROVIDER_URL ;
3872 } else {
39- const envVar = getRpcEnvVar ( chain ) ;
73+ const envVar = RPC_ENV_VARS [ chainId ] ;
4074 url = process . env [ envVar ] ;
4175 // Back-compat: mainnet historically used the bare PROVIDER_URL.
42- if ( ! url && chain . id === 1 ) url = process . env . PROVIDER_URL ;
76+ if ( ! url && chainId === 1 ) url = process . env . PROVIDER_URL ;
4377 if ( ! url ) {
4478 throw new Error (
45- `Missing RPC URL env var ${ envVar } for chain ${ chain . name } (${ chain . id } )`
79+ `Missing RPC URL env var ${ envVar } for chain ${ networkName } (${ chainId } )`
4680 ) ;
4781 }
4882 }
4983 return {
50- chainId : chain . id ,
51- networkName : CHAIN_NAMES [ chain . id ] ?? chain . name ,
84+ chainId,
85+ networkName,
5286 url,
5387 } ;
5488}
@@ -69,19 +103,28 @@ export function initNetwork(nameOrId: string | number): {
69103}
70104
71105export function getProvider ( ) : ethers . providers . JsonRpcProvider {
72- if ( ! _provider )
106+ const provider = _provider ?? hardhatRuntime ( ) ?. ethers ?. provider ;
107+ if ( ! provider )
73108 throw new Error ( "Network not initialized — call initNetwork() first" ) ;
74- return _provider ;
109+ return provider ;
75110}
76111
77112export function getChainId ( ) : number {
78- if ( _chainId == null ) throw new Error ( "Network not initialized" ) ;
79- return _chainId ;
113+ const hardhatNetwork = hardhatRuntime ( ) ?. network ;
114+ const chainId =
115+ _chainId ??
116+ hardhatNetwork ?. config ?. chainId ??
117+ ( hardhatNetwork ?. name
118+ ? CHAIN_IDS [ hardhatNetwork . name . toLowerCase ( ) ]
119+ : undefined ) ;
120+ if ( chainId == null ) throw new Error ( "Network not initialized" ) ;
121+ return chainId ;
80122}
81123
82124export function getNetworkName ( ) : string {
83- if ( ! _networkName ) throw new Error ( "Network not initialized" ) ;
84- return _networkName ;
125+ const networkName = _networkName ?? hardhatRuntime ( ) ?. network ?. name ;
126+ if ( ! networkName ) throw new Error ( "Network not initialized" ) ;
127+ return networkName ;
85128}
86129
87130export function setSigner ( signer : ethers . Signer ) : void {
0 commit comments