शुरुआती अध्यायों में, हमने ticks के कॉन्सेप्ट को पेश किया था, जो प्राइस कर्व (price curve) को डिस्क्रीटाइज़ (discretize) करते हैं। एक tick वह प्राइस है जिसे फॉर्मूले द्वारा परिभाषित किया जाता है, जहाँ को tick index कहा जाता है।
Tick indexes पूर्णांक (integers) होते हैं जो की रेंज में होते हैं, जिसके परिणामस्वरूप प्राइस कर्व पर 1,774,545 ticks होते हैं, से लेकर तक।
Ticks कर्व पर वे बिंदु होते हैं जहाँ लिक्विडिटी (liquidity) बदल सकती है। उदाहरण के लिए, एक liquidity provider दो ticks के बीच लिक्विडिटी जोड़ सकता है लेकिन किन्हीं दो ऐसे मनमाने बिंदुओं के बीच ऐसा नहीं कर सकता जो ticks नहीं हैं।
इस अध्याय में हम यह देखेंगे कि इन सभी 1,774,545 ticks का उपयोग एक pool में नहीं किया जा सकता है, और किन विशिष्ट ticks का उपयोग किया जा सकता है, यह pool बनाते समय किए गए चुनाव पर निर्भर करता है।
Tick spacing
प्रत्येक pool एक वैल्यू को परिभाषित करता है जिसे tick spacing कहा जाता है, जो लगातार दो अनुमति प्राप्त (allowed) ticks के बीच की दूरी निर्धारित करता है।
उदाहरण के लिए, यदि pool का tick spacing 10 पर सेट है, तो केवल वे tick indexes उपयोग योग्य हैं जो 10 के गुणज (multiples) हैं, जैसे -20, -10, 0, 10, 20, आदि। यदि tick spacing 60 पर सेट है, तो केवल 60 के गुणज अनुमत हैं, जैसे -120, -60, 0, 60, 120, आदि, जैसा कि नीचे दिए गए चित्र में दर्शाया गया है। दोनों ही स्थितियों में, लिक्विडिटी प्रदान करने के लिए सीमा (boundary) के रूप में 55 जैसे tick का उपयोग नहीं किया जा सकता है।

वह वेरिएबल जो किसी pool में tick spacing को परिभाषित करता है, उसे tickSpacing नाम दिया गया है और इसे pool बनाने के समय सेट किया जाता है। वास्तव में, tickSpacing को pool fee से जोड़ा जाता है, जिसमें प्रत्येक fee tier एक संबंधित tick spacing निर्धारित करता है।
Volatility, fee tier और tick spacing के बीच का संबंध
Tick spacing और volatility
Uniswap V3 एसेट पेयर्स (asset pairs) की अलग-अलग volatility (अस्थिरता) को ध्यान में रखने के लिए विभिन्न tick spacings का समर्थन करता है। एक swap में tick को पार करने (cross करने) पर gas लागत आती है, इसलिए एक सामान्य ट्रेड के दौरान ticks को कम से कम बार पार किया जाना चाहिए।
अधिक volatile पेयर्स को अत्यधिक tick crossings को कम करने के लिए व्यापक (wider) tick spacing से लाभ होता है। हालाँकि, यदि spacing बहुत अधिक चौड़ी है, तो liquidity providers अपनी लिक्विडिटी को उन प्राइस क्षेत्रों के आसपास सटीक रूप से स्थित नहीं कर सकते जहाँ उन्हें पेयर की मार्केट वैल्यू होने की उम्मीद होती है।
नीचे दिए गए एनीमेशन को देखें, जहाँ हम दो मामले प्रस्तुत करते हैं। पहले मामले में, जिसमें एक अत्यधिक volatile पेयर शामिल है, प्राइस काफी भिन्न हो सकता है। इसलिए, यदि हम swaps को केवल दो अनुमति प्राप्त (allowed) ticks को पार करने तक सीमित करने का प्रयास करना चाहते हैं, तो अनुमति प्राप्त ticks के बीच की दूरी बड़ी होनी चाहिए। दूसरे मामले में, जिसमें एक अधिक स्थिर (stable) पेयर शामिल है, tick spacing छोटा हो सकता है।
Volatility और fees
इसके अलावा, liquidity providers के लिए impermanent loss के जोखिम पर विचार करें। अत्यधिक volatile एसेट्स अधिक impermanent loss का कारण बनते हैं, जबकि अधिक स्थिर एसेट्स कम impermanent loss का कारण बनते हैं। उदाहरण के लिए, एक stablecoin पेयर में impermanent loss का लगभग कोई जोखिम नहीं होता है, जबकि एक memecoin पेयर में अत्यधिक उच्च जोखिम होता है।
इस प्रकार, LPs अत्यधिक volatile एसेट्स के लिए लिक्विडिटी प्रदान करते समय impermanent loss की भरपाई के लिए अधिक fees की मांग करेंगे। इसी तरह, ट्रेडर्स volatile एसेट्स पर अधिक fees को सहन कर सकते हैं क्योंकि उन्हें ट्रेड करने से संभावित रिटर्न बहुत अधिक होता है।
यह दर्शाता है कि पेयर की volatility, tick spacing और fees के बीच का संबंध इस प्रकार होना चाहिए: impermanent loss के उच्च जोखिम वाले volatile पेयर्स के लिए, tick spacing और fees दोनों अधिक होने चाहिए, जबकि impermanent loss के कम जोखिम वाले अधिक स्थिर पेयर्स के लिए, दोनों कम हो सकते हैं।
यह तय करना उपयोगकर्ता पर निर्भर है कि कौन से पेयर्स अधिक स्थिर या volatile हैं। प्रोटोकॉल जो परिभाषित करता है वह tick spacing और fee tier के बीच का संबंध है।
Uniswap V3 factory कॉन्ट्रैक्ट कुछ डिफ़ॉल्ट वैल्यूज़ प्रदान करता है, लेकिन Uniswap governance अतिरिक्त tick-spacing-fee पेयर्स जोड़ सकता है। यह अगले अनुभाग का विषय है।
कोड में Fee और tick spacing
Fee और tick spacing के बीच का संबंध UniswapV3Factory.sol कॉन्ट्रैक्ट में feeAmountTickSpacing मैपिंग (नीचे दिए गए चित्र में पीला बॉक्स) में समाहित है। Factory कॉन्ट्रैक्ट नए pools बनाने के लिए जिम्मेदार है।
Fee और tick spacing के बीच का प्रारंभिक संबंध Factory कॉन्ट्रैक्ट के डिप्लॉयमेंट (deployment) के दौरान परिभाषित किया गया था, जैसा कि नीचे दी गई छवि (हरा बॉक्स) में कंस्ट्रक्टर (constructor) में दिखाया गया है।

Fee और tick spacing के बीच वर्तमान संबंध निम्नलिखित तालिका में दिखाया गया है। Fee और tick spacing के बीच कोई सख्त “गणितीय” (mathematical) संबंध नहीं है। किसी दिए गए tick spacing के लिए सर्वोत्तम fee तय करना प्रोटोकॉल governance पर निर्भर करता है।
| fee tier | fee tier (basis points) | tick spacing |
|---|---|---|
| 0.01% | 1 | 1 |
| 0.05% | 5 | 10 |
| 0.3% | 30 | 60 |
| 1% | 100 | 200 |
जैसा कि हम देख सकते हैं, 0.01% की fee 1 के tick spacing से मेल खाती है, जबकि 0.3% की fee 60 के tick spacing से मेल खाती है।
Basis points
Fees को basis points में मापा जाता है। एक basis point 1 प्रतिशत का 1/100वाँ हिस्सा, या 0.01% होता है। उदाहरण के लिए, 5 basis points का मतलब 5 * 0.01%, या 0.05% है।
Fee tiers को अपडेट किया जा सकता है
Fee से tick spacing तक की मैपिंग को enableFeeAmount फ़ंक्शन का उपयोग करके अपडेट किया जा सकता है, जिसे केवल governance द्वारा ही कॉल किया जा सकता है।

1 basis point टियर (0.01% fee) कंस्ट्रक्टर में नहीं है, लेकिन Uniswap governance ने 5 मार्च, 2022 को 1 basis point fee tier जोड़ा। आप इस ट्रांज़ैक्शन को tally dashboard पर देख सकते हैं।
उपलब्ध fee tiers विभिन्न चेन्स (chains) पर भिन्न हो सकते हैं। उदाहरण के लिए, L2 Base पर, 2, 3, और 4 basis points के लिए fee tiers उपलब्ध हैं। यह जोड़ 16 सितंबर, 2024 को governance द्वारा निष्पादित (executed) किया गया था।
Factory कॉन्ट्रैक्ट का उपयोग करके एक नया pool बनाना
एक नया pool बनाने के लिए, एक उपयोगकर्ता को दोनों टोकन के एड्रेस (addresses) और वांछित (desired) fee tier को पास करना होगा। फिर tick spacing की गणना feeAmountTickSpacing मैपिंग से की जाती है।
एक pool को विशिष्ट रूप से इन तीन पैरामीटर्स द्वारा परिभाषित किया जाता है। इस प्रकार, समान टोकन पेयर लेकिन अलग-अलग fee tiers के साथ pools बनाना संभव है। इस स्थिति में, मार्केट यह निर्धारित करता है कि इनमें से कौन सा pool ‘लोकप्रिय’ (popular) बनता है।
Factory कॉन्ट्रैक्ट द्वारा pool का डिप्लॉयमेंट (deployment)
जब pool को factory कॉन्ट्रैक्ट द्वारा डिप्लॉय किया जाता है, तो इसमें fee और tickSpacing दोनों पास किए जाते हैं और इन्हें पब्लिक इम्यूटेबल (public immutable) वेरिएबल्स के रूप में सेट किया जाता है।

ध्यान दें कि createPool को कौन कॉल कर सकता है, इस पर कोई प्रतिबंध नहीं है — यह तब तक परमिशनलेस (permissionless) है जब तक कि उस टोकन पेयर और fee tier के लिए pool पहले से न बनाया गया हो।
ये दोनों इम्यूटेबल वेरिएबल्स (fee और tickSpacing) UniswapV3Pool.sol में पब्लिक हैं। वास्तव में, pool के कंस्ट्रक्टर में पास किए गए सभी आर्गुमेंट्स (arguments) पब्लिक इम्यूटेबल वेरिएबल्स में स्टोर किए जाते हैं:

उदाहरण (Examples)
आइए रनिंग उदाहरण के तौर पर USDC/ETH Pool का उपयोग करें। हम देख सकते हैं कि fee 5 basis points है और इसका tick spacing 10 है:

इस तरह उस pool के लिए frontend को पता चलता है कि fee tier 0.05% है।

सारांश (Summary)
- किसी pool में सभी ticks का उपयोग नहीं किया जा सकता है—केवल वे ही अनुमत हैं जो tick spacing के गुणज (multiples) हैं।
- Tick spacing और fees के बीच का संबंध Factory में एक मैपिंग में सेट किया गया है। Governance अधिक tick spacing और fee विकल्प जोड़ सकता है।
- बार-बार tick पार करने (crossing) के परिणामस्वरूप उच्च gas लागत आती है, जैसा कि हम swaps का अध्ययन करते समय सीखेंगे। इसलिए, अधिक प्राइस volatility और/या कम लिक्विडिटी वाले pools को अनुमति प्राप्त ticks के पार होने की आवृत्ति को कम करने के लिए बड़े tick spacing का उपयोग करना चाहिए।
- दूसरी ओर, कम प्राइस volatility और/या अत्यधिक लिक्विड (liquid) पेयर्स वाले pools के लिए, tick spacing छोटा हो सकता है, क्योंकि liquidity providers को यह अधिक स्पष्ट रूप से पता होगा कि अपनी लिक्विडिटी को कहाँ केंद्रित (concentrate) करना है।
अभ्यास प्रश्न (Practice Exercises)
Uniswap V3 Pools को देखें।
- मेननेट (mainnet) पर USDC/USDT के लिए tick spacing क्या है? चूँकि समान पेयर लेकिन अलग-अलग fee वाले कई pools हो सकते हैं, ऐसे pool की तलाश करें जिसका पिछले दिन का वॉल्यूम कम से कम एक मिलियन डॉलर हो।
- किसी memecoin वाले पेयर के लिए tick spacing क्या है?