1use reth_chainspec::ChainSpec;
7pub use reth_chainspec::EthChainSpec;
8use revm::primitives::hardfork::SpecId;
9
10pub mod arbos_version {
15 pub const ARBOS_VERSION_2: u64 = 2;
16 pub const ARBOS_VERSION_3: u64 = 3;
17 pub const ARBOS_VERSION_4: u64 = 4;
18 pub const ARBOS_VERSION_5: u64 = 5;
19 pub const ARBOS_VERSION_6: u64 = 6;
20 pub const ARBOS_VERSION_7: u64 = 7;
21 pub const ARBOS_VERSION_8: u64 = 8;
22 pub const ARBOS_VERSION_9: u64 = 9;
23 pub const ARBOS_VERSION_10: u64 = 10;
24 pub const ARBOS_VERSION_11: u64 = 11;
26 pub const ARBOS_VERSION_FIX_REDEEM_GAS: u64 = ARBOS_VERSION_11;
28 pub const ARBOS_VERSION_20: u64 = 20;
30 pub const ARBOS_VERSION_30: u64 = 30;
32 pub const ARBOS_VERSION_STYLUS: u64 = ARBOS_VERSION_30;
33 pub const ARBOS_VERSION_31: u64 = 31;
35 pub const ARBOS_VERSION_STYLUS_FIXES: u64 = ARBOS_VERSION_31;
36 pub const ARBOS_VERSION_32: u64 = 32;
38 pub const ARBOS_VERSION_STYLUS_CHARGING_FIXES: u64 = ARBOS_VERSION_32;
39 pub const ARBOS_VERSION_40: u64 = 40;
41 pub const ARBOS_VERSION_41: u64 = 41;
42 pub const ARBOS_VERSION_50: u64 = 50;
44 pub const ARBOS_VERSION_DIA: u64 = ARBOS_VERSION_50;
45 pub const MAX_ARBOS_VERSION_SUPPORTED: u64 = ARBOS_VERSION_60;
47 pub const ARBOS_VERSION_MULTI_CONSTRAINT_FIX: u64 = 51;
49 pub const ARBOS_VERSION_MULTI_GAS_CONSTRAINTS: u64 = 60;
51 pub const ARBOS_VERSION_60: u64 = 60;
52 pub const ARBOS_VERSION_STYLUS_CONTRACT_LIMIT: u64 = ARBOS_VERSION_60;
53 pub const ARBOS_VERSION_TRANSACTION_FILTERING: u64 = ARBOS_VERSION_60;
54}
55
56pub trait ArbitrumChainSpec {
61 fn chain_id(&self) -> u64;
63
64 fn spec_id_by_timestamp(&self, timestamp: u64) -> SpecId;
66
67 fn spec_id_by_arbos_version(&self, arbos_version: u64) -> SpecId;
69}
70
71pub fn spec_id_by_arbos_version(arbos_version: u64) -> SpecId {
73 if arbos_version >= arbos_version::ARBOS_VERSION_40 {
74 SpecId::PRAGUE
75 } else if arbos_version >= arbos_version::ARBOS_VERSION_20 {
76 SpecId::CANCUN
77 } else if arbos_version >= arbos_version::ARBOS_VERSION_11 {
78 SpecId::SHANGHAI
79 } else {
80 SpecId::MERGE
81 }
82}
83
84pub const ARBITRUM_SEPOLIA_SHANGHAI_TIMESTAMP: u64 = 1_706_634_000;
86pub const ARBITRUM_SEPOLIA_CANCUN_TIMESTAMP: u64 = 1_709_229_600;
87pub const ARBITRUM_SEPOLIA_PRAGUE_TIMESTAMP: u64 = 1_746_543_285;
88
89pub fn arbitrum_sepolia_spec_id_by_timestamp(timestamp: u64) -> SpecId {
91 if timestamp >= ARBITRUM_SEPOLIA_PRAGUE_TIMESTAMP {
92 SpecId::PRAGUE
93 } else if timestamp >= ARBITRUM_SEPOLIA_CANCUN_TIMESTAMP {
94 SpecId::CANCUN
95 } else if timestamp >= ARBITRUM_SEPOLIA_SHANGHAI_TIMESTAMP {
96 SpecId::SHANGHAI
97 } else {
98 SpecId::MERGE
99 }
100}
101
102#[derive(Clone, Debug, Default)]
104pub struct ArbChainSpec {
105 pub chain_id: u64,
106}
107
108impl ArbitrumChainSpec for ArbChainSpec {
109 fn chain_id(&self) -> u64 {
110 self.chain_id
111 }
112
113 fn spec_id_by_timestamp(&self, timestamp: u64) -> SpecId {
114 arbitrum_sepolia_spec_id_by_timestamp(timestamp)
115 }
116
117 fn spec_id_by_arbos_version(&self, arbos_version: u64) -> SpecId {
118 spec_id_by_arbos_version(arbos_version)
119 }
120}
121
122impl ArbitrumChainSpec for ChainSpec {
124 fn chain_id(&self) -> u64 {
125 self.chain().id()
126 }
127
128 fn spec_id_by_timestamp(&self, timestamp: u64) -> SpecId {
129 arbitrum_sepolia_spec_id_by_timestamp(timestamp)
130 }
131
132 fn spec_id_by_arbos_version(&self, arbos_version: u64) -> SpecId {
133 spec_id_by_arbos_version(arbos_version)
134 }
135}
136
137pub const ARBITRUM_ONE_CHAIN_ID: u64 = 42161;
139
140pub const ARBITRUM_SEPOLIA_CHAIN_ID: u64 = 421614;