@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.
- package/cjs/config/contracts.d.ts +11 -5
- package/cjs/config/contracts.js +4 -2
- package/cjs/fluid/index.d.ts +1 -0
- package/cjs/fluid/index.js +65 -12
- package/cjs/markets/fluid/index.d.ts +8 -10
- package/cjs/markets/fluid/index.js +466 -77
- package/cjs/markets/index.d.ts +1 -1
- package/cjs/markets/index.js +3 -1
- package/cjs/morphoBlue/index.js +1 -2
- package/cjs/multicall/index.d.ts +1 -0
- package/cjs/multicall/index.js +8 -1
- package/cjs/services/utils.d.ts +1 -0
- package/cjs/services/utils.js +3 -1
- package/cjs/types/contracts/generated/FluidView.d.ts +125 -41
- package/cjs/types/fluid.d.ts +16 -1
- package/cjs/types/fluid.js +3 -0
- package/esm/config/contracts.d.ts +11 -5
- package/esm/config/contracts.js +4 -2
- package/esm/fluid/index.d.ts +1 -0
- package/esm/fluid/index.js +65 -13
- package/esm/markets/fluid/index.d.ts +8 -10
- package/esm/markets/fluid/index.js +460 -71
- package/esm/markets/index.d.ts +1 -1
- package/esm/markets/index.js +1 -1
- package/esm/morphoBlue/index.js +1 -2
- package/esm/multicall/index.d.ts +1 -0
- package/esm/multicall/index.js +6 -0
- package/esm/services/utils.d.ts +1 -0
- package/esm/services/utils.js +1 -0
- package/esm/types/contracts/generated/FluidView.d.ts +125 -41
- package/esm/types/fluid.d.ts +16 -1
- package/esm/types/fluid.js +3 -0
- package/package.json +5 -3
- package/src/config/contracts.js +4 -2
- package/src/fluid/index.ts +69 -12
- package/src/markets/fluid/index.ts +467 -74
- package/src/markets/index.ts +1 -1
- package/src/morphoBlue/index.ts +1 -3
- package/src/multicall/index.ts +10 -1
- package/src/services/utils.ts +3 -1
- package/src/types/contracts/generated/FluidView.ts +159 -79
- package/src/types/fluid.ts +15 -0
package/src/fluid/index.ts
CHANGED
|
@@ -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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
88
|
-
totalBorrowVault
|
|
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
|
};
|