メインコンテンツまでスキップ

Aptosコイン(従来の)

コインが提供する標準は、シンプルで型安全なフレームワーク、代替可能トークンとコインです。

ヒント

コインは 0x1::coinへ補完されます。

構造物

再利用性

Moveでコインは以下の様に定義されます。

struct Coin<phantom CoinType> has store {
/// このアドレスが持っているコインの量
value: u64,
}

CoinはCoinTypeを使い、個別のコインのコインフレームワークの再利用性をサポートします。例えばCoin<A>Coin<B>は別のコインです。

グローバルストア

Coinはグローバルストアへコインを保存するリソースもサポートしています。

struct CoinStore<phantom CoinType> has key {
coin: Coin<CoinType>,
frozen: bool,
deposit_events: EventHandle<DepositEvent>,
withdraw_events: EventHandle<WithdrawEvent>,
}

コイン情報やメタデータはコイン作成者アカウント下のグローバルストアへ保存されます。

struct CoinInfo<phantom CoinType> has key {
name: string::String,
/// コインのシンボル、通常は名前の短縮系
/// 例えば、シンガポールドルはSGD
symbol: string::String,
/// ユーザー表現を取得するため使用される小数の数
/// 例えば`decimals`が`2`と等しい場合`505`コインの残高は
/// ユーザーへ`5.05` (`505 / 10 ** 2`)と表示されます。
decimals: u8,
/// このコインタイプの実在量
supply: Option<OptionalAggregator>,
}

プリミティブ

Coinはコインを作成・管理しているユーザーや、それを使用するユーザーへプリミティブを提供します。

作成者

Coinの作成者と管理者が出来るのは...

  • コインの初期化とメタデータの設定をして供給の監視をする
  • コインの価値のバーンとミント
  • CoinStoreからコインをバーンする
  • CoinStoreへ出入りする流動性を凍結します

ユーザー

コインユーザーが出来るのは...

  • 同じタイプの2つのCoin構造体を併合する。
  • Coin構造体から新しいCoin構造体へ値を抽出する。
  • CoinStoreへの入出金の機能と結果としてイベントの発行。
  • ユーザーが自分のアカウントのCoinStore<CoinType>を登録するのを許可して コインを処理する。

コインモジュールキー構造体

以下の表では構造体レベルのフィールドを解説します。最終的なリストについてはcoinを含むAptosフレームワークを御覧下さい。

Coin
分野タイプ内容
valueu64トークンの値、 例: 1000000000
CoinInfo
分野タイプ内容
nameStringトークン名, 例: Aptos コイン
symbolStringトークンのシンボル, 例: APT
decimalsu8コインの価値を表す方法を決定します;例えば、APTの10進数は8なので100000000の値は1APTで表されます。
supplyオプション<OptionalAggregator>option::some(optional_aggregator::new(MAX_U128, parallelizable))

新しいコインタイプを作成する

コイン作成者はオンチェーンアカウントへ新しいモジュールを発行出来、新しいCoinTypeを表す構造体を定義します。コイン作成者はそのアカウントからcoin:initialize<CoinType>を呼び出しこれを有効なコインとして登録します。そして、お返しにコインをバーンしてミントし、CoinStoreを凍結する関数を呼び出せる構造体を受け取ります。コインの使用を管理するため、これらは作成者によってグローバルストレージへ保存される必要が有ります。

public fun initialize<CoinType>(
account: &signer,
name: string::String,
symbol: string::String,
decimals: u8,
monitor_supply: bool,
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {

作成者は名前、シンボル、少数、コインの合計供給量が監視するかどうかを定義することが出来ます。以下が適用されます。

  • 上記の最初の3つ(name, symbol, decimals)は、純粋なメタデータであり、オンチェーンアプリケーションへの影響は有りません。一つのコインと微量のコインを等しくするため、一部のアプリケーションでは少数を使う場合が有ります。

  • モニタリングサプライ(monitor_supply)は供給されているコインの合計を追跡する手助けをしますが、並行実行機能の働きにより、この選択肢をonにするといかなるミント、バーンの並行実行も防止されます。日常的にコインをミントやバーンしているならmonitor_supplyの無効化を検討して下さい。

コインのミント

作成者か管理者がコインをミントしたい場合は、initializeで生産され呼び出されるMintCapabilityの照会を取得する必要が有ります。

public fun mint<CoinType>(
amount: u64,
_cap: &MintCapability<CoinType>,
): Coin<CoinType> acquires CoinInfo {

これはamountが指定した価値を含む新しいCoin構造体を生産します。供給が追跡されると、それも調整されます

コインをバーンする

作成者もしくは管理者がコインをバーンしようと思ったら、initializeで生産されたBurnCapabilityの照会を取得して以下を呼び出す必要が有ります。

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関数はコインの合計保存値を削除しますが、burn_fromCoinStoreから指定された値の量のみを削除します。 供給が追跡されるとそれも調整されます。

アカウントからバーンされたコインはwithdraw関数の様なWithdrawEventを発行しません。

アカウントの凍結

作成者もしくは管理者が特定のアカウントのCoinStoreを凍結する場合、initializeで生成されたFreezeCapabilityの照会を取得し、以下を呼び出す必要が有ります。

public entry fun freeze_coin_store<CoinType>(
account_addr: address,
_freeze_cap: &FreezeCapability<CoinType>,
) acquires CoinStore {

コインの統合

同じタイプの2つのコインは単一のコイン構造体へ統合する事が出来ます。この構造体は以下を呼び出す事で2つのコインの累積値をそれぞれ独立して表示します。

public fun merge<CoinType>(
dst_coin: &mut Coin<CoinType>,
source_coin: Coin<CoinType>,
) {

コインを抽出する

以下を呼び出す事で、ひとつのコインの値を控除して別のコインを作成出来ます。

public fun extract<CoinType>(
coin: &mut Coin<CoinType>,
amount: u64,
): Coin<CoinType> {

コインストアからコインを引き出す

CoinStoreの保有者は以下を呼び出す事で、指定された値のコインを抽出出来ます。

public fun withdraw<CoinType>(
account: &signer,
amount: u64,
): Coin<CoinType> acquires CoinStore {
ヒント

この関数はWithdrawEventを発行します

コインストアへのコインの入金

以下を呼び出す事で、どんなエンティティーもアカウントのCoinStoreへコインを入金出来ます。

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

この関数はDepositEventを発行します。

コインの転送

CoinStoreの保有者は、以下を呼び出す事で自分のアカウントから別のアカウントのCoinStoreへ直接コインを転送する事が出来ます。

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

これはそれぞれのCoinStore上でWithdrawEventDepositEventの両方を発行します。

イベント

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