@@ -46,6 +46,18 @@ pub static MAINNET_HOST_GENESIS: LazyLock<Genesis> = LazyLock::new(|| {
4646 serde_json:: from_str ( MAINNET_HOST_GENESIS_JSON ) . expect ( "Failed to parse mainnet host genesis" )
4747} ) ;
4848
49+ /// Genesis for the Parmigiana testnet.
50+ pub static PARMIGIANA_GENESIS : LazyLock < Genesis > = LazyLock :: new ( || {
51+ serde_json:: from_str ( include_str ! ( "./parmigiana.genesis.json" ) )
52+ . expect ( "Failed to parse parmigiana genesis" )
53+ } ) ;
54+
55+ /// Genesis for the Parmigiana host testnet.
56+ pub static PARMIGIANA_HOST_GENESIS : LazyLock < Genesis > = LazyLock :: new ( || {
57+ serde_json:: from_str ( include_str ! ( "./parmigiana.host.genesis.json" ) )
58+ . expect ( "Failed to parse parmigiana host genesis" )
59+ } ) ;
60+
4961/// Genesis for the Pecorino testnet.
5062pub static PECORINO_GENESIS : LazyLock < Genesis > = LazyLock :: new ( || {
5163 serde_json:: from_str ( PECORINO_GENESIS_JSON ) . expect ( "Failed to parse pecorino genesis" )
@@ -90,9 +102,9 @@ pub enum GenesisError {
90102#[ derive( Debug , Clone ) ]
91103pub struct NetworkGenesis {
92104 /// The rollup genesis configuration.
93- pub rollup : Genesis ,
105+ pub rollup : Cow < ' static , Genesis > ,
94106 /// The host genesis configuration.
95- pub host : Genesis ,
107+ pub host : Cow < ' static , Genesis > ,
96108}
97109
98110/// Raw genesis JSON strings for a network.
@@ -108,12 +120,8 @@ pub struct RawNetworkGenesis {
108120#[ derive( Debug , Clone , serde:: Deserialize ) ]
109121#[ serde( untagged) ]
110122pub enum GenesisSpec {
111- /// Signet mainnet.
112- Mainnet ,
113- /// Pecorino testnet.
114- Pecorino ,
115- /// Local testnet.
116- Test ,
123+ /// Known chain genesis configurations.
124+ Known ( #[ serde( deserialize_with = "known_from_str" ) ] KnownChains ) ,
117125 /// Custom paths to genesis files.
118126 Custom {
119127 /// Path to the rollup genesis file.
@@ -123,21 +131,34 @@ pub enum GenesisSpec {
123131 } ,
124132}
125133
134+ fn known_from_str < ' de , D > ( deserializer : D ) -> std:: result:: Result < KnownChains , D :: Error >
135+ where
136+ D : serde:: Deserializer < ' de > ,
137+ {
138+ let s = <String as serde:: Deserialize >:: deserialize ( deserializer) ?;
139+ KnownChains :: from_str ( & s) . map_err ( serde:: de:: Error :: custom)
140+ }
141+
126142impl GenesisSpec {
127143 /// Load the raw genesis JSON strings from the specified source.
128144 ///
129145 /// Returns both rollup and host genesis JSON strings.
130146 pub fn load_raw_genesis ( & self ) -> Result < RawNetworkGenesis > {
131147 match self {
132- GenesisSpec :: Mainnet => Ok ( RawNetworkGenesis {
148+ GenesisSpec :: Known ( KnownChains :: Mainnet ) => Ok ( RawNetworkGenesis {
133149 rollup : Cow :: Borrowed ( MAINNET_GENESIS_JSON ) ,
134150 host : Cow :: Borrowed ( MAINNET_HOST_GENESIS_JSON ) ,
135151 } ) ,
136- GenesisSpec :: Pecorino => Ok ( RawNetworkGenesis {
152+ GenesisSpec :: Known ( KnownChains :: Parmigiana ) => Ok ( RawNetworkGenesis {
153+ rollup : Cow :: Borrowed ( include_str ! ( "./parmigiana.genesis.json" ) ) ,
154+ host : Cow :: Borrowed ( include_str ! ( "./parmigiana.host.genesis.json" ) ) ,
155+ } ) ,
156+ #[ allow( deprecated) ]
157+ GenesisSpec :: Known ( KnownChains :: Pecorino ) => Ok ( RawNetworkGenesis {
137158 rollup : Cow :: Borrowed ( PECORINO_GENESIS_JSON ) ,
138159 host : Cow :: Borrowed ( PECORINO_HOST_GENESIS_JSON ) ,
139160 } ) ,
140- GenesisSpec :: Test => Ok ( RawNetworkGenesis {
161+ GenesisSpec :: Known ( KnownChains :: Test ) => Ok ( RawNetworkGenesis {
141162 rollup : Cow :: Borrowed ( TEST_GENESIS_JSON ) ,
142163 host : Cow :: Borrowed ( TEST_HOST_GENESIS_JSON ) ,
143164 } ) ,
@@ -153,21 +174,27 @@ impl GenesisSpec {
153174 /// Returns both rollup and host genesis configurations.
154175 pub fn load_genesis ( & self ) -> Result < NetworkGenesis > {
155176 match self {
156- GenesisSpec :: Mainnet => Ok ( NetworkGenesis {
157- rollup : MAINNET_GENESIS . clone ( ) ,
158- host : MAINNET_HOST_GENESIS . clone ( ) ,
177+ GenesisSpec :: Known ( KnownChains :: Mainnet ) => Ok ( NetworkGenesis {
178+ rollup : Cow :: Borrowed ( & * MAINNET_GENESIS ) ,
179+ host : Cow :: Borrowed ( & * MAINNET_HOST_GENESIS ) ,
180+ } ) ,
181+ GenesisSpec :: Known ( KnownChains :: Parmigiana ) => Ok ( NetworkGenesis {
182+ rollup : Cow :: Borrowed ( & * PARMIGIANA_GENESIS ) ,
183+ host : Cow :: Borrowed ( & * PARMIGIANA_HOST_GENESIS ) ,
159184 } ) ,
160- GenesisSpec :: Pecorino => Ok ( NetworkGenesis {
161- rollup : PECORINO_GENESIS . clone ( ) ,
162- host : PECORINO_HOST_GENESIS . clone ( ) ,
185+ #[ allow( deprecated) ]
186+ GenesisSpec :: Known ( KnownChains :: Pecorino ) => Ok ( NetworkGenesis {
187+ rollup : Cow :: Borrowed ( & * PECORINO_GENESIS ) ,
188+ host : Cow :: Borrowed ( & * PECORINO_HOST_GENESIS ) ,
189+ } ) ,
190+ GenesisSpec :: Known ( KnownChains :: Test ) => Ok ( NetworkGenesis {
191+ rollup : Cow :: Borrowed ( & * TEST_GENESIS ) ,
192+ host : Cow :: Borrowed ( & * TEST_HOST_GENESIS ) ,
163193 } ) ,
164- GenesisSpec :: Test => {
165- Ok ( NetworkGenesis { rollup : TEST_GENESIS . clone ( ) , host : TEST_HOST_GENESIS . clone ( ) } )
166- }
167194 GenesisSpec :: Custom { .. } => self . load_raw_genesis ( ) . and_then ( |genesis| {
168195 Ok ( NetworkGenesis {
169- rollup : serde_json:: from_str ( & genesis. rollup ) ?,
170- host : serde_json:: from_str ( & genesis. host ) ?,
196+ rollup : Cow :: Owned ( serde_json:: from_str ( & genesis. rollup ) ?) ,
197+ host : Cow :: Owned ( serde_json:: from_str ( & genesis. host ) ?) ,
171198 } )
172199 } ) ,
173200 }
@@ -240,9 +267,6 @@ impl FromEnv for GenesisSpec {
240267
241268impl From < KnownChains > for GenesisSpec {
242269 fn from ( known : KnownChains ) -> Self {
243- match known {
244- KnownChains :: Pecorino => GenesisSpec :: Pecorino ,
245- KnownChains :: Test => GenesisSpec :: Test ,
246- }
270+ Self :: Known ( known)
247271 }
248272}
0 commit comments