@@ -3,56 +3,52 @@ import evmPriceFeedContractsData from "../../store/contracts/EvmPriceFeedContrac
33import evmWormholeContractsData from "../../store/contracts/EvmWormholeContracts.json" ;
44import * as chains from "viem/chains" ;
55
6+ export const allEvmChainIds : number [ ] = evmChainsData . map ( ( c ) => c . networkId ) ;
7+
68export const getEvmPriceFeedContractAddress = (
79 chainId : number ,
810) : `0x${string } ` | undefined => {
9- const chain = evmChainsData . find ( ( c ) => c . networkId === chainId ) ;
10- if ( ! chain ) {
11- return undefined ;
12- }
13- const contract = evmPriceFeedContractsData . find ( ( c ) => c . chain === chain . id ) ;
14- if ( ! contract ?. address || ! contract . address . startsWith ( "0x" ) ) {
15- return undefined ;
16- }
17- return contract . address as `0x${string } `;
11+ return getContractAddress ( chainId , evmPriceFeedContractsData ) ;
1812} ;
1913
2014export const getEvmWormholeContractAddress = (
2115 chainId : number ,
16+ ) : `0x${string } ` | undefined => {
17+ return getContractAddress ( chainId , evmWormholeContractsData ) ;
18+ } ;
19+
20+ const getContractAddress = (
21+ chainId : number ,
22+ contractsData : { chain : string ; address : string } [ ] ,
2223) : `0x${string } ` | undefined => {
2324 const chain = evmChainsData . find ( ( c ) => c . networkId === chainId ) ;
24- if ( ! chain ) {
25- return undefined ;
26- }
27- const contract = evmWormholeContractsData . find ( ( c ) => c . chain === chain . id ) ;
28- if ( ! contract ?. address || ! contract . address . startsWith ( "0x" ) ) {
25+ if ( chain === undefined ) {
2926 return undefined ;
27+ } else {
28+ const contract = contractsData . find ( ( c ) => c . chain === chain . id ) ;
29+ if ( contract ?. address === undefined ) {
30+ return undefined ;
31+ } else if ( isZeroXString ( contract . address ) ) {
32+ return contract . address as `0x${string } `;
33+ } else {
34+ throw new Error (
35+ `Invariant failed: invalid contract address ${ contract . address } for chain ${ contract . chain } ` ,
36+ ) ;
37+ }
3038 }
31- return contract . address as `0x${string } `;
3239} ;
3340
34- export const getAllEvmChainsIds : number [ ] = evmChainsData . map (
35- ( c ) => c . networkId ,
36- ) ;
41+ const isZeroXString = ( str : string ) : str is `0x${string } ` =>
42+ str . startsWith ( "0x" ) && str . length === 42 ;
3743
3844export const getEvmChainRpcUrl = ( chainId : number ) : string | undefined => {
3945 const chain = evmChainsData . find ( ( c ) => c . networkId === chainId ) ;
40- if ( ! chain ) {
46+ if ( chain === undefined ) {
4147 return undefined ;
48+ } else {
49+ const viemChain = Object . values ( chains ) . find (
50+ ( c ) => c . id === Number . parseInt ( chain . id , 10 ) ,
51+ ) ;
52+ return viemChain ?. rpcUrls . default . http [ 0 ] ?? chain . rpcUrl ;
4253 }
43-
44- // Let's try to use the viem chains without checking if they are working
45- const viemChain = Object . values ( chains ) . find (
46- ( c ) => c . id === Number ( chain . id ) ,
47- ) ;
48- if ( viemChain && viemChain . rpcUrls && viemChain . rpcUrls . default ) {
49- return viemChain . rpcUrls . default . http [ 0 ] ;
50- }
51-
52- // Now let's try to use the json rpc url
53- if ( chain . rpcUrl ) {
54- return chain . rpcUrl ;
55- }
56-
57- return undefined ;
5854} ;
0 commit comments