Skip to content

Commit 123255f

Browse files
committed
Add publish_move_package method to PackagePublisher to encapsulate compiling and publishing processes
1 parent 635293e commit 123255f

File tree

1 file changed

+81
-8
lines changed

1 file changed

+81
-8
lines changed

aptos_sdk/package_publisher.py

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from .account import Account
1111
from .account_address import AccountAddress
12+
from .aptos_cli_wrapper import AptosCLIWrapper
1213
from .async_client import RestClient
1314
from .bcs import Serializer
1415
from .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

Comments
 (0)