Coin và NFT
Practice 1: Build Sui airdrop contract

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:

  1. 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
  1. 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ề:

  1. https://github.com/interest-protocol/sui-defi/blob/main/airdrop/sources/core.move#L80 (opens in a new tab)