Uniswap एक DeFi ऐप है जो ट्रेडर्स को ट्रस्टलेस तरीके से एक टोकन को दूसरे टोकन के साथ स्वैप करने की सुविधा देता है। यह ट्रेडिंग के लिए शुरुआती ऑटोमेटेड मार्केट मेकर्स में से एक था (हालांकि यह पहला नहीं था)।
ऑटोमेटेड मार्केट मेकर्स order book का एक विकल्प हैं, जिसके बारे में यह माना जाता है कि पाठक पहले से ही परिचित हैं।
AMMs कैसे काम करते हैं
एक ऑटोमेटेड मार्केट मेकर पूल (एक स्मार्ट कॉन्ट्रैक्ट) में दो टोकन (टोकन X और टोकन Y) रखता है। यह किसी को भी पूल से टोकन X निकालने की अनुमति देता है, लेकिन उन्हें टोकन Y की इतनी मात्रा जमा करनी होती है कि पूल में मौजूद एसेट्स का “कुल” (total) कम न हो, जहाँ हम “कुल” को दोनों एसेट्स की मात्राओं का गुणनफल (product) मानते हैं।
यहाँ और ट्रेड के बाद पूल के टोकन बैलेंस हैं, और तथा ट्रेड से पहले पूल के टोकन बैलेंस हैं।
यह गारंटी देता है कि पूल की एसेट होल्डिंग केवल समान रह सकती है या बढ़ सकती है।
ज़्यादातर पूल किसी न किसी प्रकार की फीस लागू करते हैं। बैलेंस का गुणनफल केवल बढ़ना ही नहीं चाहिए, बल्कि फीस के हिसाब से इसे कम से कम एक निश्चित मात्रा तक बढ़ना भी चाहिए।
पूल में एसेट्स liquidity providers (लिक्विडिटी प्रोवाइडर्स) द्वारा प्रदान किए जाते हैं, जिन्हें पूल में उनके हिस्से को दर्शाने के लिए तथाकथित LP टोकन मिलते हैं। लिक्विडिटी प्रोवाइडर के बैलेंस को उसी तरह ट्रैक किया जाता है जैसे ERC 4626 काम करता है। एक AMM और ERC 4626 के बीच का अंतर यह है कि ERC 4626 केवल एक एसेट को सपोर्ट करता है जबकि एक AMM में दो टोकन होते हैं। वॉल्ट की तरह ही, पूल में लिक्विडिटी प्रोवाइडर्स का हिस्सा समान रहता है, लेकिन गुणनफल बड़ा हो जाता है, इसलिए उनका हिस्सा भी बड़ा हो जाता है।
AMMs के फायदे
AMMs में बिड-आस्क स्प्रेड नहीं होता है
एक AMM में, प्राइस डिस्कवरी आटोमेटिक होती है। यह पूल में एसेट्स के अनुपात द्वारा निर्धारित होती है। विशेष रूप से, यदि हमारे पास टोकन और टोकन हैं, तो कीमत इस प्रकार निर्धारित की जाती है:
और के लिए भी ठीक इसके विपरीत। विशेष रूप से, जितना अधिक एसेट पूल में डाला जाता है, यह उतना ही अधिक “प्रचुर मात्रा” (abundant) में होता है, और की कीमत कम हो जाती है।
किसी उपयुक्त “बिड” या “आस्क” ऑर्डर के आने का इंतज़ार करने की कोई आवश्यकता नहीं है। यह हमेशा मौजूद रहता है।
यदि किसी AMM और दूसरे एक्सचेंज की कीमत में कोई अंतर होता है, तो ट्रेडर उस अंतर का आर्बिट्रेज (arbitrage) करेगा, जिससे कीमतें वापस संतुलन में आ जाएँगी।
हमें इस बात पर जोर देना चाहिए कि यह “स्पॉट” या “मार्जिनल” प्राइस है। यदि आप की कोई भी मात्रा खरीदते हैं, तो आपके द्वारा चुकाई जाने वाली वास्तविक कीमत इस गणना के परिणाम से बदतर (worse) होगी।
AMMs एक ओरेकल के रूप में भी काम करते हैं
चूँकि एसेट्स की कीमत आटोमेटिक रूप से निर्धारित होती है, अन्य स्मार्ट कॉन्ट्रैक्ट्स एक AMM का उपयोग प्राइस ओरेकल (price oracle) के रूप में कर सकते हैं। हालाँकि, AMM की कीमतों को फ्लैश लोन (flash loans) के साथ मैनिपुलेट किया जा सकता है, इसलिए AMMs का इस तरीके से उपयोग करते समय सुरक्षा उपाय किए जाने की आवश्यकता है। फिर भी, यह मूल्यवान है कि प्राइस डेटा मुफ़्त में उपलब्ध कराया जाता है।
ऑर्डर बुक की तुलना में AMMs अत्यधिक गैस एफिशिएंट हैं
ऑर्डर बुक में काफी अधिक बुककीपिंग की आवश्यकता होती है। एक AMM को केवल दो टोकन रखने और सरल नियमों के अनुसार उन्हें ट्रांसफर करने की आवश्यकता होती है। यह उन्हें लागू करने में अधिक कुशल बनाता है।
AMMs के नुकसान
ऑटोमेटेड मार्केट मेकर्स के दो प्रमुख नुकसान हैं: 1) कीमत हमेशा बदलती रहती है और 2) लिक्विडिटी प्रोवाइडर्स के लिए इम्परमानेंट लॉस (impermanent loss)।
AMMs में छोटे ऑर्डर भी कीमत बदल देते हैं
यदि आप Apple के 100 शेयर खरीदने का ऑर्डर देते हैं, तो आपके ऑर्डर के कारण कीमत नहीं बदलेगी क्योंकि आपके द्वारा निर्दिष्ट कीमत पर बिक्री के लिए हजारों शेयर उपलब्ध हैं। ऑटोमेटेड मार्केट मेकर के मामले में ऐसा नहीं है। प्रत्येक ट्रेड, चाहे वह कितना भी छोटा क्यों न हो, कीमत को बदल देता है।
इसके दो प्रभाव होते हैं। एक बाय (खरीद) या सेल (बिक्री) ऑर्डर में आम तौर पर ऑर्डर बुक मॉडल की तुलना में अधिक स्लिपेज (slippage) का सामना करना पड़ेगा, और स्वैपिंग का मैकेनिज्म सैंडविच अटैक (sandwich attacks) को आमंत्रित करता है।
AMMs में सैंडविच अटैक को काफी हद तक टाला नहीं जा सकता
चूँकि हर ऑर्डर से कीमत बदलने वाली है, MEV (Maximal Extractable Value) ट्रेडर्स किसी बड़े बाय ऑर्डर के आने का इंतज़ार करेंगे, और फिर पीड़ित (victim) के ऑर्डर से ठीक पहले एक बाय ऑर्डर और उसके ठीक बाद एक सेल ऑर्डर लगा देंगे। आगे वाला बाय ऑर्डर मूल ट्रेडर के लिए कीमत बढ़ा देगा, जिससे उन्हें खराब एग्जीक्यूशन मिलेगा। इसे सैंडविच अटैक कहा जाता है, क्योंकि पीड़ित का ट्रेड हमलावरों के बीच “सैंडविच” हो जाता है।
- हमलावर की पहली खरीद (फ्रंट रन): पीड़ित के लिए कीमत बढ़ा देती है
- पीड़ित की खरीद: कीमत को और भी बढ़ा देती है
- हमलावर की बिक्री: पहली खरीद को मुनाफे में बेचता है
लिक्विडिटी प्रोवाइडर्स का उस कीमत पर कोई नियंत्रण नहीं होता जिस पर उनके एसेट्स बेचे जाते हैं
उन कारणों से जिन पर हम बाद में चर्चा करेंगे, लिक्विडिटी प्रोवाइडर्स केवल पूल में टोकन के वर्तमान अनुपात के अनुसार ही एसेट्स प्रदान कर सकते हैं। उदाहरण के लिए, यदि 100 टोकन और 200 टोकन हैं, तो नए लिक्विडिटी प्रोवाइडर को की तुलना में दोगुने टोकन प्रदान करने होंगे।
पारंपरिक ऑर्डर बुक में, एक मार्केट मेकर उन स्तरों पर लिमिट ऑर्डर दे सकता है जो उन्हें लगता है कि एक वांछनीय बिड या आस्क को दर्शाते हैं (उदाहरण के लिए, वर्तमान बाजार मूल्य से नीचे बिड ऑर्डर लगाना या वर्तमान बाजार मूल्य से ऊपर सेल ऑर्डर लगाना), लेकिन यह एक ऑटोमेटेड मार्केट मेकर के साथ संभव नहीं है। याद रखें कि ऑटोमेटेड मार्केट मेकर्स पूल में एसेट अनुपात के आधार पर कीमतें निर्धारित करने के लिए एक फॉर्मूले का उपयोग करते हैं, जिसके परिणामस्वरूप मार्केट मेकर्स उन विशिष्ट कीमतों को निर्धारित नहीं कर सकते हैं जिन पर वे अपने एसेट्स बेचना चाहते हैं।
AMMs के लिए लिक्विडिटी प्रोवाइडर्स को इम्परमानेंट लॉस का सामना करना पड़ सकता है
मान लीजिए एक काल्पनिक स्थिति में Ether $10 से शुरू होता है और बाद में $1,000 का हो जाता है।
यदि किसी के पोर्टफोलियो में 1 Ether और 10 USD थे, तो उनका पोर्टफोलियो $20 से शुरू होता है और $1010 (1 ETH + $10) पर समाप्त होता है। उनका कुल लाभ $990 है।
यदि उन्होंने पैसे को एक AMM में रखा होता, तो वे अधिकांश लाभ से चूक गए होते। कीमत में बदलाव के बाद AMM में 0.1 ETH और 100 USD होंगे। यह सही ढंग से ETH की कीमत $1,000 निर्धारित करता है, लेकिन पूल की नेट वैल्यू $990 से कम है। कीमत में बदलाव से पहले और बाद में पूल की होल्डिंग इस तरह दिखेगी:
यद्यपि स्टेबलकॉइन (stablecoins) की मात्रा 10 गुना बढ़ गई, Ether की मात्रा कम हो गई। इसका अंतिम परिणाम यह है कि हमारे एसेट्स का मूल्य, जब वे पूल में थे, अलग-अलग रखने की तुलना में कम बढ़ा।
यहाँ एक टेबल दी गई है जो पूल में ETH और USD को रखने बनाम सिर्फ उन्हें होल्ड करने के तुलनात्मक प्रदर्शन को दर्शाती है।
| Ether पूल बैलेंस | Stablecoin पूल बैलेंस | ETH × Stablecoin | 1 ETH का \$ मूल्य | लिक्विडिटी प्रदान करने पर एसेट्स का मूल्य | सिर्फ होल्ड करने पर मूल्य | ||
|---|---|---|---|---|---|---|---|
| पहले (Before) | 1 | 10 | 10 | 10 | $\$20 \; (\$10 \text{ ETH} + 10 \text{ USD})$ | $\$20 \; (\$10 \times 1 \text{ ETH} + 10 \text{ USD})$ | |
| बाद में (After) | 0.1 | 100 | 10 | 1000 | $\$200 \; (\$100 \text{ ETH} + 100 \text{ USD})$ | $\$1010 \;(\$1000 \times 1 \text{ ETH} + 10 \text{ USD})$ | |
| लाभ (Gain) | $\$180$ | $\$990$ | |||||
छूट गए मुनाफे को “इम्परमानेंट लॉस” (impermanent loss) कहा जाता है। ऊपर दी गई टेबल में, इम्परमानेंट लॉस है।
Uniswap V2 का आर्किटेक्चर
Uniswap V2 का आर्किटेक्चर आश्चर्यजनक रूप से सरल है। इसके कोर में UniswapV2Pair कॉन्ट्रैक्ट है जो दो ERC 20 टोकन रखता है जिसके अगेंस्ट ट्रेडर्स स्वैप कर सकते हैं, या लिक्विडिटी प्रोवाइडर्स इसके लिए लिक्विडिटी प्रदान कर सकते हैं। हर एक अलग संभावित UniswapV2Pair को प्रबंधित करने के लिए एक अलग UniswapV2Pair कॉन्ट्रैक्ट होता है। यदि वांछित UniswapV2Pair कॉन्ट्रैक्ट मौजूद नहीं है, तो UniswapV2Factory कॉन्ट्रैक्ट से परमिशनलेस तरीके से एक नया कॉन्ट्रैक्ट बनाया जा सकता है। UniswapV2Pair कॉन्ट्रैक्ट्स स्वयं भी ERC 20 टोकन होते हैं (वे ERC 20 से इनहेरिट होते हैं), और उस टोकन का उपयोग ERC 4626 के काम करने के तरीके के समान डिपॉजिट को ट्रैक करने के लिए किया जाता है।
यद्यपि एडवांस्ड ट्रेडर्स या स्मार्ट कॉन्ट्रैक्ट्स सीधे एक pair कॉन्ट्रैक्ट के साथ इंटरैक्ट कर सकते हैं, अधिकांश उपयोगकर्ता router कॉन्ट्रैक्ट के माध्यम से pair के साथ इंटरैक्ट करेंगे, जिसमें कई सुविधाजनक फंक्शन होते हैं, जैसे एक ही ट्रांजेक्शन में pairs के बीच ट्रेडिंग करके एक “सिंथेटिक” पेयर बनाना यदि वह मौजूद नहीं है।
बस इतना ही! Uniswap V2 सिस्टम में वास्तव में केवल तीन स्मार्ट कॉन्ट्रैक्ट काम कर रहे हैं।
Factory: github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Factory.sol
Pair: (जो ERC20 से इनहेरिट होता है): github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol
Router: github.com/Uniswap/v2-periphery/tree/master/contracts
कोर - पेरिफेरी पैटर्न
ध्यान दें कि ऊपर दिया गया राउटर कॉन्ट्रैक्ट “v2 periphery” नामक रिपॉजिटरी में है और पेयर “v2 core” रिपॉजिटरी में है। Uniswap V2 “कोर / पेरिफेरी” (core / periphery) डिज़ाइन पैटर्न का पालन करता है जहाँ सबसे आवश्यक लॉजिक कोर में रखा जाता है जबकि “वैकल्पिक” लॉजिक पेरिफेरी में रखा जाता है।
इसके पीछे का उद्देश्य कोर में कम से कम कोड रखना है, जिससे कोर बिज़नेस लॉजिक में बग (bugs) की संभावना कम हो जाती है।
दो टोकन एड्रेस दिए जाने पर, पूल का पता कैसे लगाएं
टोकन पेयर्स से पूल एड्रेस की मैपिंग को एक्सेस करने के बजाय, स्मार्ट कॉन्ट्रैक्ट्स टोकन एड्रेस और फैक्ट्री एड्रेस के फ़ंक्शन के रूप में create2 एड्रेस की भविष्यवाणी करके पूल के एड्रेस की गणना करते हैं। चूँकि इसमें कोई स्टोरेज एक्सेस नहीं है, इसलिए यह बहुत गैस एफिशिएंट है। नीचे Pair कॉन्ट्रैक्ट के एड्रेस की गणना करने के लिए UniswapV2Library द्वारा प्रदान किया गया हेल्पर फंक्शन दिया गया है।
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'96e8ac4277198f8fbbf785487aa39f430f63b76db002cb326e37da348845f' // init code hash
))));
}
क्लोन्स का उपयोग क्यों नहीं करते
EIP 1167 clone पैटर्न का उपयोग समान कॉन्ट्रैक्ट्स का एक कलेक्शन बनाने के लिए किया जाता है, तो यहाँ उसका उपयोग क्यों नहीं किया जाता? यद्यपि डिप्लॉयमेंट सस्ता होगा, लेकिन delegatecall के कारण प्रति ट्रांजेक्शन 2,600 अतिरिक्त गैस लगेगी। चूँकि पूल्स का बार-बार उपयोग किया जाना तय है, डिप्लॉयमेंट से होने वाली लागत की बचत अंततः कुछ सौ ट्रांजेक्शन के बाद खत्म हो जाएगी, इसलिए पूल को एक नए कॉन्ट्रैक्ट के रूप में डिप्लॉय करना अधिक उचित है।
अभ्यास प्रश्न
स्वैप के लिए आवश्यक टोकन की मात्रा की गलत गणना करना आसान है, जिससे पूल खाली (drain) हो सकता है। निम्नलिखित सुरक्षा चुनौती के साथ इसका अभ्यास करें: Ethernaut 22 Dex
RareSkills के साथ और जानें
यह लेख एक सीरीज़ का हिस्सा है। कृपया शेष भाग के लिए Uniswap V2 Book देखें। हमारे अन्य कोर्स के लिए हमारे Blockchain Bootcamps भी देखें।
मूल रूप से 15 नवंबर, 2023 को प्रकाशित