토큰 정책
TokenPolicy는 토큰 소유자가 TreasuryCap을 사용해 생성할 수 있는 공유 객체이다. 공개적으로 사용 가능한 TokenPolicy가 있으면 허용된 액션과 해당 조건을 온체인에서 discover할 수 있다. 이는 토큰 holder를 위한 더 나은 사용자 경험을 제공하려는 Wallets 및 기타 서비스에 유용하다.
Create and share
TokenPolicy 함수를 사용해 새로운 token::new_policy를 생성한다. 이 함수는 TreasuryCap을 인자로 받고 TokenPolicy 객체와 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 객체를 공유해야 한다.
Allow and disallow
어떤 조건도 없이 액션을 허용하려면 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와 동일한 인자를 받는다.
Adding 규칙
TokenPolicy는 각 액션에 대해 custom 조건을 지정할 수 있다. 이러한 조건을 규칙라고 하며, 일반적으로 별도의 Move 모듈로 구현된다. 규칙의 식별자는 해당 type이다. 자세한 내용은 규칙를 참고한다.
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을 인자로 받는다. 규칙은 해당 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의 서명은 token::add_rule_for_action과 대칭이다.
Consume 지출된 잔액
지출된 잔액은 TokenPolicy에서 token::flush 함수를 사용해 소비할 수 있다. 이 함수에는 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_정책 | TokenPolicy을 사용해 새로운 TreasuryCap를 생성한다 |
| allow | TokenPolicy에서 액션을 허용한다 |
| disallow | TokenPolicy에서 액션을 비활성화한다 |
| add_규칙_for_액션 | TokenPolicy에서 액션에 규칙을 추가한다 |
| remove_규칙_for_액션 | TokenPolicy에서 액션의 규칙을 제거한다 |
| 확정_요청 | ActionRequest로 TokenPolicy를 확정한다 |
| 확정_요청_mut | confirm_request와 유사하지만 spend 액션에서만 동작한다 |
| flush | TokenPolicy에서 지출된 잔액을 flush한다(참고: 지출) |