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 A | Coin B |
---|---|---|
Wallet | 2.503 | 20.015 |
Pool | 1.497 | 19.985 |
兩個代幣的比例從 1:10 變為 1:13.35,Coin A 相對升值,Coin B 相對貶值。
代幣價值上,錢包的代幣價值是 4 CoinA(或是 40 Coin B)
代幣價值 | Coin A 角度 | Coin B 角度 |
---|---|---|
Wallet | 3.993 | 53.43 |
代幣價值變化也符合代幣漲跌。