HOH_Move共学_task2

  • 门前雪
  • 更新于 2024-11-07 00:46
  • 阅读 426

task2要求完成Coin相关知识的学习完成MyCoin的学习并部署主网完成FaucetCoin的学习并部署主网提交MyCoin和FaucetCoin合约发布packageid发送MyCoin给地址0x7b8e0864967427679b4e129f

task2要求

  • 完成 Coin相关知识的学习
  • 完成 My Coin 的学习并部署主网
  • 完成 Faucet Coin 的学习并部署主网
  • 提交 My CoinFaucet Coin 合约发布 package id
  • 发送 My Coin 给地址 0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2
  • Faucet Coin 需要至少用两个地址mint
tip:对类似coin,balance之类的进行操作,先打出coin/balance的前缀,再打出你想进行的操作的英文,大概率就能找到你需要的函数。

分步完成

完成 Coin相关知识的学习

一句话就可以概括sui链上的coin,coin就像我们生活中的硬币。coin是有着铸造权限的人才能铸造,也有着属于coin自己的信息。

完成 My Coin 的学习并部署主网

My Coin 顾名思义是自己的硬币,硬币的铸造权在自己的手上

完成 Faucet Coin 的学习并部署主网

Faucet Coin可以理解成测试币,任何人都能铸造,铸造权是共享的。

提交 My CoinFaucet Coin 合约发布 package id

My Coin与 Faucet Coin的代码仅相差一行(相差的一行是铸造权的归属问题)

做如何新建Sui项目文件夹这些操作就不赘述了

先上完整代码(Faucet Coin)

module coins::coin_b{
    use std::option;
    use coins::coin_a;
    use sui::coin;
    use sui::coin::{mint_and_transfer,TreasuryCap};
    use sui::transfer::{public_share_object,public_freeze_object};
    use sui::tx_context::TxContext;

    public struct COIN_B has drop{}

    fun init (witness:COIN_B,ctx:&mut TxContext){
        let (traCap_b,coin_b) = coin::create_currency(witness,6,b"for_swap",b"coin_b",b"one_object", option::none(),ctx);
        public_freeze_object(coin_b);
        public_share_object(traCap_b);

    }
    public entry fun mint_and_send(trap:&mut TreasuryCap<COIN_B>,am:u64,recive:address,ctx:&mut TxContext){
        mint_and_transfer(trap,am,recive,ctx);
    }

//初始化之后不能 mint_and_transfer
}

下面进行代码的讲解

    public struct COIN_B has drop{}

这段代码定义了一个一次性见证者,这个一次性见证者是我们在创建代码的必须品。

一次性见证者(one-time witness):简单理解就是一种保障机制,确保Coin的相关资源只能使用一次。

一次性见证者的要求:一次性见证者的名字是模块名的大写,如模块名为coin_b,则一次性见证者的名字则为COIN_B。一次性见证者只拥有drop能力。

 fun init (witness:COIN_B,ctx:&mut TxContext){}

init函数,使用init函数对代币的信息和铸造权初始化需要传入一次性见证者和交易上下文。

     let (traCap_b,coin_b) = coin::create_currency(witness,6,b"for_swap",b"coin_b",b"one_object", option::none(),ctx);

初始化铸币权和代币信息。

traCap_b,coin_b分别是指代币的铸币权和代币信息,这2个初始化需要调用coin模块下的create_currency函数。

从左往右输入的参数依次是一次性见证者,代币的精度(例如微信最低是分),代币符号,代币名称,代币描述,代币图标的链接,特殊参数(不需要指定)。

      public_freeze_object(coin_b);

使用冻结函数确保coin_b的信息不更改

    public_share_object(traCap_b);

权限转移,coin_b的铸造权通过 public_share_object函数共享给每个人。

 public entry fun mint_and_send(trap:&mut TreasuryCap<COIN_B>,am:u64,recive:address,ctx:&mut TxContext){
        mint_and_transfer(trap,am,recive,ctx);
    }

使用entry函数是为了方便在浏览器调用

这一步的逻辑是先铸造再发送

铸造需要传入铸造权所对应的objiect id和铸造的数量,发送需要传入接收者的地址

调用mint_and_transfer函数进行铸造和发送

调用

以下操作记得切换网络

添加主网

sui client new-env --alias mainnet --rpc https://sui-mainnet.nodeinfra.com:443

切换至主网

sui client switch --env mainnet

第一步 通过发布之后的交易哈希在sui浏览器找到相应的包

image.png

第二步 在第一步的页面下拉到最下面并复制铸造权的object id

image.png

找到代币铸造权的object id并不复杂(我这个包是发布了2个faucet币,不同代币的铸造权的object id 可以通过 Type一栏区分,看后缀就可以知道)

第三步 拉大最上面,点进包

image.png

第四步 点这里

image.png

点进去就可以看到我们的mint_and_transfer的相关函数(能在浏览器调用的一定是 entry fun 这样的函数)

image.png

在相应参数输入框输入相应参数之后点 Execute 再用钱包签名就行(参数一定要对,要输入的参数,浏览器会提示的),如下图

image.png

My_Coin

My_Coin只需要将铸造权的所有权转给你自己就行

使用以下这个函数将所有权转给自己

public_transfer()

move插件会提示你输入的参数是什么

My_Coin与Facuet_Coin仅相差一行,前文提及了

剩下的操作与Facuet_Coin一样,大家参照前文即可

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
门前雪
门前雪
0xd3eb...1f81
永远喜欢大狐狸