Asset tokenization is the process of converting rights to real-world assets—such as real estate, art, commodities, stocks, or other valuable items—into digital tokens on a blockchain network. This involves transforming ownership or entitlements into digital tokens that are then recorded and managed on a distributed ledger.
Core Concepts of Asset Tokenization
The fundamental idea is to divide a high-value asset into smaller, more affordable units, each representing a share of ownership or a fraction of the asset itself.
This approach democratizes access, allowing a broader range of investors to participate with lower capital requirements and reduced risk, rather than needing to be the sole owner of an entire asset.
The model is conceptually similar to the ERC1155 multi-token standard but includes enhanced capabilities, making it a robust choice for implementing Solidity-based use cases on the Sui blockchain.
How Assets Are Created
An asset is divided into a total supply, with each fraction represented as a collectible that can be either a Non-Fungible Token (NFT) or a Fungible Token (FT). This ensures each individual fraction maintains a balance of at least one, and when combined, all fractions collectively represent the asset's total supply.
Beyond the total supply, each asset is defined by various metadata fields like name and description. These fields form the asset's metadata and remain consistent across all its fractional tokens.
The Difference Between NFTs and FTs
When a tokenized asset is minted, it can be created with new metadata. If new metadata is incorporated, the tokenized asset is considered unique, transforming it into an NFT. In this case, its balance is restricted to one, signifying a single, unique instance of that asset exists.
If no additional metadata is added, the tokenized asset is classified as an FT. This allows its balance to be greater than one, permitting multiple identical instances of the asset to exist.
FTs possess the ability to be merged (joined) together or split apart when their balance is greater than one. This functionality provides flexibility to aggregate or divide token units as needed.
As mentioned, all collectibles of a tokenized asset, whether NFTs or FTs, can combine to reach the asset’s maximum total supply.
Understanding Burn Capability
During asset creation, you can define whether the asset's fractions are eligible to be removed from circulation or destroyed. This removal process is known as burning.
If a tokenized asset is burnable, destroying a fraction reduces the circulating supply by that fraction's balance. However, the total supply remains unchanged. This allows the burned fraction to be minted again later if necessary, maintaining the asset's predefined total supply.
The Move Programming Language and Tokenization
Like all smart contracts on Sui, the logic supporting asset tokenization is written in Move.
The asset_tokenization Package
This reference implementation utilizes Sui's Kiosk primitive to ensure created Tokenized Assets (TAs) operate within a set of rules defined by their creator. Using this implementation is recommended to have sellable TAs that support rules like royalties and commissions.
If operating within a Kiosk is not a requirement, the unlock module and certain proxy methods related to Transfer Policies can be excluded.
The tokenized_asset module operates similarly to Sui's coin library. Upon receiving a new One-Time Witness (OTW) type, it creates a unique representation of a fractional asset. It incorporates functions for asset creation, minting, splitting, joining, and burning.
Key Structures
AssetCap: Generated for each new asset intended to be a fractional NFT. It should typically be created as an owned object and can then be transferred to a platform admin for restricted method calls.struct AssetCap { id: UID, // the current supply in circulation supply: Supply, // the total max supply allowed to exist at any time total_supply: u64, // Determines if the asset can be burned or not burnable: bool }AssetMetadata: This structure defines the metadata for the entire asset intended to be fractionalized. It is recommended to be designed as a shared object.struct AssetMetadata has key, store { id: UID, /// Name of the asset name: String, // the total max supply allowed to exist at any time total_supply: u64, /// Symbol for the asset symbol: ascii::String, /// Description of the asset description: String, /// URL for the asset logo icon_url: Option<String> }TokenizedAsset: Minted with a specified balance less than or equal to the remaining supply. If itsVecMapis populated with values, indicating multiple unique entries, it's treated as an NFT. If theVecMapis empty, it's treated as an FT.struct TokenizedAsset has key, store { id: UID, /// The balance of the tokenized asset balance: Balance, /// If the VecMap is populated, it is considered an NFT, else the asset is considered an FT. metadata: VecMap<String, String>, /// URL for the asset image (optional) image_url: Option<String>, }PlatformCap: A capability issued to the individual deploying the contract, granting specific permissions to perform controlled operations within the deployed contract.
Core Functions
The module includes essential functions like init (creates a PlatformCap), new_asset (defines a new asset's properties), mint (creates the tokens), split (divides an FT), join (merges FTs), burn (removes tokens from circulation), and helper functions to retrieve supply and balance values.
The Template Package
This is a sample use-case package that supports the seamless creation of assets directly in a browser by leveraging Rust WebAssembly (WASM) capabilities. It functions similarly to a launchpad and serves as a template whenever a new asset needs representation as a tokenized asset.
The package contains two key modules:
template: The module where a new asset is defined. It is modified by changing identifiers and constants before deployment.genesis: A genesis-type module that includes an OTW, allowing the sender to claim a Publisher object.
Deployment and Practical Implementation
Before publishing code, you must initialize the Sui client CLI. The process involves connecting to a Sui node (like Devnet) and generating a keypair to create a Sui address.
Publishing the Packages
You can choose to deploy the contracts manually using the Sui CLI or use an automated bash script that handles the publishing and populates necessary environment variables.
- Manual Publishing: Navigate to the package directory and run
sui client publish --gas-budget 20000000. Upon success, note the package and registry IDs for your.envfile. - Automated Script: Running
npm run publish-asset-tokenizationautomates the process and fills in fields likeSUI_NETWORK,ASSET_TOKENIZATION_PACKAGE_ID, andREGISTRY.
Interacting with Tokenized Assets via TypeScript SDK
After deployment, you can interact with your smart contracts and tokenized assets using the provided TypeScript functions.
- Creating a Transfer Policy: Establish rules for how assets can be traded.
- Selecting a Kiosk: A personal kiosk is used to securely place and lock tokenized assets, preventing unauthorized use outside defined policies.
- Minting: Create new tokenized assets as NFTs (with metadata) or FTs (without metadata).
- Locking: Secure the asset inside your kiosk.
- Listing and Purchasing: List assets for sale according to your transfer policy rules, allowing others to purchase them. 👉 Explore more strategies for managing digital assets
- Joining and Burning: Merge two FT-type tokens or remove a token from circulation.
Commands like npm run call mint, npm run call lock, and npm run call purchase execute these functions, requiring the relevant object IDs to be set in your .env file.
Frequently Asked Questions
What is the primary benefit of asset tokenization?
Asset tokenization unlocks liquidity for traditionally illiquid assets like real estate or fine art. By dividing them into smaller, digitally tradable units, it allows fractional ownership, lowers investment barriers, and enables a global pool of investors to participate in new markets.
What's the key difference between an NFT and an FT in this context?
An NFT represents a unique tokenized asset with a balance of one, created by adding custom metadata during minting. An FT represents a fungible, divisible token with a balance that can be greater than one, created without additional metadata, making multiple instances identical and interchangeable.
Is it possible to convert a tokenized asset after it's been minted?
No, the type of token (NFT or FT) is determined at the moment of minting based on the presence of custom metadata. This classification is immutable; an FT cannot later become an NFT, or vice versa, ensuring the integrity of the asset's representation and its properties.
Who has the permission to burn (destroy) tokens?
Typically, the burning function is restricted and requires an AssetCap object, which is usually held by a platform administrator. However, the smart contract can be redesigned to allow users to burn tokens under specific, authorized conditions, such as using a special BurnTicket issued by an admin.
How does the Kiosk primitive enhance security?
Using a Sui Kiosk to hold tokenized assets is a best practice. Locking an asset in a Kiosk prevents it from being transferred, listed, or used in any way that violates the rules of its attached Transfer Policy, thereby enforcing creator-defined rules like royalties and ensuring compliant transactions.
Can I change the metadata or properties of an asset after deployment?
The core metadata for the asset type (name, total supply, symbol) is defined upon creation and is immutable. However, the unique VecMap metadata for individual NFT-type tokens is set at minting and is also permanent. Changes would require a new asset creation. 👉 View real-time tools for blockchain development