Let's Move は、より多くの人々が Move 言語を学ぶことを奨励する SUI のインセンティブプログラムです。
学習ログ (alva-lin)
タスク 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 を事前に鋳造します。テスト用のため、2 つのトークンの 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 |
トークン価値の変化もトークンの上昇と下降に一致しています。