Module sui::token
The Token module which implements a Closed Loop Token with a configurable policy. The policy is defined by a set of rules that must be satisfied for an action to be performed on the token.
The module is designed to be used with a TreasuryCap to allow for minting and burning of the Tokens. And can act as a replacement / extension or a companion to existing open-loop (Coin) systems.
Module: sui::balance sui::coin sui::token.<br/>
Main type: Balance<T> Coin<T> Token<T>.<br/>
Capability: Supply<T> <----> TreasuryCap<T> <----> TreasuryCap<T>.<br/>
Abilities: store key + store key
The Token system allows for fine-grained control over the actions performed on the token. And hence it is highly suitable for applications that require control over the currency which a simple open-loop system can't provide.
- Struct Token
- Struct TokenPolicyCap
- Struct TokenPolicy
- Struct ActionRequest
- Struct RuleKey
- Struct TokenPolicyCreated
- Constants
- Function new_policy
- Function share_policy
- Function transfer
- Function spend
- Function to_coin
- Function from_coin
- Function join
- Function split
- Function zero
- Function destroy_zero
- Function keep
- Function new_request
- Function confirm_request
- Function confirm_request_mut
- Function confirm_with_policy_cap
- Function confirm_with_treasury_cap
- Function add_approval
- Function add_rule_config
- Function rule_config
- Function rule_config_mut
- Function remove_rule_config
- Function has_rule_config
- Function has_rule_config_with_type
- Function allow
- Function disallow
- Function add_rule_for_action
- Function remove_rule_for_action
- Function mint
- Function burn
- Function flush
- Function is_allowed
- Function rules
- Function spent_balance
- Function value
- Function transfer_action
- Function spend_action
- Function to_coin_action
- Function from_coin_action
- Function action
- Function amount
- Function sender
- Function recipient
- Function approvals
- Function spent
- Function key
use std::address;
use std::ascii;
use std::bcs;
use std::internal;
use std::option;
use std::string;
use std::type_name;
use std::u128;
use std::vector;
use sui::accumulator;
use sui::accumulator_settlement;
use sui::address;
use sui::bag;
use sui::balance;
use sui::bcs;
use sui::coin;
use sui::config;
use sui::deny_list;
use sui::dynamic_field;
use sui::dynamic_object_field;
use sui::event;
use sui::funds_accumulator;
use sui::hash;
use sui::hex;
use sui::object;
use sui::party;
use sui::protocol_config;
use sui::table;
use sui::transfer;
use sui::tx_context;
use sui::types;
use sui::url;
use sui::vec_map;
use sui::vec_set;
Struct Token
A single Token with Balance inside. Can only be owned by an address, and actions performed on it must be confirmed in a matching TokenPolicy.
public struct Token<phantom T> has key
Fields
- id: sui::object::UID
- balance: sui::balance::Balance<T>
- The Balance of the Token.
Struct TokenPolicyCap
A Capability that manages a single TokenPolicy specified in the for field. Created together with TokenPolicy in the new function.
public struct TokenPolicyCap<phantom T> has key, store
Fields
- id: sui::object::UID
- for: sui::object::ID
Struct TokenPolicy
TokenPolicy represents a set of rules that define what actions can be performed on a Token and which Rules must be satisfied for the action to succeed.
- For the sake of availability, TokenPolicy is a key-only object.
- Each TokenPolicy is managed by a matching TokenPolicyCap.
- For an action to become available, there needs to be a record in the rules VecMap. To allow an action to be performed freely, there's an allow function that can be called by the TokenPolicyCap owner.
public struct TokenPolicy<phantom T> has key
Fields
- id: sui::object::UID
- spent_balance: sui::balance::Balance<T>
-
The balance that is effectively spent by the user on the "spend"
action. However, actual decrease of the supply can only be done by
the TreasuryCap owner when flush is called.
This balance is effectively spent and cannot be accessed by anyone but the TreasuryCap owner. - rules: sui::vec_map::VecMap<std::string::String, sui::vec_set::VecSet<std::type_name::TypeName>>
- The set of rules that define what actions can be performed on the token. For each "action" there's a set of Rules that must be satisfied for the ActionRequest to be confirmed.
Struct ActionRequest
A request to perform an "Action" on a token. Stores the information about the action to be performed and must be consumed by the confirm_request or confirm_request_mut functions when the Rules are satisfied.
public struct ActionRequest<phantom T>
Fields
- name: std::string::String
- Name of the Action to look up in the Policy. Name can be one of the default actions: transfer, spend, to_coin, from_coin or a custom action.
- amount: u64
- Amount is present in all of the txs
- sender: address
- Sender is a permanent field always
- recipient: std::option::Option<address>
- Recipient is only available in transfer action.
- spent_balance: std::option::Option<sui::balance::Balance<T>>
- The balance to be "spent" in the TokenPolicy, only available in the spend action.
- approvals: sui::vec_set::VecSet<std::type_name::TypeName>
- Collected approvals (stamps) from completed Rules. They're matched against TokenPolicy.rules to determine if the request can be confirmed.
Struct RuleKey
Dynamic field key for the TokenPolicy to store the Config for a specific action Rule. There can be only one configuration per Rule per TokenPolicy.
public struct RuleKey<phantom T> has copy, drop, store
Fields
- is_protected: bool
Struct TokenPolicyCreated
An event emitted when a TokenPolicy is created and shared. Because TokenPolicy can only be shared (and potentially frozen in the future), we emit this event in the share_policy function and mark it as mutable.
public struct TokenPolicyCreated<phantom T> has copy, drop
Fields
- id: sui::object::ID
- ID of the TokenPolicy that was created.
- is_mutable: bool
- Whether the TokenPolicy is "shared" (mutable) or "frozen" (immutable) - TBD.
Constants
The action is not allowed (defined) in the policy.
const EUnknownAction: u64 = 0;
The rule was not approved.
const ENotApproved: u64 = 1;
Trying to perform an admin action with a wrong cap.
const ENotAuthorized: u64 = 2;
The balance is too low to perform the action.
const EBalanceTooLow: u64 = 3;
The balance is not zero.
const ENotZero: u64 = 4;
The balance is not zero when trying to confirm with TransferPolicyCap.
const ECantConsumeBalance: u64 = 5;
Rule is trying to access a missing config (with type).
const ENoConfig: u64 = 6;
Using confirm_request_mut without spent_balance. Immutable version of the function must be used instead.
const EUseImmutableConfirm: u64 = 7;
A Tag for the spend action.
const SPEND: vector<u8> = vector[115, 112, 101, 110, 100];
A Tag for the transfer action.
const TRANSFER: vector<u8> = vector[116, 114, 97, 110, 115, 102, 101, 114];
A Tag for the to_coin action.
const TO_COIN: vector<u8> = vector[116, 111, 95, 99, 111, 105, 110];
A Tag for the from_coin action.
const FROM_COIN: vector<u8> = vector[102, 114, 111, 109, 95, 99, 111, 105, 110];
Function new_policy
Create a new TokenPolicy and a matching TokenPolicyCap.
The TokenPolicy must then be shared using the share_policy method.
TreasuryCap guarantees full ownership over the currency, and is unique, hence it is safe to use it for authorization.
public fun new_policy<T>(_treasury_cap: &sui::coin::TreasuryCap<T>, ctx: &mut sui::tx_context::TxContext): (sui::token::TokenPolicy<T>, sui::token::TokenPolicyCap<T>)