यह लेख बताता है कि एक Automated Market Maker (AMM) में एक trading pair के price settlement का निर्धारण कैसे किया जाए। यह इस प्रश्न का उत्तर देता है कि “AMM से token Y के लिए कितने token X को swap किया जा सकता है?”।
Uniswap V2 पर swap() function के लिए यह आवश्यक है कि आप pool से swap किए जाने वाले tokens की मात्रा की पूर्व-गणना (pre-calculate) करें (जिसमें 0.3% trading fees शामिल है)।
मान लीजिए कि Liquidity Pool में 100 ETH और 100 USDC के साथ एक ETH / USDC trading pair है। सरलता के लिए, यह मान लेते हैं कि 1 ETH, 1 USDC के बराबर है।
हालाँकि 1 ETH की spot price 1 USDC है और इसके विपरीत, इसका मतलब यह नहीं है कि हम 25 ETH के लिए 25 USDC trade कर सकते हैं क्योंकि यह constant product formula को संरक्षित (preserve) नहीं करेगा।
लेखक
यह लेख RareSkills में एक research intern, Aymeric Taylor (LinkedIn, Twitter) द्वारा सह-लिखित (co-authored) था।
Constant Product formula थ्योरी: x * y ≥ k
Constant product formula यह निर्धारित करता है कि token X और token Y के एक pair pool में, pool में दोनों asset की मात्राओं का गुणनफल (product) (X गुना Y) हर समय कम से कम constant (स्थिर) रहना चाहिए।
Constant product formula दोनों tokens के बीच एक विपरीत संबंध (inverse relationship) सुनिश्चित करता है, जो market की supply और demand को मॉडल करता है। जैसे-जैसे एक token की मात्रा बढ़ती है (AMM में deposit की जाती है), दूसरे की मात्रा कम होनी चाहिए (AMM contract से withdraw की जाती है)।
विपरीत संबंध (inverse relationship) अधिक स्पष्ट रूप से दिखाई देता है यदि हम नीचे दिए गए समीकरण (equation) के अनुसार variables को पुनर्व्यवस्थित (reorder) करते हैं।
आइए हमारे चल रहे उदाहरण को constant formula समीकरण में plot करें:
- x-axis = 100 ETH
- y-axis = 100 USDC
- k = 10,000 (100 ETH * 100 USDC)
- Pink Line curve x * y ≥ 10,000 को दर्शाती है

Curve के नीचे का boxed area constant k है, जो x और y का गुणनफल (product) है।
हम जल्द ही प्रदर्शित करेंगे कि हम ETH को USDC के लिए कैसे swap कर सकते हैं ताकि यह constant संरक्षित रहे।
Uniswap constant product formula implementation
व्यवहार में, constant product formula को trade से पहले और बाद में liquidity pool के constant product की तुलना करके लागू (implement) किया जाता है ताकि यह सुनिश्चित हो सके कि यह कम से कम constant बना रहे।
Uniswap आपको AMM को आवश्यकता से अधिक देने से नहीं रोकता है, यदि आप ऐसा करते हैं, तो यह आपकी गलती है कि आपने यह कम आंका कि आप कितना withdraw कर सकते हैं, इसलिए यहाँ ≤ चिह्न का उपयोग किया गया है।
उपरोक्त समीकरण (equation) का विस्तार (expand) करने पर, हमें नीचे दिया गया समतुल्य (equivalent) समीकरण प्राप्त होता है:
x_Beforeऔरy_Beforeswap से पहले pool में प्रत्येक tokens की मात्रा है।x_Afterऔरy_Afterswap के बाद pool में tokens की मात्रा है।
इसका मतलब यह है कि ETH को USDC के लिए swap करने के बाद pool का constant product कम से कम समान (same) रहना चाहिए।
Uniswap V2 प्रत्येक swap के लिए 0.3% AMM trading fee लगाता है। Fees को ध्यान में रखने पर, liquidity pool का constant product प्रत्येक swap के साथ बढ़ता है। Pool में यह वृद्धि liquidity providers के लिए मुख्य प्रोत्साहन (incentive) है। केवल जब liquidity providers अपनी liquidity निकालते (withdraw करते) हैं, तभी pool का constant product कम होगा। हम आपको इस लेख के अंत में trading fees सहित swap की गणना करना दिखाएंगे।
हम 25 ETH को 25 USDC के लिए swap क्यों नहीं कर सकते
यह निर्धारित करने के लिए कि एक swap valid है या नहीं, हमें यह pre-calculate करने की आवश्यकता है कि swap pool के constant product को कैसे प्रभावित करेगा। क्या यह कम से कम समान रहता है?
हम क्रमशः liquidity pool में डाले गए (swapped into) और निकाले गए (swapped out) अमाउंट को ΔETH और ΔUSDC के रूप में दर्शाएंगे।

25 USDC के लिए 25 ETH को swap करने का अर्थ होगा कि हम AMM में 25 ETH deposit करते हैं, और इससे 25 USDC withdraw करते हैं। यह pool की liquidity को 125 ETH और 75 USDC में समायोजित (adjust) कर देगा। AMM इस swap को reject कर देगा क्योंकि swap के बाद pool का constant product घट जाता है।

Post-swap product, pre-swap product 10,000 से कम है, जो constant product invariant का उल्लंघन (violate) करता है। नीचे दिया गया ग्राफ इस swap को विज़ुअलाइज़ करता है।

स्पष्ट रूप से, हम 25 USDC withdraw करने की उम्मीद नहीं कर सकते - constant product invariant को संरक्षित (preserve) करने के लिए हमें कम withdraw करना होगा।
सही USDC Swap Amount का निर्धारण करना
पिछले उदाहरण पर वापस आते हुए, pool में 25 ETH जोड़ने से ETH की मात्रा 125 ETH (100 + 25) हो जाती है। अगला कार्य pool में USDC की नई, घटी हुई मात्रा का पता लगाना है जो constant product को संरक्षित (preserve) करती है, जिससे यह सुनिश्चित हो सके कि AMM इसे accept करेगा।

हमारे पास एक समीकरण (equation) है जो ΔUSDC का अधिकतम मूल्य (maximum value) प्रकट करता है जिसे 25 ETH के लिए swap किया जा सकता है।
ΔUSDC के लिए हल (Solve) करना
हम ΔUSDC को स्पष्ट रूप से हल (solve) करने के लिए समीकरण (equation) को पुनर्व्यवस्थित (rearrange) करते हैं।


Pool में अब 125 ETH और 80 USDC हैं, जो 10,000 के constant product के बराबर है।

20 USDC के लिए 25 ETH को swap करना USDC की वह अधिकतम मात्रा है जिसे आप AMM liquidity pool से निकाल सकते हैं। यह swap स्वीकार (accept) किया जाता है क्योंकि यह constant product formula को संरक्षित रखता है। 20 USDC, 25 USDC से एक-पांचवां (one-fifth) कम है, इसलिए हमने इस swap के दौरान slippage का अनुभव किया। Slippage वह सीमा (degree) है जिस तक हमारे trade के परिणामस्वरूप price बदलता है। यदि हमने एक छोटा trade किया होता, तो हम जो price चुकाते वह 1 USDC : 1 ETH के करीब होता। लेकिन क्योंकि हमारा trade बड़ा है, हम कम USDC के लिए अधिक price चुकाते हैं, जिससे अधिक slippage होता है।
हम नीचे इस swap को विज़ुअलाइज़ कर सकते हैं।

Swap की गणना करने के लिए generalized formula को इस प्रकार व्यक्त किया जा सकता है:

- x और y swap से पहले liquidity pool में tokens की मात्रा को दर्शाते हैं
- Δx AMM में deposit किए गए token की मात्रा को दर्शाता है
- Δy AMM से निकाले गए (swapped out) अमाउंट को दर्शाता है
Swap की गलत गणना करना (Miscalculating): AMM को आवश्यकता से अधिक देना
यदि आप कम निकालते हैं, उदाहरण के लिए 18 USDC, तो भी AMM इसे स्वीकार (accept) करेगा क्योंकि liquidity pool में constant product बढ़ता है, लेकिन आपको नुकसान होता है क्योंकि आपने अपने swap को maximize नहीं किया।

Fees के साथ swap की गणना करना
ऊपर हमने जो गणनाएँ (calculations) कीं, वे “सैद्धांतिक (theoretical)” थीं जिनमें trading fees को शामिल नहीं किया गया था। जैसा कि पहले उल्लेख किया गया है, Uniswap V2 प्रत्येक swap के लिए 0.3% trading fee लागू करता है, लेकिन fees केवल AMM में deposit किए गए token पर लागू होती है। मान लीजिए कि हमने token Y के लिए token X को swap किया है, तो 0.3% fee केवल X से ली जाती है, और Y से नहीं।
Uniswap V2 0.3% fee की गणना कैसे करता है, इसके लिए वह deposit किए गए token को 2 भागों में विभाजित करता है:
- Fee: 0.3%
- Swap के लिए बची हुई उपलब्ध राशि (Amount available): 99.7%
25 ETH के लिए, हमारी fee और swap के लिए उपलब्ध शेष राशि होगी:
- Fee(0.3%):
0.075 ETH - Swap के लिए बची हुई उपलब्ध राशि(99.7%):
24.925 ETH
Fee को तुरंत इस swap की गणना से बाहर (exclude) कर दिया जाता है, इसलिए swapper के खाते में 0.3% fee का हिस्सा credit नहीं किया जाएगा।
जो बचा है वह swap के लिए उपलब्ध राशि है जो 24.925 ETH है। यह वह वास्तविक राशि (actual amount) है जिसके लिए हम pool से USDC को swap कर रहे हैं।
आइए उस अधिकतम USDC (ΔUSDC) राशि के लिए हल (solve) करें जिसे हम pool से withdraw कर सकते हैं। Pool में 24.925 ETH जोड़ने से ETH की मात्रा 124.925 ETH तक बढ़ जाएगी।

ΔUSDC के लिए हल (solve) करने पर हमें मिलता है:

0.3% swapping fee को ध्यान में रखते हुए, हम AMM से लगभग 19.952 USDC withdraw कर सकते हैं। यह उस 20 USDC से कम है जो हम बिना fees वाले उदाहरण में प्राप्त कर सकते थे।
Fees को शामिल करने पर गणना में प्राथमिक अंतर यह है कि हम deposit किए गए token को 99.7% से गुणा (multiply) करते हैं, 0.3% को अलग रखा जाता है और AMM को allocate किया जाता है। यह देखते हुए कि Δx deposit किया गया token है और Δy withdraw की गई token की राशि है, general equation बन जाती है:

RareSkills के साथ और जानें
यह लेख हमारे एडवांस Solidity Bootcamp का हिस्सा है। अधिक जानने के लिए कृपया पाठ्यक्रम (curriculum) देखें।
मूल रूप से 17 अप्रैल, 2024 को प्रकाशित