@@ -11,7 +11,7 @@ use fuel_core::{
1111 combined_database:: CombinedDatabase ,
1212 database:: { database_description:: on_chain:: OnChain , Database , RegularStage } ,
1313 service:: FuelService ,
14- state:: data_source:: { DataSource , DataSourceType } ,
14+ state:: data_source:: DataSource ,
1515} ;
1616use fuel_core_types:: fuel_types:: BlockHeight ;
1717use std:: sync:: Arc ;
@@ -22,7 +22,7 @@ use std::sync::Arc;
2222pub async fn run ( cmd : cmd:: LocalCmd , dry_run : bool ) -> anyhow:: Result < Option < FuelService > > {
2323 check_and_update_chain_config ( ChainConfig :: Local ) . await ?;
2424
25- let fork_url = cmd. fork_url . clone ( ) ;
25+ let fork_url = cmd. fork_url . to_owned ( ) ;
2626 let fork_block_number = cmd. fork_block_number ;
2727 let config = fuel_core:: service:: Config :: from ( cmd) ;
2828
@@ -54,21 +54,28 @@ pub async fn run(cmd: cmd::LocalCmd, dry_run: bool) -> anyhow::Result<Option<Fue
5454 fork_settings. fork_block_height ,
5555 ) ?) ;
5656
57- let off_chain = combined_database. off_chain ( ) . clone ( ) ;
58- let relayer = combined_database. relayer ( ) . clone ( ) ;
59- let gas_price = combined_database. gas_price ( ) . clone ( ) ;
60- let compression = combined_database. compression ( ) . clone ( ) ;
61- let on_chain = {
62- let on_chain = combined_database. on_chain ( ) . clone ( ) ;
63- let ( _, metadata) = on_chain. clone ( ) . into_inner ( ) ;
64- let stage: RegularStage < OnChain > = Default :: default ( ) ;
65- let forking_storage: DataSourceType < OnChain > =
66- Arc :: new ( ForkingOnChainStorage :: new ( on_chain, fork_client) ) ;
67- let data_source = DataSource :: new ( forking_storage, stage) ;
68- Database :: from_storage_and_metadata ( data_source, metadata)
57+ // extract all attributes from combined database (as they are all private); reconstruct them in a new combined database with forked storage
58+ let combined_database = {
59+ let off_chain = combined_database. off_chain ( ) . to_owned ( ) ;
60+ let relayer = combined_database. relayer ( ) . to_owned ( ) ;
61+ let gas_price = combined_database. gas_price ( ) . to_owned ( ) ;
62+ let compression = combined_database. compression ( ) . to_owned ( ) ;
63+
64+ // reconstruct on-chain database with forked storage
65+ let on_chain = {
66+ let on_chain = combined_database. on_chain ( ) . to_owned ( ) ;
67+ let ( _, metadata) = on_chain. clone ( ) . into_inner ( ) ;
68+ let data_source = DataSource :: new (
69+ Arc :: new ( ForkingOnChainStorage :: new ( on_chain, fork_client) ) ,
70+ RegularStage :: < OnChain > :: default ( ) ,
71+ ) ;
72+ Database :: from_storage_and_metadata ( data_source, metadata)
73+ } ;
74+
75+ // reconstruct combined database with forked on-chain storage
76+ CombinedDatabase :: new ( on_chain, off_chain, relayer, gas_price, compression)
6977 } ;
70- let combined_database =
71- CombinedDatabase :: new ( on_chain, off_chain, relayer, gas_price, compression) ;
78+
7279 FuelService :: from_combined_database ( combined_database, config)
7380 . await
7481 . map_err ( |e| anyhow:: anyhow!( "Failed to start fuel-core service: {}" , e) ) ?
0 commit comments