@defisaver/positions-sdk 2.1.160-morpho-stakehouse-dev → 2.1.160-shifter-v2-dev

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 (133) hide show
  1. package/cjs/aaveV2/index.js +2 -0
  2. package/cjs/curveUsd/index.d.ts +5 -2
  3. package/cjs/curveUsd/index.js +30 -15
  4. package/cjs/fluid/index.d.ts +5 -0
  5. package/cjs/fluid/index.js +36 -1
  6. package/cjs/helpers/aaveHelpers/index.js +3 -0
  7. package/cjs/helpers/aaveV4Helpers/index.js +1 -0
  8. package/cjs/helpers/compoundHelpers/index.js +2 -0
  9. package/cjs/helpers/curveUsdHelpers/index.d.ts +3 -1
  10. package/cjs/helpers/curveUsdHelpers/index.js +16 -2
  11. package/cjs/helpers/fluidHelpers/index.js +1 -0
  12. package/cjs/helpers/liquityV2Helpers/index.js +1 -0
  13. package/cjs/helpers/llamaLendHelpers/index.js +2 -0
  14. package/cjs/helpers/makerHelpers/index.d.ts +1 -1
  15. package/cjs/helpers/makerHelpers/index.js +2 -2
  16. package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
  17. package/cjs/helpers/morphoMidnightHelpers/index.js +2 -0
  18. package/cjs/helpers/sparkHelpers/index.js +1 -0
  19. package/cjs/liquity/index.js +16 -2
  20. package/cjs/maker/index.d.ts +7 -2
  21. package/cjs/maker/index.js +45 -12
  22. package/cjs/markets/index.d.ts +1 -0
  23. package/cjs/markets/index.js +3 -1
  24. package/cjs/markets/maker/index.d.ts +1 -0
  25. package/cjs/markets/maker/index.js +13 -0
  26. package/cjs/portfolio/index.d.ts +5 -1
  27. package/cjs/portfolio/index.js +274 -2
  28. package/cjs/savings/index.js +2 -5
  29. package/cjs/savings/morphoVaults/index.d.ts +1 -1
  30. package/cjs/savings/morphoVaults/index.js +18 -56
  31. package/cjs/savings/morphoVaults/options.d.ts +0 -2
  32. package/cjs/savings/morphoVaults/options.js +1 -61
  33. package/cjs/staking/staking.d.ts +20 -0
  34. package/cjs/staking/staking.js +19 -1
  35. package/cjs/types/aave.d.ts +2 -0
  36. package/cjs/types/aaveV4.d.ts +1 -0
  37. package/cjs/types/compound.d.ts +2 -0
  38. package/cjs/types/curveUsd.d.ts +6 -0
  39. package/cjs/types/fluid.d.ts +1 -0
  40. package/cjs/types/liquity.d.ts +4 -0
  41. package/cjs/types/liquityV2.d.ts +2 -0
  42. package/cjs/types/maker.d.ts +4 -0
  43. package/cjs/types/morphoBlue.d.ts +2 -0
  44. package/cjs/types/morphoMidnight.d.ts +1 -0
  45. package/cjs/types/portfolio.d.ts +26 -10
  46. package/cjs/types/savings/morphoVaults.d.ts +2 -10
  47. package/cjs/types/savings/morphoVaults.js +1 -9
  48. package/cjs/types/spark.d.ts +2 -0
  49. package/esm/aaveV2/index.js +2 -0
  50. package/esm/curveUsd/index.d.ts +5 -2
  51. package/esm/curveUsd/index.js +30 -15
  52. package/esm/fluid/index.d.ts +5 -0
  53. package/esm/fluid/index.js +33 -0
  54. package/esm/helpers/aaveHelpers/index.js +3 -0
  55. package/esm/helpers/aaveV4Helpers/index.js +1 -0
  56. package/esm/helpers/compoundHelpers/index.js +2 -0
  57. package/esm/helpers/curveUsdHelpers/index.d.ts +3 -1
  58. package/esm/helpers/curveUsdHelpers/index.js +16 -2
  59. package/esm/helpers/fluidHelpers/index.js +1 -0
  60. package/esm/helpers/liquityV2Helpers/index.js +1 -0
  61. package/esm/helpers/llamaLendHelpers/index.js +2 -0
  62. package/esm/helpers/makerHelpers/index.d.ts +1 -1
  63. package/esm/helpers/makerHelpers/index.js +2 -2
  64. package/esm/helpers/morphoBlueHelpers/index.js +2 -0
  65. package/esm/helpers/morphoMidnightHelpers/index.js +2 -0
  66. package/esm/helpers/sparkHelpers/index.js +1 -0
  67. package/esm/liquity/index.js +16 -2
  68. package/esm/maker/index.d.ts +7 -2
  69. package/esm/maker/index.js +44 -13
  70. package/esm/markets/index.d.ts +1 -0
  71. package/esm/markets/index.js +1 -0
  72. package/esm/markets/maker/index.d.ts +1 -0
  73. package/esm/markets/maker/index.js +10 -0
  74. package/esm/portfolio/index.d.ts +5 -1
  75. package/esm/portfolio/index.js +276 -5
  76. package/esm/savings/index.js +2 -5
  77. package/esm/savings/morphoVaults/index.d.ts +1 -1
  78. package/esm/savings/morphoVaults/index.js +19 -57
  79. package/esm/savings/morphoVaults/options.d.ts +0 -2
  80. package/esm/savings/morphoVaults/options.js +1 -61
  81. package/esm/staking/staking.d.ts +20 -0
  82. package/esm/staking/staking.js +17 -0
  83. package/esm/types/aave.d.ts +2 -0
  84. package/esm/types/aaveV4.d.ts +1 -0
  85. package/esm/types/compound.d.ts +2 -0
  86. package/esm/types/curveUsd.d.ts +6 -0
  87. package/esm/types/fluid.d.ts +1 -0
  88. package/esm/types/liquity.d.ts +4 -0
  89. package/esm/types/liquityV2.d.ts +2 -0
  90. package/esm/types/maker.d.ts +4 -0
  91. package/esm/types/morphoBlue.d.ts +2 -0
  92. package/esm/types/morphoMidnight.d.ts +1 -0
  93. package/esm/types/portfolio.d.ts +26 -10
  94. package/esm/types/savings/morphoVaults.d.ts +2 -10
  95. package/esm/types/savings/morphoVaults.js +0 -8
  96. package/esm/types/spark.d.ts +2 -0
  97. package/package.json +1 -1
  98. package/src/aaveV2/index.ts +2 -0
  99. package/src/curveUsd/index.ts +33 -16
  100. package/src/fluid/index.ts +40 -0
  101. package/src/helpers/aaveHelpers/index.ts +3 -0
  102. package/src/helpers/aaveV4Helpers/index.ts +1 -0
  103. package/src/helpers/compoundHelpers/index.ts +2 -0
  104. package/src/helpers/curveUsdHelpers/index.ts +23 -2
  105. package/src/helpers/fluidHelpers/index.ts +1 -0
  106. package/src/helpers/liquityV2Helpers/index.ts +1 -0
  107. package/src/helpers/llamaLendHelpers/index.ts +2 -0
  108. package/src/helpers/makerHelpers/index.ts +2 -1
  109. package/src/helpers/morphoBlueHelpers/index.ts +2 -0
  110. package/src/helpers/morphoMidnightHelpers/index.ts +2 -0
  111. package/src/helpers/sparkHelpers/index.ts +1 -0
  112. package/src/liquity/index.ts +17 -2
  113. package/src/maker/index.ts +77 -29
  114. package/src/markets/index.ts +2 -1
  115. package/src/markets/maker/index.ts +10 -0
  116. package/src/portfolio/index.ts +259 -4
  117. package/src/savings/index.ts +2 -5
  118. package/src/savings/morphoVaults/index.ts +21 -73
  119. package/src/savings/morphoVaults/options.ts +1 -67
  120. package/src/staking/staking.ts +28 -0
  121. package/src/types/aave.ts +3 -0
  122. package/src/types/aaveV4.ts +1 -0
  123. package/src/types/compound.ts +2 -0
  124. package/src/types/curveUsd.ts +7 -0
  125. package/src/types/fluid.ts +1 -0
  126. package/src/types/liquity.ts +6 -0
  127. package/src/types/liquityV2.ts +2 -0
  128. package/src/types/maker.ts +6 -0
  129. package/src/types/morphoBlue.ts +2 -0
  130. package/src/types/morphoMidnight.ts +1 -0
  131. package/src/types/portfolio.ts +31 -12
  132. package/src/types/savings/morphoVaults.ts +1 -11
  133. package/src/types/spark.ts +2 -0
@@ -1,11 +1,9 @@
1
- import { MorphoVaultType, MorphoVaultVersion, NetworkNumber, } from '../../types';
1
+ import { MorphoVaultType } from '../../types';
2
2
  export const MORPHO_VAULT_FLAGSHIP_ETH = {
3
3
  type: MorphoVaultType.MorphoVaultFlagshipEth,
4
4
  name: 'Flagship ETH',
5
5
  address: '0x38989BBA00BDF8181F4082995b3DEAe96163aC5D',
6
6
  asset: 'WETH',
7
- network: NetworkNumber.Eth,
8
- version: MorphoVaultVersion.V1,
9
7
  deploymentBlock: 18927491,
10
8
  isLegacy: true,
11
9
  };
@@ -14,8 +12,6 @@ export const MORPHO_VAULT_GAUNTLET_USDC_CORE = {
14
12
  name: 'Gauntlet USDC Core',
15
13
  address: '0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458',
16
14
  asset: 'USDC',
17
- network: NetworkNumber.Eth,
18
- version: MorphoVaultVersion.V1,
19
15
  deploymentBlock: 19777569,
20
16
  isLegacy: true,
21
17
  };
@@ -24,8 +20,6 @@ export const MORPHO_VAULT_GAUNTLET_USDC_PRIME = {
24
20
  name: 'Gauntlet USDC Prime',
25
21
  address: '0xdd0f28e19C1780eb6396170735D45153D261490d',
26
22
  asset: 'USDC',
27
- network: NetworkNumber.Eth,
28
- version: MorphoVaultVersion.V1,
29
23
  deploymentBlock: 19777569,
30
24
  isLegacy: true,
31
25
  };
@@ -34,8 +28,6 @@ export const MORPHO_VAULT_RE7_WETH = {
34
28
  name: 'RE7 WETH',
35
29
  address: '0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0',
36
30
  asset: 'WETH',
37
- network: NetworkNumber.Eth,
38
- version: MorphoVaultVersion.V1,
39
31
  deploymentBlock: 19121118,
40
32
  isLegacy: true,
41
33
  };
@@ -44,8 +36,6 @@ export const MORPHO_VAULT_GAUNTLET_WETH_CORE = {
44
36
  name: 'Gauntlet WETH Core',
45
37
  address: '0x4881Ef0BF6d2365D3dd6499ccd7532bcdBCE0658',
46
38
  asset: 'WETH',
47
- network: NetworkNumber.Eth,
48
- version: MorphoVaultVersion.V1,
49
39
  deploymentBlock: 19541126,
50
40
  isLegacy: true,
51
41
  };
@@ -54,8 +44,6 @@ export const MORPHO_VAULT_GAUNTLET_WETH_PRIME = {
54
44
  name: 'Gauntlet WETH Prime',
55
45
  address: '0x2371e134e3455e0593363cBF89d3b6cf53740618',
56
46
  asset: 'WETH',
57
- network: NetworkNumber.Eth,
58
- version: MorphoVaultVersion.V1,
59
47
  deploymentBlock: 19372149,
60
48
  isLegacy: true,
61
49
  };
@@ -64,8 +52,6 @@ export const MORPHO_VAULT_BOOSTED_USDC = {
64
52
  name: 'Boosted USDC',
65
53
  address: '0xd63070114470f685b75B74D60EEc7c1113d33a3D',
66
54
  asset: 'USDC',
67
- network: NetworkNumber.Eth,
68
- version: MorphoVaultVersion.V1,
69
55
  deploymentBlock: 20377233,
70
56
  isLegacy: true,
71
57
  };
@@ -74,8 +60,6 @@ export const MORPHO_VAULT_FLAGSHIP_USDT = {
74
60
  name: 'Flagship USDT',
75
61
  address: '0x2C25f6C25770fFEC5959D34B94Bf898865e5D6b1',
76
62
  asset: 'USDT',
77
- network: NetworkNumber.Eth,
78
- version: MorphoVaultVersion.V1,
79
63
  deploymentBlock: 19127039,
80
64
  isLegacy: true,
81
65
  };
@@ -84,8 +68,6 @@ export const MORPHO_VAULT_GAUNTLET_USDA_CORE = {
84
68
  name: 'Gauntlet USDA Core',
85
69
  address: '0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6',
86
70
  asset: 'USDA',
87
- network: NetworkNumber.Eth,
88
- version: MorphoVaultVersion.V1,
89
71
  deploymentBlock: 19633608,
90
72
  isLegacy: true,
91
73
  };
@@ -94,8 +76,6 @@ export const MORPHO_VAULT_GAUNTLET_USDT_PRIME = {
94
76
  name: 'Gauntlet USDT Prime',
95
77
  address: '0x8CB3649114051cA5119141a34C200D65dc0Faa73',
96
78
  asset: 'USDT',
97
- network: NetworkNumber.Eth,
98
- version: MorphoVaultVersion.V1,
99
79
  deploymentBlock: 19486541,
100
80
  isLegacy: true,
101
81
  };
@@ -104,8 +84,6 @@ export const MORPHO_VAULT_GAUNTLET_RESOLV_USDC = {
104
84
  name: 'Gauntlet Resolv USDC',
105
85
  address: '0x132E6C9C33A62D7727cd359b1f51e5B566E485Eb',
106
86
  asset: 'USDC',
107
- network: NetworkNumber.Eth,
108
- version: MorphoVaultVersion.V1,
109
87
  deploymentBlock: 21487882,
110
88
  isLegacy: true,
111
89
  };
@@ -115,8 +93,6 @@ export const MORPHO_VAULT_STEAKHOUSE_USDT = {
115
93
  name: 'Steakhouse USDT',
116
94
  address: '0xbEef047a543E45807105E51A8BBEFCc5950fcfBa',
117
95
  asset: 'USDT',
118
- network: NetworkNumber.Eth,
119
- version: MorphoVaultVersion.V1,
120
96
  deploymentBlock: 19043398,
121
97
  isLegacy: false,
122
98
  };
@@ -125,8 +101,6 @@ export const MORPHO_VAULT_STEAKHOUSE_USDC = {
125
101
  name: 'Steakhouse USDC',
126
102
  address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
127
103
  asset: 'USDC',
128
- network: NetworkNumber.Eth,
129
- version: MorphoVaultVersion.V1,
130
104
  deploymentBlock: 18928285,
131
105
  isLegacy: false,
132
106
  };
@@ -135,8 +109,6 @@ export const MORPHO_VAULT_STEAKHOUSE_ETH = {
135
109
  name: 'Steakhouse WETH',
136
110
  address: '0xBEEf050ecd6a16c4e7bfFbB52Ebba7846C4b8cD4',
137
111
  asset: 'WETH',
138
- network: NetworkNumber.Eth,
139
- version: MorphoVaultVersion.V1,
140
112
  deploymentBlock: 19380443,
141
113
  isLegacy: false,
142
114
  };
@@ -145,8 +117,6 @@ export const MORPHO_VAULT_STEAKHOUSE_PYUSD = {
145
117
  name: 'Steakhouse PYUSD',
146
118
  address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
147
119
  asset: 'PYUSD',
148
- network: NetworkNumber.Eth,
149
- version: MorphoVaultVersion.V1,
150
120
  deploymentBlock: 19043398,
151
121
  isLegacy: false,
152
122
  };
@@ -156,8 +126,6 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDT = {
156
126
  name: 'Smokehouse USDT',
157
127
  address: '0xA0804346780b4c2e3bE118ac957D1DB82F9d7484',
158
128
  asset: 'USDT',
159
- network: NetworkNumber.Eth,
160
- version: MorphoVaultVersion.V1,
161
129
  deploymentBlock: 21522238,
162
130
  isLegacy: false,
163
131
  };
@@ -166,8 +134,6 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDC = {
166
134
  name: 'Smokehouse USDC',
167
135
  address: '0xBEeFFF209270748ddd194831b3fa287a5386f5bC',
168
136
  asset: 'USDC',
169
- network: NetworkNumber.Eth,
170
- version: MorphoVaultVersion.V1,
171
137
  deploymentBlock: 21337719,
172
138
  isLegacy: false,
173
139
  };
@@ -176,32 +142,9 @@ export const MORPHO_VAULT_SMOKEHOUSE_DAI = {
176
142
  name: 'Smokehouse DAI',
177
143
  address: '0xbeeFfF68CC520D68f82641EFF84330C631E2490E',
178
144
  asset: 'DAI',
179
- network: NetworkNumber.Eth,
180
- version: MorphoVaultVersion.V1,
181
145
  deploymentBlock: 21343808,
182
146
  isLegacy: false,
183
147
  };
184
- // Vault V2
185
- export const MORPHO_VAULT_GAUNTLET_USDG_PREMIUM = {
186
- type: MorphoVaultType.MorphoVaultGauntletUSDGPremium,
187
- name: 'Gauntlet USDG Premium',
188
- address: '0x390c1bb01F3F627144a40617e287d4cE3D5aBCfa',
189
- asset: 'USDG',
190
- network: NetworkNumber.Arb,
191
- version: MorphoVaultVersion.V2,
192
- deploymentBlock: 510799903,
193
- isLegacy: false,
194
- };
195
- export const MORPHO_VAULT_STEAKHOUSE_USDG_PRO = {
196
- type: MorphoVaultType.MorphoVaultSteakhouseUSDGPro,
197
- name: 'Steakhouse USDG Pro',
198
- address: '0xbeeFf72B77e7584a450E887125F25E8D8819016a',
199
- asset: 'USDG',
200
- network: NetworkNumber.Arb,
201
- version: MorphoVaultVersion.V2,
202
- deploymentBlock: 512247107,
203
- isLegacy: false,
204
- };
205
148
  export const MORPHO_VAULTS = {
206
149
  [MorphoVaultType.MorphoVaultFlagshipEth]: MORPHO_VAULT_FLAGSHIP_ETH,
207
150
  [MorphoVaultType.MorphoVaultGauntletUSDCCore]: MORPHO_VAULT_GAUNTLET_USDC_CORE,
@@ -223,8 +166,5 @@ export const MORPHO_VAULTS = {
223
166
  [MorphoVaultType.MorphoVaultSmokehouseUSDT]: MORPHO_VAULT_SMOKEHOUSE_USDT,
224
167
  [MorphoVaultType.MorphoVaultSmokehouseUSDC]: MORPHO_VAULT_SMOKEHOUSE_USDC,
225
168
  [MorphoVaultType.MorphoVaultSmokehouseDAI]: MORPHO_VAULT_SMOKEHOUSE_DAI,
226
- // Vault V2
227
- [MorphoVaultType.MorphoVaultGauntletUSDGPremium]: MORPHO_VAULT_GAUNTLET_USDG_PREMIUM,
228
- [MorphoVaultType.MorphoVaultSteakhouseUSDGPro]: MORPHO_VAULT_STEAKHOUSE_USDG_PRO,
229
169
  };
230
170
  export const getMorphoVault = (type) => MORPHO_VAULTS[type];
@@ -3,6 +3,26 @@ import { MMAssetsData, MMUsedAssets } from '../types/common';
3
3
  export declare const STAKING_ASSETS: string[];
4
4
  export declare const getStakingApy: ((asset: string, network?: number) => Promise<string>) & memoize.Memoized<(asset: string, network?: number) => Promise<string>>;
5
5
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
+ /**
7
+ * Net APY for positions that have a single known borrow rate (and optionally a single supply rate)
8
+ * instead of per-asset `assetsData` to feed into `calculateNetApy` (Maker, crvUSD, Liquity v1).
9
+ * All rates are yearly percentages that are already compounded. `incentives` are extra yields
10
+ * (e.g. the native staking yield of the collateral) applied to their own USD base and summed into `incentiveUsd`.
11
+ */
12
+ export declare const calculateNetApyFromRates: ({ suppliedUsd, borrowedUsd, supplyRate, borrowRate, incentives, }: {
13
+ suppliedUsd: string;
14
+ borrowedUsd: string;
15
+ supplyRate?: string;
16
+ borrowRate?: string;
17
+ incentives?: {
18
+ apy: string;
19
+ amountUsd: string;
20
+ }[];
21
+ }) => {
22
+ netApy: string;
23
+ totalInterestUsd: string;
24
+ incentiveUsd: string;
25
+ };
6
26
  export declare const calculateNetApy: ({ usedAssets, assetsData, optionalData, }: {
7
27
  usedAssets: MMUsedAssets;
8
28
  assetsData: MMAssetsData;
@@ -182,6 +182,23 @@ export const calculateInterestEarned = (principal, interest, type, apy = false)
182
182
  }
183
183
  return (+principal * (Math.pow(((1 + (+interest / 100) / BLOCKS_IN_A_YEAR)), (BLOCKS_IN_A_YEAR * interval)))) - +principal; // eslint-disable-line
184
184
  };
185
+ /**
186
+ * Net APY for positions that have a single known borrow rate (and optionally a single supply rate)
187
+ * instead of per-asset `assetsData` to feed into `calculateNetApy` (Maker, crvUSD, Liquity v1).
188
+ * All rates are yearly percentages that are already compounded. `incentives` are extra yields
189
+ * (e.g. the native staking yield of the collateral) applied to their own USD base and summed into `incentiveUsd`.
190
+ */
191
+ export const calculateNetApyFromRates = ({ suppliedUsd, borrowedUsd, supplyRate = '0', borrowRate = '0', incentives = [], }) => {
192
+ const supplyInterest = new Dec(calculateInterestEarned(suppliedUsd, supplyRate, 'year', true));
193
+ const borrowInterest = new Dec(calculateInterestEarned(borrowedUsd, borrowRate, 'year', true));
194
+ const incentiveUsd = incentives
195
+ .reduce((acc, { apy, amountUsd }) => acc.add(calculateInterestEarned(amountUsd, apy, 'year', true)), new Dec(0))
196
+ .toString();
197
+ const totalInterestUsd = supplyInterest.sub(borrowInterest).add(incentiveUsd).toString();
198
+ const balance = new Dec(suppliedUsd).sub(borrowedUsd);
199
+ const netApy = balance.isZero() ? '0' : new Dec(totalInterestUsd).div(balance).times(100).toString();
200
+ return { netApy, totalInterestUsd, incentiveUsd };
201
+ };
185
202
  export const calculateNetApy = ({ usedAssets, assetsData, optionalData, }) => {
186
203
  const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
187
204
  const acc = Object.assign({}, _acc);
@@ -126,6 +126,7 @@ export interface AavePositionData extends MMPositionData {
126
126
  minRatio: string;
127
127
  collRatio: string;
128
128
  safetyRatioWithLtvZeroFallback?: string;
129
+ safetyRatio?: string;
129
130
  suppliedUsd: string;
130
131
  borrowedUsd: string;
131
132
  borrowLimitUsd: string;
@@ -159,6 +160,7 @@ export interface AaveV3AggregatedPositionData {
159
160
  collRatio: string;
160
161
  borrowLimitWithLtvZeroFallbackUsd: string;
161
162
  safetyRatioWithLtvZeroFallback: string;
163
+ safetyRatio: string;
162
164
  netApy: string;
163
165
  incentiveUsd: string;
164
166
  totalInterestUsd: string;
@@ -169,6 +169,7 @@ export interface AaveV4AggregatedPositionData {
169
169
  leftToBorrowUsd: string;
170
170
  ratio: string;
171
171
  collRatio: string;
172
+ safetyRatio: string;
172
173
  liqRatio: string;
173
174
  liqPercent: string;
174
175
  leveragedType: LeverageType;
@@ -96,6 +96,7 @@ export interface CompoundAggregatedPositionData {
96
96
  leftToBorrowUsd: string;
97
97
  ratio: string;
98
98
  collRatio: string;
99
+ safetyRatio: string;
99
100
  netApy: string;
100
101
  incentiveUsd: string;
101
102
  totalInterestUsd: string;
@@ -115,6 +116,7 @@ export interface CompoundAggregatedPositionData {
115
116
  export interface CompoundPositionData extends MMPositionData {
116
117
  ratio: string;
117
118
  minRatio: string;
119
+ safetyRatio?: string;
118
120
  suppliedUsd: string;
119
121
  borrowedUsd: string;
120
122
  borrowLimitUsd: string;
@@ -73,6 +73,9 @@ export interface CrvUSDAggregatedPositionData {
73
73
  collFactor: string;
74
74
  leveragedType: LeverageType;
75
75
  exposure: string;
76
+ netApy: string;
77
+ totalInterestUsd: string;
78
+ incentiveUsd: string;
76
79
  leveragedAsset?: string;
77
80
  liquidationPrice?: string;
78
81
  }
@@ -113,4 +116,7 @@ export interface CrvUSDUserData {
113
116
  collateralPrice: string;
114
117
  collRatio: string;
115
118
  exposure: string;
119
+ netApy: string;
120
+ totalInterestUsd: string;
121
+ incentiveUsd: string;
116
122
  }
@@ -323,6 +323,7 @@ export interface FluidAggregatedVaultData {
323
323
  merklBorrowIncentives: IncentiveData[];
324
324
  ratio: string;
325
325
  collRatio: string;
326
+ safetyRatio: string;
326
327
  minRatio: string;
327
328
  totalInterestUsd: string;
328
329
  leveragedType?: LeverageType;
@@ -24,7 +24,11 @@ export interface LiquityTroveInfo {
24
24
  totalETH: string;
25
25
  totalLUSD: string;
26
26
  minCollateralRatio: number;
27
+ safetyRatio: string;
27
28
  priceForRecovery: string;
28
29
  debtInFront: string;
29
30
  exposure: string;
31
+ netApy: string;
32
+ totalInterestUsd: string;
33
+ incentiveUsd: string;
30
34
  }
@@ -94,6 +94,7 @@ export interface LiquityV2AggregatedTroveData {
94
94
  liquidationPrice: string;
95
95
  ratio: string;
96
96
  collRatio: string;
97
+ safetyRatio: string;
97
98
  exposure: string;
98
99
  }
99
100
  export interface LiquityV2TroveData {
@@ -101,6 +102,7 @@ export interface LiquityV2TroveData {
101
102
  troveId: string;
102
103
  ratio: string;
103
104
  collRatio: string;
105
+ safetyRatio?: string;
104
106
  liqRatio: string;
105
107
  borrowLimitRatio: string;
106
108
  interestRate: string;
@@ -43,6 +43,7 @@ export interface CdpData {
43
43
  debtAssetMarketPrice: string;
44
44
  liquidationPrice: string;
45
45
  ratio: string;
46
+ safetyRatio: string;
46
47
  liqRatio: string;
47
48
  liqPercent: number;
48
49
  assetPrice: string;
@@ -58,4 +59,7 @@ export interface CdpData {
58
59
  liquidationFee: string;
59
60
  lastUpdated: number;
60
61
  exposure: string;
62
+ netApy: string;
63
+ totalInterestUsd: string;
64
+ incentiveUsd: string;
61
65
  }
@@ -185,6 +185,7 @@ export interface MorphoBlueAggregatedPositionData {
185
185
  totalInterestUsd: string;
186
186
  ltv: string;
187
187
  ratio: string;
188
+ safetyRatio: string;
188
189
  leveragedType: LeverageType;
189
190
  leveragedAsset?: string;
190
191
  currentVolatilePairRatio?: string;
@@ -207,6 +208,7 @@ export interface MorphoBluePositionData {
207
208
  totalInterestUsd: string;
208
209
  ltv: string;
209
210
  ratio: string;
211
+ safetyRatio?: string;
210
212
  leveragedType: LeverageType;
211
213
  leveragedAsset?: string;
212
214
  currentVolatilePairRatio?: string;
@@ -170,6 +170,7 @@ export interface MorphoMidnightAggregatedPositionData {
170
170
  ltv: string;
171
171
  ratio: string;
172
172
  healthRatio: string;
173
+ safetyRatio: string;
173
174
  leveragedType: LeverageType;
174
175
  leveragedAsset?: string;
175
176
  currentVolatilePairRatio?: string;
@@ -1,15 +1,16 @@
1
- import { AaveV2PositionData, AaveV3PositionData, AaveVersions } from './aave';
2
- import { AaveV4AccountData, AaveV4SpokesType } from './aaveV4';
1
+ import { AaveV2MarketData, AaveV2PositionData, AaveV3MarketData, AaveV3PositionData, AaveVersions } from './aave';
2
+ import { AaveV4AccountData, AaveV4SpokeData, AaveV4SpokesType } from './aaveV4';
3
3
  import { EthAddress } from './common';
4
- import { CompoundV2PositionData, CompoundV3PositionData, CompoundVersions } from './compound';
5
- import { CrvUSDUserData, CrvUSDVersions } from './curveUsd';
6
- import { FluidVaultData } from './fluid';
4
+ import { CompoundV2MarketsData, CompoundV2PositionData, CompoundV3MarketsData, CompoundV3PositionData, CompoundVersions } from './compound';
5
+ import { CrvUSDGlobalMarketData, CrvUSDUserData, CrvUSDVersions } from './curveUsd';
6
+ import { FluidMarketData, FluidVaultData } from './fluid';
7
7
  import { LiquityTroveInfo } from './liquity';
8
- import { LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
9
- import { CdpData } from './maker';
10
- import { MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
11
- import { MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
12
- import { SparkPositionData, SparkVersions } from './spark';
8
+ import { LiquityV2MarketData } from './liquityV2';
9
+ import { LlamaLendGlobalMarketData, LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
10
+ import { CdpData, IlkInfo } from './maker';
11
+ import { MorphoBlueMarketInfo, MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
12
+ import { MorphoMidnightMarketInfo, MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
13
+ import { SparkMarketsData, SparkPositionData, SparkVersions } from './spark';
13
14
  export interface PortfolioProtocolData<T> {
14
15
  error: string;
15
16
  data: T | null;
@@ -59,3 +60,18 @@ export interface PortfolioPositionsDataForAddress {
59
60
  export interface PortfolioPositionsData {
60
61
  [key: EthAddress]: PortfolioPositionsDataForAddress;
61
62
  }
63
+ export interface PortfolioMarketsData {
64
+ morphoMarketsData: Record<string, MorphoBlueMarketInfo>;
65
+ morphoMidnightMarketsData: Record<string, MorphoMidnightMarketInfo>;
66
+ compoundV3MarketsData: Record<string, CompoundV3MarketsData>;
67
+ sparkMarketsData: Record<string, SparkMarketsData>;
68
+ aaveV3MarketsData: Record<string, AaveV3MarketData>;
69
+ aaveV2MarketsData: Record<string, AaveV2MarketData>;
70
+ compoundV2MarketsData: Record<string, CompoundV2MarketsData>;
71
+ crvUsdMarketsData: Record<string, CrvUSDGlobalMarketData>;
72
+ llamaLendMarketsData: Record<string, LlamaLendGlobalMarketData>;
73
+ liquityV2MarketsData: Record<string, LiquityV2MarketData>;
74
+ aaveV4SpokesData: Record<string, AaveV4SpokeData>;
75
+ fluidMarketsData: Record<string, FluidMarketData>;
76
+ makerMarketsData: Record<string, IlkInfo>;
77
+ }
@@ -1,4 +1,4 @@
1
- import { EthAddress, NetworkNumber } from '../common';
1
+ import { EthAddress } from '../common';
2
2
  export declare enum MorphoVaultType {
3
3
  MorphoVaultFlagshipEth = "morpho_vault_flagship_eth",
4
4
  MorphoVaultGauntletUSDCCore = "morpho_vault_gauntlet_usdc_core",
@@ -17,21 +17,13 @@ export declare enum MorphoVaultType {
17
17
  MorphoVaultSteakhousePYUSD = "morpho_vault_steakhouse_pyusd",
18
18
  MorphoVaultSmokehouseUSDT = "morpho_vault_smokehouse_usdt",
19
19
  MorphoVaultSmokehouseUSDC = "morpho_vault_smokehouse_usdc",
20
- MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai",
21
- MorphoVaultGauntletUSDGPremium = "morpho_vault_gauntlet_usdg_premium",
22
- MorphoVaultSteakhouseUSDGPro = "morpho_vault_steakhouse_usdg_pro"
23
- }
24
- export declare enum MorphoVaultVersion {
25
- V1 = 1,
26
- V2 = 2
20
+ MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai"
27
21
  }
28
22
  export interface MorphoVault {
29
23
  type: MorphoVaultType;
30
24
  name: string;
31
25
  address: EthAddress;
32
26
  asset: string;
33
- network: NetworkNumber;
34
- version: MorphoVaultVersion;
35
27
  deploymentBlock: number;
36
28
  isLegacy: boolean;
37
29
  }
@@ -20,12 +20,4 @@ export var MorphoVaultType;
20
20
  MorphoVaultType["MorphoVaultSmokehouseUSDT"] = "morpho_vault_smokehouse_usdt";
21
21
  MorphoVaultType["MorphoVaultSmokehouseUSDC"] = "morpho_vault_smokehouse_usdc";
22
22
  MorphoVaultType["MorphoVaultSmokehouseDAI"] = "morpho_vault_smokehouse_dai";
23
- // Vault V2
24
- MorphoVaultType["MorphoVaultGauntletUSDGPremium"] = "morpho_vault_gauntlet_usdg_premium";
25
- MorphoVaultType["MorphoVaultSteakhouseUSDGPro"] = "morpho_vault_steakhouse_usdg_pro";
26
23
  })(MorphoVaultType || (MorphoVaultType = {}));
27
- export var MorphoVaultVersion;
28
- (function (MorphoVaultVersion) {
29
- MorphoVaultVersion[MorphoVaultVersion["V1"] = 1] = "V1";
30
- MorphoVaultVersion[MorphoVaultVersion["V2"] = 2] = "V2";
31
- })(MorphoVaultVersion || (MorphoVaultVersion = {}));
@@ -85,6 +85,7 @@ export interface SparkAggregatedPositionData {
85
85
  leftToBorrowUsd: string;
86
86
  ratio: string;
87
87
  collRatio: string;
88
+ safetyRatio: string;
88
89
  netApy: string;
89
90
  incentiveUsd: string;
90
91
  totalInterestUsd: string;
@@ -104,6 +105,7 @@ export interface SparkPositionData extends MMPositionData {
104
105
  ratio: string;
105
106
  minRatio: string;
106
107
  collRatio: string;
108
+ safetyRatio?: string;
107
109
  suppliedUsd: string;
108
110
  borrowedUsd: string;
109
111
  borrowLimitUsd: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.160-morpho-stakehouse-dev",
3
+ "version": "2.1.160-shifter-v2-dev",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -210,6 +210,8 @@ export const _getAaveV2AccountData = async (provider: Client, network: NetworkNu
210
210
  payload.collRatio = payload.borrowedUsd && payload.borrowedUsd !== '0'
211
211
  ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString()
212
212
  : '0';
213
+ // Aave v2 has no LTV-0 fallback (AaveV3View only), so its safety ratio is the plain ratio.
214
+ payload.safetyRatio = payload.ratio;
213
215
 
214
216
  // Calculate borrow limits per asset
215
217
  Object.values(payload.usedAssets).forEach((item) => {
@@ -14,6 +14,13 @@ import { getCrvUsdAggregatedData } from '../helpers/curveUsdHelpers';
14
14
  import { CrvUsdMarkets } from '../markets';
15
15
  import { wethToEth } from '../services/utils';
16
16
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
17
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
18
+
19
+ /** Converts a per-second AMM rate (wei, 18 decimals) into a yearly compounded borrow APY in %. */
20
+ const ammRateToBorrowApy = (rateWei: string) => {
21
+ const exponent = new Dec(assetAmountInEth(rateWei)).mul(365).mul(86400);
22
+ return new Dec(new Dec(2.718281828459).pow(exponent).minus(1)).mul(100).toString();
23
+ };
17
24
 
18
25
  const getAndFormatBands = async (provider: Client, network: NetworkNumber, selectedMarket: CrvUSDMarketData, _minBand: string, _maxBand: string) => {
19
26
  const contract = CrvUSDViewContractViem(provider, network);
@@ -69,15 +76,8 @@ export const _getCurveUsdGlobalData = async (provider: Client, network: NetworkN
69
76
  const totalDebt = assetAmountInEth(data.totalDebt.toString(), debtAsset);
70
77
  const ammPrice = assetAmountInEth(data.ammPrice.toString(), debtAsset);
71
78
 
72
- const rate = assetAmountInEth(data.ammRate.toString());
73
- const futureRate = assetAmountInEth(data.monetaryPolicyRate.toString());
74
-
75
- const exponentRate = new Dec(rate).mul(365).mul(86400);
76
- const exponentFutureRate = new Dec(futureRate).mul(365).mul(86400);
77
- const borrowRate = new Dec(new Dec(2.718281828459).pow(exponentRate).minus(1)).mul(100)
78
- .toString();
79
- const futureBorrowRate = new Dec(new Dec(2.718281828459).pow(exponentFutureRate).minus(1)).mul(100)
80
- .toString();
79
+ const borrowRate = ammRateToBorrowApy(data.ammRate.toString());
80
+ const futureBorrowRate = ammRateToBorrowApy(data.monetaryPolicyRate.toString());
81
81
 
82
82
  const bandsData = await getAndFormatBands(provider, network, selectedMarket, data.minBand.toString(), data.maxBand.toString());
83
83
 
@@ -164,13 +164,22 @@ export const getCrvUsdAccountBalances = async (
164
164
  controllerAddress: EthAddress,
165
165
  ): Promise<PositionBalances> => _getCrvUsdAccountBalances(getViemProvider(provider, network), network, block, addressMapping, address, controllerAddress);
166
166
 
167
- export const _getCurveUsdUserData = async (provider: Client, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string): Promise<CrvUSDUserData> => {
167
+ /**
168
+ * @param borrowRate market borrow APY in % (`CrvUSDGlobalMarketData.borrowRate`); when omitted it is read from the view contract
169
+ */
170
+ export const _getCurveUsdUserData = async (provider: Client, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string, borrowRate?: string): Promise<CrvUSDUserData> => {
168
171
  const contract = CrvUSDViewContractViem(provider, network);
169
-
170
- const data = await contract.read.userData([selectedMarket.controllerAddress, address]);
171
172
  const collAsset = selectedMarket.collAsset;
172
173
  const debtAsset = selectedMarket.baseAsset;
173
174
 
175
+ const [data, collStakingApy, marketBorrowRate] = await Promise.all([
176
+ contract.read.userData([selectedMarket.controllerAddress, address]),
177
+ STAKING_ASSETS.includes(collAsset) ? getStakingApy(collAsset) : Promise.resolve('0'),
178
+ borrowRate !== undefined
179
+ ? Promise.resolve(borrowRate)
180
+ : contract.read.globalData([selectedMarket.controllerAddress]).then((globalData) => ammRateToBorrowApy(globalData.ammRate.toString())),
181
+ ]);
182
+
174
183
  const health = assetAmountInEth(data.health.toString());
175
184
  const healthPercent = new Dec(health).mul(100).toString();
176
185
  const collPrice = assetAmountInEth(data.collateralPrice.toString(), debtAsset);
@@ -202,7 +211,7 @@ export const _getCurveUsdUserData = async (provider: Client, network: NetworkNum
202
211
  isBorrowed: new Dec(debtBorrowed).gt('0'),
203
212
  symbol: 'crvUSD',
204
213
  price: '1',
205
- interestRate: '0',
214
+ interestRate: marketBorrowRate,
206
215
  },
207
216
  } : {};
208
217
 
@@ -232,8 +241,15 @@ export const _getCurveUsdUserData = async (provider: Client, network: NetworkNum
232
241
  numOfBands: data.N.toString(),
233
242
  usedAssets,
234
243
  status,
244
+ borrowRate: marketBorrowRate,
235
245
  ...getCrvUsdAggregatedData({
236
- loanExists: data.loanExists, usedAssets, network: NetworkNumber.Eth, selectedMarket, numOfBands: data.N.toString(),
246
+ loanExists: data.loanExists,
247
+ usedAssets,
248
+ network: NetworkNumber.Eth,
249
+ selectedMarket,
250
+ numOfBands: data.N.toString(),
251
+ borrowRate: marketBorrowRate,
252
+ collStakingApy,
237
253
  }),
238
254
  userBands,
239
255
  };
@@ -245,10 +261,11 @@ export const getCurveUsdUserData = async (
245
261
  address: EthAddress,
246
262
  selectedMarket: CrvUSDMarketData,
247
263
  activeBand: string,
248
- ): Promise<CrvUSDUserData> => _getCurveUsdUserData(getViemProvider(provider, network), network, address, selectedMarket, activeBand);
264
+ borrowRate?: string,
265
+ ): Promise<CrvUSDUserData> => _getCurveUsdUserData(getViemProvider(provider, network), network, address, selectedMarket, activeBand, borrowRate);
249
266
 
250
267
  export const getCurveUsdFullPositionData = async (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData): Promise<CrvUSDUserData> => {
251
268
  const marketData = await getCurveUsdGlobalData(provider, network, selectedMarket);
252
- const positionData = await getCurveUsdUserData(provider, network, address, selectedMarket, marketData.activeBand);
269
+ const positionData = await getCurveUsdUserData(provider, network, address, selectedMarket, marketData.activeBand, marketData.borrowRate);
253
270
  return positionData;
254
271
  };
@@ -1830,3 +1830,43 @@ export const _getUserPositionsPortfolio = async (provider: PublicClient, network
1830
1830
  userData: userData[i],
1831
1831
  })).filter(md => md.marketData !== undefined);
1832
1832
  };
1833
+
1834
+
1835
+ export const _getAllFluidMarketDataPortfolio = async (provider: PublicClient, network: NetworkNumber): Promise<Record<string, FluidMarketData>> => {
1836
+ const versions = getFluidVersionsDataForNetwork(network);
1837
+ if (versions.length === 0) return {};
1838
+
1839
+ const view = FluidViewContractViem(provider, network);
1840
+ const vaultsData = await Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress])));
1841
+
1842
+ const tokens = Array.from(new Set(vaultsData.map((vaultData) => {
1843
+ const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
1844
+ if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.supplyToken1, network).symbol);
1845
+ if (vaultData.borrowToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.borrowToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.borrowToken1, network).symbol);
1846
+ return vaultTokens;
1847
+ }).flat()));
1848
+
1849
+ // ETH and WBTC needed for other tokens prices
1850
+ if (!tokens.includes('ETH')) tokens.push('ETH');
1851
+ if (!tokens.includes('WBTC')) tokens.push('WBTC');
1852
+
1853
+ const [tokenPrices, merklCampaigns] = await Promise.all([
1854
+ getTokensPricesForPortfolio(tokens, provider, network),
1855
+ getFluidMerklCampaigns(network),
1856
+ ]);
1857
+
1858
+ const parsedMarketsData = await Promise.all(vaultsData.map(async (vaultData) => parseMarketData(provider, vaultData, network, tokenPrices)));
1859
+
1860
+ const marketsData: Record<string, FluidMarketData> = {};
1861
+ parsedMarketsData.forEach((marketData, i) => {
1862
+ if (!marketData) return;
1863
+ marketsData[versions[i].value] = attachFluidMerklIncentives(marketData, merklCampaigns);
1864
+ });
1865
+
1866
+ return marketsData;
1867
+ };
1868
+
1869
+ export const getAllFluidMarketDataPortfolio = async (
1870
+ provider: EthereumProvider,
1871
+ network: NetworkNumber,
1872
+ ): Promise<Record<string, FluidMarketData>> => _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network);
@@ -169,6 +169,9 @@ export const aaveAnyGetAggregatedPositionData = ({
169
169
  },
170
170
  );
171
171
  payload.safetyRatioWithLtvZeroFallback = +payload.suppliedUsd ? new Dec(payload.borrowLimitWithLtvZeroFallbackUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
172
+ // Normalised safety ratio (100 = liquidation on every protocol): the automation ratio above, falling back
173
+ // to the regular ratio when the fallback carries its '0' placeholder.
174
+ payload.safetyRatio = +payload.safetyRatioWithLtvZeroFallback ? payload.safetyRatioWithLtvZeroFallback : payload.ratio;
172
175
  payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
173
176
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
174
177
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);