move共学营task2

  • 0xkrypton
  • 更新于 2024-11-26 21:12
  • 阅读 371

coin

<!--StartFragment-->

完成两个Coin合约的上链部署

  • 上链网络: mainnet

需求

  • 完成 Coin相关知识的学习
  • 完成 My Coin 的学习并部署主网
  • 完成 Faucet Coin 的学习并部署主网
  • 提交 My Coin 和 Faucet Coin 合约发布 package id
  • 发送 My Coin 给地址 0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2
  • Faucet Coin 需要至少用两个地址mint

学习要点

  1. 理解Coin协议 创建Coin
  2. 理解独享所有权和共享所有权的区别
  3. 对共享所有权保持敬畏 因为权限被共享了

public_transfer 独享 mint权限 public_share_object 共享 mint权限

任务指南

  • Faucet Coin 就是任意人都可以mint的Coin
  • My Coin 只能指定地址mint

<!--EndFragment-->

My Coin

代码解析

  1. 定义代币结构体 public struct KRYPTON_COIN has drop {} 定义了一个名为 KRYPTON_COIN 的公共结构体,并声明了该结构体具有 drop 属性

  2. init函数:初始化代币

    fun init(witness: KRYPTON_COIN, ctx: &mut TxContext) {
    let (treasury_cap, metadata) = coin::create_currency(
        witness,
        9, // 精度(小数位数)
        b"krypton", // 代币符号
        b"KRYPTON_COIN", // 代币名称
        b"Krypton Coin", // 代币描述
        option::some&lt;Url>(url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/154910746?v=4")), // URL 图像链接
        ctx
    );
  • witness: 传入的 KRYPTON_COIN 结构体实例,用作创建代币时的证明。

  • coin::create_currency(...):使用 create_currency 函数创建一个新的代币: create_currency 是 Sui Move 模块中的一个内置函数,通常是由 TreasuryCapCoinMetadata 两个对象来管理的 create_currency函数:

fun create_currency&lt;T>(
    witness: T,  // 创建代币的证明,通常是一个对象
    decimals: u8, // 代币的精度,决定小数点后保留多少位
    symbol: vector&lt;u8>, // 代币符号,例如 "BTC"、"USD"
    name: vector&lt;u8>, // 代币的名称
    description: vector&lt;u8>, // 代币的描述
    icon_url: Option&lt;Url>, // 可选的代币图标 URL
    ctx: &mut TxContext // 当前的交易上下文
): (TreasuryCap&lt;T>, CoinMetadata) // 返回铸币权限对象和代币元数据对象
  1. 冻结代币元数据
    //冻结metadata对象,阻止后续修改
    transfer::public_freeze_object(metadata);
  2. 将代币权限转移到发送者
    //将铸币权限转至sender
    transfer::public_transfer(treasury_cap, tx_context::sender(ctx))
  3. mint 函数:铸造代币
    
    public entry fun mint(
    treasury_cap: &mut TreasuryCap&lt;KRYPTON_COIN>,//传入的铸币权限对象
    amount: u64,//数量
    recipient: address,//接收者地址
    ctx: &mut TxContext
    ) {
    coin::mint_and_transfer(treasury_cap, amount, recipient, ctx);
    }
- `public entry fun mint(...)`:这是一个公开的入口函数,允许外部调用以铸造新的代币并将其转移给指定地址。
- `coin::mint_and_transfer(treasury_cap, amount, recipient, ctx)`: 调用 `mint_and_transfer` 函数来铸造代币并将其转移给 `recipient`。这会根据 `treasury_cap` 中的权限铸造 `amount` 数量的代币,并直接转移给指定地址。

## 总结
- `KRYPTON_COIN`:定义了一个名为 `KRYPTON_COIN` 的代币类型,具有 `drop` 属性,表示这是一个资源类型,且可以自动清理。

- `init`:初始化函数,用于创建一个新的代币,并将铸币权限转移给交易发送者。还设置了代币的精度、名称、符号和图标等信息。

- `mint`:铸造代币并将其转移给指定地址。需要提供铸币权限、数量和接收地址。

## 完整代码

module my_coin::krypton_coin { use sui::coin::{Self, Coin, TreasuryCap}; use sui::url::{Self, Url};

public struct KRYPTON_COIN has drop {}

fun init(witness: KRYPTON_COIN,ctx: &mut TxContext) {
    let (treasury_cap, metadata) = coin::create_currency(
        witness,
        9,
        b"krypton",
        b"KRYPTON_COIN",
        b"Krypton Coin",
        option::some&lt;Url>(url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/154910746?v=4")),
        ctx
    );
    //冻结metadata对象,阻止后续修改
    transfer::public_freeze_object(metadata);

    //将铸币权限转至sender
    transfer::public_transfer(treasury_cap,tx_context::sender(ctx))
}

public entry fun mint(
    treasury_cap: &mut TreasuryCap&lt;KRYPTON_COIN>,
    amount: u64,
    recipient: address,
    ctx: &mut TxContext
) {
    coin::mint_and_transfer(treasury_cap, amount, recipient, ctx);
}

}

# Faucet Coin
- 与My_Coin类似,只需将第四点代币权限共享
## 完整代码

module faucet_coin::krypton_faucet_coin { use sui::coin::{Self, Coin, TreasuryCap}; use sui::url::{Self, Url};

// 定义代币结构体
public struct KRYPTON_FAUCET_COIN has drop {}

// 初始化函数:创建代币并共享铸币权限
fun init(witness:KRYPTON_FAUCET_COIN,ctx: &mut TxContext) {

    let (treasury_cap, metadata) = coin::create_currency&lt;KRYPTON_FAUCET_COIN>(
        witness,
        9, // 精度
        b"krypton faucet coin",
        b"KRYPTON_FAUCET_COIN",
        b"Krypton Faucet Coin",
        option::some&lt;Url>(url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/154910746?v=4")),  // 代币的头像URL
        ctx
    );

    // 冻结metadata对象,阻止后续修改
    transfer::public_freeze_object(metadata);

    // 共享铸币权限
    transfer::public_share_object(treasury_cap);
}

// 铸币功能
public entry fun mint(
    treasury_cap: &mut TreasuryCap&lt;KRYPTON_FAUCET_COIN>,
    amount: u64,
    recipient: address,
    ctx: &mut TxContext
) {
    coin::mint_and_transfer(treasury_cap, amount, recipient, ctx);
}

}

# 合约调用
`'sui client publish'`将程序上链后调用函数
根据hash在[suivison](https://suivision.xyz/)中查找id

sui client call --package <package id> --module <module id>
--function <fun id>
--args <TreasuryCap> <amount> <receipient address>
--gas-budget 100000000

  • 原创
  • 学分: 11
  • 分类: Sui
  • 标签: Move 
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
0xkrypton
0xkrypton
江湖只有他的大名,没有他的介绍。