IShifting ​
_calcRangeShifting ​
function _calcRangeShifting(uint256 upperRange_, uint256 lowerRange_, uint256 dexVariables2_) external returns (uint256, uint256, uint256)
Calculates the new upper and lower range values during an active range shift
Parameters ​
Name | Type | Description |
---|---|---|
upperRange_ | uint256 | The target upper range value |
lowerRange_ | uint256 | The target lower range value |
dexVariables2_ | uint256 | needed in case shift is ended and we need to update dexVariables2 |
Return Values ​
Name | Type | Description |
---|---|---|
[0] | uint256 | The updated upper range, lower range, and dexVariables2 |
[1] | uint256 | |
[2] | uint256 |
_calcThresholdShifting ​
function _calcThresholdShifting(uint256 upperThreshold_, uint256 lowerThreshold_, uint256 dexVariables2_) external returns (uint256, uint256, uint256)
Calculates the new threshold values during an active threshold shift
Parameters ​
Name | Type | Description |
---|---|---|
upperThreshold_ | uint256 | The target upper threshold value |
lowerThreshold_ | uint256 | The target lower threshold value |
dexVariables2_ | uint256 | needed in case shift is ended and we need to update dexVariables2 |
Return Values ​
Name | Type | Description |
---|---|---|
[0] | uint256 | The updated upper threshold, lower threshold, and dexVariables2 |
[1] | uint256 | |
[2] | uint256 |
_calcCenterPrice ​
function _calcCenterPrice(uint256 dexVariables_, uint256 dexVariables2_) external returns (uint256)
Calculates the new center price during an active center price shift
Parameters ​
Name | Type | Description |
---|---|---|
dexVariables_ | uint256 | The current state of dex variables |
dexVariables2_ | uint256 | Additional dex variables |
Return Values ​
Name | Type | Description |
---|---|---|
[0] | uint256 | The updated center price |
CoreHelpers ​
_spell ​
function _spell(address target_, bytes data_) internal returns (bytes response_)
do any arbitrary call
Parameters ​
Name | Type | Description |
---|---|---|
target_ | address | Address to which the call needs to be delegated |
data_ | bytes | Data to execute at the delegated address |
_getAmountOut ​
function _getAmountOut(uint256 amountIn_, uint256 iReserveIn_, uint256 iReserveOut_) internal pure returns (uint256 amountOut_)
Given an input amount of asset and pair reserves, returns the maximum output amount of the other asset
Parameters ​
Name | Type | Description |
---|---|---|
amountIn_ | uint256 | The amount of input asset. |
iReserveIn_ | uint256 | Imaginary token reserve with input amount. |
iReserveOut_ | uint256 | Imaginary token reserve of output amount. |
_getAmountIn ​
function _getAmountIn(uint256 amountOut_, uint256 iReserveIn_, uint256 iReserveOut_) internal pure returns (uint256 amountIn_)
Given an output amount of asset and pair reserves, returns the input amount of the other asset
Parameters ​
Name | Type | Description |
---|---|---|
amountOut_ | uint256 | Desired output amount of the asset. |
iReserveIn_ | uint256 | Imaginary token reserve of input amount. |
iReserveOut_ | uint256 | Imaginary token reserve of output amount. |
_swapRoutingIn ​
function _swapRoutingIn(uint256 t, uint256 x, uint256 y, uint256 x2, uint256 y2) internal pure returns (int256 a_)
Parameters ​
Name | Type | Description |
---|---|---|
t | uint256 | total amount in |
x | uint256 | imaginary reserves of token out of collateral |
y | uint256 | imaginary reserves of token in of collateral |
x2 | uint256 | imaginary reserves of token out of debt |
y2 | uint256 | imaginary reserves of token in of debt |
Return Values ​
Name | Type | Description |
---|---|---|
a_ | int256 | how much swap should go through collateral pool. Remaining will go from debt note if a < 0 then entire trade route through debt pool and debt pool arbitrage with col pool note if a > t then entire trade route through col pool and col pool arbitrage with debt pool note if a > 0 & a < t then swap will route through both pools |
_swapRoutingOut ​
function _swapRoutingOut(uint256 t, uint256 x, uint256 y, uint256 x2, uint256 y2) internal pure returns (int256 a_)
Parameters ​
Name | Type | Description |
---|---|---|
t | uint256 | total amount out |
x | uint256 | imaginary reserves of token in of collateral |
y | uint256 | imaginary reserves of token out of collateral |
x2 | uint256 | imaginary reserves of token in of debt |
y2 | uint256 | imaginary reserves of token out of debt |
Return Values ​
Name | Type | Description |
---|---|---|
a_ | int256 | how much swap should go through collateral pool. Remaining will go from debt note if a < 0 then entire trade route through debt pool and debt pool arbitrage with col pool note if a > t then entire trade route through col pool and col pool arbitrage with debt pool note if a > 0 & a < t then swap will route through both pools |
_utilizationVerify ​
function _utilizationVerify(uint256 utilizationLimit_, bytes32 exchangePriceSlot_) internal view
_check ​
function _check(uint256 dexVariables_, uint256 dexVariables2_) internal
_verifyToken0Reserves ​
function _verifyToken0Reserves(uint256 token0Reserves_, uint256 token1Reserves_, uint256 centerPrice_, uint256 minLiquidity_) internal pure
if token0 reserves are too low w.r.t token1 then revert, this is to avoid edge case scenario and making sure that precision on calculations should be high enough
_verifyToken1Reserves ​
function _verifyToken1Reserves(uint256 token0Reserves_, uint256 token1Reserves_, uint256 centerPrice_, uint256 minLiquidity_) internal pure
if token1 reserves are too low w.r.t token0 then revert, this is to avoid edge case scenario and making sure that precision on calculations should be high enough
_verifySwapAndNonPerfectActions ​
function _verifySwapAndNonPerfectActions(uint256 amountAdjusted_, uint256 amount_) internal pure
_calcRangeShifting ​
function _calcRangeShifting(uint256 upperRange_, uint256 lowerRange_, uint256 dexVariables2_) internal returns (uint256, uint256, uint256)
This function handles the gradual shifting of range values over time If the shift is complete, it updates the state and clears the shift data
Calculates the new upper and lower range values during an active range shift
Parameters ​
Name | Type | Description |
---|---|---|
upperRange_ | uint256 | The target upper range value |
lowerRange_ | uint256 | The target lower range value |
dexVariables2_ | uint256 | needed in case shift is ended and we need to update dexVariables2 |
Return Values ​
Name | Type | Description |
---|---|---|
[0] | uint256 | The updated upper range, lower range, and dexVariables2 |
[1] | uint256 | |
[2] | uint256 |
_calcThresholdShifting ​
function _calcThresholdShifting(uint256 upperThreshold_, uint256 lowerThreshold_, uint256 thresholdTime_) internal returns (uint256, uint256, uint256)
This function handles the gradual shifting of threshold values over time If the shift is complete, it updates the state and clears the shift data
Calculates the new upper and lower threshold values during an active threshold shift
Parameters ​
Name | Type | Description |
---|---|---|
upperThreshold_ | uint256 | The target upper threshold value |
lowerThreshold_ | uint256 | The target lower threshold value |
thresholdTime_ | uint256 | The time passed since shifting started |
Return Values ​
Name | Type | Description |
---|---|---|
[0] | uint256 | The updated upper threshold, lower threshold, and threshold time |
[1] | uint256 | |
[2] | uint256 |
_calcCenterPrice ​
function _calcCenterPrice(uint256 dexVariables_, uint256 dexVariables2_) internal returns (uint256 newCenterPrice_)
This function gradually shifts the center price towards a new target price over time It uses an external price source (via ICenterPrice) to determine the target price The shift continues until the current price reaches the target, or the shift duration ends Once the shift is complete, it updates the state and clears the shift data The shift rate is dynamic and depends on:
- Time remaining in the shift duration
- The new center price (fetched externally, which may change)
- The current (old) center price This results in a fuzzy shifting mechanism where the rate can change as these parameters evolve The externally fetched new center price is expected to not differ significantly from the last externally fetched center price
Calculates the new center price during an active price shift
Parameters ​
Name | Type | Description |
---|---|---|
dexVariables_ | uint256 | The current state of dex variables |
dexVariables2_ | uint256 | Additional dex variables |
Return Values ​
Name | Type | Description |
---|---|---|
newCenterPrice_ | uint256 | The updated center price |
_getPricesAndExchangePrices ​
function _getPricesAndExchangePrices(uint256 dexVariables_, uint256 dexVariables2_) internal returns (struct Structs.PricesAndExchangePrice pex_)
Calculates and returns the current prices and exchange prices for the pool
This function performs the following operations: 1. Determines the center price (either from storage, external source, or calculated) 2. Retrieves the last stored price from dexVariables 3. Calculates the upper and lower range prices based on the center price and range percentages 4. Checks if rebalancing is needed based on threshold settings 5. Adjusts prices if necessary based on the time elapsed and threshold conditions 6. Update the dexVariables2* if changes were made 7. Returns the calculated prices and exchange prices in the PricesAndExchangePrice struct*
Parameters ​
Name | Type | Description |
---|---|---|
dexVariables_ | uint256 | The first set of DEX variables containing various pool parameters |
dexVariables2_ | uint256 | The second set of DEX variables containing additional pool parameters |
Return Values ​
Name | Type | Description |
---|---|---|
pex_ | struct Structs.PricesAndExchangePrice | A struct containing the calculated prices and exchange prices: - pex*.lastStoredPrice: The last stored price in 1e27 decimals - pex*.centerPrice: The calculated or fetched center price in 1e27 decimals - pex*.upperRange: The upper range price limit in 1e27 decimals - pex*.lowerRange: The lower range price limit in 1e27 decimals - pex*.geometricMean: The geometric mean of upper range & lower range in 1e27 decimals - pex*.supplyToken0ExchangePrice: The current exchange price for supplying token0 - pex*.borrowToken0ExchangePrice: The current exchange price for borrowing token0 - pex*.supplyToken1ExchangePrice: The current exchange price for supplying token1 - pex_.borrowToken1ExchangePrice: The current exchange price for borrowing token1 |
_calculateReservesOutsideRange ​
function _calculateReservesOutsideRange(uint256 gp_, uint256 pa_, uint256 rx_, uint256 ry_) internal pure returns (uint256 xa_, uint256 yb_)
getting reserves outside range.
Parameters ​
Name | Type | Description |
---|---|---|
gp_ | uint256 | is geometric mean pricing of upper percent & lower percent |
pa_ | uint256 | price of upper range or lower range |
rx_ | uint256 | real reserves of token0 or token1 |
ry_ | uint256 | whatever is rx* the other will be ry* |
_getLiquidityCollateral ​
function _getLiquidityCollateral(bytes32 supplyTokenSlot_, uint256 tokenExchangePrice_, bool isToken0_) internal view returns (uint256 tokenSupply_)
Retrieves collateral amount from liquidity layer for a given token
Parameters ​
Name | Type | Description |
---|---|---|
supplyTokenSlot_ | bytes32 | The storage slot for the supply token data |
tokenExchangePrice_ | uint256 | The exchange price of the token |
isToken0_ | bool | Boolean indicating if the token is token0 (true) or token1 (false) |
Return Values ​
Name | Type | Description |
---|---|---|
tokenSupply_ | uint256 | The calculated liquidity collateral amount |
_getCollateralReserves ​
function _getCollateralReserves(uint256 geometricMean_, uint256 upperRange_, uint256 lowerRange_, uint256 token0SupplyExchangePrice_, uint256 token1SupplyExchangePrice_) internal view returns (struct Structs.CollateralReserves c_)
Calculates the real and imaginary reserves for collateral tokens
This function retrieves the supply of both tokens from the liquidity layer, adjusts them based on exchange prices, and calculates imaginary reserves based on the geometric mean and price range
Parameters ​
Name | Type | Description |
---|---|---|
geometricMean_ | uint256 | The geometric mean of the token prices |
upperRange_ | uint256 | The upper price range |
lowerRange_ | uint256 | The lower price range |
token0SupplyExchangePrice_ | uint256 | The exchange price for token0 from liquidity layer |
token1SupplyExchangePrice_ | uint256 | The exchange price for token1 from liquidity layer |
Return Values ​
Name | Type | Description |
---|---|---|
c_ | struct Structs.CollateralReserves | A struct containing the calculated real and imaginary reserves for both tokens: - token0RealReserves: The real reserves of token0 - token1RealReserves: The real reserves of token1 - token0ImaginaryReserves: The imaginary reserves of token0 - token1ImaginaryReserves: The imaginary reserves of token1 |
_calculateDebtReserves ​
function _calculateDebtReserves(uint256 gp_, uint256 pb_, uint256 dx_, uint256 dy_) internal pure returns (uint256 rx_, uint256 ry_, uint256 irx_, uint256 iry_)
Calculates the real and imaginary debt reserves for both tokens
This function uses a quadratic equation to determine the debt reserves based on the geometric mean price and the current debt amounts
Parameters ​
Name | Type | Description |
---|---|---|
gp_ | uint256 | The geometric mean price of upper range & lower range |
pb_ | uint256 | The price of lower range |
dx_ | uint256 | The debt amount of one token |
dy_ | uint256 | The debt amount of the other token |
Return Values ​
Name | Type | Description |
---|---|---|
rx_ | uint256 | The real debt reserve of the first token |
ry_ | uint256 | The real debt reserve of the second token |
irx_ | uint256 | The imaginary debt reserve of the first token |
iry_ | uint256 | The imaginary debt reserve of the second token |
_getLiquidityDebt ​
function _getLiquidityDebt(bytes32 borrowTokenSlot_, uint256 tokenExchangePrice_, bool isToken0_) internal view returns (uint256 tokenDebt_)
Calculates the debt amount for a given token from liquidity layer
Parameters ​
Name | Type | Description |
---|---|---|
borrowTokenSlot_ | bytes32 | The storage slot for the token's borrow data |
tokenExchangePrice_ | uint256 | The current exchange price of the token |
isToken0_ | bool | Boolean indicating if this is for token0 (true) or token1 (false) |
Return Values ​
Name | Type | Description |
---|---|---|
tokenDebt_ | uint256 | The calculated debt amount for the token |
_getDebtReserves ​
function _getDebtReserves(uint256 geometricMean_, uint256 upperRange_, uint256 lowerRange_, uint256 token0BorrowExchangePrice_, uint256 token1BorrowExchangePrice_) internal view returns (struct Structs.DebtReserves d_)
Calculates the debt reserves for both tokens
Parameters ​
Name | Type | Description |
---|---|---|
geometricMean_ | uint256 | The geometric mean of the upper and lower price ranges |
upperRange_ | uint256 | The upper price range |
lowerRange_ | uint256 | The lower price range |
token0BorrowExchangePrice_ | uint256 | The exchange price of token0 from liquidity layer |
token1BorrowExchangePrice_ | uint256 | The exchange price of token1 from liquidity layer |
Return Values ​
Name | Type | Description |
---|---|---|
d_ | struct Structs.DebtReserves | The calculated debt reserves for both tokens, containing: - token0Debt: The debt amount of token0 - token1Debt: The debt amount of token1 - token0RealReserves: The real reserves of token0 derived from token1 debt - token1RealReserves: The real reserves of token1 derived from token0 debt - token0ImaginaryReserves: The imaginary debt reserves of token0 - token1ImaginaryReserves: The imaginary debt reserves of token1 |
_priceDiffCheck ​
function _priceDiffCheck(uint256 oldPrice_, uint256 newPrice_) internal pure returns (int256 priceDiff_)
_updateOracle ​
function _updateOracle(uint256 newPrice_, uint256 centerPrice_, uint256 dexVariables_) internal returns (uint256)
_hookVerify ​
function _hookVerify(uint256 hookAddress_, uint256 mode_, bool swap0to1_, uint256 price_) internal
_updateSupplyShares ​
function _updateSupplyShares(uint256 newTotalShares_) internal
_updateBorrowShares ​
function _updateBorrowShares(uint256 newTotalShares_) internal
constructor ​
constructor(struct Structs.ConstantViews constantViews_) internal