Developers
Search…
⌃K

Weighted Math

Overview

Weighted Math is designed to allow for swaps between any assets whether or not they have any price correlation. Prices are determined by the pool balances, pool weights, and amounts of the tokens that are being swapped.
Balancer's Weighted Math equation is a generalization of the
xy=kx*y=k
constant product formula, accounting for cases with
n2n \geq2
tokens as well as weightings that are not an even 50/50 split.
For more formulas and derivations of the below formulas, please refer to the Balancer Whitepaper.

Implementations

TypeScript

Developers can use the TypeScript math implementations used by the Smart Order router

Python

There are also Python implementations in progress

Invariant

The value function
VV
is defined as:
V=tBtWtV= \prod_t B_t^{W_t}
Where
  • tt
    ranges over the tokens in the pool
  • BtB_t
    is the balance of the token in the pool
  • WtW_t
    ​is the normalized weight of the tokens, such that the sum of all normalized weights is 1.

Spot Price

Each pair of tokens in a pool has a spot price defined entirely by the weights and balances of just that pair of tokens. The spot price between any two tokens,
SpotPriceioSpotPrice^o_i
, or in short
SPioSP^o_i
, is the the ratio of the token balances normalized by their weights:
SPio=BiWiBoWoSP^o_i = \frac{\frac{B_i}{W_i}}{\frac{B_o}{W_o}}
  • BiB_i
    is the balance of token
    ii
    , the token being sold by the trader which is going into the pool
  • BoB_o
    is the balance of token
    oo
    , the token being bought by the trader which is going out of the pool
  • WiW_i
    is the weight of token
    ii
  • WoW_o
    is the weight of token
    oo

Spot Price with Swap Fees

When we consider swap fees, we do exactly the same calculations as without fees, but using
Ai(1swapFee)A_i \cdot (1-swapFee)
instead of
AiA_i
since fees are taken out of the input amount. The equation then becomes:
SPio=BiWiBoWo11swapFeeSP^o_i = \frac{\frac{B_i}{W_i}}{\frac{B_o}{W_o}} \cdot \frac{1}{1-swapFee}

Trade Equations

outGivenIn

When a user sends tokens
ii
to get tokens
oo
, all other token balances remain the same. Therefore, if we define
AiA_i
and
AoA_o
as the amount of tokens
ii
and
oo
exchanged, and since the value function
VV
must be constant before and after the trade, we can calculate the amount
AoA_o
a users gets when sending
AiA_i
.
Ao=Bo(1(BiBi+Ai)WiWo)A_o = B_o \cdot \left(1-\left(\frac{B_i}{B_i + A_i}\right)^{\frac{W_i}{W_o}}\right)
If you're computing this value yourself, remember that the pool collects swap fees as a percentage of the input token. In the equation above,
AiA_i
is the amount that the pool actually swaps into the output token, not the amount sent by a trader,
AsentA_{sent}
. To calculate through, we must compute:
Ai=Asent(1swapFee)A_i = A_{sent} * (1-swapFee)

inGivenOut

It is also very useful for traders to know how much they need to send of the input token
AiA_i
to get a desired amount of output token
AoA_o
:
Ai=Bi((BoBoAo)WoWi1)A_i = B_i \cdot \left(\left(\frac{B_o}{B_o - A_o}\right)^{\frac{W_o}{W_i}}-1\right)