Smart Contracts on Aptos
Aptos contracts are written using Move, a next generation language for secure, sandboxed, and formally verified programming which is used for multiple chains. Move allows developers to write programs that flexibly manage and transfer assets while providing security and protections against attacks on those assets.
📖 Learn Move
Aptos Move Book →
Learn the Move Language and general Move concepts on AptosMove Prover →
Formal specification and verification of Move contracts on AptosMove on Aptos →
Learn how to use Move on Aptos, how to use objects, fungible assets, publish modules, and moreAptos Framework Move Reference Source ↗
See the source code for the framework modules and associated spec👨💻 Move Examples
Aptos Move Examples ↗
30+ examples on how to develop Move on AptosMove Tutorial ↗
Covers the basics of programming with MoveYour first Move Module →
Ahello_blockchain
example of how to publish your first move moduleHere is a hello_blockchain
example of move
module hello_blockchain::message {
use std::error;
use std::signer;
use std::string;
use aptos_framework::event;
//:!:>resource
struct MessageHolder has key {
message: string::String,
}
//<:!:resource
#[event]
struct MessageChange has drop, store {
account: address,
from_message: string::String,
to_message: string::String,
}
/// There is no message present
const ENO_MESSAGE: u64 = 0;
#[view]
public fun get_message(addr: address): string::String acquires MessageHolder {
assert!(exists<MessageHolder>(addr), error::not_found(ENO_MESSAGE));
borrow_global<MessageHolder>(addr).message
}
public entry fun set_message(account: signer, message: string::String)
acquires MessageHolder {
let account_addr = signer::address_of(&account);
if (!exists<MessageHolder>(account_addr)) {
move_to(&account, MessageHolder {
message,
})
} else {
let old_message_holder = borrow_global_mut<MessageHolder>(account_addr);
let from_message = old_message_holder.message;
event::emit(MessageChange {
account: account_addr,
from_message,
to_message: copy message,
});
old_message_holder.message = message;
}
}
#[test(account = @0x1)]
public entry fun sender_can_set_message(account: signer) acquires MessageHolder {
let addr = signer::address_of(&account);
aptos_framework::account::create_account_for_test(addr);
set_message(account, string::utf8(b"Hello, Blockchain"));
assert!(
get_message(addr) == string::utf8(b"Hello, Blockchain"),
ENO_MESSAGE
);
}
}
⚒️ Developer Resources
FAQ and Discussions
- Aptos Dev Discussions for Q&A about Move.
Move IDE plugins
- Aptos Move Analyzer for Visual Studio.
- Remix IDE Plugin: Offers a web-based development environment. It is a no-setup tool with a graphical interface for developing Move modules.
- Move language plugin for JetBrains IDEs: Supports syntax highlighting, code navigation, renames, formatting, type checks and code generation.
External Resources
- Aptos Move by Example
- Teach yourself Move on Aptos.
- Formal Verification, the Move Language, and the Move Prover
- IMCODING Move Tutorials
- Pontem Move Playground
- Collection of nestable Move resources
A new Move compiler and language version is currently in early beta testing. If you are interested to play with it, check this page.