Sui Move 学习:Task 5 Swap

  • EGAL
  • 更新于 2024-11-13 21:25
  • 阅读 411

这次的task5是完成一个Swap的上链部署。

这次的 task5 是完成一个Swap的上链部署

如需转载,请联系作者

交换task2中铸造的两个coin ,后续用A代指 FUNNYYANNE COIN,B 代指FUNNYYANNE_FAUCET_COIN

1.查看余额 sui client balance ,也可以使用 sui client balance --with-coins 查看该钱包地址coin的详细信息。

image.png

2.查看coin A

sui client object 0xa7824ffbe6e1d0fc12915b9206a78a4343b0316c302d144e7a409bdfe1d6b969 --json

image 1.png

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> 

image 2.png

此时这两个coin已经加入流通池,被delete掉了。

image 3.png

用的这两个coin ,后续再查阅持有的coin 已经无法找到了。

image 4.png 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>

image 5.png

输出事件:

image 6.png

4.同理b换a

image 7.png

image 8.png

⚠️ 需要注意 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.png

关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
EGAL
EGAL
江湖只有他的大名,没有他的介绍。