Skip to content

Commit 71bf6a9

Browse files
authored
Add chain config for Linea (#1470)
* Can't as const here * Add linea chain to appconfig * Refactor wagmiClient to use resolver object, add linea env variables
1 parent 66133b5 commit 71bf6a9

File tree

6 files changed

+128
-63
lines changed

6 files changed

+128
-63
lines changed

apps/hyperdrive-trading/.env.sample

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ VITE_GNOSIS_NODE_RPC_URL=
2020

2121
# Mainnet
2222
VITE_MAINNET_RPC_URL=
23+
24+
# Linea
25+
VITE_LINEA_RPC_URL=
2326
##################################################
2427

2528
# Error tracking via Rollbar
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { gnosis, mainnet } from "viem/chains";
1+
import { gnosis, linea, mainnet } from "viem/chains";
22

33
/**
44
* Checks if the given chain ID corresponds to a mainnet chain.
55
* @param chainId - The chain ID to check.
66
* @returns True if the chain ID corresponds to a mainnet chain, false otherwise.
77
*/
88
export function isMainnetChain(chainId: number): boolean {
9-
const mainnetChainIds: number[] = [mainnet.id, gnosis.id];
9+
const mainnetChainIds: number[] = [mainnet.id, gnosis.id, linea.id];
1010
return mainnetChainIds.includes(chainId);
1111
}

apps/hyperdrive-trading/src/network/wagmiClient.ts

Lines changed: 92 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { gnosisFork } from "src/chains/gnosisFork";
1111
import { CreateWalletFn } from "src/wallets/CreateWalletFn";
1212
import { capsuleWallet } from "src/wallets/capsule";
1313
import { Chain, http, Transport } from "viem";
14-
import { foundry, gnosis, mainnet, sepolia } from "wagmi/chains";
14+
import { foundry, gnosis, linea, mainnet, sepolia } from "wagmi/chains";
1515

1616
const {
1717
VITE_LOCALHOST_NODE_RPC_URL,
@@ -20,94 +20,139 @@ const {
2020
VITE_WALLET_CONNECT_PROJECT_ID,
2121
VITE_SEPOLIA_RPC_URL,
2222
VITE_MAINNET_RPC_URL,
23+
VITE_LINEA_RPC_URL,
2324
VITE_GNOSIS_FORK_NODE_RPC_URL,
2425
VITE_GNOSIS_FORK_CHAIN_ID,
2526
VITE_GNOSIS_NODE_RPC_URL,
2627
} = import.meta.env;
2728

28-
export const chains: Chain[] = [];
29-
const transports: Record<string, Transport> = {};
29+
interface WagmiClientConfig {
30+
rpcUrl: string;
31+
chain: Chain;
32+
wallets?: (CreateWalletFn | undefined)[];
33+
/**
34+
* used for fork chains only
35+
*/
36+
chainId?: number;
37+
}
38+
39+
/* To add a new chain to this file, follow these steps:
40+
41+
* 1. Import the new chain from "wagmi/chains" or define it in "src/chains" if it's a custom chain.
42+
* 2. Add a new property to the `chainConfigs` object with the chain's name as the key.
43+
* 3. Define the chain's configuration, including the `rpcUrl` and chain properties.
44+
* 4. Optionally, add a `wallets` property to specify the wallets that should be supported on this chain.
45+
* 5. If the chain is a fork chain, add a `chainId` property to specify the chain's ID.
3046
47+
* Example:
48+
* myChain: {
49+
* rpcUrl: VITE_MY_CHAIN_RPC_URL,
50+
* chain: myChain,
51+
* wallets: [capsuleWallet],
52+
* chainId: 123, // only required for fork chains
53+
* }
54+
*/
55+
56+
const chainConfigs: Record<string, WagmiClientConfig> = {
57+
mainnet: {
58+
rpcUrl: VITE_MAINNET_RPC_URL,
59+
chain: mainnet,
60+
wallets: [capsuleWallet],
61+
},
62+
gnosis: {
63+
rpcUrl: VITE_GNOSIS_NODE_RPC_URL,
64+
chain: gnosis,
65+
},
66+
linea: {
67+
rpcUrl: VITE_LINEA_RPC_URL,
68+
chain: linea,
69+
},
70+
foundry: {
71+
rpcUrl: VITE_LOCALHOST_NODE_RPC_URL,
72+
chain: foundry,
73+
},
74+
gnosisFork: {
75+
rpcUrl: VITE_GNOSIS_FORK_NODE_RPC_URL,
76+
chain: gnosisFork,
77+
chainId: VITE_GNOSIS_FORK_CHAIN_ID,
78+
},
79+
cloudChain: {
80+
rpcUrl: VITE_CUSTOM_CHAIN_NODE_RPC_URL,
81+
chain: cloudChain,
82+
chainId: VITE_CUSTOM_CHAIN_CHAIN_ID,
83+
},
84+
sepolia: {
85+
rpcUrl: VITE_SEPOLIA_RPC_URL,
86+
chain: sepolia,
87+
wallets: [capsuleWallet],
88+
},
89+
};
90+
91+
const chains: Chain[] = [];
92+
const transports: Record<string, Transport> = {};
93+
const customWallets: CreateWalletFn[] = [];
3194
const recommendedWallets = [
3295
injectedWallet,
3396
safeWallet,
3497
rainbowWallet,
3598
metaMaskWallet,
3699
];
37-
const customWallets: CreateWalletFn[] = [];
38100

39101
// WalletConnect
40102
if (VITE_WALLET_CONNECT_PROJECT_ID) {
41103
recommendedWallets.push(walletConnectWallet);
42104
}
43105

44-
// mainnet
106+
// Handle mainnet first to ensure it's always the first chain. This ensures
107+
// wagmi falls back to mainnet if the user isn't connected.
45108
if (VITE_MAINNET_RPC_URL) {
46109
chains.push(mainnet);
47110
transports[mainnet.id] = http(VITE_MAINNET_RPC_URL);
48111

49-
// TODO: push this into the custom wallets for local and cloudchain once
50-
// capsule support is verified
51-
if (capsuleWallet && !customWallets.includes(capsuleWallet)) {
112+
if (
113+
capsuleWallet &&
114+
chainConfigs["mainnet"].wallets?.includes(capsuleWallet)
115+
) {
52116
customWallets.push(capsuleWallet);
53117
}
54118
}
55119

56-
// Local docker anvil node
57-
if (VITE_LOCALHOST_NODE_RPC_URL && VITE_LOCALHOST_NODE_RPC_URL) {
58-
chains.push(foundry);
59-
transports[foundry.id] = http(VITE_LOCALHOST_NODE_RPC_URL);
60-
}
61-
62-
// Gnosis Fork
63-
if (VITE_GNOSIS_FORK_NODE_RPC_URL && VITE_GNOSIS_FORK_CHAIN_ID) {
64-
chains.push(gnosisFork);
65-
transports[gnosisFork.id] = http(VITE_GNOSIS_FORK_NODE_RPC_URL);
66-
}
120+
// Build the rest of the chains dynamically, excluding mainnet
121+
Object.values(chainConfigs).forEach(({ rpcUrl, chain, wallets }) => {
122+
// Exclude mainnet here
123+
if (chain.id === mainnet.id) {
124+
return;
125+
}
67126

68-
// CloudChain
69-
if (VITE_CUSTOM_CHAIN_NODE_RPC_URL && VITE_CUSTOM_CHAIN_CHAIN_ID) {
70-
chains.push(cloudChain);
71-
transports[cloudChain.id] = http(VITE_CUSTOM_CHAIN_NODE_RPC_URL);
72-
}
127+
chains.push(chain);
128+
transports[chain.id] = http(rpcUrl);
73129

74-
// Sepolia
75-
if (VITE_SEPOLIA_RPC_URL) {
76-
chains.push(sepolia);
77-
transports[sepolia.id] = http(VITE_SEPOLIA_RPC_URL);
78-
// TODO: push this into the custom wallets for local and cloudchain once
79-
// capsule support is verified
80-
if (capsuleWallet) {
81-
customWallets.push(capsuleWallet);
130+
// Add custom wallets if they exist
131+
if (wallets) {
132+
wallets.forEach((wallet) => {
133+
if (wallet && !customWallets.includes(wallet)) {
134+
customWallets.push(wallet);
135+
}
136+
});
82137
}
83-
}
84-
85-
// Gnosis
86-
if (VITE_GNOSIS_NODE_RPC_URL) {
87-
chains.push(gnosis);
88-
transports[gnosis.id] = http(VITE_GNOSIS_NODE_RPC_URL);
89-
}
138+
});
90139

140+
// Prepare wallet list
91141
const wallets: WalletList = [
92-
{
93-
groupName: "Other",
94-
wallets: recommendedWallets,
95-
},
142+
{ groupName: "Other", wallets: recommendedWallets },
96143
];
97-
// If Capsule is not configured in your .env, then don't include it in the
98-
// custom wallets
144+
99145
if (customWallets.length) {
100146
wallets.push({
101147
groupName: "Log In or Sign Up with Capsule",
102148
wallets: customWallets,
103149
});
104150
}
151+
105152
export const wagmiConfig = getDefaultConfig({
106153
appName: "Hyperdrive",
107154
projectId: VITE_WALLET_CONNECT_PROJECT_ID || "0",
108155
transports,
109-
// Viem's type for `chains` requires at least one item in the array, but since
110-
// we build the list up programmatically we must cast.
111156
chains: chains as [Chain, ...restChains: Chain[]],
112157
wallets,
113158
});

packages/hyperdrive-appconfig/.env.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ GNOSIS_FORK_NODE_RPC_URL=
99

1010
SEPOLIA_NODE_RPC_URL=
1111
MAINNET_NODE_RPC_URL=
12-
GNOSIS_NODE_RPC_URL=
12+
GNOSIS_NODE_RPC_URL=
13+
LINEA_NODE_RPC_URL=

packages/hyperdrive-appconfig/src/chains/chains.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { cloudChain } from "src/chains/cloudChain";
22
import { gnosisFork } from "src/chains/gnosisFork";
3-
import { gnosis, mainnet, sepolia } from "viem/chains";
3+
import { gnosis, linea, mainnet, sepolia } from "viem/chains";
44

55
// Define Chain ID as a union of available chain keys
66
export type ChainId =
77
| (typeof gnosis)["id"]
88
| (typeof mainnet)["id"]
99
| (typeof cloudChain)["id"]
1010
| (typeof gnosisFork)["id"]
11-
| (typeof sepolia)["id"];
11+
| (typeof sepolia)["id"]
12+
| (typeof linea)["id"];
13+
1214
export interface ChainConfig {
1315
id: ChainId;
1416
name: string;
@@ -24,6 +26,7 @@ export interface ChainConfig {
2426
}
2527

2628
export const chains: Record<ChainId, ChainConfig> = {
29+
/* Mainnet chains */
2730
[mainnet.id]: {
2831
id: mainnet.id,
2932
name: "Mainnet",
@@ -33,6 +36,28 @@ export const chains: Record<ChainId, ChainConfig> = {
3336
iconUrl:
3437
"data:image/png;base64,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",
3538
},
39+
[gnosis.id]: {
40+
id: gnosis.id,
41+
name: "Gnosis",
42+
blockExplorerName: "Gnosisscan",
43+
blockExplorerUrl: "https://gnosisscan.io",
44+
earliestBlock: 35732205n,
45+
dailyAverageBlocks: 16605n,
46+
iconUrl:
47+
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI0OTlfNzU1KSI+CjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNDgwMjEgNC45NTkwMUMxMS41NzQyIC0wLjg0OTg5OCAyMS4yMjQ5IC0wLjYyMTgxNyAyNy4wMzM4IDUuNDcyMTlDMjcuNDExNSA1Ljg3MTMzIDI3Ljc3NSA2LjI4NDczIDI4LjEwMjkgNi43MTk1MUwxNi4wMDA0IDE4LjgyOTFMMy44OTc5MSA2LjcxOTUxQzQuMjMyOSA2LjI4NDczIDQuNTg5MjggNS44NzEzMyA0Ljk2NzAzIDUuNDcyMTlDNS4xMzA5NyA1LjMwMTEzIDUuMzAyMDMgNS4xMzAwNyA1LjQ4MDIxIDQuOTU5MDFaTTI1LjM4MDIgNi42MjY4NUMyMi44ODU2IDQuMTE3OTcgMTkuNTY0MSAyLjc0MjM2IDE2LjAwMDQgMi43NDIzNkMxMi40MzY3IDIuNzQyMzYgOS4xMTUyNCA0LjExNzk3IDYuNjIwNjEgNi42MjY4NUwxNi4wMDA0IDE2LjAwNjZMMjUuMzgwMiA2LjYyNjg1Wk0yOS4wNTEgOC4wOTUxM0wyNi41OTIgMTAuNTU0MUMyOC41NzM0IDEyLjkyNzYgMjguMjU5OCAxNi40NjI4IDI1Ljg4NjQgMTguNDQ0M0MyMy44MDUxIDIwLjE4MzQgMjAuNzgzMSAyMC4xODM0IDE4LjcwMTggMTguNDQ0M0wxNi4wMDA1IDIxLjE0NTZMMTMuMzA2MyAxOC40NTE0QzEwLjkzMjkgMjAuNDMyOCA3LjM5NzY0IDIwLjExOTIgNS40MTYxOSAxNy43NDU4QzMuNjc3MDggMTUuNjY0NSAzLjY3NzA4IDEyLjY0MjUgNS40MTYxOSAxMC41NjEyTDQuMTU0NjIgOS4yOTk2OEwyLjk1NzIxIDguMDk1MTNDMS41MTAzMiAxMC40NzU3IDAuNzQ3NjgxIDEzLjIxMjcgMC43NDc2ODEgMTUuOTk5NUMwLjc0NzY4MSAyNC40MjQyIDcuNTc1ODIgMzEuMjUyNCAxNi4wMDA1IDMxLjI1MjRDMjQuNDI1MiAzMS4yNTI0IDMxLjI1MzQgMjQuNDI0MiAzMS4yNTM0IDE1Ljk5OTVDMzEuMjYwNSAxMy4yMTI3IDMwLjQ5MDcgMTAuNDc1NyAyOS4wNTEgOC4wOTUxM1pNMjUuNDIzMiAxMS43MjNDMjUuOTU3OCAxMi40MTQ0IDI2LjI1IDEzLjI2OTcgMjYuMjUgMTQuMTQ2NEMyNi4yNSAxNS4wMjMxIDI1Ljk1NzggMTUuODc4NCAyNS40MjMyIDE2LjU2OTdDMjQuMDgzMyAxOC4zMDE3IDIxLjU5NTggMTguNjIyNSAxOS44NjM4IDE3LjI4MjVMMjUuNDIzMiAxMS43MjNaTTEyLjEzNzQgMTcuMjg5NkMxMS40NDYgMTcuODI0MiAxMC41OTA3IDE4LjExNjQgOS43MTQwMyAxOC4xMTY0QzguODM3MzUgMTguMTE2NCA3Ljk4OTE4IDE3LjgyNDIgNy4yOTA2OCAxNy4yOTY3QzUuNTU4NyAxNS45NTY4IDUuMjM3OTYgMTMuNDYyMSA2LjU3NzkzIDExLjczMDJMMTIuMTM3NCAxNy4yODk2WiIgZmlsbD0iIzNFNjk1NyIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzI0OTlfNzU1Ij4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=",
48+
},
49+
[linea.id]: {
50+
id: linea.id,
51+
name: "Linea",
52+
blockExplorerName: "Lineascan",
53+
blockExplorerUrl: "https://lineascan.build/",
54+
earliestBlock: 9245278n, // block that the registry was deployed at
55+
dailyAverageBlocks: 43200n, // 2-second block times according to lineascan
56+
iconUrl:
57+
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiMxMjEyMTIiLz4KPG1hc2sgaWQ9Im1hc2swXzI0OTlfNjExIiBzdHlsZT0ibWFzay10eXBlOmx1bWluYW5jZSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTAiIHk9IjciIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNiI+CjxwYXRoIGQ9Ik0yNC45NjkyIDdIMTBWMjIuNjM2M0gyNC45NjkyVjdaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfMjQ5OV82MTEpIj4KPHBhdGggZD0iTTIyLjQzMiAyMi42MzYySDEwVjkuNTM3MjNIMTIuODQ0NFYyMC4wOTc2SDIyLjQzMlYyMi42MzQ5VjIyLjYzNjJaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjIuNDMxOSAxMi4wNzQ1QzIzLjgzMzIgMTIuMDc0NSAyNC45NjkyIDEwLjkzODUgMjQuOTY5MiA5LjUzNzI3QzI0Ljk2OTIgOC4xMzU5NyAyMy44MzMyIDcgMjIuNDMxOSA3QzIxLjAzMDUgNyAxOS44OTQ3IDguMTM1OTcgMTkuODk0NyA5LjUzNzI3QzE5Ljg5NDcgMTAuOTM4NSAyMS4wMzA1IDEyLjA3NDUgMjIuNDMxOSAxMi4wNzQ1WiIgZmlsbD0id2hpdGUiLz4KPC9nPgo8L3N2Zz4K",
58+
},
59+
60+
/* Testnets */
3661
[cloudChain.id]: {
3762
id: cloudChain.id,
3863
name: "Cloudchain",
@@ -51,16 +76,6 @@ export const chains: Record<ChainId, ChainConfig> = {
5176
iconUrl:
5277
"data:image/png;base64,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",
5378
},
54-
[gnosis.id]: {
55-
id: gnosis.id,
56-
name: "Gnosis",
57-
blockExplorerName: "Gnosisscan",
58-
blockExplorerUrl: "https://gnosisscan.io",
59-
earliestBlock: 35732205n,
60-
dailyAverageBlocks: 16605n,
61-
iconUrl:
62-
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI0OTlfNzU1KSI+CjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNDgwMjEgNC45NTkwMUMxMS41NzQyIC0wLjg0OTg5OCAyMS4yMjQ5IC0wLjYyMTgxNyAyNy4wMzM4IDUuNDcyMTlDMjcuNDExNSA1Ljg3MTMzIDI3Ljc3NSA2LjI4NDczIDI4LjEwMjkgNi43MTk1MUwxNi4wMDA0IDE4LjgyOTFMMy44OTc5MSA2LjcxOTUxQzQuMjMyOSA2LjI4NDczIDQuNTg5MjggNS44NzEzMyA0Ljk2NzAzIDUuNDcyMTlDNS4xMzA5NyA1LjMwMTEzIDUuMzAyMDMgNS4xMzAwNyA1LjQ4MDIxIDQuOTU5MDFaTTI1LjM4MDIgNi42MjY4NUMyMi44ODU2IDQuMTE3OTcgMTkuNTY0MSAyLjc0MjM2IDE2LjAwMDQgMi43NDIzNkMxMi40MzY3IDIuNzQyMzYgOS4xMTUyNCA0LjExNzk3IDYuNjIwNjEgNi42MjY4NUwxNi4wMDA0IDE2LjAwNjZMMjUuMzgwMiA2LjYyNjg1Wk0yOS4wNTEgOC4wOTUxM0wyNi41OTIgMTAuNTU0MUMyOC41NzM0IDEyLjkyNzYgMjguMjU5OCAxNi40NjI4IDI1Ljg4NjQgMTguNDQ0M0MyMy44MDUxIDIwLjE4MzQgMjAuNzgzMSAyMC4xODM0IDE4LjcwMTggMTguNDQ0M0wxNi4wMDA1IDIxLjE0NTZMMTMuMzA2MyAxOC40NTE0QzEwLjkzMjkgMjAuNDMyOCA3LjM5NzY0IDIwLjExOTIgNS40MTYxOSAxNy43NDU4QzMuNjc3MDggMTUuNjY0NSAzLjY3NzA4IDEyLjY0MjUgNS40MTYxOSAxMC41NjEyTDQuMTU0NjIgOS4yOTk2OEwyLjk1NzIxIDguMDk1MTNDMS41MTAzMiAxMC40NzU3IDAuNzQ3NjgxIDEzLjIxMjcgMC43NDc2ODEgMTUuOTk5NUMwLjc0NzY4MSAyNC40MjQyIDcuNTc1ODIgMzEuMjUyNCAxNi4wMDA1IDMxLjI1MjRDMjQuNDI1MiAzMS4yNTI0IDMxLjI1MzQgMjQuNDI0MiAzMS4yNTM0IDE1Ljk5OTVDMzEuMjYwNSAxMy4yMTI3IDMwLjQ5MDcgMTAuNDc1NyAyOS4wNTEgOC4wOTUxM1pNMjUuNDIzMiAxMS43MjNDMjUuOTU3OCAxMi40MTQ0IDI2LjI1IDEzLjI2OTcgMjYuMjUgMTQuMTQ2NEMyNi4yNSAxNS4wMjMxIDI1Ljk1NzggMTUuODc4NCAyNS40MjMyIDE2LjU2OTdDMjQuMDgzMyAxOC4zMDE3IDIxLjU5NTggMTguNjIyNSAxOS44NjM4IDE3LjI4MjVMMjUuNDIzMiAxMS43MjNaTTEyLjEzNzQgMTcuMjg5NkMxMS40NDYgMTcuODI0MiAxMC41OTA3IDE4LjExNjQgOS43MTQwMyAxOC4xMTY0QzguODM3MzUgMTguMTE2NCA3Ljk4OTE4IDE3LjgyNDIgNy4yOTA2OCAxNy4yOTY3QzUuNTU4NyAxNS45NTY4IDUuMjM3OTYgMTMuNDYyMSA2LjU3NzkzIDExLjczMDJMMTIuMTM3NCAxNy4yODk2WiIgZmlsbD0iIzNFNjk1NyIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzI0OTlfNzU1Ij4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=",
63-
},
6479
[gnosisFork.id]: {
6580
id: gnosisFork.id,
6681
name: "Gnosis Fork",
@@ -70,4 +85,4 @@ export const chains: Record<ChainId, ChainConfig> = {
7085
iconUrl:
7186
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI0OTlfNzU1KSI+CjxjaXJjbGUgY3g9IjE2IiBjeT0iMTYiIHI9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuNDgwMjEgNC45NTkwMUMxMS41NzQyIC0wLjg0OTg5OCAyMS4yMjQ5IC0wLjYyMTgxNyAyNy4wMzM4IDUuNDcyMTlDMjcuNDExNSA1Ljg3MTMzIDI3Ljc3NSA2LjI4NDczIDI4LjEwMjkgNi43MTk1MUwxNi4wMDA0IDE4LjgyOTFMMy44OTc5MSA2LjcxOTUxQzQuMjMyOSA2LjI4NDczIDQuNTg5MjggNS44NzEzMyA0Ljk2NzAzIDUuNDcyMTlDNS4xMzA5NyA1LjMwMTEzIDUuMzAyMDMgNS4xMzAwNyA1LjQ4MDIxIDQuOTU5MDFaTTI1LjM4MDIgNi42MjY4NUMyMi44ODU2IDQuMTE3OTcgMTkuNTY0MSAyLjc0MjM2IDE2LjAwMDQgMi43NDIzNkMxMi40MzY3IDIuNzQyMzYgOS4xMTUyNCA0LjExNzk3IDYuNjIwNjEgNi42MjY4NUwxNi4wMDA0IDE2LjAwNjZMMjUuMzgwMiA2LjYyNjg1Wk0yOS4wNTEgOC4wOTUxM0wyNi41OTIgMTAuNTU0MUMyOC41NzM0IDEyLjkyNzYgMjguMjU5OCAxNi40NjI4IDI1Ljg4NjQgMTguNDQ0M0MyMy44MDUxIDIwLjE4MzQgMjAuNzgzMSAyMC4xODM0IDE4LjcwMTggMTguNDQ0M0wxNi4wMDA1IDIxLjE0NTZMMTMuMzA2MyAxOC40NTE0QzEwLjkzMjkgMjAuNDMyOCA3LjM5NzY0IDIwLjExOTIgNS40MTYxOSAxNy43NDU4QzMuNjc3MDggMTUuNjY0NSAzLjY3NzA4IDEyLjY0MjUgNS40MTYxOSAxMC41NjEyTDQuMTU0NjIgOS4yOTk2OEwyLjk1NzIxIDguMDk1MTNDMS41MTAzMiAxMC40NzU3IDAuNzQ3NjgxIDEzLjIxMjcgMC43NDc2ODEgMTUuOTk5NUMwLjc0NzY4MSAyNC40MjQyIDcuNTc1ODIgMzEuMjUyNCAxNi4wMDA1IDMxLjI1MjRDMjQuNDI1MiAzMS4yNTI0IDMxLjI1MzQgMjQuNDI0MiAzMS4yNTM0IDE1Ljk5OTVDMzEuMjYwNSAxMy4yMTI3IDMwLjQ5MDcgMTAuNDc1NyAyOS4wNTEgOC4wOTUxM1pNMjUuNDIzMiAxMS43MjNDMjUuOTU3OCAxMi40MTQ0IDI2LjI1IDEzLjI2OTcgMjYuMjUgMTQuMTQ2NEMyNi4yNSAxNS4wMjMxIDI1Ljk1NzggMTUuODc4NCAyNS40MjMyIDE2LjU2OTdDMjQuMDgzMyAxOC4zMDE3IDIxLjU5NTggMTguNjIyNSAxOS44NjM4IDE3LjI4MjVMMjUuNDIzMiAxMS43MjNaTTEyLjEzNzQgMTcuMjg5NkMxMS40NDYgMTcuODI0MiAxMC41OTA3IDE4LjExNjQgOS43MTQwMyAxOC4xMTY0QzguODM3MzUgMTguMTE2NCA3Ljk4OTE4IDE3LjgyNDIgNy4yOTA2OCAxNy4yOTY3QzUuNTU4NyAxNS45NTY4IDUuMjM3OTYgMTMuNDYyMSA2LjU3NzkzIDExLjczMDJMMTIuMTM3NCAxNy4yODk2WiIgZmlsbD0iIzNFNjk1NyIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzI0OTlfNzU1Ij4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=",
7287
},
73-
} as const;
88+
};

0 commit comments

Comments
 (0)