@defisaver/positions-sdk 1.0.3-dev → 1.0.4

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 (53) hide show
  1. package/cjs/aaveV3/index.js +7 -7
  2. package/cjs/fluid/index.d.ts +2 -0
  3. package/cjs/helpers/aaveHelpers/index.js +6 -0
  4. package/cjs/helpers/compoundHelpers/index.js +2 -0
  5. package/cjs/helpers/eulerHelpers/index.js +2 -0
  6. package/cjs/helpers/fluidHelpers/index.js +2 -0
  7. package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
  8. package/cjs/helpers/sparkHelpers/index.js +2 -0
  9. package/cjs/markets/compound/marketsAssets.js +1 -1
  10. package/cjs/markets/spark/marketAssets.js +1 -1
  11. package/cjs/staking/staking.d.ts +2 -1
  12. package/cjs/staking/staking.js +3 -7
  13. package/cjs/types/aave.d.ts +4 -0
  14. package/cjs/types/compound.d.ts +2 -0
  15. package/cjs/types/euler.d.ts +2 -0
  16. package/cjs/types/fluid.d.ts +2 -0
  17. package/cjs/types/morphoBlue.d.ts +2 -0
  18. package/cjs/types/spark.d.ts +2 -0
  19. package/esm/aaveV3/index.js +7 -7
  20. package/esm/fluid/index.d.ts +2 -0
  21. package/esm/helpers/aaveHelpers/index.js +6 -0
  22. package/esm/helpers/compoundHelpers/index.js +2 -0
  23. package/esm/helpers/eulerHelpers/index.js +2 -0
  24. package/esm/helpers/fluidHelpers/index.js +2 -0
  25. package/esm/helpers/morphoBlueHelpers/index.js +2 -0
  26. package/esm/helpers/sparkHelpers/index.js +2 -0
  27. package/esm/markets/compound/marketsAssets.js +1 -1
  28. package/esm/markets/spark/marketAssets.js +1 -1
  29. package/esm/staking/staking.d.ts +2 -1
  30. package/esm/staking/staking.js +3 -6
  31. package/esm/types/aave.d.ts +4 -0
  32. package/esm/types/compound.d.ts +2 -0
  33. package/esm/types/euler.d.ts +2 -0
  34. package/esm/types/fluid.d.ts +2 -0
  35. package/esm/types/morphoBlue.d.ts +2 -0
  36. package/esm/types/spark.d.ts +2 -0
  37. package/package.json +4 -2
  38. package/src/aaveV3/index.ts +8 -9
  39. package/src/helpers/aaveHelpers/index.ts +6 -0
  40. package/src/helpers/compoundHelpers/index.ts +2 -0
  41. package/src/helpers/eulerHelpers/index.ts +2 -0
  42. package/src/helpers/fluidHelpers/index.ts +3 -0
  43. package/src/helpers/morphoBlueHelpers/index.ts +2 -0
  44. package/src/helpers/sparkHelpers/index.ts +2 -0
  45. package/src/markets/compound/marketsAssets.ts +1 -1
  46. package/src/markets/spark/marketAssets.ts +1 -1
  47. package/src/staking/staking.ts +3 -6
  48. package/src/types/aave.ts +4 -0
  49. package/src/types/compound.ts +2 -0
  50. package/src/types/euler.ts +2 -0
  51. package/src/types/fluid.ts +2 -0
  52. package/src/types/morphoBlue.ts +2 -0
  53. package/src/types/spark.ts +2 -0
@@ -13,17 +13,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getAaveV3FullPositionData = exports.getAaveV3AccountData = exports.getAaveV3AccountBalances = exports.EMPTY_AAVE_DATA = exports.getAaveV3MarketData = exports.aaveV3EmodeCategoriesMapping = exports.aaveV3CalculateDiscountRate = exports.test = void 0;
16
- const decimal_js_1 = __importDefault(require("decimal.js"));
17
16
  const tokens_1 = require("@defisaver/tokens");
18
- const contracts_1 = require("../contracts");
19
- const utils_1 = require("../services/utils");
20
- const common_1 = require("../types/common");
21
- const staking_1 = require("../staking");
22
- const multicall_1 = require("../multicall");
17
+ const decimal_js_1 = __importDefault(require("decimal.js"));
23
18
  const assets_1 = require("../assets");
24
- const moneymarket_1 = require("../moneymarket");
19
+ const contracts_1 = require("../contracts");
25
20
  const aaveHelpers_1 = require("../helpers/aaveHelpers");
26
21
  const aave_1 = require("../markets/aave");
22
+ const moneymarket_1 = require("../moneymarket");
23
+ const multicall_1 = require("../multicall");
24
+ const utils_1 = require("../services/utils");
25
+ const staking_1 = require("../staking");
26
+ const common_1 = require("../types/common");
27
27
  const test = (web3, network) => {
28
28
  const contract = (0, contracts_1.AaveV3ViewContract)(web3, 1);
29
29
  return contract.methods.AAVE_REFERRAL_CODE().call();
@@ -78,6 +78,8 @@ export declare const getUserPositions: (web3: Web3, network: NetworkNumber, user
78
78
  leveragedAsset?: string | undefined;
79
79
  liquidationPrice?: string | undefined;
80
80
  leveragedLsdAssetRatio?: string | undefined;
81
+ minCollRatio?: string | undefined;
82
+ collLiquidationRatio?: string | undefined;
81
83
  owner: string;
82
84
  vaultId: number;
83
85
  usedAssets: FluidUsedAssets;
@@ -134,6 +134,12 @@ const aaveAnyGetAggregatedPositionData = (_a) => {
134
134
  }
135
135
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
136
136
  }
137
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
138
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
139
+ payload.healthRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).mul(payload.liqPercent).div(payload.borrowedUsd).div(100)
140
+ .toString();
141
+ payload.healthLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).mul(payload.liqRatio).div(payload.borrowLimitUsd)
142
+ .toString();
137
143
  return payload;
138
144
  };
139
145
  exports.aaveAnyGetAggregatedPositionData = aaveAnyGetAggregatedPositionData;
@@ -135,6 +135,8 @@ const getCompoundV3AggregatedData = (_a) => {
135
135
  }
136
136
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
137
137
  }
138
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
139
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
138
140
  // TO DO: handle strategies
139
141
  /* const subscribedStrategies = rest.compoundStrategies
140
142
  ? compoundV3GetSubscribedStrategies({ selectedMarket, compoundStrategies: rest.compoundStrategies })
@@ -151,6 +151,8 @@ const getEulerV2AggregatedData = (_a) => {
151
151
  }
152
152
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
153
153
  }
154
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
155
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
154
156
  return payload;
155
157
  };
156
158
  exports.getEulerV2AggregatedData = getEulerV2AggregatedData;
@@ -36,6 +36,8 @@ const getFluidAggregatedData = ({ usedAssets, assetsData, marketData, }) => {
36
36
  }
37
37
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
38
38
  }
39
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
40
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
39
41
  return payload;
40
42
  };
41
43
  exports.getFluidAggregatedData = getFluidAggregatedData;
@@ -57,6 +57,8 @@ const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, marketInf
57
57
  }
58
58
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
59
59
  }
60
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
61
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
60
62
  return payload;
61
63
  };
62
64
  exports.getMorphoBlueAggregatedPositionData = getMorphoBlueAggregatedPositionData;
@@ -98,6 +98,8 @@ const sparkGetAggregatedPositionData = (_a) => {
98
98
  }
99
99
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
100
100
  }
101
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
102
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
101
103
  return payload;
102
104
  };
103
105
  exports.sparkGetAggregatedPositionData = sparkGetAggregatedPositionData;
@@ -27,7 +27,7 @@ exports.v3USDCeCollAssets = {
27
27
  [common_1.NetworkNumber.Base]: [],
28
28
  };
29
29
  exports.v3ETHCollAssetsEth = ['cbETH', 'wstETH', 'rETH', 'rsETH', 'weETH', 'osETH', 'WBTC', 'ezETH', 'cbBTC', 'rswETH', 'tBTC', 'ETHx'];
30
- exports.v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC'];
30
+ exports.v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC', 'wsuperOETHb'];
31
31
  exports.v3ETHCollAssetsArb = ['weETH', 'rETH', 'wstETH', 'WBTC', 'rsETH', 'ezETH', 'USDC', 'USDT'];
32
32
  exports.v3ETHCollAssetsOpt = ['rETH', 'wstETH', 'WBTC', 'ezETH', 'USDC', 'USDT', 'weETH', 'wrsETH'];
33
33
  // @dev Keep assets in array, do not assign directly, so we can parse it and edit it programmatically with `scripts/updateMarkets`
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sparkAssetsDefaultMarket = exports.sparkAssetsDefaultMarketEth = void 0;
4
4
  const common_1 = require("../../types/common");
5
- exports.sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS'];
5
+ exports.sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS', 'LBTC', 'tBTC', 'ezETH', 'rsETH'];
6
6
  // @dev Keep assets in array, do not assign directly, so we can parse it and edit it programmatically with `scripts/updateMarkets`
7
7
  exports.sparkAssetsDefaultMarket = {
8
8
  [common_1.NetworkNumber.Eth]: exports.sparkAssetsDefaultMarketEth,
@@ -1,7 +1,8 @@
1
1
  import Web3 from 'web3';
2
+ import memoize from 'memoizee';
2
3
  import { MMAssetsData, MMUsedAssets } from '../types/common';
3
4
  export declare const STAKING_ASSETS: string[];
4
- export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>;
5
+ export declare const getStakingApy: ((asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>) & memoize.Memoized<(asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>>;
5
6
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
7
  export declare const calculateNetApy: ({ usedAssets, assetsData, isMorpho }: {
7
8
  usedAssets: MMUsedAssets;
@@ -14,6 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getStETHByWstETHMultiple = exports.getStETHByWstETH = exports.getWstETHByStETH = exports.calculateNetApy = exports.calculateInterestEarned = exports.getStakingApy = exports.STAKING_ASSETS = void 0;
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
+ const memoizee_1 = __importDefault(require("memoizee"));
17
18
  const contracts_1 = require("../contracts");
18
19
  const common_1 = require("../types/common");
19
20
  const constants_1 = require("../constants");
@@ -110,14 +111,10 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
110
111
  if (!res.ok)
111
112
  throw new Error(`Failed to fetch APY for ${asset}`);
112
113
  const data = yield res.json();
113
- // if our server returns apr, transform it into apy
114
- if (['weETH'].includes(asset)) {
115
- return (0, moneymarket_1.aprToApy)(data.apy);
116
- }
117
114
  return String(data.apy);
118
115
  });
119
116
  exports.STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
120
- const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
117
+ exports.getStakingApy = (0, memoizee_1.default)((asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
121
118
  try {
122
119
  if (asset === 'stETH' || asset === 'wstETH')
123
120
  return yield getStETHApy(web3, fromBlock, blockNumber);
@@ -150,8 +147,7 @@ const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefine
150
147
  console.error(`Failed to fetch APY for ${asset}`);
151
148
  }
152
149
  return '0';
153
- });
154
- exports.getStakingApy = getStakingApy;
150
+ }), { promise: true, maxAge: 2 * 60 * 1000 });
155
151
  const calculateInterestEarned = (principal, interest, type, apy = false) => {
156
152
  let interval = 1;
157
153
  if (+interest === 0)
@@ -229,6 +229,10 @@ export interface AaveV3AggregatedPositionData {
229
229
  leveragedAsset?: string;
230
230
  leveragedLsdAssetRatio?: string;
231
231
  liquidationPrice?: string;
232
+ minCollRatio?: string;
233
+ collLiquidationRatio?: string;
234
+ healthRatio?: string;
235
+ healthLiquidationRatio?: string;
232
236
  }
233
237
  export interface AaveHelperCommon {
234
238
  usedAssets: any;
@@ -96,6 +96,8 @@ export interface CompoundAggregatedPositionData {
96
96
  minRatio: string;
97
97
  debtTooLow: boolean;
98
98
  minDebt: string;
99
+ minCollRatio: string;
100
+ collLiquidationRatio: string;
99
101
  }
100
102
  export interface CompoundPositionData extends MMPositionData {
101
103
  ratio: string;
@@ -146,4 +146,6 @@ export interface EulerV2AggregatedPositionData {
146
146
  liquidationPrice?: string;
147
147
  minRatio: string;
148
148
  minDebt: string;
149
+ minCollRatio: string;
150
+ collLiquidationRatio: string;
149
151
  }
@@ -240,6 +240,8 @@ export interface FluidAggregatedVaultData {
240
240
  leveragedAsset?: string;
241
241
  liquidationPrice?: string;
242
242
  leveragedLsdAssetRatio?: string;
243
+ minCollRatio?: string;
244
+ collLiquidationRatio?: string;
243
245
  }
244
246
  export interface BaseFluidVaultData {
245
247
  owner: string;
@@ -122,6 +122,8 @@ export interface MorphoBlueAggregatedPositionData {
122
122
  leveragedAsset?: string;
123
123
  leveragedLsdAssetRatio?: string;
124
124
  liquidationPrice?: string;
125
+ minCollRatio?: string;
126
+ collLiquidationRatio?: string;
125
127
  }
126
128
  export interface MorphoBluePositionData {
127
129
  usedAssets: MMUsedAssets;
@@ -97,6 +97,8 @@ export interface SparkAggregatedPositionData {
97
97
  leveragedAsset?: string;
98
98
  leveragedLsdAssetRatio?: string;
99
99
  liquidationPrice?: string;
100
+ minCollRatio: string;
101
+ collLiquidationRatio: string;
100
102
  }
101
103
  export interface SparkPositionData extends MMPositionData {
102
104
  ratio: string;
@@ -7,17 +7,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import Dec from 'decimal.js';
11
10
  import { assetAmountInEth, assetAmountInWei, getAssetInfo } from '@defisaver/tokens';
12
- import { AaveIncentiveDataProviderV3Contract, AaveV3ViewContract, createContractWrapper, getConfigContractAbi, getConfigContractAddress, GhoTokenContract, } from '../contracts';
13
- import { addToObjectIf, ethToWeth, getAbiItem, isEnabledOnBitmap, isLayer2Network, wethToEth, wethToEthByAddress, } from '../services/utils';
14
- import { NetworkNumber, } from '../types/common';
15
- import { getStakingApy, STAKING_ASSETS } from '../staking';
16
- import { multicall } from '../multicall';
11
+ import Dec from 'decimal.js';
17
12
  import { getAssetsBalances } from '../assets';
18
- import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
13
+ import { AaveIncentiveDataProviderV3Contract, AaveV3ViewContract, createContractWrapper, getConfigContractAbi, getConfigContractAddress, GhoTokenContract, } from '../contracts';
19
14
  import { aaveAnyGetAggregatedPositionData, aaveV3IsInIsolationMode, aaveV3IsInSiloedMode } from '../helpers/aaveHelpers';
20
15
  import { AAVE_V3 } from '../markets/aave';
16
+ import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
17
+ import { multicall } from '../multicall';
18
+ import { addToObjectIf, ethToWeth, getAbiItem, isEnabledOnBitmap, isLayer2Network, wethToEth, wethToEthByAddress, } from '../services/utils';
19
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
20
+ import { NetworkNumber, } from '../types/common';
21
21
  export const test = (web3, network) => {
22
22
  const contract = AaveV3ViewContract(web3, 1);
23
23
  return contract.methods.AAVE_REFERRAL_CODE().call();
@@ -78,6 +78,8 @@ export declare const getUserPositions: (web3: Web3, network: NetworkNumber, user
78
78
  leveragedAsset?: string | undefined;
79
79
  liquidationPrice?: string | undefined;
80
80
  leveragedLsdAssetRatio?: string | undefined;
81
+ minCollRatio?: string | undefined;
82
+ collLiquidationRatio?: string | undefined;
81
83
  owner: string;
82
84
  vaultId: number;
83
85
  usedAssets: FluidUsedAssets;
@@ -117,6 +117,12 @@ export const aaveAnyGetAggregatedPositionData = (_a) => {
117
117
  }
118
118
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
119
119
  }
120
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
121
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
122
+ payload.healthRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqPercent).div(payload.borrowedUsd).div(100)
123
+ .toString();
124
+ payload.healthLiquidationRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqRatio).div(payload.borrowLimitUsd)
125
+ .toString();
120
126
  return payload;
121
127
  };
122
128
  const getApyAfterValuesEstimationInner = (selectedMarket, actions, viewContract, network) => __awaiter(void 0, void 0, void 0, function* () {
@@ -125,6 +125,8 @@ export const getCompoundV3AggregatedData = (_a) => {
125
125
  }
126
126
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
127
127
  }
128
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
129
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
128
130
  // TO DO: handle strategies
129
131
  /* const subscribedStrategies = rest.compoundStrategies
130
132
  ? compoundV3GetSubscribedStrategies({ selectedMarket, compoundStrategies: rest.compoundStrategies })
@@ -143,6 +143,8 @@ export const getEulerV2AggregatedData = (_a) => {
143
143
  }
144
144
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
145
145
  }
146
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
147
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
146
148
  return payload;
147
149
  };
148
150
  export const getEulerV2BorrowRate = (interestRate) => {
@@ -30,5 +30,7 @@ export const getFluidAggregatedData = ({ usedAssets, assetsData, marketData, })
30
30
  }
31
31
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
32
32
  }
33
+ payload.minCollRatio = new Dec(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
34
+ payload.collLiquidationRatio = new Dec(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
33
35
  return payload;
34
36
  };
@@ -51,6 +51,8 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
51
51
  }
52
52
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
53
53
  }
54
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
55
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
54
56
  return payload;
55
57
  };
56
58
  const compound = (ratePerSeconds) => {
@@ -87,6 +87,8 @@ export const sparkGetAggregatedPositionData = (_a) => {
87
87
  }
88
88
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
89
89
  }
90
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
91
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
90
92
  return payload;
91
93
  };
92
94
  export const getApyAfterValuesEstimation = (selectedMarket, actions, web3) => __awaiter(void 0, void 0, void 0, function* () {
@@ -24,7 +24,7 @@ export const v3USDCeCollAssets = {
24
24
  [NetworkNumber.Base]: [],
25
25
  };
26
26
  export const v3ETHCollAssetsEth = ['cbETH', 'wstETH', 'rETH', 'rsETH', 'weETH', 'osETH', 'WBTC', 'ezETH', 'cbBTC', 'rswETH', 'tBTC', 'ETHx'];
27
- export const v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC'];
27
+ export const v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC', 'wsuperOETHb'];
28
28
  export const v3ETHCollAssetsArb = ['weETH', 'rETH', 'wstETH', 'WBTC', 'rsETH', 'ezETH', 'USDC', 'USDT'];
29
29
  export const v3ETHCollAssetsOpt = ['rETH', 'wstETH', 'WBTC', 'ezETH', 'USDC', 'USDT', 'weETH', 'wrsETH'];
30
30
  // @dev Keep assets in array, do not assign directly, so we can parse it and edit it programmatically with `scripts/updateMarkets`
@@ -1,5 +1,5 @@
1
1
  import { NetworkNumber } from '../../types/common';
2
- export const sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS'];
2
+ export const sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS', 'LBTC', 'tBTC', 'ezETH', 'rsETH'];
3
3
  // @dev Keep assets in array, do not assign directly, so we can parse it and edit it programmatically with `scripts/updateMarkets`
4
4
  export const sparkAssetsDefaultMarket = {
5
5
  [NetworkNumber.Eth]: sparkAssetsDefaultMarketEth,
@@ -1,7 +1,8 @@
1
1
  import Web3 from 'web3';
2
+ import memoize from 'memoizee';
2
3
  import { MMAssetsData, MMUsedAssets } from '../types/common';
3
4
  export declare const STAKING_ASSETS: string[];
4
- export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>;
5
+ export declare const getStakingApy: ((asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>) & memoize.Memoized<(asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>>;
5
6
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
7
  export declare const calculateNetApy: ({ usedAssets, assetsData, isMorpho }: {
7
8
  usedAssets: MMUsedAssets;
@@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import Dec from 'decimal.js';
11
+ import memoize from 'memoizee';
11
12
  import { CbEthContract, LidoContract, PotContract, REthContract, wstETHContract, } from '../contracts';
12
13
  import { NetworkNumber } from '../types/common';
13
14
  import { BLOCKS_IN_A_YEAR, SECONDS_PER_YEAR, AVG_BLOCK_TIME } from '../constants';
@@ -104,14 +105,10 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
104
105
  if (!res.ok)
105
106
  throw new Error(`Failed to fetch APY for ${asset}`);
106
107
  const data = yield res.json();
107
- // if our server returns apr, transform it into apy
108
- if (['weETH'].includes(asset)) {
109
- return aprToApy(data.apy);
110
- }
111
108
  return String(data.apy);
112
109
  });
113
110
  export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
114
- export const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
111
+ export const getStakingApy = memoize((asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
115
112
  try {
116
113
  if (asset === 'stETH' || asset === 'wstETH')
117
114
  return yield getStETHApy(web3, fromBlock, blockNumber);
@@ -144,7 +141,7 @@ export const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = u
144
141
  console.error(`Failed to fetch APY for ${asset}`);
145
142
  }
146
143
  return '0';
147
- });
144
+ }), { promise: true, maxAge: 2 * 60 * 1000 });
148
145
  export const calculateInterestEarned = (principal, interest, type, apy = false) => {
149
146
  let interval = 1;
150
147
  if (+interest === 0)
@@ -229,6 +229,10 @@ export interface AaveV3AggregatedPositionData {
229
229
  leveragedAsset?: string;
230
230
  leveragedLsdAssetRatio?: string;
231
231
  liquidationPrice?: string;
232
+ minCollRatio?: string;
233
+ collLiquidationRatio?: string;
234
+ healthRatio?: string;
235
+ healthLiquidationRatio?: string;
232
236
  }
233
237
  export interface AaveHelperCommon {
234
238
  usedAssets: any;
@@ -96,6 +96,8 @@ export interface CompoundAggregatedPositionData {
96
96
  minRatio: string;
97
97
  debtTooLow: boolean;
98
98
  minDebt: string;
99
+ minCollRatio: string;
100
+ collLiquidationRatio: string;
99
101
  }
100
102
  export interface CompoundPositionData extends MMPositionData {
101
103
  ratio: string;
@@ -146,4 +146,6 @@ export interface EulerV2AggregatedPositionData {
146
146
  liquidationPrice?: string;
147
147
  minRatio: string;
148
148
  minDebt: string;
149
+ minCollRatio: string;
150
+ collLiquidationRatio: string;
149
151
  }
@@ -240,6 +240,8 @@ export interface FluidAggregatedVaultData {
240
240
  leveragedAsset?: string;
241
241
  liquidationPrice?: string;
242
242
  leveragedLsdAssetRatio?: string;
243
+ minCollRatio?: string;
244
+ collLiquidationRatio?: string;
243
245
  }
244
246
  export interface BaseFluidVaultData {
245
247
  owner: string;
@@ -122,6 +122,8 @@ export interface MorphoBlueAggregatedPositionData {
122
122
  leveragedAsset?: string;
123
123
  leveragedLsdAssetRatio?: string;
124
124
  liquidationPrice?: string;
125
+ minCollRatio?: string;
126
+ collLiquidationRatio?: string;
125
127
  }
126
128
  export interface MorphoBluePositionData {
127
129
  usedAssets: MMUsedAssets;
@@ -97,6 +97,8 @@ export interface SparkAggregatedPositionData {
97
97
  leveragedAsset?: string;
98
98
  leveragedLsdAssetRatio?: string;
99
99
  liquidationPrice?: string;
100
+ minCollRatio: string;
101
+ collLiquidationRatio: string;
100
102
  }
101
103
  export interface SparkPositionData extends MMPositionData {
102
104
  ratio: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "1.0.3-dev",
3
+ "version": "1.0.4",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -27,8 +27,10 @@
27
27
  "@ethersproject/bignumber": "^5.7.0",
28
28
  "@morpho-org/morpho-aave-v3-sdk": "^1.5.3",
29
29
  "@types/lodash": "^4.17.15",
30
+ "@types/memoizee": "^0.4.12",
30
31
  "decimal.js": "^10.4.3",
31
- "lodash": "^4.17.21"
32
+ "lodash": "^4.17.21",
33
+ "memoizee": "^0.4.17"
32
34
  },
33
35
  "devDependencies": {
34
36
  "@defisaver/eslint-config": "^1.0.1",
@@ -1,6 +1,7 @@
1
- import Web3 from 'web3';
2
- import Dec from 'decimal.js';
3
1
  import { assetAmountInEth, assetAmountInWei, getAssetInfo } from '@defisaver/tokens';
2
+ import Dec from 'decimal.js';
3
+ import Web3 from 'web3';
4
+ import { getAssetsBalances } from '../assets';
4
5
  import {
5
6
  AaveIncentiveDataProviderV3Contract,
6
7
  AaveV3ViewContract,
@@ -9,9 +10,14 @@ import {
9
10
  getConfigContractAddress,
10
11
  GhoTokenContract,
11
12
  } from '../contracts';
13
+ import { aaveAnyGetAggregatedPositionData, aaveV3IsInIsolationMode, aaveV3IsInSiloedMode } from '../helpers/aaveHelpers';
14
+ import { AAVE_V3 } from '../markets/aave';
15
+ import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
16
+ import { multicall } from '../multicall';
12
17
  import {
13
18
  addToObjectIf, ethToWeth, getAbiItem, isEnabledOnBitmap, isLayer2Network, wethToEth, wethToEthByAddress,
14
19
  } from '../services/utils';
20
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
15
21
  import {
16
22
  AaveMarketInfo,
17
23
  AaveV3AssetData,
@@ -21,7 +27,6 @@ import {
21
27
  AaveV3PositionData,
22
28
  AaveV3UsedAsset,
23
29
  AaveV3UsedAssets,
24
- AaveVersions,
25
30
  EModeCategoriesData,
26
31
  EModeCategoryData,
27
32
  EModeCategoryDataMapping,
@@ -29,13 +34,7 @@ import {
29
34
  import {
30
35
  Blockish, EthAddress, NetworkNumber, PositionBalances,
31
36
  } from '../types/common';
32
- import { getStakingApy, STAKING_ASSETS } from '../staking';
33
- import { multicall } from '../multicall';
34
37
  import { IUiIncentiveDataProviderV3 } from '../types/contracts/generated/AaveUiIncentiveDataProviderV3';
35
- import { getAssetsBalances } from '../assets';
36
- import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
37
- import { aaveAnyGetAggregatedPositionData, aaveV3IsInIsolationMode, aaveV3IsInSiloedMode } from '../helpers/aaveHelpers';
38
- import { AAVE_V3 } from '../markets/aave';
39
38
 
40
39
  export const test = (web3: Web3, network: NetworkNumber) => {
41
40
  const contract = AaveV3ViewContract(web3, 1);
@@ -148,6 +148,12 @@ export const aaveAnyGetAggregatedPositionData = ({
148
148
  }
149
149
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
150
150
  }
151
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
152
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
153
+ payload.healthRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqPercent).div(payload.borrowedUsd).div(100)
154
+ .toString();
155
+ payload.healthLiquidationRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqRatio).div(payload.borrowLimitUsd)
156
+ .toString();
151
157
  return payload;
152
158
  };
153
159
 
@@ -162,6 +162,8 @@ export const getCompoundV3AggregatedData = ({
162
162
  }
163
163
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
164
164
  }
165
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
166
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
165
167
 
166
168
  // TO DO: handle strategies
167
169
  /* const subscribedStrategies = rest.compoundStrategies
@@ -147,6 +147,8 @@ export const getEulerV2AggregatedData = ({
147
147
  }
148
148
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
149
149
  }
150
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
151
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
150
152
  return payload;
151
153
  };
152
154
 
@@ -50,5 +50,8 @@ export const getFluidAggregatedData = ({
50
50
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
51
51
  }
52
52
 
53
+ payload.minCollRatio = new Dec(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
54
+ payload.collLiquidationRatio = new Dec(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
55
+
53
56
  return payload;
54
57
  };
@@ -64,6 +64,8 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
64
64
  }
65
65
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
66
66
  }
67
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
68
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
67
69
 
68
70
  return payload;
69
71
  };
@@ -110,6 +110,8 @@ export const sparkGetAggregatedPositionData = ({
110
110
  }
111
111
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
112
112
  }
113
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
114
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
113
115
  return payload;
114
116
  };
115
117
 
@@ -30,7 +30,7 @@ export const v3USDCeCollAssets = {
30
30
  } as const;
31
31
 
32
32
  export const v3ETHCollAssetsEth = ['cbETH', 'wstETH', 'rETH', 'rsETH', 'weETH', 'osETH', 'WBTC', 'ezETH', 'cbBTC', 'rswETH', 'tBTC', 'ETHx'];
33
- export const v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC'];
33
+ export const v3ETHCollAssetsBase = ['cbETH', 'ezETH', 'wstETH', 'USDC', 'weETH', 'wrsETH', 'cbBTC', 'wsuperOETHb'];
34
34
  export const v3ETHCollAssetsArb = ['weETH', 'rETH', 'wstETH', 'WBTC', 'rsETH', 'ezETH', 'USDC', 'USDT'];
35
35
  export const v3ETHCollAssetsOpt = ['rETH', 'wstETH', 'WBTC', 'ezETH', 'USDC', 'USDT', 'weETH', 'wrsETH'];
36
36
 
@@ -1,6 +1,6 @@
1
1
  import { NetworkNumber } from '../../types/common';
2
2
 
3
- export const sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS'];
3
+ export const sparkAssetsDefaultMarketEth = ['DAI', 'sDAI', 'USDC', 'ETH', 'wstETH', 'WBTC', 'GNO', 'rETH', 'USDT', 'weETH', 'cbBTC', 'sUSDS', 'USDS', 'LBTC', 'tBTC', 'ezETH', 'rsETH'];
4
4
 
5
5
  // @dev Keep assets in array, do not assign directly, so we can parse it and edit it programmatically with `scripts/updateMarkets`
6
6
  export const sparkAssetsDefaultMarket = {
@@ -1,5 +1,6 @@
1
1
  import Dec from 'decimal.js';
2
2
  import Web3 from 'web3';
3
+ import memoize from 'memoizee';
3
4
  import {
4
5
  CbEthContract, LidoContract, PotContract, REthContract, wstETHContract,
5
6
  } from '../contracts';
@@ -105,16 +106,12 @@ const getApyFromDfsApi = async (asset: string) => {
105
106
  const res = await fetch(`https://fe.defisaver.com/api/staking/apy?asset=${asset}`);
106
107
  if (!res.ok) throw new Error(`Failed to fetch APY for ${asset}`);
107
108
  const data = await res.json();
108
- // if our server returns apr, transform it into apy
109
- if (['weETH'].includes(asset)) {
110
- return aprToApy(data.apy);
111
- }
112
109
  return String(data.apy);
113
110
  };
114
111
 
115
112
  export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
116
113
 
117
- export const getStakingApy = async (asset: string, web3: Web3, blockNumber: 'latest' | number = 'latest', fromBlock: number | undefined = undefined) => {
114
+ export const getStakingApy = memoize(async (asset: string, web3: Web3, blockNumber: 'latest' | number = 'latest', fromBlock: number | undefined = undefined) => {
118
115
  try {
119
116
  if (asset === 'stETH' || asset === 'wstETH') return await getStETHApy(web3, fromBlock, blockNumber);
120
117
  if (asset === 'cbETH') return await getCbETHApy(web3, blockNumber);
@@ -133,7 +130,7 @@ export const getStakingApy = async (asset: string, web3: Web3, blockNumber: 'lat
133
130
  console.error(`Failed to fetch APY for ${asset}`);
134
131
  }
135
132
  return '0';
136
- };
133
+ }, { promise: true, maxAge: 2 * 60 * 1000 });
137
134
 
138
135
  export const calculateInterestEarned = (principal: string, interest: string, type: string, apy = false) => {
139
136
  let interval = 1;
package/src/types/aave.ts CHANGED
@@ -252,6 +252,10 @@ export interface AaveV3AggregatedPositionData {
252
252
  leveragedAsset?: string,
253
253
  leveragedLsdAssetRatio?: string,
254
254
  liquidationPrice?: string,
255
+ minCollRatio?: string,
256
+ collLiquidationRatio?: string,
257
+ healthRatio?: string,
258
+ healthLiquidationRatio?: string,
255
259
  }
256
260
 
257
261
  export interface AaveHelperCommon {
@@ -110,6 +110,8 @@ export interface CompoundAggregatedPositionData {
110
110
  minRatio: string,
111
111
  debtTooLow: boolean,
112
112
  minDebt: string,
113
+ minCollRatio: string,
114
+ collLiquidationRatio: string,
113
115
  }
114
116
 
115
117
  export interface CompoundPositionData extends MMPositionData {
@@ -169,4 +169,6 @@ export interface EulerV2AggregatedPositionData {
169
169
  liquidationPrice?: string,
170
170
  minRatio: string,
171
171
  minDebt: string,
172
+ minCollRatio: string,
173
+ collLiquidationRatio: string,
172
174
  }
@@ -253,6 +253,8 @@ export interface FluidAggregatedVaultData {
253
253
  leveragedAsset?: string,
254
254
  liquidationPrice?: string,
255
255
  leveragedLsdAssetRatio?: string,
256
+ minCollRatio?: string,
257
+ collLiquidationRatio?: string,
256
258
  }
257
259
 
258
260
  export interface BaseFluidVaultData {
@@ -136,6 +136,8 @@ export interface MorphoBlueAggregatedPositionData {
136
136
  leveragedAsset?: string,
137
137
  leveragedLsdAssetRatio?: string,
138
138
  liquidationPrice?: string,
139
+ minCollRatio?: string,
140
+ collLiquidationRatio?: string,
139
141
  }
140
142
 
141
143
  export interface MorphoBluePositionData {
@@ -109,6 +109,8 @@ export interface SparkAggregatedPositionData {
109
109
  leveragedAsset?: string,
110
110
  leveragedLsdAssetRatio?: string,
111
111
  liquidationPrice?: string,
112
+ minCollRatio: string,
113
+ collLiquidationRatio: string,
112
114
  }
113
115
 
114
116
  export interface SparkPositionData extends MMPositionData {