Skip to main content

Aptos Coin

Coin 为简单、可替代的标准、类型安全的框架 代币或 Coin 。

tip

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 的总供应量。 以下适用:

  • 上述前三个(namesymboldecimals)是元数据,对链上应用没有影响。 一些应用程序可能会使用小数将单个 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 与 burn_from

函数 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 {
tip

此函数将发出一个 WithdrawEvent

将 Coin 存入 CoinStore

任何实体都可以通过调用将 Coin 存入帐户的CoinStore

public fun deposit<CoinType>(
account_addr: address,
coin: Coin<CoinType>,
) acquires CoinStore {
tip

此函数将触发 DepositEvent

转移 Coin

CoinStore 的持有者可以通过调用以下方法直接将 Coin 从他们的账户转移到另一个账户的CoinStore

public entry fun transfer<CoinType>(
from: &signer,
to: address,
amount: u64,
) acquires CoinStore {
tip

这将在各自的CoinStore上发出WithdrawEventDepositEvent

事件

struct DepositEvent has drop, store {
amount: u64,
}
struct WithdrawEvent has drop, store {
amount: u64,
}