UniswapV2Library
Uniswap V2 Library pair contracts के साथ कुछ इंटरैक्शन को सरल बनाता है और Router contracts द्वारा इसका भारी उपयोग किया जाता है। इसमें आठ फ़ंक्शन हैं जो state-changing नहीं हैं। वे एक smart contract से Uniswap V2 को इंटिग्रेट करने के लिए भी उपयोगी हैं।
getAmountOut() और getAmountIn()
यदि हम यह अनुमान लगाना चाहते हैं कि token x की एक निश्चित मात्रा की आपूर्ति करने पर हमें token y की कितनी मात्रा मिलेगी, तो हम नीचे दिए गए अनुक्रम (सरलता के लिए फीस को अनदेखा करते हुए) का उपयोग करके प्राप्त होने वाली मात्रा (amount out) निकाल सकते हैं। मान लें कि x आने वाला टोकन (incoming token) है, y जाने वाला टोकन (outgoing token) है, Δx आने वाली मात्रा (amount coming in) है और Δy जाने वाली मात्रा (amount going out) है:
इसे ध्यान में रखते हुए, UniswapV2Library.sol में getAmountOut() का फ़ंक्शन स्वतः स्पष्ट होना चाहिए। ध्यान दें कि 0.3% फीस को ध्यान में रखने के लिए संख्याओं को 1,000 से स्केल किया गया है। फीस के साथ getAmountIn() का डेरिवेशन (derivation) पाठक के लिए एक अभ्यास है।

pair hops के लिए getAmountOut() को getAmountsOut() से चेन करना (Chaining)
getAmountsOut() और getAmountsIn()
यदि कोई ट्रेडर पेयर्स का एक अनुक्रम (sequence) (A, B), (B, C), (C, D) प्रदान करता है और A की एक निश्चित मात्रा के साथ शुरू करते हुए इटेरेटिव रूप से getAmountOut को कॉल करता है, तो प्राप्त होने वाले टोकन D की मात्रा का अनुमान लगाया जा सकता है।
प्रत्येक (A, B), (B, C), आदि के लिए UniswapV2 pair contract का पता (address) टोकन के addresses और उस factory के address से निर्धारित रूप से (deterministically) निकाला जाता है जिसने create2 फ़ंक्शन का उपयोग करके pair को डिप्लॉय किया था। दो टोकन (A, B) और एक factory address दिए जाने पर, pairFor() एक हेल्पर फ़ंक्शन के रूप में sortTokens() का उपयोग करके उस पेयर के लिए पेयर UniswapV2 pool contract का पता निकालता है।

अब जबकि हम सभी पेयर्स के addresses जानते हैं, हम प्रत्येक के reserves प्राप्त कर सकते हैं और अनुमान लगा सकते हैं कि स्वैप की चेन के अंत में हमें कितने टोकन प्राप्त होंगे। नीचे getAmountsOut() के लिए कोड दिया गया है (“Amount” के बजाय “Amounts” पर जोर दें)। फ़ंक्शन getAmountsIn() बस उसी चीज़ को उल्टे क्रम (reverse) में करता है, इसलिए हम इसे यहाँ नहीं दिखाएंगे।
कुछ बातों पर ध्यान दें:
- smart contract अपने आप पेयर्स के इष्टतम अनुक्रम (optimal sequence) का पता नहीं लगाता है, इसे उन पेयर्स की सूची बताने की आवश्यकता होती है जिन पर स्वैप की चेन की गणना करनी है। यह सबसे अच्छी तरह से ऑफ-चेन (off-chain) किया जाता है।
- यह केवल चेन में अंतिम टोकन
amountOutनहीं लौटाता है, बल्कि हर चरण (step) पर बाहर आने वाली मात्रा (amount out) लौटाता है।

getReserves()
फ़ंक्शन getReserves बस Uniswap V2 pair contract के फ़ंक्शन getReserves के चारों ओर एक रैपर (wrapper) है, सिवाय इसके कि यह उस टाइमस्टैम्प (timestamp) को भी हटा देता है जब कीमत को पिछली बार अपडेट किया गया था। आसान तुलना के लिए pair contract से getReserves का फ़ंक्शन भी दिखाया गया है (purple comments)।

कोर फ़ंक्शन:

quote()
याद रखें कि किसी संपत्ति (asset) की कीमत निम्नलिखित सूत्र (formula) का पालन करती है:
यह फ़ंक्शन अंतिम अपडेट के अनुसार bar में दर्शाई गई foo की कीमत लौटाता है। इस फ़ंक्शन का उपयोग सावधानी से किया जाना चाहिए क्योंकि यह flash loan हमलों (attacks) के प्रति संवेदनशील है।

UniswapV2Library का उपयोग करना
यदि आप यह अनुमान लगाना चाहते हैं कि किसी ट्रेड में कितना डालना है या उससे कितना प्राप्त करने की उम्मीद करनी है, या पेयर्स के आर-पार ट्रेडों के अनुक्रम में, तो UniswapV2Library उपयोग करने के लिए सही टूल है।
अभ्यास (Practice)
DamnVulnerableDefi Puppet V2 को आज़माएं। इस बिंदु पर आपके लिए सुरक्षा समस्या की पहचान करना आसान होना चाहिए।
RareSkills के साथ और जानें
यह सामग्री हमारे एडवांस Solidity Bootcamp का हिस्सा है। अधिक जानने के लिए कृपया प्रोग्राम देखें।
मूल रूप से 6 नवंबर, 2023 को प्रकाशित