토큰 정책
TokenPolicy는 token 소유자가 TreasuryCap을 사용해 생성할 수 있는 shared object이다. 공개적으로 사용 가능한 TokenPolicy가 있으면 허용된 action과 해당 조건을 온체인에서 discover할 수 있다. 이는 token holder를 위한 더 나은 사용자 경험을 제공하려는 Wallets 및 기타 서비스에 유용하다.
Create and share
token::new_policy 함수를 사용해 새로운 TokenPolicy를 생성한다. 이 함수는 TreasuryCap을 인자로 받고 TokenPolicy object와 managing capability를 반환한다.
// module: sui::token
public fun new_policy<T>(
treasury_cap: &TreasuryCap<T>,
ctx: &mut TxContext
): (TokenPolicy<TokenType>, TokenPolicyCap<TokenType>);
token::share_policy 함수를 사용해 TokenPolicy object를 공유해야 한다.
Allow and disallow
어떤 조건도 없이 action을 허용하려면 token::allow 함수를 사용한다. 이 함수는 TokenPolicy와 TokenPolicyCap을 인자로 받는다. 허용된 경우 token::confirm_request 함수를 사용해 TokenPolicy에서 action을 confirm할 수 있다(참고: ActionRequest).
// module sui::token
public fun allow<T>(
policy: &mut TokenPolicy<T>,
policy_cap: &TokenPolicyCap<T>,
action: String,
ctx: &mut TxContext
);
마찬가지로 token::disallow 함수를 사용해 action을 완전히 비활성화할 수 있으며, 이는 token::allow와 동일한 인자를 받는다.
Adding rules
TokenPolicy는 각 action에 대해 custom 조건을 지정할 수 있다. 이러한 조건을 rules라고 하며, 일반적으로 별도의 Move module로 구현된다. rule의 식별자는 해당 type이다. 자세한 내용은 규칙를 참고한다.
TokenPolicy의 의사 코드 구조는 다음과 같다. 각 action에는 여러 rules를 연결할 수 있다.
TokenPolicy
rules:
- action: "transfer"
rules:
- 0x0...::denylist::Denylist
- action: "to_coin"
rules:
- 0x0...::limiter::Limiter
- 0x0...::allowlist::Allowlist
...
action에 rule을 추가하려면 token::add_rule_for_action 함수를 사용한다. 이 함수는 TokenPolicy와 TokenPolicyCap을 인자로 받는다. rule은 해당 type으로 지정된다(예: 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::remove_rule_for_action의 signature는 token::add_rule_for_action과 대칭이다.
Consume spent balance
token::flush 함수를 사용해 TokenPolicy에서 spent balance를 consume할 수 있다. 이 함수에는 TreasuryCap이 필요하다.
// module sui::token
public fun flush<T>(
policy: &mut TokenPolicy<T>,
treasury_cap: &mut TreasuryCap<T>,
ctx: &mut TxContext
);
Cheat sheet: TokenPolicy API
| Function | Note |
|---|---|
| new_policy | TreasuryCap을 사용해 새로운 TokenPolicy를 생성한다 |
| allow | TokenPolicy에서 action을 허용한다 |
| disallow | TokenPolicy에서 action을 비활성화한다 |
| add_rule_for_action | TokenPolicy에서 action에 rule을 추가한다 |
| remove_rule_for_action | TokenPolicy에서 action의 rule을 제거한다 |
| confirm_request | TokenPolicy로 ActionRequest를 confirm한다 |
| confirm_request_mut | confirm_request와 유사하지만 spend action에서만 동작한다 |
| flush | TokenPolicy에서 spent balance를 flush한다(참고: 지출) |