Skip to main content

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 模块实现。规则的标识符是它的类型。

info

有关更多信息,请访问 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 函数。该函数接受 TokenPolicyTokenPolicyCap 作为参数。规则由其类型指定(例如 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

FunctionNote
new_policyCreate a new TokenPolicy using the TreasuryCap
allowAllow an action in the TokenPolicy
disallowDisallow an action in the TokenPolicy
add_rule_for_actionAdd a Rule for an action in the TokenPolicy
remove_rule_for_actionRemove a Rule for an action in the TokenPolicy
confirm_requestConfirm an ActionRequest with a TokenPolicy
confirm_request_mutSimilar to confirm_request but only works for "spend" action
flushFlush the spent balance from the TokenPolicy (see Spending)