Alva

Alva

programmer
github
telegram
email

讓我們移動 - 學 Move 得 Sui(五):完成一個 Swap 的上鏈部署

letsmove

Let's Move 是一項學習 Move 語言的激勵計畫,鼓勵更多的人學習 Move 語言

學習日誌 (alva-lin)

Task 5 - 完成一個 Swap 的上鏈部署 (mainnet)#

任務

  • 完成 Swap 相關知識的學習

  • 完成第一個 Swap 合約的上鏈部署

關於 Swap 的概念,不做過多贅述,本文主要講解發布包後的操作

本文代碼位於 new_swap 中,可自行下載。

代碼包含了兩個初始代幣 COIN_A 和 COIN_B,方便測試,以及一個 Simple_Swap 合約。

代碼參考了 pool.move - sui program examples

發布包#

將網絡切換至主網,然後發布包

sui client switch --env mainnet

sui client publish --gas-budget 200000000

在得到的交易結果中,找到 Package ID,Coin_A 的 TreasuryCap ID 和 Coin_B 的 TreasuryCap ID,將其導出到環境變量。
同時將自己的錢包地址也導出為變量。

export PACKAGE_ID=0xfac346bf4cbd8284cc76e76981abc9b30c0f2398cde2913e7b21ead99d1f6536
export COIN_A=$PACKAGE_ID::coin_a::COIN_A
export COIN_B=$PACKAGE_ID::coin_b::COIN_B

export COIN_A_TREASURY_CAP_ID=0xe5636992dde57ee943689be2b4377711e399a5af28c6572c12b114895769e219
export COIN_B_TREASURY_CAP_ID=0x7e29738f66374d2f15a83fe4e93c1f6c114e6fb75367d34438164f16b2c6376c

export ADDRESS=<your wallet address>

鑄幣#

提前鑄造不同數值的 COIN_A 和 COIN_B,因為僅作測試使用,所以兩個代幣的 decimals 設置為 3,方便後續識別。

# mint COIN_A
# 根據需要,可以多次少量鑄幣,方便後續調用
sui client call --gas-budget 7500000 --package $PACKAGE_ID --module coin_a --function mint --args $COIN_A_TREASURY_CAP_ID 1000 $ADDRESS

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module coin_b --function mint --args $COIN_B_TREASURY_CAP_ID 10000 $ADDRESS

將輸出記錄下來

# 1 coin A
export COIN_A_ID_1=0x588a71ce52b95ec891e8c7593994ca1b34f85c24ca5791a5f88f43a5cda4dd62
export COIN_A_ID_2=0x969d24aa2d4f193448026c7e579e189702320c05a54f201c96dfdaf4f04a0a6f
export COIN_A_ID_3=0x6e768e76b28d7edda8dbfe37d9f7bcfe370645259cdccf0661164b712e0d1ab8
export COIN_A_ID_4=0x5c8e764c236e1ce80119d13d0b1744fa7df652e3664498bb413af2ab3ba2bf5c

# 10 coin B
export COIN_B_ID_1=0x2d6b2436b534e49edfd235fb9a1f9db393d1f7f2d0bb63199cf7c9d0a4b0ac22
export COIN_B_ID_2=0xb8ac379c3fc2238f5cee0e6a8ad2bfab82c01b841869ee8d4817d499aaf5cb7e
export COIN_B_ID_3=0xcfb9b7dc4488bcd40a242189dbed996b9aa401431fa9824a5756ed1ee822239f
export COIN_B_ID_4=0xbf5d27d4024ba6572aea61a60f16324778a8d2f63b99920e64514be6696d2d38

構建流動性池#

將前面鑄造的 coin a 1 和 coin b 1 拿來構建流動性池

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function create_pool --type-args $COIN_A $COIN_B \
    --args $COIN_A_ID_1 $COIN_B_ID_1

在輸出的內容中,找到 Pool ID 和發放給我們的 LSP ID

export POOL_ID=0x50cdc0af15ceb8b660d15e843579587699c27c86868dc49e3945e2f73b546118
export LSP_ID_1=0x597a50ce6afacc3d26236ab52aab4342dc258554fe1520412e20675ffd7df9b6

我們可以根據 Pool ID,在 SuiScan 瀏覽器中查看流動性池的相關信息

url: https://suiscan.xyz/mainnet/object/0x50cdc0af15ceb8b660d15e843579587699c27c86868dc49e3945e2f73b546118

添加流動性#

將前面鑄造的 coin a 2 和 coin b 2 拿來添加流動性

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function add_liquidity --type-args $COIN_A $COIN_B \
    --args $POOL_ID $COIN_A_ID_2 $COIN_B_ID_2

拿到發放的第二個 LSP 代幣

export LSP_ID_2=0x076230c8207d445f3eb1cf43cd3415304de9721f8ab9940f6127f90a6650ea31

同時查看前後兩個 LSP 代幣的值,都是一樣的(3100)

此時我們再次添加等額的流動性

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function add_liquidity --type-args $COIN_A $COIN_B \
    --args $POOL_ID $COIN_A_ID_3 $COIN_B_ID_3

拿到第三枚 LSP 代幣

export LSP_ID_3=0xe44da8865c2b3cd79a5a28fe98706f91c35b7e719f80b71d39624291320d23e2

減少流動性#

拿出第三枚 LSP 代幣,減少流動性,查看運行結果

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function remove_liquidity --type-args $COIN_A $COIN_B \
    --args $POOL_ID $LSP_ID_3

拿到了等值的 COIN A 代幣和 COIN B 代幣,將其記錄

# 1 coin A
export COIN_A_ID_5=0x0c0fd563d78f58b8ffa6fa21d4a9b75bb11c53cee468201e4c86632271a7008c

# 10 coin B
export COIN_B_ID_5=0xe1565ef7e7bd4569a589242b4393235ba877f488f1ca00231688c8119050d62a

Swap#

此時流動性池子內的代幣數量如下

  • Coin A: 2

  • Coin B: 20

Coin A : Coin B = 1:10

使用 Coin A 交易 Coin B#

拿出第四枚代幣 Coin A,向流動性池子發起交易

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function swap_a_to_b --type-args $COIN_A $COIN_B \
    --args $POOL_ID $COIN_A_ID_4

可以看到交易結果,我們使用 1 個 Coin A,購買到了 10.015 個 Coin B。將其記錄

# 10.015 coin B
export COIN_B_ID_6=0xdccf55457cf82b6b8a14f6627002fc83a4c4456ccfa1ca16bf8164ea7b3e9db7

而回到流動性池的信息中,還剩下 3 個 Coin A,和 9.985 個 Coin B。

使用 Coin B 交易 Coin A#

拿出第四枚代幣 Coin B,向流動性池子發起交易

sui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_swap \
    --function swap_b_to_a --type-args $COIN_A $COIN_B \
    --args $POOL_ID $COIN_B_ID_4

可以看到交易結果,我們使用 10 個 Coin B,購買到了 1.503 個 Coin A。將其記錄

# 1.503 coin A
export COIN_A_ID_6=0x33ab32733faaa4a8985ccba27692fbf466d54ee854ef919d1d5ae52b444a23dc

而回到流動性池的信息中,還剩下 1.497 個 Coin A,和 19.985 個 Coin B。


統計結果#

最開始,錢包和池內的代幣資金都是 2 Coin A, 20 Coin B。

經過兩次交易,錢包和流動性池內的資金變化如下

代幣數量Coin ACoin B
Wallet2.50320.015
Pool1.49719.985

兩個代幣的比例從 1:10 變為 1:13.35,Coin A 相對升值,Coin B 相對貶值。

代幣價值上,錢包的代幣價值是 4 CoinA(或是 40 Coin B)

代幣價值Coin A 角度Coin B 角度
Wallet3.99353.43

代幣價值變化也符合代幣漲跌。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。