Skip to main content
Sui’s ownership model is a key innovation that enables parallel transaction execution. By tracking ownership at the object level, Sui can process transactions without conflicts when they operate on different objects.

Ownership Types

Every object in Sui has one of four ownership types:

Owned

Owned by a single address

Shared

Shared among all users

Frozen

Immutable and permanently read-only

Wrapped

Contained within another object

Owned Objects

Objects owned by a single address can be used in transactions without consensus, enabling fast-path execution.

Creating Owned Objects

Transferring Ownership

Sui provides two transfer functions based on visibility requirements:
Use transfer::transfer for objects defined in your module:
The distinction between transfer and public_transfer allows module authors to control how their objects can be transferred, enabling custom transfer logic and restrictions.

Fast-Path Execution

Owned objects enable Sui’s fastest transaction mode:
  1. No consensus required - Validators process independently
  2. Sub-second finality - Transactions complete in ~400ms
  3. Parallel execution - Multiple transactions can process simultaneously

Shared Objects

Shared objects are accessible by anyone but require consensus for modifications.

Creating Shared Objects

Sharing an object is irreversible. Once shared, an object cannot be converted back to owned or frozen.

Shared Object Restrictions

From the source code:
Shared objects cannot be:
  • Wrapped inside other objects
  • Frozen
  • Converted to owned objects

Transaction Arguments

Shared objects require special handling in transactions:

Frozen Objects

Frozen objects are permanently immutable and can be read by anyone.

Freezing Objects

Use Cases for Frozen Objects

Perfect for NFT metadata or token information that should never change:
Store protocol parameters or constants that should be globally readable but never modified.
Create immutable historical records or certificates.

Wrapped Objects

Wrapped objects exist inside other objects and are invisible to the outside world.

Wrapping and Unwrapping

Characteristics of Wrapped Objects

Not Directly Accessible

Cannot be used as transaction inputs

Version Unchanged

Version number doesn’t increment while wrapped

Storage Efficient

Counted as part of parent object’s storage

Secure Encapsulation

Only accessible through parent object’s API
While wrapped, objects cannot be accessed directly. You must unwrap them first or access them through their parent object.

Party Transfer (Advanced)

Sui supports party-based transfers for fine-grained access control:

Receiving Objects

Sui supports receiving objects sent to other objects:

Ownership and Abilities

The store ability determines transferability:
Objects with store can be:
  • Transferred with public_transfer
  • Stored in other objects
  • Freely moved around

Best Practices

  • Owned: For user-specific assets (NFTs, personal tokens)
  • Shared: For multi-user protocols (DEX pools, governance)
  • Frozen: For immutable configuration or metadata
  • Wrapped: For composition and encapsulation
Shared objects require consensus and are slower. Use owned objects when possible:
  • Split shared state into multiple owned objects
  • Use capability patterns for access control
  • Consider flash loans instead of direct shared access
These operations cannot be undone:
  • Sharing an object
  • Freezing an object
  • Deleting an object

Objects

Understand Sui’s object model

Dynamic Fields

Extend objects dynamically

Transactions

Learn about transaction structure