Skip to content
πŸŽ‰ Welcome to the new Aptos Docs! Click here to submit feedback!

Create Package

πŸ’‘

We recommend installing the Aptos CLI before beginning. If you haven’t already installed the Aptos CLI, see the CLI section

aptos move init

In a new project directory, initialize a Move package by running:

Terminal
aptos move init --name <PROJECT_NAME>

You should now have a Move project that looks like so:

        • Move.toml
        πŸ’‘

        You can also create a Move package from a template.

        Update Move.toml

        In Move.toml, fill in the following key information:

        1. name: name of your package
        2. version: package version (default is "0.0.0")
        3. addresses: Describes which address the module will be deployed to. These are named addresses that can be used as aliases. In the below example, we will use hello_blockchain as the named address.
        4. dependencies: You will likely want to use AptosFramework and other Third Party Dependencies

        Below is an example

        Move.toml
        [package]
        name = "Examples"
        version = "0.0.0"
         
        [addresses]
        hello_blockchain = "_"
         
        [dependencies.AptosFramework]
        git = "https://github.com/aptos-labs/aptos-framework.git"
        rev = "mainnet"
        subdir = "aptos-framework"

        Add to sources directory

        Add your code in the sources directory. Here we have a hello_blockchain.move example.

        module hello_blockchain::message {
            use std::error;
            use std::signer;
            use std::string;
            use aptos_framework::event;
            #[test_only]
            use std::debug;
        
            //:!:>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 msg: string::String = string::utf8(b"Running test for sender_can_set_message...");
                debug::print(&msg);
        
                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
                );
            }
        }