大家好,又来做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 应用中非常实用。学会了这些,你就可以开始构建自己的智能合约,实现更多有趣的金融功能啦!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!