帖子
分享您的知识。

MoonBags116
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
分享
评论
0xduckmove618
Jun 30 2025, 06:14你可以写得更好分析硬币库
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
352帖子499答案