곡선 불변성으로 - 1부

이 기사는 기계로 번역되었습니다
원문 표시

스테이블스왑(StableSwap) 불변량

스테이블스왑(StableSwap)

증폭된 불변량은 가격 불균형에 대한 유연성을 허용하면서도 거래 중 슬리피지를 줄이기 위해 도입된 수학적 개념입니다. 이는 상수 합 및 상수 곱 불변량의 측면을 결합하여 균형에 가까운 낮은 슬리피지와 모든 가격에서의 추적 가능성을 균형 잡는 공식을 만듭니다.

Verichains를 읽어주셔서 감사합니다! 새 게시물을 무료로 받아보고 제 작업을 지원해 주세요.

  • 상수 곱 불변량(∏x_i=k): 유니스왑 유사 풀에 사용됩니다. 이는 매우 유연하고 모든 가격에서의 거래를 지원하지만, 대량 거래의 경우 슬리피지가 크게 증가합니다.

  • 상수 합 불변량(∑x_i=k): 스테이블코인에 사용됩니다. 균형 잡힌 거래에는 슬리피지가 없지만 큰 가격 불균형을 처리할 수 없습니다.

  • 증폭된 불변량은 두 가지 이점을 결합합니다: 균형에 가까운 낮은 슬리피지와 불균형 거래를 위한 유연성. 스테이블스왑의 증폭 계수 매개변수 특성은 계수가 낮을수록 불변량이 상수 곱에 가까워진다는 것입니다.

슬리피지를 줄이기 위해 레버리지 계수 χ가 도입되었습니다. 이 계수는 불변량의 모양을 조정하여 상수 곱과 상수 합 불변량의 특성을 혼합하고, 다양한 거래 시나리오에서 효율성을 높입니다.

일반 공식은 다음과 같습니다:

여기서:

  • χ: 불변량의 곡률을 제어하는 레버리지 계수.

  • D: 균형 상태의 토큰 가치 합에 대한 상수.

  • n: 풀에 있는 토큰 수.

  • ∑x_i: 토큰 금액의 합.

  • ∏x_i​: 토큰 금액의 곱.

이 방정식이 항상 성립하면 사용자는 레버리지 χ로 거래를 할 수 있습니다. 그러나 이는 이상적인 가격 1.0에서 멀어지는 가격을 지원하지 않습니다. 불변량은 모든 가격을 지원해야 합니다(항상 일부 유동성이 있도록). 따라서 스테이블스왑은 χ를 동적으로 만듭니다. 포트폴리오가 완벽한 균형일 때 상수 A와 같지만, 균형이 벗어날수록 0으로 떨어집니다:

χ를 일반 공식(1)에 추가한 스테이블스왑 불변량:

자주 수행되는 두 가지 수학 연산은 다음과 같습니다:

  • D를 계산하는 것: Ax_1,x_2,...x_n 예약금이 고정된 상태에서 n은 풀이 배포될 때 고정되는 지원 코인 수입니다.

  • 사용자가 x_ix'_i로 늘리려고 할 때 다른 예약금 x_j가 얼마나 감소해야 하는지 계산하는 것.

Curve V1(스테이블스왑)에서 D는 Uniswap V2의 k와 유사하게 동작합니다 - D가 크면 예약금이 더 크고 가격 곡선이 '더 멀리' 있습니다. 유동성이 추가/제거되거나 수수료 변경으로 풀 균형이 변경되면 D가 변경되고 재계산해야 합니다.

S=∑x_i와 P=∏x_i​로 표기하면, 방정식(3)은 다음과 같습니다:

예를 들어 풀에 두 개의 토큰만 있는 경우 불변량은 다음과 같습니다:

Curve 소스 코드에서는 D_next를 계산하여 D를 계산합니다:

aaaa

이 코드의 방정식은 다음과 같이 작성할 수 있습니다:

예를 들어 풀에 100,000 USDC와 1,000,000 USDT가 있다고 가정하면 (3) 또는 (4)를 사용하여 D를 약 1,094,540.84로 계산할 수 있습니다. (5)를 사용한 간단한 Python 스크립트는 다음과 같습니다(예제가 (4)이므로):

그런 다음 (6)을 사용하여 USDT 또는 USDC의 금액을 다시 계산할 수 있습니다.

스테이블스왑은 방정식을 대수적으로 해결할 수 없기 때문에 뉴턴 방법을 사용하여 수치적으로 해결합니다. 스테이블스왑은 (4)식이 균형을 이루면 0이 되는 f(D)를 만들고 도함수 f′(D)를 계산합니다.

스테이블스왑은 뉴턴 방법을 사용하여 D를 해결하며, D는 현재 D의 값으로 이해할 수 있습니다:

먼저 (8)을 재작성하여 모든 요소를 단일 분수로 결합하고 분수의 분자와 분모를 D로 곱합니다:

분모를 f'(D)와 같게 하여 뉴턴 방법을 다시 작성하고 (10)을 대입합니다:

분자의 괄호를 제거하여 항을 분배합니다:

(11)에서 모든 상쇄를 제거한 후 D_p라는 요소를 정의할 수 있습니다:

방정식은 다음과 같습니다:

이 방정식은 (6)에 정의된 방정식과 같습니다.

또한 Viper 코드에서 D_p는 다음과 같이 계산됩니다:

D_P: uint256 = D # D_P = Sfor _x in xp:D_P = D_P * D / (_x * N_COINS)

xp는 토큰 수이므로 루프가 n번 실행됩니다. 따라서 D가 분모에서 n번 자신과 곱해집니다.

그런 다음 사용자가 하나의 예약금 x_i​x'_i​로 늘릴 때 y 또는 x'_j(예약금 x_j​의 이후 값)를 계산할 수 있습니다.

S=∑x_iP=∏x_i. D, A, n으로 토큰 y를 계산한다고 가정하면 SP 공식을 약간 조정합니다:

SP′는 계산하려는 토큰 y를 제외한 모든 토큰의 잔액 합과 곱입니다.

그러면 (4)에서 다음과 같은 공식이 됩니다:

다시 스테이블스왑은 뉴턴 방법을 사용하여 수치적으로 방정식을 해결합니다. 이번에는 f(y)와 도함수 f′(y)를 만듭니다.

y에 대한 스테이블스왑-뉴턴 방법은 다음과 같습니다:

(13)과 (14)를 결합하면 다음과 같은 방정식이 됩니다:

다시 (16) 방법을 재작성하여 분모를 (14)와 같게 합니다:

한편 (12)는 f(ADn^n):으로 다시 작성할 수 있습니다:

(17)에 대입하고 모든 상쇄를 제거합니다:

분자와 분모를 y/(A*n^n):으로 곱합니다:

(12) 불변량을 한 번 더 재작성하고 (20)에 대입합니다:

(23) 공식은 다음과 같이 수행할 수 있습니다:

Viper 소스에서 두 개의 변수가 정의됩니다:

(24) 공식에 대입하면 다음과 같습니다:

Curve 소스 코드에는 y를 계산하는 두 가지 함수, `get_y`와 `get_Y_D`가 있습니다. `get_Y_D` 함수는

감사합니다 Verichains를 읽어주셔서! 새로운 게시물을 받고 제 작업을 지원하시려면 무료로 구독해 주세요.

출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
1
즐겨찾기에 추가
코멘트