Re-adding liquidity is very similar to add liquidity function, except for how the UB is updated.
Re-add Liquidity
This event can only happen for users that provided liquidity before. The event of re-adding liquidity requires the following information from the user:
1. Adu Amount of token A to be added
2. Bdu Amount of token B to be added
3. Owner
After the information was supplied, the re-add liquidity function will perform the following activities:
1. Calculate factors
1.1 Calculate Option Price
For simplicity, let's acknowledge that the option price is a function that required a MarketData and an internal vector (IV) as input.
Pi=fp(IVi−1,MarketDatai)
For more details about the pricing formula or its contract implementation, check this section. .
ABPrice variable on _addLiquidity at AMM.sol
1.2 Calculate the Pool's Value Factor (Fvi)
Since the re-add liquidity happens in a given momenti=0, Fvimay not be equal to 1, so there should be a Fvicalculation. The following formula will trigger the calculation:
Fvi=DBAi−1⋅Pi+DBBi−1TBAi−1⋅Pi+TBBi−1
FimpOpening variable on _addLiquidity function at AMM.sol
FImp function at AMM.sol
2. Updates
2.1 Update Deamortized Balance of the pool for each token
In this step, the AMM saves how much it owes the user at the current Pool Value Factor "expense."
DBAi=DBAi−1+FviAdu
DBBi=DBBi−1+FviBdu
deamortizedBalance on _addLiquidity at AMM.sol
2.2 Update the User Balances for each token and the Pool Factor previously calculated
Updating this factor represents combining both deposits considering the time each entered the pool. UBAu=UBAui−1⋅UBFuFvi+Adu
UBBu=UBBui−1⋅UBFuFvi+Bdu
The UBfu works as if it was a picture of the pool's factor at the moment of this user's deposit. This factor will be updated again whenever there is a re-add liquidity event by the same user.
UBFu=Fvi
Updating User Balance (userDepositSnapshot) at _addLiquidity on AMM.sol
2.3 Update Total Balance of the pool for each token
TBAi=TBAi−1+Adu
TBBi=TBBi−1+Bdu
At the contract level, an ERC20 transfer is happening. Total balance (TB) is just a mathematical representation. The Total balance is checked by consulting thebalanceOf() of the pool contract of the respective token (tokenA or tokenB)