forest/networks/devnet/
mod.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use ahash::HashMap;
5use cid::Cid;
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<HashMap<Height, HeightInfo>> = LazyLock::new(|| {
36    HashMap::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    ])
168});
169
170fn get_bundle_cid(version: &str) -> Cid {
171    ACTOR_BUNDLES_METADATA
172        .get(&(NetworkChain::Devnet("devnet".into()), version.into()))
173        .expect("bundle must be defined")
174        .bundle_cid
175}
176
177pub(super) static DRAND_SCHEDULE: LazyLock<[DrandPoint<'static>; 1]> = LazyLock::new(|| {
178    [DrandPoint {
179        height: 0,
180        config: &DRAND_QUICKNET,
181    }]
182});
183
184/// Creates a new devnet policy with the given version.
185/// Works with `v10` onward.
186#[macro_export]
187macro_rules! make_devnet_policy {
188    (v11) => {
189        fil_actors_shared::v11::runtime::Policy {
190            minimum_consensus_power: 2040.into(),
191            minimum_verified_allocation_size: 256.into(),
192            pre_commit_challenge_delay: 10,
193            valid_pre_commit_proof_type: {
194                use $crate::shim::sector::RegisteredSealProofV3;
195                let mut proofs = fil_actors_shared::v11::runtime::ProofSet::default();
196                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1);
197                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1);
198                proofs
199            },
200            valid_post_proof_type: {
201                use $crate::shim::sector::RegisteredPoStProofV3;
202                let mut proofs = fil_actors_shared::v11::runtime::ProofSet::default();
203                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1);
204                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1P1);
205                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1);
206                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1P1);
207                proofs
208            },
209            ..Default::default()
210        }
211    };
212    ($version:tt) => {
213        fil_actors_shared::$version::runtime::Policy {
214            minimum_consensus_power: 2040.into(),
215            minimum_verified_allocation_size: 256.into(),
216            pre_commit_challenge_delay: 10,
217            valid_pre_commit_proof_type: {
218                let mut proofs = fil_actors_shared::$version::runtime::ProofSet::default();
219                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1);
220                proofs.insert(RegisteredSealProofV3::StackedDRG2KiBV1P1_Feat_SyntheticPoRep);
221                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1);
222                proofs.insert(RegisteredSealProofV3::StackedDRG8MiBV1P1_Feat_SyntheticPoRep);
223                proofs
224            },
225            valid_post_proof_type: {
226                let mut proofs = fil_actors_shared::$version::runtime::ProofSet::default();
227                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow2KiBV1P1);
228                proofs.insert(RegisteredPoStProofV3::StackedDRGWindow8MiBV1P1);
229                proofs
230            },
231            ..Default::default()
232        }
233    };
234}