task2要求完成Coin相关知识的学习完成MyCoin的学习并部署主网完成FaucetCoin的学习并部署主网提交MyCoin和FaucetCoin合约发布packageid发送MyCoin给地址0x7b8e0864967427679b4e129f
My Coin
的学习并部署主网Faucet Coin
的学习并部署主网My Coin
和 Faucet Coin
合约发布 package id
My Coin
给地址 0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2
Faucet Coin
需要至少用两个地址minttip:对类似coin,balance之类的进行操作,先打出coin/balance的前缀,再打出你想进行的操作的英文,大概率就能找到你需要的函数。
一句话就可以概括sui链上的coin,coin就像我们生活中的硬币。coin是有着铸造权限的人才能铸造,也有着属于coin自己的信息。
My Coin
的学习并部署主网My Coin 顾名思义是自己的硬币,硬币的铸造权在自己的手上
Faucet Coin
的学习并部署主网Faucet Coin可以理解成测试币,任何人都能铸造,铸造权是共享的。
My Coin
和 Faucet 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
找到代币铸造权的object id并不复杂(我这个包是发布了2个faucet币,不同代币的铸造权的object id 可以通过 Type一栏区分,看后缀就可以知道)
点进去就可以看到我们的mint_and_transfer的相关函数(能在浏览器调用的一定是 entry fun 这样的函数)
在相应参数输入框输入相应参数之后点 Execute 再用钱包签名就行(参数一定要对,要输入的参数,浏览器会提示的),如下图
My_Coin只需要将铸造权的所有权转给你自己就行
使用以下这个函数将所有权转给自己
public_transfer()
move插件会提示你输入的参数是什么
My_Coin与Facuet_Coin仅相差一行,前文提及了
剩下的操作与Facuet_Coin一样,大家参照前文即可
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!