use-aptos-cli
Use Aptos CLI Skill
Overview
Comprehensive reference for Aptos CLI commands used in Move development workflow.
Installation: https://aptos.dev/build/cli
Core Commands
Project Initialization
# Create new Move project
aptos move init --name <project_name>
# Example
aptos move init --name my_marketplace
Compilation
# Compile Move modules
aptos move compile
# Compile with specific named addresses
aptos move compile --named-addresses my_addr=0xCAFE
# Compile without fetching latest deps (faster)
aptos move compile --skip-fetch-latest-git-deps
# Generate ABI
aptos move compile --save-metadata
Testing
# Run all tests
aptos move test
# Run specific test
aptos move test --filter test_name
# Run tests with coverage
aptos move test --coverage
# Generate coverage summary
aptos move coverage summary
# Generate detailed coverage report for module
aptos move coverage source --module <module_name>
# Example: View coverage for marketplace module
aptos move coverage source --module marketplace
Publishing/Deployment
IMPORTANT: Use deploy-object to deploy as objects (modern pattern), NOT publish (creates resource account).
# ✅ CORRECT: Deploy as object (recommended)
aptos move deploy-object --address-name <named_address>
# Example: Deploy marketplace contract as object
aptos move deploy-object --address-name marketplace_addr
# Deploy with auto-confirm (skips yes/no prompts)
aptos move deploy-object --address-name marketplace_addr --assume-yes
# Deploy to specific network
aptos move deploy-object --address-name marketplace_addr --network testnet
aptos move deploy-object --address-name marketplace_addr --network mainnet
# Deploy with specific profile
aptos move deploy-object --address-name marketplace_addr --profile my_profile
# Upgrade existing object deployment
aptos move upgrade-object \
--address-name marketplace_addr \
--object-address 0x123abc...
# Upgrade with auto-confirm
aptos move upgrade-object \
--address-name marketplace_addr \
--object-address 0x123abc... \
--assume-yes
Deployment Prompts:
When deploying, the CLI will ask two questions:
- Gas confirmation: "Do you want to submit a transaction for a range of [X - Y] Octas at a gas unit price of Z Octas? [yes/no]"
- Object address confirmation: "Do you want to publish this package at object address 0x... [yes/no]"
To skip prompts, use --assume-yes flag (automatically answers "yes").
Note on Move.toml:
For object deployment, set named addresses to _ (placeholder) in Move.toml:
[addresses]
marketplace_addr = "_"
The CLI will override this with the actual deployment address.
Legacy: Publishing to Resource Account (❌ Not recommended for new projects)
# ❌ OLD: Publish to resource account (legacy pattern)
aptos move publish --named-addresses my_addr=default
# This creates a resource account, which is deprecated.
# Use deploy-object instead for modern object-based deployment.
Account Management
# Initialize new account
aptos init
# Initialize with specific network
aptos init --network testnet
# Create new account with profile
aptos init --profile my_profile
# List account resources
aptos account list --account <address>
# Get account balance
aptos account balance --account <address>
Funding Accounts (Devnet/Testnet)
Use the web faucet (requires login):
- Get your account address:
aptos account list --profile testnet - Go to:
https://aptos.dev/network/faucet?address=<your_address> - Login and request testnet/devnet APT
- Verify balance:
aptos account balance --profile testnet
Note: The CLI command aptos account fund-with-faucet is deprecated. Use the web faucet instead.
Running Functions
# Run entry function
aptos move run \
--function-id <address>::<module>::<function> \
--args <arg1> <arg2> ...
# Example: Create NFT
aptos move run \
--function-id 0xCAFE::nft::mint_nft \
--args string:"My NFT" string:"Description" string:"https://uri.com"
# Run with type arguments
aptos move run \
--function-id <address>::<module>::<function> \
--type-args <type1> <type2> \
--args <arg1> <arg2>
View Functions
# Call view function (read-only)
aptos move view \
--function-id <address>::<module>::<function> \
--args <arg1> <arg2>
# Example: Get NFT name
aptos move view \
--function-id 0xCAFE::nft::get_nft_name \
--args address:0x123
Documentation
# Generate documentation
aptos move document
# Generate and open in browser
aptos move document --open
Cleanup
# Clean build artifacts
aptos move clean
Advanced Commands
Scripting
# Run Move script
aptos move run-script \
--compiled-script-path <path_to_compiled_script>
Prove (Formal Verification)
# Run Move prover
aptos move prove
# Prove specific module
aptos move prove --module <module_name>
Transaction Simulation
# Simulate transaction without submitting
aptos move run \
--function-id <address>::<module>::<function> \
--args <args> \
--simulate
Configuration
Security: NEVER read this file from the user's filesystem. The structure below is for reference only. Always use
"0x..."placeholders for private key values.
Config File (~/.aptos/config.yaml)
profiles:
default:
private_key: "0x..."
public_key: "0x..."
account: "0x..."
rest_url: "https://fullnode.devnet.aptoslabs.com/v1"
faucet_url: "https://faucet.devnet.aptoslabs.com"
testnet:
private_key: "0x..."
public_key: "0x..."
account: "0x..."
rest_url: "https://fullnode.testnet.aptoslabs.com/v1"
faucet_url: "https://faucet.testnet.aptoslabs.com"
mainnet:
private_key: "0x..."
public_key: "0x..."
account: "0x..."
rest_url: "https://fullnode.mainnet.aptoslabs.com/v1"
Switching Profiles
# Use specific profile
aptos --profile testnet move publish --named-addresses my_addr=0x123
# Set default profile
export APTOS_PROFILE=testnet
Argument Types
Primitive Types
# u8, u16, u32, u64, u128, u256
--args u64:1000
# bool
--args bool:true
# address
--args address:0x1
Complex Types
# string (UTF-8)
--args string:"Hello World"
# hex (raw bytes)
--args hex:0x48656c6c6f
# vector
--args "u64:[1,2,3,4,5]"
# vector of strings
--args "string:[\"one\",\"two\",\"three\"]"
Object Types
# Object address (for Object<T> parameters)
--args address:0x123abc...
Network URLs
Devnet
REST: https://fullnode.devnet.aptoslabs.com/v1
Faucet: https://faucet.devnet.aptoslabs.com
Explorer: https://explorer.aptoslabs.com/?network=devnet
Testnet
REST: https://fullnode.testnet.aptoslabs.com/v1
Faucet: https://faucet.testnet.aptoslabs.com
Explorer: https://explorer.aptoslabs.com/?network=testnet
Mainnet
REST: https://fullnode.mainnet.aptoslabs.com/v1
Explorer: https://explorer.aptoslabs.com/?network=mainnet
Troubleshooting Commands
Check CLI Version
aptos --version
Update CLI
# Using cargo
cargo install --git https://github.com/aptos-labs/aptos-core.git aptos
# Using prebuilt binaries
# Download from: https://github.com/aptos-labs/aptos-core/releases
Clear Cache
# Remove build directory
rm -rf build/
# Recompile
aptos move compile
Verbose Output
# Add --verbose flag to any command
aptos move compile --verbose
aptos move test --verbose
Common Error Solutions
"Package dependencies not resolved"
# Solution: Fetch dependencies
aptos move compile
"Address not found in named addresses"
# Solution: Specify named addresses
aptos move compile --named-addresses my_addr=0xCAFE
"Insufficient funds"
Solution: Fund via web faucet (testnet/devnet):
- Get address:
aptos account list --profile testnet - Go to:
https://aptos.dev/network/faucet?address=<your_address> - Login and request APT
"Module already published"
# Solution: Use upgrade-object with original object address
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address_from_initial_deploy>
Quick Reference
| Command | Purpose |
|---|---|
aptos move init |
Create new project |
aptos move compile |
Compile Move code |
aptos move test |
Run tests |
aptos move test --coverage |
Test with coverage |
aptos move deploy-object |
Deploy module (modern) |
aptos move upgrade-object |
Upgrade deployed module |
aptos move run |
Execute entry function |
aptos move view |
Call view function |
aptos account list |
View account resources |
aptos account balance |
Check account balance |
aptos init |
Initialize CLI config |
ALWAYS Rules
- ✅ ALWAYS run
aptos move test --coveragebefore deployment - ✅ ALWAYS verify 100% coverage
- ✅ ALWAYS test on testnet before mainnet
- ✅ ALWAYS use named addresses (not hardcoded)
- ✅ ALWAYS specify network for deployment
- ✅ ALWAYS check CLI version is up-to-date
NEVER Rules
- ❌ NEVER deploy without testing
- ❌ NEVER skip coverage verification
- ❌ NEVER deploy directly to mainnet without testnet testing
- ❌ NEVER hardcode addresses in code
- ❌ NEVER commit private keys to git
- ❌ NEVER read or display contents of
~/.aptos/config.yaml(contains private keys for all profiles) - ❌ NEVER run commands that expose keys:
cat ~/.aptos/config.yaml,env | grep KEY,printenv - ❌ NEVER display or repeat private key values — always use
"0x..."as placeholder
References
Official Documentation:
- CLI Guide: https://aptos.dev/build/cli
- Working with Move Contracts: https://aptos.dev/build/cli/working-with-move-contracts
- CLI Reference: https://aptos.dev/build/cli/cli-reference
Related Skills:
scaffold-project- Initialize projectswrite-contracts- Write modules to compilegenerate-tests- Create tests to rundeploy-contracts- Deploy modulestroubleshoot-errors- Fix CLI errors
Remember: Test locally, deploy to testnet, verify, then mainnet. Always use --coverage.