Elastic Core Libraries
BaseSplitCodeFactory
Inherited by the Factory contract. Main purpose is to hold the Kyberswap Elastic Pool creation code in a separate address, since its creation code is close to the bytecode size limit of 24kB.
Taken from Balancer Labs's solidity utils repo. The only modification made is the unchecked keyword for sol 0.8 compatibility.
getCreationCodeContracts()
getCreationCodeContracts()
Returns the 2 addresses where the creation code of the contract created by this factory is stored.
getCreationCode()
getCreationCode()
Returns the creation code of the contract this factory creates.
CodeDeployer
Taken from Balancer Labs's solidity utils repo. Imported and used by the BaseSplitCodeFactory
contract to handle deployment.
FullMath
Taken from Mathemagic finale: muldiv - Remco Bloeman. Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision. Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits.
mulDivFloor()
mulDivFloor()
Returns (a * b / denominator)
rounded down.
mulDivCeiling()
mulDivCeiling()
Similar to mulDivFloor
, but rounded up.
LinkedList
A doubly linked list to be used for tick management.
Struct: Data
init()
init()
Initializes the LinkedList with the lowestValue and highestValue, where
lowestValue.previous = lowestValue
lowestValue.next
=highestValue
highestValue.previous = lowestValue
highestValue.next = highestValue
insert()
insert()
Inserts a new value into the LinkedList, given an existing lower value. The new value to be inserted should not be an existing value. Also, the condition lowerValue < newValue < lowerValue.next
should be satisfied.
remove()
remove()
Removes an existing value from the LinkedList. Returns the next lowest value (existingValue.previous
).
Note that no removal is performed if removedValue
happens to be the lowestValue
or highestValue
passed in init()
.
LiqDeltaMath
Contains a function to assist with the addition of signed liquidityDelta to unsigned liquidity.
applyLiquidityDelta()
applyLiquidityDelta()
Adds or remove uint128
liquidityDelta to uint128
liquidity
MathConstants
Contains constants commonly used by multiple files.
QtyDeltaMath
Contains functions for calculating token0 and token1 quantites from differences in prices or from burning reinvestment tokens
getQtysForInitialLockup()
getQtysForInitialLockup()
Calculate the token0 and token1 quantities needed for unlocking the pool given an initial price and liquidity.
Input
Output
calcRequiredQty0()
calcRequiredQty0()
Calculates the token0 quantity between 2 sqrt prices for a given liquidity quantity.
Note that the function assumes that upperSqrtP > lowerSqrtP
.
Input
Output
Generally, if the return value > 0, it will be transferred into the pool. Conversely, if the return value < 0, it will be transferred out of the pool.
calcRequiredQty1()
calcRequiredQty1()
Calculates the token1 quantity between 2 sqrt prices for a given liquidity quantity.
Note that the function assumes that upperSqrtP > lowerSqrtP
.
Input
Output
Generally, if the return value > 0, it will be transferred into the pool. Conversely, if the return value < 0, it will be transferred out of the pool.
getQty0FromBurnRTokens()
getQty0FromBurnRTokens()
Calculates the token0 quantity to be sent to the user for a given amount of reinvestment tokens to be burnt.
getQty1FromBurnRTokens()
getQty1FromBurnRTokens()
Calculates the token1 quantity to be sent to the user for a given amount of reinvestment tokens to be burnt.
divCeiling()
divCeiling()
Returns ceil(x / y)
. y
should not be zero.
QuadMath
getSmallerRootOfQuadEqn()
getSmallerRootOfQuadEqn()
sqrt()
sqrt()
Unchanged from DMMv1. Calculates the square root of a value using the Babylonian method.
ReinvestmentMath
Contains a helper function to calculate reinvestment tokens to be minted given an increase in reinvestment liquidity.
calcRMintQty()
calcRMintQty()
Given the difference between reinvestL
and reinvestLLast
, calculate how many reinvestment tokens are to be minted.
SafeCast
Contains methods for safely casting between different types.
toUint32()
toUint32()
Casts a uint256
to a uint32
. Reverts on overflow.
toInt128()
toInt128()
Casts a uint128
to a int128
. Reverts on overflow.
toUint128()
toUint128()
Casts a uint256
to a uint128
. Reverts on overflow.
revToUint128()
revToUint128()
Given int128 y
, returns uint128 z = -y
.
toUint160()
toUint160()
Casts a uint256
to a uint160
. Reverts on overflow.
toInt256()
toInt256()
Casts a uint256
to a int256
. Reverts on overflow.
revToInt256()
revToInt256()
Cast a uint256
to a int256
and reverses the sign. Reverts on overflow.
revToUint256()
revToUint256()
Given int256 y
, returns uint256 z = -y
.
SwapMath
Contains the logic needed for computing swap input / output amounts and fees. The primary function to look at is computeSwapStep
, as it is where the bulk of the swap flow logic is in, and where calls to the other functions in the library are made.
computeSwapStep()
computeSwapStep()
Computes the actual swap input / output amounts to be deducted or added, the swap fee to be collected and the resulting price.
Inputs
Outputs
Note
nextSqrtP
should not exceed targetSqrtP
.
calcReachAmount()
calcReachAmount()
Calculates the amount needed to reach targetSqrtP
from currentSqrtP
. Note that currentSqrtP
and targetSqrtP
are casted from uint160 to uint256 as they are multiplied by TWO_BPS (20_000)
or feeInBps
.
The mathematical formulas are provided below for reference.
estimateIncrementalLiquidity()
estimateIncrementalLiquidity()
Estimates deltaL
, the swap fee to be collected based on amountSpecified. This is called only for the final swap step, where the next (temporary) tick will not be crossed.
In the case where exact input is specified, the formula is rather straightforward.
In the case where exact output is specified, a quadratic equation has to be solved. The desired result is the smaller root of the quadratic equation.
calcIncrementalLiquidity()
calcIncrementalLiquidity()
Calculates deltaL
, the swap fee to be collected based on amountSpecified. This is called for an intermediate swap step, where the next (temporary) tick will be crossed.
The mathematical formulas are provided below for reference.
Inputs
calcFinalPrice()
calcFinalPrice()
Calculates the sqrt price of the final swap step where the next (temporary) tick will not be crossed.
The mathematical formulas are provided below for reference.
Input
calcReturnedAmount()
calcReturnedAmount()
Calculates returnedAmount
for the computeSwapStep
function. Rounds down when isExactInput = true
(calculating output < 0) so that we avoid sending too much. Conversely, rounds up when isExactInput = false
to ensure sufficient input > 0 will be received.
The mathematical formulas are provided below for reference.
isToken0 = true
The formula is actually the same, with the difference being made to the operands to ensure the price difference is non-negative.
isToken0 = false
TickMath
Contains functions for computing square root prices from ticks and vice versa. Adapted from Uniswap V3's TickMath library.
Constants
getSqrtRatioAtTick()
getSqrtRatioAtTick()
getTickAtSqrtRatio()
getTickAtSqrtRatio()
Given a square root price ratio uint160 sqrtP
, calculates the greatest tick
such that getSqrtRatioAtTick(tick) <= sqrtP
.
Note that MIN_SQRT_RATIO <= sqrtP <= MAX_SQRT_RATIO
, otherwise the function will revert.
getMaxNumberTicks()
getMaxNumberTicks()
Used to calculate the maximum liquidity allowable per tick. This function calculates the maximum number of ticks that can be inserted into the LinkedList, given a tickDistance
.
Last updated