99
1010from .account import Account
1111from .account_address import AccountAddress
12+ from .aptos_cli_wrapper import AptosCLIWrapper
1213from .async_client import RestClient
1314from .bcs import Serializer
1415from .transactions import EntryFunction , TransactionArgument , TransactionPayload
@@ -97,7 +98,7 @@ def is_large_package(
9798 def prepare_chunked_payloads (
9899 package_metadata : bytes ,
99100 modules : List [bytes ],
100- large_package_address : AccountAddress ,
101+ large_packages_module_address : AccountAddress ,
101102 publish_mode : PublishMode = PublishMode .ACCOUNT_DEPLOY ,
102103 code_object_address : Optional [AccountAddress ] = None ,
103104 ) -> List [TransactionPayload ]:
@@ -109,7 +110,7 @@ def prepare_chunked_payloads(
109110 for metadata_chunk in metadata_chunks [:- 1 ]:
110111 payloads .append (
111112 PublishHelper .create_large_package_staging_payload (
112- large_package_address , metadata_chunk , [], []
113+ large_packages_module_address , metadata_chunk , [], []
113114 )
114115 )
115116
@@ -126,7 +127,7 @@ def prepare_chunked_payloads(
126127 if taken_size + len (chunk ) > MAX_CHUNK_SIZE :
127128 payloads .append (
128129 PublishHelper .create_large_package_staging_payload (
129- large_package_address ,
130+ large_packages_module_address ,
130131 metadata_chunk ,
131132 modules_indices ,
132133 data_chunks ,
@@ -145,7 +146,7 @@ def prepare_chunked_payloads(
145146 # It will then assemble all staged code chunks and publish it within the large_packages Move module.
146147 payloads .append (
147148 PublishHelper .create_large_package_publishing_payload (
148- large_package_address ,
149+ large_packages_module_address ,
149150 metadata_chunk ,
150151 modules_indices ,
151152 data_chunks ,
@@ -320,11 +321,83 @@ async def upgrade_package_object(
320321 )
321322 return await self .client .submit_bcs_transaction (signed_transaction )
322323
324+ async def publish_move_package (
325+ self ,
326+ sender : Account ,
327+ package_dir : str ,
328+ module_name : str ,
329+ large_packages_module_address : AccountAddress = MODULE_ADDRESS ,
330+ publish_mode : PublishMode = PublishMode .ACCOUNT_DEPLOY ,
331+ code_object_address : Optional [AccountAddress ] = None ,
332+ ) -> List [str ]:
333+ """
334+ Compiles and publishes a Move package, handling both regular and large packages, as well as account and object
335+ deployments.
336+
337+ This method abstracts away complexities such as object address derivation, chunked publishing, and preliminary
338+ compilation if needed.
339+
340+ Note: This method requires the local Aptos CLI for compilation and will not work without it.
341+ """
342+
343+ if not AptosCLIWrapper .does_cli_exist ():
344+ raise Exception ("AptosCLI does not exist." )
345+
346+ # Determine the account or object address for publishing the package.
347+ if publish_mode == PublishMode .ACCOUNT_DEPLOY :
348+ deploy_address = sender .address ()
349+
350+ elif publish_mode == PublishMode .OBJECT_DEPLOY :
351+ deploy_address = await CompileHelper .derive_object_address (
352+ self .client , sender .address ()
353+ )
354+
355+ # Compile the package as a preliminary build to check if chunking is required.
356+ AptosCLIWrapper .compile_package (package_dir , {module_name : deploy_address })
357+ metadata , modules = PublishHelper .load_package_artifacts (package_dir )
358+
359+ # If the package size requires chunked publishing, recalculate the deploy address.
360+ if PublishHelper .is_large_package (metadata , modules ):
361+ required_txns = len (
362+ PublishHelper .prepare_chunked_payloads (
363+ metadata ,
364+ modules ,
365+ large_packages_module_address ,
366+ PublishMode .OBJECT_DEPLOY ,
367+ )
368+ )
369+
370+ if required_txns > 1 :
371+ deploy_address = await CompileHelper .derive_object_address (
372+ self .client , sender .address (), required_txns
373+ )
374+
375+ elif publish_mode == PublishMode .OBJECT_UPGRADE :
376+ if code_object_address is None :
377+ raise ValueError (
378+ "code_object_address must be provided for OBJECT_UPGRADE mode"
379+ )
380+ deploy_address = code_object_address
381+
382+ else :
383+ raise ValueError (f"Unexpected publish mode: { publish_mode } " )
384+
385+ # Compile the package with the correct deployment address.
386+ AptosCLIWrapper .compile_package (package_dir , {module_name : deploy_address })
387+
388+ return await self .publish_package_in_path (
389+ sender ,
390+ package_dir ,
391+ large_packages_module_address ,
392+ publish_mode ,
393+ code_object_address ,
394+ )
395+
323396 async def publish_package_in_path (
324397 self ,
325398 sender : Account ,
326399 package_dir : str ,
327- large_package_address : AccountAddress = MODULE_ADDRESS ,
400+ large_packages_module_address : AccountAddress = MODULE_ADDRESS ,
328401 publish_mode : PublishMode = PublishMode .ACCOUNT_DEPLOY ,
329402 code_object_address : Optional [AccountAddress ] = None ,
330403 ) -> List [str ]:
@@ -343,7 +416,7 @@ async def publish_package_in_path(
343416 sender ,
344417 metadata ,
345418 modules ,
346- large_package_address ,
419+ large_packages_module_address ,
347420 publish_mode ,
348421 code_object_address ,
349422 )
@@ -371,7 +444,7 @@ async def chunked_package_publish(
371444 sender : Account ,
372445 package_metadata : bytes ,
373446 modules : List [bytes ],
374- large_package_address : AccountAddress = MODULE_ADDRESS ,
447+ large_packages_module_address : AccountAddress = MODULE_ADDRESS ,
375448 publish_mode : PublishMode = PublishMode .ACCOUNT_DEPLOY ,
376449 code_object_address : Optional [AccountAddress ] = None ,
377450 ) -> List [str ]:
@@ -388,7 +461,7 @@ async def chunked_package_publish(
388461 payloads = PublishHelper .prepare_chunked_payloads (
389462 package_metadata ,
390463 modules ,
391- large_package_address ,
464+ large_packages_module_address ,
392465 publish_mode ,
393466 code_object_address ,
394467 )
0 commit comments