यह हमारी श्रृंखला "पूल में शिकारी: JIT तरलता की कला और गणित" का दूसरा लेख है। यहां हम "चोरी" के सिद्धांत से ठंडी गणना की ओर बढ़ते हैं: कैसे एक एल्गोरिथ्म 200 मिलीसेकंड में तय करता है कि खेल में प्रवेश करना लाभकारी है या नहीं।
यदि पहला लेख "यह क्या है" के बारे में था, तो यह लेख "इसकी लागत कितनी है" के बारे में है। ताकि JIT हमला माइनर्स/वैलिडेटर्स के पक्ष में दान में न बदल जाए, बॉट को पांच अज्ञात वाले समीकरण को उस समय से पहले हल करना होगा जब ब्लॉक खनन किया जाए।
1. तरलता (L): मुख्य चर
Uniswap v3 में, तरलता केवल टोकन का योग नहीं है, बल्कि $L$ कारक है जो निर्धारित करता है कि कीमत बदलने पर कितनी संपत्ति हिलती है। स्वैप फ़ॉर्मूला (इनवेरिएंट):

JIT बॉट के लिए यह महत्वपूर्ण है कि वह यह गणना करे कि किसी दिए गए मूल्य सीमा (टिक) में कुल $L$ का कितना हिस्सा वह कवर करेगा।
शुल्क हिस्सेदारी का सूत्र (Fshare):
Fshare = Ljit / Lpool + Ljit
जहां:
- Ljit — बॉट द्वारा प्रदान की गई तरलता।
- Lpool — लक्षित टिक में मौजूद पैसिव LP की तरलता।
व्यावहारिक नियम: 95% शुल्क लेने के लिए, बॉट की तरलता उस सीमा में वर्तमान पूल तरलता से 19 गुना अधिक होनी चाहिए।
2. स्वैप लाभ की गणना (Gross Profit)
बॉट मेमपूल में उपयोगकर्ता के $S$ मूल्य की लेनदेन देखता है। पूल की फीस श्रेणी ($\phi$, जैसे 0.05% या 0.3%) जानते हुए, वह कुल लेनदेन शुल्क गणना करता है:

बॉट का अपेक्षित सकल लाभ (Pgross):

3. "गैस टैक्स" का ध्यान रखना (ऑपरेशनल लागत)
पैसिव LP के विपरीत, जो महीनों के लिए एक बार गैस का भुगतान करता है, JIT बॉट एक ही ब्लॉक में गैस दो बार (या एक महंगी लेनदेन कई कॉल के साथ) भुगतान करता है।
गैस लागत (Cgas):
mint(): ~150k–200k गैस।decreaseLiquidity()+collect(): ~120k–180k गैस।- फ्लैशबॉट्स के लिए प्राथमिकता शुल्क ताकि ब्लॉक में शामिल होना सुनिश्चित हो।
Ethereum मेननेट पर 30 gwei गैस की कीमत पर, कुल लागत $50–$150 हो सकती है। L2 (Arbitrum/Polygon) में लागत नगण्य है ($0.10–$0.50), लेकिन माइक्रो-स्वैप के लिए प्रतियोगिता अधिक है।
4. ब्रेक-इवन पॉइंट की गणना
हमला तभी सार्थक है जब:

जहां Cslippage तरलता निकालने में हानि है (एक स्वैप के दौरान अस्थायी हानि), और Copportunity पूंजी की लागत है (जैसे फ्लैश लोन पर ब्याज)।
अज्ञात तथ्य: अनुभवी बॉट "Shadow Slippage" को ध्यान में रखते हैं। जब बॉट बड़ी तरलता डालता है, तो कीमत "कड़ी" हो जाती है। यदि उपयोगकर्ता का स्वैप बहुत बड़ा है, तो बॉट कम तरलता डाल सकता है ताकि कीमत अधिक हिले, और अगले ब्लॉक में इसे आर्बिट्राज करने की योजना बनाता है। लेकिन शुद्ध JIT के लिए — जितनी अधिक तरलता, उतना बेहतर।
5. व्यावहारिक गणना उदाहरण (Mainnet)
- पूल: ETH/USDC (0.05%)
- उपयोगकर्ता स्वैप: $500,000।
- वर्तमान Lpool टिक में: $2,000,000।
- बॉट डालता है Ljit: $18,000,000।
- कुल शुल्क: $500,000 x 0.0005 = $250.
- बॉट का हिस्सा: 18M / 18M + 2M = 90%.
- बॉट की आय: $250 x 0.9 = $225.
- गैस लागत: $120 (औसत स्थितियों में)।
- शुद्ध लाभ: $225 - $120 = $105 प्रति ब्लॉक।
थोड़ा लगता है? लेकिन टॉप बॉट रोज़ाना 500–1000 ऐसे हमले करते हैं। यह लगभग बिना बाजार जोखिम के $50,000–$100,000 शुद्ध लाभ प्रतिदिन है।
6. तकनीकी विवरण: टिक की चौड़ाई का चयन
बॉट कभी व्यापक रेंज सेट नहीं करता। रेंज जितनी संकीर्ण होती है (टिक), पूंजी का संकेंद्रण उतना ही उच्च और $L$ उतना ही बड़ा होता है।
JIT मानक: tickLower और tickUpper के बीच न्यूनतम चरण का अंतर (उदाहरण: 0.05% पूल के लिए 10 प्वाइंट)।
टोकन राशि से तरलता की गणना (TypeScript/Ethers):
import { LiquidityAmounts } from '@uniswap/v3-sdk';
import { JSBI } from '@uniswap/sdk-core';
function calculateJitLiquidity(amount0, amount1, currentPrice, tickLower, tickUpper) {
const sqrtRatioX96 = encodePriceSqrt(currentPrice);
const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);
const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);
return LiquidityAmounts.getLiquidityForAmounts(
sqrtRatioX96,
sqrtRatioAX96,
sqrtRatioBX96,
amount0,
amount1,
false
);
}
लेख का सारांश
JIT गणित दक्षता की लड़ाई है। यदि आप देखते हैं कि 1% शुल्क वाले पूल की रिटर्न अचानक गिर गई है — मेमपूल जांचें। संभवतः, वहां एक बॉट सक्रिय है जिसने अपने L को आपके से 50 गुना अधिक प्रभावी गणना किया है।
अगले लेख में: हम फ़ार्मूलों से हार्डवेयर और कोड की ओर जाएंगे। हम उस स्मार्ट कॉन्ट्रैक्ट की आर्किटेक्चर का विश्लेषण करेंगे जो इन गणनाओं को रीयल-टाइम में करता है और जानेंगे कि क्यों Rust ने इस क्षेत्र में सभी अन्य भाषाओं को पीछे छोड़ दिया है।
JIT लिक्विडिटी महारत: Uniswap में MEV के लिए पूर्ण मार्गदर्शिका: 5 में से भाग 2