Skip to content

Commit a8e3102

Browse files
committed
implement chain struct and type all the blockchain networks
1 parent 129da12 commit a8e3102

File tree

2 files changed

+385
-0
lines changed

2 files changed

+385
-0
lines changed

crates/model/src/defi/chain.rs

Lines changed: 384 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,384 @@
1+
// -------------------------------------------------------------------------------------------------
2+
// Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3+
// https://nautechsystems.io
4+
//
5+
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6+
// You may not use this file except in compliance with the License.
7+
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
// -------------------------------------------------------------------------------------------------
15+
16+
#![allow(dead_code)]
17+
#![allow(unused_variables)]
18+
19+
use std::fmt::{Display, Formatter};
20+
21+
use serde::{Deserialize, Serialize};
22+
use strum::Display;
23+
24+
/// Represents different blockchain networks
25+
#[derive(
26+
Debug, Clone, Copy, Hash, PartialOrd, PartialEq, Ord, Eq, Display, Serialize, Deserialize,
27+
)]
28+
pub enum Blockchain {
29+
Abstract,
30+
Arbitrum,
31+
ArbitrumNova,
32+
ArbitrumSepolia,
33+
Aurora,
34+
Avalanche,
35+
Base,
36+
BaseSepolia,
37+
Berachain,
38+
BerachainBartio,
39+
Blast,
40+
BlastSepolia,
41+
Boba,
42+
Bsc,
43+
BscTestnet,
44+
Celo,
45+
Chiliz,
46+
CitreaTestnet,
47+
Curtis,
48+
Cyber,
49+
Darwinia,
50+
Ethereum,
51+
Fantom,
52+
Flare,
53+
Fraxtal,
54+
Fuji,
55+
GaladrielDevnet,
56+
Gnosis,
57+
GnosisChiado,
58+
GnosisTraces,
59+
HarmonyShard0,
60+
Holesky,
61+
HoleskyTokenTest,
62+
Hyperliquid,
63+
HyperliquidTemp,
64+
Ink,
65+
InternalTestChain,
66+
Kroma,
67+
Linea,
68+
Lisk,
69+
Lukso,
70+
LuksoTestnet,
71+
Manta,
72+
Mantle,
73+
MegaethTestnet,
74+
Merlin,
75+
Metall2,
76+
Metis,
77+
MevCommit,
78+
Mode,
79+
MonadTestnet,
80+
MonadTestnetBackup,
81+
MoonbaseAlpha,
82+
Moonbeam,
83+
Morph,
84+
MorphHolesky,
85+
Opbnb,
86+
Optimism,
87+
OptimismSepolia,
88+
PharosDevnet,
89+
Polygon,
90+
PolygonAmoy,
91+
PolygonZkEvm,
92+
Rootstock,
93+
Saakuru,
94+
Scroll,
95+
Sepolia,
96+
ShimmerEvm,
97+
Soneium,
98+
Sophon,
99+
SophonTestnet,
100+
Superseed,
101+
Unichain,
102+
UnichainSepolia,
103+
Xdc,
104+
XdcTestnet,
105+
Zeta,
106+
Zircuit,
107+
ZKsync,
108+
Zora,
109+
}
110+
111+
/// Defines a blockchain with its unique identifiers and connection details for network interaction.
112+
#[derive(Debug, Clone)]
113+
pub struct Chain {
114+
/// The blockchain network type
115+
pub name: Blockchain,
116+
/// The unique identifier for this blockchain
117+
pub chain_id: u32,
118+
/// URL endpoint for HyperSync connection
119+
pub hypersync_url: String,
120+
/// URL endpoint for the default RPC connection
121+
pub rpc_url: Option<String>,
122+
}
123+
124+
impl Chain {
125+
pub fn new(name: Blockchain, chain_id: u32) -> Self {
126+
Self {
127+
chain_id,
128+
name,
129+
hypersync_url: format!("https://{}.hypersync.xyz", chain_id),
130+
rpc_url: None,
131+
}
132+
}
133+
134+
/// Sets the RPC url endpoint
135+
pub fn set_rpc_url(&mut self, rpc: String) {
136+
self.rpc_url = Some(rpc);
137+
}
138+
139+
/// Returns a reference to the `Chain` corresponding to the given `chain_id`, or `None` if it is not found.
140+
pub fn from_chain_id(chain_id: u32) -> Option<&'static Chain> {
141+
match chain_id {
142+
2741 => Some(&chains::ABSTRACT),
143+
42161 => Some(&chains::ARBITRUM),
144+
42170 => Some(&chains::ARBITRUM_NOVA),
145+
421614 => Some(&chains::ARBITRUM_SEPOLIA),
146+
1313161554 => Some(&chains::AURORA),
147+
43114 => Some(&chains::AVALANCHE),
148+
8453 => Some(&chains::BASE),
149+
84532 => Some(&chains::BASE_SEPOLIA),
150+
80094 => Some(&chains::BERACHAIN),
151+
80085 => Some(&chains::BERACHAIN_BARTIO),
152+
81457 => Some(&chains::BLAST),
153+
168587773 => Some(&chains::BLAST_SEPOLIA),
154+
288 => Some(&chains::BOBA),
155+
56 => Some(&chains::BSC),
156+
97 => Some(&chains::BSC_TESTNET),
157+
42220 => Some(&chains::CELO),
158+
8888 => Some(&chains::CHILIZ),
159+
3333 => Some(&chains::CITREA_TESTNET),
160+
33111 => Some(&chains::CURTIS),
161+
7560 => Some(&chains::CYBER),
162+
46 => Some(&chains::DARWINIA),
163+
1 => Some(&chains::ETHEREUM),
164+
250 => Some(&chains::FANTOM),
165+
14 => Some(&chains::FLARE),
166+
252 => Some(&chains::FRAXTAL),
167+
43113 => Some(&chains::FUJI),
168+
696969 => Some(&chains::GALADRIEL_DEVNET),
169+
100 => Some(&chains::GNOSIS),
170+
10200 => Some(&chains::GNOSIS_CHIADO),
171+
10300 => Some(&chains::GNOSIS_TRACES),
172+
1666600000 => Some(&chains::HARMONY_SHARD_0),
173+
17000 => Some(&chains::HOLESKY),
174+
17001 => Some(&chains::HOLESKY_TOKEN_TEST),
175+
7979 => Some(&chains::HYPERLIQUID),
176+
7978 => Some(&chains::HYPERLIQUID_TEMP),
177+
222 => Some(&chains::INK),
178+
13337 => Some(&chains::INTERNAL_TEST_CHAIN),
179+
255 => Some(&chains::KROMA),
180+
59144 => Some(&chains::LINEA),
181+
501 => Some(&chains::LISK),
182+
42 => Some(&chains::LUKSO),
183+
4201 => Some(&chains::LUKSO_TESTNET),
184+
169 => Some(&chains::MANTA),
185+
5000 => Some(&chains::MANTLE),
186+
777 => Some(&chains::MEGAETH_TESTNET),
187+
4200 => Some(&chains::MERLIN),
188+
90 => Some(&chains::METALL2),
189+
1088 => Some(&chains::METIS),
190+
11 => Some(&chains::MEV_COMMIT),
191+
34443 => Some(&chains::MODE),
192+
2323 => Some(&chains::MONAD_TESTNET),
193+
2358 => Some(&chains::MONAD_TESTNET_BACKUP),
194+
1287 => Some(&chains::MOONBASE_ALPHA),
195+
1284 => Some(&chains::MOONBEAM),
196+
2710 => Some(&chains::MORPH),
197+
2710111 => Some(&chains::MORPH_HOLESKY),
198+
204 => Some(&chains::OPBNB),
199+
10 => Some(&chains::OPTIMISM),
200+
11155420 => Some(&chains::OPTIMISM_SEPOLIA),
201+
1337 => Some(&chains::PHAROS_DEVNET),
202+
137 => Some(&chains::POLYGON),
203+
80002 => Some(&chains::POLYGON_AMOY),
204+
1101 => Some(&chains::POLYGON_ZKEVM),
205+
30 => Some(&chains::ROOTSTOCK),
206+
1204 => Some(&chains::SAAKURU),
207+
534352 => Some(&chains::SCROLL),
208+
11155111 => Some(&chains::SEPOLIA),
209+
148 => Some(&chains::SHIMMER_EVM),
210+
109 => Some(&chains::SONEIUM),
211+
138 => Some(&chains::SOPHON),
212+
139 => Some(&chains::SOPHON_TESTNET),
213+
10001 => Some(&chains::SUPERSEED),
214+
9999 => Some(&chains::UNICHAIN),
215+
9997 => Some(&chains::UNICHAIN_SEPOLIA),
216+
50 => Some(&chains::XDC),
217+
51 => Some(&chains::XDC_TESTNET),
218+
7000 => Some(&chains::ZETA),
219+
78600 => Some(&chains::ZIRCUIT),
220+
324 => Some(&chains::ZKSYNC),
221+
7777777 => Some(&chains::ZORA),
222+
_ => None,
223+
}
224+
}
225+
}
226+
227+
impl Display for Chain {
228+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
229+
write!(f, "Chain(name={}, id={})", self.name, self.chain_id)
230+
}
231+
}
232+
233+
// Define a module to contain all the chain definitions
234+
pub mod chains {
235+
use std::sync::LazyLock;
236+
237+
use crate::defi::chain::{Blockchain, Chain};
238+
239+
pub static ABSTRACT: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Abstract, 2741));
240+
pub static ARBITRUM: LazyLock<Chain> =
241+
LazyLock::new(|| Chain::new(Blockchain::Arbitrum, 42161));
242+
pub static ARBITRUM_NOVA: LazyLock<Chain> =
243+
LazyLock::new(|| Chain::new(Blockchain::ArbitrumNova, 42170));
244+
pub static ARBITRUM_SEPOLIA: LazyLock<Chain> =
245+
LazyLock::new(|| Chain::new(Blockchain::ArbitrumSepolia, 421614));
246+
pub static AURORA: LazyLock<Chain> =
247+
LazyLock::new(|| Chain::new(Blockchain::Aurora, 1313161554));
248+
pub static AVALANCHE: LazyLock<Chain> =
249+
LazyLock::new(|| Chain::new(Blockchain::Avalanche, 43114));
250+
pub static BASE: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Base, 8453));
251+
pub static BASE_SEPOLIA: LazyLock<Chain> =
252+
LazyLock::new(|| Chain::new(Blockchain::BaseSepolia, 84532));
253+
pub static BERACHAIN: LazyLock<Chain> =
254+
LazyLock::new(|| Chain::new(Blockchain::Berachain, 80094));
255+
pub static BERACHAIN_BARTIO: LazyLock<Chain> =
256+
LazyLock::new(|| Chain::new(Blockchain::BerachainBartio, 80085));
257+
pub static BLAST: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Blast, 81457));
258+
pub static BLAST_SEPOLIA: LazyLock<Chain> =
259+
LazyLock::new(|| Chain::new(Blockchain::BlastSepolia, 168587773));
260+
pub static BOBA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Boba, 288));
261+
pub static BSC: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Bsc, 56));
262+
pub static BSC_TESTNET: LazyLock<Chain> =
263+
LazyLock::new(|| Chain::new(Blockchain::BscTestnet, 97));
264+
pub static CELO: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Celo, 42220));
265+
pub static CHILIZ: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Chiliz, 8888));
266+
pub static CITREA_TESTNET: LazyLock<Chain> =
267+
LazyLock::new(|| Chain::new(Blockchain::CitreaTestnet, 3333));
268+
pub static CURTIS: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Curtis, 33111));
269+
pub static CYBER: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Cyber, 7560));
270+
pub static DARWINIA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Darwinia, 46));
271+
pub static ETHEREUM: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Ethereum, 1));
272+
pub static FANTOM: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Fantom, 250));
273+
pub static FLARE: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Flare, 14));
274+
pub static FRAXTAL: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Fraxtal, 252));
275+
pub static FUJI: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Fuji, 43113));
276+
pub static GALADRIEL_DEVNET: LazyLock<Chain> =
277+
LazyLock::new(|| Chain::new(Blockchain::GaladrielDevnet, 696969));
278+
pub static GNOSIS: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Gnosis, 100));
279+
pub static GNOSIS_CHIADO: LazyLock<Chain> =
280+
LazyLock::new(|| Chain::new(Blockchain::GnosisChiado, 10200));
281+
pub static GNOSIS_TRACES: LazyLock<Chain> =
282+
LazyLock::new(|| Chain::new(Blockchain::GnosisTraces, 100));
283+
pub static HARMONY_SHARD_0: LazyLock<Chain> =
284+
LazyLock::new(|| Chain::new(Blockchain::HarmonyShard0, 1666600000));
285+
pub static HOLESKY: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Holesky, 17000));
286+
pub static HOLESKY_TOKEN_TEST: LazyLock<Chain> =
287+
LazyLock::new(|| Chain::new(Blockchain::HoleskyTokenTest, 17000));
288+
pub static HYPERLIQUID: LazyLock<Chain> =
289+
LazyLock::new(|| Chain::new(Blockchain::Hyperliquid, 645749));
290+
pub static HYPERLIQUID_TEMP: LazyLock<Chain> =
291+
LazyLock::new(|| Chain::new(Blockchain::HyperliquidTemp, 645748));
292+
pub static INK: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Ink, 57073));
293+
pub static INTERNAL_TEST_CHAIN: LazyLock<Chain> =
294+
LazyLock::new(|| Chain::new(Blockchain::InternalTestChain, 9876));
295+
pub static KROMA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Kroma, 255));
296+
pub static LINEA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Linea, 59144));
297+
pub static LISK: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Lisk, 4000));
298+
pub static LUKSO: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Lukso, 42));
299+
pub static LUKSO_TESTNET: LazyLock<Chain> =
300+
LazyLock::new(|| Chain::new(Blockchain::LuksoTestnet, 4201));
301+
pub static MANTA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Manta, 169));
302+
pub static MANTLE: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Mantle, 5000));
303+
pub static MEGAETH_TESTNET: LazyLock<Chain> =
304+
LazyLock::new(|| Chain::new(Blockchain::MegaethTestnet, 2023));
305+
pub static MERLIN: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Merlin, 4200));
306+
pub static METALL2: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Metall2, 33210));
307+
pub static METIS: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Metis, 1088));
308+
pub static MEV_COMMIT: LazyLock<Chain> =
309+
LazyLock::new(|| Chain::new(Blockchain::MevCommit, 5432101));
310+
pub static MODE: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Mode, 34443));
311+
pub static MONAD_TESTNET: LazyLock<Chain> =
312+
LazyLock::new(|| Chain::new(Blockchain::MonadTestnet, 131313));
313+
pub static MONAD_TESTNET_BACKUP: LazyLock<Chain> =
314+
LazyLock::new(|| Chain::new(Blockchain::MonadTestnetBackup, 131314));
315+
pub static MOONBASE_ALPHA: LazyLock<Chain> =
316+
LazyLock::new(|| Chain::new(Blockchain::MoonbaseAlpha, 1287));
317+
pub static MOONBEAM: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Moonbeam, 1284));
318+
pub static MORPH: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Morph, 2221));
319+
pub static MORPH_HOLESKY: LazyLock<Chain> =
320+
LazyLock::new(|| Chain::new(Blockchain::MorphHolesky, 2522));
321+
pub static OPBNB: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Opbnb, 204));
322+
pub static OPTIMISM: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Optimism, 10));
323+
pub static OPTIMISM_SEPOLIA: LazyLock<Chain> =
324+
LazyLock::new(|| Chain::new(Blockchain::OptimismSepolia, 11155420));
325+
pub static PHAROS_DEVNET: LazyLock<Chain> =
326+
LazyLock::new(|| Chain::new(Blockchain::PharosDevnet, 13371));
327+
pub static POLYGON: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Polygon, 137));
328+
pub static POLYGON_AMOY: LazyLock<Chain> =
329+
LazyLock::new(|| Chain::new(Blockchain::PolygonAmoy, 80002));
330+
pub static POLYGON_ZKEVM: LazyLock<Chain> =
331+
LazyLock::new(|| Chain::new(Blockchain::PolygonZkEvm, 1101));
332+
pub static ROOTSTOCK: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Rootstock, 30));
333+
pub static SAAKURU: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Saakuru, 1442));
334+
pub static SCROLL: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Scroll, 534352));
335+
pub static SEPOLIA: LazyLock<Chain> =
336+
LazyLock::new(|| Chain::new(Blockchain::Sepolia, 11155111));
337+
pub static SHIMMER_EVM: LazyLock<Chain> =
338+
LazyLock::new(|| Chain::new(Blockchain::ShimmerEvm, 148));
339+
pub static SONEIUM: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Soneium, 2241));
340+
pub static SOPHON: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Sophon, 2242));
341+
pub static SOPHON_TESTNET: LazyLock<Chain> =
342+
LazyLock::new(|| Chain::new(Blockchain::SophonTestnet, 2323));
343+
pub static SUPERSEED: LazyLock<Chain> =
344+
LazyLock::new(|| Chain::new(Blockchain::Superseed, 534351));
345+
pub static UNICHAIN: LazyLock<Chain> =
346+
LazyLock::new(|| Chain::new(Blockchain::Unichain, 18231));
347+
pub static UNICHAIN_SEPOLIA: LazyLock<Chain> =
348+
LazyLock::new(|| Chain::new(Blockchain::UnichainSepolia, 28231));
349+
pub static XDC: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Xdc, 50));
350+
pub static XDC_TESTNET: LazyLock<Chain> =
351+
LazyLock::new(|| Chain::new(Blockchain::XdcTestnet, 51));
352+
pub static ZETA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Zeta, 7000));
353+
pub static ZIRCUIT: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Zircuit, 48899));
354+
pub static ZKSYNC: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::ZKsync, 324));
355+
pub static ZORA: LazyLock<Chain> = LazyLock::new(|| Chain::new(Blockchain::Zora, 7777777));
356+
}
357+
358+
#[cfg(test)]
359+
mod tests {
360+
use rstest::rstest;
361+
362+
use super::*;
363+
364+
#[rstest]
365+
fn test_ethereum_chain() {
366+
let eth_chain = chains::ETHEREUM.clone();
367+
assert_eq!(eth_chain.to_string(), "Chain(name=Ethereum, id=1)");
368+
assert_eq!(eth_chain.name, Blockchain::Ethereum);
369+
assert_eq!(eth_chain.chain_id, 1);
370+
assert_eq!(eth_chain.hypersync_url.as_str(), "https://1.hypersync.xyz")
371+
}
372+
373+
#[rstest]
374+
fn test_arbitrum_chain() {
375+
let arbitrum_chain = chains::ARBITRUM.clone();
376+
assert_eq!(arbitrum_chain.to_string(), "Chain(name=Arbitrum, id=42161)");
377+
assert_eq!(arbitrum_chain.name, Blockchain::Arbitrum);
378+
assert_eq!(arbitrum_chain.chain_id, 42161);
379+
assert_eq!(
380+
arbitrum_chain.hypersync_url.as_str(),
381+
"https://42161.hypersync.xyz"
382+
);
383+
}
384+
}

crates/model/src/defi/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@
1313
// limitations under the License.
1414
// -------------------------------------------------------------------------------------------------
1515

16+
pub mod chain;

0 commit comments

Comments
 (0)