Add Liquidity

Understanding the add liquidity event step-by-step.

Add Liquidity

The event of adding liquidity requires the following information from the user: 1. AduA_{du} Amount of token A to be added 2. BduB_{du} Amount of token B to be added 3. Owner

After the information was supplied, the add liquidity function will perform the following activities:

1. Calculate factors

1.1 Calculate Option Price

This happens if i0i≠0. If i=0i=0 , it is not required to calculate the option price in the very first liquidity provision in a pool.

For simplicity, let's acknowledge that the option price is a function that required a MarketData{MarketData} and an internal vector (IVIV) as input.

Pi=fp(IVi1,MarketDatai)P_i=f_p({IV_{i-1}},{MarketData_i})

For more details about the pricing formula or its contract implementation for pricing the options, check this section.

ABPrice variable on _addLiquidity at AMM.sol

1.2 Calculate the Pool's Value Factor (FviF_{v_{i}})

If i=0i=0 , Fvi=1F_{v_{i}}=1

If i0i≠0 , Fvi=TBAi1Pi+TBBi1DBAi1Pi+DBBi1\displaystyle F_{v_{i}}= \frac{TB_{A_{i-1}}\cdot P_i+TB_{B_{i-1}}}{DB_{A_{i-1}} \cdot P_i+DB_{B_{i-1}}}

Since this is the first liquidity provision of the pool, this is i=0i=0 and therefore, Fvi=1F_{v_{i}}=1.

PoolValue factor variable on _addLiquidity at AMM.sol
FImp function at AMM.sol

2. Updates

2.1 Update Deamortized Balance of the pool for each token

By the time the pool is created (i=0i=0) , the DBAiDB_{A_i}and DBBiDB_{B_i} will be equal to the AduA_{du} and BduB_{du} since:

Fvi=1F_{v_{i}} = 1 DBAi1=0\displaystyle DB_{A_{i-1}}=0 DBBi1=0\displaystyle DB_{B_{i-1}}=0

DBAi=DBAi1+AduFvi\displaystyle DB_{A_{i}}=DB_{A_{i-1}} +\frac{A_{du}}{F_{v_{i}}}

DBBi=DBBi1+BduFvi\displaystyle DB_{B_{i}}=DB_{B_{i-1}} +\frac{B_{du}}{F_{v_{i}}}

deamortizedBalance on _addLiquidity at AMM.sol

2.2 Update the User Balances for each token and the Pool Factor previously calculated

Updating this factor is essential, especially when there is a re-add liquidity event.

UBAu=AduUB_{A_{u}}=A_{du}

UBBu=BduUB_{B_{u}}=B_{du}

The UBfuUB_{f_{u}} works as if it was a snapshot of the pool's factor at the moment of this user's deposit. This factor will be updated in the case of re-add liquidity by the user.

UBFu=FvduUB_{F_{u}}=F{v_{du}}

Updating User Balance (userDepositSnapshot) at _addLiquidity on AMM.sol

2.3 Update Total Balance of the pool for each token

TBAi=TBAi1+AduTB_{A_{i}}=TB_{A_{i-1}} +A_{du}

TBBi=TBBi1+BduTB_{B_{i}}=TB_{B_{i-1}} +B_{du}

At the contract level, an ERC20 transfer is happening. Total balance (TB) is just a mathematical representation. The Total balance is checked by consulting the balanceOf() of the pool contract of the respective token (tokenA or tokenB)

Last updated

Was this helpful?