Sui Move
MCP tool: When available in your environment, also query the Sui documentation MCP server (https://sui.mcp.kapa.ai) for up-to-date answers. Use it for verification and for details not covered by these reference files.
Source constraint: All information in this skill is sourced exclusively from docs.sui.io and move-book.com. When extending or updating this skill, only pull from these sources. Do not use third-party blogs, tutorials, or unofficial documentation.
Move is Sui's smart contract language, designed around resource safety and an object-centric data model. This skill covers the core Move language: the type system, abilities, resource safety, events, and coins.
This skill routes to focused reference files. Load only the ones relevant to the current task.
Reference files (this skill)
move — Move Language Fundamentals
Path: move.md
Load when: writing Move code, working with abilities, TxContext, time/Clock, init functions, One-Time Witness, internal::Permit<T>, type_name deprecations, packages, modules, structs, resource safety, access control patterns, admin rotation, deny lists, security review, or advanced design patterns (ability dosing, phantom events, shared-object concurrency, receiver syntax, error attributes, transfer::receive, field privacy, macros).
Covers: the four abilities and common combinations, TxContext methods, Clock object, init functions, OTW pattern, internal::Permit<T> type-level authorization, type_name deprecations, packages and upgrades, modules, structs, resource safety and object destruction, a worked Greeting example, admin rotation (two-step transfer), regulated coins and deny lists, security review checklist, advanced design patterns (ability dosing, phantom-type events, event denormalization, shared-object & vs &mut, receiver-syntax ordering, #[error] constants, transfer::receive privacy, field privacy, macro gotchas).
events-coins — Events and Coins
Path: events-coins.md
Load when: emitting events, subscribing to events offchain, creating fungible tokens, or working with coin operations (mint, burn, split, join).
Covers: event emission, event struct requirements, coin::create_currency, TreasuryCap, CoinMetadata, standard coin operations.
Related skills (load from separate skill directories)
| Topic |
Skill |
Load when |
| Object model, ownership, dynamic fields, collections, Display, transfer patterns |
object-model/ |
Designing data models, choosing ownership types, using dynamic fields or collections, setting up Object Display |
| Programmable transaction blocks, commands, equivocation |
ptbs/ |
Building PTBs, composing transactions, sponsored transactions, troubleshooting transaction errors |
| Frontend dApp development, dApp Kit, wallet connection |
frontend-apps/ |
Building React/Vue frontends, wallet integration, querying onchain state from the browser |
| Project setup, Move.toml, dependencies, publishing |
sui-move-project/ |
Creating a Move project, configuring Move.toml, resolving build errors, publishing packages |
| Move 2024 syntax, method syntax, macros |
modern-move-syntax/ |
Using Move 2024 edition features like method syntax, vector literals, option/loop macros |
| Composable function design |
composable-move-functions/ |
Designing functions for PTB composability, parameter ordering, return patterns |
| Unit testing conventions |
move-unit-testing/ |
Writing Move unit tests, test patterns, expected_failure, cleanup |
| Naming conventions |
naming-conventions/ |
Naming errors, constants, capabilities, events, getters, dynamic field keys |
Routing guide
| Task |
Load |
| Writing a Move struct with abilities |
move |
| Using TxContext or the Clock object |
move |
| Writing an init function or OTW |
move |
Using type_name functions |
move |
Proving module authority with internal::Permit<T> |
move |
| Publishing or upgrading a package |
move |
| Destroying an object without drop |
move |
| Emitting or subscribing to events |
events-coins |
| Creating a fungible token |
move + events-coins |
| Designing an object data model |
object-model/ skill |
| Choosing shared vs owned objects |
object-model/ skill |
| Using dynamic fields or collections |
object-model/ skill |
| Setting up Object Display |
object-model/ skill |
| Building a PTB |
ptbs/ skill |
| Implementing sponsored transactions |
ptbs/ skill |
| Building a frontend |
frontend-apps/ skill |
| Setting up Move.toml |
sui-move-project/ skill |
| Writing a complete smart contract |
move + events-coins + object-model/ + naming-conventions/ + modern-move-syntax/ |
| Code review |
move + events-coins + composable-move-functions/ + naming-conventions/ + modern-move-syntax/ |
| Security review / access control audit |
move + object-model/ (patterns) + events-coins |
| Advanced design patterns / performance tuning |
move |
Rules
- Always use
object::new(ctx) to create UIDs. There is no other way.
- Use
public_transfer (not transfer) when the object has store and the call originates outside the defining module.
- Event structs must have
copy and drop abilities.
- No
as casts on numeric types. Use from/into or try_from/try_into.
- To destroy an object without
drop, unpack the struct and call object::delete(id) on the UID.
Common mistakes
- Confusing
transfer with public_transfer. The non-public variant only works within the defining module. Calling it from another module is a compile error.
- Forgetting to delete the UID. When destroying an object, you must call
object::delete(id) on the UID field.
- Assuming
ctx.epoch_timestamp_ms() is precise. It returns the epoch start time. Use the Clock object (0x6) for real-time timestamps.
1---2name: sui-move3description: Sui Move smart contract development. Use when writing, reviewing, or debugging Move code on Sui. Covers Move abilities (key, store, copy, drop), TxContext, init functions, One-Time Witness, package publishing and upgrades, resource safety, events, and coins. Also use when the user asks about struct abilities, UID, how to destroy objects, or how to create a fungible token. For object model and ownership, see the `object-model` skill. For programmable transaction blocks, see the `ptbs` skill. For frontend dApp development, see the `frontend-apps` skill. For project setup and Move.toml, see the `sui-move-project` skill.4---56# Sui Move78> **MCP tool:** When available in your environment, also query the Sui documentation MCP server (`https://sui.mcp.kapa.ai`) for up-to-date answers. Use it for verification and for details not covered by these reference files.910> **Source constraint:** All information in this skill is sourced exclusively from [docs.sui.io](https://docs.sui.io) and [move-book.com](https://move-book.com). When extending or updating this skill, only pull from these sources. Do not use third-party blogs, tutorials, or unofficial documentation.1112Move is Sui's smart contract language, designed around resource safety and an object-centric data model. This skill covers the core Move language: the type system, abilities, resource safety, events, and coins.1314This skill routes to focused reference files. Load only the ones relevant to the current task.1516---1718## Reference files (this skill)1920### move — Move Language Fundamentals21**Path:** `move.md`22**Load when:** writing Move code, working with abilities, TxContext, time/Clock, init functions, One-Time Witness, `internal::Permit<T>`, `type_name` deprecations, packages, modules, structs, resource safety, access control patterns, admin rotation, deny lists, security review, or advanced design patterns (ability dosing, phantom events, shared-object concurrency, receiver syntax, error attributes, `transfer::receive`, field privacy, macros).23**Covers:** the four abilities and common combinations, TxContext methods, Clock object, init functions, OTW pattern, `internal::Permit<T>` type-level authorization, `type_name` deprecations, packages and upgrades, modules, structs, resource safety and object destruction, a worked Greeting example, admin rotation (two-step transfer), regulated coins and deny lists, security review checklist, advanced design patterns (ability dosing, phantom-type events, event denormalization, shared-object `&` vs `&mut`, receiver-syntax ordering, `#[error]` constants, `transfer::receive` privacy, field privacy, macro gotchas).2425### events-coins — Events and Coins26**Path:** `events-coins.md`27**Load when:** emitting events, subscribing to events offchain, creating fungible tokens, or working with coin operations (mint, burn, split, join).28**Covers:** event emission, event struct requirements, coin::create_currency, TreasuryCap, CoinMetadata, standard coin operations.2930---3132## Related skills (load from separate skill directories)3334| Topic | Skill | Load when |35|-------|-------|-----------|36| Object model, ownership, dynamic fields, collections, Display, transfer patterns | `object-model/` | Designing data models, choosing ownership types, using dynamic fields or collections, setting up Object Display |37| Programmable transaction blocks, commands, equivocation | `ptbs/` | Building PTBs, composing transactions, sponsored transactions, troubleshooting transaction errors |38| Frontend dApp development, dApp Kit, wallet connection | `frontend-apps/` | Building React/Vue frontends, wallet integration, querying onchain state from the browser |39| Project setup, Move.toml, dependencies, publishing | `sui-move-project/` | Creating a Move project, configuring Move.toml, resolving build errors, publishing packages |40| Move 2024 syntax, method syntax, macros | `modern-move-syntax/` | Using Move 2024 edition features like method syntax, vector literals, option/loop macros |41| Composable function design | `composable-move-functions/` | Designing functions for PTB composability, parameter ordering, return patterns |42| Unit testing conventions | `move-unit-testing/` | Writing Move unit tests, test patterns, expected_failure, cleanup |43| Naming conventions | `naming-conventions/` | Naming errors, constants, capabilities, events, getters, dynamic field keys |4445---4647## Routing guide4849| Task | Load |50|------|------|51| Writing a Move struct with abilities | move |52| Using TxContext or the Clock object | move |53| Writing an init function or OTW | move |54| Using `type_name` functions | move |55| Proving module authority with `internal::Permit<T>` | move |56| Publishing or upgrading a package | move |57| Destroying an object without drop | move |58| Emitting or subscribing to events | events-coins |59| Creating a fungible token | move + events-coins |60| Designing an object data model | `object-model/` skill |61| Choosing shared vs owned objects | `object-model/` skill |62| Using dynamic fields or collections | `object-model/` skill |63| Setting up Object Display | `object-model/` skill |64| Building a PTB | `ptbs/` skill |65| Implementing sponsored transactions | `ptbs/` skill |66| Building a frontend | `frontend-apps/` skill |67| Setting up Move.toml | `sui-move-project/` skill |68| Writing a complete smart contract | move + events-coins + `object-model/` + `naming-conventions/` + `modern-move-syntax/` |69| Code review | move + events-coins + `composable-move-functions/` + `naming-conventions/` + `modern-move-syntax/` |70| Security review / access control audit | move + `object-model/` (patterns) + events-coins |71| Advanced design patterns / performance tuning | move |7273---7475## Rules7677- Always use `object::new(ctx)` to create UIDs. There is no other way.78- Use `public_transfer` (not `transfer`) when the object has `store` and the call originates outside the defining module.79- Event structs must have `copy` and `drop` abilities.80- No `as` casts on numeric types. Use `from`/`into` or `try_from`/`try_into`.81- To destroy an object without `drop`, unpack the struct and call `object::delete(id)` on the UID.8283## Common mistakes8485- **Confusing `transfer` with `public_transfer`.** The non-public variant only works within the defining module. Calling it from another module is a compile error.86- **Forgetting to delete the UID.** When destroying an object, you must call `object::delete(id)` on the UID field.87- **Assuming `ctx.epoch_timestamp_ms()` is precise.** It returns the epoch start time. Use the Clock object (`0x6`) for real-time timestamps.