لغزش بسیار مهمی است که در صرافی های غیرمتمرکز صادر می شود. Slipgage به سادگی به معنای تفاوت بین قیمتی است که هنگام شروع معامله روی صفحه مشاهده می کنید و قیمت واقعی مبادله در آن اجرا می شود. این تفاوت به این دلیل ظاهر می شود که بسته به احتقان شبکه و هزینه های گاز) کوتاه (و گاهی طولانی ، بین زمان ارسال معامله و زمان استخراج آن ، تأخیر وجود دارد. از نظر فنی تر ، حالت blockchain هر بلوک را تغییر می دهد و هیچ تضمینی برای استفاده از معامله شما در یک بلوک خاص وجود ندارد.
یکی دیگر از مشکلات مهم که برطرف کردن حفاظت از لغزش حملات ساندویچ است - این نوع مشترک حملات به کاربران مبادله غیرمتمرکز است. در حین ساندویچ ، مهاجمان معاملات مبادله خود را در دو معاملات خود "بسته بندی" می کنند: یکی قبل از معامله شما می رود و دیگری به دنبال آن می رود. در اولین معامله ، یک مهاجم وضعیت استخر را اصلاح می کند تا مبادله شما برای شما بسیار سودآور شود و برای مهاجم تا حدودی سودآور باشد. این امر با تنظیم نقدینگی استخر به دست می آید تا تجارت شما با قیمت پایین تر اتفاق بیفتد. در معامله دوم ، مهاجم نقدینگی استخر و قیمت را دوباره برقرار می کند. در نتیجه ، به دلیل قیمت های دستکاری شده ، نشانه های بسیار کمتری از آنچه انتظار می رود ، می گیرید و مهاجم سود کسب می کند.

نحوه اجرای حفاظت از لغزش در صرافی های غیرمتمرکز با اجازه دادن به کاربر انتخاب می کند که قیمت واقعی تا چه اندازه مجاز به کاهش است. به طور پیش فرض ، UNISWAP V3 تحمل لغزش را به 0. 1 ٪ تعیین می کند ، این بدان معناست که مبادله ای تنها در صورتی اجرا می شود که قیمت در لحظه اعدام از 99. 9 ٪ از قیمتی که کاربر در مرورگر دید ، کوچکتر نباشد. این یک محدوده بسیار محکم است و کاربران مجاز به تنظیم این شماره هستند ، که در صورت بالا بودن نوسانات مفید است.
بیایید محافظت از لغزش را به اجرای ما اضافه کنیم!
محافظت از لغزش در تعویض #
برای محافظت از مبادله ها ، ما باید یک پارامتر دیگر را برای تعویض عملکرد اضافه کنیم - ما می خواهیم به کاربر اجازه دهیم قیمت توقف را انتخاب کند ، قیمتی که در آن تعویض متوقف می شود. ما با پارامتر sqrtpricelimitx96 تماس خواهیم گرفت:
تابع مبادله کردن( نشانیگیرنده ، بولZeroforone ، uint256مقدار مشخص شده ، uint160sqrtpricelimitx96 ، بایتداده های CallData ) عمومی بازگرداندن (int256مقدار 0 ،int256مقدار 1) . if ( Zeroforone ?sqrtpricelimitx96>slot0_. sqrtpricex96|| sqrtpricelimitx96tickmath. min_sqrt_ratio :sqrtpricelimitx96slot0_. sqrtpricex96&& sqrtpricelimitx96>tickmath. max_sqrt_ratio ) برگشت نامعتبر () ؛ .
هنگام فروش Token $ x $ (Zeroforone صحیح است) ، SQRTPriceLimitX96 باید بین قیمت فعلی و حداقل $ SQRT $ باشد زیرا فروش Token $ X $ قیمت را پایین می آورد. به همین ترتیب ، هنگام فروش Token $ y $ ، SQRTPriceLimitX96 باید بین قیمت فعلی و حداکثر $ SQRT $ باشد زیرا قیمت بالا می رود.
در حلقه در حالی که می خواهیم دو شرط را برآورده کنیم: مبلغ مبادله کامل پر نشده است و قیمت فعلی برابر با SQRTPricElimitx96 نیست:
.. در حالی که ( state. AmountspecifiedRemaining> 0 && state. sqrtpricex96!=sqrtpricelimitx96 ) .
این بدان معنی است که استخرهای Uniswap V3 هنگام ضربه زدن به لغزش ، شکست نمی خورند و به سادگی مبادله را تا حدی اجرا می کنند.
مکان دیگری که باید SQRTPRICELIMITX96 را در نظر بگیریم ، هنگام تماس با swapmath.computeswapstep است:
(state. sqrtpricex96 ، Step. Amountin ، Step. AmountOut)=تعویض .computesWapStep ( state. sqrtpricex96 ، ( Zeroforone ?Step. sqrtpricenextx96sqrtpricelimitx96 :Step. sqrtpricenextx96>sqrtpricelimitx96 ) ?sqrtpricelimitx96 :Step. sqrtpricenextx96 ، حالت. کیفیت ، state. AmountspecifiedRemaining );
در اینجا ، ما می خواهیم اطمینان حاصل کنیم که ComputeSwapStep هرگز مبالغ مبادله را در خارج از SQRTPriceLimitx96 محاسبه نمی کند - این تضمین می کند که قیمت فعلی هرگز از قیمت محدود کننده عبور نمی کند.
محافظت از لغزش در مینینگ #
اضافه کردن نقدینگی همچنین به محافظت از لغزش نیاز دارد. این ناشی از این واقعیت است که هنگام افزودن نقدینگی ، قیمت را نمی توان تغییر داد (نقدینگی باید متناسب با قیمت فعلی باشد) ، بنابراین ارائه دهندگان نقدینگی نیز از لغزش رنج می برند. با این حال ، بر خلاف عملکرد مبادله ، ما مجبور نیستیم که در قرارداد استخر محافظت از لغزش را اجرا کنیم - این است که قرارداد استخر یک قرارداد اصلی است و ما نمی خواهیم منطق غیر ضروری را در آن قرار دهیم. به همین دلیل ما قرارداد مدیر را ایجاد کردیم ، و در قرارداد مدیر است که در آن حفاظت از لغزش را اجرا خواهیم کرد.
The Manager contract is a wrapper contract that makes calls to Pool contract more convenient. To implement slippage protection in the mint function, we can simply check the amounts of tokens taken by Pool and compare them to some minimal amounts chosen by user. Additionally, we can free users from calculating $sqrt>$ and $sqrt>$ ، و همچنین نقدینگی ، و این موارد را در Manager. Mint () محاسبه کنید.
عملکرد نعناع به روز شده ما اکنون پارامترهای بیشتری خواهد داشت ، بنابراین اجازه دهید آنها را در یک ساختار گروه بندی کنیم:
// src/uniswapv3manager. sol قرارداد uniswapv3manager ساختار مین پارامها نشانیPoolAddress ؛ int24Lowertick ؛ int24فوقانی uint256مقدار 0Sesired ؛ uint256مقدار 1Desired ؛ uint256مقدار 0min ؛ uint256مقدار 1min ؛ > تابع نعناع(mintparams calldata params) عمومی بازگرداندن (uint256مقدار 0 ،uint256مقدار 1) .
مقدار 0min و مقدار 1min مقادیری هستند که بر اساس تحمل لغزش محاسبه می شوند. آنها باید از مقادیر مورد نظر کوچکتر باشند ، با این که شکاف توسط تنظیم تحمل لغزش کنترل می شود. ارائه دهنده نقدینگی انتظار دارد مبلغ کمتری از مقدار 0min و مقدار 1min را فراهم کند.
Next, we calculate $sqrt>$, $sqrt>$ ، و نقدینگی:
. استخر iuniswapv3pool=iuniswapv3pool (params. pooladdress) ؛ (uint160sqrtpricex96 ،)=pool. slot0 () ؛ uint160sqrtpricelowerx96=tickmath. getsqrtratioattick ( params. lowertick ); uint160SQRTPriceUpperx96=tickmath. getsqrtratioattick ( params. uppertick ); uint128قوت=نقدینگی sqrtpricex96 ، sqrtpricelowerx96 ، sqrtpriceupperx96 ، params. amount0desired ، params. amount1desired ); .
نقدینگی . getLiquidionForamounts یک کارکرد جدید است ، ما در فصل بعد آن را مورد بحث قرار خواهیم داد.
مرحله بعدی تأمین نقدینگی به استخر و بررسی مبلغ برگشتی توسط استخر است: اگر خیلی کم باشند ، ما برمی گردیم.
(مقدار 0 ، مقدار 1)=pool. mint ( msg. sender ، params. lowertick ، params. uppertick ، نقدینگی ، abi. encode ( iuniswapv3pool. callbackdata ( token0:pool. token0 () ، token1:pool. token1 () ، پرداخت کننده:msg. sender >) ) ); if(مقدار 0params. amount0min||مقدار 1params. amount1min) بازگشت SlippageCheckFailed (مقدار 0 ، مقدار 1) ؛
تجارت گزینه های دودویی در ایران...
ما را در سایت تجارت گزینه های دودویی در ایران دنبال می کنید
برچسب :
نویسنده : زینالعابدین مراغهای
بازدید : <-PostHit->
تاريخ : دوشنبه
5 تير
1402 ساعت: 18:04