Aptos Coin
Coin 为简单、可替代的标准、类型安全的框架 代币或 Coin 。
Coin 存储在 0x1::coin
中。
结构
可重用性
Coin 在 Move 中定义为:
struct Coin<phantom CoinType> has store {
/// Amount of coin this address has.
value: u64,
}
Coin 使用 CoinType
来支持不同 Coin 的 Coin 框架的可重用性。 例如,Coin<A>
和 Coin<B>
是两个不同的 Coin 。
全局存储
Coin 还支持在全局存储中存储 Coin 的资源:
struct CoinStore<phantom CoinType> has key {
coin: Coin<CoinType>,
frozen: bool,
deposit_events: EventHandle<DepositEvent>,
withdraw_events: EventHandle<WithdrawEvent>,
}
Coin 信息或元数据存储在 Coin 创建者帐户下的全局存储中:
struct CoinInfo<phantom CoinType> has key {
name: string::String,
/// Coin 的符号,通常是名称的较短版本。
/// 例如,新加坡元是 SGD。
symbol: string::String,
/// 用于获取其用户表示的小数位数。
/// 例如,如果 `decimals` 等于 `2`,那么 `505` 个 Coin 的余额应该
/// 向用户显示为 `5.05` (`505 / 10 ** 2`)。
decimals: u8,
/// 供应量。
supply: Option<OptionalAggregator>,
}
术语
Coin 为创建和管理 Coin 的用户以及使用它的用户提供了术语。
创作者
Coin 创造者和管理者可以:
- 初始化 Coin 并设置其元数据和供应监控。
- 铸造和燃烧 Coin 价值。
- 从
CoinStore
烧钱。 - 冻结进出
CoinStore
的流动性。
用户
Coin 用户可以:
- 合并两个相同类型的 Coin 结构。
- 从 Coin 结构中提取值到新的 Coin 结构中。
- 能够从
CoinStore
存款和取款并因此发出事件。 - 允许用户在他们的帐户中注册一个
CoinStore<CoinType>
来处理 Coin 。
创建一个新的 CoinType
Coin 创建者可以向链上帐户发布一个新模块,该模块定义一个结构来表示新的CoinType
。然后, Coin 创建者将从该帐户调用 coin:initialize<CoinType>
以将其注册为有效 Coin ,并作为回报接收能够调用函数来销毁和铸造 Coin 并冻结 CoinStore
的结构。这些将需要由创建者存储在全局存储中以管理代币的使用。
public fun initialize<CoinType>(
account: &signer,
name: string::String,
symbol: string::String,
decimals: u8,
monitor_supply: bool,
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
创建者可以定义名称、符号、小数,以及是否监控 Coin 的总供应量。 以下适用:
- 上述前三个(
name
、symbol
、decimals
)是元数据,对链上应用没有影响。 一些应用程序可能会使用小数将单个 Coin 与小数 Coin 等同起来。 - 监控供应(
monitor_supply
)有助于跟踪总供应量。 但是,由于并行执行器的工作方式,打开此选项将阻止 mint 和 burn 的任何并行执行。 如果 Coin 会定期铸造或烧毁,请考虑禁用monitor_supply
。
铸造 Coin
如果创建者或管理者想要铸造 Coin ,他们必须检索对他们的MintCapability
的引用,该引用在initialize
中产生,并调用:
public fun mint<CoinType>(
amount: u64,
_cap: &MintCapability<CoinType>,
): Coin<CoinType> acquires CoinInfo {
这将生成一个新的 Coin 结构,其中包含由数量
指定的值。 如果跟踪供应,那么它也将被调整。
燃烧 Coin
如果创建者或管理者想要销毁 Coin ,他们必须检索对他们的 BurnCapability
的引用,该引用是在 initialize
中生成的,并调用:
public fun burn<CoinType>(
coin: Coin<CoinType>,
_cap: &BurnCapability<CoinType>,
) acquires CoinInfo {
创建者或管理者也可以从CoinStore
燃烧币:
public fun burn_from<CoinType>(
account_addr: address,
amount: u64,
burn_cap: &BurnCapability<CoinType>,
) acquires CoinInfo, CoinStore {
函数 burn
消除了存储在 Coin 中的总价值,而 burn_from
仅消除了 CoinStore
中给定数量的价值。 如果跟踪供应,那么它也将被调整。
从账户烧币不会像 withdraw
函数那样发出 WithdrawEvent
。
冻结账户
如果创建者或管理者想要冻结特定帐户上的CoinStore
,他们必须检索在initialize
中生成的对其FreezeCapability
的引用,并调用:
public entry fun freeze_coin_store<CoinType>(
account_addr: address,
_freeze_cap: &FreezeCapability<CoinType>,
) acquires CoinStore {
合并 Coin
两个相同类型的 Coin 可以合并成一个单独的 Coin 结构,该结构独立地表示两个 Coin 的累积值,方法是调用:
public fun merge<CoinType>(
dst_coin: &mut Coin<CoinType>,
source_coin: Coin<CoinType>,
) {
提取 Coin
一个 Coin 可以通过调用来扣除价值以创建另一个 Coin:
public fun extract<CoinType>(
coin: &mut Coin<CoinType>,
amount: u64,
): Coin<CoinType> {
从 CoinStore 提取 Coin
CoinStore
的持有者可以通过调用以下方法提取指定值的 Coin:
public fun withdraw<CoinType>(
account: &signer,
amount: u64,
): Coin<CoinType> acquires CoinStore {
此函数将发出一个 WithdrawEvent
。
将 Coin 存入 CoinStore
任何实体都可以通过调用将 Coin 存入帐户的CoinStore
:
public fun deposit<CoinType>(
account_addr: address,
coin: Coin<CoinType>,
) acquires CoinStore {
此函数将触发 DepositEvent
。
转移 Coin
CoinStore
的持有者可以通过调用以下方法直接将 Coin 从他们的账户转移到另一个账户的CoinStore
:
public entry fun transfer<CoinType>(
from: &signer,
to: address,
amount: u64,
) acquires CoinStore {
这将在各自的CoinStore
上发出WithdrawEvent
和DepositEvent
。
事件
struct DepositEvent has drop, store {
amount: u64,
}
struct WithdrawEvent has drop, store {
amount: u64,
}