Skip to main content

Mathematical Derivations

This page contains the mathematical derivations for the Newton's method implementations used in Curve's AMM contracts.


StableSwap Derivations​

The StableSwap invariant is defined as:

Ann∑xi+D=ADnn+Dn+1nn∏xiA n^n \sum x_i + D = A D n^n + \frac{D^{n+1}}{n^n \prod x_i}

Where:

  • AA is the amplification coefficient
  • nn is the number of coins
  • xix_i is the amount of the ii-th coin
  • DD is the invariant (i.e. the total virtual balance when all coins are equal)

Newton’s Method for Solving DD​

We derive Newton's iteration for solving DD given {xi}i=1n\{x_i\}_{i=1}^n and AA.

Start with:

f(D)=Ann∑xi+D(1−Ann)−Dn+1nn∏xi=0f(D) = A n^n \sum x_i + D(1 - A n^n) - \frac{D^{n+1}}{n^n \prod x_i} = 0

Or equivalently:

f(D)=Dn+1nn∏xi−D(1−Ann)−Ann∑xif(D) = \frac{D^{n+1}}{n^n \prod x_i} - D(1 - A n^n) - A n^n \sum x_i

Taking the derivative:

f′(D)=(n+1)Dnnn∏xi+Ann−1f'(D) = \frac{(n + 1) D^n}{n^n \prod x_i} + A n^n - 1

Newton Iteration​

Using Newton’s formula:

Dnew=D−f(D)f′(D)=Df′(D)−f(D)f′(D)D_{\text{new}} = D - \frac{f(D)}{f'(D)} = \frac{D f'(D) - f(D)}{f'(D)}

Substituting f(D)f(D) and f′(D)f'(D):

Dnew=D((n+1)Dnnn∏xi+Ann−1)−(Dn+1nn∏xi−D(1−Ann)−Ann∑xi)(n+1)Dnnn∏xi+Ann−1=(n+1)Dn+1nn∏xi+AnnD−D−Dn+1nn∏xi+D−AnnD+Ann∑xi(n+1)Dnnn∏xi+Ann−1=nDn+1nn∏xi+Ann∑xi(n+1)Dnnn∏xi+Ann−1\begin{aligned} D_{\text{new}} &= \frac{D \left(\frac{(n+1) D^n}{n^n \prod x_i} + A n^n - 1\right) - \left(\frac{D^{n+1}}{n^n \prod x_i} - D(1 - A n^n) - A n^n \sum x_i \right)}{\frac{(n+1) D^n}{n^n \prod x_i} + A n^n - 1} \\ &= \frac{\frac{(n+1) D^{n+1}}{n^n \prod x_i} + A n^n D - D - \frac{D^{n+1}}{n^n \prod x_i} + D - A n^n D + A n^n \sum x_i}{\frac{(n+1) D^n}{n^n \prod x_i} + A n^n - 1} \\ &= \frac{\frac{n D^{n+1}}{n^n \prod x_i} + A n^n \sum x_i}{\frac{(n+1) D^n}{n^n \prod x_i} + A n^n - 1} \end{aligned}

This corresponds to the newton_D function in math.vy.


Newton’s Method for Solving xjx_j​

Now derive Newton’s iteration for solving xjx_j, given {xi}i≠j\{x_i\}_{i \neq j}, AA, and DD.

Start with the invariant:

Ann∑xi+D=ADnn+Dn+1nn∏xiA n^n \sum x_i + D = A D n^n + \frac{D^{n+1}}{n^n \prod x_i}

Isolate xjx_j:

Ann(xj+∑i≠jxi)+D=ADnn+Dn+1nn(xj∏i≠jxi)A n^n \left(x_j + \sum_{i \neq j} x_i\right) + D = A D n^n + \frac{D^{n+1}}{n^n (x_j \prod_{i \neq j} x_i)}

Multiply both sides by xjx_j:

Ann(xj2+xj∑i≠jxi)+Dxj=ADnnxj+Dn+1nn∏i≠jxiA n^n \left(x_j^2 + x_j \sum_{i \neq j} x_i \right) + D x_j = A D n^n x_j + \frac{D^{n+1}}{n^n \prod_{i \neq j} x_i}

Divide by AnnA n^n:

xj2+xj∑i≠jxi+DAnnxj=Dxj+Dn+1An2n∏i≠jxix_j^2 + x_j \sum_{i \neq j} x_i + \frac{D}{A n^n} x_j = D x_j + \frac{D^{n+1}}{A n^{2n} \prod_{i \neq j} x_i}

Bring terms to one side:

xj2+xj(∑i≠jxi+DAnn−D)−Dn+1An2n∏i≠jxi=0x_j^2 + x_j \left(\sum_{i \neq j} x_i + \frac{D}{A n^n} - D\right) - \frac{D^{n+1}}{A n^{2n} \prod_{i \neq j} x_i} = 0

Define:

f(xj)=xj2+xj(∑i≠jxi+DAnn−D)−Dn+1An2n∏i≠jxif(x_j) = x_j^2 + x_j \left(\sum_{i \neq j} x_i + \frac{D}{A n^n} - D\right) - \frac{D^{n+1}}{A n^{2n} \prod_{i \neq j} x_i}

Taking the derivative:

f′(xj)=2xj+∑i≠jxi+DAnn−Df'(x_j) = 2 x_j + \sum_{i \neq j} x_i + \frac{D}{A n^n} - D

Newton Iteration​

xjnew=xj−f(xj)f′(xj)=xjf′(xj)−f(xj)f′(xj)x_j^{\text{new}} = x_j - \frac{f(x_j)}{f'(x_j)} = \frac{x_j f'(x_j) - f(x_j)}{f'(x_j)}

Substitute in the expressions:

xjnew=xj(2xj+∑i≠jxi+DAnn−D)−(xj2+xj(∑i≠jxi+DAnn−D)−Dn+1An2n∏i≠jxi)2xj+∑i≠jxi+DAnn−D=xj2+Dn+1An2n∏i≠jxi2xj+∑i≠jxi+DAnn−D\begin{aligned} x_j^{\text{new}} &= \frac{x_j \left(2 x_j + \sum_{i \neq j} x_i + \frac{D}{A n^n} - D\right) - \left(x_j^2 + x_j \left(\sum_{i \neq j} x_i + \frac{D}{A n^n} - D\right) - \frac{D^{n+1}}{A n^{2n} \prod_{i \neq j} x_i} \right)}{2 x_j + \sum_{i \neq j} x_i + \frac{D}{A n^n} - D} \\ &= \frac{x_j^2 + \frac{D^{n+1}}{A n^{2n} \prod_{i \neq j} x_i}}{2 x_j + \sum_{i \neq j} x_i + \frac{D}{A n^n} - D} \end{aligned}

This corresponds to the newton_x function in math.vy.


Cryptoswap Derivations​

Newton Step for newton_D() in Tricrypto and Twocrypto​

This derivation explains the mathematical logic behind the newton_D() function used in Curve’s tricrypto and twocrypto pools.


Invariant Function Definitions​

We start with the core function:

F=KDn−1S+P−KDn−(Dn)nF = K D^{n-1} S + P - K D^n - \left(\frac{D}{n}\right)^n

Where:

  • DD: the invariant
  • S=∑xiS = \sum x_i
  • P=∏xiP = \prod x_i
  • nn: number of tokens (typically 2 or 3)
  • γ\gamma: price scale parameter
  • AA: amplification coefficient

Intermediate Definitions​

K=AK0γ2(γ+1−K0)2,K0=PnnDnK = \frac{A K_0 \gamma^2}{(\gamma + 1 - K_0)^2}, \quad K_0 = \frac{P n^n}{D^n} g=γ+1−K0,A^=nnAg = \gamma + 1 - K_0, \quad \hat{A} = n^n A m1=Dg2A^γ2,m2=2nK0gm_1 = \frac{D g^2}{\hat{A} \gamma^2}, \quad m_2 = \frac{2n K_0}{g} neg_fprime=S+Sm2+m1nK0−m2D\text{neg\_fprime} = S + S m_2 + \frac{m_1 n}{K_0} - m_2 D

Derivative of KK​

K′=(AK0γ2(γ+1−K0)2)′K' = \left( \frac{A K_0 \gamma^2}{(\gamma + 1 - K_0)^2} \right)' =(Aγ2(γ+1−K0)2+2AK0γ2(γ+1−K0)3)⋅(−nPnnDn+1)= \left( \frac{A \gamma^2}{(\gamma + 1 - K_0)^2} + \frac{2 A K_0 \gamma^2}{(\gamma + 1 - K_0)^3} \right) \cdot \left( -n \frac{P n^n}{D^{n+1}} \right) =−n(Aγ2g2+2AK0γ2g3)⋅K0D= -n \left( \frac{A \gamma^2}{g^2} + \frac{2 A K_0 \gamma^2}{g^3} \right) \cdot \frac{K_0}{D}

Derivative of FF​

F=KDn−1S+P−KDn−(Dn)nF = K D^{n-1} S + P - K D^n - \left( \frac{D}{n} \right)^n

Taking the derivative:

F′=(n−1)KDn−2S−nKDn−1−Dn−1nn−1+K′Dn−1(S−D)F' = (n-1) K D^{n-2} S - n K D^{n-1} - \frac{D^{n-1}}{n^{n-1}} + K' D^{n-1} (S - D)

Substitute KK and K′K':

F′=−AK0γ2g2Dn−2S−2nAK02γ2g3Dn−2(S−D)−Dn−1nn−1F' = - \frac{A K_0 \gamma^2}{g^2} D^{n-2} S - \frac{2 n A K_0^2 \gamma^2}{g^3} D^{n-2} (S - D) - \frac{D^{n-1}}{n^{n-1}}

Derivation of FF′\frac{F}{F'}​

FF′=AK0γ2g2Dn−1S+P−AK0γ2g2Dn−(Dn)n−AK0γ2g2Dn−2S+2nAK02γ2g3Dn−2(D−S)−(Dn)n−1\frac{F}{F'} = \frac { \frac{A K_0 \gamma^2}{g^2} D^{n-1} S + P - \frac{A K_0 \gamma^2}{g^2} D^n - \left( \frac{D}{n} \right)^n } { - \frac{A K_0 \gamma^2}{g^2} D^{n-2} S + \frac{2 n A K_0^2 \gamma^2}{g^3} D^{n-2}(D - S) - \left( \frac{D}{n} \right)^{n-1} }

Divide numerator and denominator by Dn/nnD^n / n^n:

=A^K0γ2g2D−1S+K0−A^K0γ2g2−1−A^K0γ2g2D−2S+2nA^K02γ2g3D−2(D−S)−nD= \frac { \frac{\hat{A} K_0 \gamma^2}{g^2} D^{-1} S + K_0 - \frac{\hat{A} K_0 \gamma^2}{g^2} - 1 } { - \frac{\hat{A} K_0 \gamma^2}{g^2} D^{-2} S + \frac{2n \hat{A} K_0^2 \gamma^2}{g^3} D^{-2} (D - S) - \frac{n}{D} }

Divide numerator and denominator by A^γ2g2D\frac{\hat{A} \gamma^2}{g^2 D}:

=K0S+m1(K0−1)−K0D−K0SD+m2K0D(D−S)−nm1D= \frac { K_0 S + m_1 (K_0 - 1) - K_0 D } { - \frac{K_0 S}{D} + \frac{m_2 K_0}{D} (D - S) - \frac{n m_1}{D} }

Multiply numerator and denominator by DD:

=K0SD+m1(K0−1)D−K0D2−K0S+m2K0(D−S)−nm1= \frac { K_0 S D + m_1 (K_0 - 1) D - K_0 D^2 } { - K_0 S + m_2 K_0 (D - S) - n m_1 }

Divide numerator and denominator by K0K_0:

=SD+m1(1−1K0)D−D2−S+m2(D−S)−nm1K0= \frac { S D + m_1 \left(1 - \frac{1}{K_0}\right) D - D^2 } { - S + m_2 (D - S) - \frac{n m_1}{K_0} }

Distribute:

=SD+m1(1−1K0)D−D2−S−m2S+m2D−nm1K0= \frac { S D + m_1 \left(1 - \frac{1}{K_0} \right) D - D^2 } { - S - m_2 S + m_2 D - \frac{n m_1}{K_0} }

Substitute the denominator with −neg_fprime-\text{neg\_fprime}:

=SD+m1(1−1K0)D−D2−neg_fprime= \frac{S D + m_1 \left(1 - \frac{1}{K_0} \right) D - D^2}{-\text{neg\_fprime}}

Newton Iteration Step​

Dk+1=Dk−FF′=Dk+SDk+m1(1−1K0)Dk−Dk2neg_fprimeD_{k+1} = D_k - \frac{F}{F'} = D_k + \frac{S D_k + m_1 \left(1 - \frac{1}{K_0} \right) D_k - D_k^2}{\text{neg\_fprime}} =neg_fprimeDk+SDk+m1(1−1K0)Dk−Dk2neg_fprime= \frac{\text{neg\_fprime} D_k + S D_k + m_1 \left(1 - \frac{1}{K_0} \right) D_k - D_k^2}{\text{neg\_fprime}}

Final Form: Positive and Negative Contributions​

Separate into two parts:

Positive Term D+D_+:

D+=(neg_fprime+S)Dkneg_fprimeD_+ = \frac{(\text{neg\_fprime} + S) D_k}{\text{neg\_fprime}}

Negative Term D−D_-:

D−=Dk2−m1(K0−1K0)Dkneg_fprimeD_- = \frac{D_k^2 - m_1 \left( \frac{K_0 - 1}{K_0} \right) D_k}{\text{neg\_fprime}}

Final Newton Step:

Dk+1=D+−D−D_{k+1} = D_+ - D_-