Build simple Coin airdrop module in Sui ( bài đọc thêm)
Trước khi đi sâu vào việc xây dựng module airdrop, chúng ta hãy ôn lại một số khái niệm cơ bản trong Sui mà chúng ta sẽ sử dụng. Hiểu rõ những thành phần cốt lõi này sẽ giúp bạn nắm bắt tốt hơn cách thức hoạt động của cơ chế airdrop.
Review lại các bài học trước:
Trong Sui, việc quản lý coin bao gồm nhiều thành phần quan trọng làm việc cùng nhau:
- create_currency: Hàm coin::create_currency là điểm khởi đầu để tạo một token mới. Hàm này trả về:
- TreasuryCap: Object này cấp quyền để mint (tạo mới), burn (đốt) và cập nhật metadata của token
- Metadata: Chứa thông tin cơ bản và các thuộc tính của token
- Sự Khác Biệt Giữa Coins và Balances:
Balance giống như "tiền mặt" - thể hiện giá trị thuần túy Coin giống như ví điện tử để chứa các balance này
Xây Dựng Module Airdrop Token VBICamp
module 0x0::vbicamp {
use sui::coin::{Self, TreasuryCap};
use sui::transfer;
public struct VBICAMP has drop {}
public struct VBICampTreasuryCapHolder has key {
id: UID,
treasury_cap: TreasuryCap<VBICAMP>,
}
public struct MintVBICampEvent has copy, drop {
user: address,
amount: u64,
}
fun init(otw: VBICAMP, ctx: &mut TxContext) {
let (treasury_cap, metadata) = coin::create_currency(
otw,
9,
b"HACK",
b"VBICamp asset",
b"Digital asset for VBI Blockchain Camp",
option::none(),
ctx,
);
transfer::public_freeze_object(metadata);
let treasury_cap_holder = VBICampTreasuryCapHolder {
id: object::new(ctx),
treasury_cap,
};
transfer::share_object(treasury_cap_holder);
}
entry fun mint(
treasury_cap_holder: &mut VBICampTreasuryCapHolder,
addresses: vector<address>,
amount: u64,
ctx: &mut TxContext
) {
let sender = tx_context::sender(ctx);
let treasury_cap = &mut treasury_cap_holder.treasury_cap;
let size = addresses.length();
let mut i = 0;
while (i < size) {
coin::mint_and_transfer(treasury_cap, amount, addresses[i], ctx);
i = i + 1;
};
}
}
Ví dụ mình call function mint và air cho list 2 có 2 address:
sui client call --package 0x41ab1cdc9537cfe98a711f4012acc55a02a0071f19ec7c5a9d25220c83439309 --module vbicamp --function mint --args 0xae24cdfae1c81cf53063880d03aacbe17000156ffe2bc8f7e8365f0dea07d3da "[0x0d1029ece6bc4735c13d991729616eaa3e3adf182d4639c1a40c5b9ffa923c50, 0xebb5a8837f470e86e09c9c74d7abe9019be7dbf874866bb0bf9447861424372a]" 20000000
Bạn sẽ được kết quả như thế này:
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0x40724a097e7c41936b272cb95ba01da017a9576ba9c5f55caf90f68c6dc86303 │
│ │ Sender: 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb │
│ │ Owner: Account Address ( 0xebb5a8837f470e86e09c9c74d7abe9019be7dbf874866bb0bf9447861424372a ) │
│ │ ObjectType: 0x2::coin::Coin<0x41ab1cdc9537cfe98a711f4012acc55a02a0071f19ec7c5a9d25220c83439309::vbicamp::VBICAMP> │
│ │ Version: 289571952 │
│ │ Digest: EHRtMsfSmXY8WikAQYNFRBNLNuLsGccDkCK7NTVbYZCG │
│ └── │
│ ┌── │
│ │ ObjectID: 0xca5b16ae1b38ce2c0b627522be6a5937280c7206070e1b3f26ed0438e498c43a │
│ │ Sender: 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb │
│ │ Owner: Account Address ( 0x0d1029ece6bc4735c13d991729616eaa3e3adf182d4639c1a40c5b9ffa923c50 ) │
│ │ ObjectType: 0x2::coin::Coin<0x41ab1cdc9537cfe98a711f4012acc55a02a0071f19ec7c5a9d25220c83439309::vbicamp::VBICAMP> │
│ │ Version: 289571952 │
│ │ Digest: ACQ1X9HghqiJhZMuWbqR5Sii5JMw8HvGRe6rMi9L7ybG │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x16afcc17e5f21755f9369d3b452dc66707ba9f6965a7e9931e52a54a8df70df4 │
│ │ Sender: 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb │
│ │ Owner: Account Address ( 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 289571952 │
│ │ Digest: J4eA3DLFsBaXewd3EGpTYGJybVMCqwnMMxxBWsRWSzv5 │
│ └── │
│ ┌── │
│ │ ObjectID: 0xae24cdfae1c81cf53063880d03aacbe17000156ffe2bc8f7e8365f0dea07d3da │
│ │ Sender: 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb │
│ │ Owner: Shared( 289571951 ) │
│ │ ObjectType: 0x41ab1cdc9537cfe98a711f4012acc55a02a0071f19ec7c5a9d25220c83439309::vbicamp::VBICampTreasuryCapHolder │
│ │ Version: 289571952 │
│ │ Digest: EPRtXjAu9Tcyie2VdCaGSRKDdysFFNum3xQL134ALTG3 │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Hoặc bạn có thể đọc sâu thêm về: