Loading...
Loading...
Safely deploys Move contracts to Aptos networks (devnet, testnet, mainnet) with pre-deployment verification. Triggers on: 'deploy contract', 'publish to testnet', 'deploy to mainnet', 'how to deploy', 'publish module', 'deployment checklist', 'deploy to devnet'.
npx skill4agent add aptos-labs/aptos-agent-skills deploy-contractssecurity-auditaptos move test --coverageaptos move testaptos move compilemy_addr = "_"deploy-objectaptos move deploy-object \
--address-name my_addr \
--profile devnet \
--assume-yes# ❌ Don't use this for object-based contracts
aptos move publish \
--named-addresses my_addr=<address>deploy-objectpublishinit_moduleobject::create_named_object()deploy-objectaptos move deploy-object --address-name my_addr --profile devnetcreate-object-and-publish-packageaptos move create-object-and-publish-package \
--address-name my_addr \
--named-addresses my_addr=defaultdeploy-object# Ensure all tests pass
aptos move test
# Verify 100% coverage
aptos move test --coverage
aptos move coverage summary
# Expected output: "coverage: 100.0%"# Compile contract
aptos move compile --named-addresses my_addr=<your_address>
# Verify compilation succeeds
echo $?
# Expected: 0 (success)aptos init# Check if default profile exists (look for "default" in output)
aptos config show-profiles
# If no profile exists, initialize one (auto-funds on devnet)
aptos init --network devnet --assume-yes# Deploy as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# Save the object address from output for future upgrades
# Output: "Code was successfully deployed to object address 0x..."
# Verify deployment
aptos account list --account <object_address> --profile default# Check if default profile exists
aptos config show-profiles
# If no profile exists, initialize one
aptos init --network testnet --assume-yesaptos config show-profileshttps://aptos.dev/network/faucet?address=<your_address># Verify balance
aptos account balance --profile default
# Deploy to testnet as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# IMPORTANT: Save the object address from output
# You'll need it for upgrades and function calls
# Output: "Code was successfully deployed to object address 0x..."# Run entry functions to verify deployment
aptos move run \
--profile default \
--function-id <deployed_address>::<module>::<function> \
--args ...
# Test multiple scenarios
# - Happy paths
# - Error cases (should abort with correct error codes)
# - Access control
# - Edge cases
# Verify using explorer
# https://explorer.aptoslabs.com/?network=testnet# Check if default profile exists
aptos config show-profiles
# If no profile exists, initialize one
# IMPORTANT: Warn user that this generates a private key — store it securely
aptos init --network mainnet --assume-yes# Verify balance
aptos account balance --profile default
# Deploy to mainnet as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--max-gas 20000 # Optional: set gas limit
# Review prompts carefully before confirming:
# 1. Gas confirmation: Review gas costs
# 2. Object address: Note the object address for future reference
# OR use --assume-yes to auto-confirm (only if you're confident)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# SAVE THE OBJECT ADDRESS from output
# You'll need it for upgrades and documentation
# Confirm deployment
# Review transaction in explorer:
# https://explorer.aptoslabs.com/?network=mainnet# Check module is published
aptos account list --account <deployed_address> --profile default
# Look for your module in the output
# "0x...::my_module": { ... }
# Run view function to verify
aptos move view \
--profile default \
--function-id <deployed_address>::<module>::<view_function> \
--args ...# Deployment Record
**Date:** 2026-01-23 **Network:** Mainnet **Module:** my_module **Address:** 0x123abc... **Transaction:** 0x456def...
## Verification
- [x] Deployed successfully
- [x] Module visible in explorer
- [x] View functions working
- [x] Entry functions tested
## Links
- Explorer: https://explorer.aptoslabs.com/account/0x123abc...?network=mainnet
- Transaction: https://explorer.aptoslabs.com/txn/0x456def...?network=mainnet
## Notes
- All security checks passed
- 100% test coverage verified
- Tested on testnet for 1 week before mainnet# Upgrade existing object deployment
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address_from_initial_deploy> \
--profile mainnet
# Upgrade with auto-confirm
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address> \
--profile mainnet \
--assume-yes
# Verify upgrade
aptos account list --account <object_address> --profile mainnetdeploy-object// In your module
fun init_module(account: &signer) {
// After deployment, burn upgrade capability
// (implementation depends on your setup)
}# Typical deployment costs:
# - Small module: ~500-1000 gas units
# - Medium module: ~1000-5000 gas units
# - Large module: ~5000-20000 gas units
# When you run deploy-object, the CLI shows gas estimate before confirming
# Use --assume-yes only after you've verified costs on testnet firstproject/
├── Move.toml
└── sources/
├── module1.move
├── module2.move
└── module3.move# Deploys all modules at once as a single object
aptos move deploy-object --address-name my_addr --profile testnet# Deploy dependency package first
cd dependency-package
aptos move deploy-object --address-name dep_addr --profile testnet
# Note the object address from output
# Update main package Move.toml to reference dependency address
# Then deploy main package
cd ../main-package
aptos move deploy-object --address-name main_addr --profile testnetaptos initaptos account fund-with-faucet --account default --amount 100000000 --profile defaultaptos config show-profileshttps://aptos.dev/network/faucet?address=<your_address>aptos account balance --profile default# Use upgrade-object with the original object address
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address_from_initial_deploy> \
--profile testnet# Fix compilation errors first
aptos move compile
# Fix all errors shown, then retry deployment# Increase max gas
aptos move deploy-object \
--address-name my_addr \
--profile testnet \
--max-gas 50000--args u64:1000 # u8, u16, u32, u64, u128, u256
--args bool:true # boolean
--args address:0x1 # address--args string:"Hello World" # UTF-8 string
--args hex:0x48656c6c6f # raw bytes
--args "u64:[1,2,3,4,5]" # vector<u64>
--args "string:[\"one\",\"two\",\"three\"]" # vector<String># For Object<T> parameters, pass the object address
--args address:0x123abc...security-auditdeploy-objectresource_account::create_resource_account()~/.aptos/config.yaml.env"0x..."cat ~/.aptos/config.yamlecho $VITE_MODULE_PUBLISHER_ACCOUNT_PRIVATE_KEYgit add .git add -A.env.gitignoresecurity-auditgenerate-tests