در این مقاله با کتابخانه UniswapV2 و نقش کلیدی آن در اجرای دقیق معاملات در یونی سواپ آشنا میشویم. اگر میخواهید بدانید چطور میتوان قبل از انجام سواپ، مقدار توکنهای ورودی و خروجی را محاسبه کرد یا مسیر بهینه سواپها را بررسی نمود، این راهنما برای شماست. در ادامه، تمام توابع مهم این کتابخانه مثل getAmountOut
، getAmountsIn
، quote
، getReserves
و دیگر ابزارهای تحلیلی را به زبان ساده بررسی خواهیم کرد.
کتابخانه Uniswap V2
کتابخانه Uniswap V2 اجرای برخی تعاملات با قراردادهای جفت را سادهتر میکند. قراردادهای Router به صورت گسترده از این کتابخانه استفاده میکنند.
این ابزار شامل هشت تابع است که هیچ تغییری در وضعیت قرارداد ایجاد نمیکنند. برنامهنویسان میتوانند از این توابع برای اتصال مستقیم قرارداد هوشمند خود به Uniswap V2 استفاده کنند.
تابع های getAmountOut()
و getAmountIn()
اگر بخواهیم مقدار توکن y را که در ازای ارائه مقدار مشخصی از توکن x دریافت میکنیم پیشبینی کنیم، میتوانیم از فرمول زیر برای محاسبه مقدار خروجی استفاده کنیم (برای سادهسازی، کارمزدها را نادیده میگیریم).
در این حالت، توکن x به عنوان توکن ورودی (incoming token)، توکن y به عنوان توکن خروجی (outgoing token)، Δx به عنوان مقدار واردشده و Δy به عنوان مقدار خارجشده در نظر گرفته میشوند.
با در نظر گرفتن توضیحات قبلی، تابع getAmountOut()
در فایل UniswapV2Library.sol
باید کاملاً قابل درک باشد. در این تابع، همه مقادیر عددی با ضریب ۱۰۰۰ مقیاسگذاری شدهاند تا کارمزد ۰.۳ درصد به درستی محاسبه شود. محاسبه دقیق تابع getAmountIn()
به همراه در نظر گرفتن کارمزد، به عنوان تمرینی برای خواننده در نظر گرفته شده است.
اتصال زنجیرهای getAmountOut به getAmountsOut برای مسیرهای چند جفت توکن
توابع getAmountsOut() و getAmountsIn() در کتابخانه UniswapV2
اگر معاملهگر چند جفت توکن مانند (A, B)، (B, C)، (C, D) را پشت سر هم مشخص کند و تابع getAmountOut
را به ترتیب اجرا کند، میتواند مقدار نهایی توکن D را که دریافت خواهد کرد پیشبینی کند. این فرآیند با مقدار مشخصی از توکن A شروع میشود و در هر مرحله، مقدار خروجی، ورودی مرحله بعدی را تشکیل میدهد.
هر جفت توکن مانند (A, B) یا (B, C) دارای آدرس قراردادی مشخصی است. این آدرسها با استفاده از تابع create2
و بر پایه آدرس دو توکن و آدرس factory (کارخانهای که جفتها را ایجاد میکند) بهدست میآیند. تابع pairFor()
این آدرسها را با کمک تابع کمکی sortTokens()
محاسبه میکند. این تابع توکنها را به ترتیب خاصی مرتب میکند تا نتیجه نهایی دقیق باشد.
با استفاده از توابع بالا، توسعهدهنده میتواند آدرس همه جفتهای توکن را بهدست بیاورد. سپس میتواند ذخایر هر استخر را از قرارداد مربوطه دریافت کند و مقدار توکن دریافتی در پایان مسیر را محاسبه کند. تابع getAmountsOut()
این محاسبه را برای تمام مراحل انجام میدهد. دقت کنید که نام این تابع به صورت جمع نوشته شده است (Amounts). تابع getAmountsIn()
هم همین مسیر را در جهت عکس محاسبه میکند، بنابراین در اینجا نیازی به نمایش آن نیست.
به چند نکته مهم دقت کنید:
- قرارداد هوشمند خودش نمیتواند بهصورت خودکار بهترین ترتیب جفتهای توکن را پیدا کند. برای انجام محاسبه روی زنجیرهای از مبادلات، باید فهرست دقیق جفتها را به آن بدهید. این کار معمولاً بهتر است خارج از زنجیره (off-chain) انجام شود.
- تابع
getAmountsOut
فقط مقدار نهایی توکن خروجی را برنمیگرداند. این تابع مقدار خروجی در هر مرحله از مسیر مبادله را نیز مشخص میکند و به صورت یک آرایه کامل ارائه میدهد.
تابع getReserves() در کتابخانه UniswapV2
تابع getReserves
در کتابخانه UniswapV2 فقط یک پوشش ساده (wrapper) برای همان تابع در قرارداد جفت Uniswap V2 است، با این تفاوت که timestamp مربوط به آخرین بهروزرسانی قیمت را از خروجی حذف میکند. این تابع بهصورت خلاصه، تنها مقادیر ذخیرهشده از دو توکن را برمیگرداند.
برای درک بهتر عملکرد این تابع، نسخه اصلی آن از داخل قرارداد جفت نیز در مستندات نمایش داده شده است تا امکان مقایسه مستقیم فراهم شود. در آن نسخه، میتوانید تفاوتها را بهوضوح ببینید (در توضیحات با رنگ بنفش مشخص شدهاند).
عملکرد اصلی تابع:
تابع quote() کتابخانه UniswapV2
برای محاسبه قیمت یک دارایی، باید از فرمول زیر استفاده کنیم:
این تابع قیمت توکن foo
را بر حسب توکن bar
، بر اساس آخرین بهروزرسانی ذخایر، محاسبه و برمیگرداند. با وجود کاربرد بالای این تابع، استفاده از آن نیاز به دقت دارد، چرا که در برابر حملات وام سریع (flash loan attacks) آسیبپذیر است. به همین دلیل نباید صرفاً به این خروجی در شرایط حساس اعتماد کامل داشت.
استفاده از کتابخانه UniswapV2
اگر قصد دارید مقدار توکنی را که باید وارد معامله کنید یا انتظار دارید در خروجی دریافت کنید محاسبه کنید—چه برای یک مبادله ساده و چه برای یک زنجیره از سواپهای متوالی بین جفتهای مختلف—کتابخانه UniswapV2Library
بهترین ابزار برای انجام این پیشبینیها است. این کتابخانه مجموعهای از توابع دقیق و کاربردی را فراهم کرده که به توسعهدهندهها کمک میکند بدون نیاز به اجرای واقعی تراکنش، نتایج معاملات احتمالی را محاسبه کنند.
در بسیاری از مسیرهای آموزش برنامه نویسی قراردادهای هوشمند، استفاده از این کتابخانه به عنوان پایهای برای درک منطق تبادل غیرمتمرکز توصیه میشود، زیرا توابع آن امکان پیشبینی دقیق نتایج هر معامله را فراهم میکنند.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۲۲ خرداد ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++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
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس