ckb_chain_spec/
hardfork.rs1use ckb_constant::hardfork::{mainnet, testnet};
4use ckb_types::core::{
5 EpochNumber,
6 hardfork::{CKB2021, CKB2021Builder, CKB2023, CKB2023Builder, HardForks},
7};
8use serde::{Deserialize, Serialize};
9
10#[derive(Default, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
12#[serde(deny_unknown_fields)]
13pub struct HardForkConfig {
14 pub ckb2023: Option<EpochNumber>,
16}
17
18impl HardForkConfig {
19 pub fn complete_mainnet(&self) -> Result<HardForks, String> {
22 let mut ckb2021 = CKB2021::new_builder();
23 ckb2021 = self.update_2021(
24 ckb2021,
25 mainnet::CKB2021_START_EPOCH,
26 mainnet::RFC0028_RFC0032_RFC0033_RFC0034_START_EPOCH,
27 )?;
28
29 Ok(HardForks {
30 ckb2021: ckb2021.build()?,
31 ckb2023: CKB2023::new_mirana().as_builder().build()?,
32 })
33 }
34
35 pub fn complete_testnet(&self) -> Result<HardForks, String> {
38 let mut ckb2021 = CKB2021::new_builder();
39 ckb2021 = self.update_2021(
40 ckb2021,
41 testnet::CKB2021_START_EPOCH,
42 testnet::RFC0028_RFC0032_RFC0033_RFC0034_START_EPOCH,
43 )?;
44 let mut ckb2023 = CKB2023::new_builder();
45 ckb2023 = self.update_2023(ckb2023, testnet::CKB2023_START_EPOCH)?;
46
47 Ok(HardForks {
48 ckb2021: ckb2021.build()?,
49 ckb2023: ckb2023.build()?,
50 })
51 }
52
53 fn update_2021(
54 &self,
55 builder: CKB2021Builder,
56 ckb2021: EpochNumber,
57 rfc_0028_0032_0033_0034_start: EpochNumber,
58 ) -> Result<CKB2021Builder, String> {
59 let builder = builder
60 .rfc_0028(rfc_0028_0032_0033_0034_start)
61 .rfc_0029(ckb2021)
62 .rfc_0030(ckb2021)
63 .rfc_0031(ckb2021)
64 .rfc_0032(rfc_0028_0032_0033_0034_start)
65 .rfc_0036(ckb2021)
66 .rfc_0038(ckb2021);
67 Ok(builder)
68 }
69
70 fn update_2023(
71 &self,
72 builder: CKB2023Builder,
73 ckb2023: EpochNumber,
74 ) -> Result<CKB2023Builder, String> {
75 let builder = builder.rfc_0048(ckb2023).rfc_0049(ckb2023);
76 Ok(builder)
77 }
78
79 pub fn complete_with_dev_default(&self) -> Result<HardForks, String> {
83 let ckb2021 = CKB2021::new_dev_default();
84
85 let ckb2023 = if let Some(epoch) = self.ckb2023 {
86 CKB2023::new_with_specified(epoch)
87 } else {
88 CKB2023::new_dev_default()
89 };
90
91 Ok(HardForks { ckb2021, ckb2023 })
92 }
93}