@@ -21,6 +21,7 @@ pub struct Jwt(pub String);
21
21
pub enum Chain {
22
22
Mainnet ,
23
23
Holesky ,
24
+ Sepolia ,
24
25
Helder ,
25
26
Custom { genesis_time_secs : u64 , slot_time_secs : u64 , genesis_fork_version : [ u8 ; 4 ] } ,
26
27
}
@@ -30,6 +31,7 @@ impl std::fmt::Debug for Chain {
30
31
match self {
31
32
Self :: Mainnet => write ! ( f, "Mainnet" ) ,
32
33
Self :: Holesky => write ! ( f, "Holesky" ) ,
34
+ Self :: Sepolia => write ! ( f, "Sepolia" ) ,
33
35
Self :: Helder => write ! ( f, "Helder" ) ,
34
36
Self :: Custom { genesis_time_secs, slot_time_secs, genesis_fork_version } => f
35
37
. debug_struct ( "Custom" )
@@ -46,6 +48,7 @@ impl Chain {
46
48
match self {
47
49
Chain :: Mainnet => KnownChain :: Mainnet . builder_domain ( ) ,
48
50
Chain :: Holesky => KnownChain :: Holesky . builder_domain ( ) ,
51
+ Chain :: Sepolia => KnownChain :: Sepolia . builder_domain ( ) ,
49
52
Chain :: Helder => KnownChain :: Helder . builder_domain ( ) ,
50
53
Chain :: Custom { .. } => compute_domain ( * self , APPLICATION_BUILDER_DOMAIN ) ,
51
54
}
@@ -55,6 +58,7 @@ impl Chain {
55
58
match self {
56
59
Chain :: Mainnet => KnownChain :: Mainnet . genesis_fork_version ( ) ,
57
60
Chain :: Holesky => KnownChain :: Holesky . genesis_fork_version ( ) ,
61
+ Chain :: Sepolia => KnownChain :: Sepolia . genesis_fork_version ( ) ,
58
62
Chain :: Helder => KnownChain :: Helder . genesis_fork_version ( ) ,
59
63
Chain :: Custom { genesis_fork_version, .. } => * genesis_fork_version,
60
64
}
@@ -64,6 +68,7 @@ impl Chain {
64
68
match self {
65
69
Chain :: Mainnet => KnownChain :: Mainnet . genesis_time_sec ( ) ,
66
70
Chain :: Holesky => KnownChain :: Holesky . genesis_time_sec ( ) ,
71
+ Chain :: Sepolia => KnownChain :: Sepolia . genesis_time_sec ( ) ,
67
72
Chain :: Helder => KnownChain :: Helder . genesis_time_sec ( ) ,
68
73
Chain :: Custom { genesis_time_secs, .. } => * genesis_time_secs,
69
74
}
@@ -73,6 +78,7 @@ impl Chain {
73
78
match self {
74
79
Chain :: Mainnet => KnownChain :: Mainnet . slot_time_sec ( ) ,
75
80
Chain :: Holesky => KnownChain :: Holesky . slot_time_sec ( ) ,
81
+ Chain :: Sepolia => KnownChain :: Sepolia . slot_time_sec ( ) ,
76
82
Chain :: Helder => KnownChain :: Helder . slot_time_sec ( ) ,
77
83
Chain :: Custom { slot_time_secs, .. } => * slot_time_secs,
78
84
}
@@ -85,6 +91,8 @@ pub enum KnownChain {
85
91
Mainnet ,
86
92
#[ serde( alias = "holesky" ) ]
87
93
Holesky ,
94
+ #[ serde( alias = "sepolia" ) ]
95
+ Sepolia ,
88
96
#[ serde( alias = "helder" ) ]
89
97
Helder ,
90
98
}
@@ -101,6 +109,10 @@ impl KnownChain {
101
109
0 , 0 , 0 , 1 , 91 , 131 , 162 , 55 , 89 , 197 , 96 , 178 , 208 , 198 , 69 , 118 , 225 , 220 , 252 ,
102
110
52 , 234 , 148 , 196 , 152 , 143 , 62 , 13 , 159 , 119 , 240 , 83 , 135 ,
103
111
] ,
112
+ KnownChain :: Sepolia => [
113
+ 0 , 0 , 0 , 1 , 211 , 1 , 7 , 120 , 205 , 8 , 238 , 81 , 75 , 8 , 254 , 103 , 182 , 197 , 3 , 181 , 16 ,
114
+ 152 , 122 , 76 , 228 , 63 , 66 , 48 , 109 , 151 , 198 , 124 ,
115
+ ] ,
104
116
KnownChain :: Helder => [
105
117
0 , 0 , 0 , 1 , 148 , 196 , 26 , 244 , 132 , 255 , 247 , 150 , 73 , 105 , 224 , 189 , 217 , 34 , 248 ,
106
118
45 , 255 , 15 , 75 , 232 , 122 , 96 , 208 , 102 , 76 , 201 , 209 , 255 ,
@@ -110,23 +122,28 @@ impl KnownChain {
110
122
111
123
pub fn genesis_fork_version ( & self ) -> [ u8 ; 4 ] {
112
124
match self {
113
- KnownChain :: Mainnet => [ 0u8 ; 4 ] ,
114
- KnownChain :: Holesky => [ 1 , 1 , 112 , 0 ] ,
115
- KnownChain :: Helder => [ 16 , 0 , 0 , 0 ] ,
125
+ KnownChain :: Mainnet => hex ! ( "00000000" ) ,
126
+ KnownChain :: Holesky => hex ! ( "01017000" ) ,
127
+ KnownChain :: Sepolia => hex ! ( "90000069" ) ,
128
+ KnownChain :: Helder => hex ! ( "10000000" ) ,
116
129
}
117
130
}
118
131
119
132
fn genesis_time_sec ( & self ) -> u64 {
120
133
match self {
121
134
KnownChain :: Mainnet => 1606824023 ,
122
135
KnownChain :: Holesky => 1695902400 ,
136
+ KnownChain :: Sepolia => 1655733600 ,
123
137
KnownChain :: Helder => 1718967660 ,
124
138
}
125
139
}
126
140
127
141
pub fn slot_time_sec ( & self ) -> u64 {
128
142
match self {
129
- KnownChain :: Mainnet | KnownChain :: Holesky | KnownChain :: Helder => 12 ,
143
+ KnownChain :: Mainnet |
144
+ KnownChain :: Holesky |
145
+ KnownChain :: Sepolia |
146
+ KnownChain :: Helder => 12 ,
130
147
}
131
148
}
132
149
}
@@ -136,6 +153,7 @@ impl From<KnownChain> for Chain {
136
153
match value {
137
154
KnownChain :: Mainnet => Chain :: Mainnet ,
138
155
KnownChain :: Holesky => Chain :: Holesky ,
156
+ KnownChain :: Sepolia => Chain :: Sepolia ,
139
157
KnownChain :: Helder => Chain :: Helder ,
140
158
}
141
159
}
@@ -157,6 +175,7 @@ impl Serialize for Chain {
157
175
let loader = match self {
158
176
Chain :: Mainnet => ChainLoader :: Known ( KnownChain :: Mainnet ) ,
159
177
Chain :: Holesky => ChainLoader :: Known ( KnownChain :: Holesky ) ,
178
+ Chain :: Sepolia => ChainLoader :: Known ( KnownChain :: Sepolia ) ,
160
179
Chain :: Helder => ChainLoader :: Known ( KnownChain :: Helder ) ,
161
180
Chain :: Custom { genesis_time_secs, slot_time_secs, genesis_fork_version } => {
162
181
ChainLoader :: Custom {
@@ -214,6 +233,10 @@ pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<Chain> {
214
233
let genesis_fork_version: [ u8 ; 4 ] = self . genesis_fork_version . as_ref ( ) . try_into ( ) ?;
215
234
216
235
Ok ( Chain :: Custom {
236
+ // note that this can be wrong, (e.g. it's wrong in mainnet). The correct
237
+ // value should come from /eth/v1/beacon/genesis
238
+ // more info here: https://kb.beaconcha.in/ethereum-staking/the-genesis-event
239
+ // FIXME
217
240
genesis_time_secs : self . min_genesis_time + self . genesis_delay ,
218
241
slot_time_secs : self . seconds_per_slot ,
219
242
genesis_fork_version,
@@ -289,13 +312,34 @@ mod tests {
289
312
}
290
313
291
314
#[ test]
292
- fn test_load_file_data_json ( ) {
315
+ fn test_spec_mainnet_data_json ( ) {
293
316
let a = env ! ( "CARGO_MANIFEST_DIR" ) ;
294
317
let mut path = PathBuf :: from ( a) ;
295
318
296
319
path. pop ( ) ;
297
320
path. pop ( ) ;
298
- path. push ( "tests/data/holesky_spec_data.json" ) ;
321
+ path. push ( "tests/data/mainnet_spec_data.json" ) ;
322
+
323
+ let s = format ! ( "chain = {path:?}" ) ;
324
+
325
+ let decoded: MockConfig = toml:: from_str ( & s) . unwrap ( ) ;
326
+
327
+ // see fixme in load_chain_from_file
328
+ assert_eq ! ( decoded. chain. slot_time_sec( ) , KnownChain :: Mainnet . slot_time_sec( ) ) ;
329
+ assert_eq ! (
330
+ decoded. chain. genesis_fork_version( ) ,
331
+ KnownChain :: Mainnet . genesis_fork_version( )
332
+ ) ;
333
+ }
334
+
335
+ #[ test]
336
+ fn test_spec_holesky_json ( ) {
337
+ let a = env ! ( "CARGO_MANIFEST_DIR" ) ;
338
+ let mut path = PathBuf :: from ( a) ;
339
+
340
+ path. pop ( ) ;
341
+ path. pop ( ) ;
342
+ path. push ( "tests/data/holesky_spec.json" ) ;
299
343
300
344
let s = format ! ( "chain = {path:?}" ) ;
301
345
@@ -308,26 +352,26 @@ mod tests {
308
352
}
309
353
310
354
#[ test]
311
- fn test_load_file_json ( ) {
355
+ fn test_spec_sepolia_data_json ( ) {
312
356
let a = env ! ( "CARGO_MANIFEST_DIR" ) ;
313
357
let mut path = PathBuf :: from ( a) ;
314
358
315
359
path. pop ( ) ;
316
360
path. pop ( ) ;
317
- path. push ( "tests/data/holesky_spec .json" ) ;
361
+ path. push ( "tests/data/sepolia_spec_data .json" ) ;
318
362
319
363
let s = format ! ( "chain = {path:?}" ) ;
320
364
321
365
let decoded: MockConfig = toml:: from_str ( & s) . unwrap ( ) ;
322
366
assert_eq ! ( decoded. chain, Chain :: Custom {
323
- genesis_time_secs: KnownChain :: Holesky . genesis_time_sec( ) ,
324
- slot_time_secs: KnownChain :: Holesky . slot_time_sec( ) ,
325
- genesis_fork_version: KnownChain :: Holesky . genesis_fork_version( )
367
+ genesis_time_secs: KnownChain :: Sepolia . genesis_time_sec( ) ,
368
+ slot_time_secs: KnownChain :: Sepolia . slot_time_sec( ) ,
369
+ genesis_fork_version: KnownChain :: Sepolia . genesis_fork_version( )
326
370
} )
327
371
}
328
372
329
373
#[ test]
330
- fn test_load_file_yml ( ) {
374
+ fn test_spec_helder_yml ( ) {
331
375
let a = env ! ( "CARGO_MANIFEST_DIR" ) ;
332
376
let mut path = PathBuf :: from ( a) ;
333
377
0 commit comments