Skip to content

Commit cd10faa

Browse files
committed
add chain_id to Custom chains + remove helder
1 parent ed4747c commit cd10faa

5 files changed

Lines changed: 32 additions & 210 deletions

File tree

config.example.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Some fields are optional and can be omitted, in which case the default value, if present, will be used.
33

44
# Chain spec ID. Supported values:
5-
# A network ID. Supported values: Mainnet, Holesky, Sepolia, Helder, Hoodi. Lower case values e.g. "mainnet" are also accepted
5+
# A network ID. Supported values: Mainnet, Holesky, Sepolia, Hoodi. Lower case values e.g. "mainnet" are also accepted
66
# A custom object, e.g., chain = { genesis_time_secs = 1695902400, path = "/path/to/spec.json" }, with a path to a chain spec file, either in .json format (e.g., as returned by the beacon endpoint /eth/v1/config/spec), or in .yml format (see examples in tests/data).
77
# A custom object, e.g., chain = { genesis_time_secs = 1695902400, slot_time_secs = 12, genesis_fork_version = "0x01017000" }.
88
chain = "Holesky"

crates/common/src/config/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl CommitBoostConfig {
6868
let chain = match helper_config.chain {
6969
ChainLoader::Path { path, genesis_time_secs } => {
7070
// check if the file path is overridden by env var
71-
let (slot_time_secs, genesis_fork_version, fulu_fork_slot) =
71+
let (slot_time_secs, genesis_fork_version, fulu_fork_slot, chain_id) =
7272
if let Some(path) = load_optional_env_var(CHAIN_SPEC_ENV) {
7373
load_chain_from_file(path.parse()?)?
7474
} else {
@@ -79,6 +79,7 @@ impl CommitBoostConfig {
7979
slot_time_secs,
8080
genesis_fork_version,
8181
fulu_fork_slot,
82+
chain_id,
8283
}
8384
}
8485
ChainLoader::Known(known) => Chain::from(known),
@@ -87,13 +88,15 @@ impl CommitBoostConfig {
8788
slot_time_secs,
8889
genesis_fork_version,
8990
fulu_fork_slot,
91+
chain_id,
9092
} => {
9193
let genesis_fork_version: ForkVersion = genesis_fork_version.as_ref().try_into()?;
9294
Chain::Custom {
9395
genesis_time_secs,
9496
slot_time_secs,
9597
genesis_fork_version,
9698
fulu_fork_slot,
99+
chain_id,
97100
}
98101
}
99102
};

crates/common/src/signature.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,6 @@ mod tests {
106106
compute_domain(Chain::Sepolia, APPLICATION_BUILDER_DOMAIN),
107107
Chain::Sepolia.builder_domain()
108108
);
109-
assert_eq!(
110-
compute_domain(Chain::Helder, APPLICATION_BUILDER_DOMAIN),
111-
Chain::Helder.builder_domain()
112-
);
113109
assert_eq!(
114110
compute_domain(Chain::Hoodi, APPLICATION_BUILDER_DOMAIN),
115111
Chain::Hoodi.builder_domain()

crates/common/src/types.rs

Lines changed: 27 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ pub enum Chain {
3434
Mainnet,
3535
Holesky,
3636
Sepolia,
37-
Helder,
3837
Hoodi,
3938
Custom {
4039
genesis_time_secs: u64,
4140
slot_time_secs: u64,
4241
genesis_fork_version: ForkVersion,
4342
fulu_fork_slot: u64,
43+
chain_id: u64,
4444
},
4545
}
4646

@@ -69,7 +69,7 @@ pub type ForkVersion = [u8; 4];
6969
impl std::fmt::Display for Chain {
7070
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7171
match self {
72-
Self::Mainnet | Self::Holesky | Self::Sepolia | Self::Helder | Self::Hoodi => {
72+
Self::Mainnet | Self::Holesky | Self::Sepolia | Self::Hoodi => {
7373
write!(f, "{self:?}")
7474
}
7575
Self::Custom { .. } => write!(f, "Custom"),
@@ -83,19 +83,20 @@ impl std::fmt::Debug for Chain {
8383
Self::Mainnet => write!(f, "Mainnet"),
8484
Self::Holesky => write!(f, "Holesky"),
8585
Self::Sepolia => write!(f, "Sepolia"),
86-
Self::Helder => write!(f, "Helder"),
8786
Self::Hoodi => write!(f, "Hoodi"),
8887
Self::Custom {
8988
genesis_time_secs,
9089
slot_time_secs,
9190
genesis_fork_version,
9291
fulu_fork_slot,
92+
chain_id,
9393
} => f
9494
.debug_struct("Custom")
9595
.field("genesis_time_secs", genesis_time_secs)
9696
.field("slot_time_secs", slot_time_secs)
9797
.field("genesis_fork_version", &hex::encode_prefixed(genesis_fork_version))
9898
.field("fulu_fork_slot", fulu_fork_slot)
99+
.field("chain_id", chain_id)
99100
.finish(),
100101
}
101102
}
@@ -107,11 +108,8 @@ impl Chain {
107108
Chain::Mainnet => KnownChain::Mainnet.id(),
108109
Chain::Holesky => KnownChain::Holesky.id(),
109110
Chain::Sepolia => KnownChain::Sepolia.id(),
110-
Chain::Helder => KnownChain::Helder.id(),
111111
Chain::Hoodi => KnownChain::Hoodi.id(),
112-
Chain::Custom { .. } => {
113-
unimplemented!("chain id is not supported on custom chains, please file an issue")
114-
}
112+
Chain::Custom { chain_id, .. } => *chain_id,
115113
}
116114
}
117115

@@ -120,7 +118,6 @@ impl Chain {
120118
Chain::Mainnet => KnownChain::Mainnet.builder_domain(),
121119
Chain::Holesky => KnownChain::Holesky.builder_domain(),
122120
Chain::Sepolia => KnownChain::Sepolia.builder_domain(),
123-
Chain::Helder => KnownChain::Helder.builder_domain(),
124121
Chain::Hoodi => KnownChain::Hoodi.builder_domain(),
125122
Chain::Custom { .. } => compute_domain(*self, APPLICATION_BUILDER_DOMAIN),
126123
}
@@ -131,7 +128,6 @@ impl Chain {
131128
Chain::Mainnet => KnownChain::Mainnet.genesis_fork_version(),
132129
Chain::Holesky => KnownChain::Holesky.genesis_fork_version(),
133130
Chain::Sepolia => KnownChain::Sepolia.genesis_fork_version(),
134-
Chain::Helder => KnownChain::Helder.genesis_fork_version(),
135131
Chain::Hoodi => KnownChain::Hoodi.genesis_fork_version(),
136132
Chain::Custom { genesis_fork_version, .. } => *genesis_fork_version,
137133
}
@@ -142,7 +138,6 @@ impl Chain {
142138
Chain::Mainnet => KnownChain::Mainnet.genesis_time_sec(),
143139
Chain::Holesky => KnownChain::Holesky.genesis_time_sec(),
144140
Chain::Sepolia => KnownChain::Sepolia.genesis_time_sec(),
145-
Chain::Helder => KnownChain::Helder.genesis_time_sec(),
146141
Chain::Hoodi => KnownChain::Hoodi.genesis_time_sec(),
147142
Chain::Custom { genesis_time_secs, .. } => *genesis_time_secs,
148143
}
@@ -153,7 +148,6 @@ impl Chain {
153148
Chain::Mainnet => KnownChain::Mainnet.slot_time_sec(),
154149
Chain::Holesky => KnownChain::Holesky.slot_time_sec(),
155150
Chain::Sepolia => KnownChain::Sepolia.slot_time_sec(),
156-
Chain::Helder => KnownChain::Helder.slot_time_sec(),
157151
Chain::Hoodi => KnownChain::Hoodi.slot_time_sec(),
158152
Chain::Custom { slot_time_secs, .. } => *slot_time_secs,
159153
}
@@ -164,7 +158,6 @@ impl Chain {
164158
Chain::Mainnet => KnownChain::Mainnet.fulu_fork_slot(),
165159
Chain::Holesky => KnownChain::Holesky.fulu_fork_slot(),
166160
Chain::Sepolia => KnownChain::Sepolia.fulu_fork_slot(),
167-
Chain::Helder => KnownChain::Helder.fulu_fork_slot(),
168161
Chain::Hoodi => KnownChain::Hoodi.fulu_fork_slot(),
169162
Chain::Custom { slot_time_secs, .. } => *slot_time_secs,
170163
}
@@ -183,8 +176,6 @@ pub enum KnownChain {
183176
Holesky,
184177
#[serde(alias = "sepolia")]
185178
Sepolia,
186-
#[serde(alias = "helder")]
187-
Helder,
188179
#[serde(alias = "hoodi")]
189180
Hoodi,
190181
}
@@ -196,7 +187,6 @@ impl KnownChain {
196187
KnownChain::Mainnet => 1,
197188
KnownChain::Holesky => 17000,
198189
KnownChain::Sepolia => 11155111,
199-
KnownChain::Helder => 167000,
200190
KnownChain::Hoodi => 560048,
201191
}
202192
}
@@ -212,9 +202,6 @@ impl KnownChain {
212202
KnownChain::Sepolia => {
213203
b256!("0x00000001d3010778cd08ee514b08fe67b6c503b510987a4ce43f42306d97c67c")
214204
}
215-
KnownChain::Helder => {
216-
b256!("0x0000000194c41af484fff7964969e0bdd922f82dff0f4be87a60d0664cc9d1ff")
217-
}
218205
KnownChain::Hoodi => {
219206
b256!("0x00000001719103511efa4f1362ff2a50996cccf329cc84cb410c5e5c7d351d03")
220207
}
@@ -226,7 +213,6 @@ impl KnownChain {
226213
KnownChain::Mainnet => hex!("00000000"),
227214
KnownChain::Holesky => hex!("01017000"),
228215
KnownChain::Sepolia => hex!("90000069"),
229-
KnownChain::Helder => hex!("10000000"),
230216
KnownChain::Hoodi => hex!("10000910"),
231217
}
232218
}
@@ -236,7 +222,6 @@ impl KnownChain {
236222
KnownChain::Mainnet => 1606824023,
237223
KnownChain::Holesky => 1695902400,
238224
KnownChain::Sepolia => 1655733600,
239-
KnownChain::Helder => 1718967660,
240225
KnownChain::Hoodi => 1742213400,
241226
}
242227
}
@@ -246,15 +231,13 @@ impl KnownChain {
246231
KnownChain::Mainnet |
247232
KnownChain::Holesky |
248233
KnownChain::Sepolia |
249-
KnownChain::Helder |
250234
KnownChain::Hoodi => 12,
251235
}
252236
}
253237

254238
pub fn fulu_fork_slot(&self) -> u64 {
255239
match self {
256240
KnownChain::Mainnet => 13164544,
257-
KnownChain::Helder => u64::MAX,
258241
KnownChain::Holesky => 5283840,
259242
KnownChain::Sepolia => 8724480,
260243
KnownChain::Hoodi => 1622016,
@@ -268,7 +251,6 @@ impl From<KnownChain> for Chain {
268251
KnownChain::Mainnet => Chain::Mainnet,
269252
KnownChain::Holesky => Chain::Holesky,
270253
KnownChain::Sepolia => Chain::Sepolia,
271-
KnownChain::Helder => Chain::Helder,
272254
KnownChain::Hoodi => Chain::Hoodi,
273255
}
274256
}
@@ -291,6 +273,7 @@ pub enum ChainLoader {
291273
slot_time_secs: u64,
292274
genesis_fork_version: Bytes,
293275
fulu_fork_slot: u64,
276+
chain_id: u64,
294277
},
295278
}
296279

@@ -303,18 +286,19 @@ impl Serialize for Chain {
303286
Chain::Mainnet => ChainLoader::Known(KnownChain::Mainnet),
304287
Chain::Holesky => ChainLoader::Known(KnownChain::Holesky),
305288
Chain::Sepolia => ChainLoader::Known(KnownChain::Sepolia),
306-
Chain::Helder => ChainLoader::Known(KnownChain::Helder),
307289
Chain::Hoodi => ChainLoader::Known(KnownChain::Hoodi),
308290
Chain::Custom {
309291
genesis_time_secs,
310292
slot_time_secs,
311293
genesis_fork_version,
312294
fulu_fork_slot,
295+
chain_id,
313296
} => ChainLoader::Custom {
314297
genesis_time_secs: *genesis_time_secs,
315298
slot_time_secs: *slot_time_secs,
316299
genesis_fork_version: Bytes::from(*genesis_fork_version),
317300
fulu_fork_slot: *fulu_fork_slot,
301+
chain_id: *chain_id,
318302
},
319303
};
320304

@@ -332,20 +316,22 @@ impl<'de> Deserialize<'de> for Chain {
332316
match loader {
333317
ChainLoader::Known(known) => Ok(Chain::from(known)),
334318
ChainLoader::Path { genesis_time_secs, path } => {
335-
let (slot_time_secs, genesis_fork_version, fulu_fork_slot) =
319+
let (slot_time_secs, genesis_fork_version, fulu_fork_slot, chain_id) =
336320
load_chain_from_file(path).map_err(serde::de::Error::custom)?;
337321
Ok(Chain::Custom {
338322
genesis_time_secs,
339323
slot_time_secs,
340324
genesis_fork_version,
341325
fulu_fork_slot,
326+
chain_id,
342327
})
343328
}
344329
ChainLoader::Custom {
345330
genesis_time_secs,
346331
slot_time_secs,
347332
genesis_fork_version,
348333
fulu_fork_slot,
334+
chain_id,
349335
} => {
350336
let genesis_fork_version: ForkVersion =
351337
genesis_fork_version.as_ref().try_into().map_err(serde::de::Error::custom)?;
@@ -354,6 +340,7 @@ impl<'de> Deserialize<'de> for Chain {
354340
slot_time_secs,
355341
genesis_fork_version,
356342
fulu_fork_slot,
343+
chain_id,
357344
})
358345
}
359346
}
@@ -366,7 +353,7 @@ impl<'de> Deserialize<'de> for Chain {
366353
/// - JSON as return the getSpec endpoint, either with or without the `data`
367354
/// field
368355
/// - YAML as used e.g. in Kurtosis/Ethereum Package
369-
pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<(u64, ForkVersion, u64)> {
356+
pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<(u64, ForkVersion, u64, u64)> {
370357
#[derive(Deserialize)]
371358
#[serde(rename_all = "UPPERCASE")]
372359
struct QuotedSpecFile {
@@ -377,14 +364,16 @@ pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<(u64, ForkVersion, u6
377364
slots_per_epoch: u64,
378365
#[serde(with = "serde_utils::quoted_u64")]
379366
fulu_fork_epoch: u64,
367+
#[serde(with = "serde_utils::quoted_u64")]
368+
deposit_chain_id: u64,
380369
}
381370

382371
impl QuotedSpecFile {
383-
fn to_chain(&self) -> eyre::Result<(u64, ForkVersion, u64)> {
372+
fn to_chain(&self) -> eyre::Result<(u64, ForkVersion, u64, u64)> {
384373
let genesis_fork_version: ForkVersion =
385374
self.genesis_fork_version.as_ref().try_into()?;
386375
let fulu_fork_slot = self.fulu_fork_epoch.saturating_mul(self.slots_per_epoch);
387-
Ok((self.seconds_per_slot, genesis_fork_version, fulu_fork_slot))
376+
Ok((self.seconds_per_slot, genesis_fork_version, fulu_fork_slot, self.deposit_chain_id))
388377
}
389378
}
390379

@@ -400,14 +389,15 @@ pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<(u64, ForkVersion, u6
400389
genesis_fork_version: u32,
401390
slots_per_epoch: Option<u64>,
402391
fulu_fork_epoch: u64,
392+
deposit_chain_id: u64,
403393
}
404394

405395
impl SpecFile {
406-
fn to_chain(&self) -> (u64, ForkVersion, u64) {
396+
fn to_chain(&self) -> (u64, ForkVersion, u64, u64) {
407397
let genesis_fork_version: ForkVersion = self.genesis_fork_version.to_be_bytes();
408398
let fulu_fork_slot =
409399
self.fulu_fork_epoch.saturating_mul(self.slots_per_epoch.unwrap_or(32));
410-
(self.seconds_per_slot, genesis_fork_version, fulu_fork_slot)
400+
(self.seconds_per_slot, genesis_fork_version, fulu_fork_slot, self.deposit_chain_id)
411401
}
412402
}
413403

@@ -443,13 +433,14 @@ mod tests {
443433

444434
#[test]
445435
fn test_load_custom() {
446-
let s = r#"chain = { genesis_time_secs = 1, slot_time_secs = 2, genesis_fork_version = "0x01000000", fulu_fork_slot = 1 }"#;
436+
let s = r#"chain = { genesis_time_secs = 1, slot_time_secs = 2, genesis_fork_version = "0x01000000", fulu_fork_slot = 1, chain_id = 123 }"#;
447437
let decoded: MockConfig = toml::from_str(s).unwrap();
448438
assert_eq!(decoded.chain, Chain::Custom {
449439
genesis_time_secs: 1,
450440
slot_time_secs: 2,
451441
genesis_fork_version: [1, 0, 0, 0],
452-
fulu_fork_slot: 1
442+
fulu_fork_slot: 1,
443+
chain_id: 123,
453444
})
454445
}
455446

@@ -492,6 +483,7 @@ mod tests {
492483
slot_time_secs: KnownChain::Holesky.slot_time_sec(),
493484
genesis_fork_version: KnownChain::Holesky.genesis_fork_version(),
494485
fulu_fork_slot: KnownChain::Holesky.fulu_fork_slot(),
486+
chain_id: KnownChain::Holesky.id(),
495487
})
496488
}
497489

@@ -507,12 +499,13 @@ mod tests {
507499
let s = format!("chain = {{ genesis_time_secs = 1, path = {path:?}}}");
508500

509501
let decoded: MockConfig = toml::from_str(&s).unwrap();
510-
assert_eq!(decoded.chain.slot_time_sec(), KnownChain::Helder.slot_time_sec());
502+
assert_eq!(decoded.chain.slot_time_sec(), KnownChain::Sepolia.slot_time_sec());
511503
assert_eq!(decoded.chain, Chain::Custom {
512504
genesis_time_secs: 1,
513505
slot_time_secs: KnownChain::Sepolia.slot_time_sec(),
514506
genesis_fork_version: KnownChain::Sepolia.genesis_fork_version(),
515507
fulu_fork_slot: KnownChain::Sepolia.fulu_fork_slot(),
508+
chain_id: KnownChain::Sepolia.id(),
516509
})
517510
}
518511

@@ -534,27 +527,7 @@ mod tests {
534527
slot_time_secs: KnownChain::Hoodi.slot_time_sec(),
535528
genesis_fork_version: KnownChain::Hoodi.genesis_fork_version(),
536529
fulu_fork_slot: KnownChain::Hoodi.fulu_fork_slot(),
537-
})
538-
}
539-
540-
#[test]
541-
fn test_spec_helder_yml() {
542-
let a = env!("CARGO_MANIFEST_DIR");
543-
let mut path = PathBuf::from(a);
544-
545-
path.pop();
546-
path.pop();
547-
path.push("tests/data/helder_spec.yml");
548-
549-
let s = format!("chain = {{ genesis_time_secs = 1, path = {path:?}}}");
550-
551-
let decoded: MockConfig = toml::from_str(&s).unwrap();
552-
assert_eq!(decoded.chain.slot_time_sec(), KnownChain::Helder.slot_time_sec());
553-
assert_eq!(decoded.chain, Chain::Custom {
554-
genesis_time_secs: 1,
555-
slot_time_secs: KnownChain::Helder.slot_time_sec(),
556-
genesis_fork_version: KnownChain::Helder.genesis_fork_version(),
557-
fulu_fork_slot: KnownChain::Helder.fulu_fork_slot(),
530+
chain_id: KnownChain::Hoodi.id(),
558531
})
559532
}
560533
}

0 commit comments

Comments
 (0)