CoreHelpers ​
Inherits:Variables, ImmutableVariables, Events
Functions ​
_spell ​
do any arbitrary call
function _spell(address target_, bytes memory data_) internal returns (bytes memory response_);
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 ​
Given an input amount of asset and pair reserves, returns the maximum output amount of the other asset
function _getAmountOut(uint256 amountIn_, uint256 iReserveIn_, uint256 iReserveOut_)
internal
pure
returns (uint256 amountOut_);
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 ​
Given an output amount of asset and pair reserves, returns the input amount of the other asset
function _getAmountIn(uint256 amountOut_, uint256 iReserveIn_, uint256 iReserveOut_)
internal
pure
returns (uint256 amountIn_);
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 |
Returns
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 |
Returns
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 ​
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
function _verifyToken0Reserves(
uint256 token0Reserves_,
uint256 token1Reserves_,
uint256 centerPrice_,
uint256 minLiquidity_
) internal pure;
_verifyToken1Reserves ​
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
function _verifyToken1Reserves(
uint256 token0Reserves_,
uint256 token1Reserves_,
uint256 centerPrice_,
uint256 minLiquidity_
) internal pure;
_verifySwapAndNonPerfectActions ​
function _verifySwapAndNonPerfectActions(uint256 amountAdjusted_, uint256 amount_) internal pure;
_calcRangeShifting ​
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
function _calcRangeShifting(uint256 upperRange_, uint256 lowerRange_, uint256 dexVariables2_)
internal
returns (uint256, uint256, uint256);
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 |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The updated upper range, lower range, and dexVariables2 |
<none> | uint256 | |
<none> | uint256 |
_calcThresholdShifting ​
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
function _calcThresholdShifting(uint256 upperThreshold_, uint256 lowerThreshold_, uint256 thresholdTime_)
internal
returns (uint256, uint256, uint256);
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 |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The updated upper threshold, lower threshold, and threshold time |
<none> | uint256 | |
<none> | uint256 |
_calcCenterPrice ​
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
function _calcCenterPrice(uint256 dexVariables_, uint256 dexVariables2_) internal returns (uint256 newCenterPrice_);
Parameters
Name | Type | Description |
---|---|---|
dexVariables_ | uint256 | The current state of dex variables |
dexVariables2_ | uint256 | Additional dex variables |
Returns
Name | Type | Description |
---|---|---|
newCenterPrice_ | uint256 | The updated center price |
_getPricesAndExchangePrices ​
Calculates and returns the current prices and exchange prices for the pool
*This function performs the following operations:
- Determines the center price (either from storage, external source, or calculated)
- Retrieves the last stored price from dexVariables_
- Calculates the upper and lower range prices based on the center price and range percentages
- Checks if rebalancing is needed based on threshold settings
- Adjusts prices if necessary based on the time elapsed and threshold conditions
- Update the dexVariables2_ if changes were made
- Returns the calculated prices and exchange prices in the PricesAndExchangePrice struct*
function _getPricesAndExchangePrices(uint256 dexVariables_, uint256 dexVariables2_)
internal
returns (PricesAndExchangePrice memory pex_);
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 |
Returns
Name | Type | Description |
---|---|---|
pex_ | 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 ​
getting reserves outside range.
function _calculateReservesOutsideRange(uint256 gp_, uint256 pa_, uint256 rx_, uint256 ry_)
internal
pure
returns (uint256 xa_, uint256 yb_);
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 ​
Retrieves collateral amount from liquidity layer for a given token
function _getLiquidityCollateral(bytes32 supplyTokenSlot_, uint256 tokenExchangePrice_, bool isToken0_)
internal
view
returns (uint256 tokenSupply_);
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) |
Returns
Name | Type | Description |
---|---|---|
tokenSupply_ | uint256 | The calculated liquidity collateral amount |
_getCollateralReserves ​
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
function _getCollateralReserves(
uint256 geometricMean_,
uint256 upperRange_,
uint256 lowerRange_,
uint256 token0SupplyExchangePrice_,
uint256 token1SupplyExchangePrice_
) internal view returns (CollateralReserves memory c_);
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 |
Returns
Name | Type | Description |
---|---|---|
c_ | 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 ​
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
function _calculateDebtReserves(uint256 gp_, uint256 pb_, uint256 dx_, uint256 dy_)
internal
pure
returns (uint256 rx_, uint256 ry_, uint256 irx_, uint256 iry_);
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 |
Returns
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 ​
Calculates the debt amount for a given token from liquidity layer
function _getLiquidityDebt(bytes32 borrowTokenSlot_, uint256 tokenExchangePrice_, bool isToken0_)
internal
view
returns (uint256 tokenDebt_);
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) |
Returns
Name | Type | Description |
---|---|---|
tokenDebt_ | uint256 | The calculated debt amount for the token |
_getDebtReserves ​
Calculates the debt reserves for both tokens
function _getDebtReserves(
uint256 geometricMean_,
uint256 upperRange_,
uint256 lowerRange_,
uint256 token0BorrowExchangePrice_,
uint256 token1BorrowExchangePrice_
) internal view returns (DebtReserves memory d_);
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 |
Returns
Name | Type | Description |
---|---|---|
d_ | 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 |
_updateOracle ​
function _updateOracle(uint256 newPrice_, uint256 centerPrice_, uint256 dexVariables_) internal returns (uint256);
_hookVerify ​
function _hookVerify(uint256 hookAddress_, uint256 mode_, bool swap0to1_, uint256 price_) internal;
constructor ​
constructor(ConstantViews memory constantViews_) ImmutableVariables(constantViews_);