Aptos Coin

Coin предоставляет стандартную, безопасную для типов структуру для простых, взаимозаменяемых tokens или coins.

ПОДСКАЗКА

Монета хранится в 0x1::coin.

Структуры

Повторное использование

Сoin определяется в Move как:

struct Coin<phantom CoinType> has store {
    /// Amount of coin this address has.
    value: u64,
}

Coin использует CoinType для поддержки повторного использования платформы Coin для разных Coins. Например, Coin<A> и Coin<B> два разных Coins

Глобальное хранилище

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,
    /// Symbol of the coin, usually a shorter version of the name.
    /// For example, Singapore Dollar is SGD.
    symbol: string::String,
    /// Number of decimals used to get its user representation.
    /// For example, if `decimals` equals `2`, a balance of `505` coins should
    /// be displayed to a user as `5.05` (`505 / 10 ** 2`).
    decimals: u8,
    /// Amount of this coin type in existence.
    supply: Option<OptionalAggregator>,
}

Примитивы

Coin предоставляет примитивы для пользователей, создающих и управляющих coin, и пользователей, которые ее используют.

Создатели

Создатели и менеджеры Coin могут:

  • Инициализация coin, установка ее метаданных и мониторинг обеспечения.

  • Минт и сжигание стоимости coin.

  • Сжигание coin из CoinStore.

  • Замораживание движения в и из CoinStore.

Пользователи

Пользователи Coin могут:

  • Объединить две структуры Coin одного типа.

  • Извлекать значение из структуры Coin в новую структуру Coin.

  • Возможность вводить и выводить средства из CoinStore и создавать события в результате.

  • Позволяет пользователям регистрировать CoinStore<CoinType> в своей учетной записи для обработки coin.

Создание нового CoinType

Создатель coin может опубликовать в учетной записи на сети новый модуль, определяющий структуру для представления нового типа coin CoinType. Затем создатель coin вызовет coin:initialize<CoinType> из этой учетной записи, чтобы зарегистрировать его как действительную coin, и в ответ получит структуры, позволяющие вызывать функции для сжигания и минта coin и замораживания CoinStores. Они должны храниться в глобальном хранилище создателя для управления использованием coin.

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) помогает отслеживать общее количество coin в наличии. Однако из-за особенностей работы параллельного исполнителя включение этой опции предотвратит параллельное выполнение операций минта и сжигания. Если coin будет регулярно минтится или сжигаться, подумайте об отключении monitor_supply.

Минт Coins

Если создатель или менеджер хотят минтить coins, они должны получить ссылку на свою MintCapability, которая была создана в initialize, и вызвать ее:

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

В результате будет создана новая структура Coin, содержащая значение, определяемое amount. Если предложение отслеживается, то оно также будет скорректировано.

Сжигание Coins

Если создатель или менеджер хотят сжечь coins, они должны получить ссылку на свою BurnCapability, которая была создана в initialize, и вызвать ее:

public fun burn<CoinType>(
    coin: Coin<CoinType>,
    _cap: &BurnCapability<CoinType>,
) acquires CoinInfo {

Создатель или менеджер также может сжечь coins из CoinStore:

public fun burn_from<CoinType>(
    account_addr: address,
    amount: u64,
    burn_cap: &BurnCapability<CoinType>,
) acquires CoinInfo, CoinStore {

BURN VS BURN_FROM Функция burn устраняет всю стоимость, хранящуюся в coin, в то время как burn_from устраняет только заданное количество стоимости из CoinStore. Если отслеживается запас, то он также будет скорректирован.

Сжигание coin c учетной записи не вызывает событие WithdrawEvent, как это делает функция withdraw.

Замораживание учетных записей

Если создатель или менеджер хочет заморозить CoinStore на определенной учетной записи, они должны получить ссылку на свою FreezeCapability, которая была создана в initialize, и вызвать:

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

Слияние Coins

Два coins одного типа могут быть объединены в одну структуру Coin, которая представляет накопленную стоимость двух coins независимо друг от друга, путем вызова:

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

Извлечение Coins

У Coin может быть вычтена стоимость для создания другой Coin путем вызова:

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

Вывод Coins из CoinStore

Владелец CoinStore может извлечь Coin указанной суммы путем вызова:

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

ПОДСКАЗКА Эта функция выдает событие WithdrawEvent.

Депозит Coins в CoinStore

Любой субъект может пополнить CoinStore учетной записи coins, вызвав:

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

ПОДСКАЗКА Эта функция создает событие DepositEvent.

Передача Coins

Владелец CoinStore может напрямую перевести coins со своей учетной записи на CoinStore другой учетной записи, вызвав:

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

ПОДСКАЗКА

Это вызовет событие WithdrawEvent и DespositEvent на соответствующих CoinStores.

События

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

Last updated