← Макалаларга кайтуу
July 18, 2026
5 мүн окуу

Кванттар үчүн Uniswap v3: топтолгон ликвиддүүлүк жана негизги принциптерден баштап tick математикасы

Кванттар үчүн Uniswap v3: топтолгон ликвиддүүлүк жана негизги принциптерден баштап tick математикасы
#uniswap
#defi
#amm
#топтолгон ликвиддүүлүк
#маркет-мейкинг
#lvr
#квант
#эфириум

Uniswap v3'теги LP позициясы — бул кийизделген лимиттик-заказ-китеби диапазон заказы. Эки баанын ортосуна ликвиддүүлүктү салыңыз, ошондо сиз актив диапазонуңуз аркылуу түшүп бара жатканда аны сатып алууга, ал эми жогору көтөрүлүп бара жатканда сатууга милдеттенген болосуз — бул так эле CLOB'то күтүп турган лимиттик заказдардын тору жасаган нерсе. Бирок контракт бааларды, көлөмдөрдү же заказ китебин сактабайт. Ал үч санды сактайт: Q64.96 туруктуу-чекиттик форматтагы квадрат-тамырлык баа, бүтүн tick индекси жана жалпы ликвиддүүлүк мааниси LL. Эгерде сиз v3 позициясы жөнүндө маркет-мейкинг моделиндеги котировкалар жөнүндө ойлонгондой ойлонгуңуз келсе — инвентарь, толтуруу баалары, терс тандоо — анда сиз бул чынжырдагы примитивдер менен алар коддогон трейдинг түшүнүктөрүнүн ортосунда которо алышыңыз керек. Бул макала ошол котормону негизги принциптерден баштап курат, Uniswap v3 whitepaper'ин (Adams, Zinsmeister, Salem, Keefer, Robinson, 2021) жана өзөк контракттарды ээрчип, ар бир олуттуу LP талкуусу азыр башталган жерде аяктайт: loss-versus-rebalancing.

x·y = k формуласынан виртуалдык резервдерге чейин

Uniswap v2 — бул туруктуу-көбөйтүндү маркет-мейкери: пул token0'дун xx резервин жана token1'дин yy резервин кармайт жана ар бир своп боюнча

xy=kx \cdot y = k

шартын мажбурлайт. token0'дун token1 бирдиктериндеги маргиналдык баасы P=y/xP = y/x, ал эми ликвиддүүлүк бүтүндөй баа огу (0,)(0, \infty) боюнча бир калыпта жайылтылат. Бул капиталдын натыйжалуулугу боюнча өтө начар: 0.999 менен 1.001 ортосунда соодалашкан стейблкоин жубу капиталынын 99%'дан ашыгын эч качан басылып чыкпай турган баалардын деңгээлинде кармап турат.

v3'тин кадамы — ар бир LP'ге өз капиталын [pa,pb][p_a, p_b] диапазону менен чектөөгө уруксат берүү. Диапазондун ичинде позиция так эле v2 пулу сыяктуу иштеши керек — ошол эле байланыш ийри сызыгы, ошол эле маргиналдык баа коюу — бирок ошол диапазонду камсыз кылуу үчүн керектүү резервдерди гана колдонуу менен. Whitepaper муну виртуалдык резервдер менен формалдаштырат: позиция xvyv=L2x_v \cdot y_v = L^2 ийри сызыгынын үстүндө жаткан v2-стилиндеги (xv,yv)(x_v, y_v) резервдерин кармагансып иштейт, ал эми реалдуу резервдер — виртуалдык резервдерден позиция диапазондун чектеринде кармай турган нерсени кемитип алганга барабар:

(x+Lpb)(y+Lpa)=L2\left(x + \frac{L}{\sqrt{p_b}}\right)\left(y + L\sqrt{p_a}\right) = L^2

Бул — whitepaper'дин 2.2 теңдемеси жана бул v3'теги эң маанилүү жалгыз теңдеме. Жылдырылган ийри сызык огторго тийишет: P=pbP = p_b'де реалдуу xx резерви нөлгө жетет (позиция 100% token1), ал эми P=paP = p_a'да реалдуу yy резерви нөлгө жетет (100% token0). Диапазондон сырткары позиция инерттелип калат — бир токендин туруктуу баштыгы, эч нерсе таппайт.

Uniswap v2 туруктуу-көбөйтүндү ийри сызыгы менен виртуалдык жана реалдуу резервдерди көрсөткөн v3 жылдырылган ийри сызыгынын салыштырмасы

Ликвиддүүлүк деп аталган LL параметри — бул kk'нын ордун баскан инвариант. Ал L=kL = \sqrt{k} катары аныкталат жана whitepaper ачык кылып койгон таза чечмелениши бар: ликвиддүүлүк — бул "квадрат-тамырлык баанын бирдигине туура келген виртуалдык резервдер". Диапазондун ичиндеги каалаган PP баасында виртуалдык резервдер төмөнкүдөй:

xv=LP,yv=LPx_v = \frac{L}{\sqrt{P}}, \qquad y_v = L\sqrt{P}

Эмне үчүн абалдык өзгөрмө √P болуп саналат

v3'тин өзөгү бааны эмес, P\sqrt{P}'ны кадагалайт, ал sqrtPriceX96 катары, белгисиз Q64.96 туруктуу-чекиттик сан катары сакталат:

sqrtPriceX96=P296\texttt{sqrtPriceX96} = \sqrt{P} \cdot 2^{96}

бул жерде PP — бул сырьевой баа: token0'дун бир базалык бирдигине туура келген token1'дин базалык бирдиктери, ондуктары кошулган (бул тууралуу төмөндө көбүрөөк). Квадрат тамырдын себеби — газ үнөмдөө эмес, алгебра. Виртуалдык резерв теңдиктерин дифференциалдасаңыз, SqrtPriceMath китепканасында ишке ашырылган эки негизги своп теңдемесин аласыз:

Δy=LΔP,Δx=LΔ ⁣(1P)\Delta y = L \cdot \Delta\sqrt{P}, \qquad \Delta x = L \cdot \Delta\!\left(\frac{1}{\sqrt{P}}\right)

Эки токендин дельталары тең квадрат-тамырлык баага (же анын тескерисине) сызыктуу, LL пропорционалдуулук туруктуусу катары. Демек, бир tick ичиндеги свопко ийри сызыкты тескерилетүү да, Ньютон итерациясы да керек эмес — P\sqrt{P}'ны жылдыруу үчүн бир гана көбөйтүү, андан кийин суммаларды эсептөө үчүн эки көбөйтүү. Своп бааны инициалдаштырылган tick аркылуу түртүп жиберээрлик чоң болгондо, пул аны кесип өтөт, ал жерде шилтеме кылынган таза ликвиддүүлүктү (liquidityNet) кошот же алып салат жана жаңы жалпы LL менен улантат. Глобалдык деңгээлде пул — бул бөлүкчө-туруктуу-көбөйтүндү AMM: инициалдаштырылган tick'тердин ортосунда LL туруктуу, tick'терде секирүүлөр менен.

Маркет-мейкер үчүн бул туура акыл-эс модели: пулдун жалпы L(P)L(P) профили — заказ китебиндеги тереңдиктин DEX эквиваленти. CLOB тереңдиги ар бир баа деңгээлине бирдиктерде котировкаланса, AMM тереңдиги — ар бир tick'ке LL — жана айландыруу так жогорудагы Δy=LΔP\Delta y = L\Delta\sqrt{P} теңдиги.

Tick'тер: логарифмдик-аралыктуу баа тору

Диапазондор ыктыярдуу баалардан башталып, аяктай албайт; алар tick'терге тартылышы керек. ii tick'и мына бул баага туура келет:

p(i)=1.0001ip(i)=1.0001i/2p(i) = 1.0001^i \quad\Longrightarrow\quad \sqrt{p(i)} = 1.0001^{i/2}

Ошентип, ар бир tick өз коңшуларынан бир базистик пункт алыс — абсолюттук маанисинде эмес, салыштырмалуу маанисинде. Бул логарифмдик аралык атайын коюлган: туруктуу кошумчалуу тор $0.0001'де соодалашкан токен үчүн келишкис даражада орой, ал эми $100{,}000'де келишкис даражада майда болор эле, ал эми геометриялык тор ар бир баа масштабында бирдиктүү 1 bp чечилишин берет. TickMath китепканасы эки жакка тең айландырат — getSqrtRatioAtTick жана getTickAtSqrtRatio — экспонентаны чакырбастан, алдын ала эсептелген туруктуулар боюнча бит-манипуляциясын колдонот. Tick индекстери MIN_TICK = -887272 жана MAX_TICK = 887272 менен чектелген, бул [2128,2128][2^{-128}, 2^{128}] баа диапазонун камтыйт: uint256 арифметикасында боло турган каалаган токен жубу үчүн жетишерлик кенен.

Ар бир tick колдонууга жарактуу эмес. Ар бир комиссия деңгээли tick аралыгын коет жана позициялар ага бөлүнө турган tick'терди гана колдоно алат:

Комиссия деңгээли Tick аралыгы Мин. диапазон туурасы Тиби колдонулушу
0.01% 1 ~1 bp стейбл/стейбл
0.05% 10 ~10 bp стейбл жуптары, ETH/стейбл
0.30% 60 ~60 bp негизги активдер
1.00% 200 ~2% экзотикалык / волатилдүү

0.05%/0.30%/1% деңгээлдери 2021-жылдын май айында ишке киргизилген; 0.01% деңгээли 2021-жылдын ноябрында башкаруу добушу менен кошулган. Жогорку комиссиялуу пулдардагы орой аралык потенциалдуу кесилип өтө турган tick'тердин санын жана своп газ чыгымдарын чектелген бойдон кармайт.

Баарын бир жолу тиштеген бир ондук капкан: чынжырдагы сырьевой баа — бул базалык бирдиктердеги token0'го туура келген token1. Негизги тармактагы USDC/WETH пулунда token0 — бул USDC (6 ондук), ал эми token1 — WETH (18 ондук), демек ETH үчүн $3{,}000 адамдык баасы 1012/30003.333×10810^{12}/3000 \approx 3.333 \times 10^{8} WETH-wei бир USDC-бирдигине сырьевой баасына туура келет, ал мына бул tick'те жашайт:

i=log1.0001 ⁣(3.333×108)=196,256i = \left\lfloor \log_{1.0001}\!\left(3.333\times10^{8}\right) \right\rfloor = 196{,}256

жана sqrtPriceX961.4465×1033\texttt{sqrtPriceX96} \approx 1.4465 \times 10^{33} менен. Эгерде сиздин мониторинг панелиңиз USDC/WETH үчүн 196k тегерегиндеги tick'ти көрсөтсө, эми себебин билесиз — жана адамдык баа (sqrtPriceX96/296)210dec0dec1\left(\texttt{sqrtPriceX96}/2^{96}\right)^2 \cdot 10^{\,\text{dec}_0 - \text{dec}_1} керек болсо тескерилетилгендигин.

(L, баа диапазону)'дан токендердин көлөмү: так формулалар

Бул бөлүмдүн негизги жыйынтыгы: [pa,pb][p_a, p_b] боюнча LL ликвиддүүлүгү жана учурдагы PP баасы бар позиция берилгенде, ал эмнени кармайт? Своп теңдемелерин диапазон боюнча интегралдоо үч учурду берет:

Баа диапазондон төмөн (PpaP \le p_a) — позиция 100% token0:

x=L(1pa1pb),y=0x = L\left(\frac{1}{\sqrt{p_a}} - \frac{1}{\sqrt{p_b}}\right), \qquad y = 0

Баа диапазондон жогору (PpbP \ge p_b) — позиция 100% token1:

x=0,y=L(pbpa)x = 0, \qquad y = L\left(\sqrt{p_b} - \sqrt{p_a}\right)

Баа диапазондун ичинде (pa<P<pbp_a < P < p_b):

x=L(1P1pb),y=L(Ppa)x = L\left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{p_b}}\right), \qquad y = L\left(\sqrt{P} - \sqrt{p_a}\right)

Бул так эле SqrtPriceMath.getAmount0Delta жана getAmount1Delta эсептеген нерсе (багытталган тегеректөө менен — контракт дайыма колдонуучуга каршы тегеректейт, эгер сиз муну бэктестерде кайра өндүрсөңүз жана wei-деңгээлдеги дал келбестиктер жөнүндө ойлонсоңуз, маанилүү болгон майда-чүйдө).

from math import sqrt

def position_amounts(L: float, pa: float, pb: float, P: float):
    """Token amounts held by a v3 position (float model; core uses Q96 ints)."""
    sa, sb, sp = sqrt(pa), sqrt(pb), sqrt(P)
    if P <= pa:
        return L * (1/sa - 1/sb), 0.0
    if P >= pb:
        return 0.0, L * (sb - sa)
    return L * (1/sp - 1/sb), L * (sp - sa)

Иштелип чыккан мисал: ETH/USDC, диапазон [2500, 3500]

Айталы, ETH P=3000P = 3000 USDC баасында соодалашат жана сиз [2500,3500][2500, 3500] диапазонуна 1 ETH салгыңыз келет. Квадрат тамырлар: 2500=50\sqrt{2500} = 50, 3000=54.7723\sqrt{3000} = 54.7723, 3500=59.1608\sqrt{3500} = 59.1608.

ETH бутагы LL'ди аныктайт:

L=xPpbpbP=1×54.7723×59.160859.160854.7723=738.37L = \frac{x \cdot \sqrt{P}\,\sqrt{p_b}}{\sqrt{p_b} - \sqrt{P}} = \frac{1 \times 54.7723 \times 59.1608}{59.1608 - 54.7723} = 738.37

USDC бутагы андан кийин чыгат:

y=L(Ppa)=738.37×(54.772350)=3,523.69 USDCy = L\left(\sqrt{P} - \sqrt{p_a}\right) = 738.37 \times (54.7723 - 50) = 3{,}523.69 \text{ USDC}

Демек, бул позицияны минттөө 1 ETH + 3,523.69 USDC талап кылат, жалпы наркы $6,523.69, жана бутактар 50/50 эмес экенине көңүл буруңуз — бөлүнүү PP'нын диапазондун ичинде кайсы жерде турганынан көз каранды (асимметриялык диапазон — бул так эле сиз багыттуу көз карашты билдирген, же бир токен менен таза "диапазон заказын" койгон ыкма).

Эми бааны чектерге чейин басып өтөлү:

  • P=2500P = 2500'де позиция толугу менен ETH'ке айланды: x=738.37×(1/501/59.1608)=2.2867x = 738.37 \times (1/50 - 1/59.1608) = 2.2867 ETH, наркы $5,716.68. Сиз түшүп бара жатканда ликвиддүүлүккө таразаланган орточо 3523.69 / 1.2867 \approx \2{,}739$ баасында 1.2867 ETH сатып алдыңыз.
  • P=3500P = 3500'де ал толугу менен USDC'ге айланды: y=738.37×(59.160850)=6,764.06y = 738.37 \times (59.1608 - 50) = 6{,}764.06 USDC. Сиз ETH'иңизди жогору көтөрүлүп бара жатканда орточо $3,240'та саттыңыз.

Мына ушул диапазон-заказ окуусу конкреттелди: позиция 3000'ден 2500'гө чейинки бид-лердин жана 3000'ден 3500'гө чейинки аск-тардын тепкичи болуп саналат, ар бир tick'ке LL'ге пропорционалдуу көлөм менен. Ал эми концентрация — сизге төлөнгөн нерсе: ошол эле $6,523.69 капиталы бар толук-диапазондуу v2-стилиндеги позиция Lv2=V/(2P)=59.55L_{v2} = V/(2\sqrt{P}) = 59.55'ке ээ болмок — топтолгон позиция ар бир tick'ке 12.4× көбүрөөк тереңдик котировкалайт жана (диапазондо болгондо) капиталдын ар бир долларына 12.4× ылдамдыкта комиссия табат.

Комиссия эсеби: feeGrowthGlobal жана feeGrowthInside

v3 комиссиялары позицияга кошулуп кайра инвестициялашпайт (v2'ден атайын айырма, ал жерде комиссиялар k\sqrt{k}'га кайра инвестицияланчу). Алар токен боюнча жанаша топтолот жана эсеп — O(1) китеп жүргүзүүнүн кичинекей шедеври, ар бир LP аналитикасы конвейери аны кайра ишке ашыргандыктан түшүнүүгө татыктуу.

Пул эки глобалдык аккумуляторду кармайт, feeGrowthGlobal0X128 жана feeGrowthGlobal1X128: пул башталгандан бери ликвиддүүлүктүн бирдигине туура келген жыйынды комиссиялар, Q128.128 туруктуу-чекиттик форматта. Ар бир свопто комиссия суммасы (кириш токенден алынат) учурдагы диапазондо турган LL'ге бөлүнөт жана аккумуляторго кошулат. Бул — v3 экономикасынын кардиналдык эрежесинин артындагы механизм: комиссиялар своп болгон учурда диапазондо турган ликвиддүүлүккө гана топтолот. Диапазондон тышкары позициялар жөн гана инерттик инвентарь эмес — алар инерттик болуп турганда так нөл табат.

Глобалдык өсүштүн туура тилкесин чектелген диапазонго ыйгаруу үчүн ар бир инициалдаштырылган ii tick'и feeGrowthOutside0/1X128'ди сактайт — учурдагы баага салыштырмалуу tick'тин башка жагында болгон комиссия өсүшү (маани tick кесилип өткөн сайын чечмеленишин алмаштырат, бул схеманы O(1) кылат). Андан кийин учурдагы ici_c tick'и менен [i,iu][i_\ell, i_u] боюнча позиция үчүн:

fbelow(i)={fo(i)icifgfo(i)ic<ifabove(iu)={fo(iu)ic<iufgfo(iu)iciuf_{\text{below}}(i_\ell) = \begin{cases} f_o(i_\ell) & i_c \ge i_\ell \\ f_g - f_o(i_\ell) & i_c < i_\ell \end{cases} \qquad f_{\text{above}}(i_u) = \begin{cases} f_o(i_u) & i_c < i_u \\ f_g - f_o(i_u) & i_c \ge i_u \end{cases} finside=fgfbelow(i)fabove(iu)f_{\text{inside}} = f_g - f_{\text{below}}(i_\ell) - f_{\text{above}}(i_u)

Ар бир позиция feeGrowthInsideLast снапшотун сактайт жана чогултулбаган комиссиялар жөн гана

fees owed=Lfinsidenowfinsidelast2128\text{fees owed} = L \cdot \frac{f_{\text{inside}}^{\text{now}} - f_{\text{inside}}^{\text{last}}}{2^{128}}

позиция кайрылган сайын жалкоолук менен жаңыртылат. Эки практикалык кесепет. Биринчиден, feeGrowthInside дельталары — позициянын комиссия кирешесин өлчөөнүн жалгыз чынчыл ыкмасы — пул деңгээлиндеги көлөмдү тандап алуу жана TVL'деки үлүшүңүз боюнча пропорциялоо баа сиздин диапазон чектериңиздин тегерегинде тентигенде дайыма туура эмес чыгат. Экинчиден, комиссиялар кошулуп кайра инвестициялашпастан tokensOwed катары турганы үчүн, реалдашкан LP кирешелеринде v2'де жок болгон накталай-акча тартылуу мүчөсү бар; авто-компаундинг сейфтери так ушуну арбитраждап жок кылуу үчүн бар (өз комиссиясын минус).

feeGrowthGlobal, диапазон чек tick'теринде feeGrowthOutside жана feeGrowthInside кемитүүсүнүн диаграммасы

Төлөм: сизге кармап туруу үчүн акы төлөнгөн кыска стрэддл (балким)

Диапазондун ичинде позициянын наркы баанын функциясы катары төмөнкүдөй:

V(P)=x(P)P+y(P)=L(2PpaPpb)V(P) = x(P) \cdot P + y(P) = L\left(2\sqrt{P} - \sqrt{p_a} - \frac{P}{\sqrt{p_b}}\right)

PP боюнча ойпоң — 2LP2L\sqrt{P} мүчөсү бүткүл окуя. Диапазондон тышкары ал сызыктуу болот: төмөндө еңкейиш x(pa)x(p_a) (сиз туруктуу ETH баштыгы боюнча узунсуз), жогоруда еңкейиш 0 (сиз USDC'де тегизсиз). Биздин иштелип чыккан мисалды диапазон боюнча жүргүзүп, жөн гана салынган токендерди кармап туруу менен салыштырыңыз:

PP (USDC/ETH) LP наркы HODL наркы Дивергенция
2500 5,716.68 6,023.69 −307.02
2750 6,200.4 6,273.69 −73.3
3000 6,523.69 6,523.69 0
3250 6,706.3 6,773.69 −67.4
3500 6,764.06 7,023.69 −259.63

LP эки багытта тең HODL'ден кем иштейт жана аны минттөө баасында гана дал келет. Чектелген жогорку потенциал, күчөтүлгөн төмөнкү катышуу, страйкта максималдуу салыштырмалуу нарк... бул — кыска стрэддлдин төлөмү (тагыраак айтканда, сызыктуу куйруктар HODL эталонуна каршы неттелгенден кийин, [pa,pb][p_a, p_b] боюнча страйктелген опциондор тилкесиндеги кыска позиция). Комиссия агымы — премия. Диапазонду топтоо — тыгызыраак страйктерди тандоо: диапазондо турганда убакыт бирдигине көбүрөөк премия, баа кыймылдаганда тезирээк жана тереңирээк дивергенция. Ар бир v3 LP — кыска волатилдүүлүк трейдери, каалады же жок, — заказ китеби маркет-мейкерлери үчүн Avellaneda–Stoikov формалдаштырган инвентарь-тобокелдик компромиссинин чынжырдагы бир тууганы, диапазондун туурасы котировкаланган спрэддин ролун ойногону менен.

Ойпоң кыска-стрэддлге окшош төлөмдү көрсөткөн баа диапазону боюнча LP позициясынын наркынын HODL менен салыштырмасы

Ошол таблицадагы боштуктун салттуу аты — убактылуу (дивергенциялык) жоготуу, бирок IL-versus-HODL — кемчиликтүү эталон: ал сиз ликвиддүүлүк камсыздоочу катары көргөн жоготууну баары бир алып жүрө турган рыноктук тобокелдик менен аралаштырат. Тагыраак ажыратуу Milionis, Moallemi, Roughgarden жана Zhang'дан (2022), "Automated Market Making and Loss-Versus-Rebalancing" (arXiv:2208.06046) келет. LP'ди HODL'ге эмес, ар бир учурда пул менен ошол эле токен көлөмдөрүн кармаган кайра баланстоочу портфелге каршы эталонго алыңыз — бирок ал арбитраждарга каршы эмес, сүрүлүүсүз тышкы рыноктук баада соода жасайт. Айырма — LVR ("левер"): таза терс тандоо болуп саналган LP P&L компоненти, ар бир баа кыймылынан кийин AMM'дин эскирген котировкаларын шыпырган арбитражчыларга төлөнөт. σ\sigma волатилдүүлүгү менен геометриялык-Броундук баада LVR лезги ылдамдыкта топтолот:

(σ,P)=σ2P22x(P)\ell(\sigma, P) = \frac{\sigma^2 P^2}{2}\,|x'(P)|

— авторлор айткандай, "AMM'дер үчүн Блэк–Шоулз формуласы", x(P)|x'(P)| учурдагы баада пулдун маргиналдык тереңдиги менен. Толук-диапазондуу туруктуу-көбөйтүндү пул үчүн бул убакыт бирдигине пул наркынын атактуу σ28\frac{\sigma^2}{8}'ине кулайт: 5% күндүк волатилдүүлүктө пулдун болжол менен 3.1 bp'ы ар күнү арбитражчыларга агып кетет, комиссиялар болобу же жокпу. Концентрация x(P)|x'(P)|'ди көбөйтөт — жогорудагы биздин 12.4× тереңдик мисалы ошондой эле диапазондо турганда ~12.4× LVR машинасы. Позиция +EV болушу үчүн комиссиялар ал агуудан алдыда болушу керек, ал эми LVR ("IL"ден айырмаланып) — хеджделе турган, алдын ала болжолдоно турган иштеп жаткан чыгым, бул аны эсептин туура бирдиги кылат. Толук пайдалуулук эсеби — комиссия APR'ы LVR'га каршы реалдашкан волатилдүүлүккө каршы, качан LPинг дельта-хеджделген кыска опциондорду жеңет — жакында чыга турган убактылуу жоготуу жана LVR терең изилдөөсүнүн темасы, ал эми хеджирлөө механикасы өзүнчө v3 LP стратегиялары жана хеджирлөөдө каралат.

Дагы бир чыгым бир катмар төмөндө жашайт: AMM котировкалары кимдир бирөө соода кылганда гана жаңырган үчүн, ар бир LP позициясы ошол соодалардын тегерегинде ойнолгон мемпул оюндарына да туш болот — сиздин комиссияңызды төлөгөн своп кылуучуларга каршы сэндвич чабуулдары жана LVR'иңизди блок сайын реалдаштырган арбитраж бандлдары. Ошол экосистема MEV жана сэндвич-чабуул макаласында картага түшүрүлгөн.

Пул абалын чынжырда окуу

Жогорудагынын баары пул контрактына каршы үч арзан чакыруудан байкалат.

slot0() ысык абалды бир сактагыч слотуна оройт: sqrtPriceX96, учурдагы tick, оракул байкоо индекстери жана протокол-комиссия/кулпу желектери. liquidity() учурдагы диапазондо турган жалпы LL'ди кайтарат — эске алыңыз, бул TVL эмес; бул учурдагы tick'те активдүү тереңдик параметри жана баа инициалдаштырылган tick'ти кесип өткөндө ал үзгүлтүктүү секирет. ticks(int24) ар бир tick абалын кайтарат: liquidityGross (tick'ке шилтеме кылган жалпы LL), liquidityNet (солдон оңго кесип өткөндө кошулган белгилүү LL) жана feeGrowthOutside аккумуляторлору. Инициалдаштырылган tick'тер боюнча liquidityNet'ти итерациялоо (tickBitmap бардык 1.7 миллионду сканербестен, кайсылары бар экенин айтат) толук тереңдик профилин L(i)L(i) калыбына келтирет — сиздин заказ китеби снапшотуңуз.

from web3 import Web3

w3 = Web3(Web3.HTTPProvider(RPC_URL))
pool = w3.eth.contract(address=POOL, abi=POOL_ABI)  # USDC/WETH 0.05%

sqrt_price_x96, tick, *_ = pool.functions.slot0().call()
L = pool.functions.liquidity().call()

raw_price = (sqrt_price_x96 / 2**96) ** 2          # token1/token0, base units
eth_usdc  = 1 / (raw_price * 10**(18 - 6))          # human USDC per ETH
depth_1tick = L * (1.0001**0.5 - 1) * (sqrt_price_x96 / 2**96)

Позициялардын өзү эки жерде жашайт. Өзөк пул аларды (owner, tickLower, tickUpper) боюнча ачкычтайт — ар бир ээси-диапазон үчилтигине бир жалпы слот. Ритейл жана көпчүлүк фонддор анын ордуна периферия NonfungiblePositionManager (негизги тармак: 0xC36442b4a4522E871399CD717aBDD847Ab11FE88) аркылуу минттейт, ал ар бир позицияны ERC-721 NFT'ге ороп, толук кортежди кайтарган positions(tokenId)'ди ачат: токендер, комиссия деңгээли, диапазон, LL, feeGrowthInsideLast жана tokensOwed. Портфелди мониторинг кылуу үчүн ошол бир чакыруу плюс пулдун учурдагы feeGrowthInside'и (мурунку бөлүмдөгүдөй ticks()'тен кайра эсептелет) индексаторго тийбестен рыноктук-баа наркын жана топтолгон комиссияларды берет — бирок каалаган тарыхый нерсе үчүн сиз своп-окуяларды кайра ойнотууну же субграфты каалайсыз, анткени комиссия өсүшү жол-көз каранды жана чынжыр учурдагы аккумуляторлорду гана сактайт.

Капиталды жайгаштыраардан мурун ичине сиңирүүгө татыктуу эки операциялык деталь. Биринчиден, tick аралыгы сиздин стратегия мейкиниңизди кванттайт: 0.05% деңгээлинде сиз 10-bp-туурасындагы диапазондорду коюп, чыныгы лимиттик заказга жакын нерсени иштете аласыз (спот үстүнөн/астынан гана минттеп, комиссияны чогултуп, кесип өткөндөн кийин күйгүзүп — whitepaper бул "диапазон заказы" колдонуу учурун ачык чагылдырат), ал эми 1% деңгээлинде сиздин минималдуу диапазонуңуз ~2% туурасында жана LOB аналогиясы орой болуп калат. Экинчиден, диапазон заказы — бул жокко чыгаруу артыкчылыгы жок лимиттик заказ: эгер баа сиздин диапазонуңузду кесип өтүп, кайра келсе, сиз инвентарды толук айландырасыз жана четти кайра бересиз (комиссияларды сактап). Пассивдүү диапазондор — сиз тарта албай турган котировкалар — так ушул себептен кайра баланстоо-жыштыгы суроосу жана ага жооп берүү үчүн LVR линзасы ушунчалык маанилүү.

Бул сизди кайда калтырат

v3 стеги, кысылган түрдө: баалар — 1.0001-геометриялык тордогу tick'тер; тереңдик — LL, квадрат тамырлардын айырмаларынан башка эч нерсеге муктаж болбой токендердин көлөмүнө айландырылат; комиссиялар — сиз диапазон чектериңиз боюнча айырмалаган LL-башына аккумулятор; жана натыйжада болгон позиция — иштеп жаткан чыгымынын аты, формуласы жана arXiv номери бар кыска-волатилдүү диапазон заказы. Примитивдер колго тийгенде, кызыктуу суроолор сандык болуп калат: канчалык кенен, канчалык көп кайра баланстоо жана берилген пул менен режим үчүн комиссиялар LVR'ды жапабы — так ушул серия кийинки кадамында барат.

Шилтемелер

  • Adams, H., Zinsmeister, N., Salem, M., Keefer, R., Robinson, D. (2021). Uniswap v3 Core (whitepaper).
  • Uniswap v3 өзөк китепканалары: TickMath.sol, SqrtPriceMath.sol, Position.sol, Tick.sol.
  • Milionis, J., Moallemi, C., Roughgarden, T., Zhang, A. L. (2022). Automated Market Making and Loss-Versus-Rebalancing. arXiv:2208.06046.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Рынктан бир кадам алдыда болуңуз

AI соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.