move-objects
Sui object model — struct declarations, abilities (key/store/copy/drop), object ownership, naming conventions, and dynamic fields.
Best use case
move-objects is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Sui object model — struct declarations, abilities (key/store/copy/drop), object ownership, naming conventions, and dynamic fields.
Teams using move-objects should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/objects/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How move-objects Compares
| Feature / Agent | move-objects | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Sui object model — struct declarations, abilities (key/store/copy/drop), object ownership, naming conventions, and dynamic fields.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
## 1. Structs
All structs must be declared `public`. Ability declarations go **after** the fields:
```move
// ✅
public struct Pool has key {
id: UID,
balance_x: Balance<SUI>,
balance_y: Balance<USDC>,
}
public struct PoolCap has key, store {
id: UID,
pool_id: ID,
}
// ❌ Legacy — no public keyword
struct Pool has key {
id: UID,
}
```
**Object rule**: Any struct with the `key` ability **must** have `id: UID` as its first field. Use `object::new(ctx)` to create UIDs — never reuse or fabricate them.
### Naming conventions
**Capabilities** must be suffixed with `Cap`:
```move
// ✅
public struct AdminCap has key, store { id: UID }
// ❌ Unclear it's a capability
public struct Admin has key, store { id: UID }
```
**No `Potato` suffix** — a struct's lack of abilities already communicates it's a hot potato:
```move
// ✅
public struct Promise {}
// ❌
public struct PromisePotato {}
```
**Events named in past tense** — they describe something that already happened:
```move
// ✅
public struct LiquidityAdded has copy, drop { ... }
public struct FeesCollected has copy, drop { ... }
// ❌
public struct AddLiquidity has copy, drop { ... }
public struct CollectFees has copy, drop { ... }
```
**Dynamic field keys** — use positional structs (no named fields):
```move
// ✅
public struct BalanceKey() has copy, drop, store;
// ⚠️ Acceptable but not canonical
public struct BalanceKey has copy, drop, store {}
```
### Constants naming
Error constants use `EPascalCase`. All other constants use `ALL_CAPS`:
```move
// ✅
const ENotAuthorized: u64 = 0;
const MAX_FEE_BPS: u64 = 10_000;
// ❌
const NOT_AUTHORIZED: u64 = 0; // error should be EPascalCase
const MaxFeeBps: u64 = 10_000; // non-error should be ALL_CAPS
```
---
## 2. Object Abilities Cheat Sheet
| Ability | Meaning in Sui |
| ------- | -------------------------------------------------------------------------------------------------------------- |
| `key` | Struct is an on-chain object; requires `id: UID` as first field |
| `store` | Can be embedded inside other objects; enables `public_transfer`, `public_share_object`, `public_freeze_object` |
| `copy` | Value can be duplicated (not valid on objects with `key`) |
| `drop` | Value can be silently discarded |
**Object ownership model:**
```move
// Transfer to an address (owned object)
transfer::transfer(obj, recipient); // key only — module-restricted
transfer::public_transfer(obj, recipient); // key + store — usable anywhere
// Share (accessible by anyone, goes through consensus)
transfer::share_object(obj); // key only — module-restricted
transfer::public_share_object(obj); // key + store
// Freeze (immutable forever)
transfer::freeze_object(obj); // key only — module-restricted
transfer::public_freeze_object(obj); // key + store
```
Only call `transfer`, `share_object`, and `freeze_object` (the non-`public_` variants) inside the module that **defines** that object's type.
**Never** construct an object struct literal outside of its defining module.
---
## 3. Dynamic Fields
Use dynamic fields for extensible storage or when the key set is not known at compile time:
```move
use sui::dynamic_field as df;
use sui::dynamic_object_field as dof;
// Add a dynamic field (value stored inline with parent)
df::add(&mut parent.id, key, value);
// Add a dynamic object field (value is an independent object)
dof::add(&mut parent.id, key, child_obj);
// Access
let val: &MyType = df::borrow(&parent.id, key);
let val: &mut MyType = df::borrow_mut(&mut parent.id, key);
// Remove
let val: MyType = df::remove(&mut parent.id, key);
```Related Skills
move-syntax
Move language syntax — module layout, imports, mutability, visibility, method syntax, enums, macros, and comments.
move-stdlib
Common Sui Move standard library patterns — strings, Coin/Balance, Option, addresses, UID, TxContext, vectors, and struct unpacking.
move-setup
Move package setup (Move.toml, edition, dependencies), building, testing, and common pitfalls from other Move dialects.
move-patterns
Move design patterns — events, error handling, one-time witness (OTW), capability pattern, and pure functions/composability.
move
Move smart contract development on Sui. Use when writing, reviewing, or debugging Move code, Move.toml configuration, or Sui object model patterns.
sui-ts-sdk
Sui TypeScript SDK — PTB construction, client setup, transaction execution, and on-chain queries. Use when writing code that interacts with the Sui blockchain via @mysten/sui. These patterns apply in both backend scripts and frontend apps. For frontend-specific setup (dApp Kit, wallet adapters, React hooks), use the sui-frontend skill first or alongside this one.
sui-frontend
Sui frontend dApp development with @mysten/dapp-kit-react (React) and @mysten/dapp-kit-core (Vue, vanilla JS, other frameworks). Use when building browser apps that connect to Sui wallets, query on-chain data, or execute transactions. Use alongside the sui-ts-sdk skill for PTB construction patterns.
sui-dev
Full-stack Sui blockchain development — Move smart contracts, TypeScript SDK, and frontend dApp Kit. Routes to the appropriate sub-skill based on what the user is building.
performing-lateral-movement-with-wmiexec
Perform lateral movement across Windows networks using WMI-based remote execution techniques including Impacket wmiexec.py, CrackMapExec, and native WMI commands for stealthy post-exploitation during red team engagements.
performing-lateral-movement-detection
Detects lateral movement techniques including Pass-the-Hash, PsExec, WMI execution, RDP pivoting, and SMB-based spreading using SIEM correlation of Windows event logs, network flow data, and endpoint telemetry mapped to MITRE ATT&CK Lateral Movement (TA0008) techniques.
move-smith-fuzzer
Move Smith Fuzzer Skill
hunting-for-lateral-movement-via-wmi
Detect WMI-based lateral movement by analyzing Windows Event ID 4688 process creation and Sysmon Event ID 1 for WmiPrvSE.exe child process patterns, remote process execution, and WMI event subscription persistence.