这次的task5是完成一个Swap的上链部署。
这次的 task5 是完成一个Swap的上链部署
如需转载,请联系作者
交换task2中铸造的两个coin ,后续用A代指 FUNNYYANNE COIN,B 代指FUNNYYANNE_FAUCET_COIN
1.查看余额 sui client balance
,也可以使用 sui client balance --with-coins
查看该钱包地址coin的详细信息。
2.查看coin A
sui client object 0xa7824ffbe6e1d0fc12915b9206a78a4343b0316c302d144e7a409bdfe1d6b969 --json
3.加入流通池
public entry fun add_liquidity( pool: &mut Pool, coin_a: Coin<FUNNYYANNE_COIN>,coin_b:Coin<FUNNYYANNE_FAUCET_COIN>,ctx: &mut TxContext){
let a_amount = coin::value(&coin_a);
let b_amount = coin::value(&coin_b);
assert!(a_amount > 0 && b_amount > 0,E_ZERO_AMOUNT);
balance::join(&mut pool.coin_a, coin::into_balance(coin_a));
balance::join(&mut pool.coin_b, coin::into_balance(coin_b));
event::emit(LiquidityEvent
{
provider:tx_context::sender(ctx),
coin_a_amount: a_amount,
coin_b_amount: b_amount,
coin_a_type: string::utf8(b"FUNNYYANNE_COIN"),
coin_b_type: string::utf8(b"FUNNYYANNE_FAUCET_COIN"),
timestamp: tx_context::epoch(ctx),
})
}
sui client call --gas-budget 50000000 --package <packageid> --module swap --function add_liquidity --args <pool> <coin a> <coin b>
此时这两个coin已经加入流通池,被delete掉了。
用的这两个coin ,后续再查阅持有的coin 已经无法找到了。
3.swap A to B
public entry fun swap_a_to_b( pool: &mut Pool, coin_a_in:Coin<FUNNYYANNE_COIN>,ctx: &mut TxContext){
let a_amount = coin::value(&coin_a_in);
assert!(a_amount > 0,E_ZERO_AMOUNT);
let b_reserve = balance::value(&pool.coin_b);
assert!(b_reserve > 0, E_INSUFFICIENT_LIQUIDITY);
let a_reserve = balance::value(&pool.coin_a);
let b_out = (a_amount * b_reserve) / (a_reserve + a_amount);
assert!(b_out > 0 && b_out <= b_reserve, E_INSUFFICIENT_LIQUIDITY);
// change
balance::join(&mut pool.coin_a, coin::into_balance(coin_a_in));
let coin_b_out = coin::take(&mut pool.coin_b, b_out, ctx);
transfer::public_transfer(coin_b_out, tx_context::sender(ctx));
event::emit(SwapEvent {
sender: tx_context::sender(ctx),
coin_in_amount: a_amount,
coin_out_amount: b_out,
coin_in_type: string::utf8(b"FUNNYYANNE_COIN"),
coin_out_type: string::utf8(b"FUNNYYANNE_FAUCET_COIN"),
timestamp: tx_context::epoch(ctx),
});
}
sui client call --gas-budget 50000000 --package <packageid> --module swap --function swap_a_to_b --args <pool> <coin A>
输出事件:
4.同理b换a
⚠️ 需要注意 coin id 必须使用部署在相同环境下,同一个packageid 下铸造的coin 。
你可以 mint 一个 coin,把这个 coin 拆分多个进行测试,也可以 mint 多个 coins。
一个 coin 在一次函数调用就会被使用,然后 delete。引用的一个合约地址,指定了一个 packadeid 后,别的包铸造的coin会找不到。
触发类似这样的错误:
#Error 1 是引用了别的合约所铸造的coin id导致的
Error executing transaction '6mPBUnEyHm7TtkFxcYSQLavfoTsxn2rG6WbPZedJhXFP': CommandArgumentError { arg_idx: 1, kind: TypeMismatch } in command 0
#Error2 这个coin 已经被使用了。
Object 0xb2fd3e1ee9f5eedaa9b306e50dfb6dec23cb4a3dd02a2d79d2d0388ce8babda0 does not exist
关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!