این مقاله توضیح می دهد که چگونه می توان قیمت سواپ در 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 را نمایش می دهد.
ناحیه محصور شده زیر منحنی همان مقدار ثابت 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 برای نمایش مقدار توکن های واریز شده به استخر و برداشت شده از آن استفاده می کنیم.
اگر بخواهیم 25 ETH را با 25 USDC سواپ کنیم، در واقع 25 ETH به استخر واریز می کنیم و 25 USDC از آن برداشت می کنیم. در نتیجه، نقدینگی استخر به 125 ETH و 75 USDC تغییر می کند. اما AMM این سواپ را رد می کند، زیرا حاصل ضرب ثابت استخر پس از این سواپ کاهش پیدا می کند.
در این حالت، مقدار حاصل ضرب پس از سواپ کمتر از مقدار اولیه یعنی 10,000 می شود که این موضوع با قانون ثابت بودن حاصل ضرب مغایرت دارد. نمودار زیر این سواپ نامعتبر را به صورت بصری نمایش می دهد.
واضح است که نمی توان انتظار داشت 25 USDC برداشت کنیم. برای حفظ قانون ثابت بودن حاصل ضرب، باید مقدار کمتری برداشت کنیم.
تعیین مقدار صحیح USDC برای سواپ
برگردیم به مثال قبلی. وقتی 25 ETH به استخر اضافه می کنیم، مقدار ETH در استخر به 125 ETH (100 + 25) افزایش می یابد. حالا باید مقدار جدید و کاهش یافته USDC در استخر را محاسبه کنیم؛ مقداری که باعث می شود حاصل ضرب ثابت همچنان حفظ شود و در نتیجه AMM این سواپ را بپذیرد.
در اینجا یک معادله داریم که حداکثر مقدار ΔUSDC را که می توان در ازای 25 ETH برداشت کرد، مشخص می کند.
محاسبه ΔUSDC
برای محاسبه دقیق ΔUSDC، ابتدا باید معادله را بازنویسی کنیم تا بتوانیم مقدار ΔUSDC را به طور مستقیم به دست آوریم.
بعد از انجام این محاسبه، موجودی استخر به 125 ETH و 80 USDC تغییر می کند. در این حالت، حاصل ضرب ثابت استخر همچنان برابر با 10,000 باقی می ماند.
در نتیجه این محاسبه، می توان فهمید که حداکثر مقدار USDC که می توان در ازای 25 ETH برداشت کرد، برابر با 20 USDC است. این سواپ با موفقیت انجام می شود، چون قانون حاصل ضرب ثابت را رعایت می کند.
البته باید توجه کرد که 20 USDC یک پنجم کمتر از 25 USDC است. به همین دلیل، این سواپ شامل لغزش قیمتی (slippage) می شود. لغزش قیمتی به میزان تغییر قیمت در اثر معامله ما گفته می شود. اگر حجم معامله کمتر بود، قیمت نهایی به نسبت 1 USDC به 1 ETH نزدیک تر می ماند. اما چون معامله بزرگی انجام داده ایم، قیمت موثر افزایش یافته و مقدار USDC دریافتی کاهش یافته است. در نتیجه، میزان لغزش قیمتی نیز بیشتر شده است.
در نمودار زیر می توان این سواپ را به صورت بصری مشاهده کرد.
برای محاسبه مقدار توکنی که می توان از AMM برداشت کرد، از فرمول کلی زیر استفاده می کنیم:
در این فرمول:
-
x و y مقدار توکن ها در استخر پیش از سواپ هستند
-
Δx مقدار توکنی است که به AMM واریز می کنیم
-
Δy مقدار توکنی است که از AMM برداشت می کنیم
اشتباه در محاسبه سواپ: واریز بیش از حد به AMM
اگر مقدار کمتری برداشت کنید، مثلا 18 USDC، باز هم AMM این سواپ را می پذیرد. دلیل این پذیرش آن است که حاصل ضرب ثابت استخر نقدینگی افزایش پیدا می کند. اما در این حالت شما ضرر می کنید، چون حداکثر مقدار ممکن برای سواپ را استفاده نکرده اید.
محاسبه قیمت سواپ در 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، به نتیجه زیر می رسیم:
با در نظر گرفتن کارمزد 0.3 درصد، حداکثر مقدار USDC قابل برداشت از AMM حدود 19.952 USDC خواهد بود. این مقدار کمتر از 20 USDC است که در مثال بدون کارمزد دریافت می شد.
تفاوت اصلی هنگام در نظر گرفتن کارمزد این است که مقدار واریزی توکن در 99.7 درصد ضرب می شود و 0.3 درصد آن به AMM اختصاص داده می شود.
اگر Δx مقدار توکن واریزی و Δy مقدار توکن برداشت شده باشد، معادله کلی به شکل زیر بیان می شود:
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۳ خرداد ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس