ردیف های مختلف هزینه ای که با سطح خطر استخر تعیین می شوند. سه سطح مختلف وجود دارد: - جفت های پایدار: 0. 05 ٪. این هزینه ها برای جفت هایی که در معرض خطر کم برای نوسانات مانند USDT/DAI قرار دارند قرار دارند. از آنجا که هر دو سکه پایدار هستند ، از دست دادن غیرقانونی بالقوه این موارد بسیار کم است. این امر به ویژه برای معامله گران جالب است زیرا امکان تعویض بسیار ارزان بین سکه های پایدار را فراهم می کند.
- جفت های ریسک متوسط: 0. 30 ٪. ریسک متوسط هر جفت غیر مرتبط در نظر گرفته می شود که دارای حجم/محبوبیت تجاری بالایی هستند ، جفت های محبوب تمایل به ریسک کمی پایین تر در نوسانات دارند.
- جفت های پرخطر: 1. 00 ٪. هر جفت عجیب و غریب دیگر برای ارائه دهندگان نقدینگی در معرض خطر بالایی قرار می گیرد و بالاترین هزینه معاملات 1 ٪ را متحمل می شود.
- مکانیسم Oracle Oracle Uniswap V2 بهبود یافته که در آن یک تماس با زنجیره ای می تواند قیمت TWAP را با 9 روز گذشته بازیابی کند. برای دستیابی به این هدف به جای ذخیره فقط یک مبلغ قیمت تجمعی ، همه موارد مربوطه در یک آرایه اندازه ثابت ذخیره می شوند. این به طور قابل ملاحظه هزینه گاز را کمی افزایش می دهد ، اما در کل ارزش آن را برای پیشرفت بزرگ اوراکل دارد.
منابع دیگر Uniswap V3
- از 5 مه 2021 در Maiet زندگی کنید
- اسناد
- کاغذ سفید
چه اتفاقی برای UNISWAP V2 می افتد؟
UNISWAP مجموعه ای خودکار و غیر متمرکز از قراردادهای هوشمند است. تا زمانی که اتریوم وجود داشته باشد ، عملکرد خود را ادامه خواهد داد.
ادغام UNISWAP V3
یکی از دلایلی که Uniswap بسیار محبوب است ممکن است روش ساده ادغام آنها در قرارداد هوشمند خود باشد. بیایید بگوییم شما سیستمی دارید که کاربران با DAI پرداخت می کنند. با Uniswap فقط در چند خط کد ، می توانید گزینه ای را برای آنها اضافه کنید که در ETH نیز بپردازند. ETH را می توان به طور خودکار قبل از منطق واقعی به DAI تبدیل کرد. چیزی شبیه به این است
عملکرد پرداخت (UINT PaymountIndai) قابل پرداخت عمومی0) دیگر// do something with that DAI .>
یک چک ساده در ابتدای عملکرد شما کافی خواهد بود. اکنون در مورد عملکرد ConvertetHtoExactDai ، به نظر می رسد مانند این:
تابع convertethtoExactdai (uint256 daiamount) قابل پرداخت خارجی0, "Must pass non 0 DAI amount"); require(msg.value>0 ، "باید مبلغ NON 0 ETH") ؛مهلت UINT256 = Block. Timestamp + 15 ؛// با استفاده از "اکنون" برای راحتی ، برای مهلت عبور Maiet از Frontend! آدرس tokenin = weth9 ؛آدرس tokenout = multidaikovan ؛uint24 هزینه = 3000 ؛آدرس گیرنده = msg. sender ؛uint256 مقدار = daiamount ؛uint256 مقدار inmaximum = msg. value ؛uint160 sqrtpricelimitx96 = 0 ؛iswaprouter. exactoutputsingleParams Params Params = isWaprouter. exactoutputsingleParams (توکنین ، توکن ، هزینه ، گیرنده ، مهلت ، مقدار ، مقدار ، sqrtpricelimitx96) ؛uniswaprouter. exactoutputsingle(پارامترها) ؛uniswaprouter. refundeth () ؛// بازپرداخت ETH باقی مانده به کاربر (موفقیت BOOL ،) = msg. sender. call(""); require(success, "refund failed");>
چندین چیز برای باز کردن در اینجا وجود دارد.
- SWAP ROUTER: Swaprouter یک قرارداد بسته بندی است که توسط UNISWAP ارائه شده است که دارای چندین مکانیسم ایمنی و عملکردهای راحتی است. می توانید آن را با استفاده از ISWAPROUTER (0xe592427A0AECE92DEE3EEDEE1F18E0157C05861564) برای هر تست اصلی یا TestNet فوری کنید. کد رابط را می توان در اینجا یافت.
- WETH: ممکن است متوجه شوید که ما در اینجا از ETH استفاده می کنیم. در UniSwap هیچ جفت ETH مستقیم دیگری وجود ندارد ، ابتدا باید ETH به WETH (که ETH به عنوان ERC-20 پیچیده شده است) تبدیل شوند. در مورد ما این کار توسط روتر انجام می شود.
- ExactoutPutsingle: از این عملکرد می توان برای استفاده از ETH و دریافت و مقدار دقیق نشانه ها برای آن استفاده کرد. هر ETH باقیمانده بازپرداخت می شود ، اما به طور خودکار نیست! من اول این که خودم متوجه نشدم و ETH در قرارداد روتر مبادله به پایان رسید. بنابراین فراموش نکنید که پس از مبادله با uniSwaprouter. Refundeth () تماس بگیرید! و اطمینان حاصل کنید که برای دریافت ETH یک عملکرد برگشتی در قرارداد خود دارید: دریافت () قابل پرداخت خارجی<>بشرپارامتر مهلت اطمینان حاصل می کند که معدنچیان نمی توانند از مبادله ای خودداری کنند و از آن در مدت زمان سودآورتر استفاده کنند. حتماً این زمان بندی UNIX را از جلوی خود عبور دهید ، اکنون در داخل قرارداد استفاده نکنید.
- بازپرداخت: پس از اتمام تجارت ، می توانیم ETH باقیمانده را به کاربر برگردانیم. این همه ETH را از قرارداد ارسال می کند ، بنابراین اگر قرارداد شما به دلایل دیگر ممکن است تعادل ETH داشته باشد ، حتماً این موضوع را تغییر دهید.
- هزینه: این یک جفت غیر پایدار اما محبوب است ، بنابراین هزینه ای که ما در اینجا استفاده می کنیم 0. 3 ٪ است (به بخش هزینه بالا مراجعه کنید).
- SQRTPRICELIMITX96: می تواند برای تعیین محدودیت در قیمت استخر استفاده شود که با مبادله نمی توان از آن تجاوز کرد. اگر آن را روی 0 تنظیم کنید ، نادیده گرفته می شود.
نحوه استفاده از آن در جلوی
یکی از موضوعاتی که اکنون داریم این است که کاربر با عملکرد پرداخت و می خواهد در ETH بپردازد ، ما نمی دانیم که او به چه میزان نیاز دارد. ما می توانیم از عملکرد quoteexactoutputsingle استفاده کنیم تا دقیقاً آن را محاسبه کنیم.
عملکرد GetSustimatedethfordai (Uint daiamount) بازده قابل پرداخت خارجی (UINT256)
اما توجه داشته باشید که ما این را به عنوان یک تابع نمایش اعلام نکردیم ، اما این عملکرد را به صورت زنجیره ای نمی نامید. این هنوز هم به معنای استفاده از عملکرد مشاهده می شود ، اما از آنجا که برای محاسبه نتیجه از توابع غیر نمای در زیر کاپوت استفاده می کند ، نمی توان آن را به عنوان یک عملکرد نمایش (درخواست ویژگی استحکام؟) اعلام کرد. برای خواندن نتیجه در Frontend ، به عنوان مثال از قابلیت تماس Web3 استفاده کنید.
اکنون می توانیم در جبهه خود با GetShematedethfordai تماس بگیریم. برای اطمینان از اینکه ما به اندازه کافی ETH ارسال می کنیم و معامله بازگردانده نمی شود ، می توانیم مقدار تخمین زده شده ETH را کمی افزایش دهیم:
const مورد نیاز = (در انتظار myContract. getEstimatedEthfordai (daiamount) . call ()) [0] ؛const Sendeth = مورد نیاز * 1. 1 ؛
اگر استخر مستقیمی برای مبادله موجود وجود نداشته باشد ، چه می شود؟
در این حالت می توانید از توابع دقیق و دقیق استفاده کنید که مسیری را به عنوان پارامتر طی می کنند. این مسیر داده های رمزگذاری شده بایت (رمزگذاری شده برای راندمان گاز) از آدرس های توکن است.
هر تعویض باید مسیر شروع و پایان را داشته باشد. در حالی که در UniSwap می توانید مستقیم به جفت توکن داشته باشید ، همیشه تضمین نمی شود که چنین استخر در واقع وجود داشته باشد. اما ممکن است شما هنوز هم بتوانید آنها را تجارت کنید تا زمانی که بتوانید مسیری را پیدا کنید ، به عنوان مثال ، Token1 → Token2 → Weth → Token3. در این حالت شما هنوز هم می توانید Token1 را برای Token3 تجارت کنید ، فقط کمی بیشتر از یک مبادله مستقیم هزینه خواهد داشت.
در سمت راست می توانید کد مثال UniSwap را برای نحوه محاسبه این مسیر در جلوی مشاهده کنید.
Function Encodepath (TokenAddresses ، هزینه ها)اجازه دهید رمزگذاری شده = '0x' برای (اجازه دهید i = 0 ؛ i// encode the final token encoded += path[path.length - 1].slice(2) retu encoded.toLowerCase()>
مثال کاملاً کار برای ریمیکس
در اینجا یک مثال کاملاً کار وجود دارد که می توانید مستقیماً در ریمیکس استفاده کنید. این امکان را به شما می دهد تا ETH را برای Kovan Dai چند ماده ای تجارت کنید. علاوه بر این شامل جایگزینی برای ExactoutPutsingle است که به صورت دقیق است و به شما امکان می دهد ETH را برای هرچند DAI که برای آن دریافت خواهید کرد ، تجارت کنید.
// spdx-license-iditififier: استحکام MIT pragma = 0. 7. 6 ؛pragma abicoder v2 ؛وارد کردن "https://github. com/uniswap/uniswap-v3-periphery/blob/main/contracts/interfaces/iswaprouter. sol" ؛واردات "https://github. com/uniswap/uniswap-v3-periphery/blob/main/contracts/interfaces/iquoter. sol" ؛رابط iuniswaprouter iswaprouter استقرارداد uniSwap30 ، "باید مبلغ NON 0 ETH") ؛مهلت UINT256 = Block. Timestamp + 15 ؛// با استفاده از "اکنون" برای راحتی ، برای مهلت عبور Maiet از Frontend! آدرس tokenin = weth9 ؛آدرس tokenout = multidaikovan ؛uint24 هزینه = 3000 ؛آدرس گیرنده = msg. sender ؛uint256 مقدار = msg. value ؛UINT256 مقدار OUTMINIMUM = 1 ؛uint160 sqrtpricelimitx96 = 0 ؛iswaprouter. exactInputsingleParams Params Params = isWaprouter. exactInputSingleParams (توکنین ، توکن ، هزینه ، گیرنده ، مهلت ، مقدار ، مقدار ، sqrtpricelimitx96) ؛uniswaprouter. exactInputSingle(پارامترها) ؛uniswaprouter. refundeth () ؛// بازپرداخت ETH باقی مانده به کاربر (موفقیت BOOL ،) = msg. sender. call(""); require(success, "refund failed");>تابع convertethtoExactdai (uint256 daiamount) قابل پرداخت خارجی0, "Must pass non 0 DAI amount"); require(msg.value>0 ، "باید مبلغ NON 0 ETH") ؛مهلت UINT256 = Block. Timestamp + 15 ؛// با استفاده از "اکنون" برای راحتی ، برای مهلت عبور Maiet از Frontend! آدرس tokenin = weth9 ؛آدرس tokenout = multidaikovan ؛uint24 هزینه = 3000 ؛آدرس گیرنده = msg. sender ؛uint256 مقدار = daiamount ؛uint256 مقدار inmaximum = msg. value ؛uint160 sqrtpricelimitx96 = 0 ؛iswaprouter. exactoutputsingleParams Params Params = isWaprouter. exactoutputsingleParams (توکنین ، توکن ، هزینه ، گیرنده ، مهلت ، مقدار ، مقدار ، sqrtpricelimitx96) ؛uniswaprouter. exactoutputsingle(پارامترها) ؛uniswaprouter. refundeth () ؛// بازپرداخت ETH باقی مانده به کاربر (موفقیت BOOL ،) = msg. sender. call(""); require(success, "refund failed");>// از زنجیره ای ، گاز ناکارآمد استفاده نکنید! عملکرد GetSustimatedethfordai (Uint daiamount) بازده قابل پرداخت خارجی (UINT256)
// مهم برای دریافت ETH دریافت () قابل پرداخت خارجی<>> تفاوت بین دقیق و دقیق
هنگامی که توابع را اجرا می کنید و به آنها در Etherscan نگاه می کنید ، تفاوت بلافاصله آشکار می شود. در اینجا ما با ExterOutput تجارت می کنیم. ما 1 ETH ارائه می دهیم و می خواهیم در عوض 100 DAI دریافت کنیم. هر مقدار اضافی ETH به ما بازپرداخت می شود.

و در اینجا ما با استفاده از ExactInput تجارت می کنیم. ما 1 ETH را ارائه می دهیم و می خواهیم هرچند DAI را که می توانیم برای آن بدست آوریم ، دریافت کنیم که اتفاق می افتد 196 DAI است.

توجه داشته باشید که اگر گیج شده اید که چرا قیمت آنقدر متفاوت است ، یک استخر کوچک در Testnet است و اولین تجارت به شدت بر قیمت استخر تأثیر می گذارد. بسیاری از افراد تجارت داوری در یک تست.؛)