@defisaver/positions-sdk 0.0.165 → 0.0.166-dev2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/config/contracts.d.ts +72 -0
- package/cjs/config/contracts.js +6 -0
- package/cjs/contracts.d.ts +1 -0
- package/cjs/contracts.js +2 -1
- package/cjs/eulerV2/index.d.ts +40 -0
- package/cjs/eulerV2/index.js +207 -0
- package/cjs/helpers/eulerHelpers/index.d.ts +27 -0
- package/cjs/helpers/eulerHelpers/index.js +232 -0
- package/cjs/helpers/index.d.ts +1 -0
- package/cjs/helpers/index.js +2 -1
- package/cjs/index.d.ts +2 -1
- package/cjs/index.js +3 -1
- package/cjs/markets/euler/index.d.ts +10 -0
- package/cjs/markets/euler/index.js +41 -0
- package/cjs/markets/index.d.ts +1 -0
- package/cjs/markets/index.js +3 -1
- package/cjs/services/utils.d.ts +2 -0
- package/cjs/services/utils.js +4 -1
- package/cjs/staking/staking.d.ts +1 -0
- package/cjs/staking/staking.js +10 -2
- package/cjs/types/contracts/generated/EulerV2View.d.ts +333 -0
- package/cjs/types/contracts/generated/EulerV2View.js +5 -0
- package/cjs/types/contracts/generated/index.d.ts +1 -0
- package/cjs/types/euler.d.ts +148 -0
- package/cjs/types/euler.js +15 -0
- package/cjs/types/index.d.ts +1 -0
- package/cjs/types/index.js +1 -0
- package/esm/config/contracts.d.ts +72 -0
- package/esm/config/contracts.js +6 -0
- package/esm/contracts.d.ts +1 -0
- package/esm/contracts.js +1 -0
- package/esm/eulerV2/index.d.ts +40 -0
- package/esm/eulerV2/index.js +199 -0
- package/esm/helpers/eulerHelpers/index.d.ts +27 -0
- package/esm/helpers/eulerHelpers/index.js +219 -0
- package/esm/helpers/index.d.ts +1 -0
- package/esm/helpers/index.js +1 -0
- package/esm/index.d.ts +2 -1
- package/esm/index.js +2 -1
- package/esm/markets/euler/index.d.ts +10 -0
- package/esm/markets/euler/index.js +34 -0
- package/esm/markets/index.d.ts +1 -0
- package/esm/markets/index.js +1 -0
- package/esm/services/utils.d.ts +2 -0
- package/esm/services/utils.js +2 -0
- package/esm/staking/staking.d.ts +1 -0
- package/esm/staking/staking.js +8 -1
- package/esm/types/contracts/generated/EulerV2View.d.ts +333 -0
- package/esm/types/contracts/generated/EulerV2View.js +4 -0
- package/esm/types/contracts/generated/index.d.ts +1 -0
- package/esm/types/euler.d.ts +148 -0
- package/esm/types/euler.js +12 -0
- package/esm/types/index.d.ts +1 -0
- package/esm/types/index.js +1 -0
- package/package.json +2 -1
- package/src/config/contracts.js +6 -0
- package/src/contracts.ts +2 -0
- package/src/eulerV2/index.ts +286 -0
- package/src/helpers/eulerHelpers/index.ts +231 -0
- package/src/helpers/index.ts +2 -1
- package/src/index.ts +2 -0
- package/src/markets/euler/index.ts +38 -0
- package/src/markets/index.ts +3 -1
- package/src/services/utils.ts +3 -0
- package/src/staking/staking.ts +8 -1
- package/src/types/contracts/generated/EulerV2View.ts +434 -0
- package/src/types/contracts/generated/index.ts +1 -0
- package/src/types/euler.ts +171 -0
- package/src/types/index.ts +2 -1
package/src/config/contracts.js
CHANGED
|
@@ -1031,4 +1031,10 @@ module.exports = {
|
|
|
1031
1031
|
"abi": [{"name":"UserState","inputs":[{"name":"user","type":"address","indexed":true},{"name":"collateral","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false},{"name":"n1","type":"int256","indexed":false},{"name":"n2","type":"int256","indexed":false},{"name":"liquidation_discount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Borrow","inputs":[{"name":"user","type":"address","indexed":true},{"name":"collateral_increase","type":"uint256","indexed":false},{"name":"loan_increase","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Repay","inputs":[{"name":"user","type":"address","indexed":true},{"name":"collateral_decrease","type":"uint256","indexed":false},{"name":"loan_decrease","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveCollateral","inputs":[{"name":"user","type":"address","indexed":true},{"name":"collateral_decrease","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Liquidate","inputs":[{"name":"liquidator","type":"address","indexed":true},{"name":"user","type":"address","indexed":true},{"name":"collateral_received","type":"uint256","indexed":false},{"name":"stablecoin_received","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetMonetaryPolicy","inputs":[{"name":"monetary_policy","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetBorrowingDiscounts","inputs":[{"name":"loan_discount","type":"uint256","indexed":false},{"name":"liquidation_discount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CollectFees","inputs":[{"name":"amount","type":"uint256","indexed":false},{"name":"new_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"collateral_token","type":"address"},{"name":"monetary_policy","type":"address"},{"name":"loan_discount","type":"uint256"},{"name":"liquidation_discount","type":"uint256"},{"name":"amm","type":"address"}],"outputs":[]},{"stateMutability":"pure","type":"function","name":"factory","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"pure","type":"function","name":"amm","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"pure","type":"function","name":"collateral_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"pure","type":"function","name":"borrowed_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"save_rate","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"debt","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"loan_exists","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"total_debt","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"max_borrowable","inputs":[{"name":"collateral","type":"uint256"},{"name":"N","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"max_borrowable","inputs":[{"name":"collateral","type":"uint256"},{"name":"N","type":"uint256"},{"name":"current_debt","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"min_collateral","inputs":[{"name":"debt","type":"uint256"},{"name":"N","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calculate_debt_n1","inputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"N","type":"uint256"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"nonpayable","type":"function","name":"create_loan","inputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"N","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"create_loan_extended","inputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"N","type":"uint256"},{"name":"callbacker","type":"address"},{"name":"callback_args","type":"uint256[]"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"add_collateral","inputs":[{"name":"collateral","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"add_collateral","inputs":[{"name":"collateral","type":"uint256"},{"name":"_for","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_collateral","inputs":[{"name":"collateral","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_collateral","inputs":[{"name":"collateral","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"borrow_more","inputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"borrow_more_extended","inputs":[{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"callbacker","type":"address"},{"name":"callback_args","type":"uint256[]"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"repay","inputs":[{"name":"_d_debt","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"repay","inputs":[{"name":"_d_debt","type":"uint256"},{"name":"_for","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"repay","inputs":[{"name":"_d_debt","type":"uint256"},{"name":"_for","type":"address"},{"name":"max_active_band","type":"int256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"repay","inputs":[{"name":"_d_debt","type":"uint256"},{"name":"_for","type":"address"},{"name":"max_active_band","type":"int256"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"repay_extended","inputs":[{"name":"callbacker","type":"address"},{"name":"callback_args","type":"uint256[]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"health_calculator","inputs":[{"name":"user","type":"address"},{"name":"d_collateral","type":"int256"},{"name":"d_debt","type":"int256"},{"name":"full","type":"bool"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"view","type":"function","name":"health_calculator","inputs":[{"name":"user","type":"address"},{"name":"d_collateral","type":"int256"},{"name":"d_debt","type":"int256"},{"name":"full","type":"bool"},{"name":"N","type":"uint256"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"nonpayable","type":"function","name":"liquidate","inputs":[{"name":"user","type":"address"},{"name":"min_x","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"liquidate","inputs":[{"name":"user","type":"address"},{"name":"min_x","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"liquidate_extended","inputs":[{"name":"user","type":"address"},{"name":"min_x","type":"uint256"},{"name":"frac","type":"uint256"},{"name":"use_eth","type":"bool"},{"name":"callbacker","type":"address"},{"name":"callback_args","type":"uint256[]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"tokens_to_liquidate","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"tokens_to_liquidate","inputs":[{"name":"user","type":"address"},{"name":"frac","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"health","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"view","type":"function","name":"health","inputs":[{"name":"user","type":"address"},{"name":"full","type":"bool"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"view","type":"function","name":"users_to_liquidate","inputs":[],"outputs":[{"name":"","type":"tuple[]","components":[{"name":"user","type":"address"},{"name":"x","type":"uint256"},{"name":"y","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"health","type":"int256"}]}]},{"stateMutability":"view","type":"function","name":"users_to_liquidate","inputs":[{"name":"_from","type":"uint256"}],"outputs":[{"name":"","type":"tuple[]","components":[{"name":"user","type":"address"},{"name":"x","type":"uint256"},{"name":"y","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"health","type":"int256"}]}]},{"stateMutability":"view","type":"function","name":"users_to_liquidate","inputs":[{"name":"_from","type":"uint256"},{"name":"_limit","type":"uint256"}],"outputs":[{"name":"","type":"tuple[]","components":[{"name":"user","type":"address"},{"name":"x","type":"uint256"},{"name":"y","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"health","type":"int256"}]}]},{"stateMutability":"view","type":"function","name":"amm_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"user_prices","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"view","type":"function","name":"user_state","inputs":[{"name":"user","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"set_amm_fee","inputs":[{"name":"fee","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_amm_admin_fee","inputs":[{"name":"fee","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_monetary_policy","inputs":[{"name":"monetary_policy","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_borrowing_discounts","inputs":[{"name":"loan_discount","type":"uint256"},{"name":"liquidation_discount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_callback","inputs":[{"name":"cb","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"admin_fees","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"collect_fees","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"check_lock","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"liquidation_discounts","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"loans","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"loan_ix","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"n_loans","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"minted","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"redeemed","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"monetary_policy","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"liquidation_discount","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"loan_discount","inputs":[],"outputs":[{"name":"","type":"uint256"}]}],
|
|
1032
1032
|
"networks":{}
|
|
1033
1033
|
},
|
|
1034
|
+
"EulerV2View": {
|
|
1035
|
+
"abi": [{"inputs":[],"name":"USD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feedRegistry","outputs":[{"internalType":"contract IFeedRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_page","type":"uint256"},{"internalType":"uint256","name":"_perPage","type":"uint256"}],"name":"fetchUsedAccounts","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveTokenPriceInETH","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveTokenPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveV3TokenPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveV3TokenPriceInUSD","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getAddrForChainlinkOracle","outputs":[{"internalType":"address","name":"tokenAddrForChainlinkUsage","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"bool","name":"isBorrowOperation","type":"bool"},{"internalType":"uint256","name":"liquidityAdded","type":"uint256"},{"internalType":"uint256","name":"liquidityRemoved","type":"uint256"}],"internalType":"struct EulerV2View.LiquidityChangeParams[]","name":"params","type":"tuple[]"}],"name":"getApyAfterValuesEstimation","outputs":[{"internalType":"uint256[]","name":"estimatedBorrowRates","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getChainlinkPriceInETH","outputs":[{"internalType":"int256","name":"chainlinkPriceInETH","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"bool","name":"_useFallback","type":"bool"}],"name":"getChainlinkPriceInUSD","outputs":[{"internalType":"int256","name":"chainlinkPriceInUSD","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"},{"internalType":"contract IAggregatorV3","name":"aggregator","type":"address"}],"name":"getRoundInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"updateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"updateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getSparkTokenPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getSparkTokenPriceInUSD","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"inLockDownMode","type":"bool"},{"internalType":"bool","name":"inPermitDisabledMode","type":"bool"},{"internalType":"address","name":"borrowVault","type":"address"},{"internalType":"uint256","name":"borrowAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"borrowAmountInAsset","type":"uint256"},{"components":[{"internalType":"address","name":"collateralVault","type":"address"},{"internalType":"bool","name":"usedInBorrow","type":"bool"},{"internalType":"uint256","name":"collateralAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInAsset","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInUSD","type":"uint256"}],"internalType":"struct EulerV2View.UserCollateralInfo[]","name":"collaterals","type":"tuple[]"}],"internalType":"struct EulerV2View.UserData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"getUsersData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"inLockDownMode","type":"bool"},{"internalType":"bool","name":"inPermitDisabledMode","type":"bool"},{"internalType":"address","name":"borrowVault","type":"address"},{"internalType":"uint256","name":"borrowAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"borrowAmountInAsset","type":"uint256"},{"components":[{"internalType":"address","name":"collateralVault","type":"address"},{"internalType":"bool","name":"usedInBorrow","type":"bool"},{"internalType":"uint256","name":"collateralAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInAsset","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInUSD","type":"uint256"}],"internalType":"struct EulerV2View.UserCollateralInfo[]","name":"collaterals","type":"tuple[]"}],"internalType":"struct EulerV2View.UserData[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getVaultCollaterals","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collateralsInfo","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getVaultInfoFull","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"totalSupplyShares","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"totalAssets","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collaterals","type":"tuple[]"},{"internalType":"uint16","name":"maxLiquidationDiscount","type":"uint16"},{"internalType":"uint256","name":"liquidationCoolOffTime","type":"uint256"},{"internalType":"bool","name":"badDebtSocializationEnabled","type":"bool"},{"internalType":"address","name":"unitOfAccount","type":"address"},{"internalType":"uint256","name":"unitOfAccountInUsd","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"balanceTrackerAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"uint256","name":"interestFee","type":"uint256"}],"internalType":"struct EulerV2View.VaultInfoFull","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_vaults","type":"address[]"}],"name":"getVaultsInfosFull","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"totalSupplyShares","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"totalAssets","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collaterals","type":"tuple[]"},{"internalType":"uint16","name":"maxLiquidationDiscount","type":"uint16"},{"internalType":"uint256","name":"liquidationCoolOffTime","type":"uint256"},{"internalType":"bool","name":"badDebtSocializationEnabled","type":"bool"},{"internalType":"address","name":"unitOfAccount","type":"address"},{"internalType":"uint256","name":"unitOfAccountInUsd","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"balanceTrackerAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"uint256","name":"interestFee","type":"uint256"}],"internalType":"struct EulerV2View.VaultInfoFull[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_btcPrice","type":"int256"}],"name":"getWBtcPrice","outputs":[{"internalType":"int256","name":"wBtcPrice","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_stEthPrice","type":"int256"}],"name":"getWStEthPrice","outputs":[{"internalType":"int256","name":"wStEthPrice","type":"int256"}],"stateMutability":"view","type":"function"}],
|
|
1036
|
+
"networks": {
|
|
1037
|
+
"1": { "address": "0x25eCA04532C085F77Ea6CE92C94E9e69896686E6" }
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1034
1040
|
}
|
package/src/contracts.ts
CHANGED
|
@@ -126,3 +126,5 @@ export const FeedRegistryContract = createContractFromConfigFunc<ContractTypes.F
|
|
|
126
126
|
export const MorphoBlueViewContract = createContractFromConfigFunc<ContractTypes.MorphoBlueView>('MorphoBlueView');
|
|
127
127
|
|
|
128
128
|
export const LlamaLendViewContract = createContractFromConfigFunc<ContractTypes.LlamaLendView>('LlamaLendView');
|
|
129
|
+
|
|
130
|
+
export const EulerV2ViewContract = createContractFromConfigFunc<ContractTypes.EulerV2View>('EulerV2View');
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import Web3 from 'web3';
|
|
2
|
+
import Dec from 'decimal.js';
|
|
3
|
+
import { assetAmountInEth, getAssetInfoByAddress } from '@defisaver/tokens';
|
|
4
|
+
import { NetworkNumber } from '../types/common';
|
|
5
|
+
import { getStakingApy, STAKING_ASSETS } from '../staking';
|
|
6
|
+
import { compareAddresses, getEthAmountForDecimals, isMaxuint } from '../services/utils';
|
|
7
|
+
import {
|
|
8
|
+
EulerV2AssetData,
|
|
9
|
+
EulerV2AssetsData,
|
|
10
|
+
EulerV2FullMarketData,
|
|
11
|
+
EulerV2Market,
|
|
12
|
+
EulerV2MarketInfoData,
|
|
13
|
+
EulerV2PositionData,
|
|
14
|
+
EulerV2UsedAssets,
|
|
15
|
+
EulerV2VaultType,
|
|
16
|
+
} from '../types';
|
|
17
|
+
import {
|
|
18
|
+
getEulerV2AggregatedData,
|
|
19
|
+
getEulerV2BorrowRate,
|
|
20
|
+
getEulerV2SupplyRate,
|
|
21
|
+
getUtilizationRate,
|
|
22
|
+
} from '../helpers/eulerHelpers';
|
|
23
|
+
import { ZERO_ADDRESS } from '../constants';
|
|
24
|
+
import { EulerV2ViewContract } from '../contracts';
|
|
25
|
+
|
|
26
|
+
export const EMPTY_USED_ASSET = {
|
|
27
|
+
isSupplied: false,
|
|
28
|
+
isBorrowed: false,
|
|
29
|
+
supplied: '0',
|
|
30
|
+
suppliedUsd: '0',
|
|
31
|
+
borrowed: '0',
|
|
32
|
+
borrowedUsd: '0',
|
|
33
|
+
symbol: '',
|
|
34
|
+
collateral: false,
|
|
35
|
+
vaultAddress: '',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const UnitOfAccountUSD = '0x0000000000000000000000000000000000000348';
|
|
39
|
+
|
|
40
|
+
export const getEulerV2MarketsData = async (web3: Web3, network: NetworkNumber, selectedMarket: EulerV2Market, defaultWeb3: Web3): Promise<EulerV2FullMarketData> => {
|
|
41
|
+
const contract = EulerV2ViewContract(web3, network);
|
|
42
|
+
|
|
43
|
+
const data = await contract.methods.getVaultInfoFull(selectedMarket.marketAddress).call();
|
|
44
|
+
const isInUSD = compareAddresses(UnitOfAccountUSD, data.unitOfAccount);
|
|
45
|
+
|
|
46
|
+
const usdPrice = getEthAmountForDecimals(data.unitOfAccountInUsd, 8);
|
|
47
|
+
|
|
48
|
+
// parse collateral tokens
|
|
49
|
+
// imma use address as key for assetsData because there can be more collateral vaults with the same name
|
|
50
|
+
const colls: EulerV2AssetData[] = data.collaterals.map((collateral) => {
|
|
51
|
+
const decimals = collateral.decimals;
|
|
52
|
+
const assetInfo = getAssetInfoByAddress(collateral.assetAddr);
|
|
53
|
+
const borrowRate = getEulerV2BorrowRate(collateral.interestRate);
|
|
54
|
+
const utilizationRate = getUtilizationRate(collateral.totalBorrows, new Dec(collateral.totalBorrows).plus(collateral.cash).toString());
|
|
55
|
+
|
|
56
|
+
const supplyRate = getEulerV2SupplyRate(borrowRate, utilizationRate, collateral.interestFee);
|
|
57
|
+
return ({
|
|
58
|
+
vaultAddress: collateral.vaultAddr,
|
|
59
|
+
assetAddress: collateral.assetAddr,
|
|
60
|
+
symbol: assetInfo.symbol,
|
|
61
|
+
vaultSymbol: collateral.vaultSymbol,
|
|
62
|
+
decimals,
|
|
63
|
+
liquidationRatio: new Dec(collateral.liquidationLTV).div(10_000).toString(),
|
|
64
|
+
collateralFactor: new Dec(collateral.borrowLTV).div(10_000).toString(),
|
|
65
|
+
totalBorrow: getEthAmountForDecimals(collateral.totalBorrows, decimals), // parse
|
|
66
|
+
cash: getEthAmountForDecimals(collateral.cash, decimals),
|
|
67
|
+
supplyCap: isMaxuint(collateral.supplyCap) ? collateral.supplyCap : getEthAmountForDecimals(collateral.supplyCap, decimals),
|
|
68
|
+
borrowCap: '0',
|
|
69
|
+
price: isInUSD ? assetAmountInEth(collateral.assetPriceInUnit) : new Dec(assetAmountInEth(collateral.assetPriceInUnit)).mul(usdPrice).toString(), // 1e18 -> price in unitOfAccount (so it could be USD or any other token)
|
|
70
|
+
canBeBorrowed: false,
|
|
71
|
+
canBeSupplied: true,
|
|
72
|
+
borrowRate,
|
|
73
|
+
supplyRate,
|
|
74
|
+
utilization: new Dec(utilizationRate).mul(100).toString(),
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
for (const coll of colls) {
|
|
78
|
+
if (STAKING_ASSETS.includes(coll.symbol)) {
|
|
79
|
+
coll.incentiveSupplyApy = await getStakingApy(coll.symbol, defaultWeb3);
|
|
80
|
+
coll.incentiveSupplyToken = coll.symbol;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const isEscrow = data.collaterals.length === 0;
|
|
84
|
+
const isGoverned = !compareAddresses(data.governorAdmin, ZERO_ADDRESS);
|
|
85
|
+
|
|
86
|
+
const vaultType = isEscrow ? EulerV2VaultType.Escrow : (
|
|
87
|
+
isGoverned ? EulerV2VaultType.Governed : EulerV2VaultType.Ungoverned
|
|
88
|
+
);
|
|
89
|
+
const decimals = data.decimals;
|
|
90
|
+
|
|
91
|
+
// (1 + SPY/10**27) ** secondsPerYear - 1
|
|
92
|
+
|
|
93
|
+
const interestRate = data.interestRate;
|
|
94
|
+
|
|
95
|
+
const borrowRate = getEulerV2BorrowRate(interestRate);
|
|
96
|
+
|
|
97
|
+
const utilizationRate = getUtilizationRate(data.totalBorrows, data.totalAssets);
|
|
98
|
+
const supplyRate = getEulerV2SupplyRate(borrowRate, utilizationRate, data.interestFee);
|
|
99
|
+
|
|
100
|
+
const marketAsset = {
|
|
101
|
+
assetAddress: data.assetAddr,
|
|
102
|
+
vaultAddress: data.vaultAddr,
|
|
103
|
+
symbol: selectedMarket.asset,
|
|
104
|
+
vaultSymbol: selectedMarket.shortLabel,
|
|
105
|
+
decimals,
|
|
106
|
+
totalBorrow: getEthAmountForDecimals(data.totalBorrows, decimals), // parse
|
|
107
|
+
cash: getEthAmountForDecimals(data.cash, decimals),
|
|
108
|
+
supplyCap: isMaxuint(data.supplyCap) ? data.supplyCap : getEthAmountForDecimals(data.supplyCap, decimals),
|
|
109
|
+
borrowCap: isMaxuint(data.supplyCap) ? data.borrowCap : getEthAmountForDecimals(data.borrowCap, decimals),
|
|
110
|
+
price: isInUSD ? assetAmountInEth(data.assetPriceInUnit) : new Dec(assetAmountInEth(data.assetPriceInUnit)).mul(usdPrice).toString(), // 1e18 -> price in unitOfAccount (so it could be USD or any other token)
|
|
111
|
+
sortIndex: 0,
|
|
112
|
+
canBeBorrowed: true,
|
|
113
|
+
canBeSupplied: false,
|
|
114
|
+
borrowRate,
|
|
115
|
+
supplyRate,
|
|
116
|
+
collateralFactor: '0',
|
|
117
|
+
liquidationRatio: '0',
|
|
118
|
+
utilization: new Dec(utilizationRate).mul(100).toString(),
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const assetsData: EulerV2AssetsData = {
|
|
122
|
+
[data.vaultAddr.toLowerCase()]: marketAsset,
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
colls
|
|
126
|
+
.sort((coll1, coll2) => {
|
|
127
|
+
const aMarket = new Dec(coll1.price).times(coll1.totalBorrow).toString();
|
|
128
|
+
const bMarket = new Dec(coll2.price).times(coll2.totalBorrow).toString();
|
|
129
|
+
|
|
130
|
+
return new Dec(bMarket).minus(aMarket).toNumber();
|
|
131
|
+
})
|
|
132
|
+
.forEach((market, i) => {
|
|
133
|
+
assetsData[market.vaultAddress.toLowerCase()] = { ...market, sortIndex: i + 1 };
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const marketData: EulerV2MarketInfoData = {
|
|
137
|
+
name: data.name,
|
|
138
|
+
symbol: data.symbol,
|
|
139
|
+
decimals: data.decimals,
|
|
140
|
+
irm: data.irm,
|
|
141
|
+
creator: data.creator,
|
|
142
|
+
governorAdmin: data.governorAdmin,
|
|
143
|
+
unitOfAccount: data.unitOfAccount,
|
|
144
|
+
unitOfAccountUsdPrice: usdPrice,
|
|
145
|
+
isInUSD,
|
|
146
|
+
oracle: data.oracle,
|
|
147
|
+
collaterals: data.collaterals.map((collateral) => collateral.vaultAddr),
|
|
148
|
+
isEscrow,
|
|
149
|
+
isGoverned,
|
|
150
|
+
vaultType,
|
|
151
|
+
vaultAddress: data.vaultAddr,
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
marketData,
|
|
156
|
+
assetsData,
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// export const getEulerV2AccountBalances = async (
|
|
161
|
+
// web3: Web3,
|
|
162
|
+
// network: NetworkNumber,
|
|
163
|
+
// selectedMarket: EulerV2MarketData
|
|
164
|
+
// ): Promise<> => {
|
|
165
|
+
//
|
|
166
|
+
// }
|
|
167
|
+
|
|
168
|
+
export const EMPTY_EULER_V2_DATA = {
|
|
169
|
+
usedAssets: {},
|
|
170
|
+
suppliedUsd: '0',
|
|
171
|
+
borrowedUsd: '0',
|
|
172
|
+
borrowLimitUsd: '0',
|
|
173
|
+
leftToBorrowUsd: '0',
|
|
174
|
+
ratio: '0',
|
|
175
|
+
minRatio: '0',
|
|
176
|
+
netApy: '0',
|
|
177
|
+
incentiveUsd: '0',
|
|
178
|
+
totalInterestUsd: '0',
|
|
179
|
+
isSubscribedToAutomation: false,
|
|
180
|
+
automationResubscribeRequired: false,
|
|
181
|
+
borrowVault: '',
|
|
182
|
+
borrowAmountInUnit: '0',
|
|
183
|
+
inLockDownMode: false,
|
|
184
|
+
inPermitDisabledMode: false,
|
|
185
|
+
lastUpdated: Date.now(),
|
|
186
|
+
hasBorrowInDifferentVault: false,
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export const getEulerV2AccountData = async (
|
|
190
|
+
web3: Web3,
|
|
191
|
+
network: NetworkNumber,
|
|
192
|
+
address: string,
|
|
193
|
+
extractedState: ({
|
|
194
|
+
selectedMarket: EulerV2Market,
|
|
195
|
+
assetsData: EulerV2AssetsData,
|
|
196
|
+
marketData: EulerV2MarketInfoData,
|
|
197
|
+
}),
|
|
198
|
+
): Promise<EulerV2PositionData> => {
|
|
199
|
+
if (!address) throw new Error('No address provided');
|
|
200
|
+
|
|
201
|
+
const {
|
|
202
|
+
selectedMarket, assetsData, marketData,
|
|
203
|
+
} = extractedState;
|
|
204
|
+
|
|
205
|
+
let payload = {
|
|
206
|
+
...EMPTY_EULER_V2_DATA,
|
|
207
|
+
lastUpdated: Date.now(),
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const isInUSD = marketData.isInUSD;
|
|
211
|
+
|
|
212
|
+
// TODO: maybe not the best practice to get decimals from tokens package
|
|
213
|
+
const parsingDecimals = isInUSD ? 18 : getAssetInfoByAddress(marketData.unitOfAccount).decimals;
|
|
214
|
+
const contract = EulerV2ViewContract(web3, network);
|
|
215
|
+
|
|
216
|
+
const loanData = await contract.methods.getUserData(address).call();
|
|
217
|
+
const usedAssets: EulerV2UsedAssets = {};
|
|
218
|
+
|
|
219
|
+
// there is no user position check for a specific market, only global check
|
|
220
|
+
// but we need to make sure it works for the UI and show position only for the selected market
|
|
221
|
+
if (!compareAddresses(loanData.borrowVault, selectedMarket.marketAddress)) {
|
|
222
|
+
payload = {
|
|
223
|
+
...payload,
|
|
224
|
+
borrowVault: ZERO_ADDRESS,
|
|
225
|
+
borrowAmountInUnit: '0',
|
|
226
|
+
inLockDownMode: false,
|
|
227
|
+
inPermitDisabledMode: false,
|
|
228
|
+
hasBorrowInDifferentVault: !compareAddresses(loanData.borrowVault, ZERO_ADDRESS),
|
|
229
|
+
};
|
|
230
|
+
} else {
|
|
231
|
+
payload = {
|
|
232
|
+
...payload,
|
|
233
|
+
borrowVault: loanData.borrowVault,
|
|
234
|
+
borrowAmountInUnit: loanData.borrowAmountInUnit,
|
|
235
|
+
inLockDownMode: loanData.inLockDownMode,
|
|
236
|
+
inPermitDisabledMode: loanData.inPermitDisabledMode,
|
|
237
|
+
hasBorrowInDifferentVault: false,
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
const borrowedInUnit = getEthAmountForDecimals(loanData.borrowAmountInUnit, parsingDecimals);
|
|
241
|
+
const borrowedInAsset = getEthAmountForDecimals(loanData.borrowAmountInAsset, marketData.decimals);
|
|
242
|
+
const borrowVault = loanData.borrowVault;
|
|
243
|
+
|
|
244
|
+
if (borrowVault && !compareAddresses(ZERO_ADDRESS, borrowVault) && borrowedInUnit) {
|
|
245
|
+
const borrowInfo = assetsData[borrowVault.toLowerCase()];
|
|
246
|
+
usedAssets[borrowVault.toLowerCase()] = {
|
|
247
|
+
...EMPTY_USED_ASSET,
|
|
248
|
+
isBorrowed: true,
|
|
249
|
+
borrowed: borrowedInAsset,
|
|
250
|
+
borrowedUsd: isInUSD ? borrowedInUnit : new Dec(borrowedInUnit).mul(marketData.unitOfAccountUsdPrice).toString(),
|
|
251
|
+
vaultAddress: loanData.borrowVault,
|
|
252
|
+
symbol: borrowInfo.symbol,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
loanData.collaterals.forEach((collateral, i) => {
|
|
258
|
+
const key = collateral.collateralVault.toLowerCase();
|
|
259
|
+
const collInfo = assetsData[key];
|
|
260
|
+
|
|
261
|
+
if (!collInfo || !marketData.collaterals.map(a => a.toLowerCase()).includes(key)) return; // this is a token supplied but not being used as a collateral for the market
|
|
262
|
+
|
|
263
|
+
const suppliedInUnit = getEthAmountForDecimals(collateral.collateralAmountInUnit, parsingDecimals);
|
|
264
|
+
const suppliedInAsset = getEthAmountForDecimals(collateral.collateralAmountInAsset, collInfo.decimals);
|
|
265
|
+
const collateralAmountInUSD = getEthAmountForDecimals(collateral.collateralAmountInUSD, 18);
|
|
266
|
+
usedAssets[key] = {
|
|
267
|
+
...EMPTY_USED_ASSET,
|
|
268
|
+
collateral: true,
|
|
269
|
+
isSupplied: true,
|
|
270
|
+
supplied: suppliedInAsset,
|
|
271
|
+
suppliedUsd: collateralAmountInUSD,
|
|
272
|
+
vaultAddress: collateral.collateralVault,
|
|
273
|
+
symbol: collInfo.symbol,
|
|
274
|
+
};
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
payload = {
|
|
278
|
+
...payload,
|
|
279
|
+
usedAssets,
|
|
280
|
+
...getEulerV2AggregatedData({
|
|
281
|
+
usedAssets, assetsData, network,
|
|
282
|
+
}),
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
return payload;
|
|
286
|
+
};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import Dec from 'decimal.js';
|
|
2
|
+
import Web3 from 'web3';
|
|
3
|
+
import { assetAmountInWei } from '@defisaver/tokens';
|
|
4
|
+
import {
|
|
5
|
+
EthAddress, NetworkNumber,
|
|
6
|
+
} from '../../types/common';
|
|
7
|
+
import {
|
|
8
|
+
calcLeverageLiqPrice, getAssetsTotal, STABLE_ASSETS,
|
|
9
|
+
} from '../../moneymarket';
|
|
10
|
+
import { calculateInterestEarned } from '../../staking';
|
|
11
|
+
import {
|
|
12
|
+
EulerV2AggregatedPositionData,
|
|
13
|
+
EulerV2AssetsData,
|
|
14
|
+
EulerV2Market,
|
|
15
|
+
EulerV2UsedAssets,
|
|
16
|
+
} from '../../types';
|
|
17
|
+
import { EulerV2ViewContract } from '../../contracts';
|
|
18
|
+
import { borrowOperations } from '../../constants';
|
|
19
|
+
import { multicall } from '../../multicall';
|
|
20
|
+
|
|
21
|
+
export const isLeveragedPos = (usedAssets: EulerV2UsedAssets, dustLimit = 5) => {
|
|
22
|
+
let borrowUnstable = 0;
|
|
23
|
+
let supplyStable = 0;
|
|
24
|
+
let borrowStable = 0;
|
|
25
|
+
let supplyUnstable = 0;
|
|
26
|
+
let longAsset = '';
|
|
27
|
+
let shortAsset = '';
|
|
28
|
+
let leverageAssetVault = '';
|
|
29
|
+
Object.values(usedAssets).forEach(({
|
|
30
|
+
symbol, suppliedUsd, borrowedUsd, collateral, vaultAddress,
|
|
31
|
+
}) => {
|
|
32
|
+
const isSupplied = (+suppliedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
33
|
+
const isBorrowed = (+borrowedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
34
|
+
if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral) supplyStable += 1;
|
|
35
|
+
if (isBorrowed && STABLE_ASSETS.includes(symbol)) borrowStable += 1;
|
|
36
|
+
if (isBorrowed && !STABLE_ASSETS.includes(symbol)) {
|
|
37
|
+
borrowUnstable += 1;
|
|
38
|
+
shortAsset = symbol;
|
|
39
|
+
leverageAssetVault = vaultAddress;
|
|
40
|
+
}
|
|
41
|
+
if (isSupplied && !STABLE_ASSETS.includes(symbol) && collateral) {
|
|
42
|
+
supplyUnstable += 1;
|
|
43
|
+
longAsset = symbol;
|
|
44
|
+
leverageAssetVault = vaultAddress;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
const isLong = borrowStable > 0 && borrowUnstable === 0 && supplyUnstable === 1 && supplyStable === 0;
|
|
48
|
+
const isShort = supplyStable > 0 && supplyUnstable === 0 && borrowUnstable === 1 && borrowStable === 0;
|
|
49
|
+
// lsd -> liquid staking derivative
|
|
50
|
+
const isLsdLeveraged = supplyUnstable === 1 && borrowUnstable === 1 && shortAsset === 'ETH' && ['stETH', 'wstETH', 'cbETH', 'rETH'].includes(longAsset);
|
|
51
|
+
if (isLong) {
|
|
52
|
+
return {
|
|
53
|
+
leveragedType: 'long',
|
|
54
|
+
leveragedAsset: longAsset,
|
|
55
|
+
leveragedVault: leverageAssetVault,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (isShort) {
|
|
59
|
+
return {
|
|
60
|
+
leveragedType: 'short',
|
|
61
|
+
leveragedAsset: shortAsset,
|
|
62
|
+
leveragedVault: leverageAssetVault,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (isLsdLeveraged) {
|
|
66
|
+
return {
|
|
67
|
+
leveragedType: 'lsd-leverage',
|
|
68
|
+
leveragedAsset: longAsset,
|
|
69
|
+
leveragedVault: leverageAssetVault,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
leveragedType: '',
|
|
74
|
+
leveragedAsset: '',
|
|
75
|
+
leveragedVault: '',
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const calculateNetApy = (usedAssets: EulerV2UsedAssets, assetsData: EulerV2AssetsData) => {
|
|
80
|
+
const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
|
|
81
|
+
const acc = { ..._acc };
|
|
82
|
+
const assetData = assetsData[usedAsset.vaultAddress.toLowerCase()];
|
|
83
|
+
|
|
84
|
+
if (usedAsset.isSupplied) {
|
|
85
|
+
const amount = usedAsset.suppliedUsd;
|
|
86
|
+
acc.suppliedUsd = new Dec(acc.suppliedUsd).add(amount).toString();
|
|
87
|
+
const rate = assetData.supplyRate;
|
|
88
|
+
const supplyInterest = calculateInterestEarned(amount, rate as string, 'year', true);
|
|
89
|
+
acc.supplyInterest = new Dec(acc.supplyInterest).add(supplyInterest.toString()).toString();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (usedAsset.isBorrowed) {
|
|
93
|
+
const amount = usedAsset.borrowedUsd;
|
|
94
|
+
acc.borrowedUsd = new Dec(acc.borrowedUsd).add(amount).toString();
|
|
95
|
+
const rate = assetData.borrowRate;
|
|
96
|
+
const borrowInterest = calculateInterestEarned(amount, rate as string, 'year', true);
|
|
97
|
+
acc.borrowInterest = new Dec(acc.borrowInterest).sub(borrowInterest.toString()).toString();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return acc;
|
|
101
|
+
}, {
|
|
102
|
+
borrowInterest: '0', supplyInterest: '0', incentiveUsd: '0', borrowedUsd: '0', suppliedUsd: '0',
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const {
|
|
106
|
+
borrowedUsd, suppliedUsd, borrowInterest, supplyInterest, incentiveUsd,
|
|
107
|
+
} = sumValues;
|
|
108
|
+
|
|
109
|
+
const totalInterestUsd = new Dec(borrowInterest).add(supplyInterest).add(incentiveUsd).toString();
|
|
110
|
+
const balance = new Dec(suppliedUsd).sub(borrowedUsd);
|
|
111
|
+
const netApy = new Dec(totalInterestUsd).div(balance).times(100).toString();
|
|
112
|
+
|
|
113
|
+
return { netApy, totalInterestUsd, incentiveUsd };
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const getEulerV2AggregatedData = ({
|
|
117
|
+
usedAssets, assetsData, network, ...rest
|
|
118
|
+
}: { usedAssets: EulerV2UsedAssets, assetsData: EulerV2AssetsData, network: NetworkNumber }) => {
|
|
119
|
+
const payload = {} as EulerV2AggregatedPositionData;
|
|
120
|
+
payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
|
|
121
|
+
payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
|
|
122
|
+
payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
|
|
123
|
+
payload.borrowLimitUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ vaultAddress, suppliedUsd }: { vaultAddress: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[vaultAddress.toLowerCase()].collateralFactor));
|
|
124
|
+
payload.liquidationLimitUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ vaultAddress, suppliedUsd }: { vaultAddress: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[vaultAddress.toLowerCase()].liquidationRatio));
|
|
125
|
+
const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
|
|
126
|
+
payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
|
|
127
|
+
payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
128
|
+
payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
129
|
+
const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData);
|
|
130
|
+
payload.netApy = netApy;
|
|
131
|
+
payload.incentiveUsd = incentiveUsd;
|
|
132
|
+
payload.totalInterestUsd = totalInterestUsd;
|
|
133
|
+
payload.minRatio = '100';
|
|
134
|
+
payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
|
|
135
|
+
payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
|
|
136
|
+
const { leveragedType, leveragedAsset, leveragedVault } = isLeveragedPos(usedAssets);
|
|
137
|
+
payload.leveragedType = leveragedType;
|
|
138
|
+
if (leveragedType !== '') {
|
|
139
|
+
payload.leveragedAsset = leveragedAsset;
|
|
140
|
+
let assetPrice = assetsData[leveragedVault.toLowerCase()].price;
|
|
141
|
+
if (leveragedType === 'lsd-leverage') {
|
|
142
|
+
const ethAsset = Object.values(assetsData).find((asset) => ['WETH', 'ETH'].includes(asset.symbol));
|
|
143
|
+
if (ethAsset) {
|
|
144
|
+
payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedVault.toLowerCase()].price).div(ethAsset.price).toString();
|
|
145
|
+
assetPrice = new Dec(assetPrice).div(ethAsset.price).toString();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
|
|
149
|
+
}
|
|
150
|
+
return payload;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export const getEulerV2BorrowRate = (interestRate: string) => {
|
|
154
|
+
const _interestRate = new Dec(interestRate).div(1e27).toString();
|
|
155
|
+
const secondsPerYear = 31556953;
|
|
156
|
+
const a = new Dec(1).plus(_interestRate).pow(secondsPerYear - 1).toString();
|
|
157
|
+
return new Dec(new Dec(a).minus(1)).mul(100).toString();
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const getUtilizationRate = (totalBorrows: string, totalAssets: string) => new Dec(totalBorrows).div(totalAssets).toString();
|
|
161
|
+
|
|
162
|
+
export const getEulerV2SupplyRate = (borrowRate: string, utilizationRate: string, _interestFee: string) => {
|
|
163
|
+
const interestFee = new Dec(_interestFee).div(10000);
|
|
164
|
+
const fee = new Dec(1).minus(interestFee);
|
|
165
|
+
return new Dec(borrowRate).mul(utilizationRate).mul(fee).toString();
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const getLiquidityChanges = (action: string, amount: string, isBorrowOperation: boolean) => {
|
|
169
|
+
let liquidityAdded;
|
|
170
|
+
let liquidityRemoved;
|
|
171
|
+
if (isBorrowOperation) {
|
|
172
|
+
liquidityAdded = action === 'payback' ? amount : '0';
|
|
173
|
+
liquidityRemoved = action === 'borrow' ? amount : '0';
|
|
174
|
+
} else {
|
|
175
|
+
liquidityAdded = action === 'collateral' ? amount : '0';
|
|
176
|
+
liquidityRemoved = action === 'withdraw' ? amount : '0';
|
|
177
|
+
}
|
|
178
|
+
return { liquidityAdded, liquidityRemoved };
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const getApyAfterValuesEstimationEulerV2 = async (actions: { action: string, amount: string, asset: string, vaultAddress: EthAddress }[], web3: Web3, network: NetworkNumber) => {
|
|
182
|
+
const eulerV2ViewContract = EulerV2ViewContract(web3, network);
|
|
183
|
+
const multicallData: any[] = [];
|
|
184
|
+
const apyAfterValuesEstimationParams: any[] = [];
|
|
185
|
+
actions.forEach(({
|
|
186
|
+
action, amount, asset, vaultAddress,
|
|
187
|
+
}) => {
|
|
188
|
+
const amountInWei = assetAmountInWei(amount, asset);
|
|
189
|
+
const isBorrowOperation = borrowOperations.includes(action);
|
|
190
|
+
const { liquidityAdded, liquidityRemoved } = getLiquidityChanges(action, amountInWei, isBorrowOperation);
|
|
191
|
+
apyAfterValuesEstimationParams.push([
|
|
192
|
+
vaultAddress,
|
|
193
|
+
borrowOperations.includes(action),
|
|
194
|
+
liquidityAdded,
|
|
195
|
+
liquidityRemoved,
|
|
196
|
+
]);
|
|
197
|
+
multicallData.push({
|
|
198
|
+
target: eulerV2ViewContract.options.address,
|
|
199
|
+
abiItem: eulerV2ViewContract.options.jsonInterface.find(({ name }) => name === 'getVaultInfoFull'),
|
|
200
|
+
params: [vaultAddress],
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
multicallData.push({
|
|
204
|
+
target: eulerV2ViewContract.options.address,
|
|
205
|
+
abiItem: eulerV2ViewContract.options.jsonInterface.find(({ name }) => name === 'getApyAfterValuesEstimation'),
|
|
206
|
+
params: [apyAfterValuesEstimationParams],
|
|
207
|
+
});
|
|
208
|
+
const multicallRes = await multicall(multicallData, web3, network);
|
|
209
|
+
const numOfActions = actions.length;
|
|
210
|
+
const data: any = {};
|
|
211
|
+
for (let i = 0; i < numOfActions; i += 1) {
|
|
212
|
+
const _interestRate = multicallRes[numOfActions].estimatedBorrowRates[i];
|
|
213
|
+
const vaultInfo = multicallRes[i][0];
|
|
214
|
+
const decimals = vaultInfo.decimals;
|
|
215
|
+
const borrowRate = getEulerV2BorrowRate(_interestRate);
|
|
216
|
+
|
|
217
|
+
const amount = new Dec(actions[i].amount).mul(10 ** decimals).toString();
|
|
218
|
+
const action = actions[i].action;
|
|
219
|
+
const isBorrowOperation = borrowOperations.includes(action);
|
|
220
|
+
const { liquidityAdded, liquidityRemoved } = getLiquidityChanges(action, amount, isBorrowOperation);
|
|
221
|
+
|
|
222
|
+
const totalBorrows = new Dec(vaultInfo.totalBorrows).add(isBorrowOperation ? liquidityRemoved : '0').sub(isBorrowOperation ? liquidityAdded : '0').toString();
|
|
223
|
+
const totalAssets = new Dec(vaultInfo.totalAssets).add(isBorrowOperation ? '0' : liquidityAdded).sub(isBorrowOperation ? '0' : liquidityRemoved).toString();
|
|
224
|
+
const utilizationRate = getUtilizationRate(totalBorrows, totalAssets);
|
|
225
|
+
data[vaultInfo.vaultAddr.toLowerCase()] = {
|
|
226
|
+
borrowRate,
|
|
227
|
+
supplyRate: getEulerV2SupplyRate(borrowRate, utilizationRate, vaultInfo.interestFee),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return data;
|
|
231
|
+
};
|
package/src/helpers/index.ts
CHANGED
|
@@ -5,4 +5,5 @@ export * as curveUsdHelpers from './curveUsdHelpers';
|
|
|
5
5
|
export * as makerHelpers from './makerHelpers';
|
|
6
6
|
export * as chickenBondsHelpers from './chickenBondsHelpers';
|
|
7
7
|
export * as morphoBlueHelpers from './morphoBlueHelpers';
|
|
8
|
-
export * as llamaLendHelpers from './llamaLendHelpers';
|
|
8
|
+
export * as llamaLendHelpers from './llamaLendHelpers';
|
|
9
|
+
export * as eulerV2Helpers from './eulerHelpers';
|