Sui.

Publication

Partagez vos connaissances.

article banner.
MoonBags.
Jun 30, 2025
Article

Illustration de la bibliothèque standard Sui Move - Package de jetons de base (solde, pièces, paiement)

Cet article analyse les trois composants principaux des jetons Sui Move : le solde (couche de stockage des valeurs), les pièces (couche de fonctionnement des jetons) et le paiement (couche d'abstraction des paiements). À l'aide de diagrammes de principe et d'exemples de code, les principes de conception de l'architecture à trois couches sont révélés.

| Modules | Niveaux | Fonction | Scénario | | : ---| : ---| : ---| : ---| | sui::balance| Couche de stockage des valeurs (stockage sous-jacent) | Gérer la relation de mappage entre les adresses et les soldes de jetons | Requête d'équilibre, vérification de la propriété des jetons | | sui::coin| Couche de fonctionnement des jetons (fonctionnement de base) | Concentrez-vous sur la gestion du cycle de vie du jeton lui-même, y compris : la création, la destruction et la gestion des métadonnées, etc. | Émission de jetons personnalisés et maintenance des métadonnées des jetons | | sui::pay| Couche d'abstraction des paiements (encapsulation de haut niveau) | Fournit des opérations composées pour le paiement par jetons, notamment : fractionnement, fusion, transfert de jetons uniques ou par lots, etc. | Transfert par lots, logique de compte partagé, airdrop |

Schéma de méthode

La méthode est relativement simple, appelant principalement cointhe method in balance. La méthode coin sera appelée, c'est pourquoi cet article se concentre sur la méthode principale illustrée.

Les principes de la monnaie réglementaire seront présentés dans un article séparé et seront ignorés dans cet article.

Exemples de code

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
Partager
Commentaires
.
0xduckmove.
Jun 30 2025, 06:14

Vous pouvez mieux écrire pour analyser la bibliothèque de pièces