@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.
Files changed (69) hide show
  1. package/cjs/config/contracts.d.ts +72 -0
  2. package/cjs/config/contracts.js +6 -0
  3. package/cjs/contracts.d.ts +1 -0
  4. package/cjs/contracts.js +2 -1
  5. package/cjs/eulerV2/index.d.ts +40 -0
  6. package/cjs/eulerV2/index.js +207 -0
  7. package/cjs/helpers/eulerHelpers/index.d.ts +27 -0
  8. package/cjs/helpers/eulerHelpers/index.js +232 -0
  9. package/cjs/helpers/index.d.ts +1 -0
  10. package/cjs/helpers/index.js +2 -1
  11. package/cjs/index.d.ts +2 -1
  12. package/cjs/index.js +3 -1
  13. package/cjs/markets/euler/index.d.ts +10 -0
  14. package/cjs/markets/euler/index.js +41 -0
  15. package/cjs/markets/index.d.ts +1 -0
  16. package/cjs/markets/index.js +3 -1
  17. package/cjs/services/utils.d.ts +2 -0
  18. package/cjs/services/utils.js +4 -1
  19. package/cjs/staking/staking.d.ts +1 -0
  20. package/cjs/staking/staking.js +10 -2
  21. package/cjs/types/contracts/generated/EulerV2View.d.ts +333 -0
  22. package/cjs/types/contracts/generated/EulerV2View.js +5 -0
  23. package/cjs/types/contracts/generated/index.d.ts +1 -0
  24. package/cjs/types/euler.d.ts +148 -0
  25. package/cjs/types/euler.js +15 -0
  26. package/cjs/types/index.d.ts +1 -0
  27. package/cjs/types/index.js +1 -0
  28. package/esm/config/contracts.d.ts +72 -0
  29. package/esm/config/contracts.js +6 -0
  30. package/esm/contracts.d.ts +1 -0
  31. package/esm/contracts.js +1 -0
  32. package/esm/eulerV2/index.d.ts +40 -0
  33. package/esm/eulerV2/index.js +199 -0
  34. package/esm/helpers/eulerHelpers/index.d.ts +27 -0
  35. package/esm/helpers/eulerHelpers/index.js +219 -0
  36. package/esm/helpers/index.d.ts +1 -0
  37. package/esm/helpers/index.js +1 -0
  38. package/esm/index.d.ts +2 -1
  39. package/esm/index.js +2 -1
  40. package/esm/markets/euler/index.d.ts +10 -0
  41. package/esm/markets/euler/index.js +34 -0
  42. package/esm/markets/index.d.ts +1 -0
  43. package/esm/markets/index.js +1 -0
  44. package/esm/services/utils.d.ts +2 -0
  45. package/esm/services/utils.js +2 -0
  46. package/esm/staking/staking.d.ts +1 -0
  47. package/esm/staking/staking.js +8 -1
  48. package/esm/types/contracts/generated/EulerV2View.d.ts +333 -0
  49. package/esm/types/contracts/generated/EulerV2View.js +4 -0
  50. package/esm/types/contracts/generated/index.d.ts +1 -0
  51. package/esm/types/euler.d.ts +148 -0
  52. package/esm/types/euler.js +12 -0
  53. package/esm/types/index.d.ts +1 -0
  54. package/esm/types/index.js +1 -0
  55. package/package.json +2 -1
  56. package/src/config/contracts.js +6 -0
  57. package/src/contracts.ts +2 -0
  58. package/src/eulerV2/index.ts +286 -0
  59. package/src/helpers/eulerHelpers/index.ts +231 -0
  60. package/src/helpers/index.ts +2 -1
  61. package/src/index.ts +2 -0
  62. package/src/markets/euler/index.ts +38 -0
  63. package/src/markets/index.ts +3 -1
  64. package/src/services/utils.ts +3 -0
  65. package/src/staking/staking.ts +8 -1
  66. package/src/types/contracts/generated/EulerV2View.ts +434 -0
  67. package/src/types/contracts/generated/index.ts +1 -0
  68. package/src/types/euler.ts +171 -0
  69. package/src/types/index.ts +2 -1
@@ -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
+ };
@@ -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';