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) |