@@ -6,9 +6,10 @@ use std::{
66
77use color_eyre:: eyre:: eyre;
88use itertools:: Itertools ;
9+ use move_core_types:: account_address:: AccountAddress ;
910use movy_sui:: {
1011 compile:: SuiCompiledPackage ,
11- database:: cache:: ObjectSuiStoreCommit ,
12+ database:: { cache:: ObjectSuiStoreCommit , graphql :: GraphQlDatabase } ,
1213 rpc:: graphql:: { GraphQlClient , OwnerKind } ,
1314} ;
1415use movy_types:: {
@@ -135,23 +136,36 @@ impl<
135136 epoch : u64 ,
136137 epoch_ms : u64 ,
137138 gas : ObjectID ,
139+ unpublished : bool ,
140+ verify_deps : bool ,
138141 trace_movy_init : bool ,
142+ rpc : & GraphQlDatabase ,
139143 ) -> Result < ( MoveAddress , MovePackageAbi , MovePackageAbi , Vec < String > ) , MovyError > {
140144 tracing:: info!( "Compiling {} with non-test mode..." , path. display( ) ) ;
141- let abi_result = SuiCompiledPackage :: build_all_unpublished_from_folder ( path, false ) ?;
145+ let abi_result = SuiCompiledPackage :: build_checked ( path, false , unpublished , verify_deps ) ?;
142146 let mut non_test_abi = abi_result. abi ( ) ?;
147+ tracing:: info!( "Compiled summary: {}" , & abi_result) ;
143148 tracing:: info!( "Compiling {} with test mode..." , path. display( ) ) ;
144- let compiled_result = SuiCompiledPackage :: build_all_unpublished_from_folder ( path, true ) ?;
149+ let compiled_result =
150+ SuiCompiledPackage :: build_checked ( path, true , unpublished, verify_deps) ?;
151+ tracing:: info!( "Compiled summary: {}" , & compiled_result) ;
152+
145153 let package_names = compiled_result. package_names . clone ( ) ;
146154 let compiled_result = compiled_result. movy_mock ( ) ?;
147- tracing:: debug!(
148- "test modules are {}" ,
149- compiled_result
150- . test_modules( )
151- . iter( )
152- . map( |v| v. self_id( ) . name( ) . to_string( ) )
153- . join( ", " )
154- ) ;
155+
156+ // Deploy onchain deps (execpt stds)
157+ for dep in abi_result. dependencies ( ) . iter ( ) {
158+ let dep = AccountAddress :: from ( * dep) ;
159+ if self . db . get_object ( & dep. into ( ) ) . is_none ( ) {
160+ tracing:: info!(
161+ "Dependency {} not found in our db for {}, trying to fetch it from onchain" ,
162+ dep,
163+ path. display( )
164+ ) ;
165+ self . deploy_package_at_address ( dep. into ( ) , rpc) . await ?;
166+ }
167+ }
168+
155169 let mut executor = SuiExecutor :: new ( self . db . clone ( ) ) ?;
156170 let address =
157171 executor. deploy_contract ( epoch, epoch_ms, deployer. into ( ) , gas, compiled_result) ?;
@@ -279,23 +293,47 @@ impl<
279293 Ok ( ( ) )
280294 }
281295
282- pub async fn deploy_address ( & self , package_id : MoveAddress ) -> Result < ( ) , MovyError > {
283- let Some ( package_object) = self . db . get_object ( & package_id. into ( ) ) else {
284- return Err ( eyre ! ( "Package object not found: {}" , package_id) . into ( ) ) ;
285- } ;
286-
287- // Analyze package dependencies
288- let pkg = package_object
289- . data
290- . try_as_package ( )
291- . ok_or_else ( || eyre ! ( "Expected package data" ) ) ?;
292- for upgrade_info in pkg. linkage_table ( ) . values ( ) {
293- self . db . load_object ( upgrade_info. upgraded_id . into ( ) ) . await ?;
296+ pub async fn deploy_object_id (
297+ & self ,
298+ package_id : MoveAddress ,
299+ rpc : & GraphQlDatabase ,
300+ ) -> Result < ( ) , MovyError > {
301+ if let Some ( object) = rpc. get_object ( package_id. into ( ) ) . await ? {
302+ self . db . commit_single_object ( object) ?;
303+ } else {
304+ return Err ( eyre ! ( "object {} not found" , package_id) . into ( ) ) ;
294305 }
295306
296307 Ok ( ( ) )
297308 }
298309
310+ pub async fn deploy_package_at_address (
311+ & self ,
312+ package_id : MoveAddress ,
313+ rpc : & GraphQlDatabase ,
314+ ) -> Result < ( ) , MovyError > {
315+ tracing:: info!( "Fetching package {} from chain" , package_id) ;
316+ if let Some ( object) = rpc. get_object ( package_id. into ( ) ) . await ? {
317+ let pkg = object
318+ . data
319+ . try_as_package ( )
320+ . ok_or_else ( || eyre ! ( "Expected package data for {}" , object. id( ) ) ) ?;
321+
322+ for upgrade_info in pkg. linkage_table ( ) . values ( ) {
323+ tracing:: info!(
324+ "Fetching ugprade cap {} from chain" ,
325+ upgrade_info. upgraded_id
326+ ) ;
327+ self . deploy_object_id ( upgrade_info. upgraded_id . into ( ) , rpc)
328+ . await ?;
329+ }
330+ self . db . commit_single_object ( object) ?;
331+ } else {
332+ return Err ( eyre ! ( "package {} not found" , package_id) . into ( ) ) ;
333+ }
334+ Ok ( ( ) )
335+ }
336+
299337 pub async fn all_tys ( & self ) -> Result < BTreeSet < MoveStructTag > , MovyError > {
300338 let mut tags = BTreeSet :: new ( ) ;
301339 for obj in self . db . list_objects ( ) . await ? {
0 commit comments