Допис
Діліться своїми знаннями.

Ілюстрація стандартної бібліотеки Sui Move - пакет основних токенів (баланс, монета, оплата)
У цій статті аналізуються три основні компоненти токенів Sui Move: баланс (рівень зберігання цінностей), монета (рівень операції токенів) та оплата (рівень абстракції платежів). За допомогою принципових діаграм та прикладів коду розкриваються принципи проектування тришарової архітектури.
| Модулі | Рівні | Функція | Сценарій |
|: ------|: ---|: ---|
| sui::balance
| Рівень зберігання цінностей (базове сховище) | Керування співвідношенням відображення між адресами та залишками токенів | Запит на баланс, перевірка власності токенів |
| sui::coin
| Операційний рівень токена (основна операція) | Зосередьтеся на управлінні життєвим циклом самого токена; включаючи: створення токенів, знищення та управління метаданими тощо | Видача власних токенів та обслуговування метаданих токенів |
| sui::pay
| Рівень абстракції платежів (інкапсуляція високого рівня) | Забезпечує складні операції для оплати токенів, включаючи: розщеплення одного або пакетного токена, об'єднання, передачу тощо | Пакетна передача, логіка розділеного рахунку, airdrop |
Схема методу
Метод відносно простий, в основному називаючи монетметод в балансі. Метод монета буде названий, тому ця стаття зосереджується на проілюстрованому основному методі монети.
Принципи регулювання валюти будуть введені в окремій статті і будуть проігноровані в даній статті.
Приклади коду
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
Ви можете писати краще, щоб проаналізувати бібліотеку монет
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?53
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок42
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції24
- Як обмеження здібностей взаємодіють з динамічними полями в гетерогенних колекціях?04