大家好,又来做HOH水分子社区的学习任务啦,今天我们来聊聊用 Move 语言实现一个非常简单的 swap 功能,也就是两种代币之间的兑换。这个功能类似于我们在生活中把美元换成人民币,只不过在这里,我们要在两种虚拟代币——LIZHECOME_COIN 和 LIZHECOME_FAUCET_COIN 之
本系列文章将深入浅出的全面讲解Move语言。
请用微信关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
新的任务
大家好,又来做HOH水分子社区的学习任务啦,今天我们来聊聊用 Move 语言实现一个非常简单的 swap 功能,也就是两种代币之间的兑换。这个功能类似于我们在生活中把美元换成人民币,只不过在这里,我们要在两种虚拟代币——LIZHECOME_COIN 和 LIZHECOME_FAUCET_COIN 之间进行转换。
这篇笔记会带你逐步了解代码是怎么实现的,并帮助大家理解背后的逻辑。
首先,我们要创建一个模块,名字叫 swap_lizhecome,就像是我们在编写一个简单的“代币兑换所”。
module swap_lizhecome::swap_lizhecome;
接下来,我们需要引入一些功能模块,就像是搭积木前先找好需要的零件。
use faucetcoin::lizhecome_faucet_coin::LIZHECOME_FAUCET_COIN;
use mycoin::lizhecome_coin::LIZHECOME_COIN;
use sui::balance::{Self, Balance};
use sui::transfer::{transfer, share_object, public_transfer};
use sui::coin::{Self, Coin};
我们需要两个结构体,一个是 AdminCap,用来表示管理员的权限;另一个是 Bank,它就像我们的银行,用来存储代币。
管理员权限 AdminCap
public struct AdminCap has key {
id: UID
}
银行结构体 Bank
public struct Bank has key {
id: UID,
lizhecome: Balance<LIZHECOME_COIN>,
lizhecome_faucet: Balance<LIZHECOME_FAUCET_COIN>
}
接下来,我们来写一个初始化银行的函数,让银行正式“开门营业”。
fun init(ctx: &mut TxContext) {
let bank = Bank {
id: object::new(ctx),
lizhecome: balance::zero<LIZHECOME_COIN>(),
lizhecome_faucet: balance::zero<LIZHECOME_FAUCET_COIN>()
};
share_object(bank);
let admin_cap = AdminCap { id: object::new(ctx) };
transfer(admin_cap, ctx.sender());
}
我们先来看看如何往银行里存钱(代币)。这部分由两个函数组成,分别是存入 LIZHECOME_COIN 和 LIZHECOME_FAUCET_COIN。
public entry fun deposit_lizhecome(_: &AdminCap, bank: &mut Bank, lizhecome: Coin<LIZHECOME_COIN>, _: &mut TxContext) {
let lizhecome_balance = coin::into_balance(lizhecome);
balance::join(&mut bank.lizhecome, lizhecome_balance);
}
public entry fun deposit_lizhecome_faucet(_: &AdminCap, bank: &mut Bank, lizhecome_faucet: Coin<LIZHECOME_FAUCET_COIN>, _: &mut TxContext) {
let lizhecome_faucet_balance = coin::into_balance(lizhecome_faucet);
balance::join(&mut bank.lizhecome_faucet, lizhecome_faucet_balance);
}
如果用户想要从银行里取代币,也有两个对应的函数:
public entry fun withdraw_lizhecome(_: &AdminCap, bank: &mut Bank, amount: u64, ctx: &mut TxContext) {
let lizhecome_balance = balance::split(&mut bank.lizhecome, amount);
let lizhecome = coin::from_balance(lizhecome_balance, ctx);
public_transfer(lizhecome, ctx.sender());
}
public entry fun withdraw_lizhecome_faucet(_: &AdminCap, bank: &mut Bank, amount: u64, ctx: &mut TxContext) {
let lizhecome_faucet_balance = balance::split(&mut bank.lizhecome_faucet, amount);
let lizhecome_faucet = coin::from_balance(lizhecome_faucet_balance, ctx);
public_transfer(lizhecome_faucet, ctx.sender());
}
终于到了重点,代币兑换功能!在这里,用户可以用 LIZHECOME_COIN 换 LIZHECOME_FAUCET_COIN,反之亦然。我们设定的兑换比例是 1:2,也就是 1 LIZHECOME_COIN 能换 2 LIZHECOME_FAUCET_COIN。
public entry fun swap_lizhecome_to_faucet(bank: &mut Bank, lizhecome: Coin<LIZHECOME_COIN>, ctx: &mut TxContext) {
let amount = coin::value(&lizhecome);
balance::join(&mut bank.lizhecome, coin::into_balance(lizhecome));
let amount_end = amount * 2;
let faucet = balance::split(&mut bank.lizhecome_faucet, amount_end);
public_transfer(coin::from_balance(faucet, ctx), ctx.sender());
}
public entry fun swap_faucet_to_lizhecome(bank: &mut Bank, lizhecome_faucet: Coin<LIZHECOME_FAUCET_COIN>, ctx: &mut TxContext) {
let amount = coin::value(&lizhecome_faucet);
balance::join(&mut bank.lizhecome_faucet, coin::into_balance(lizhecome_faucet));
let amount_end = amount / 2;
let lizhecome = balance::split(&mut bank.lizhecome, amount_end);
public_transfer(coin::from_balance(lizhecome, ctx), ctx.sender());
}
通过这个模块,我们轻松实现了:
这个模块为我们打造了一个简易的“代币兑换所”,让用户可以在两种代币之间自由转换。这样的小功能,在日常的 DeFi 应用中非常实用。学会了这些,你就可以开始构建自己的智能合约,实现更多有趣的金融功能啦!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!