Alva

Alva

programmer
github
telegram
email

Let's Move - 学 Move 得 Sui(五):完成一个 Swap 的上链部署

letsmove

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 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

トークン価値の変化もトークンの上昇と下降に一致しています。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。