آموزش کامل کتابخانه UniswapV2 و توابع کلیدی آن

در این مقاله با کتابخانه 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 و getAmountIn

اتصال زنجیره‌ای getAmountOut به getAmountsOut برای مسیرهای چند جفت توکن

توابع getAmountsOut() و getAmountsIn() در کتابخانه UniswapV2

اگر معامله‌گر چند جفت توکن مانند (A, B)، (B, C)، (C, D) را پشت سر هم مشخص کند و تابع getAmountOut را به ترتیب اجرا کند، می‌تواند مقدار نهایی توکن D را که دریافت خواهد کرد پیش‌بینی کند. این فرآیند با مقدار مشخصی از توکن A شروع می‌شود و در هر مرحله، مقدار خروجی، ورودی مرحله بعدی را تشکیل می‌دهد.

هر جفت توکن مانند (A, B) یا (B, C) دارای آدرس قراردادی مشخصی است. این آدرس‌ها با استفاده از تابع create2 و بر پایه آدرس دو توکن و آدرس factory (کارخانه‌ای که جفت‌ها را ایجاد می‌کند) به‌دست می‌آیند. تابع pairFor() این آدرس‌ها را با کمک تابع کمکی sortTokens() محاسبه می‌کند. این تابع توکن‌ها را به ترتیب خاصی مرتب می‌کند تا نتیجه نهایی دقیق باشد.

توابع pairFor و sortTokens

با استفاده از توابع بالا، توسعه‌دهنده می‌تواند آدرس همه جفت‌های توکن را به‌دست بیاورد. سپس می‌تواند ذخایر هر استخر را از قرارداد مربوطه دریافت کند و مقدار توکن دریافتی در پایان مسیر را محاسبه کند. تابع getAmountsOut() این محاسبه را برای تمام مراحل انجام می‌دهد. دقت کنید که نام این تابع به صورت جمع نوشته شده است (Amounts). تابع getAmountsIn() هم همین مسیر را در جهت عکس محاسبه می‌کند، بنابراین در اینجا نیازی به نمایش آن نیست.

به چند نکته مهم دقت کنید:

  • قرارداد هوشمند خودش نمی‌تواند به‌صورت خودکار بهترین ترتیب جفت‌های توکن را پیدا کند. برای انجام محاسبه روی زنجیره‌ای از مبادلات، باید فهرست دقیق جفت‌ها را به آن بدهید. این کار معمولاً بهتر است خارج از زنجیره (off-chain) انجام شود.
  • تابع getAmountsOut فقط مقدار نهایی توکن خروجی را برنمی‌گرداند. این تابع مقدار خروجی در هر مرحله از مسیر مبادله را نیز مشخص می‌کند و به صورت یک آرایه کامل ارائه می‌دهد.

تابع getAmountsOut

تابع getReserves() در کتابخانه UniswapV2

تابع getReserves در کتابخانه UniswapV2 فقط یک پوشش ساده (wrapper) برای همان تابع در قرارداد جفت Uniswap V2 است، با این تفاوت که timestamp مربوط به آخرین به‌روزرسانی قیمت را از خروجی حذف می‌کند. این تابع به‌صورت خلاصه، تنها مقادیر ذخیره‌شده از دو توکن را برمی‌گرداند.

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

کتابخانه uniswapV2، getreserve

عملکرد اصلی تابع:

هسته v2 getReserves

تابع quote() کتابخانه UniswapV2

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

تابع quote()

این تابع قیمت توکن foo را بر حسب توکن bar، بر اساس آخرین به‌روزرسانی ذخایر، محاسبه و برمی‌گرداند. با وجود کاربرد بالای این تابع، استفاده از آن نیاز به دقت دارد، چرا که در برابر حملات وام سریع (flash loan attacks) آسیب‌پذیر است. به همین دلیل نباید صرفاً به این خروجی در شرایط حساس اعتماد کامل داشت.

تابع quote() کتابخانه UniswapV2

استفاده از کتابخانه UniswapV2

اگر قصد دارید مقدار توکنی را که باید وارد معامله کنید یا انتظار دارید در خروجی دریافت کنید محاسبه کنید—چه برای یک مبادله ساده و چه برای یک زنجیره از سواپ‌های متوالی بین جفت‌های مختلف—کتابخانه UniswapV2Library بهترین ابزار برای انجام این پیش‌بینی‌ها است. این کتابخانه مجموعه‌ای از توابع دقیق و کاربردی را فراهم کرده که به توسعه‌دهنده‌ها کمک می‌کند بدون نیاز به اجرای واقعی تراکنش، نتایج معاملات احتمالی را محاسبه کنند.

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

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

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

پکیج جامع و پروژه محور ASP.NET MVC + طراحی فروشگاه اینترنتی فروش فایل
  • انتشار: ۲۲ خرداد ۱۴۰۴

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

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

مشاهده همه

نظرات

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