coin
<!--StartFragment-->
My Coin
的学习并部署主网Faucet Coin
的学习并部署主网My Coin
和 Faucet Coin
合约发布 package id
My Coin
给地址 0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2
Faucet Coin
需要至少用两个地址mintpublic_transfer 独享 mint权限 public_share_object 共享 mint权限
Faucet Coin
就是任意人都可以mint的CoinMy Coin
只能指定地址mint<!--EndFragment-->
定义代币结构体
public struct KRYPTON_COIN has drop {}
定义了一个名为 KRYPTON_COIN
的公共结构体,并声明了该结构体具有 drop
属性
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<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 模块中的一个内置函数,通常是由 TreasuryCap
和 CoinMetadata
两个对象来管理的
create_currency
函数:
fun create_currency<T>(
witness: T, // 创建代币的证明,通常是一个对象
decimals: u8, // 代币的精度,决定小数点后保留多少位
symbol: vector<u8>, // 代币符号,例如 "BTC"、"USD"
name: vector<u8>, // 代币的名称
description: vector<u8>, // 代币的描述
icon_url: Option<Url>, // 可选的代币图标 URL
ctx: &mut TxContext // 当前的交易上下文
): (TreasuryCap<T>, CoinMetadata) // 返回铸币权限对象和代币元数据对象
//冻结metadata对象,阻止后续修改
transfer::public_freeze_object(metadata);
//将铸币权限转至sender
transfer::public_transfer(treasury_cap, tx_context::sender(ctx))
mint
函数:铸造代币
public entry fun mint(
treasury_cap: &mut TreasuryCap<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<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<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<KRYPTON_FAUCET_COIN>(
witness,
9, // 精度
b"krypton faucet coin",
b"KRYPTON_FAUCET_COIN",
b"Krypton Faucet Coin",
option::some<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<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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!