Sui.

Пост

Поделитесь своими знаниями.

article banner.
MoonBags.
Jun 30, 2025
Статья

Иллюстрация стандартной библиотеки Sui Move — базовый пакет токенов (баланс, монета, оплата)

В этой статье анализируются три основных компонента токенов Sui Move: баланс (уровень хранения стоимости), монета (уровень операций с токенами) и оплата (уровень абстракции платежей). С помощью принципиальных диаграмм и примеров кода раскрываются принципы проектирования трехуровневой архитектуры.

| Модули | Уровни | Функция | Сценарий | |: ---|: ---|: ---|: ---| | sui::balance| Уровень хранения ценностей (базовое хранилище) | Управление сопоставлением адресов и балансов токенов | Запрос баланса, подтверждение владения токеном | | sui::coin| Уровень управления токенами (базовая операция) | Сосредоточьтесь на управлении жизненным циклом самого токена, включая создание, уничтожение и управление метаданными и т. д. | Выпуск токенов на заказ и обслуживание метаданных токенов | | sui::pay| Уровень абстракции платежей (высокоуровневая инкапсуляция) | Предоставляет комплексные операции по оплате токенов, включая однократное или пакетное разделение токенов, слияние, передачу и т. д. | Пакетный перевод, логика разделенного аккаунта, раздача токенов |

Диаграмма методов

Метод относительно прост, в основном метод cointhe вызывается в режиме баланса. Метод coin будет вызван, поэтому в данной статье основное внимание будет уделено монете — проиллюстрированному основному методу.

Принципы регулирования валюты будут представлены в отдельной статье и будут проигнорированы в этой статье.

Примеры кода

module cookbook::aig_token {
    use std::string::{Self, String};
    use std::ascii;
    use sui::coin::{Self, TreasuryCap};
    use sui::balance::{Self, Balance};
    use sui::url::{Self, Url};
    use sui::event;

    public struct EventMint has copy, drop {
        sender: address,
        amount: u64,
        coin_left: u64
    }

    public struct EventAirdrop has copy, drop {
        method: String,
        sender: address,
        amount: u64
    }

    public struct EventCoinMeta has copy, drop {
        decimals: u8,
        symbol: ascii::String,
        name: String,
        description: String,
        icon_url: Option<Url>,
    }

    public struct EventTotalSupply has copy, drop {
        total_supply: u64
    }

    public struct Vault has key {
        id: UID,
        balance: Balance<AIG_TOKEN>,
    }

    public struct AIG_TOKEN has drop {}

    fun init(
        witness: AIG_TOKEN,
        ctx: &mut TxContext
    ) {

        let decimals = 3;
        let symbol = b"AIG";
        let name = b"AIG Token";
        let description = b"AIG Token is a token that is used to incentivize the community to achieve the goals of the AI Goal.";
        let url = url::new_unsafe_from_bytes(b"https://ai-goal.vercel.app/");

        let (treasury_cap, metadata) = coin::create_currency<AIG_TOKEN>(
            witness,
            decimals,
            symbol,
            name,
            description,
            option::some(url),
            ctx
        );

        event::emit(
            EventCoinMeta {
                decimals: coin::get_decimals(&metadata),
                symbol: coin::get_symbol(&metadata),
                name: coin::get_name(&metadata),
                description: coin::get_description(&metadata),
                icon_url: option::some(url),
            }
        );

        transfer::public_freeze_object(metadata);
        transfer::public_transfer(treasury_cap, ctx.sender());

        transfer::share_object(
            Vault {
                id: object::new(ctx),
                balance: balance::zero(),
            }
        );
    }

    public(package) fun airdrop(
        vault: &mut Vault,
        amount: u64,
        method: vector<u8>,
        ctx: &mut TxContext
    ) {
        let sender = ctx.sender();

        let mut balance_drop = balance::split(&mut vault.balance, amount);
        let coin_drop = coin::take(&mut balance_drop, amount, ctx);
        transfer::public_transfer(coin_drop, sender);
        balance::destroy_zero(balance_drop);

        event::emit(
            EventAirdrop {
                method: string::utf8(method),
                sender,
                amount,
            }
        );
    }

    public fun mint_balance(
        treasury_cap: &mut TreasuryCap<AIG_TOKEN>,
        vault: &mut Vault,
        amount: u64,
        ctx: &mut TxContext
    ) {
        let balance_minted = coin::mint_balance(treasury_cap, amount);
        balance::join(&mut vault.balance, balance_minted);

        event::emit(
            EventMint {
                sender: ctx.sender(),
                amount: amount,
                coin_left: balance::value(&vault.balance)
            }
        );
    }

    #[allow(lint(self_transfer))]
    public fun mint_coin(
        treasury_cap: &mut TreasuryCap<AIG_TOKEN>,
        amount: u64,
        ctx: &mut TxContext
    ) {
        let coin_minted = coin::mint(treasury_cap, amount, ctx);
        transfer::public_transfer(coin_minted, ctx.sender());

        coin::mint_and_transfer(
            treasury_cap,
            amount,
            ctx.sender(),
            ctx
        );

        event::emit(
            EventTotalSupply {
                total_supply: coin::total_supply(treasury_cap)
            }
        )
    }
}

  • Sui
2
Поделиться
Комментарии
.
0xduckmove.
Jun 30 2025, 06:14

Вы можете лучше писать, чтобы проанализировать библиотеку монет