Skip to main content

forest/networks/devnet/
mod.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use cid::Cid;
5use indexmap::IndexMap;
6use std::sync::LazyLock;
7
8use crate::{eth::EthChainId, make_height, shim::version::NetworkVersion};
9
10use super::{
11    DrandPoint, Height, HeightInfo, NetworkChain, actors_bundle::ACTOR_BUNDLES_METADATA,
12    drand::DRAND_QUICKNET, get_upgrade_height_from_env,
13};
14
15// https://github.com/ethereum-lists/chains/blob/6b1e3ccad1cfcaae5aa1ab917960258f0ef1a6b6/_data/chains/eip155-31415926.json
16pub const ETH_CHAIN_ID: EthChainId = 31415926;
17
18pub const BREEZE_GAS_TAMPING_DURATION: i64 = 0;
19
20pub static GENESIS_NETWORK_VERSION: LazyLock<NetworkVersion> = LazyLock::new(|| {
21    if let Ok(version) = std::env::var("FOREST_GENESIS_NETWORK_VERSION") {
22        NetworkVersion::from(
23            version
24                .parse::<u32>()
25                .expect("Invalid genesis network version"),
26        )
27    } else {
28        NetworkVersion::V21
29    }
30});
31
32/// Height epochs.
33/// Environment variable names follow
34/// <https://github.com/filecoin-project/lotus/blob/8f73f157933435f5020d7b8f23bee9e4ab71cb1c/build/params_2k.go#L108>
35pub static HEIGHT_INFOS: LazyLock<IndexMap<Height, HeightInfo>> = LazyLock::new(|| {
36    IndexMap::from_iter([
37        make_height!(
38            Breeze,
39            get_upgrade_height_from_env("FOREST_BREEZE_HEIGHT").unwrap_or(-50)
40        ),
41        make_height!(
42            Smoke,
43            get_upgrade_height_from_env("FOREST_SMOKE_HEIGHT").unwrap_or(-2)
44        ),
45        make_height!(
46            Ignition,
47            get_upgrade_height_from_env("FOREST_IGNITION_HEIGHT").unwrap_or(-3)
48        ),
49        make_height!(
50            Refuel,
51            get_upgrade_height_from_env("FOREST_REFUEL_HEIGHT").unwrap_or(-4)
52        ),
53        make_height!(
54            Assembly,
55            get_upgrade_height_from_env("FOREST_ASSEMBLY_HEIGHT").unwrap_or(-5)
56        ),
57        make_height!(
58            Tape,
59            get_upgrade_height_from_env("FOREST_TAPE_HEIGHT").unwrap_or(-6)
60        ),
61        make_height!(
62            Liftoff,
63            get_upgrade_height_from_env("FOREST_LIFTOFF_HEIGHT").unwrap_or(-7)
64        ),
65        make_height!(
66            Kumquat,
67            get_upgrade_height_from_env("FOREST_KUMQUAT_HEIGHT").unwrap_or(-8)
68        ),
69        make_height!(
70            Calico,
71            get_upgrade_height_from_env("FOREST_CALICO_HEIGHT").unwrap_or(-9)
72        ),
73        make_height!(
74            Persian,
75            get_upgrade_height_from_env("FOREST_PERSIAN_HEIGHT").unwrap_or(-10)
76        ),
77        make_height!(
78            Claus,
79            get_upgrade_height_from_env("FOREST_CLAUS_HEIGHT").unwrap_or(-11)
80        ),
81        make_height!(
82            Orange,
83            get_upgrade_height_from_env("FOREST_ORANGE_HEIGHT").unwrap_or(-12)
84        ),
85        make_height!(
86            Trust,
87            get_upgrade_height_from_env("FOREST_TRUST_HEIGHT").unwrap_or(-13)
88        ),
89        make_height!(
90            Norwegian,
91            get_upgrade_height_from_env("FOREST_NORWEGIAN_HEIGHT").unwrap_or(-14)
92        ),
93        make_height!(
94            Turbo,
95            get_upgrade_height_from_env("FOREST_TURBO_HEIGHT").unwrap_or(-15)
96        ),
97        make_height!(
98            Hyperdrive,
99            get_upgrade_height_from_env("FOREST_HYPERDRIVE_HEIGHT").unwrap_or(-16)
100        ),
101        make_height!(
102            Chocolate,
103            get_upgrade_height_from_env("FOREST_CHOCOLATE_HEIGHT").unwrap_or(-17)
104        ),
105        make_height!(
106            OhSnap,
107            get_upgrade_height_from_env("FOREST_OHSNAP_HEIGHT").unwrap_or(-18)
108        ),
109        make_height!(
110            Skyr,
111            get_upgrade_height_from_env("FOREST_SKYR_HEIGHT").unwrap_or(-19)
112        ),
113        make_height!(
114            Shark,
115            get_upgrade_height_from_env("FOREST_SHARK_HEIGHT").unwrap_or(-20),
116            get_bundle_cid("v9.0.3")
117        ),
118        make_height!(
119            Hygge,
120            get_upgrade_height_from_env("FOREST_HYGGE_HEIGHT").unwrap_or(-21),
121            get_bundle_cid("v10.0.0")
122        ),
123        make_height!(
124            Lightning,
125            get_upgrade_height_from_env("FOREST_LIGHTNING_HEIGHT").unwrap_or(-22),
126            get_bundle_cid("v11.0.0")
127        ),
128        make_height!(
129            Thunder,
130            get_upgrade_height_from_env("FOREST_THUNDER_HEIGHT").unwrap_or(-23)
131        ),
132        make_height!(
133            Watermelon,
134            get_upgrade_height_from_env("FOREST_WATERMELON_HEIGHT").unwrap_or(-1),
135            get_bundle_cid("v12.0.0")
136        ),
137        make_height!(
138            Dragon,
139            get_upgrade_height_from_env("FOREST_DRAGON_HEIGHT").unwrap_or(20),
140            get_bundle_cid("v13.0.0")
141        ),
142        make_height!(Phoenix, i64::MIN),
143        make_height!(
144            Waffle,
145            get_upgrade_height_from_env("FOREST_WAFFLE_HEIGHT").unwrap_or(9999999999),
146            get_bundle_cid("v14.0.0-rc.1")
147        ),
148        make_height!(
149            TukTuk,
150            get_upgrade_height_from_env("FOREST_TUKTUK_HEIGHT").unwrap_or(9999999999),
151            get_bundle_cid("v15.0.0-rc1")
152        ),
153        make_height!(
154            Teep,
155            get_upgrade_height_from_env("FOREST_TEEP_HEIGHT").unwrap_or(9999999999),
156            get_bundle_cid("v16.0.1")
157        ),
158        make_height!(
159            Tock,
160            get_upgrade_height_from_env("FOREST_TOCK_HEIGHT").unwrap_or(9999999999)
161        ),
162        make_height!(
163            GoldenWeek,
164            get_upgrade_height_from_env("FOREST_GOLDEN_WEEK_HEIGHT").unwrap_or(9999999999),
165            get_bundle_cid("v17.0.0")
166        ),
167        make_height!(
168            FireHorse,
169            get_upgrade_height_from_env("FOREST_FIREHORSE_HEIGHT").unwrap_or(9999999999),
170            get_bundle_cid("v18.0.0")
171        ),
172        make_height!(
173            Solstice,
174            get_upgrade_height_from_env("FOREST_SOLSTICE_HEIGHT").unwrap_or(9999999999),
175            get_bundle_cid("v19.0.1")
176        ),
177    ])
178});
179
180fn get_bundle_cid(version: &str) -> Cid {
181    ACTOR_BUNDLES_METADATA
182        .get(&(NetworkChain::Devnet("devnet".into()), version.into()))
183        .expect("bundle must be defined")
184        .bundle_cid
185}
186
187pub(super) static DRAND_SCHEDULE: LazyLock<[DrandPoint<'static>; 1]> = LazyLock::new(|| {
188    [DrandPoint {
189        height: 0,
190        config: &DRAND_QUICKNET,
191    }]
192});
193
194/// Creates a new devnet policy with the given version.
195/// Works with `v10` onward.
196#[macro_export]
197macro_rules! make_devnet_policy {
198    (v11) => {
199        fil_actors_shared::v11::runtime::Policy {
200            minimum_consensus_power: 2040.into(),
201            minimum_verified_allocation_size: 256.into(),
202            pre_commit_challenge_delay: 10,
203            valid_pre_commit_proof_type: {
204                use $crate::shim::sector::RegisteredSealProofV3;
205                let mut proofs = fil_actors_shared::v11::runtime::ProofSet::default();
206                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1);
207                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1);
208                proofs
209            },
210            valid_post_proof_type: {
211                use $crate::shim::sector::RegisteredPoStProofV3;
212                let mut proofs = fil_actors_shared::v11::runtime::ProofSet::default();
213                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1);
214                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1P1);
215                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1);
216                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1P1);
217                proofs
218            },
219            ..Default::default()
220        }
221    };
222    ($version:tt) => {
223        fil_actors_shared::$version::runtime::Policy {
224            minimum_consensus_power: 2040.into(),
225            minimum_verified_allocation_size: 256.into(),
226            pre_commit_challenge_delay: 10,
227            valid_pre_commit_proof_type: {
228                let mut proofs = fil_actors_shared::$version::runtime::ProofSet::default();
229                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1);
230                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1_Feat_SyntheticPoRep);
231                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1);
232                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1_Feat_SyntheticPoRep);
233                proofs
234            },
235            valid_post_proof_type: {
236                let mut proofs = fil_actors_shared::$version::runtime::ProofSet::default();
237                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1P1);
238                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1P1);
239                proofs
240            },
241            ..Default::default()
242        }
243    };
244}