Uniswap v3 में सबसे छोटा Tick -887,272 है और सबसे बड़ा Tick 887,272 है। यह अध्याय इस रेंज (सीमा) के पीछे के तर्क को स्पष्ट करता है, जो उस Tick को खोजने पर आधारित है जो प्रोटोकॉल में स्टोर की जा सकने वाली उच्चतम कीमत के अनुरूप है।
कीमत की सीमा
पिछले अध्याय में, हमने देखा कि प्रोटोकॉल टोकन की कीमत के वर्गमूल (square root) को Q64.96 प्रकार के फिक्स्ड-पॉइंट नंबर्स (fixed-point numbers) के रूप में स्टोर करता है। इस प्रकार के वेरिएबल का अधिकतम पूर्ण संख्या (whole number) मान होता है। परिणामस्वरूप, यह जो उच्चतम कीमत स्टोर कर सकता है वह है।
इसका मतलब है कि प्रोटोकॉल से अधिक की कीमतों को हैंडल नहीं कर सकता है। दूसरे शब्दों में, Uniswap v3 में, कोई टोकन कभी भी से अधिक की वास्तविक कीमत तक नहीं पहुंच सकता है। यदि इस सीमा का पालन नहीं किया गया, तो टोकन एक ऐसे मूल्य तक पहुंच सकता है जिसे प्रोटोकॉल स्टोर नहीं कर सकता है।
इसलिए, उच्चतम कीमत के अनुरूप होने के लिए उच्चतम Tick वह Tick होना चाहिए जो कीमत से मेल खाता हो।
उच्चतम Tick इंडेक्स
कीमत के अनुरूप Tick की गणना करने के लिए, आइए याद करें कि कीमतों और Ticks के बीच का संबंध इस प्रकार दिया गया है:
दोनों तरफ बेस-1.0001 लॉगरिदम (logarithm) लेकर इस संबंध को उलटा (invert) किया जा सकता है।
क्योंकि किसी भी बेस के लिए होता है।
उपरोक्त फॉर्मूला हमें कीमत दिए जाने पर Tick इंडेक्स की गणना करने की अनुमति देता है।
अब, हमें उच्चतम संभव टोकन कीमत, जो कि है, के सापेक्ष Tick इंडेक्स निर्धारित करने की आवश्यकता है।
उपरोक्त फॉर्मूले में का उपयोग करने पर, हमें प्राप्त होता है:
यह गणना Python में इस प्रकार की जा सकती है:
from math import log
log(2**128,1.0001) # log_1.0001(2**128) = 887272
इस कारण से, Tick इंडेक्स 887,272 प्रोटोकॉल द्वारा उपयोग किया जाने वाला सबसे बड़ा इंडेक्स है, क्योंकि 887,272 से बड़े Ticks उन कीमतों के अनुरूप होते हैं जो sqrtPriceX96 वेरिएबल द्वारा स्टोर किए जा सकने वाले अधिकतम मान से अधिक हैं।
न्यूनतम Tick इंडेक्स
न्यूनतम Tick इंडेक्स -887,272 पर सेट है, जो उच्चतम संभव Tick का नकारात्मक (negative) है।
यह समरूपता (symmetry) वांछनीय है क्योंकि टोकन Y के सापेक्ष टोकन X की कीमत, टोकन X के सापेक्ष टोकन Y की कीमत के विपरीत (inverse) होती है। इस प्रकार, न्यूनतम टोकन कीमत को तक सीमित करना उचित है, जो Tick -887272 के अनुरूप है।
कोडबेस में न्यूनतम और अधिकतम मान
न्यूनतम और अधिकतम Tick इंडेक्स Uniswap v3 TickMath लाइब्रेरी में MIN_TICK और MAX_TICK के रूप में हार्डकोड किए गए हैं।
sqrtPriceX96 वेरिएबल द्वारा लिए जा सकने वाले न्यूनतम और अधिकतम मान भी क्रमशः MIN_SQRT_RATIO और MAX_SQRT_RATIO के रूप में हार्डकोड किए गए हैं। इसे नीचे दिए गए स्क्रीनशॉट में देखा जा सकता है, और इन मानों की गणना अगले भाग में की जाएगी।

Ticks और कीमत का वर्गमूल
Introducing ticks in Uniswap v3 अध्याय में, हमने देखा कि Ticks को निम्नलिखित फॉर्मूले द्वारा परिभाषित किया गया है:
जहां Tick इंडेक्स हैं।
कीमतों के बजाय कीमतों के वर्गमूल (square root) के साथ काम करना, और किसी दिए गए Tick इंडेक्स के लिए कीमत के वर्गमूल की गणना करना संभव है।
ऐसा करने के लिए, बस ऊपर दिए गए फॉर्मूले का वर्गमूल लें:
उदाहरण के लिए, Tick 100 के लिए की गणना करने के लिए, हमारे पास है। इस जानकारी से, यदि हम (Tick 100 के लिए कीमत) प्राप्त करना चाहते हैं, तो हमें बस इसका वर्ग (square) करना होगा: ।
ध्यान दें कि हमने नकारात्मक वर्गमूल को नज़रअंदाज़ कर दिया है और केवल सकारात्मक को रखा है, क्योंकि कीमतें नकारात्मक नहीं हो सकती हैं। इसलिए, हम वर्गमूल कीमत का वर्ग (square) करके हमेशा स्पष्ट रूप से कीमत प्राप्त कर सकते हैं।
प्रोटोकॉल में अनुमत Q64.96 में उच्चतम और न्यूनतम वर्गमूल कीमत
MIN_SQRT_RATIO और MAX_SQRT_RATIO के मानों की गणना इस प्रकार की जा सकती है:
न्यूनतम Tick इंडेक्स -887,272 है, इसलिए न्यूनतम अनुमत वर्गमूल कीमत द्वारा दी जाती है। इसकी गणना इस प्रकार की जा सकती है:
इस मान को फिक्स्ड-पॉइंट Q64.96 में बदलने के लिए, इसे से गुणा करने की आवश्यकता है। इस प्रकार,
एक प्रश्न उठता है: क्या हमें इस मान को राउंड अप (round up) या राउंड डाउन (round down) करना चाहिए? आइए कल्पना करें कि हम राउंड डाउन करते हैं, जिसका अर्थ है कि sqrtPriceX96 वेरिएबल का न्यूनतम संभव मान 4295128738 है। दूसरे शब्दों में, sqrtPriceX96 के लिए 4295128738 के मान तक पहुंचना संभव है।
यह मान, 4295128738, Tick -887272 से थोड़ा कम है (याद रखें, Tick -887272 से जुड़ा मान 4295128738.152353 है)। इस प्रकार, यदि कीमत 4295128738 तक पहुंचती है, तो वर्तमान Tick राउंड डाउन के अनुसार सबसे करीबी Tick होगा। दूसरे शब्दों में, यह -887273 होगा। हालांकि, Tick -887273 की अनुमति नहीं है, क्योंकि हमने Tick -887272 को न्यूनतम के रूप में सेट किया है।
इसलिए, हम यह निष्कर्ष निकालते हैं कि राउंड अप करना आवश्यक है। यानी, sqrtPriceX96 वेरिएबल द्वारा लिया जा सकने वाला सबसे छोटा मान 4295128739 है, जैसा कि कोडबेस में हार्डकोड किया गया है।

यह गणना Python में इस प्रकार की जा सकती है:
math.ceil(1.0001**(-887272/2)*(2**96)) # 4295128739
MAX_SQRT_RATIO के लिए गणना भी इसी प्रकार की है, लेकिन इस बार हम Tick इंडेक्स के उच्चतम संभव मान 887,272 का उपयोग करते हैं:
यह गणना Python में की जा सकती है, लेकिन इसमें सटीकता की हानि (precision loss) होगी। अगले अध्याय में, हम देखेंगे कि Solidity किस प्रकार इस तरह की गणना सटीकता खोए बिना बिल्कुल सटीक तरीके से करती है।
Tick इंडेक्स के लिए int24 का उपयोग क्यों किया जाता है
887,272 को स्टोर करने के लिए आवश्यक बिट्स (bits) की संख्या है। चूँकि हमारे पास नकारात्मक (negative) Ticks भी हैं, इसलिए हमें उससे दोगुनी मात्रा में Ticks को स्टोर करने की आवश्यकता होती है। मूल सकारात्मक (positive) संख्याओं और उनके नकारात्मक मानों दोनों को रखने के लिए, हमारे Tick वेरिएबल को 21 बिट्स का समर्थन करने की आवश्यकता होती है।
चूँकि Solidity केवल उन int आकारों का समर्थन करती है जो 8 के गुणक (multiples) हैं, इसलिए सबसे छोटा int आकार जो हमारे लिए आवश्यक सभी Ticks को रख सकता है, वह int24 है। इसलिए, Uniswap V3 Tick इंडेक्स को स्टोर करने के लिए int24 का उपयोग करता है (कोड लिंक), जैसा कि हम नीचे देख सकते हैं।

सारांश
- Tick इंडेक्स , -887,272 और 887,272 के बीच भिन्न हो सकता है। ये Ticks उन न्यूनतम और उच्चतम कीमतों को दर्शाते हैं जो एक टोकन प्रोटोकॉल में ले सकता है, क्रमशः और ।
MIN_SQRT_RATIOऔरMAX_SQRT_RATIOमान Q64.96 प्रारूप (format) में सबसे छोटी और सबसे बड़ी अनुमत वर्गमूल कीमतों का प्रतिनिधित्व करते हैं, जैसा कि प्रोटोकॉल द्वारा परिभाषित किया गया है। इन मानों को कोडबेस में हार्डकोड किया गया है।