آموزش محاسبه قیمت سواپ در Uniswap V2

این مقاله توضیح می دهد که چگونه می توان قیمت سواپ در Uniswap V2 را برای یک جفت معاملاتی در یک بازارساز خودکار (AMM) محاسبه کرد. به عبارت دیگر، پاسخ می دهد که “چند توکن X را می توان با توکن Y از طریق AMM مبادله کرد؟”

در Uniswap V2، پیش از اجرای تابع swap()، باید مقدار توکن هایی که قصد دارید از استخر نقدینگی مبادله کنید را از قبل محاسبه کنید. این محاسبه باید کارمزد 0.3 درصدی تراکنش را نیز در نظر بگیرد.

برای مثال، فرض کنید یک جفت معاملاتی ETH / USDC داریم که در استخر نقدینگی آن 100 ETH و 100 USDC وجود دارد. برای ساده تر شدن مثال، فرض می کنیم قیمت 1 ETH معادل 1 USDC است.

با وجود این که قیمت لحظه ای (spot price) یک ETH برابر با یک USDC است، اما این به آن معنا نیست که می توانیم به راحتی 25 USDC را با 25 ETH مبادله کنیم. چنین مبادله ای باعث می شود فرمول ثابت حاصل ضرب (constant product formula) که تعادل استخر را حفظ می کند، بر هم بخورد.

تئوری فرمول حاصل ضرب ثابت: x * y ≥ k

فرمول حاصل ضرب ثابت بیان می کند که در یک استخر شامل جفت توکن X و توکن Y، حاصل ضرب مقدار این دو دارایی در استخر (X ضربدر Y) باید همواره دست کم برابر با یک مقدار ثابت باقی بماند.

فرمول حاصل ضرب ثابت یک رابطه معکوس میان دو توکن ایجاد می کند و به این ترتیب رفتار عرضه و تقاضای بازار را شبیه سازی می کند. زمانی که مقدار یکی از توکن ها افزایش یابد (با واریز به AMM)، مقدار توکن دیگر باید کاهش پیدا کند (با برداشت از قرارداد AMM).

اگر متغیرها را مطابق معادله زیر بازنویسی کنیم، این رابطه معکوس به شکل واضح تری دیده می شود.

حالا مثال فعلی خودمان را در قالب این فرمول قرار می دهیم:

محور x = 100 ETH
محور y = 100 USDC
k = 10,000 (حاصل ضرب 100 ETH در 100 USDC)
خط صورتی (Pink Line) منحنی x * y ≥ 10,000 را نمایش می دهد.

این تصویر نموداری را نشان می‌دهد که رابطه بین ETH و USDC را با معادله xy ≥ k xy≥k نشان می‌دهد. مختصات (x=100، y=100) مربعی را روی نمودار تشکیل می‌دهند که مساحت زیر آن - 10000 واحد مربع - نشان دهنده ثابت k است.

ناحیه محصور شده زیر منحنی همان مقدار ثابت k است که برابر با حاصل ضرب x و y می باشد.

در ادامه نشان خواهیم داد که چگونه می توان ETH را به USDC مبادله کرد به گونه ای که این مقدار ثابت حفظ شود.

پیاده سازی فرمول حاصل ضرب ثابت در Uniswap

در عمل، این فرمول به این صورت پیاده سازی می شود که حاصل ضرب مقادیر استخر نقدینگی را پیش و پس از انجام معامله با یکدیگر مقایسه می کنند تا اطمینان حاصل شود که این مقدار دست کم ثابت باقی مانده است.

Uniswap شما را از واریز بیش از حد توکن به AMM محدود نمی کند. اگر این اتفاق بیفتد، مسئولیت آن بر عهده خود شماست، زیرا میزان قابل برداشت را کمتر از واقعیت برآورد کرده اید. به همین دلیل از علامت ≤ در معادله استفاده می شود.

اگر معادله بالا را بازنویسی کنیم، به معادله معادل زیر می رسیم:

  • x_Before و y_Before به ترتیب مقدار هر یک از توکن ها در استخر پیش از انجام سواپ را نشان می دهند.
  • x_After و y_After نیز مقدار توکن ها در استخر پس از انجام سواپ را مشخص می کنند.

این یعنی پس از مبادله ETH با USDC، حاصل ضرب ثابت استخر باید حداقل به همان مقدار قبلی باقی بماند.

در Uniswap V2 برای هر سواپ، کارمزد معاملاتی 0.3 درصدی در AMM اعمال می شود. با در نظر گرفتن این کارمزد، حاصل ضرب ثابت استخر نقدینگی با هر بار سواپ افزایش پیدا می کند. این افزایش حجم استخر، همان انگیزه اصلی برای تامین کنندگان نقدینگی محسوب می شود. تنها زمانی که تامین کنندگان نقدینگی سرمایه خود را از استخر خارج کنند، مقدار ثابت استخر کاهش خواهد یافت. در ادامه این مقاله، نحوه محاسبه سواپ همراه با در نظر گرفتن کارمزد معاملاتی را نیز توضیح خواهیم داد.

چرا نمی توانیم 25 ETH را با 25 USDC مبادله کنیم؟

برای اینکه بدانیم آیا یک سواپ معتبر است یا خیر، باید از پیش محاسبه کنیم که این سواپ چه تاثیری بر حاصل ضرب ثابت استخر خواهد داشت. آیا این مقدار حداقل ثابت باقی می ماند یا نه؟

در اینجا از نمادهای ΔETH و ΔUSDC برای نمایش مقدار توکن های واریز شده به استخر و برداشت شده از آن استفاده می کنیم.

در تصویر مربوطه، معادله حاصل ضرب ثابت برای استخر ETH و USDC به این صورت نمایش داده شده است:
x_after × y_after ≤ (x_before + ΔETH × (y_before + ΔUSDC که تغییرات مقادیر استخر را نشان می دهد.

اگر بخواهیم 25 ETH را با 25 USDC سواپ کنیم، در واقع 25 ETH به استخر واریز می کنیم و 25 USDC از آن برداشت می کنیم. در نتیجه، نقدینگی استخر به 125 ETH و 75 USDC تغییر می کند. اما AMM این سواپ را رد می کند، زیرا حاصل ضرب ثابت استخر پس از این سواپ کاهش پیدا می کند.

در تصویر مربوطه، مجموعه ای از معادلات نشان داده می شود که نحوه محاسبه حاصل ضرب ثابت یک استخر با 100 ETH و 100 USDC را پس از سواپ 25 ETH با 25 USDC نمایش می دهد.

در این حالت، مقدار حاصل ضرب پس از سواپ کمتر از مقدار اولیه یعنی 10,000 می شود که این موضوع با قانون ثابت بودن حاصل ضرب مغایرت دارد. نمودار زیر این سواپ نامعتبر را به صورت بصری نمایش می دهد.

در انیمیشن GIF، نمودار معادله نامعتبر حاصل ضرب ثابت نمایش داده می شود:
100 ETH × 100 USDC ≤ 125 ETH × 75 USDC.

واضح است که نمی توان انتظار داشت 25 USDC برداشت کنیم. برای حفظ قانون ثابت بودن حاصل ضرب، باید مقدار کمتری برداشت کنیم.

تعیین مقدار صحیح USDC برای سواپ

برگردیم به مثال قبلی. وقتی 25 ETH به استخر اضافه می کنیم، مقدار ETH در استخر به 125 ETH (100 + 25) افزایش می یابد. حالا باید مقدار جدید و کاهش یافته USDC در استخر را محاسبه کنیم؛ مقداری که باعث می شود حاصل ضرب ثابت همچنان حفظ شود و در نتیجه AMM این سواپ را بپذیرد.

تعیین مقدار صحیح USDC برای سواپ
برگردیم به مثال قبلی. وقتی 25 ETH به استخر اضافه می کنیم، مقدار ETH در استخر به 125 ETH (100 + 25) افزایش می یابد. حالا باید مقدار جدید و کاهش یافته USDC در استخر را محاسبه کنیم؛ مقداری که باعث می شود حاصل ضرب ثابت همچنان حفظ شود و در نتیجه AMM این سواپ را بپذیرد.

(در تصویر، معادله به این صورت نمایش داده شده است:
100 ETH × 100 USDC ≤ 125 ETH × (100 USDC - ΔUSDC).)

در اینجا یک معادله داریم که حداکثر مقدار ΔUSDC را که می توان در ازای 25 ETH برداشت کرد، مشخص می کند.

در اینجا یک معادله داریم که حداکثر مقدار ΔUSDC را که می توان در ازای 25 ETH برداشت کرد، مشخص می کند.

محاسبه ΔUSDC

برای محاسبه دقیق ΔUSDC، ابتدا باید معادله را بازنویسی کنیم تا بتوانیم مقدار ΔUSDC را به طور مستقیم به دست آوریم.

این بازنویسی به این صورت نشان داده شده است:
100 ETH × 100 USDC ≤ 125 ETH × (100 USDC - ΔUSDC)
که بازنویسی می شود به:
ΔUSDC ≤ 100 USDC - ((100 ETH × 100 USDC) / 125 ETH).

تصویر یک سری حل معادله برای ΔUSDC.

بعد از انجام این محاسبه، موجودی استخر به 125 ETH و 80 USDC تغییر می کند. در این حالت، حاصل ضرب ثابت استخر همچنان برابر با 10,000 باقی می ماند.

در معادله نشان داده شده:
100 ETH × 100 USDC ≤ 125 ETH × 80 USDC
و همچنین: 10,000 ≤ 10,000

در نتیجه این محاسبه، می توان فهمید که حداکثر مقدار USDC که می توان در ازای 25 ETH برداشت کرد، برابر با 20 USDC است. این سواپ با موفقیت انجام می شود، چون قانون حاصل ضرب ثابت را رعایت می کند.

البته باید توجه کرد که 20 USDC یک پنجم کمتر از 25 USDC است. به همین دلیل، این سواپ شامل لغزش قیمتی (slippage) می شود. لغزش قیمتی به میزان تغییر قیمت در اثر معامله ما گفته می شود. اگر حجم معامله کمتر بود، قیمت نهایی به نسبت 1 USDC به 1 ETH نزدیک تر می ماند. اما چون معامله بزرگی انجام داده ایم، قیمت موثر افزایش یافته و مقدار USDC دریافتی کاهش یافته است. در نتیجه، میزان لغزش قیمتی نیز بیشتر شده است.

در نمودار زیر می توان این سواپ را به صورت بصری مشاهده کرد.

در انیمیشن GIF، معادله معتبر به شکل زیر نمایش داده می شود:
100 ETH × 100 USDC ≤ 125 ETH × 80 USDC.

برای محاسبه مقدار توکنی که می توان از AMM برداشت کرد، از فرمول کلی زیر استفاده می کنیم:

تصویر فرمول تعمیم‌یافته برای یافتن کمیت y که می‌توانیم آن را با x جابجا کنیم. Δy ≤ x - (xy/(x+Δx))

در این فرمول:

  • x و y مقدار توکن ها در استخر پیش از سواپ هستند

  • Δx مقدار توکنی است که به AMM واریز می کنیم

  • Δy مقدار توکنی است که از AMM برداشت می کنیم

اشتباه در محاسبه سواپ: واریز بیش از حد به AMM

اگر مقدار کمتری برداشت کنید، مثلا 18 USDC، باز هم AMM این سواپ را می پذیرد. دلیل این پذیرش آن است که حاصل ضرب ثابت استخر نقدینگی افزایش پیدا می کند. اما در این حالت شما ضرر می کنید، چون حداکثر مقدار ممکن برای سواپ را استفاده نکرده اید.

در تصویر، معادله محاسبه حاصل ضرب ثابت استخر به این صورت نمایش داده شده است:
100 ETH × 100 USDC ≤ 125 ETH × (100 - 18 USDC)
که در نهایت به:
10,000 ≤ 10,250
منجر می شود.

محاسبه قیمت سواپ در Uniswap V2 به همراه کارمزد

محاسباتی که تا اینجا انجام دادیم “نظری” بودند و کارمزد معامله را در نظر نمی گرفتند. همان طور که قبلا اشاره شد، در Uniswap V2 برای هر سواپ، کارمزد معاملاتی 0.3 درصد اعمال می شود.
این کارمزد فقط از توکنی که به AMM واریز می شود کسر می گردد. به عنوان مثال، اگر توکن X را با توکن Y سواپ کنیم، تنها از X کارمزد 0.3 درصد کم می شود، نه از Y.

درک نحوه اعمال این کارمزد یکی از نکات کلیدی در برنامه نویسی قراردادهای هوشمند به شمار می رود، زیرا محاسبه صحیح آن برای توسعه عملکرد دقیق سواپ‌ها در پروتکل‌های دیفای ضروری است.

روش محاسبه این 0.3 درصد در Uniswap V2 به این صورت است که توکن واریزی به دو بخش تقسیم می شود:

  • کارمزد: 0.3 درصد

  • مقدار قابل استفاده برای سواپ: 99.7 درصد

برای مثال، اگر 25 ETH واریز کنیم، کارمزد و مقدار باقی مانده به این صورت خواهد بود:

  • کارمزد (0.3 درصد): 0.075 ETH

  • مقدار قابل استفاده برای سواپ (99.7 درصد): 24.925 ETH

این مقدار کارمزد (0.075 ETH) به طور مستقیم از محاسبه سواپ کنار گذاشته می شود و به سواپ کننده تعلق نمی گیرد.

بنابراین، مقدار واقعی که برای سواپ استفاده می شود 24.925 ETH است. این همان مقداری است که در ازای آن USDC از استخر برداشت خواهیم کرد.

محاسبه حداکثر مقدار USDC قابل برداشت

برای محاسبه بیشترین مقدار USDC (ΔUSDC) که می توان برداشت کرد، 24.925 ETH را به استخر اضافه می کنیم. در این حالت مقدار ETH در استخر به 124.925 ETH می رسد.

تصویر معادله فرمول حاصلضرب ثابت. این فرمول اضافه شدن ۲۴.۹۲۵ اتریوم به استخر را نشان می‌دهد، در حالی که تغییر در USDC (ΔUSDC) همچنان یک متغیر ناشناخته است.

با حل معادله برای ΔUSDC، به نتیجه زیر می رسیم:

در تصویر مجموعه ای از معادلات نمایش داده می شود که محاسبه ΔUSDC را برای حالتی که 24.925 ETH در یک استخر با 100 ETH و 100 USDC سواپ می شود، نشان می دهد.

با در نظر گرفتن کارمزد 0.3 درصد، حداکثر مقدار USDC قابل برداشت از AMM حدود 19.952 USDC خواهد بود. این مقدار کمتر از 20 USDC است که در مثال بدون کارمزد دریافت می شد.

تفاوت اصلی هنگام در نظر گرفتن کارمزد این است که مقدار واریزی توکن در 99.7 درصد ضرب می شود و 0.3 درصد آن به AMM اختصاص داده می شود.

اگر Δx مقدار توکن واریزی و Δy مقدار توکن برداشت شده باشد، معادله کلی به شکل زیر بیان می شود:

در تصویر، معادله کلی برای محاسبه Δy (مقدار توکن برداشت شده از استخر) با توجه به واریز Δx به استخر نمایش داده می شود.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

دوره صفر تا صد آموزش بین المللی لینوکس
  • انتشار: ۱۳ خرداد ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید