swap時の手数料を理解しよう
🐣 swap 時の手数料について理解しましょう
前回のレッスンでは、swap時にどのような計算によってプールで増減するトークンの量を求めるのかを考えました。
このレッスンではユーザのswap時に手数料を設ける方法について考えます。
ポイントは以下です。
swapを要求するユーザがプールに送信するトークンの量を、AMM内部では少しだけ少なく見積もった量に変換してからswapの計算をします。
今回は0.3% だけ少なく見積ります。
具体例で考えてみましょう。
🦴 状況
プールにはトークンX、Yがそれぞれ10,000
ずつあるとします。
ユーザAがX -> Yへ量 1,000
をswapします。
前回のレッスンのシチュエーション 1
で導き出した式
を使用すると、
- y': swapにより得られるYの量
- y :
10,000
- x':
1,000
- x :
10,000
となります。
🐟 手数料を考慮しない場合
プール内のXは1,000増えます。 Yは909減ります。
プール内のトークンX、Yの量はそれぞれ11,000
、9,091
となります。
🐿️ 手数料を考慮する場合
ユーザはXの量に1,000
を指定してswapを実行しますが、
AMMの内部では1,000
から0.3% の3を引いて997
で計算をします。
プール内のXは1,000増えます。 Yは906減ります。
プール内のトークンX、Yの量はそれぞれ11,000
、9,094
となります。
手数料を考慮しない場合に比べて、 ユーザが受け取れるトークンYの量は減り プールに残るYの量は増えます。
Y -> Xへswapをするとこれと逆のことが起こります。
手数料を考慮しない場合に比べて、 ユーザが受け取れるトークンXの量は減り プールに残るYの量は増えます。
手数料を考慮してswapを繰り返すとプール内のトークン量は、 流動性の提供によって預けられたトークンの量に加え、swap時にユーザから引いた手数料の量が上乗せされていきます。
すると流動性の提供者がプールから自分のシェアの分トークンを引き出す際、プール内のトークンの絶対量は提供時 に比べて増えているので、 シェアに相当するトークンの量も増えます。
このようにしてswapによって得られた手数料を流動性の提供者は得られるという仕組みになっています。
🐔 手数料を考慮した計算式を導きましょう
手数料の仕組みについて理解したので、前回のレッスンで得られた計算式を手数料を考慮した計算式に変形します。
🦕 シチュエーション1: x' からy' を算出する
元の式は以下です。
x'に関して、0.3% 引いた0.997x' とすれば良いのですが、
後にsolidityで実装する際に小数を扱えないことに備えて
全ての値に1,000
をかけて3桁分繰り上げましょう。
両辺を1,000
で割ると以下の式が導き出せます。
🐬 シチュエーション2: y' からx' を算出する
元の式は以下です。
先ほどと同じようにx' から0.3% 引き、全ての値を3桁分繰り上げると以下のような形になります。
右辺は分母と分子をそれぞれ1,000
で割ると
となり、両辺を997
で割ると
x'について式が導き出せました。
ここで算出した計算式をAMMコントラクト内で実装していきます。
🙋♂️ 質問する
ここまでの作業で何かわからないことがある場合は、Discordの#avalanche
で質問をしてください。
ヘルプをするときのフローが円滑になるので、エラーレポートには下記の3点を記載してください ✨
1. 質問が関連しているセクション番号とレッスン番号
2. 何をしようとしていたか
3. エラー文をコピー&ペースト
4. エラー画面のスクリーンショット
次のレッスンでコントラクトにswap機能を実装し、コントラクトを完成させましょう! 🎉