Skip to main content


A capability is a pattern that allows authorizing actions with an object. For example, the UpgradeCap authorizes the action of upgrading packages. One of the most common capabilities you might encounter is TreasuryCap, which is defined in sui::coin.

module examples::item {
use sui::transfer;
use sui::object::{Self, UID};
use std::string::{Self, String};
use sui::tx_context::{Self, TxContext};

/// Type that marks Capability to create new `Item`s.
struct AdminCap has key { id: UID }

/// Custom NFT-like type.
struct Item has key, store { id: UID, name: String }

/// Module initializer is called once on module publish.
/// Here we create only one instance of `AdminCap` and send it to the publisher.
fun init(ctx: &mut TxContext) {
transfer::transfer(AdminCap {
id: object::new(ctx)
}, tx_context::sender(ctx))

/// The entry function can not be called if `AdminCap` is not passed as