Token Policy
TokenPolicy
是一个共享对象,可以由 Token 持有者使用 TreasuryCap
创建。拥有一个公开可用的 TokenPolicy
将使得可以在链上发现允许的操作及其条件。对于想要为代币持有者提供更好用户体验的钱包和其他服务而言,这是非常有用的。
创建与共享
可以使用 token::new_policy
函数创建一个新的 TokenPolicy。该函数以 TreasuryCap
作为参数,并返回一个 TokenPolicy
对象和一个管理能力。
// module: sui::token
public fun new_policy<T>(
treasury_cap: &TreasuryCap<T>,
ctx: &mut TxContext
): (TokenPolicy<TokenType>, TokenPolicyCap<TokenType>);
必须使用
token::share_policy
函数共享TokenPolicy
对象
允许与禁止
要允许不带任何条件的方法,请使用 token::allow
函数。该函数接受一个 TokenPolicy
和一个 TokenPolicyCap
作为参数。如果允许,则可以在 TokenPolicy
中使用 token::confirm_request
函数确认该操作(请参阅 ActionRequest)。
// module sui::token
public fun allow<T>(
policy: &mut TokenPolicy<T>,
policy_cap: &TokenPolicyCap<T>,
action: String,
ctx: &mut TxContext
);
类似地,
token::disallow
函数可用于完全禁用操作;它与token::allow
接受相同的参数。
添加规则
TokenPolicy
可以为每个操作指定自定义条件。这些条件被称为 "Rules",通常以单独的 Move 模块实现。规则的标识符是它的类型。
有关更多信息,请访问 Rules 部分。
TokenPolicy
的结构如下(伪代码)。每个操作可以与多个规则关联。
TokenPolicy
rules:
- action: "transfer"
rules:
- 0x0...::denylist::Denylist
- action: "to_coin"
rules:
- 0x0...::limiter::Limiter
- 0x0...::allowlist::Allowlist
...
要为操作添加规则,请使用 token::add_rule_for_action
函数。该函数接受 TokenPolicy
和 TokenPolicyCap
作为参数。规则由其类型指定(例如 0x0...::denylist::Denylist
)。
// module: sui::token
public fun add_rule_for_action<T, Rule: drop>(
policy: &mut TokenPolicy<T>,
policy_cap: &TokenPolicyCap<T>,
action: String,
ctx: &mut TxContext
);
与
token::add_rule_for_action
对称的反向操作token::remove_rule_for_action
的签名相同。
消耗已花费的余额
可以使用 token::flush
函数从 TokenPolicy
中消耗已花费的余额。它需要一个 TreasuryCap
。
// module sui::token
public fun flush<T>(
policy: &mut TokenPolicy<T>,
treasury_cap: &mut TreasuryCap<T>,
ctx: &mut TxContext
);
速查表: TokenPolicy API
Function | Note |
---|---|
new_policy | Create a new TokenPolicy using the TreasuryCap |
allow | Allow an action in the TokenPolicy |
disallow | Disallow an action in the TokenPolicy |
add_rule_for_action | Add a Rule for an action in the TokenPolicy |
remove_rule_for_action | Remove a Rule for an action in the TokenPolicy |
confirm_request | Confirm an ActionRequest with a TokenPolicy |
confirm_request_mut | Similar to confirm_request but only works for "spend" action |
flush | Flush the spent balance from the TokenPolicy (see Spending) |