@defisaver/positions-sdk 0.0.201-fluid-dev → 0.0.201-fluid-dev-2

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 (42) hide show
  1. package/cjs/config/contracts.d.ts +11 -5
  2. package/cjs/config/contracts.js +4 -2
  3. package/cjs/fluid/index.d.ts +1 -0
  4. package/cjs/fluid/index.js +65 -12
  5. package/cjs/markets/fluid/index.d.ts +8 -10
  6. package/cjs/markets/fluid/index.js +466 -77
  7. package/cjs/markets/index.d.ts +1 -1
  8. package/cjs/markets/index.js +3 -1
  9. package/cjs/morphoBlue/index.js +1 -2
  10. package/cjs/multicall/index.d.ts +1 -0
  11. package/cjs/multicall/index.js +8 -1
  12. package/cjs/services/utils.d.ts +1 -0
  13. package/cjs/services/utils.js +3 -1
  14. package/cjs/types/contracts/generated/FluidView.d.ts +125 -41
  15. package/cjs/types/fluid.d.ts +16 -1
  16. package/cjs/types/fluid.js +3 -0
  17. package/esm/config/contracts.d.ts +11 -5
  18. package/esm/config/contracts.js +4 -2
  19. package/esm/fluid/index.d.ts +1 -0
  20. package/esm/fluid/index.js +65 -13
  21. package/esm/markets/fluid/index.d.ts +8 -10
  22. package/esm/markets/fluid/index.js +460 -71
  23. package/esm/markets/index.d.ts +1 -1
  24. package/esm/markets/index.js +1 -1
  25. package/esm/morphoBlue/index.js +1 -2
  26. package/esm/multicall/index.d.ts +1 -0
  27. package/esm/multicall/index.js +6 -0
  28. package/esm/services/utils.d.ts +1 -0
  29. package/esm/services/utils.js +1 -0
  30. package/esm/types/contracts/generated/FluidView.d.ts +125 -41
  31. package/esm/types/fluid.d.ts +16 -1
  32. package/esm/types/fluid.js +3 -0
  33. package/package.json +5 -3
  34. package/src/config/contracts.js +4 -2
  35. package/src/fluid/index.ts +69 -12
  36. package/src/markets/fluid/index.ts +467 -74
  37. package/src/markets/index.ts +1 -1
  38. package/src/morphoBlue/index.ts +1 -3
  39. package/src/multicall/index.ts +10 -1
  40. package/src/services/utils.ts +3 -1
  41. package/src/types/contracts/generated/FluidView.ts +159 -79
  42. package/src/types/fluid.ts +15 -0
@@ -12,10 +12,14 @@ import {
12
12
  FluidVaultData,
13
13
  FluidVaultType, InnerFluidMarketData,
14
14
  } from '../types';
15
- import { FluidViewContract } from '../contracts';
16
- import { getEthAmountForDecimals } from '../services/utils';
15
+ import { DFSFeedRegistryContract, FeedRegistryContract, FluidViewContract } from '../contracts';
16
+ import { getEthAmountForDecimals, isMainnetNetwork } from '../services/utils';
17
17
  import { getFluidAggregatedData } from '../helpers/fluidHelpers';
18
18
  import { FluidView } from '../types/contracts/generated';
19
+ import { chunkAndMulticall } from '../multicall';
20
+ import { getFluidMarketInfoById, getFluidVersionsDataForNetwork } from '../markets/fluid';
21
+ import { USD_QUOTE } from '../constants';
22
+ import { getChainlinkAssetAddress, getWstETHPrice } from '../services/priceService';
19
23
 
20
24
  export const EMPTY_USED_ASSET = {
21
25
  isSupplied: false,
@@ -38,41 +42,75 @@ const parseVaultType = (vaultType: number) => {
38
42
  }
39
43
  };
40
44
 
41
- const parseMarketData = (data: FluidView.VaultDataStructOutputStruct) => {
45
+ const parseMarketData = async (web3: Web3, data: FluidView.VaultDataStructOutputStruct, network: NetworkNumber) => {
42
46
  const collAsset = getAssetInfoByAddress(data.supplyToken0);
43
47
  const debtAsset = getAssetInfoByAddress(data.borrowToken0);
44
48
 
49
+ const supplyRate = new Dec(data.supplyRateVault).div(100).toString();
50
+ const borrowRate = new Dec(data.borrowRateVault).div(100).toString();
51
+
52
+ const oracleScaleFactor = new Dec(27).add(debtAsset.decimals).sub(collAsset.decimals).toString();
53
+ const oracleScale = new Dec(10).pow(oracleScaleFactor).toString();
54
+ const oraclePrice = new Dec(data.oraclePriceOperate).div(oracleScale).toString();
55
+
56
+ const isTokenUSDA = debtAsset.symbol === 'USDA';
57
+ const isMainnet = isMainnetNetwork(network);
58
+ const loanTokenFeedAddress = getChainlinkAssetAddress(debtAsset.symbol, network);
59
+
60
+ let loanTokenPrice;
61
+ if (debtAsset.symbol === 'wstETH') {
62
+ // need to handle wstETH for l2s inside getWstETHPrice
63
+ loanTokenPrice = await getWstETHPrice(web3);
64
+ } else if (isMainnet) {
65
+ const feedRegistryContract = FeedRegistryContract(web3, NetworkNumber.Eth);
66
+ loanTokenPrice = isTokenUSDA ? '100000000' : await feedRegistryContract.methods.latestAnswer(loanTokenFeedAddress, USD_QUOTE).call();
67
+ } else {
68
+ // Currently only base network is supported
69
+ const feedRegistryContract = DFSFeedRegistryContract(web3, network);
70
+ const roundPriceData = isTokenUSDA ? { answer: '100000000' } : await feedRegistryContract.methods.latestRoundData(loanTokenFeedAddress, USD_QUOTE).call();
71
+ loanTokenPrice = roundPriceData.answer;
72
+ }
73
+
74
+ const debtPriceParsed = new Dec(loanTokenPrice).div(1e8).toString();
75
+
45
76
  const collAssetData: FluidAssetData = {
46
77
  symbol: collAsset.symbol,
47
78
  address: collAsset.address,
48
- price: getEthAmountForDecimals(data.priceOfSupplyToken0InUSD, 8),
79
+ price: new Dec(debtPriceParsed).mul(oraclePrice).toString(),
49
80
  totalSupply: data.totalSupplyVault,
50
81
  totalBorrow: data.totalBorrowVault,
51
82
  canBeSupplied: true,
52
83
  canBeBorrowed: false,
53
- supplyRate: new Dec(data.supplyRateVault).div(100).toString(),
84
+ supplyRate,
54
85
  borrowRate: '0',
55
86
  };
56
87
 
57
88
  const debtAssetData: FluidAssetData = {
58
89
  symbol: debtAsset.symbol,
59
90
  address: debtAsset.address,
60
- price: getEthAmountForDecimals(data.priceOfBorrowToken0InUSD, 8),
91
+ price: debtPriceParsed,
61
92
  totalSupply: data.totalSupplyVault,
62
93
  totalBorrow: data.totalBorrowVault,
63
94
  canBeSupplied: false,
64
95
  canBeBorrowed: true,
65
96
  supplyRate: '0',
66
- borrowRate: new Dec(data.borrowRateVault).div(100).toString(),
97
+ borrowRate,
67
98
  };
68
99
 
69
100
  const assetsData = {
70
101
  [collAsset.symbol]: collAssetData,
71
102
  [debtAsset.symbol]: debtAssetData,
72
103
  };
104
+ const marketInfo = getFluidMarketInfoById(+data.vaultId, network);
105
+ const totalSupplyVault = getEthAmountForDecimals(data.totalSupplyVault, collAsset.decimals);
106
+ const totalBorrowVault = getEthAmountForDecimals(data.totalBorrowVault, debtAsset.decimals);
107
+
108
+ const liqRatio = new Dec(data.liquidationThreshold).div(100).toString();
109
+ const liqFactor = new Dec(data.liquidationThreshold).div(10_000).toString();
73
110
 
74
111
  const marketData = {
75
112
  vaultId: +data.vaultId,
113
+ vaultValue: marketInfo?.value,
76
114
  isSmartColl: data.isSmartColl,
77
115
  isSmartDebt: data.isSmartDebt,
78
116
  marketAddress: data.vault,
@@ -80,12 +118,16 @@ const parseMarketData = (data: FluidView.VaultDataStructOutputStruct) => {
80
118
  oracle: data.oracle,
81
119
  liquidationPenaltyPercent: new Dec(data.liquidationPenalty).div(100).toString(),
82
120
  collFactor: new Dec(data.collateralFactor).div(10000).toString(), // we want actual factor, not in %, so we divide by 10000 instead of 100
83
- liquidationRatio: new Dec(data.liquidationThreshold).div(100).toString(),
121
+ liquidationRatio: liqRatio,
122
+ liqFactor,
123
+ minRatio: new Dec(1).div(liqFactor).mul(100).toString(),
84
124
  collAsset0: collAsset.symbol,
85
125
  debtAsset0: debtAsset.symbol,
86
126
  totalPositions: data.totalPositions,
87
- totalSupplyVault: getEthAmountForDecimals(data.totalSupplyVault, collAsset.decimals),
88
- totalBorrowVault: getEthAmountForDecimals(data.totalBorrowVault, debtAsset.decimals),
127
+ totalSupplyVault,
128
+ totalBorrowVault,
129
+ totalSupplyVaultUsd: new Dec(totalSupplyVault).mul(collAssetData.price).toString(),
130
+ totalBorrowVaultUsd: new Dec(totalSupplyVault).mul(debtAssetData.price).toString(),
89
131
  withdrawalLimit: getEthAmountForDecimals(data.withdrawalLimit, collAsset.decimals),
90
132
  withdrawableUntilLimit: getEthAmountForDecimals(data.withdrawableUntilLimit, collAsset.decimals),
91
133
  withdrawable: getEthAmountForDecimals(data.withdrawable, collAsset.decimals),
@@ -96,6 +138,8 @@ const parseMarketData = (data: FluidView.VaultDataStructOutputStruct) => {
96
138
  maxBorrowLimit: getEthAmountForDecimals(data.maxBorrowLimit, debtAsset.decimals),
97
139
  baseBorrowLimit: getEthAmountForDecimals(data.baseBorrowLimit, debtAsset.decimals),
98
140
  minimumBorrowing: getEthAmountForDecimals(data.minimumBorrowing, debtAsset.decimals),
141
+ borrowRate,
142
+ supplyRate,
99
143
  };
100
144
 
101
145
  return {
@@ -177,7 +221,7 @@ export const getFluidMarketData = async (web3: Web3, network: NetworkNumber, mar
177
221
 
178
222
  const data = await view.methods.getVaultData(market.marketAddress).call();
179
223
 
180
- return parseMarketData(data);
224
+ return parseMarketData(web3, data, network);
181
225
  };
182
226
 
183
227
  export const getFluidVaultIdsForUser = async (web3: Web3,
@@ -210,11 +254,24 @@ export const getFluidPosition = async (
210
254
  export const getFluidPositionWithMarket = async (web3: Web3, network: NetworkNumber, vaultId: string) => {
211
255
  const view = FluidViewContract(web3, network);
212
256
  const data = await view.methods.getPositionByNftId(vaultId).call();
213
- const marketData = parseMarketData(data.vault);
257
+ const marketData = await parseMarketData(web3, data.vault, network);
214
258
  const userData = parseUserData(data.position, marketData);
215
259
 
216
260
  return {
217
261
  userData,
218
262
  marketData,
219
263
  };
264
+ };
265
+
266
+ export const getAllFluidMarketDataChunked = async (network: NetworkNumber, web3: Web3) => {
267
+ const versions = getFluidVersionsDataForNetwork(network);
268
+ const view = FluidViewContract(web3, network);
269
+ const calls = versions.map((version) => ({
270
+ target: view.options.address,
271
+ abiItem: view.options.jsonInterface.find((item) => item.name === 'getVaultData'),
272
+ params: [version.marketAddress],
273
+ }));
274
+
275
+ const data = await chunkAndMulticall(calls, 10, 'latest', web3, network);
276
+ return Promise.all(data.map(async (item, i) => parseMarketData(web3, item.vaultData, network)));
220
277
  };