-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathviem.ts
More file actions
79 lines (69 loc) · 1.93 KB
/
viem.ts
File metadata and controls
79 lines (69 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import { AllChainIds, logger } from '@cowprotocol/shared';
import { SupportedChainId } from '@cowprotocol/cow-sdk';
import { Chain, createPublicClient, http, PublicClient, webSocket } from 'viem';
import {
arbitrum,
base,
gnosis,
mainnet,
sepolia,
polygon,
avalanche,
} from 'viem/chains';
const NETWORKS: Record<SupportedChainId, Chain> = {
[SupportedChainId.MAINNET]: mainnet,
[SupportedChainId.GNOSIS_CHAIN]: gnosis,
[SupportedChainId.ARBITRUM_ONE]: arbitrum,
[SupportedChainId.BASE]: base,
[SupportedChainId.POLYGON]: polygon,
[SupportedChainId.AVALANCHE]: avalanche,
[SupportedChainId.SEPOLIA]: sepolia,
};
let viemClients: Record<SupportedChainId, PublicClient> | undefined;
export function getViemClients(): Record<SupportedChainId, PublicClient> {
if (viemClients) {
return viemClients;
}
viemClients = AllChainIds.reduce<Record<SupportedChainId, PublicClient>>(
(acc, chainId) => {
const chain = NETWORKS[chainId];
const envVarName = `RPC_URL_${chainId}`;
const rpcEndpoint = process.env[envVarName];
if (!rpcEndpoint) {
logger.warn(
`RPC_URL_${chainId} is not set. Using default RPC URL for ${chain.name}`
);
}
const defaultRpcUrls = getDefaultRpcUrl(chain, rpcEndpoint);
acc[chainId] = createPublicClient({
chain: {
...chain,
rpcUrls: {
default: defaultRpcUrls,
},
},
transport: defaultRpcUrls.webSocket ? webSocket() : http(),
});
return acc;
},
{} as Record<SupportedChainId, PublicClient>
);
return viemClients;
}
function getDefaultRpcUrl(
chain: Chain,
rpcEndpoint?: string
): Chain['rpcUrls']['default'] {
if (!rpcEndpoint) {
return chain.rpcUrls.default;
}
if (rpcEndpoint.startsWith('http')) {
return {
http: [rpcEndpoint],
};
}
return {
http: chain.rpcUrls.default.http,
webSocket: [rpcEndpoint],
};
}