Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit feedback!
Build
Create Package

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
        • 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
          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-core.git"
          rev = "mainnet"
          subdir = "aptos-move/framework/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;
          
              //:!:>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
                  );
              }
          }