Tick (v3)

김현학·2024년 9월 23일

Uniswap v4 Hook

목록 보기
4/6
post-thumbnail

이전 포스트: Concentrated-Liquidity에서 특정한 가격대에 한정하여 유동성을 공급하는 핵심 개념을 다루었다. tick 그리고 tick-space는 기존 연속적(continuous; unsigned int) 형태의 가격을, 불연속적(descrete) 형태로 대체하기 위해 탄생한 개념이다.

1. Tick이란 무엇인가?

  • v3은 tick/tick-index/indices, tick-spacing 그리고 tick-bitmap을 통해 가격의 범위(price range)를 효율적으로 추적하고 관리할 수 있는 새로운 수 체계를 구축했다.
  • 다음 수식의 itick 또는 tick-index에 해당한다. int24 로 선언되었으나 모든 값을 사용하지는 않고, [−887272,887272] 사이의 값으로 정의된다.
  • 이는 만분율(Basis point)의 개념을 차용한 것이고, 성질 또한 근본적으로 지수 함수와 동일하다고 생각하면 된다.

1-1. int24 tick 이 닫힌 구간 [−887272,887272]의 값만 사용하는 이유

확실한 이유는 없지만, 조사 과정에서 정리한 합리적인 추론을 소개한다.

  • 이 이상의 값을 표현하는 것이 비현실적이라고 판단했다는 것이다.
  • 32 bytes로 표현할 수 있는 가장 큰 수: type(uint256).max를 price의 최대값으로 설정했다는 것이다.
    • 이 경우, sqrt(price)는 근사적으로 2**128를 최대값으로 가지게 되고, 밑을 1.0001(basis point)로 취하는 로그에 진수로 넣어 계산하면 다음과 같이 동일한 범위의 구간을 얻을 수 있게 된다.

Q64.96 자료형에 가격 정보를 저장하고, tick-index와 상호 변환하는 과정은 별도의 🚧 작성 예정에서 다룰 예정이다.

2. tick-spacing이란 무엇인가?

  • 구분구적법을 활용한 정적분의 연산을 정의할 때, 구간 [a,b]에 대해 delta-x로 각 직사각형의 너비를 정의한다. tick-spacing은 delta-x와 같은 존재다.
  • 예를 들어, tick-spacing이 2인 경우, price range를 정의할 때 사용되는 lower tick (i_l)과 upper tick (i_u) 모두 2의 배수이어야만 한다.
  • 이는 pool의 가격 민감도를 결정한다. spacing 값이 클수록 가격 민감도는 낮아지며, 공급된 유동성 간 포지션이 겹칠 확률이 증가한다. 그러나 값이 너무 커지면, 시장에서의 가격 변동을 제대로 반영하지 못할 수 있다.
    • 반대로 값이 너무 작으면, 다수의 tick에 걸쳐 거래가 진행되는cross-indices 연산이 수행될 때, 상호작용하는 모든 컨트랙트의 상태를 변경하느라 높은 가스비를 지불해야 한다. (v3 기준)

3. tick-bitmap이란 무엇인가?

  • tick의 유동성 공급 여부를 판별할 수 있는 flag를 bitmap 형식의 자료구조를 활용하여 관리한다.
  • 주어진 int24 tick 값에 대해 256(8비트)에 대한 몫과 나머지로 해싱한다.

3-1. bitPos 계산 시, 왜 uint8 타입 캐스팅을 하는지?

  • Python의 경우, 모듈로 연산 결과는 제수(right operand)의 부호를 따라간다.
  • 그러나 Solidity에서의 모듈로 연산 결과는 피제수(left operand)의 부호를 따라간다.
    • 따라서, uint8 캐스팅으로 하위 8비트만 절삭해야, 피제수가 음수이더라도 index로 활용할 수 있는 [0, 256) 구간의 값이 나오게 된다.

0개의 댓글