Skip to main content

Sui Move CLI

The Sui CLI move command provides several commands for working with Move source code. A typical usage of sui move is to compile and test the Move code, or to generate a new Move project by using sui move new project_name, which creates the needed directories and the Move.toml file.

Check Sui CLI installation​

Before you can use the Sui CLI, you must install it. To check if the CLI exists on your system, open a terminal or console and type the following command:

$ sui --version

If the terminal or console responds with a version number, you already have the Sui CLI installed.

If the command is not found, follow the instructions in Install Sui to get the Sui CLI on your system.

Commands​

$ sui move --help
Tool to build and test Move applications

Usage: sui move [OPTIONS] <COMMAND>

Commands:
build
coverage Inspect test coverage for this package. A previous test run with the
`--coverage` flag must have previously been run
disassemble
manage-package Record addresses (Object IDs) for where this package is published on chain
(this command sets variables in Move.lock)
migrate Migrate to Move 2024 for the package at `path`. If no path is provided
defaults to current directory
new Create a new Move package with name `name` at `path`. If `path` is not
provided the package will be created in the directory `name`
test Run Move unit tests in this package
summary Generate a serialized summary of a Move package (e.g., functions, structs,
annotations, etc.)
help Print this message or the help of the given subcommand(s)

Options:
-p, --path <PACKAGE_PATH>
Path to a package which the command should be run with respect to
--client.config <CONFIG>
Sets the file storing the state of our user accounts (an empty one will be created if
missing)
--client.env <ENV>
The Sui environment to use. This must be present in the current config file
-d, --dev
Compile in 'dev' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used if
this flag is set. This flag is useful for development of packages that expose named
addresses that are not set to a specific value
--test
Compile in 'test' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used
along with any code in the 'tests' directory
--doc
Generate documentation for packages
--disassemble
Save disassembly for generated bytecode along with bytecode maps (source maps for
disassembled bytecode)
--install-dir <INSTALL_DIR>
Installation directory for compiled artifacts. Defaults to current directory
--force
Force recompilation of all packages
--fetch-deps-only
Only fetch dependency repos to MOVE_HOME
--skip-fetch-latest-git-deps
Skip fetching latest git dependencies
--default-move-flavor <DEFAULT_FLAVOR>
Default flavor for move compilation, if not specified in the package's config
--default-move-edition <DEFAULT_EDITION>
Default edition for move compilation, if not specified in the package's config
--dependencies-are-root
If set, dependency packages are treated as root packages. Notably, this will remove
warning suppression in dependency packages
--silence-warnings
If set, ignore any compiler warnings
--warnings-are-errors
If set, warnings become errors
--json-errors
If set, reports errors at JSON
--no-lint
If `true`, disable linters
--lint
If `true`, enables extra linters
--mode <MODE>
Arbitrary mode -- this will be used to enable or filter user-defined `#[mode(<MODE>)]`
annotations during compilation
-h, --help
Print help
-V, --version
Print version

Examples​

The following examples demonstrate some of the most often used commands.

Create a new Move project​

To create a new Move project that automatically adds the necessary dependencies in a Move.toml file, run sui move new [<PROJECT-NAME>].

$ sui move new smart_contract_test
$ ls -l smart_contract_test
Move.toml
Sources

Display the contents of Move.toml file.

$ cat smart_contract_test/Move.toml
[package]
name = "smart_contract_test"
version = "0.0.1"

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" }

[addresses]
smart_contract_test = "0x0"

Build a Move project​

Use sui move build at the root of your Move project to build the package.

$ sui move build
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING smart_contract_test

Run tests in a Move project​

Use sui move test to run the tests in a Move package.

$ sui move test
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING smart_contract_test
Running Move unit tests
Test result: OK. Total tests: 0; passed: 0; failed: 0

Get test coverage for a module​

caution

This command currently only works on debug builds of the CLI. Please build the CLI from source to use it.

This example uses first_package Move package.

To get a summary of the test coverage, you must first run the sui move test --coverage command, and then the sui move coverage summary --test to get a summary of the test coverage in the example project.

$ sui move test --coverage
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING first_package
Running Move unit tests
[ PASS ] 0x0::example::test_module_init
[ PASS ] 0x0::example::test_sword_transactions
Test result: OK. Total tests: 2; passed: 2; failed: 0

$ sui move coverage summary --test
+-------------------------+
| Move Coverage Summary |
+-------------------------+
Module 0000000000000000000000000000000000000000000000000000000000000000::example
>>> % Module coverage: 92.81
+-------------------------+
| % Move Coverage: 92.81 |
+-------------------------+

Help​

Each command has its own help section. For example:

$ sui move build --help
Usage: sui move build [OPTIONS]

Options:
-p, --path <PACKAGE_PATH>
Path to a package which the command should be run with respect to
--with-unpublished-dependencies
Include the contents of packages in dependencies that haven't been published (only
relevant when dumping bytecode as base64)
--dump-bytecode-as-base64
Whether we are printing in base64
--ignore-chain
[Mainly for testing, not recommended for production] Don't specialize the package to the
active chain when dumping bytecode as Base64. This allows building to proceed without a
network connection or active environment, but it will not be able to automatically
determine the addresses of its dependencies
-d, --dev
Compile in 'dev' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used if
this flag is set. This flag is useful for development of packages that expose named
addresses that are not set to a specific value
--generate-struct-layouts
If true, generate struct layout schemas for all struct types passed into `entry` functions
declared by modules in this package These layout schemas can be consumed by clients (e.g.,
the TypeScript SDK) to enable serialization/deserialization of transaction arguments and
events
--test
Compile in 'test' mode. The 'dev-addresses' and 'dev-dependencies' fields will be used
along with any code in the 'tests' directory
--doc
Generate documentation for packages
--disassemble
Save disassembly for generated bytecode along with bytecode maps (source maps for
disassembled bytecode)
--install-dir <INSTALL_DIR>
Installation directory for compiled artifacts. Defaults to current directory
--force
Force recompilation of all packages
--fetch-deps-only
Only fetch dependency repos to MOVE_HOME
--skip-fetch-latest-git-deps
Skip fetching latest git dependencies
--default-move-flavor <DEFAULT_FLAVOR>
Default flavor for move compilation, if not specified in the package's config
--default-move-edition <DEFAULT_EDITION>
Default edition for move compilation, if not specified in the package's config
--dependencies-are-root
If set, dependency packages are treated as root packages. Notably, this will remove
warning suppression in dependency packages
--silence-warnings
If set, ignore any compiler warnings
--warnings-are-errors
If set, warnings become errors
--json-errors
If set, reports errors at JSON
--no-lint
If `true`, disable linters
--lint
If `true`, enables extra linters
--mode <MODE>
Arbitrary mode -- this will be used to enable or filter user-defined `#[mode(<MODE>)]`
annotations during compilation
-h, --help
Print help
-V, --version
Print version