@1delta/margin-fetcher 0.0.328 → 0.0.330
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/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2365 -254
- package/dist/index.js.map +1 -1
- package/dist/lending/public-data/exactly/convertPublic.d.ts +30 -0
- package/dist/lending/public-data/exactly/convertPublic.d.ts.map +1 -0
- package/dist/lending/public-data/exactly/convertPublic.test.d.ts +2 -0
- package/dist/lending/public-data/exactly/convertPublic.test.d.ts.map +1 -0
- package/dist/lending/public-data/exactly/fetchPublic.d.ts +13 -0
- package/dist/lending/public-data/exactly/fetchPublic.d.ts.map +1 -0
- package/dist/lending/public-data/exactly/index.d.ts +5 -0
- package/dist/lending/public-data/exactly/index.d.ts.map +1 -0
- package/dist/lending/public-data/exactly/math.d.ts +30 -0
- package/dist/lending/public-data/exactly/math.d.ts.map +1 -0
- package/dist/lending/public-data/exactly/types.d.ts +80 -0
- package/dist/lending/public-data/exactly/types.d.ts.map +1 -0
- package/dist/lending/public-data/fetchLenderAll.d.ts.map +1 -1
- package/dist/lending/public-data/fetchLenderExt.d.ts.map +1 -1
- package/dist/lending/public-data/liquity/convertPublic.d.ts +42 -0
- package/dist/lending/public-data/liquity/convertPublic.d.ts.map +1 -0
- package/dist/lending/public-data/liquity/convertPublic.test.d.ts +2 -0
- package/dist/lending/public-data/liquity/convertPublic.test.d.ts.map +1 -0
- package/dist/lending/public-data/liquity/fetchPublic.d.ts +15 -0
- package/dist/lending/public-data/liquity/fetchPublic.d.ts.map +1 -0
- package/dist/lending/public-data/liquity/index.d.ts +4 -0
- package/dist/lending/public-data/liquity/index.d.ts.map +1 -0
- package/dist/lending/public-data/liquity/types.d.ts +33 -0
- package/dist/lending/public-data/liquity/types.d.ts.map +1 -0
- package/dist/lending/public-data/midnight/apiClient.d.ts +9 -0
- package/dist/lending/public-data/midnight/apiClient.d.ts.map +1 -1
- package/dist/lending/public-data/midnight/convertPublic.d.ts.map +1 -1
- package/dist/lending/public-data/midnight/fetchPublic.d.ts +6 -4
- package/dist/lending/public-data/midnight/fetchPublic.d.ts.map +1 -1
- package/dist/lending/public-data/midnight/types.d.ts +12 -0
- package/dist/lending/public-data/midnight/types.d.ts.map +1 -1
- package/dist/lending/public-data/river/convertPublic.d.ts +36 -0
- package/dist/lending/public-data/river/convertPublic.d.ts.map +1 -0
- package/dist/lending/public-data/river/convertPublic.test.d.ts +2 -0
- package/dist/lending/public-data/river/convertPublic.test.d.ts.map +1 -0
- package/dist/lending/public-data/river/fetchPublic.d.ts +11 -0
- package/dist/lending/public-data/river/fetchPublic.d.ts.map +1 -0
- package/dist/lending/public-data/river/index.d.ts +4 -0
- package/dist/lending/public-data/river/index.d.ts.map +1 -0
- package/dist/lending/public-data/river/types.d.ts +30 -0
- package/dist/lending/public-data/river/types.d.ts.map +1 -0
- package/dist/lending/public-data/term/apiClient.d.ts +36 -0
- package/dist/lending/public-data/term/apiClient.d.ts.map +1 -0
- package/dist/lending/public-data/term/convertPublic.d.ts +21 -0
- package/dist/lending/public-data/term/convertPublic.d.ts.map +1 -0
- package/dist/lending/public-data/term/convertPublic.test.d.ts +2 -0
- package/dist/lending/public-data/term/convertPublic.test.d.ts.map +1 -0
- package/dist/lending/public-data/term/fetchPublic.d.ts +14 -0
- package/dist/lending/public-data/term/fetchPublic.d.ts.map +1 -0
- package/dist/lending/public-data/term/index.d.ts +6 -0
- package/dist/lending/public-data/term/index.d.ts.map +1 -0
- package/dist/lending/public-data/term/math.d.ts +24 -0
- package/dist/lending/public-data/term/math.d.ts.map +1 -0
- package/dist/lending/public-data/term/types.d.ts +77 -0
- package/dist/lending/public-data/term/types.d.ts.map +1 -0
- package/dist/lending/user-data/abis.d.ts.map +1 -1
- package/dist/lending/user-data/exactly/userCallBuild.d.ts +10 -0
- package/dist/lending/user-data/exactly/userCallBuild.d.ts.map +1 -0
- package/dist/lending/user-data/exactly/userCallParse.d.ts +43 -0
- package/dist/lending/user-data/exactly/userCallParse.d.ts.map +1 -0
- package/dist/lending/user-data/fetch-balances/parse.d.ts.map +1 -1
- package/dist/lending/user-data/fetch-balances/prepare.d.ts.map +1 -1
- package/dist/lending/user-data/liquity/userCall.test.d.ts +2 -0
- package/dist/lending/user-data/liquity/userCall.test.d.ts.map +1 -0
- package/dist/lending/user-data/liquity/userCallBuild.d.ts +30 -0
- package/dist/lending/user-data/liquity/userCallBuild.d.ts.map +1 -0
- package/dist/lending/user-data/liquity/userCallParse.d.ts +54 -0
- package/dist/lending/user-data/liquity/userCallParse.d.ts.map +1 -0
- package/dist/lending/user-data/river/userCall.test.d.ts +2 -0
- package/dist/lending/user-data/river/userCall.test.d.ts.map +1 -0
- package/dist/lending/user-data/river/userCallBuild.d.ts +16 -0
- package/dist/lending/user-data/river/userCallBuild.d.ts.map +1 -0
- package/dist/lending/user-data/river/userCallParse.d.ts +24 -0
- package/dist/lending/user-data/river/userCallParse.d.ts.map +1 -0
- package/dist/lending/user-data/term/userCall.test.d.ts +2 -0
- package/dist/lending/user-data/term/userCall.test.d.ts.map +1 -0
- package/dist/lending/user-data/term/userCallBuild.d.ts +21 -0
- package/dist/lending/user-data/term/userCallBuild.d.ts.map +1 -0
- package/dist/lending/user-data/term/userCallParse.d.ts +18 -0
- package/dist/lending/user-data/term/userCallParse.d.ts.map +1 -0
- package/dist/types/lender/morpho-types.d.ts +38 -1
- package/dist/types/lender/morpho-types.d.ts.map +1 -1
- package/dist/types/lenderTypes.d.ts +26 -6
- package/dist/types/lenderTypes.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +9 -9
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, pad, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-Z3MGRQJR.js';
|
|
2
2
|
import './chunk-BYTNVMX7.js';
|
|
3
3
|
import './chunk-PR4QN5HX.js';
|
|
4
|
-
import { Lender, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isMidnight, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
4
|
+
import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
5
5
|
export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
|
|
6
|
-
import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, aaveReserves, compoundV3Reserves, morphoTypeMarkets, resolveMidnightApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, aaveOracles, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
|
|
6
|
+
import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, aaveOracles, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
|
|
7
7
|
import lodash from 'lodash';
|
|
8
|
-
import { getEvmClient, getEvmChain, getEvmClientUniversal
|
|
9
|
-
import { MetaMorphoAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
|
|
8
|
+
import { getEvmClient, multicallRetryUniversal, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
|
|
9
|
+
import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
|
|
10
10
|
export { MorphoLensAbi } from '@1delta/abis';
|
|
11
11
|
import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
|
|
12
12
|
import { proxyNativeFetch } from '@1delta/proxy-fetch';
|
|
@@ -7504,6 +7504,18 @@ var getLendersForChain = (c) => {
|
|
|
7504
7504
|
if (midnightConfig()?.[c]?.midnight) {
|
|
7505
7505
|
lenders.push(Lender.MORPHO_MIDNIGHT);
|
|
7506
7506
|
}
|
|
7507
|
+
if (termConfig()?.[c]?.termController && termMarketsByChain(c).length > 0) {
|
|
7508
|
+
lenders.push(Lender.TERM_FINANCE);
|
|
7509
|
+
}
|
|
7510
|
+
if (exactlyConfig()?.[c]?.previewer) {
|
|
7511
|
+
lenders.push(Lender.EXACTLY);
|
|
7512
|
+
}
|
|
7513
|
+
for (const l of liquityLendersByChain(c)) {
|
|
7514
|
+
lenders.push(l);
|
|
7515
|
+
}
|
|
7516
|
+
for (const l of riverLendersByChain(c)) {
|
|
7517
|
+
lenders.push(l);
|
|
7518
|
+
}
|
|
7507
7519
|
return lenders.filter((l) => !isExcludedLender(l));
|
|
7508
7520
|
};
|
|
7509
7521
|
var filterLendersByProtocol = (allLenders, protocolList) => {
|
|
@@ -7515,8 +7527,11 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
|
|
|
7515
7527
|
const hasFluid = protocolList.includes(Lender.FLUID);
|
|
7516
7528
|
const hasGearboxV3 = protocolList.includes(Lender.GEARBOX_V3);
|
|
7517
7529
|
const hasDolomite = protocolList.includes(Lender.DOLOMITE);
|
|
7530
|
+
const liquityBases = LIQUITY_FAMILY_LENDERS.filter(
|
|
7531
|
+
(b) => protocolList.includes(b)
|
|
7532
|
+
);
|
|
7518
7533
|
return allLenders.filter(
|
|
7519
|
-
(lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE")
|
|
7534
|
+
(lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER")
|
|
7520
7535
|
);
|
|
7521
7536
|
};
|
|
7522
7537
|
var getAavesForChain = () => {
|
|
@@ -11150,8 +11165,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
|
|
|
11150
11165
|
const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
|
|
11151
11166
|
const ids = Object.keys(brokers);
|
|
11152
11167
|
const out = {};
|
|
11153
|
-
const
|
|
11154
|
-
BROKER_USER_CACHE[
|
|
11168
|
+
const cacheKey3 = `${chainId}:${account.toLowerCase()}`;
|
|
11169
|
+
BROKER_USER_CACHE[cacheKey3] = out;
|
|
11155
11170
|
if (ids.length === 0) return out;
|
|
11156
11171
|
try {
|
|
11157
11172
|
const client = getClient(chainId);
|
|
@@ -19612,7 +19627,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
19612
19627
|
{ self: market.silo0, other: market.silo1 },
|
|
19613
19628
|
{ self: market.silo1, other: market.silo0 }
|
|
19614
19629
|
];
|
|
19615
|
-
const
|
|
19630
|
+
const toBigInt16 = (v) => {
|
|
19616
19631
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
19617
19632
|
if (typeof v === "bigint") return v;
|
|
19618
19633
|
try {
|
|
@@ -19624,8 +19639,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
19624
19639
|
for (let s = 0; s < 2; s++) {
|
|
19625
19640
|
const { self, other } = sides[s];
|
|
19626
19641
|
const slot = s * SILO_V2_CALLS_PER_SIDE;
|
|
19627
|
-
const totalAssetsRaw =
|
|
19628
|
-
const debtAssetsRaw =
|
|
19642
|
+
const totalAssetsRaw = toBigInt16(data[slot]);
|
|
19643
|
+
const debtAssetsRaw = toBigInt16(data[slot + 1]);
|
|
19629
19644
|
const irmConfigRaw = data[slot + 2];
|
|
19630
19645
|
const decimals = self.decimals;
|
|
19631
19646
|
const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
|
|
@@ -19780,7 +19795,7 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
19780
19795
|
{ self: market.silo0, other: market.silo1 },
|
|
19781
19796
|
{ self: market.silo1, other: market.silo0 }
|
|
19782
19797
|
];
|
|
19783
|
-
const
|
|
19798
|
+
const toBigInt16 = (v) => {
|
|
19784
19799
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
19785
19800
|
if (typeof v === "bigint") return v;
|
|
19786
19801
|
try {
|
|
@@ -19792,8 +19807,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
19792
19807
|
for (let s = 0; s < 2; s++) {
|
|
19793
19808
|
const { self, other } = sides[s];
|
|
19794
19809
|
const slot = s * SILO_V3_CALLS_PER_SIDE;
|
|
19795
|
-
const totalAssetsRaw =
|
|
19796
|
-
const debtAssetsRaw =
|
|
19810
|
+
const totalAssetsRaw = toBigInt16(data[slot]);
|
|
19811
|
+
const debtAssetsRaw = toBigInt16(data[slot + 1]);
|
|
19797
19812
|
const irmConfigRaw = data[slot + 2];
|
|
19798
19813
|
const decimals = self.decimals;
|
|
19799
19814
|
const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
|
|
@@ -20962,6 +20977,41 @@ var ApiBookSource = class {
|
|
|
20962
20977
|
return null;
|
|
20963
20978
|
}
|
|
20964
20979
|
}
|
|
20980
|
+
/**
|
|
20981
|
+
* ONE fetch → the full-depth aggregate top + a bounded best-first ladder slice
|
|
20982
|
+
* (top `maxLevels` per side). Same `/books/{marketId}` call as `getBookTop`, so
|
|
20983
|
+
* the public batch captures a chunk of the book for free (no extra request).
|
|
20984
|
+
*/
|
|
20985
|
+
async getTopAndBook(marketId, maxLevels = 20) {
|
|
20986
|
+
const url = `${this.baseUrl}/books/${marketId}`;
|
|
20987
|
+
try {
|
|
20988
|
+
const res = await this.fetchImpl(url);
|
|
20989
|
+
if (!res.ok) {
|
|
20990
|
+
warn(`book ${marketId} \u2192 HTTP ${res.status}`);
|
|
20991
|
+
return null;
|
|
20992
|
+
}
|
|
20993
|
+
const json = await res.json();
|
|
20994
|
+
const raw = json?.data ?? json;
|
|
20995
|
+
const bids = (Array.isArray(raw?.bids) ? raw.bids.map(parseLevel) : []).filter((l) => l.units > 0n).sort(
|
|
20996
|
+
(a, b) => a.tick < b.tick ? 1 : a.tick > b.tick ? -1 : 0
|
|
20997
|
+
);
|
|
20998
|
+
const asks = (Array.isArray(raw?.asks) ? raw.asks.map(parseLevel) : []).filter((l) => l.units > 0n).sort(
|
|
20999
|
+
(a, b) => a.tick < b.tick ? -1 : a.tick > b.tick ? 1 : 0
|
|
21000
|
+
);
|
|
21001
|
+
const top = reduceTop(bids, asks);
|
|
21002
|
+
const book = {
|
|
21003
|
+
bids: bids.slice(0, maxLevels),
|
|
21004
|
+
asks: asks.slice(0, maxLevels)
|
|
21005
|
+
};
|
|
21006
|
+
return { top, book };
|
|
21007
|
+
} catch (e) {
|
|
21008
|
+
console.error(
|
|
21009
|
+
`[midnight getTopAndBook] ${url} threw:`,
|
|
21010
|
+
e?.message ?? e
|
|
21011
|
+
);
|
|
21012
|
+
return null;
|
|
21013
|
+
}
|
|
21014
|
+
}
|
|
20965
21015
|
/**
|
|
20966
21016
|
* Maker addresses per price level, keyed by tick string. `getBook` levels are
|
|
20967
21017
|
* aggregated by tick and carry NO maker (a level can be several makers), so
|
|
@@ -20996,30 +21046,45 @@ function createMidnightBookSource(chainId, fetchImpl = fetch) {
|
|
|
20996
21046
|
}
|
|
20997
21047
|
|
|
20998
21048
|
// src/lending/public-data/midnight/fetchPublic.ts
|
|
21049
|
+
var MIDNIGHT_BOOK_LEVELS = 20;
|
|
20999
21050
|
var LKG_TTL_SEC = 30 * 60;
|
|
21000
|
-
var
|
|
21001
|
-
async function
|
|
21051
|
+
var lastGood = /* @__PURE__ */ new Map();
|
|
21052
|
+
async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec5) {
|
|
21002
21053
|
const key = `${chainId}:${marketId}`;
|
|
21003
|
-
|
|
21054
|
+
let fresh = null;
|
|
21055
|
+
if (source.getTopAndBook) {
|
|
21056
|
+
fresh = await source.getTopAndBook(marketId, MIDNIGHT_BOOK_LEVELS).catch(() => null);
|
|
21057
|
+
} else {
|
|
21058
|
+
const top = await source.getBookTop(marketId).catch(() => null);
|
|
21059
|
+
if (top) fresh = { top, book: { bids: [], asks: [] } };
|
|
21060
|
+
}
|
|
21004
21061
|
if (fresh) {
|
|
21005
|
-
|
|
21006
|
-
return fresh;
|
|
21062
|
+
lastGood.set(key, { top: fresh.top, book: fresh.book, at: nowSec5 });
|
|
21063
|
+
return { top: fresh.top, book: fresh.book };
|
|
21007
21064
|
}
|
|
21008
|
-
const cached =
|
|
21009
|
-
if (cached &&
|
|
21010
|
-
|
|
21065
|
+
const cached = lastGood.get(key);
|
|
21066
|
+
if (cached && nowSec5 - cached.at <= LKG_TTL_SEC) {
|
|
21067
|
+
return { top: cached.top, book: cached.book };
|
|
21068
|
+
}
|
|
21069
|
+
return { top: null, book: null };
|
|
21011
21070
|
}
|
|
21012
21071
|
async function fetchMidnightMarkets(chainId, source = createMidnightBookSource(chainId)) {
|
|
21013
21072
|
const markets = midnightMarketsByChain(chainId);
|
|
21014
21073
|
if (markets.length === 0) return [];
|
|
21015
|
-
const
|
|
21074
|
+
const nowSec5 = Math.floor(Date.now() / 1e3);
|
|
21016
21075
|
return Promise.all(
|
|
21017
|
-
markets.map(async (config) =>
|
|
21018
|
-
config
|
|
21019
|
-
|
|
21020
|
-
|
|
21021
|
-
|
|
21022
|
-
|
|
21076
|
+
markets.map(async (config) => {
|
|
21077
|
+
if (Number(config.maturity) <= nowSec5) {
|
|
21078
|
+
return { config, top: null, book: null };
|
|
21079
|
+
}
|
|
21080
|
+
const { top, book } = await fetchTopAndBookWithFallback(
|
|
21081
|
+
source,
|
|
21082
|
+
chainId,
|
|
21083
|
+
config.marketId,
|
|
21084
|
+
nowSec5
|
|
21085
|
+
);
|
|
21086
|
+
return { config, top, book };
|
|
21087
|
+
})
|
|
21023
21088
|
);
|
|
21024
21089
|
}
|
|
21025
21090
|
|
|
@@ -21138,7 +21203,7 @@ function convertMidnightMarketsToResponse(raw, chainId, prices = {}, _additional
|
|
|
21138
21203
|
}, tokens = {}) {
|
|
21139
21204
|
const out = {};
|
|
21140
21205
|
const now = nowSec();
|
|
21141
|
-
for (const { config, top } of raw) {
|
|
21206
|
+
for (const { config, top, book } of raw) {
|
|
21142
21207
|
if (!config?.marketId || !config.loanToken) continue;
|
|
21143
21208
|
const m = midnightLenderKey(config.marketId);
|
|
21144
21209
|
const maturity = Number(config.maturity);
|
|
@@ -21275,6 +21340,12 @@ function convertMidnightMarketsToResponse(raw, chainId, prices = {}, _additional
|
|
|
21275
21340
|
isFrozen: false
|
|
21276
21341
|
};
|
|
21277
21342
|
});
|
|
21343
|
+
const toLevels = (levels) => (levels ?? []).map((l) => ({
|
|
21344
|
+
apr: tickToAprNumber(l.tick, ttmBig) * 100,
|
|
21345
|
+
units: l.units.toString(),
|
|
21346
|
+
assets: formatNr(l.assets, config.loanDecimals)
|
|
21347
|
+
}));
|
|
21348
|
+
const marketBook = book && !matured ? { bids: toLevels(book.bids), asks: toLevels(book.asks) } : void 0;
|
|
21278
21349
|
const primaryCollateral = config.collateralParams[0];
|
|
21279
21350
|
entry.params = {
|
|
21280
21351
|
market: {
|
|
@@ -21316,7 +21387,401 @@ function convertMidnightMarketsToResponse(raw, chainId, prices = {}, _additional
|
|
|
21316
21387
|
},
|
|
21317
21388
|
enterGate: config.enterGate,
|
|
21318
21389
|
liquidatorGate: config.liquidatorGate,
|
|
21319
|
-
collateralParams: config.collateralParams
|
|
21390
|
+
collateralParams: config.collateralParams,
|
|
21391
|
+
// Bounded top-of-book slice (top-N levels/side) for later filtering.
|
|
21392
|
+
book: marketBook
|
|
21393
|
+
}
|
|
21394
|
+
};
|
|
21395
|
+
entry.chainId = chainId;
|
|
21396
|
+
out[m] = entry;
|
|
21397
|
+
}
|
|
21398
|
+
return out;
|
|
21399
|
+
}
|
|
21400
|
+
var WAD3 = 1e18;
|
|
21401
|
+
var TERM_SUBGRAPH_BY_CHAIN = {
|
|
21402
|
+
"1": "https://api.subgraph.ormilabs.com/api/public/05e9a4e2-103b-4163-a81e-3b1b038d0055/subgraphs/term-finance-mainnet/latest/gn",
|
|
21403
|
+
"43114": "https://api.subgraph.ormilabs.com/api/public/05e9a4e2-103b-4163-a81e-3b1b038d0055/subgraphs/term-finance-avalanche/latest/gn",
|
|
21404
|
+
"56": "https://api.subgraph.ormilabs.com/api/public/05e9a4e2-103b-4163-a81e-3b1b038d0055/subgraphs/term-finance-bnb/latest/gn",
|
|
21405
|
+
"8453": "https://api.subgraph.ormilabs.com/api/public/05e9a4e2-103b-4163-a81e-3b1b038d0055/subgraphs/term-finance-base/latest/gn",
|
|
21406
|
+
"42161": "https://api.subgraph.ormilabs.com/api/public/05e9a4e2-103b-4163-a81e-3b1b038d0055/subgraphs/term-finance-arbitrum/latest/gn"
|
|
21407
|
+
};
|
|
21408
|
+
var warn2 = (...args) => {
|
|
21409
|
+
};
|
|
21410
|
+
function termApiBaseUrl(chainId) {
|
|
21411
|
+
return resolveTermApiBase(chainId) || TERM_SUBGRAPH_BY_CHAIN[chainId] || "";
|
|
21412
|
+
}
|
|
21413
|
+
var toNum = (v) => {
|
|
21414
|
+
if (v == null || v === "") return 0;
|
|
21415
|
+
const n = typeof v === "number" ? v : Number(v);
|
|
21416
|
+
return Number.isFinite(n) ? n : 0;
|
|
21417
|
+
};
|
|
21418
|
+
var toBig3 = (v) => {
|
|
21419
|
+
try {
|
|
21420
|
+
return v == null ? 0n : BigInt(String(v));
|
|
21421
|
+
} catch {
|
|
21422
|
+
return 0n;
|
|
21423
|
+
}
|
|
21424
|
+
};
|
|
21425
|
+
var TermSubgraphSource = class {
|
|
21426
|
+
url;
|
|
21427
|
+
fetchImpl;
|
|
21428
|
+
constructor(url, fetchImpl = fetch) {
|
|
21429
|
+
this.url = url;
|
|
21430
|
+
this.fetchImpl = (input, init) => fetchImpl.call(globalThis, input, init);
|
|
21431
|
+
}
|
|
21432
|
+
async gql(query3, variables) {
|
|
21433
|
+
if (!this.url) return null;
|
|
21434
|
+
try {
|
|
21435
|
+
const res = await this.fetchImpl(this.url, {
|
|
21436
|
+
method: "POST",
|
|
21437
|
+
headers: { "content-type": "application/json" },
|
|
21438
|
+
body: JSON.stringify({ query: query3, variables })
|
|
21439
|
+
});
|
|
21440
|
+
if (!res.ok) {
|
|
21441
|
+
warn2(`HTTP ${res.status}`);
|
|
21442
|
+
return null;
|
|
21443
|
+
}
|
|
21444
|
+
const json = await res.json();
|
|
21445
|
+
if (json?.errors) {
|
|
21446
|
+
warn2("graphql errors", json.errors);
|
|
21447
|
+
return null;
|
|
21448
|
+
}
|
|
21449
|
+
return json?.data ?? null;
|
|
21450
|
+
} catch (e) {
|
|
21451
|
+
return null;
|
|
21452
|
+
}
|
|
21453
|
+
}
|
|
21454
|
+
async getBookTop(config) {
|
|
21455
|
+
return (await this.getTopAndBook(config))?.top ?? null;
|
|
21456
|
+
}
|
|
21457
|
+
/**
|
|
21458
|
+
* ONE query → the aggregate top (best APR + FULL depth) PLUS a bounded book
|
|
21459
|
+
* slice (top `maxLevels` open orders per side). `asks` = orders selling repo
|
|
21460
|
+
* tokens (the secondary LEND book); `bids` = the rest (borrow side, usually
|
|
21461
|
+
* empty — Term borrow is sealed-bid auction, not a continuous book). Term
|
|
21462
|
+
* secondary orders carry no per-order rate, so every level shares the market's
|
|
21463
|
+
* clearing APR; the levels expose per-order SIZE for filtering.
|
|
21464
|
+
*/
|
|
21465
|
+
async getTopAndBook(config, maxLevels = 20) {
|
|
21466
|
+
const id = config.termRepoId.toLowerCase();
|
|
21467
|
+
const repoToken = config.repoToken.toLowerCase();
|
|
21468
|
+
const data = await this.gql(
|
|
21469
|
+
`query Top($id: ID!, $repoId: Bytes!) {
|
|
21470
|
+
termRepo(id: $id) { termRepoTokenRedemptionRatio }
|
|
21471
|
+
termAuctions(where: { term: $id, auctionComplete: true }, orderBy: auctionEndTime, orderDirection: desc, first: 1) {
|
|
21472
|
+
auctionClearingPrice
|
|
21473
|
+
dayCountFractionMantissa
|
|
21474
|
+
}
|
|
21475
|
+
termOrders(where: { termRepoId: $repoId, orderCancelled: false }, first: 500) {
|
|
21476
|
+
makerToken
|
|
21477
|
+
originalOrderAmount
|
|
21478
|
+
filledAmount
|
|
21479
|
+
}
|
|
21480
|
+
}`,
|
|
21481
|
+
{ id, repoId: id }
|
|
21482
|
+
);
|
|
21483
|
+
if (!data) return null;
|
|
21484
|
+
const redemptionRatio = toBig3(data.termRepo?.termRepoTokenRedemptionRatio) || BigInt(WAD3);
|
|
21485
|
+
const auction = data.termAuctions?.[0];
|
|
21486
|
+
const clearingRate = toNum(auction?.auctionClearingPrice);
|
|
21487
|
+
const aprPct = clearingRate > 0 ? clearingRate / WAD3 * 100 : 0;
|
|
21488
|
+
const scale = Math.pow(10, config.loanDecimals);
|
|
21489
|
+
const toLoan = (repoUnits) => Number(repoUnits * redemptionRatio / BigInt(WAD3)) / scale;
|
|
21490
|
+
const orders = (data.termOrders ?? []).map((o) => ({
|
|
21491
|
+
remaining: toBig3(o.originalOrderAmount) - toBig3(o.filledAmount),
|
|
21492
|
+
isAsk: String(o.makerToken).toLowerCase() === repoToken
|
|
21493
|
+
})).filter((o) => o.remaining > 0n).sort(
|
|
21494
|
+
(a, b) => a.remaining < b.remaining ? 1 : a.remaining > b.remaining ? -1 : 0
|
|
21495
|
+
);
|
|
21496
|
+
let supplyUnits = 0n;
|
|
21497
|
+
let borrowUnits = 0n;
|
|
21498
|
+
const asks = [];
|
|
21499
|
+
const bids = [];
|
|
21500
|
+
for (const o of orders) {
|
|
21501
|
+
const arr = o.isAsk ? asks : bids;
|
|
21502
|
+
if (o.isAsk) supplyUnits += o.remaining;
|
|
21503
|
+
else borrowUnits += o.remaining;
|
|
21504
|
+
if (arr.length < maxLevels) {
|
|
21505
|
+
arr.push({
|
|
21506
|
+
apr: aprPct,
|
|
21507
|
+
units: o.remaining.toString(),
|
|
21508
|
+
assets: toLoan(o.remaining)
|
|
21509
|
+
});
|
|
21510
|
+
}
|
|
21511
|
+
}
|
|
21512
|
+
const top = {
|
|
21513
|
+
supplyAprPct: aprPct,
|
|
21514
|
+
borrowAprPct: aprPct,
|
|
21515
|
+
supplyLiquidity: toLoan(supplyUnits),
|
|
21516
|
+
borrowLiquidity: toLoan(borrowUnits)
|
|
21517
|
+
};
|
|
21518
|
+
return { top, book: { bids, asks } };
|
|
21519
|
+
}
|
|
21520
|
+
async getListings(config) {
|
|
21521
|
+
const id = config.termRepoId.toLowerCase();
|
|
21522
|
+
const repoToken = config.repoToken.toLowerCase();
|
|
21523
|
+
const data = await this.gql(
|
|
21524
|
+
`query Listings($repoId: Bytes!) {
|
|
21525
|
+
termOrders(where: { termRepoId: $repoId, orderCancelled: false }, first: 500) {
|
|
21526
|
+
id
|
|
21527
|
+
maker
|
|
21528
|
+
makerToken
|
|
21529
|
+
originalOrderAmount
|
|
21530
|
+
filledAmount
|
|
21531
|
+
}
|
|
21532
|
+
}`,
|
|
21533
|
+
{ repoId: id }
|
|
21534
|
+
);
|
|
21535
|
+
if (!data) return null;
|
|
21536
|
+
return (data.termOrders ?? []).filter((o) => String(o.makerToken).toLowerCase() === repoToken).map((o) => {
|
|
21537
|
+
const remaining = toBig3(o.originalOrderAmount) - toBig3(o.filledAmount);
|
|
21538
|
+
return {
|
|
21539
|
+
listingId: String(o.id),
|
|
21540
|
+
seller: String(o.maker),
|
|
21541
|
+
repoToken: config.repoToken,
|
|
21542
|
+
amount: remaining.toString()
|
|
21543
|
+
};
|
|
21544
|
+
}).filter((l) => toBig3(l.amount) > 0n);
|
|
21545
|
+
}
|
|
21546
|
+
};
|
|
21547
|
+
function createTermBookSource(chainId, fetchImpl = fetch) {
|
|
21548
|
+
return new TermSubgraphSource(termApiBaseUrl(chainId), fetchImpl);
|
|
21549
|
+
}
|
|
21550
|
+
|
|
21551
|
+
// src/lending/public-data/term/fetchPublic.ts
|
|
21552
|
+
var TERM_BOOK_LEVELS = 20;
|
|
21553
|
+
var LKG_TTL_SEC2 = 30 * 60;
|
|
21554
|
+
var lastGood2 = /* @__PURE__ */ new Map();
|
|
21555
|
+
async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec5) {
|
|
21556
|
+
const key = `${chainId}:${config.termRepoId}`;
|
|
21557
|
+
let fresh = null;
|
|
21558
|
+
if (source.getTopAndBook) {
|
|
21559
|
+
fresh = await source.getTopAndBook(config, TERM_BOOK_LEVELS).catch(() => null);
|
|
21560
|
+
} else {
|
|
21561
|
+
const top = await source.getBookTop(config).catch(() => null);
|
|
21562
|
+
if (top) fresh = { top, book: { bids: [], asks: [] } };
|
|
21563
|
+
}
|
|
21564
|
+
if (fresh) {
|
|
21565
|
+
lastGood2.set(key, { top: fresh.top, book: fresh.book, at: nowSec5 });
|
|
21566
|
+
return { top: fresh.top, book: fresh.book };
|
|
21567
|
+
}
|
|
21568
|
+
const cached = lastGood2.get(key);
|
|
21569
|
+
if (cached && nowSec5 - cached.at <= LKG_TTL_SEC2) {
|
|
21570
|
+
return { top: cached.top, book: cached.book };
|
|
21571
|
+
}
|
|
21572
|
+
return { top: null, book: null };
|
|
21573
|
+
}
|
|
21574
|
+
async function fetchTermMarkets(chainId, source = createTermBookSource(chainId)) {
|
|
21575
|
+
const markets = termMarketsByChain(chainId);
|
|
21576
|
+
if (markets.length === 0) return [];
|
|
21577
|
+
const nowSec5 = Math.floor(Date.now() / 1e3);
|
|
21578
|
+
return Promise.all(
|
|
21579
|
+
markets.map(async (config) => {
|
|
21580
|
+
if (Number(config.maturity) <= nowSec5) {
|
|
21581
|
+
return { config, top: null, book: null };
|
|
21582
|
+
}
|
|
21583
|
+
const { top, book } = await fetchTopAndBookWithFallback2(
|
|
21584
|
+
source,
|
|
21585
|
+
chainId,
|
|
21586
|
+
config,
|
|
21587
|
+
nowSec5
|
|
21588
|
+
);
|
|
21589
|
+
return { config, top, book };
|
|
21590
|
+
})
|
|
21591
|
+
);
|
|
21592
|
+
}
|
|
21593
|
+
|
|
21594
|
+
// src/lending/public-data/term/math.ts
|
|
21595
|
+
var WAD4 = 1e18;
|
|
21596
|
+
function termMaintenanceRatioToLtv(maintenanceRatio) {
|
|
21597
|
+
if (!maintenanceRatio) return 0;
|
|
21598
|
+
let r;
|
|
21599
|
+
try {
|
|
21600
|
+
r = BigInt(maintenanceRatio);
|
|
21601
|
+
} catch {
|
|
21602
|
+
return 0;
|
|
21603
|
+
}
|
|
21604
|
+
if (r <= 0n) return 0;
|
|
21605
|
+
const ratio = Number(r) / WAD4;
|
|
21606
|
+
return ratio > 0 ? 1 / ratio : 0;
|
|
21607
|
+
}
|
|
21608
|
+
function termLiquidatedDamagesToPenalty(liquidatedDamages) {
|
|
21609
|
+
if (!liquidatedDamages) return 0;
|
|
21610
|
+
try {
|
|
21611
|
+
return Number(BigInt(liquidatedDamages)) / WAD4;
|
|
21612
|
+
} catch {
|
|
21613
|
+
return 0;
|
|
21614
|
+
}
|
|
21615
|
+
}
|
|
21616
|
+
|
|
21617
|
+
// src/lending/public-data/term/convertPublic.ts
|
|
21618
|
+
var nowSec2 = () => Math.floor(Date.now() / 1e3);
|
|
21619
|
+
function termLenderKey(termRepoId) {
|
|
21620
|
+
const body = termRepoId.startsWith("0x") ? termRepoId.slice(2) : termRepoId;
|
|
21621
|
+
return "TERM_FINANCE_" + body.toUpperCase();
|
|
21622
|
+
}
|
|
21623
|
+
function currencyFor2(address, decimals, tokens) {
|
|
21624
|
+
const lower = address.toLowerCase();
|
|
21625
|
+
return tokens[lower] ?? { address: lower, symbol: "", name: "", decimals };
|
|
21626
|
+
}
|
|
21627
|
+
function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYields = { intrinsicYields: {}, lenderRewards: {}, loaded: true }, tokens = {}) {
|
|
21628
|
+
const out = {};
|
|
21629
|
+
const now = nowSec2();
|
|
21630
|
+
for (const { config, top, book } of raw) {
|
|
21631
|
+
if (!config?.termRepoId || !config.purchaseToken) continue;
|
|
21632
|
+
const m = termLenderKey(config.termRepoId);
|
|
21633
|
+
const maturity = Number(config.maturity);
|
|
21634
|
+
const ttm = maturity - now;
|
|
21635
|
+
const matured = ttm <= 0;
|
|
21636
|
+
const supplyAprPct = !matured ? top?.supplyAprPct ?? 0 : 0;
|
|
21637
|
+
const borrowAprPct = !matured ? top?.borrowAprPct ?? 0 : 0;
|
|
21638
|
+
const terms = borrowAprPct > 0 && !matured ? [
|
|
21639
|
+
{
|
|
21640
|
+
termId: 0,
|
|
21641
|
+
durationSecs: Math.max(0, ttm),
|
|
21642
|
+
durationDays: ttm / 86400,
|
|
21643
|
+
apr: borrowAprPct
|
|
21644
|
+
}
|
|
21645
|
+
] : void 0;
|
|
21646
|
+
const loanAddr = config.purchaseToken.toLowerCase();
|
|
21647
|
+
const loanAsset = tokens[loanAddr];
|
|
21648
|
+
const loanKey = toOracleKey(loanAsset?.assetGroup) || toGenericPriceKey(loanAddr, chainId);
|
|
21649
|
+
const loanPrice = prices[loanKey] ?? 0;
|
|
21650
|
+
const supplyLiquidity = top?.supplyLiquidity ?? 0;
|
|
21651
|
+
const borrowLiquidity = top?.borrowLiquidity ?? 0;
|
|
21652
|
+
const entry = { data: {} };
|
|
21653
|
+
const loanUid = createMarketUid(chainId, m, loanAddr);
|
|
21654
|
+
entry.data[loanUid] = {
|
|
21655
|
+
marketUid: loanUid,
|
|
21656
|
+
name: "Loan " + (tokens[loanAddr]?.symbol ?? ""),
|
|
21657
|
+
poolId: loanAddr,
|
|
21658
|
+
underlying: loanAddr,
|
|
21659
|
+
asset: currencyFor2(loanAddr, config.loanDecimals, tokens),
|
|
21660
|
+
totalDeposits: supplyLiquidity,
|
|
21661
|
+
totalDebtStable: 0,
|
|
21662
|
+
totalDebt: 0,
|
|
21663
|
+
totalLiquidity: borrowLiquidity,
|
|
21664
|
+
borrowLiquidity,
|
|
21665
|
+
totalLiquidityUSD: borrowLiquidity * loanPrice,
|
|
21666
|
+
borrowLiquidityUSD: borrowLiquidity * loanPrice,
|
|
21667
|
+
totalDepositsUSD: supplyLiquidity * loanPrice,
|
|
21668
|
+
totalDebtStableUSD: 0,
|
|
21669
|
+
totalDebtUSD: 0,
|
|
21670
|
+
utilization: 0,
|
|
21671
|
+
depositRate: supplyAprPct,
|
|
21672
|
+
variableBorrowRate: borrowAprPct,
|
|
21673
|
+
// Term is fixed-rate: mirror the fixed borrow APR on stableBorrowRate too.
|
|
21674
|
+
stableBorrowRate: borrowAprPct,
|
|
21675
|
+
intrinsicYield: 0,
|
|
21676
|
+
rewards: void 0,
|
|
21677
|
+
decimals: config.loanDecimals,
|
|
21678
|
+
config: {
|
|
21679
|
+
0: {
|
|
21680
|
+
category: 0,
|
|
21681
|
+
borrowCollateralFactor: 0,
|
|
21682
|
+
collateralFactor: 0,
|
|
21683
|
+
borrowFactor: 1,
|
|
21684
|
+
liquidationPenalty: 0,
|
|
21685
|
+
closeFactor: 1,
|
|
21686
|
+
collateralDisabled: true,
|
|
21687
|
+
debtDisabled: false
|
|
21688
|
+
}
|
|
21689
|
+
},
|
|
21690
|
+
closeFactor: 1,
|
|
21691
|
+
collateralActive: false,
|
|
21692
|
+
borrowingEnabled: !matured,
|
|
21693
|
+
depositsEnabled: !matured,
|
|
21694
|
+
hasStable: false,
|
|
21695
|
+
variableBorrowDisabled: false,
|
|
21696
|
+
isActive: true,
|
|
21697
|
+
isFrozen: false
|
|
21698
|
+
};
|
|
21699
|
+
config.collateralParams.forEach((c) => {
|
|
21700
|
+
const collAddr = c.token.toLowerCase();
|
|
21701
|
+
const ltv = termMaintenanceRatioToLtv(c.maintenanceRatio);
|
|
21702
|
+
const liquidationPenalty = termLiquidatedDamagesToPenalty(c.liquidatedDamages) || liquidationPenaltyFromLltv(ltv);
|
|
21703
|
+
const collUid = createMarketUid(chainId, m, collAddr);
|
|
21704
|
+
entry.data[collUid] = {
|
|
21705
|
+
marketUid: collUid,
|
|
21706
|
+
name: "Collateral " + (tokens[collAddr]?.symbol ?? ""),
|
|
21707
|
+
poolId: collAddr,
|
|
21708
|
+
underlying: collAddr,
|
|
21709
|
+
asset: currencyFor2(collAddr, c.decimals, tokens),
|
|
21710
|
+
totalDeposits: 0,
|
|
21711
|
+
totalDebtStable: 0,
|
|
21712
|
+
totalDebt: 0,
|
|
21713
|
+
totalLiquidity: 0,
|
|
21714
|
+
borrowLiquidity: 0,
|
|
21715
|
+
totalLiquidityUSD: 0,
|
|
21716
|
+
borrowLiquidityUSD: 0,
|
|
21717
|
+
totalDepositsUSD: 0,
|
|
21718
|
+
totalDebtStableUSD: 0,
|
|
21719
|
+
totalDebtUSD: 0,
|
|
21720
|
+
utilization: 0,
|
|
21721
|
+
depositRate: 0,
|
|
21722
|
+
variableBorrowRate: 0,
|
|
21723
|
+
stableBorrowRate: 0,
|
|
21724
|
+
intrinsicYield: 0,
|
|
21725
|
+
rewards: void 0,
|
|
21726
|
+
decimals: c.decimals,
|
|
21727
|
+
config: {
|
|
21728
|
+
0: {
|
|
21729
|
+
category: 0,
|
|
21730
|
+
borrowCollateralFactor: ltv,
|
|
21731
|
+
collateralFactor: ltv,
|
|
21732
|
+
borrowFactor: 1,
|
|
21733
|
+
liquidationPenalty,
|
|
21734
|
+
closeFactor: 1,
|
|
21735
|
+
collateralDisabled: false,
|
|
21736
|
+
debtDisabled: true
|
|
21737
|
+
}
|
|
21738
|
+
},
|
|
21739
|
+
closeFactor: 1,
|
|
21740
|
+
collateralActive: true,
|
|
21741
|
+
borrowingEnabled: false,
|
|
21742
|
+
depositsEnabled: !matured,
|
|
21743
|
+
hasStable: false,
|
|
21744
|
+
isActive: true,
|
|
21745
|
+
isFrozen: false
|
|
21746
|
+
};
|
|
21747
|
+
});
|
|
21748
|
+
const primaryCollateral = config.collateralParams[0];
|
|
21749
|
+
entry.params = {
|
|
21750
|
+
market: {
|
|
21751
|
+
lender: m,
|
|
21752
|
+
name: config.name,
|
|
21753
|
+
loanDecimals: config.loanDecimals,
|
|
21754
|
+
collateralDecimals: primaryCollateral?.decimals,
|
|
21755
|
+
id: config.termRepoId,
|
|
21756
|
+
lltv: primaryCollateral?.maintenanceRatio ?? "0",
|
|
21757
|
+
oracle: zeroAddress,
|
|
21758
|
+
irm: zeroAddress,
|
|
21759
|
+
collateralAddress: primaryCollateral?.token ?? zeroAddress,
|
|
21760
|
+
loanAddress: loanAddr,
|
|
21761
|
+
terms,
|
|
21762
|
+
// Term-specific extras (consumed by calldata / worker-api resolvers)
|
|
21763
|
+
maturity: config.maturity,
|
|
21764
|
+
redemptionTimestamp: config.redemptionTimestamp,
|
|
21765
|
+
endOfRepurchaseWindow: config.endOfRepurchaseWindow,
|
|
21766
|
+
redemptionValue: config.redemptionValue,
|
|
21767
|
+
servicingFee: config.servicingFee,
|
|
21768
|
+
// Canonical cross-protocol fixed-term descriptor. Term: single calendar
|
|
21769
|
+
// maturity, auction-cleared fixed rate, no early-repay penalty on the
|
|
21770
|
+
// lender (exit = sell the repo token on the secondary book).
|
|
21771
|
+
fixedTerm: {
|
|
21772
|
+
model: "term",
|
|
21773
|
+
maturity: Number(config.maturity),
|
|
21774
|
+
fees: {},
|
|
21775
|
+
earlyRepay: { kind: "none" },
|
|
21776
|
+
// Fixed rate is discovered by the periodic sealed-bid auction; the
|
|
21777
|
+
// per-repo servicer is the market-level venue reference.
|
|
21778
|
+
provider: { kind: "auction", address: config.servicer }
|
|
21779
|
+
},
|
|
21780
|
+
collateralParams: config.collateralParams,
|
|
21781
|
+
// Bounded book slice (top-N open orders/side) for later filtering. Term
|
|
21782
|
+
// levels are already rate+size normalized; pass through (empty when
|
|
21783
|
+
// matured or no book). `asks` = secondary lend orders, `bids` = borrow.
|
|
21784
|
+
book: !matured && book ? { bids: book.bids, asks: book.asks } : void 0
|
|
21320
21785
|
}
|
|
21321
21786
|
};
|
|
21322
21787
|
entry.chainId = chainId;
|
|
@@ -21324,6 +21789,783 @@ function convertMidnightMarketsToResponse(raw, chainId, prices = {}, _additional
|
|
|
21324
21789
|
}
|
|
21325
21790
|
return out;
|
|
21326
21791
|
}
|
|
21792
|
+
async function fetchExactlyMarkets(chainId) {
|
|
21793
|
+
const cfg = exactlyConfig()?.[chainId];
|
|
21794
|
+
if (!cfg?.previewer || !cfg?.auditor) {
|
|
21795
|
+
return { markets: [], liquidationIncentive: null };
|
|
21796
|
+
}
|
|
21797
|
+
const client = getEvmClient(chainId);
|
|
21798
|
+
const [markets, liquidationIncentive] = await Promise.all([
|
|
21799
|
+
client.readContract({
|
|
21800
|
+
address: cfg.previewer,
|
|
21801
|
+
abi: ExactlyPreviewerAbi,
|
|
21802
|
+
functionName: "exactly",
|
|
21803
|
+
args: [zeroAddress]
|
|
21804
|
+
}).then((res) => res).catch(() => []),
|
|
21805
|
+
client.readContract({
|
|
21806
|
+
address: cfg.auditor,
|
|
21807
|
+
abi: ExactlyAuditorAbi,
|
|
21808
|
+
functionName: "liquidationIncentive"
|
|
21809
|
+
}).then((res) => ({
|
|
21810
|
+
liquidator: res[0],
|
|
21811
|
+
lenders: res[1]
|
|
21812
|
+
})).catch(() => null)
|
|
21813
|
+
]);
|
|
21814
|
+
return { markets: [...markets], liquidationIncentive };
|
|
21815
|
+
}
|
|
21816
|
+
|
|
21817
|
+
// src/lending/public-data/exactly/math.ts
|
|
21818
|
+
var WAD5 = 1e18;
|
|
21819
|
+
var YEAR_SECONDS = 31536e3;
|
|
21820
|
+
function exactlyWadRateToPercent(rate) {
|
|
21821
|
+
if (!rate) return 0;
|
|
21822
|
+
return Number(rate) / WAD5 * 100;
|
|
21823
|
+
}
|
|
21824
|
+
function exactlyUsdPrice(usdPrice) {
|
|
21825
|
+
if (!usdPrice) return 0;
|
|
21826
|
+
return Number(usdPrice) / WAD5;
|
|
21827
|
+
}
|
|
21828
|
+
function exactlyPenaltyRateToAprPercent(penaltyRatePerSecond) {
|
|
21829
|
+
if (!penaltyRatePerSecond) return 0;
|
|
21830
|
+
return Number(penaltyRatePerSecond) / WAD5 * YEAR_SECONDS * 100;
|
|
21831
|
+
}
|
|
21832
|
+
function exactlyFloatingDepositAprPercent(floatingBorrowRate, floatingDebt, floatingBackupBorrowed, floatingAssets) {
|
|
21833
|
+
if (!floatingBorrowRate || !floatingAssets) return 0;
|
|
21834
|
+
const lent = Number((floatingDebt ?? 0n) + (floatingBackupBorrowed ?? 0n));
|
|
21835
|
+
const assets = Number(floatingAssets);
|
|
21836
|
+
if (assets <= 0 || lent <= 0) return 0;
|
|
21837
|
+
return Number(floatingBorrowRate) / WAD5 * (lent / assets) * 100;
|
|
21838
|
+
}
|
|
21839
|
+
function exactlyPairLtv(collateralAdjustFactor, borrowAdjustFactor) {
|
|
21840
|
+
if (!collateralAdjustFactor || !borrowAdjustFactor) return 0;
|
|
21841
|
+
return Number(collateralAdjustFactor) / WAD5 * (Number(borrowAdjustFactor) / WAD5);
|
|
21842
|
+
}
|
|
21843
|
+
|
|
21844
|
+
// src/lending/public-data/exactly/convertPublic.ts
|
|
21845
|
+
var nowSec3 = () => Math.floor(Date.now() / 1e3);
|
|
21846
|
+
function exactlyLenderKey(market) {
|
|
21847
|
+
const body = market.startsWith("0x") ? market.slice(2) : market;
|
|
21848
|
+
return "EXACTLY_" + body.toUpperCase();
|
|
21849
|
+
}
|
|
21850
|
+
function exactlyMarketFromLenderKey(lender) {
|
|
21851
|
+
if (!lender.startsWith("EXACTLY_")) return void 0;
|
|
21852
|
+
const body = lender.slice("EXACTLY_".length);
|
|
21853
|
+
return body.length === 40 ? "0x" + body.toLowerCase() : void 0;
|
|
21854
|
+
}
|
|
21855
|
+
function toHuman(raw, decimals) {
|
|
21856
|
+
return Number(raw) / 10 ** decimals;
|
|
21857
|
+
}
|
|
21858
|
+
function currencyFor3(address, decimals, symbol, tokens) {
|
|
21859
|
+
const lower = address.toLowerCase();
|
|
21860
|
+
return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
|
|
21861
|
+
}
|
|
21862
|
+
function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
21863
|
+
intrinsicYields: {},
|
|
21864
|
+
lenderRewards: {},
|
|
21865
|
+
loaded: true
|
|
21866
|
+
}, tokens = {}) {
|
|
21867
|
+
const out = {};
|
|
21868
|
+
const now = nowSec3();
|
|
21869
|
+
const markets = raw?.markets ?? [];
|
|
21870
|
+
const liqBonus = raw?.liquidationIncentive ? Number(raw.liquidationIncentive.liquidator) / 1e18 : 0;
|
|
21871
|
+
for (const m of markets) {
|
|
21872
|
+
const lenderKey = exactlyLenderKey(m.market);
|
|
21873
|
+
const assetAddr = m.asset.toLowerCase();
|
|
21874
|
+
const decimals = m.decimals;
|
|
21875
|
+
const asset = tokens[assetAddr];
|
|
21876
|
+
const priceKey = toOracleKey(asset?.assetGroup) || toGenericPriceKey(assetAddr, chainId);
|
|
21877
|
+
const price2 = exactlyUsdPrice(m.usdPrice) || (prices[priceKey] ?? 0);
|
|
21878
|
+
const livePools = m.fixedPools.filter((p) => Number(p.maturity) > now);
|
|
21879
|
+
const terms = livePools.map((p) => {
|
|
21880
|
+
const maturity = Number(p.maturity);
|
|
21881
|
+
const ttm = maturity - now;
|
|
21882
|
+
return {
|
|
21883
|
+
termId: maturity,
|
|
21884
|
+
durationSecs: ttm,
|
|
21885
|
+
durationDays: ttm / 86400,
|
|
21886
|
+
apr: exactlyWadRateToPercent(p.minBorrowRate),
|
|
21887
|
+
depositApr: exactlyWadRateToPercent(p.depositRate),
|
|
21888
|
+
available: toHuman(p.available, decimals)
|
|
21889
|
+
};
|
|
21890
|
+
});
|
|
21891
|
+
const bestFixedBorrowApr = terms.length > 0 ? Math.min(...terms.map((t) => t.apr)) : 0;
|
|
21892
|
+
const fixedBorrowed = livePools.reduce(
|
|
21893
|
+
(acc, p) => acc + toHuman(p.borrowed, decimals),
|
|
21894
|
+
0
|
|
21895
|
+
);
|
|
21896
|
+
const fixedSupplied = livePools.reduce(
|
|
21897
|
+
(acc, p) => acc + toHuman(p.supplied, decimals),
|
|
21898
|
+
0
|
|
21899
|
+
);
|
|
21900
|
+
const totalDeposits = toHuman(m.totalFloatingDepositAssets, decimals) + fixedSupplied;
|
|
21901
|
+
const totalDebt = toHuman(m.totalFloatingBorrowAssets, decimals) + fixedBorrowed;
|
|
21902
|
+
const borrowLiquidity = toHuman(m.floatingAvailableAssets, decimals);
|
|
21903
|
+
const utilization = totalDeposits > 0 ? totalDebt / totalDeposits : 0;
|
|
21904
|
+
const selfLtv = exactlyPairLtv(m.adjustFactor, m.adjustFactor);
|
|
21905
|
+
const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
|
|
21906
|
+
const entry = { data: {} };
|
|
21907
|
+
const loanUid = createMarketUid(chainId, lenderKey, assetAddr);
|
|
21908
|
+
entry.data[loanUid] = {
|
|
21909
|
+
marketUid: loanUid,
|
|
21910
|
+
name: m.assetSymbol,
|
|
21911
|
+
poolId: m.market.toLowerCase(),
|
|
21912
|
+
underlying: assetAddr,
|
|
21913
|
+
asset: currencyFor3(assetAddr, decimals, m.assetSymbol, tokens),
|
|
21914
|
+
totalDeposits,
|
|
21915
|
+
totalDebtStable: 0,
|
|
21916
|
+
totalDebt,
|
|
21917
|
+
totalLiquidity: borrowLiquidity,
|
|
21918
|
+
borrowLiquidity,
|
|
21919
|
+
totalLiquidityUSD: borrowLiquidity * price2,
|
|
21920
|
+
borrowLiquidityUSD: borrowLiquidity * price2,
|
|
21921
|
+
totalDepositsUSD: totalDeposits * price2,
|
|
21922
|
+
totalDebtStableUSD: 0,
|
|
21923
|
+
totalDebtUSD: totalDebt * price2,
|
|
21924
|
+
utilization,
|
|
21925
|
+
depositRate: exactlyFloatingDepositAprPercent(
|
|
21926
|
+
m.floatingBorrowRate,
|
|
21927
|
+
m.floatingDebt,
|
|
21928
|
+
m.floatingBackupBorrowed,
|
|
21929
|
+
m.floatingAssets
|
|
21930
|
+
),
|
|
21931
|
+
variableBorrowRate: exactlyWadRateToPercent(m.floatingBorrowRate),
|
|
21932
|
+
// Fixed-rate lender convention (Term/Lista): best fixed borrow APR on the
|
|
21933
|
+
// stable slot; the full per-maturity menu is params.market.terms.
|
|
21934
|
+
stableBorrowRate: bestFixedBorrowApr,
|
|
21935
|
+
intrinsicYield: 0,
|
|
21936
|
+
rewards: void 0,
|
|
21937
|
+
decimals,
|
|
21938
|
+
config: {
|
|
21939
|
+
0: {
|
|
21940
|
+
category: 0,
|
|
21941
|
+
borrowCollateralFactor: selfLtv,
|
|
21942
|
+
collateralFactor: selfLtv,
|
|
21943
|
+
borrowFactor: 1,
|
|
21944
|
+
liquidationPenalty: liqBonus,
|
|
21945
|
+
closeFactor: 1,
|
|
21946
|
+
collateralDisabled: false,
|
|
21947
|
+
debtDisabled: false
|
|
21948
|
+
}
|
|
21949
|
+
},
|
|
21950
|
+
closeFactor: 1,
|
|
21951
|
+
collateralActive: true,
|
|
21952
|
+
borrowingEnabled: true,
|
|
21953
|
+
depositsEnabled: true,
|
|
21954
|
+
hasStable: false,
|
|
21955
|
+
// Exactly DOES have a variable (floating) borrow side.
|
|
21956
|
+
variableBorrowDisabled: false,
|
|
21957
|
+
isActive: true,
|
|
21958
|
+
isFrozen: false
|
|
21959
|
+
};
|
|
21960
|
+
for (const c of markets) {
|
|
21961
|
+
if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
|
|
21962
|
+
const collAddr = c.asset.toLowerCase();
|
|
21963
|
+
const ltv = exactlyPairLtv(c.adjustFactor, m.adjustFactor);
|
|
21964
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
21965
|
+
entry.data[collUid] = {
|
|
21966
|
+
marketUid: collUid,
|
|
21967
|
+
name: "Collateral " + c.assetSymbol,
|
|
21968
|
+
poolId: c.market.toLowerCase(),
|
|
21969
|
+
underlying: collAddr,
|
|
21970
|
+
asset: currencyFor3(collAddr, c.decimals, c.assetSymbol, tokens),
|
|
21971
|
+
totalDeposits: 0,
|
|
21972
|
+
totalDebtStable: 0,
|
|
21973
|
+
totalDebt: 0,
|
|
21974
|
+
totalLiquidity: 0,
|
|
21975
|
+
borrowLiquidity: 0,
|
|
21976
|
+
totalLiquidityUSD: 0,
|
|
21977
|
+
borrowLiquidityUSD: 0,
|
|
21978
|
+
totalDepositsUSD: 0,
|
|
21979
|
+
totalDebtStableUSD: 0,
|
|
21980
|
+
totalDebtUSD: 0,
|
|
21981
|
+
utilization: 0,
|
|
21982
|
+
depositRate: 0,
|
|
21983
|
+
variableBorrowRate: 0,
|
|
21984
|
+
stableBorrowRate: 0,
|
|
21985
|
+
intrinsicYield: 0,
|
|
21986
|
+
rewards: void 0,
|
|
21987
|
+
decimals: c.decimals,
|
|
21988
|
+
config: {
|
|
21989
|
+
0: {
|
|
21990
|
+
category: 0,
|
|
21991
|
+
borrowCollateralFactor: ltv,
|
|
21992
|
+
collateralFactor: ltv,
|
|
21993
|
+
borrowFactor: 1,
|
|
21994
|
+
liquidationPenalty: liqBonus,
|
|
21995
|
+
closeFactor: 1,
|
|
21996
|
+
collateralDisabled: false,
|
|
21997
|
+
debtDisabled: true
|
|
21998
|
+
}
|
|
21999
|
+
},
|
|
22000
|
+
closeFactor: 1,
|
|
22001
|
+
collateralActive: true,
|
|
22002
|
+
borrowingEnabled: false,
|
|
22003
|
+
depositsEnabled: true,
|
|
22004
|
+
hasStable: false,
|
|
22005
|
+
isActive: true,
|
|
22006
|
+
isFrozen: false
|
|
22007
|
+
};
|
|
22008
|
+
}
|
|
22009
|
+
entry.params = {
|
|
22010
|
+
market: {
|
|
22011
|
+
lender: lenderKey,
|
|
22012
|
+
name: "Exactly " + m.assetSymbol,
|
|
22013
|
+
loanDecimals: decimals,
|
|
22014
|
+
collateralDecimals: decimals,
|
|
22015
|
+
// Market address doubles as the market id (it IS the lender-key body).
|
|
22016
|
+
id: m.market.toLowerCase(),
|
|
22017
|
+
// Self-pair adjust factor (WAD string); pairwise LTVs live on the
|
|
22018
|
+
// per-collateral entries above.
|
|
22019
|
+
lltv: m.adjustFactor.toString(),
|
|
22020
|
+
oracle: zeroAddress,
|
|
22021
|
+
irm: zeroAddress,
|
|
22022
|
+
collateralAddress: assetAddr,
|
|
22023
|
+
loanAddress: assetAddr,
|
|
22024
|
+
terms: terms.length > 0 ? terms : void 0,
|
|
22025
|
+
// Canonical cross-protocol fixed-term descriptor. Exactly: MENU of
|
|
22026
|
+
// calendar maturities (terms[], termId = maturity), pool-fronted
|
|
22027
|
+
// utilization-curve rates, early repay = DISCOUNT (unassigned-earnings
|
|
22028
|
+
// rebate via previewRepayAtMaturity), late repay = per-second penalty.
|
|
22029
|
+
fixedTerm: {
|
|
22030
|
+
model: "exactly",
|
|
22031
|
+
fees: { latePenaltyApr: penaltyApr },
|
|
22032
|
+
earlyRepay: { kind: "discount" },
|
|
22033
|
+
provider: { kind: "pool", address: m.market.toLowerCase() }
|
|
22034
|
+
},
|
|
22035
|
+
// Exactly-specific extras (consumed by calldata / worker-api resolvers)
|
|
22036
|
+
penaltyRate: m.penaltyRate.toString(),
|
|
22037
|
+
adjustFactor: m.adjustFactor.toString(),
|
|
22038
|
+
maxFuturePools: m.maxFuturePools,
|
|
22039
|
+
usdPrice: m.usdPrice.toString()
|
|
22040
|
+
}
|
|
22041
|
+
};
|
|
22042
|
+
entry.chainId = chainId;
|
|
22043
|
+
out[lenderKey] = entry;
|
|
22044
|
+
}
|
|
22045
|
+
return out;
|
|
22046
|
+
}
|
|
22047
|
+
var READS_PER_BRANCH = 8;
|
|
22048
|
+
var LIQUITY_PUBLIC_READ_ABI = [
|
|
22049
|
+
...LiquityTroveManagerAbi,
|
|
22050
|
+
...LiquityActivePoolAbi,
|
|
22051
|
+
...LiquityStabilityPoolAbi,
|
|
22052
|
+
...LiquityPriceFeedAbi,
|
|
22053
|
+
...LiquitySortedTrovesAbi
|
|
22054
|
+
];
|
|
22055
|
+
async function fetchLiquityMarkets(lender, chainId) {
|
|
22056
|
+
const config = liquityConfigFor(lender, chainId);
|
|
22057
|
+
const branches = liquityBranchesByChain(lender, chainId);
|
|
22058
|
+
if (!config || branches.length === 0) {
|
|
22059
|
+
return { lender, config, branches: [] };
|
|
22060
|
+
}
|
|
22061
|
+
const calls = branches.flatMap((b) => [
|
|
22062
|
+
{ address: b.troveManager, name: "getEntireBranchDebt", params: [] },
|
|
22063
|
+
{ address: b.troveManager, name: "getEntireBranchColl", params: [] },
|
|
22064
|
+
{ address: b.troveManager, name: "shutdownTime", params: [] },
|
|
22065
|
+
{ address: b.activePool, name: "aggRecordedDebt", params: [] },
|
|
22066
|
+
{ address: b.activePool, name: "aggWeightedDebtSum", params: [] },
|
|
22067
|
+
{ address: b.stabilityPool, name: "getTotalBoldDeposits", params: [] },
|
|
22068
|
+
{ address: b.priceFeed, name: "lastGoodPrice", params: [] },
|
|
22069
|
+
{ address: b.sortedTroves, name: "getSize", params: [] }
|
|
22070
|
+
]);
|
|
22071
|
+
let results = [];
|
|
22072
|
+
try {
|
|
22073
|
+
results = await multicallRetryUniversal({
|
|
22074
|
+
chain: chainId,
|
|
22075
|
+
calls,
|
|
22076
|
+
abi: LIQUITY_PUBLIC_READ_ABI,
|
|
22077
|
+
allowFailure: true
|
|
22078
|
+
});
|
|
22079
|
+
} catch {
|
|
22080
|
+
return { lender, config, branches: [] };
|
|
22081
|
+
}
|
|
22082
|
+
const val = (i) => {
|
|
22083
|
+
const r = results[i];
|
|
22084
|
+
if (typeof r === "bigint") return r;
|
|
22085
|
+
if (typeof r === "number") return BigInt(r);
|
|
22086
|
+
return null;
|
|
22087
|
+
};
|
|
22088
|
+
const out = branches.map((branch, i) => {
|
|
22089
|
+
const base = i * READS_PER_BRANCH;
|
|
22090
|
+
return {
|
|
22091
|
+
branch,
|
|
22092
|
+
entireDebt: val(base),
|
|
22093
|
+
entireColl: val(base + 1),
|
|
22094
|
+
shutdownTime: val(base + 2),
|
|
22095
|
+
aggRecordedDebt: val(base + 3),
|
|
22096
|
+
aggWeightedDebtSum: val(base + 4),
|
|
22097
|
+
spDeposits: val(base + 5),
|
|
22098
|
+
collPrice: val(base + 6),
|
|
22099
|
+
troveCount: val(base + 7)
|
|
22100
|
+
};
|
|
22101
|
+
});
|
|
22102
|
+
return { lender, config, branches: out };
|
|
22103
|
+
}
|
|
22104
|
+
function liquityLenderKey(lender, collIndex) {
|
|
22105
|
+
return `${lender}_${collIndex}`;
|
|
22106
|
+
}
|
|
22107
|
+
function liquityKeyParts(key) {
|
|
22108
|
+
const base = LIQUITY_FAMILY_LENDERS.find((b) => key.startsWith(b));
|
|
22109
|
+
if (!base) return void 0;
|
|
22110
|
+
const suffix = key.slice(base.length + 1);
|
|
22111
|
+
if (!/^\d+$/.test(suffix)) return void 0;
|
|
22112
|
+
return { lender: base, collIndex: Number(suffix) };
|
|
22113
|
+
}
|
|
22114
|
+
var WAD6 = 1e18;
|
|
22115
|
+
function toHuman2(raw, decimals) {
|
|
22116
|
+
return Number(raw) / 10 ** decimals;
|
|
22117
|
+
}
|
|
22118
|
+
function currencyFor4(address, decimals, symbol, tokens) {
|
|
22119
|
+
const lower = address.toLowerCase();
|
|
22120
|
+
return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
|
|
22121
|
+
}
|
|
22122
|
+
function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
22123
|
+
intrinsicYields: {},
|
|
22124
|
+
lenderRewards: {},
|
|
22125
|
+
loaded: true
|
|
22126
|
+
}, tokens = {}) {
|
|
22127
|
+
const out = {};
|
|
22128
|
+
const cfg = raw?.config;
|
|
22129
|
+
if (!cfg) return out;
|
|
22130
|
+
const stableAddr = cfg.boldToken.toLowerCase();
|
|
22131
|
+
const stableDecimals = cfg.boldDecimals ?? 18;
|
|
22132
|
+
const stableToken = tokens[stableAddr];
|
|
22133
|
+
const stableSymbol = stableToken?.symbol ?? "BOLD";
|
|
22134
|
+
const stablePriceKey = toOracleKey(stableToken?.assetGroup) || toGenericPriceKey(stableAddr, chainId);
|
|
22135
|
+
const stablePrice = prices[stablePriceKey] || 1;
|
|
22136
|
+
const spYieldSplit = cfg.spYieldSplit ? Number(cfg.spYieldSplit) / WAD6 : 0.75;
|
|
22137
|
+
for (const b of raw.branches ?? []) {
|
|
22138
|
+
const branch = b.branch;
|
|
22139
|
+
const lenderKey = liquityLenderKey(raw.lender, branch.collIndex);
|
|
22140
|
+
const collAddr = branch.collToken.toLowerCase();
|
|
22141
|
+
const collDecimals = branch.collDecimals;
|
|
22142
|
+
const collToken = tokens[collAddr];
|
|
22143
|
+
const collSymbol = collToken?.symbol ?? branch.name?.split(" / ").pop() ?? "COLL";
|
|
22144
|
+
const marketName = branch.name ?? `${stableSymbol} / ${collSymbol}`;
|
|
22145
|
+
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
22146
|
+
const collPrice = (b.collPrice !== null ? Number(b.collPrice) / WAD6 : 0) || (prices[collPriceKey] ?? 0);
|
|
22147
|
+
const entireDebt = b.entireDebt !== null ? toHuman2(b.entireDebt, stableDecimals) : 0;
|
|
22148
|
+
const entireColl = b.entireColl !== null ? toHuman2(b.entireColl, collDecimals) : 0;
|
|
22149
|
+
const spDeposits = b.spDeposits !== null ? toHuman2(b.spDeposits, stableDecimals) : 0;
|
|
22150
|
+
const shutdown = b.shutdownTime !== null && b.shutdownTime > 0n;
|
|
22151
|
+
const avgRate = b.aggWeightedDebtSum !== null && b.aggRecordedDebt !== null && b.aggRecordedDebt > 0n ? Number(b.aggWeightedDebtSum / b.aggRecordedDebt) / WAD6 : 0;
|
|
22152
|
+
const annualInterest = b.aggWeightedDebtSum !== null ? Number(b.aggWeightedDebtSum) / WAD6 / 10 ** stableDecimals : 0;
|
|
22153
|
+
const spApr = spDeposits > 0 ? spYieldSplit * annualInterest / spDeposits : 0;
|
|
22154
|
+
const mcr = Number(branch.mcr) / WAD6 || 1.1;
|
|
22155
|
+
const ltv = 1 / mcr;
|
|
22156
|
+
const liqPenalty = branch.liquidationPenaltySP ? Number(branch.liquidationPenaltySP) / WAD6 : 0.05;
|
|
22157
|
+
let borrowLiquidity = Math.max(
|
|
22158
|
+
0,
|
|
22159
|
+
entireColl * collPrice / mcr / stablePrice - entireDebt
|
|
22160
|
+
);
|
|
22161
|
+
if (branch.debtCap) {
|
|
22162
|
+
const cap = Number(branch.debtCap) / 10 ** stableDecimals;
|
|
22163
|
+
borrowLiquidity = Math.min(borrowLiquidity, Math.max(0, cap - entireDebt));
|
|
22164
|
+
}
|
|
22165
|
+
if (shutdown) borrowLiquidity = 0;
|
|
22166
|
+
const entry = { data: {} };
|
|
22167
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
22168
|
+
entry.data[collUid] = {
|
|
22169
|
+
marketUid: collUid,
|
|
22170
|
+
name: "Collateral " + collSymbol,
|
|
22171
|
+
poolId: branch.troveManager.toLowerCase(),
|
|
22172
|
+
underlying: collAddr,
|
|
22173
|
+
asset: currencyFor4(collAddr, collDecimals, collSymbol, tokens),
|
|
22174
|
+
totalDeposits: entireColl,
|
|
22175
|
+
totalDebtStable: 0,
|
|
22176
|
+
totalDebt: 0,
|
|
22177
|
+
totalLiquidity: entireColl,
|
|
22178
|
+
borrowLiquidity: 0,
|
|
22179
|
+
totalLiquidityUSD: entireColl * collPrice,
|
|
22180
|
+
borrowLiquidityUSD: 0,
|
|
22181
|
+
totalDepositsUSD: entireColl * collPrice,
|
|
22182
|
+
totalDebtStableUSD: 0,
|
|
22183
|
+
totalDebtUSD: 0,
|
|
22184
|
+
utilization: 0,
|
|
22185
|
+
depositRate: 0,
|
|
22186
|
+
variableBorrowRate: 0,
|
|
22187
|
+
stableBorrowRate: 0,
|
|
22188
|
+
intrinsicYield: 0,
|
|
22189
|
+
rewards: void 0,
|
|
22190
|
+
decimals: collDecimals,
|
|
22191
|
+
config: {
|
|
22192
|
+
0: {
|
|
22193
|
+
category: 0,
|
|
22194
|
+
borrowCollateralFactor: ltv,
|
|
22195
|
+
collateralFactor: ltv,
|
|
22196
|
+
borrowFactor: 1,
|
|
22197
|
+
liquidationPenalty: liqPenalty,
|
|
22198
|
+
closeFactor: 1,
|
|
22199
|
+
collateralDisabled: false,
|
|
22200
|
+
debtDisabled: true
|
|
22201
|
+
}
|
|
22202
|
+
},
|
|
22203
|
+
closeFactor: 1,
|
|
22204
|
+
collateralActive: true,
|
|
22205
|
+
borrowingEnabled: false,
|
|
22206
|
+
depositsEnabled: !shutdown,
|
|
22207
|
+
hasStable: false,
|
|
22208
|
+
isActive: !shutdown,
|
|
22209
|
+
isFrozen: shutdown
|
|
22210
|
+
};
|
|
22211
|
+
const loanUid = createMarketUid(chainId, lenderKey, stableAddr);
|
|
22212
|
+
entry.data[loanUid] = {
|
|
22213
|
+
marketUid: loanUid,
|
|
22214
|
+
name: stableSymbol,
|
|
22215
|
+
poolId: branch.stabilityPool.toLowerCase(),
|
|
22216
|
+
underlying: stableAddr,
|
|
22217
|
+
asset: currencyFor4(stableAddr, stableDecimals, stableSymbol, tokens),
|
|
22218
|
+
totalDeposits: spDeposits,
|
|
22219
|
+
totalDebtStable: 0,
|
|
22220
|
+
totalDebt: entireDebt,
|
|
22221
|
+
totalLiquidity: borrowLiquidity,
|
|
22222
|
+
borrowLiquidity,
|
|
22223
|
+
totalLiquidityUSD: borrowLiquidity * stablePrice,
|
|
22224
|
+
borrowLiquidityUSD: borrowLiquidity * stablePrice,
|
|
22225
|
+
totalDepositsUSD: spDeposits * stablePrice,
|
|
22226
|
+
totalDebtStableUSD: 0,
|
|
22227
|
+
totalDebtUSD: entireDebt * stablePrice,
|
|
22228
|
+
// Share of branch debt covered by its own Stability Pool.
|
|
22229
|
+
utilization: spDeposits > 0 ? Math.min(entireDebt / spDeposits, 1) : 0,
|
|
22230
|
+
depositRate: spApr * 100,
|
|
22231
|
+
variableBorrowRate: avgRate * 100,
|
|
22232
|
+
stableBorrowRate: 0,
|
|
22233
|
+
intrinsicYield: 0,
|
|
22234
|
+
rewards: void 0,
|
|
22235
|
+
decimals: stableDecimals,
|
|
22236
|
+
config: {
|
|
22237
|
+
0: {
|
|
22238
|
+
category: 0,
|
|
22239
|
+
borrowCollateralFactor: 0,
|
|
22240
|
+
collateralFactor: 0,
|
|
22241
|
+
borrowFactor: 1,
|
|
22242
|
+
liquidationPenalty: liqPenalty,
|
|
22243
|
+
closeFactor: 1,
|
|
22244
|
+
// SP deposits earn yield but never collateralize.
|
|
22245
|
+
collateralDisabled: true,
|
|
22246
|
+
debtDisabled: shutdown
|
|
22247
|
+
}
|
|
22248
|
+
},
|
|
22249
|
+
closeFactor: 1,
|
|
22250
|
+
collateralActive: false,
|
|
22251
|
+
borrowingEnabled: !shutdown,
|
|
22252
|
+
depositsEnabled: !shutdown,
|
|
22253
|
+
hasStable: false,
|
|
22254
|
+
variableBorrowDisabled: shutdown,
|
|
22255
|
+
isActive: !shutdown,
|
|
22256
|
+
isFrozen: shutdown
|
|
22257
|
+
};
|
|
22258
|
+
entry.params = {
|
|
22259
|
+
market: {
|
|
22260
|
+
lender: lenderKey,
|
|
22261
|
+
name: marketName,
|
|
22262
|
+
loanDecimals: stableDecimals,
|
|
22263
|
+
collateralDecimals: collDecimals,
|
|
22264
|
+
// TroveManager doubles as the branch/market id (marketUid address).
|
|
22265
|
+
id: branch.troveManager.toLowerCase(),
|
|
22266
|
+
lltv: branch.mcr,
|
|
22267
|
+
oracle: branch.priceFeed ?? zeroAddress,
|
|
22268
|
+
irm: zeroAddress,
|
|
22269
|
+
collateralAddress: collAddr,
|
|
22270
|
+
loanAddress: stableAddr,
|
|
22271
|
+
// --- Liquity-family descriptor (all values from metadata/on-chain;
|
|
22272
|
+
// consumed by calldata builders + worker-api resolvers) ---
|
|
22273
|
+
liquity: {
|
|
22274
|
+
collIndex: branch.collIndex,
|
|
22275
|
+
userSetRate: true,
|
|
22276
|
+
redemptionOrdered: true,
|
|
22277
|
+
minDebt: cfg.minDebt,
|
|
22278
|
+
minAnnualInterestRate: cfg.minAnnualInterestRate,
|
|
22279
|
+
maxAnnualInterestRate: cfg.maxAnnualInterestRate,
|
|
22280
|
+
avgBorrowRate: String(Math.round(avgRate * WAD6)),
|
|
22281
|
+
gasCompensation: cfg.gasCompensation,
|
|
22282
|
+
upfrontInterestPeriodSeconds: cfg.upfrontInterestPeriodSeconds,
|
|
22283
|
+
interestRateAdjCooldownSeconds: cfg.interestRateAdjCooldownSeconds,
|
|
22284
|
+
ccr: branch.ccr,
|
|
22285
|
+
mcr: branch.mcr,
|
|
22286
|
+
scr: branch.scr,
|
|
22287
|
+
bcr: branch.bcr,
|
|
22288
|
+
liquidationPenaltySP: branch.liquidationPenaltySP,
|
|
22289
|
+
liquidationPenaltyRedistribution: branch.liquidationPenaltyRedistribution,
|
|
22290
|
+
debtCap: branch.debtCap ?? void 0,
|
|
22291
|
+
collWrapper: branch.collWrapper ?? void 0,
|
|
22292
|
+
shutdown,
|
|
22293
|
+
troveCount: b.troveCount !== null ? Number(b.troveCount) : void 0,
|
|
22294
|
+
addresses: {
|
|
22295
|
+
borrowerOperations: branch.borrowerOperations,
|
|
22296
|
+
troveManager: branch.troveManager,
|
|
22297
|
+
troveNFT: branch.troveNFT,
|
|
22298
|
+
stabilityPool: branch.stabilityPool,
|
|
22299
|
+
sortedTroves: branch.sortedTroves,
|
|
22300
|
+
priceFeed: branch.priceFeed,
|
|
22301
|
+
collSurplusPool: branch.collSurplusPool,
|
|
22302
|
+
collateralRegistry: cfg.collateralRegistry,
|
|
22303
|
+
hintHelpers: cfg.hintHelpers,
|
|
22304
|
+
multiTroveGetter: cfg.multiTroveGetter,
|
|
22305
|
+
wethToken: cfg.wethToken
|
|
22306
|
+
}
|
|
22307
|
+
}
|
|
22308
|
+
}
|
|
22309
|
+
};
|
|
22310
|
+
entry.chainId = chainId;
|
|
22311
|
+
out[lenderKey] = entry;
|
|
22312
|
+
}
|
|
22313
|
+
return out;
|
|
22314
|
+
}
|
|
22315
|
+
var READS_PER_TM = 5;
|
|
22316
|
+
var RIVER_PUBLIC_READ_ABI = [
|
|
22317
|
+
...RiverTroveManagerAbi,
|
|
22318
|
+
...RiverStabilityPoolAbi
|
|
22319
|
+
];
|
|
22320
|
+
async function fetchRiverMarkets(lender, chainId) {
|
|
22321
|
+
const config = riverConfigFor(lender, chainId);
|
|
22322
|
+
const chainData = riverChainData(lender, chainId);
|
|
22323
|
+
const markets = chainData?.markets ?? [];
|
|
22324
|
+
if (!config || markets.length === 0) {
|
|
22325
|
+
return { lender, config, chainData, spDeposits: null, markets: [] };
|
|
22326
|
+
}
|
|
22327
|
+
const calls = [
|
|
22328
|
+
// Single per-chain StabilityPool (diamond facet) — the earn side.
|
|
22329
|
+
{ address: config.xapp, name: "getTotalDebtTokenDeposits", params: [] },
|
|
22330
|
+
...markets.flatMap((m) => [
|
|
22331
|
+
{ address: m.troveManager, name: "getEntireSystemDebt", params: [] },
|
|
22332
|
+
{ address: m.troveManager, name: "getEntireSystemColl", params: [] },
|
|
22333
|
+
{
|
|
22334
|
+
address: m.troveManager,
|
|
22335
|
+
name: "getBorrowingRateWithDecay",
|
|
22336
|
+
params: []
|
|
22337
|
+
},
|
|
22338
|
+
{ address: m.troveManager, name: "fetchPrice", params: [] },
|
|
22339
|
+
{ address: m.troveManager, name: "getTroveOwnersCount", params: [] }
|
|
22340
|
+
])
|
|
22341
|
+
];
|
|
22342
|
+
let results = [];
|
|
22343
|
+
try {
|
|
22344
|
+
results = await multicallRetryUniversal({
|
|
22345
|
+
chain: chainId,
|
|
22346
|
+
calls,
|
|
22347
|
+
abi: RIVER_PUBLIC_READ_ABI,
|
|
22348
|
+
allowFailure: true
|
|
22349
|
+
});
|
|
22350
|
+
} catch {
|
|
22351
|
+
return { lender, config, chainData, spDeposits: null, markets: [] };
|
|
22352
|
+
}
|
|
22353
|
+
const val = (i) => {
|
|
22354
|
+
const r = results[i];
|
|
22355
|
+
if (typeof r === "bigint") return r;
|
|
22356
|
+
if (typeof r === "number") return BigInt(r);
|
|
22357
|
+
return null;
|
|
22358
|
+
};
|
|
22359
|
+
const out = markets.map((market, i) => {
|
|
22360
|
+
const base = 1 + i * READS_PER_TM;
|
|
22361
|
+
return {
|
|
22362
|
+
market,
|
|
22363
|
+
entireDebt: val(base),
|
|
22364
|
+
entireColl: val(base + 1),
|
|
22365
|
+
mintFeeRate: val(base + 2),
|
|
22366
|
+
price: val(base + 3),
|
|
22367
|
+
troveCount: val(base + 4)
|
|
22368
|
+
};
|
|
22369
|
+
});
|
|
22370
|
+
return { lender, config, chainData, spDeposits: val(0), markets: out };
|
|
22371
|
+
}
|
|
22372
|
+
|
|
22373
|
+
// src/lending/public-data/river/convertPublic.ts
|
|
22374
|
+
function riverLenderKey(lender, index) {
|
|
22375
|
+
return `${lender}_${index}`;
|
|
22376
|
+
}
|
|
22377
|
+
function riverKeyParts(key) {
|
|
22378
|
+
if (!key.startsWith("RIVER_")) return void 0;
|
|
22379
|
+
const suffix = key.slice("RIVER_".length);
|
|
22380
|
+
if (!/^\d+$/.test(suffix)) return void 0;
|
|
22381
|
+
return { lender: "RIVER", index: Number(suffix) };
|
|
22382
|
+
}
|
|
22383
|
+
var WAD7 = 1e18;
|
|
22384
|
+
function toHuman3(raw, decimals) {
|
|
22385
|
+
return Number(raw) / 10 ** decimals;
|
|
22386
|
+
}
|
|
22387
|
+
function currencyFor5(address, decimals, symbol, tokens) {
|
|
22388
|
+
const lower = address.toLowerCase();
|
|
22389
|
+
return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
|
|
22390
|
+
}
|
|
22391
|
+
function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
22392
|
+
intrinsicYields: {},
|
|
22393
|
+
lenderRewards: {},
|
|
22394
|
+
loaded: true
|
|
22395
|
+
}, tokens = {}) {
|
|
22396
|
+
const out = {};
|
|
22397
|
+
const cfg = raw?.config;
|
|
22398
|
+
const chainData = raw?.chainData;
|
|
22399
|
+
if (!cfg || !chainData) return out;
|
|
22400
|
+
const debtAddr = cfg.debtToken.toLowerCase();
|
|
22401
|
+
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
22402
|
+
const debtToken = tokens[debtAddr];
|
|
22403
|
+
const debtSymbol = debtToken?.symbol ?? "satUSD";
|
|
22404
|
+
const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
|
|
22405
|
+
const debtPrice = prices[debtPriceKey] || 1;
|
|
22406
|
+
const spDeposits = raw.spDeposits !== null ? toHuman3(raw.spDeposits, debtDecimals) : 0;
|
|
22407
|
+
for (const m of raw.markets ?? []) {
|
|
22408
|
+
const market = m.market;
|
|
22409
|
+
const lenderKey = riverLenderKey(raw.lender, market.index);
|
|
22410
|
+
const collAddr = market.collToken.toLowerCase();
|
|
22411
|
+
const collDecimals = market.collDecimals;
|
|
22412
|
+
const collToken = tokens[collAddr];
|
|
22413
|
+
const collSymbol = collToken?.symbol ?? market.name?.split(" / ").pop() ?? "COLL";
|
|
22414
|
+
const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
|
|
22415
|
+
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
22416
|
+
const collPrice = (m.price !== null ? Number(m.price) / WAD7 : 0) || (prices[collPriceKey] ?? 0);
|
|
22417
|
+
const entireDebt = m.entireDebt !== null ? toHuman3(m.entireDebt, debtDecimals) : 0;
|
|
22418
|
+
const entireColl = m.entireColl !== null ? toHuman3(m.entireColl, collDecimals) : 0;
|
|
22419
|
+
const halted = !!market.paused || !!market.sunsetting;
|
|
22420
|
+
const mcr = Number(market.mcr) / WAD7 || 1.1;
|
|
22421
|
+
const ltv = 1 / mcr;
|
|
22422
|
+
const liqPenalty = Math.max(mcr - 1, 0);
|
|
22423
|
+
let borrowLiquidity = Math.max(
|
|
22424
|
+
0,
|
|
22425
|
+
entireColl * collPrice / mcr / debtPrice - entireDebt
|
|
22426
|
+
);
|
|
22427
|
+
if (market.maxSystemDebt) {
|
|
22428
|
+
const cap = Number(market.maxSystemDebt) / 10 ** debtDecimals;
|
|
22429
|
+
borrowLiquidity = Math.min(borrowLiquidity, Math.max(0, cap - entireDebt));
|
|
22430
|
+
}
|
|
22431
|
+
if (halted) borrowLiquidity = 0;
|
|
22432
|
+
const spHere = market.index === 0 ? spDeposits : 0;
|
|
22433
|
+
const entry = { data: {} };
|
|
22434
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
22435
|
+
entry.data[collUid] = {
|
|
22436
|
+
marketUid: collUid,
|
|
22437
|
+
name: "Collateral " + collSymbol,
|
|
22438
|
+
poolId: market.troveManager.toLowerCase(),
|
|
22439
|
+
underlying: collAddr,
|
|
22440
|
+
asset: currencyFor5(collAddr, collDecimals, collSymbol, tokens),
|
|
22441
|
+
totalDeposits: entireColl,
|
|
22442
|
+
totalDebtStable: 0,
|
|
22443
|
+
totalDebt: 0,
|
|
22444
|
+
totalLiquidity: entireColl,
|
|
22445
|
+
borrowLiquidity: 0,
|
|
22446
|
+
totalLiquidityUSD: entireColl * collPrice,
|
|
22447
|
+
borrowLiquidityUSD: 0,
|
|
22448
|
+
totalDepositsUSD: entireColl * collPrice,
|
|
22449
|
+
totalDebtStableUSD: 0,
|
|
22450
|
+
totalDebtUSD: 0,
|
|
22451
|
+
utilization: 0,
|
|
22452
|
+
depositRate: 0,
|
|
22453
|
+
variableBorrowRate: 0,
|
|
22454
|
+
stableBorrowRate: 0,
|
|
22455
|
+
intrinsicYield: 0,
|
|
22456
|
+
rewards: void 0,
|
|
22457
|
+
decimals: collDecimals,
|
|
22458
|
+
config: {
|
|
22459
|
+
0: {
|
|
22460
|
+
category: 0,
|
|
22461
|
+
borrowCollateralFactor: ltv,
|
|
22462
|
+
collateralFactor: ltv,
|
|
22463
|
+
borrowFactor: 1,
|
|
22464
|
+
liquidationPenalty: liqPenalty,
|
|
22465
|
+
closeFactor: 1,
|
|
22466
|
+
collateralDisabled: false,
|
|
22467
|
+
debtDisabled: true
|
|
22468
|
+
}
|
|
22469
|
+
},
|
|
22470
|
+
closeFactor: 1,
|
|
22471
|
+
collateralActive: true,
|
|
22472
|
+
borrowingEnabled: false,
|
|
22473
|
+
depositsEnabled: !halted,
|
|
22474
|
+
hasStable: false,
|
|
22475
|
+
isActive: !halted,
|
|
22476
|
+
isFrozen: halted
|
|
22477
|
+
};
|
|
22478
|
+
const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
|
|
22479
|
+
entry.data[loanUid] = {
|
|
22480
|
+
marketUid: loanUid,
|
|
22481
|
+
name: debtSymbol,
|
|
22482
|
+
poolId: cfg.xapp.toLowerCase(),
|
|
22483
|
+
underlying: debtAddr,
|
|
22484
|
+
asset: currencyFor5(debtAddr, debtDecimals, debtSymbol, tokens),
|
|
22485
|
+
totalDeposits: spHere,
|
|
22486
|
+
totalDebtStable: 0,
|
|
22487
|
+
totalDebt: entireDebt,
|
|
22488
|
+
totalLiquidity: borrowLiquidity,
|
|
22489
|
+
borrowLiquidity,
|
|
22490
|
+
totalLiquidityUSD: borrowLiquidity * debtPrice,
|
|
22491
|
+
borrowLiquidityUSD: borrowLiquidity * debtPrice,
|
|
22492
|
+
totalDepositsUSD: spHere * debtPrice,
|
|
22493
|
+
totalDebtStableUSD: 0,
|
|
22494
|
+
totalDebtUSD: entireDebt * debtPrice,
|
|
22495
|
+
utilization: 0,
|
|
22496
|
+
// No interest yield while the protocol rate is 0% — SP earns
|
|
22497
|
+
// liquidation gains + OSHI emissions only (not modeled here).
|
|
22498
|
+
depositRate: 0,
|
|
22499
|
+
variableBorrowRate: market.interestRate ? Number(market.interestRate) : 0,
|
|
22500
|
+
stableBorrowRate: 0,
|
|
22501
|
+
intrinsicYield: 0,
|
|
22502
|
+
rewards: void 0,
|
|
22503
|
+
decimals: debtDecimals,
|
|
22504
|
+
config: {
|
|
22505
|
+
0: {
|
|
22506
|
+
category: 0,
|
|
22507
|
+
borrowCollateralFactor: 0,
|
|
22508
|
+
collateralFactor: 0,
|
|
22509
|
+
borrowFactor: 1,
|
|
22510
|
+
liquidationPenalty: liqPenalty,
|
|
22511
|
+
closeFactor: 1,
|
|
22512
|
+
// SP deposits earn but never collateralize.
|
|
22513
|
+
collateralDisabled: true,
|
|
22514
|
+
debtDisabled: halted
|
|
22515
|
+
}
|
|
22516
|
+
},
|
|
22517
|
+
closeFactor: 1,
|
|
22518
|
+
collateralActive: false,
|
|
22519
|
+
borrowingEnabled: !halted,
|
|
22520
|
+
depositsEnabled: !halted,
|
|
22521
|
+
hasStable: false,
|
|
22522
|
+
variableBorrowDisabled: halted,
|
|
22523
|
+
isActive: !halted,
|
|
22524
|
+
isFrozen: halted
|
|
22525
|
+
};
|
|
22526
|
+
entry.params = {
|
|
22527
|
+
market: {
|
|
22528
|
+
lender: lenderKey,
|
|
22529
|
+
name: marketName,
|
|
22530
|
+
loanDecimals: debtDecimals,
|
|
22531
|
+
collateralDecimals: collDecimals,
|
|
22532
|
+
// TroveManager doubles as the market id (marketUid address).
|
|
22533
|
+
id: market.troveManager.toLowerCase(),
|
|
22534
|
+
lltv: market.mcr,
|
|
22535
|
+
oracle: zeroAddress,
|
|
22536
|
+
irm: zeroAddress,
|
|
22537
|
+
collateralAddress: collAddr,
|
|
22538
|
+
loanAddress: debtAddr,
|
|
22539
|
+
// --- River descriptor (verbatim metadata + live snapshot; consumed
|
|
22540
|
+
// by calldata builders + worker-api resolvers + yield-tracer) ---
|
|
22541
|
+
river: {
|
|
22542
|
+
index: market.index,
|
|
22543
|
+
minNetDebt: chainData.minNetDebt,
|
|
22544
|
+
debtGasCompensation: market.debtGasCompensation,
|
|
22545
|
+
mintFeeFloor: market.borrowingFeeFloor,
|
|
22546
|
+
mintFeeCap: market.maxBorrowingFee,
|
|
22547
|
+
/** Current decayed one-off mint-fee rate (WAD string). */
|
|
22548
|
+
mintFeeRate: m.mintFeeRate !== null ? m.mintFeeRate.toString() : void 0,
|
|
22549
|
+
interestRate: market.interestRate,
|
|
22550
|
+
maxSystemDebt: market.maxSystemDebt,
|
|
22551
|
+
paused: !!market.paused,
|
|
22552
|
+
sunsetting: !!market.sunsetting,
|
|
22553
|
+
troveCount: m.troveCount !== null ? Number(m.troveCount) : void 0,
|
|
22554
|
+
addresses: {
|
|
22555
|
+
xapp: cfg.xapp,
|
|
22556
|
+
troveManager: market.troveManager,
|
|
22557
|
+
sortedTroves: market.sortedTroves,
|
|
22558
|
+
debtToken: cfg.debtToken,
|
|
22559
|
+
periphery: cfg.periphery ?? void 0
|
|
22560
|
+
}
|
|
22561
|
+
}
|
|
22562
|
+
}
|
|
22563
|
+
};
|
|
22564
|
+
entry.chainId = chainId;
|
|
22565
|
+
out[lenderKey] = entry;
|
|
22566
|
+
}
|
|
22567
|
+
return out;
|
|
22568
|
+
}
|
|
21327
22569
|
|
|
21328
22570
|
// src/lending/public-data/silo-v2/fetchPublic.ts
|
|
21329
22571
|
var BASE_URL2 = "https://api-v3.silo.finance";
|
|
@@ -21921,12 +23163,16 @@ function convertDolomiteSubgraphMarkets(raw, chainId, prices, additionalYields,
|
|
|
21921
23163
|
}
|
|
21922
23164
|
return { data: result, chainId };
|
|
21923
23165
|
}
|
|
21924
|
-
var
|
|
23166
|
+
var warn3 = (...args) => {
|
|
21925
23167
|
};
|
|
21926
23168
|
async function getLenderDataFromApi(lender, chainId, prices, additionalYields, includeUnlisted = false) {
|
|
21927
23169
|
if (isMorphoType(lender))
|
|
21928
23170
|
return await fetchMorphoMarkets(chainId, includeUnlisted);
|
|
21929
23171
|
if (isMidnight(lender)) return await fetchMidnightMarkets(chainId);
|
|
23172
|
+
if (isTerm(lender)) return await fetchTermMarkets(chainId);
|
|
23173
|
+
if (isExactly(lender)) return await fetchExactlyMarkets(chainId);
|
|
23174
|
+
if (isLiquityFamily(lender)) return await fetchLiquityMarkets(lender, chainId);
|
|
23175
|
+
if (isRiver(lender)) return await fetchRiverMarkets(lender, chainId);
|
|
21930
23176
|
return {};
|
|
21931
23177
|
}
|
|
21932
23178
|
function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
|
|
@@ -21940,6 +23186,38 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
|
|
|
21940
23186
|
additionalYields,
|
|
21941
23187
|
list
|
|
21942
23188
|
);
|
|
23189
|
+
if (isTerm(lender))
|
|
23190
|
+
return convertTermMarketsToResponse(
|
|
23191
|
+
data,
|
|
23192
|
+
chainId,
|
|
23193
|
+
prices,
|
|
23194
|
+
additionalYields,
|
|
23195
|
+
list
|
|
23196
|
+
);
|
|
23197
|
+
if (isExactly(lender))
|
|
23198
|
+
return convertExactlyMarketsToResponse(
|
|
23199
|
+
data,
|
|
23200
|
+
chainId,
|
|
23201
|
+
prices,
|
|
23202
|
+
additionalYields,
|
|
23203
|
+
list
|
|
23204
|
+
);
|
|
23205
|
+
if (isLiquityFamily(lender))
|
|
23206
|
+
return convertLiquityMarketsToResponse(
|
|
23207
|
+
data,
|
|
23208
|
+
chainId,
|
|
23209
|
+
prices,
|
|
23210
|
+
additionalYields,
|
|
23211
|
+
list
|
|
23212
|
+
);
|
|
23213
|
+
if (isRiver(lender))
|
|
23214
|
+
return convertRiverMarketsToResponse(
|
|
23215
|
+
data,
|
|
23216
|
+
chainId,
|
|
23217
|
+
prices,
|
|
23218
|
+
additionalYields,
|
|
23219
|
+
list
|
|
23220
|
+
);
|
|
21943
23221
|
return {};
|
|
21944
23222
|
}
|
|
21945
23223
|
var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYields, tokenList = async () => {
|
|
@@ -21980,7 +23258,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
21980
23258
|
const listResult = settled[0];
|
|
21981
23259
|
const list = listResult.status === "fulfilled" ? listResult.value : {};
|
|
21982
23260
|
if (listResult.status === "rejected") {
|
|
21983
|
-
|
|
23261
|
+
warn3(
|
|
21984
23262
|
`[lending] tokenList fetch failed on chain ${chainId}:`,
|
|
21985
23263
|
listResult.reason
|
|
21986
23264
|
);
|
|
@@ -22002,13 +23280,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
22002
23280
|
if (converted[lk]) lenderData[lk] = converted[lk];
|
|
22003
23281
|
}
|
|
22004
23282
|
} catch (e) {
|
|
22005
|
-
|
|
23283
|
+
warn3(
|
|
22006
23284
|
`[lending] Silo v2 API convert failed on chain ${chainId}:`,
|
|
22007
23285
|
e?.message ?? e
|
|
22008
23286
|
);
|
|
22009
23287
|
}
|
|
22010
23288
|
} else {
|
|
22011
|
-
|
|
23289
|
+
warn3(
|
|
22012
23290
|
`[lending] Silo v2 API fetch failed on chain ${chainId}:`,
|
|
22013
23291
|
siloV2Result.reason?.message ?? siloV2Result.reason
|
|
22014
23292
|
);
|
|
@@ -22030,13 +23308,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
22030
23308
|
if (converted[lk]) lenderData[lk] = converted[lk];
|
|
22031
23309
|
}
|
|
22032
23310
|
} catch (e) {
|
|
22033
|
-
|
|
23311
|
+
warn3(
|
|
22034
23312
|
`[lending] Silo v3 API convert failed on chain ${chainId}:`,
|
|
22035
23313
|
e?.message ?? e
|
|
22036
23314
|
);
|
|
22037
23315
|
}
|
|
22038
23316
|
} else {
|
|
22039
|
-
|
|
23317
|
+
warn3(
|
|
22040
23318
|
`[lending] Silo v3 API fetch failed on chain ${chainId}:`,
|
|
22041
23319
|
siloV3Result.reason?.message ?? siloV3Result.reason
|
|
22042
23320
|
);
|
|
@@ -22046,7 +23324,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
22046
23324
|
try {
|
|
22047
23325
|
const result = settled[i + 3];
|
|
22048
23326
|
if (result.status === "rejected") {
|
|
22049
|
-
|
|
23327
|
+
warn3(
|
|
22050
23328
|
`[lending] API fetch failed for ${otherLenders[i]} on chain ${chainId}:`,
|
|
22051
23329
|
result.reason?.message ?? result.reason
|
|
22052
23330
|
);
|
|
@@ -22090,13 +23368,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
22090
23368
|
);
|
|
22091
23369
|
for (const lk of dolomiteLenders) lenderData[lk] = converted;
|
|
22092
23370
|
} catch (e) {
|
|
22093
|
-
|
|
23371
|
+
warn3(
|
|
22094
23372
|
`[lending] Dolomite subgraph convert failed on chain ${chainId}:`,
|
|
22095
23373
|
e?.message ?? e
|
|
22096
23374
|
);
|
|
22097
23375
|
}
|
|
22098
23376
|
} else if (dolomiteResult.status === "rejected") {
|
|
22099
|
-
|
|
23377
|
+
warn3(
|
|
22100
23378
|
`[lending] Dolomite subgraph fetch failed on chain ${chainId}:`,
|
|
22101
23379
|
dolomiteResult.reason?.message ?? dolomiteResult.reason
|
|
22102
23380
|
);
|
|
@@ -22104,7 +23382,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
|
|
|
22104
23382
|
}
|
|
22105
23383
|
return lenderData;
|
|
22106
23384
|
};
|
|
22107
|
-
var
|
|
23385
|
+
var warn4 = (...args) => {
|
|
22108
23386
|
};
|
|
22109
23387
|
function lenderApiOnly(lender, chainId) {
|
|
22110
23388
|
if (lender === Lender.MORPHO_BLUE) {
|
|
@@ -22124,6 +23402,10 @@ function lenderApiOnly(lender, chainId) {
|
|
|
22124
23402
|
return true;
|
|
22125
23403
|
}
|
|
22126
23404
|
if (isMidnight(lender)) return true;
|
|
23405
|
+
if (isTerm(lender)) return true;
|
|
23406
|
+
if (isExactly(lender)) return true;
|
|
23407
|
+
if (isLiquityFamily(lender)) return true;
|
|
23408
|
+
if (isRiver(lender)) return true;
|
|
22127
23409
|
return false;
|
|
22128
23410
|
}
|
|
22129
23411
|
function lenderApiWithOnChainFallback(lender, chainId) {
|
|
@@ -22151,7 +23433,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
|
|
|
22151
23433
|
includeUnlistedMorphoMarkets
|
|
22152
23434
|
);
|
|
22153
23435
|
} catch (e) {
|
|
22154
|
-
|
|
23436
|
+
warn4(
|
|
22155
23437
|
`[lending] API fetch failed for chain ${chainId}:`,
|
|
22156
23438
|
e?.message ?? e
|
|
22157
23439
|
);
|
|
@@ -22174,7 +23456,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
|
|
|
22174
23456
|
tokenList
|
|
22175
23457
|
);
|
|
22176
23458
|
} catch (e) {
|
|
22177
|
-
|
|
23459
|
+
warn4(
|
|
22178
23460
|
`[lending] on-chain fetch failed for chain ${chainId}:`,
|
|
22179
23461
|
e?.message ?? e
|
|
22180
23462
|
);
|
|
@@ -22859,6 +24141,179 @@ var buildMidnightUserCall = (chainId, _lender, account) => {
|
|
|
22859
24141
|
}
|
|
22860
24142
|
return calls;
|
|
22861
24143
|
};
|
|
24144
|
+
var termMarketCallCount = (collateralCount) => 3 + collateralCount;
|
|
24145
|
+
var buildTermUserCall = (chainId, _lender, account) => {
|
|
24146
|
+
const markets = termMarketsByChain(chainId);
|
|
24147
|
+
if (markets.length === 0) return [];
|
|
24148
|
+
const calls = [];
|
|
24149
|
+
for (const market of markets) {
|
|
24150
|
+
calls.push({ address: market.repoToken, name: "balanceOf", params: [account] });
|
|
24151
|
+
calls.push({ address: market.repoToken, name: "redemptionValue", params: [] });
|
|
24152
|
+
calls.push({
|
|
24153
|
+
address: market.servicer,
|
|
24154
|
+
name: "getBorrowerRepurchaseObligation",
|
|
24155
|
+
params: [account]
|
|
24156
|
+
});
|
|
24157
|
+
for (const c of market.collateralParams) {
|
|
24158
|
+
calls.push({
|
|
24159
|
+
address: market.collateralManager,
|
|
24160
|
+
name: "getCollateralBalance",
|
|
24161
|
+
params: [account, c.token]
|
|
24162
|
+
});
|
|
24163
|
+
}
|
|
24164
|
+
}
|
|
24165
|
+
return calls;
|
|
24166
|
+
};
|
|
24167
|
+
var buildExactlyUserCall = (chainId, _lender, account) => {
|
|
24168
|
+
const cfg = exactlyConfig()?.[chainId];
|
|
24169
|
+
if (!cfg?.previewer) return [];
|
|
24170
|
+
return [{ address: cfg.previewer, name: "exactly", params: [account] }];
|
|
24171
|
+
};
|
|
24172
|
+
var OWNER_INDEX_PROBE_COUNT = 8;
|
|
24173
|
+
var CACHE_TTL_MS = 5 * 6e4;
|
|
24174
|
+
var discoveryCache = /* @__PURE__ */ new Map();
|
|
24175
|
+
var cacheKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
|
|
24176
|
+
var getCachedLiquityTroves = (chainId, lender, account) => {
|
|
24177
|
+
const hit = discoveryCache.get(cacheKey(chainId, lender, account));
|
|
24178
|
+
if (!hit || Date.now() - hit.at > CACHE_TTL_MS) return void 0;
|
|
24179
|
+
return hit;
|
|
24180
|
+
};
|
|
24181
|
+
var ADDRESS_ADDRESS_UINT = [
|
|
24182
|
+
{ type: "address" },
|
|
24183
|
+
{ type: "address" },
|
|
24184
|
+
{ type: "uint256" }
|
|
24185
|
+
];
|
|
24186
|
+
var ADDRESS_UINT = [{ type: "address" }, { type: "uint256" }];
|
|
24187
|
+
function liquityCandidateTroveIds(account, zappers) {
|
|
24188
|
+
const user = account;
|
|
24189
|
+
const ids = [];
|
|
24190
|
+
for (let i = 0; i < OWNER_INDEX_PROBE_COUNT; i++) {
|
|
24191
|
+
ids.push(
|
|
24192
|
+
BigInt(
|
|
24193
|
+
keccak256(
|
|
24194
|
+
encodeAbiParameters(ADDRESS_ADDRESS_UINT, [
|
|
24195
|
+
user,
|
|
24196
|
+
user,
|
|
24197
|
+
BigInt(i)
|
|
24198
|
+
])
|
|
24199
|
+
)
|
|
24200
|
+
).toString()
|
|
24201
|
+
);
|
|
24202
|
+
for (const z of zappers) {
|
|
24203
|
+
const saltedIndex = BigInt(
|
|
24204
|
+
keccak256(encodeAbiParameters(ADDRESS_UINT, [user, BigInt(i)]))
|
|
24205
|
+
);
|
|
24206
|
+
ids.push(
|
|
24207
|
+
BigInt(
|
|
24208
|
+
keccak256(
|
|
24209
|
+
encodeAbiParameters(ADDRESS_ADDRESS_UINT, [
|
|
24210
|
+
z,
|
|
24211
|
+
user,
|
|
24212
|
+
saltedIndex
|
|
24213
|
+
])
|
|
24214
|
+
)
|
|
24215
|
+
).toString()
|
|
24216
|
+
);
|
|
24217
|
+
}
|
|
24218
|
+
}
|
|
24219
|
+
return ids;
|
|
24220
|
+
}
|
|
24221
|
+
var liquityBranchCallCount = (branch, troveCount) => troveCount * 2 + 4 + (branch.collSurplusPool ? 1 : 0);
|
|
24222
|
+
var buildLiquityUserCall = async (chainId, lender, account) => {
|
|
24223
|
+
const cfg = liquityConfigFor(lender, chainId);
|
|
24224
|
+
const branches = liquityBranchesByChain(lender, chainId);
|
|
24225
|
+
if (!cfg || branches.length === 0) return [];
|
|
24226
|
+
const candidates = liquityCandidateTroveIds(account, cfg.zappers ?? []);
|
|
24227
|
+
let statuses = [];
|
|
24228
|
+
try {
|
|
24229
|
+
statuses = await multicallRetryUniversal({
|
|
24230
|
+
chain: chainId,
|
|
24231
|
+
calls: branches.flatMap(
|
|
24232
|
+
(b) => candidates.map((id) => ({
|
|
24233
|
+
address: b.troveManager,
|
|
24234
|
+
name: "getTroveStatus",
|
|
24235
|
+
params: [id]
|
|
24236
|
+
}))
|
|
24237
|
+
),
|
|
24238
|
+
abi: LiquityTroveManagerAbi,
|
|
24239
|
+
allowFailure: true
|
|
24240
|
+
});
|
|
24241
|
+
} catch {
|
|
24242
|
+
return [];
|
|
24243
|
+
}
|
|
24244
|
+
const perBranch = branches.map(
|
|
24245
|
+
(_3, bi) => candidates.map((id, ci) => {
|
|
24246
|
+
const r = statuses[bi * candidates.length + ci];
|
|
24247
|
+
const status = typeof r === "bigint" || typeof r === "number" ? Number(r) : 0;
|
|
24248
|
+
if (status !== 1 && status !== 4) return void 0;
|
|
24249
|
+
return { troveId: id, zombie: status === 4 };
|
|
24250
|
+
}).filter((t) => !!t)
|
|
24251
|
+
);
|
|
24252
|
+
discoveryCache.set(cacheKey(chainId, lender, account), {
|
|
24253
|
+
perBranch,
|
|
24254
|
+
at: Date.now()
|
|
24255
|
+
});
|
|
24256
|
+
const calls = [];
|
|
24257
|
+
branches.forEach((b, bi) => {
|
|
24258
|
+
for (const t of perBranch[bi]) {
|
|
24259
|
+
calls.push({
|
|
24260
|
+
address: b.troveManager,
|
|
24261
|
+
name: "getLatestTroveData",
|
|
24262
|
+
params: [t.troveId]
|
|
24263
|
+
});
|
|
24264
|
+
calls.push({ address: b.troveNFT, name: "ownerOf", params: [t.troveId] });
|
|
24265
|
+
}
|
|
24266
|
+
calls.push({
|
|
24267
|
+
address: b.stabilityPool,
|
|
24268
|
+
name: "getCompoundedBoldDeposit",
|
|
24269
|
+
params: [account]
|
|
24270
|
+
});
|
|
24271
|
+
calls.push({
|
|
24272
|
+
address: b.stabilityPool,
|
|
24273
|
+
name: "getDepositorYieldGainWithPending",
|
|
24274
|
+
params: [account]
|
|
24275
|
+
});
|
|
24276
|
+
calls.push({
|
|
24277
|
+
address: b.stabilityPool,
|
|
24278
|
+
name: "getDepositorCollGain",
|
|
24279
|
+
params: [account]
|
|
24280
|
+
});
|
|
24281
|
+
calls.push({
|
|
24282
|
+
address: b.stabilityPool,
|
|
24283
|
+
name: "stashedColl",
|
|
24284
|
+
params: [account]
|
|
24285
|
+
});
|
|
24286
|
+
if (b.collSurplusPool) {
|
|
24287
|
+
calls.push({
|
|
24288
|
+
address: b.collSurplusPool,
|
|
24289
|
+
name: "getCollateral",
|
|
24290
|
+
params: [account]
|
|
24291
|
+
});
|
|
24292
|
+
}
|
|
24293
|
+
});
|
|
24294
|
+
return calls;
|
|
24295
|
+
};
|
|
24296
|
+
var RIVER_CALLS_PER_MARKET = 3;
|
|
24297
|
+
var buildRiverUserCall = (chainId, lender, account) => {
|
|
24298
|
+
const cfg = riverConfigFor(lender, chainId);
|
|
24299
|
+
const markets = riverChainData(lender, chainId)?.markets ?? [];
|
|
24300
|
+
if (!cfg || markets.length === 0) return [];
|
|
24301
|
+
const calls = markets.flatMap((m) => [
|
|
24302
|
+
{
|
|
24303
|
+
address: m.troveManager,
|
|
24304
|
+
name: "getEntireDebtAndColl",
|
|
24305
|
+
params: [account]
|
|
24306
|
+
},
|
|
24307
|
+
{ address: m.troveManager, name: "getTroveStatus", params: [account] },
|
|
24308
|
+
{ address: m.troveManager, name: "surplusBalances", params: [account] }
|
|
24309
|
+
]);
|
|
24310
|
+
calls.push({
|
|
24311
|
+
address: cfg.xapp,
|
|
24312
|
+
name: "getCompoundedDebtDeposit",
|
|
24313
|
+
params: [account]
|
|
24314
|
+
});
|
|
24315
|
+
return calls;
|
|
24316
|
+
};
|
|
22862
24317
|
|
|
22863
24318
|
// src/lending/user-data/fetch-balances/prepare.ts
|
|
22864
24319
|
async function buildUserCall(chainId, lender, account, params, getClient) {
|
|
@@ -22875,6 +24330,11 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
|
|
|
22875
24330
|
getClient
|
|
22876
24331
|
);
|
|
22877
24332
|
if (isMidnight(lender)) return buildMidnightUserCall(chainId, lender, account);
|
|
24333
|
+
if (isTerm(lender)) return buildTermUserCall(chainId, lender, account);
|
|
24334
|
+
if (isExactly(lender)) return buildExactlyUserCall(chainId, lender, account);
|
|
24335
|
+
if (isLiquityFamily(lender))
|
|
24336
|
+
return buildLiquityUserCall(chainId, lender, account);
|
|
24337
|
+
if (isRiver(lender)) return buildRiverUserCall(chainId, lender, account);
|
|
22878
24338
|
if (isCompoundV3Type(lender))
|
|
22879
24339
|
return buildCompoundV3UserCall(chainId, lender, account);
|
|
22880
24340
|
if (isEulerType(lender))
|
|
@@ -22897,10 +24357,14 @@ function organizeUserQueries(queries) {
|
|
|
22897
24357
|
const morphos = queries.filter((q) => isMorphoType(q.lender));
|
|
22898
24358
|
const gearbox = queries.filter((q) => isGearboxV3(q.lender));
|
|
22899
24359
|
const midnight = queries.filter((q) => isMidnight(q.lender));
|
|
22900
|
-
|
|
24360
|
+
const term = queries.filter((q) => isTerm(q.lender));
|
|
24361
|
+
const exactly = queries.filter((q) => isExactly(q.lender));
|
|
24362
|
+
const liquity = queries.filter((q) => isLiquityFamily(q.lender));
|
|
24363
|
+
const river = queries.filter((q) => isRiver(q.lender));
|
|
24364
|
+
if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0)
|
|
22901
24365
|
return queries;
|
|
22902
24366
|
const others = queries.filter(
|
|
22903
|
-
(q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender)
|
|
24367
|
+
(q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender)
|
|
22904
24368
|
);
|
|
22905
24369
|
const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
|
|
22906
24370
|
const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
|
|
@@ -22937,6 +24401,42 @@ function organizeUserQueries(queries) {
|
|
|
22937
24401
|
assets: void 0
|
|
22938
24402
|
});
|
|
22939
24403
|
}
|
|
24404
|
+
if (term.length > 0) {
|
|
24405
|
+
result.push({
|
|
24406
|
+
lender: Lender.TERM_FINANCE,
|
|
24407
|
+
account: term[0].account,
|
|
24408
|
+
params: term.map((p) => p.lender),
|
|
24409
|
+
assets: void 0
|
|
24410
|
+
});
|
|
24411
|
+
}
|
|
24412
|
+
if (exactly.length > 0) {
|
|
24413
|
+
result.push({
|
|
24414
|
+
lender: Lender.EXACTLY,
|
|
24415
|
+
account: exactly[0].account,
|
|
24416
|
+
params: exactly.map((p) => p.lender),
|
|
24417
|
+
assets: void 0
|
|
24418
|
+
});
|
|
24419
|
+
}
|
|
24420
|
+
if (river.length > 0) {
|
|
24421
|
+
result.push({
|
|
24422
|
+
lender: Lender.RIVER,
|
|
24423
|
+
account: river[0].account,
|
|
24424
|
+
params: river.map((p) => p.lender),
|
|
24425
|
+
assets: void 0
|
|
24426
|
+
});
|
|
24427
|
+
}
|
|
24428
|
+
if (liquity.length > 0) {
|
|
24429
|
+
for (const base of LIQUITY_FAMILY_LENDERS) {
|
|
24430
|
+
const members = liquity.filter((q) => q.lender.startsWith(base));
|
|
24431
|
+
if (members.length === 0) continue;
|
|
24432
|
+
result.push({
|
|
24433
|
+
lender: base,
|
|
24434
|
+
account: members[0].account,
|
|
24435
|
+
params: members.map((p) => p.lender),
|
|
24436
|
+
assets: void 0
|
|
24437
|
+
});
|
|
24438
|
+
}
|
|
24439
|
+
}
|
|
22940
24440
|
return result;
|
|
22941
24441
|
}
|
|
22942
24442
|
|
|
@@ -25257,6 +26757,593 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
25257
26757
|
totalCalls
|
|
25258
26758
|
];
|
|
25259
26759
|
};
|
|
26760
|
+
var WAD8 = 1000000000000000000n;
|
|
26761
|
+
function toBigInt11(v) {
|
|
26762
|
+
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
26763
|
+
if (typeof v === "bigint") return v;
|
|
26764
|
+
try {
|
|
26765
|
+
return BigInt(v);
|
|
26766
|
+
} catch {
|
|
26767
|
+
return 0n;
|
|
26768
|
+
}
|
|
26769
|
+
}
|
|
26770
|
+
var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
26771
|
+
const markets = termMarketsByChain(chainId);
|
|
26772
|
+
const totalCalls = markets.reduce(
|
|
26773
|
+
(sum, m) => sum + termMarketCallCount(m.collateralParams.length),
|
|
26774
|
+
0
|
|
26775
|
+
);
|
|
26776
|
+
return [
|
|
26777
|
+
(data) => {
|
|
26778
|
+
if (!data || data.length < totalCalls) return void 0;
|
|
26779
|
+
const out = {};
|
|
26780
|
+
let cursor = 0;
|
|
26781
|
+
for (const market of markets) {
|
|
26782
|
+
const balanceResult = data[cursor];
|
|
26783
|
+
const redemptionResult = data[cursor + 1];
|
|
26784
|
+
const obligationResult = data[cursor + 2];
|
|
26785
|
+
const collateralResults = market.collateralParams.map(
|
|
26786
|
+
(_c, i) => data[cursor + 3 + i]
|
|
26787
|
+
);
|
|
26788
|
+
cursor += termMarketCallCount(market.collateralParams.length);
|
|
26789
|
+
const lenderKey = termLenderKey(market.termRepoId);
|
|
26790
|
+
const metaMap = meta?.[lenderKey];
|
|
26791
|
+
if (!metaMap) continue;
|
|
26792
|
+
const loanAddr = market.purchaseToken.toLowerCase();
|
|
26793
|
+
const loanUid = createMarketUid(chainId, lenderKey, loanAddr);
|
|
26794
|
+
const loanMeta = metaMap[loanUid];
|
|
26795
|
+
const loanDisplayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
|
|
26796
|
+
const loanOraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
|
|
26797
|
+
const loanPriceHist = loanMeta?.price?.priceUsd24h ?? loanDisplayPrice;
|
|
26798
|
+
const debtUnits = toBigInt11(obligationResult);
|
|
26799
|
+
const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
|
|
26800
|
+
const debtNum = Number(debtStr);
|
|
26801
|
+
const repoBalance = toBigInt11(balanceResult);
|
|
26802
|
+
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD8;
|
|
26803
|
+
const lentUnits = repoBalance * redemptionValue / WAD8;
|
|
26804
|
+
const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
|
|
26805
|
+
const depositsNum = Number(depositsStr);
|
|
26806
|
+
const posData = {};
|
|
26807
|
+
let anyBalance = debtUnits > 0n || lentUnits > 0n;
|
|
26808
|
+
let depositsUSD24h = depositsNum * loanPriceHist;
|
|
26809
|
+
posData[loanUid] = {
|
|
26810
|
+
marketUid: loanUid,
|
|
26811
|
+
underlying: loanAddr,
|
|
26812
|
+
deposits: depositsStr,
|
|
26813
|
+
debt: debtStr,
|
|
26814
|
+
debtStable: "0",
|
|
26815
|
+
depositsUSD: depositsNum * loanDisplayPrice,
|
|
26816
|
+
debtUSD: debtNum * loanDisplayPrice,
|
|
26817
|
+
debtStableUSD: 0,
|
|
26818
|
+
depositsUSDOracle: depositsNum * loanOraclePrice,
|
|
26819
|
+
debtUSDOracle: debtNum * loanOraclePrice,
|
|
26820
|
+
debtStableUSDOracle: 0,
|
|
26821
|
+
stableBorrowRate: "0",
|
|
26822
|
+
collateralEnabled: false,
|
|
26823
|
+
claimableRewards: 0
|
|
26824
|
+
};
|
|
26825
|
+
market.collateralParams.forEach((c, i) => {
|
|
26826
|
+
const collAmt = toBigInt11(collateralResults[i]);
|
|
26827
|
+
if (collAmt === 0n) return;
|
|
26828
|
+
anyBalance = true;
|
|
26829
|
+
const collAddr = c.token.toLowerCase();
|
|
26830
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
26831
|
+
const collMeta = metaMap[collUid];
|
|
26832
|
+
const collDec = collMeta?.asset?.decimals ?? c.decimals;
|
|
26833
|
+
const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
26834
|
+
const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
|
|
26835
|
+
const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
|
|
26836
|
+
const collDepositsStr = parseRawAmount(collAmt.toString(), collDec);
|
|
26837
|
+
const collDepositsNum = Number(collDepositsStr);
|
|
26838
|
+
depositsUSD24h += collDepositsNum * collPriceHist;
|
|
26839
|
+
posData[collUid] = {
|
|
26840
|
+
marketUid: collUid,
|
|
26841
|
+
underlying: collAddr,
|
|
26842
|
+
deposits: collDepositsStr,
|
|
26843
|
+
debt: "0",
|
|
26844
|
+
debtStable: "0",
|
|
26845
|
+
depositsUSD: collDepositsNum * collDisplayPrice,
|
|
26846
|
+
debtUSD: 0,
|
|
26847
|
+
debtStableUSD: 0,
|
|
26848
|
+
depositsUSDOracle: collDepositsNum * collOraclePrice,
|
|
26849
|
+
debtUSDOracle: 0,
|
|
26850
|
+
debtStableUSDOracle: 0,
|
|
26851
|
+
stableBorrowRate: "0",
|
|
26852
|
+
collateralEnabled: true,
|
|
26853
|
+
claimableRewards: 0
|
|
26854
|
+
};
|
|
26855
|
+
});
|
|
26856
|
+
if (!anyBalance) continue;
|
|
26857
|
+
const userData = createMultiAccountTypeUserState(
|
|
26858
|
+
{
|
|
26859
|
+
chainId,
|
|
26860
|
+
account,
|
|
26861
|
+
lendingPositions: { "0": posData },
|
|
26862
|
+
modes: { "0": 0 }
|
|
26863
|
+
},
|
|
26864
|
+
metaMap,
|
|
26865
|
+
{
|
|
26866
|
+
"0": {
|
|
26867
|
+
totalDeposits24h: depositsUSD24h,
|
|
26868
|
+
totalDebt24h: debtNum * loanPriceHist
|
|
26869
|
+
}
|
|
26870
|
+
}
|
|
26871
|
+
);
|
|
26872
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
26873
|
+
}
|
|
26874
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
26875
|
+
},
|
|
26876
|
+
totalCalls
|
|
26877
|
+
];
|
|
26878
|
+
};
|
|
26879
|
+
var nowSec4 = () => Math.floor(Date.now() / 1e3);
|
|
26880
|
+
function sumPreview(positions) {
|
|
26881
|
+
return positions.reduce((acc, p) => acc + p.previewValue, 0n);
|
|
26882
|
+
}
|
|
26883
|
+
function toDetail(positions, kind, now) {
|
|
26884
|
+
return positions.map((p) => ({
|
|
26885
|
+
maturity: Number(p.maturity),
|
|
26886
|
+
kind,
|
|
26887
|
+
principal: p.position.principal.toString(),
|
|
26888
|
+
fee: p.position.fee.toString(),
|
|
26889
|
+
previewValue: p.previewValue.toString(),
|
|
26890
|
+
overdue: Number(p.maturity) < now
|
|
26891
|
+
}));
|
|
26892
|
+
}
|
|
26893
|
+
var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
26894
|
+
const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
|
|
26895
|
+
return [
|
|
26896
|
+
(data) => {
|
|
26897
|
+
if (!data || data.length < expected || expected === 0) return void 0;
|
|
26898
|
+
const res = data[0];
|
|
26899
|
+
if (!res || res === "0x" || !Array.isArray(res)) return void 0;
|
|
26900
|
+
const markets = res;
|
|
26901
|
+
const now = nowSec4();
|
|
26902
|
+
const out = {};
|
|
26903
|
+
for (const m of markets) {
|
|
26904
|
+
const lenderKey = exactlyLenderKey(m.market);
|
|
26905
|
+
const metaMap = meta?.[lenderKey];
|
|
26906
|
+
if (!metaMap) continue;
|
|
26907
|
+
const assetAddr = m.asset.toLowerCase();
|
|
26908
|
+
const loanUid = createMarketUid(chainId, lenderKey, assetAddr);
|
|
26909
|
+
const loanMeta = metaMap[loanUid];
|
|
26910
|
+
const decimals = loanMeta?.asset?.decimals ?? m.decimals;
|
|
26911
|
+
const loanDisplayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
|
|
26912
|
+
const loanOraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
|
|
26913
|
+
const loanPriceHist = loanMeta?.price?.priceUsd24h ?? loanDisplayPrice;
|
|
26914
|
+
const depositUnits = m.floatingDepositAssets + sumPreview(m.fixedDepositPositions);
|
|
26915
|
+
const debtUnits = m.floatingBorrowAssets + sumPreview(m.fixedBorrowPositions);
|
|
26916
|
+
if (depositUnits === 0n && debtUnits === 0n) continue;
|
|
26917
|
+
const depositsStr = parseRawAmount(depositUnits.toString(), decimals);
|
|
26918
|
+
const depositsNum = Number(depositsStr);
|
|
26919
|
+
const debtStr = parseRawAmount(debtUnits.toString(), decimals);
|
|
26920
|
+
const debtNum = Number(debtStr);
|
|
26921
|
+
const fixedPositions = [
|
|
26922
|
+
...toDetail(m.fixedDepositPositions, "deposit", now),
|
|
26923
|
+
...toDetail(m.fixedBorrowPositions, "borrow", now)
|
|
26924
|
+
];
|
|
26925
|
+
const posData = {};
|
|
26926
|
+
let depositsUSD24h = depositsNum * loanPriceHist;
|
|
26927
|
+
posData[loanUid] = {
|
|
26928
|
+
marketUid: loanUid,
|
|
26929
|
+
underlying: assetAddr,
|
|
26930
|
+
deposits: depositsStr,
|
|
26931
|
+
debt: debtStr,
|
|
26932
|
+
debtStable: "0",
|
|
26933
|
+
depositsUSD: depositsNum * loanDisplayPrice,
|
|
26934
|
+
debtUSD: debtNum * loanDisplayPrice,
|
|
26935
|
+
debtStableUSD: 0,
|
|
26936
|
+
depositsUSDOracle: depositsNum * loanOraclePrice,
|
|
26937
|
+
debtUSDOracle: debtNum * loanOraclePrice,
|
|
26938
|
+
debtStableUSDOracle: 0,
|
|
26939
|
+
stableBorrowRate: "0",
|
|
26940
|
+
collateralEnabled: m.isCollateral,
|
|
26941
|
+
claimableRewards: 0,
|
|
26942
|
+
// Per-maturity fixed-position detail (survives to the output — the
|
|
26943
|
+
// multi-account state builder mutates posData in place).
|
|
26944
|
+
fixedPositions: fixedPositions.length > 0 ? fixedPositions : void 0
|
|
26945
|
+
};
|
|
26946
|
+
if (debtUnits > 0n) {
|
|
26947
|
+
for (const c of markets) {
|
|
26948
|
+
if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
|
|
26949
|
+
if (!c.isCollateral) continue;
|
|
26950
|
+
const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
|
|
26951
|
+
if (cDeposit === 0n) continue;
|
|
26952
|
+
const collAddr = c.asset.toLowerCase();
|
|
26953
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
26954
|
+
const collMeta = metaMap[collUid];
|
|
26955
|
+
const collDec = collMeta?.asset?.decimals ?? c.decimals;
|
|
26956
|
+
const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
26957
|
+
const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
|
|
26958
|
+
const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
|
|
26959
|
+
const collStr = parseRawAmount(cDeposit.toString(), collDec);
|
|
26960
|
+
const collNum = Number(collStr);
|
|
26961
|
+
depositsUSD24h += collNum * collPriceHist;
|
|
26962
|
+
posData[collUid] = {
|
|
26963
|
+
marketUid: collUid,
|
|
26964
|
+
underlying: collAddr,
|
|
26965
|
+
deposits: collStr,
|
|
26966
|
+
debt: "0",
|
|
26967
|
+
debtStable: "0",
|
|
26968
|
+
depositsUSD: collNum * collDisplayPrice,
|
|
26969
|
+
debtUSD: 0,
|
|
26970
|
+
debtStableUSD: 0,
|
|
26971
|
+
depositsUSDOracle: collNum * collOraclePrice,
|
|
26972
|
+
debtUSDOracle: 0,
|
|
26973
|
+
debtStableUSDOracle: 0,
|
|
26974
|
+
stableBorrowRate: "0",
|
|
26975
|
+
collateralEnabled: true,
|
|
26976
|
+
claimableRewards: 0
|
|
26977
|
+
};
|
|
26978
|
+
}
|
|
26979
|
+
}
|
|
26980
|
+
const userData = createMultiAccountTypeUserState(
|
|
26981
|
+
{
|
|
26982
|
+
chainId,
|
|
26983
|
+
account,
|
|
26984
|
+
lendingPositions: { "0": posData },
|
|
26985
|
+
modes: { "0": 0 }
|
|
26986
|
+
},
|
|
26987
|
+
metaMap,
|
|
26988
|
+
{
|
|
26989
|
+
"0": {
|
|
26990
|
+
totalDeposits24h: depositsUSD24h,
|
|
26991
|
+
totalDebt24h: debtNum * loanPriceHist
|
|
26992
|
+
}
|
|
26993
|
+
}
|
|
26994
|
+
);
|
|
26995
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
26996
|
+
}
|
|
26997
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
26998
|
+
},
|
|
26999
|
+
expected
|
|
27000
|
+
];
|
|
27001
|
+
};
|
|
27002
|
+
var big = (v) => {
|
|
27003
|
+
try {
|
|
27004
|
+
if (typeof v === "bigint") return v;
|
|
27005
|
+
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
27006
|
+
} catch {
|
|
27007
|
+
}
|
|
27008
|
+
return 0n;
|
|
27009
|
+
};
|
|
27010
|
+
var field6 = (res, name, idx) => big(res?.[name] ?? res?.[idx]);
|
|
27011
|
+
var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
27012
|
+
const cfg = liquityConfigFor(lender, chainId);
|
|
27013
|
+
const branches = liquityBranchesByChain(lender, chainId);
|
|
27014
|
+
const discovery = getCachedLiquityTroves(chainId, lender, account);
|
|
27015
|
+
const expected = cfg && discovery ? branches.reduce(
|
|
27016
|
+
(acc, b, i) => acc + liquityBranchCallCount(b, discovery.perBranch[i]?.length ?? 0),
|
|
27017
|
+
0
|
|
27018
|
+
) : 0;
|
|
27019
|
+
return [
|
|
27020
|
+
(data) => {
|
|
27021
|
+
if (!cfg || !discovery || expected === 0) return void 0;
|
|
27022
|
+
if (!data || data.length < expected) return void 0;
|
|
27023
|
+
const stableAddr = cfg.boldToken.toLowerCase();
|
|
27024
|
+
const stableDecimals = cfg.boldDecimals ?? 18;
|
|
27025
|
+
const accountLower = account.toLowerCase();
|
|
27026
|
+
const out = {};
|
|
27027
|
+
let cursor = 0;
|
|
27028
|
+
branches.forEach((branch, bi) => {
|
|
27029
|
+
const troves = discovery.perBranch[bi] ?? [];
|
|
27030
|
+
const callCount = liquityBranchCallCount(branch, troves.length);
|
|
27031
|
+
const slice = data.slice(cursor, cursor + callCount);
|
|
27032
|
+
cursor += callCount;
|
|
27033
|
+
const lenderKey = liquityLenderKey(lender, branch.collIndex);
|
|
27034
|
+
const metaMap = meta?.[lenderKey];
|
|
27035
|
+
if (!metaMap) return;
|
|
27036
|
+
const collAddr = branch.collToken.toLowerCase();
|
|
27037
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
27038
|
+
const loanUid = createMarketUid(chainId, lenderKey, stableAddr);
|
|
27039
|
+
const collMeta = metaMap[collUid];
|
|
27040
|
+
const loanMeta = metaMap[loanUid];
|
|
27041
|
+
const collDecimals = collMeta?.asset?.decimals ?? branch.collDecimals;
|
|
27042
|
+
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
27043
|
+
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
27044
|
+
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
27045
|
+
const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
|
|
27046
|
+
const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
|
|
27047
|
+
const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
|
|
27048
|
+
const lendingPositions = {};
|
|
27049
|
+
const modes = {};
|
|
27050
|
+
const hist = {};
|
|
27051
|
+
troves.forEach((t, ti) => {
|
|
27052
|
+
const troveData = slice[ti * 2];
|
|
27053
|
+
const ownerRaw = slice[ti * 2 + 1];
|
|
27054
|
+
const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
|
|
27055
|
+
if (owner !== accountLower) return;
|
|
27056
|
+
if (!troveData || troveData === "0x") return;
|
|
27057
|
+
const entireDebt = field6(troveData, "entireDebt", 0);
|
|
27058
|
+
const entireColl = field6(troveData, "entireColl", 1);
|
|
27059
|
+
if (entireDebt === 0n && entireColl === 0n) return;
|
|
27060
|
+
const troveInfo = {
|
|
27061
|
+
troveId: t.troveId,
|
|
27062
|
+
collIndex: branch.collIndex,
|
|
27063
|
+
annualInterestRate: field6(
|
|
27064
|
+
troveData,
|
|
27065
|
+
"annualInterestRate",
|
|
27066
|
+
6
|
|
27067
|
+
).toString(),
|
|
27068
|
+
lastInterestRateAdjTime: Number(
|
|
27069
|
+
field6(troveData, "lastInterestRateAdjTime", 9)
|
|
27070
|
+
),
|
|
27071
|
+
zombie: t.zombie,
|
|
27072
|
+
redistCollGain: field6(troveData, "redistCollGain", 3).toString(),
|
|
27073
|
+
redistBoldDebtGain: field6(
|
|
27074
|
+
troveData,
|
|
27075
|
+
"redistBoldDebtGain",
|
|
27076
|
+
2
|
|
27077
|
+
).toString(),
|
|
27078
|
+
accruedInterest: field6(troveData, "accruedInterest", 4).toString(),
|
|
27079
|
+
accruedBatchManagementFee: field6(
|
|
27080
|
+
troveData,
|
|
27081
|
+
"accruedBatchManagementFee",
|
|
27082
|
+
8
|
|
27083
|
+
).toString()
|
|
27084
|
+
};
|
|
27085
|
+
const collStr = parseRawAmount(entireColl.toString(), collDecimals);
|
|
27086
|
+
const collNum = Number(collStr);
|
|
27087
|
+
const debtStr = parseRawAmount(entireDebt.toString(), stableDecimals);
|
|
27088
|
+
const debtNum = Number(debtStr);
|
|
27089
|
+
lendingPositions[t.troveId] = {
|
|
27090
|
+
[collUid]: {
|
|
27091
|
+
marketUid: collUid,
|
|
27092
|
+
underlying: collAddr,
|
|
27093
|
+
deposits: collStr,
|
|
27094
|
+
debt: "0",
|
|
27095
|
+
debtStable: "0",
|
|
27096
|
+
depositsUSD: collNum * collDisplay,
|
|
27097
|
+
debtUSD: 0,
|
|
27098
|
+
debtStableUSD: 0,
|
|
27099
|
+
depositsUSDOracle: collNum * collOracle,
|
|
27100
|
+
debtUSDOracle: 0,
|
|
27101
|
+
debtStableUSDOracle: 0,
|
|
27102
|
+
stableBorrowRate: "0",
|
|
27103
|
+
collateralEnabled: true,
|
|
27104
|
+
claimableRewards: 0
|
|
27105
|
+
},
|
|
27106
|
+
[loanUid]: {
|
|
27107
|
+
marketUid: loanUid,
|
|
27108
|
+
underlying: stableAddr,
|
|
27109
|
+
deposits: "0",
|
|
27110
|
+
debt: debtStr,
|
|
27111
|
+
debtStable: "0",
|
|
27112
|
+
depositsUSD: 0,
|
|
27113
|
+
debtUSD: debtNum * loanDisplay,
|
|
27114
|
+
debtStableUSD: 0,
|
|
27115
|
+
depositsUSDOracle: 0,
|
|
27116
|
+
debtUSDOracle: debtNum * loanOracle,
|
|
27117
|
+
debtStableUSDOracle: 0,
|
|
27118
|
+
stableBorrowRate: "0",
|
|
27119
|
+
collateralEnabled: false,
|
|
27120
|
+
claimableRewards: 0,
|
|
27121
|
+
troveInfo
|
|
27122
|
+
}
|
|
27123
|
+
};
|
|
27124
|
+
modes[t.troveId] = 0;
|
|
27125
|
+
hist[t.troveId] = {
|
|
27126
|
+
totalDeposits24h: collNum * collHist,
|
|
27127
|
+
totalDebt24h: debtNum * loanHist
|
|
27128
|
+
};
|
|
27129
|
+
});
|
|
27130
|
+
const spBase = troves.length * 2;
|
|
27131
|
+
const spDeposit = big(slice[spBase]);
|
|
27132
|
+
const spYield = big(slice[spBase + 1]);
|
|
27133
|
+
const spCollGain = big(slice[spBase + 2]);
|
|
27134
|
+
const spStashed = big(slice[spBase + 3]);
|
|
27135
|
+
const collSurplus = branch.collSurplusPool ? big(slice[spBase + 4]) : 0n;
|
|
27136
|
+
const spStable = spDeposit + spYield;
|
|
27137
|
+
const spColl = spCollGain + spStashed + collSurplus;
|
|
27138
|
+
if (spStable > 0n || spColl > 0n) {
|
|
27139
|
+
const spInfo = {
|
|
27140
|
+
deposit: spDeposit.toString(),
|
|
27141
|
+
yieldGain: spYield.toString(),
|
|
27142
|
+
collGain: spCollGain.toString(),
|
|
27143
|
+
stashedColl: spStashed.toString(),
|
|
27144
|
+
collSurplus: collSurplus.toString()
|
|
27145
|
+
};
|
|
27146
|
+
const spStableStr = parseRawAmount(
|
|
27147
|
+
spStable.toString(),
|
|
27148
|
+
stableDecimals
|
|
27149
|
+
);
|
|
27150
|
+
const spStableNum = Number(spStableStr);
|
|
27151
|
+
const spCollStr = parseRawAmount(spColl.toString(), collDecimals);
|
|
27152
|
+
const spCollNum = Number(spCollStr);
|
|
27153
|
+
lendingPositions["sp"] = {
|
|
27154
|
+
[loanUid]: {
|
|
27155
|
+
marketUid: loanUid,
|
|
27156
|
+
underlying: stableAddr,
|
|
27157
|
+
deposits: spStableStr,
|
|
27158
|
+
debt: "0",
|
|
27159
|
+
debtStable: "0",
|
|
27160
|
+
depositsUSD: spStableNum * loanDisplay,
|
|
27161
|
+
debtUSD: 0,
|
|
27162
|
+
debtStableUSD: 0,
|
|
27163
|
+
depositsUSDOracle: spStableNum * loanOracle,
|
|
27164
|
+
debtUSDOracle: 0,
|
|
27165
|
+
debtStableUSDOracle: 0,
|
|
27166
|
+
stableBorrowRate: "0",
|
|
27167
|
+
collateralEnabled: false,
|
|
27168
|
+
claimableRewards: 0,
|
|
27169
|
+
spInfo
|
|
27170
|
+
},
|
|
27171
|
+
...spColl > 0n ? {
|
|
27172
|
+
[collUid]: {
|
|
27173
|
+
marketUid: collUid,
|
|
27174
|
+
underlying: collAddr,
|
|
27175
|
+
deposits: spCollStr,
|
|
27176
|
+
debt: "0",
|
|
27177
|
+
debtStable: "0",
|
|
27178
|
+
depositsUSD: spCollNum * collDisplay,
|
|
27179
|
+
debtUSD: 0,
|
|
27180
|
+
debtStableUSD: 0,
|
|
27181
|
+
depositsUSDOracle: spCollNum * collOracle,
|
|
27182
|
+
debtUSDOracle: 0,
|
|
27183
|
+
debtStableUSDOracle: 0,
|
|
27184
|
+
stableBorrowRate: "0",
|
|
27185
|
+
collateralEnabled: false,
|
|
27186
|
+
claimableRewards: 0
|
|
27187
|
+
}
|
|
27188
|
+
} : {}
|
|
27189
|
+
};
|
|
27190
|
+
modes["sp"] = 0;
|
|
27191
|
+
hist["sp"] = {
|
|
27192
|
+
totalDeposits24h: spStableNum * loanHist + spCollNum * collHist,
|
|
27193
|
+
totalDebt24h: 0
|
|
27194
|
+
};
|
|
27195
|
+
}
|
|
27196
|
+
if (Object.keys(lendingPositions).length === 0) return;
|
|
27197
|
+
const userData = createMultiAccountTypeUserState(
|
|
27198
|
+
{
|
|
27199
|
+
chainId,
|
|
27200
|
+
account,
|
|
27201
|
+
lendingPositions,
|
|
27202
|
+
modes
|
|
27203
|
+
},
|
|
27204
|
+
metaMap,
|
|
27205
|
+
hist
|
|
27206
|
+
);
|
|
27207
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
27208
|
+
});
|
|
27209
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
27210
|
+
},
|
|
27211
|
+
expected
|
|
27212
|
+
];
|
|
27213
|
+
};
|
|
27214
|
+
var big2 = (v) => {
|
|
27215
|
+
try {
|
|
27216
|
+
if (typeof v === "bigint") return v;
|
|
27217
|
+
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
27218
|
+
} catch {
|
|
27219
|
+
}
|
|
27220
|
+
return 0n;
|
|
27221
|
+
};
|
|
27222
|
+
var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
|
|
27223
|
+
var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
27224
|
+
const cfg = riverConfigFor(lender, chainId);
|
|
27225
|
+
const markets = riverChainData(lender, chainId)?.markets ?? [];
|
|
27226
|
+
const expected = cfg && markets.length > 0 ? markets.length * RIVER_CALLS_PER_MARKET + 1 : 0;
|
|
27227
|
+
return [
|
|
27228
|
+
(data) => {
|
|
27229
|
+
if (!cfg || expected === 0) return void 0;
|
|
27230
|
+
if (!data || data.length < expected) return void 0;
|
|
27231
|
+
const debtAddr = cfg.debtToken.toLowerCase();
|
|
27232
|
+
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
27233
|
+
const out = {};
|
|
27234
|
+
const spDeposit = big2(data[markets.length * RIVER_CALLS_PER_MARKET]);
|
|
27235
|
+
markets.forEach((market, i) => {
|
|
27236
|
+
const base = i * RIVER_CALLS_PER_MARKET;
|
|
27237
|
+
const entire = data[base];
|
|
27238
|
+
const status = Number(big2(data[base + 1]));
|
|
27239
|
+
const surplus = big2(data[base + 2]);
|
|
27240
|
+
const lenderKey = riverLenderKey(lender, market.index);
|
|
27241
|
+
const metaMap = meta?.[lenderKey];
|
|
27242
|
+
if (!metaMap) return;
|
|
27243
|
+
const collAddr = market.collToken.toLowerCase();
|
|
27244
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
27245
|
+
const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
|
|
27246
|
+
const collMeta = metaMap[collUid];
|
|
27247
|
+
const loanMeta = metaMap[loanUid];
|
|
27248
|
+
const collDecimals = collMeta?.asset?.decimals ?? market.collDecimals;
|
|
27249
|
+
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
27250
|
+
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
27251
|
+
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
27252
|
+
const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
|
|
27253
|
+
const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
|
|
27254
|
+
const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
|
|
27255
|
+
const lendingPositions = {};
|
|
27256
|
+
const modes = {};
|
|
27257
|
+
const hist = {};
|
|
27258
|
+
const debt = field7(entire, "debt", 0);
|
|
27259
|
+
const coll = field7(entire, "coll", 1);
|
|
27260
|
+
if (status === 1 && (debt > 0n || coll > 0n)) {
|
|
27261
|
+
const riverInfo = {
|
|
27262
|
+
index: market.index,
|
|
27263
|
+
collateralSurplus: surplus.toString()
|
|
27264
|
+
};
|
|
27265
|
+
const collStr = parseRawAmount(coll.toString(), collDecimals);
|
|
27266
|
+
const collNum = Number(collStr);
|
|
27267
|
+
const debtStr = parseRawAmount(debt.toString(), debtDecimals);
|
|
27268
|
+
const debtNum = Number(debtStr);
|
|
27269
|
+
lendingPositions["0"] = {
|
|
27270
|
+
[collUid]: {
|
|
27271
|
+
marketUid: collUid,
|
|
27272
|
+
underlying: collAddr,
|
|
27273
|
+
deposits: collStr,
|
|
27274
|
+
debt: "0",
|
|
27275
|
+
debtStable: "0",
|
|
27276
|
+
depositsUSD: collNum * collDisplay,
|
|
27277
|
+
debtUSD: 0,
|
|
27278
|
+
debtStableUSD: 0,
|
|
27279
|
+
depositsUSDOracle: collNum * collOracle,
|
|
27280
|
+
debtUSDOracle: 0,
|
|
27281
|
+
debtStableUSDOracle: 0,
|
|
27282
|
+
stableBorrowRate: "0",
|
|
27283
|
+
collateralEnabled: true,
|
|
27284
|
+
claimableRewards: 0
|
|
27285
|
+
},
|
|
27286
|
+
[loanUid]: {
|
|
27287
|
+
marketUid: loanUid,
|
|
27288
|
+
underlying: debtAddr,
|
|
27289
|
+
deposits: "0",
|
|
27290
|
+
debt: debtStr,
|
|
27291
|
+
debtStable: "0",
|
|
27292
|
+
depositsUSD: 0,
|
|
27293
|
+
debtUSD: debtNum * loanDisplay,
|
|
27294
|
+
debtStableUSD: 0,
|
|
27295
|
+
depositsUSDOracle: 0,
|
|
27296
|
+
debtUSDOracle: debtNum * loanOracle,
|
|
27297
|
+
debtStableUSDOracle: 0,
|
|
27298
|
+
stableBorrowRate: "0",
|
|
27299
|
+
collateralEnabled: false,
|
|
27300
|
+
claimableRewards: 0,
|
|
27301
|
+
riverInfo
|
|
27302
|
+
}
|
|
27303
|
+
};
|
|
27304
|
+
modes["0"] = 0;
|
|
27305
|
+
hist["0"] = {
|
|
27306
|
+
totalDeposits24h: collNum * collHist,
|
|
27307
|
+
totalDebt24h: debtNum * loanHist
|
|
27308
|
+
};
|
|
27309
|
+
}
|
|
27310
|
+
if (market.index === 0 && spDeposit > 0n) {
|
|
27311
|
+
const spStr = parseRawAmount(spDeposit.toString(), debtDecimals);
|
|
27312
|
+
const spNum = Number(spStr);
|
|
27313
|
+
lendingPositions["sp"] = {
|
|
27314
|
+
[loanUid]: {
|
|
27315
|
+
marketUid: loanUid,
|
|
27316
|
+
underlying: debtAddr,
|
|
27317
|
+
deposits: spStr,
|
|
27318
|
+
debt: "0",
|
|
27319
|
+
debtStable: "0",
|
|
27320
|
+
depositsUSD: spNum * loanDisplay,
|
|
27321
|
+
debtUSD: 0,
|
|
27322
|
+
debtStableUSD: 0,
|
|
27323
|
+
depositsUSDOracle: spNum * loanOracle,
|
|
27324
|
+
debtUSDOracle: 0,
|
|
27325
|
+
debtStableUSDOracle: 0,
|
|
27326
|
+
stableBorrowRate: "0",
|
|
27327
|
+
collateralEnabled: false,
|
|
27328
|
+
claimableRewards: 0
|
|
27329
|
+
}
|
|
27330
|
+
};
|
|
27331
|
+
modes["sp"] = 0;
|
|
27332
|
+
hist["sp"] = { totalDeposits24h: spNum * loanHist, totalDebt24h: 0 };
|
|
27333
|
+
}
|
|
27334
|
+
if (Object.keys(lendingPositions).length === 0) return;
|
|
27335
|
+
const userData = createMultiAccountTypeUserState(
|
|
27336
|
+
{ chainId, account, lendingPositions, modes },
|
|
27337
|
+
metaMap,
|
|
27338
|
+
hist
|
|
27339
|
+
);
|
|
27340
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
27341
|
+
});
|
|
27342
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
27343
|
+
},
|
|
27344
|
+
expected
|
|
27345
|
+
];
|
|
27346
|
+
};
|
|
25260
27347
|
|
|
25261
27348
|
// src/lending/user-data/fetch-balances/parse.ts
|
|
25262
27349
|
function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
@@ -25280,6 +27367,14 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
25280
27367
|
);
|
|
25281
27368
|
if (isMidnight(lender))
|
|
25282
27369
|
return getMidnightUserDataConverter(lender, chainId, account, meta);
|
|
27370
|
+
if (isTerm(lender))
|
|
27371
|
+
return getTermUserDataConverter(lender, chainId, account, meta);
|
|
27372
|
+
if (isExactly(lender))
|
|
27373
|
+
return getExactlyUserDataConverter(lender, chainId, account, meta);
|
|
27374
|
+
if (isLiquityFamily(lender))
|
|
27375
|
+
return getLiquityUserDataConverter(lender, chainId, account, meta);
|
|
27376
|
+
if (isRiver(lender))
|
|
27377
|
+
return getRiverUserDataConverter(lender, chainId, account, meta);
|
|
25283
27378
|
if (isCompoundV3Type(lender))
|
|
25284
27379
|
return getCompoundV3UserDataConverter(
|
|
25285
27380
|
lender,
|
|
@@ -25453,9 +27548,9 @@ var MULTICALL_ADDRESS = {
|
|
|
25453
27548
|
// src/utils/multicall.ts
|
|
25454
27549
|
var { isArray } = lodash;
|
|
25455
27550
|
var maxRetries = 3;
|
|
25456
|
-
var multicallViemAbiArray = async (chainId, abi, calls,
|
|
27551
|
+
var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
|
|
25457
27552
|
try {
|
|
25458
|
-
const provider =
|
|
27553
|
+
const provider = getEvmClient18(chainId, providerId);
|
|
25459
27554
|
const abiIsArray = isArray(abi[0]);
|
|
25460
27555
|
const returnData = await provider.multicall({
|
|
25461
27556
|
allowFailure,
|
|
@@ -25481,7 +27576,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient17, retry =
|
|
|
25481
27576
|
chainId,
|
|
25482
27577
|
abi,
|
|
25483
27578
|
calls,
|
|
25484
|
-
|
|
27579
|
+
getEvmClient18,
|
|
25485
27580
|
retry,
|
|
25486
27581
|
providerId,
|
|
25487
27582
|
retries,
|
|
@@ -25491,13 +27586,13 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient17, retry =
|
|
|
25491
27586
|
);
|
|
25492
27587
|
}
|
|
25493
27588
|
};
|
|
25494
|
-
var multicallShardedAbiArray = async (chainId, abi, calls,
|
|
27589
|
+
var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
|
|
25495
27590
|
if (poolSize <= 1) {
|
|
25496
27591
|
return multicallViemAbiArray(
|
|
25497
27592
|
chainId,
|
|
25498
27593
|
abi,
|
|
25499
27594
|
calls,
|
|
25500
|
-
|
|
27595
|
+
getEvmClient18,
|
|
25501
27596
|
true,
|
|
25502
27597
|
0,
|
|
25503
27598
|
retries,
|
|
@@ -25520,7 +27615,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient17, poolS
|
|
|
25520
27615
|
const results = new Array(contracts.length);
|
|
25521
27616
|
const runBatch = async (batch, rpcId, attemptsLeft, size) => {
|
|
25522
27617
|
try {
|
|
25523
|
-
const provider =
|
|
27618
|
+
const provider = getEvmClient18(chainId, rpcId);
|
|
25524
27619
|
const returnData = await provider.multicall({
|
|
25525
27620
|
allowFailure,
|
|
25526
27621
|
batchSize: size,
|
|
@@ -30035,6 +32130,22 @@ var getAbi2 = (lender) => {
|
|
|
30035
32130
|
return [...CometAbi, ...CometExtAbi, ...CometRewardsAbi];
|
|
30036
32131
|
if (isMorphoType(lender)) return [...MorphoBlueAbi, ...MorphoLensAbi];
|
|
30037
32132
|
if (isMidnight(lender)) return [...MidnightAbi];
|
|
32133
|
+
if (isTerm(lender))
|
|
32134
|
+
return [
|
|
32135
|
+
...TermRepoTokenAbi,
|
|
32136
|
+
...TermRepoServicerAbi,
|
|
32137
|
+
...TermRepoCollateralManagerAbi
|
|
32138
|
+
];
|
|
32139
|
+
if (isExactly(lender)) return [...ExactlyPreviewerAbi];
|
|
32140
|
+
if (isLiquityFamily(lender))
|
|
32141
|
+
return [
|
|
32142
|
+
...LiquityTroveManagerAbi,
|
|
32143
|
+
...LiquityStabilityPoolAbi,
|
|
32144
|
+
...LiquityTroveNFTAbi,
|
|
32145
|
+
...LiquityCollSurplusPoolAbi
|
|
32146
|
+
];
|
|
32147
|
+
if (isRiver(lender))
|
|
32148
|
+
return [...RiverTroveManagerAbi, ...RiverStabilityPoolAbi];
|
|
30038
32149
|
if (isInit(lender)) return InitLensAbi;
|
|
30039
32150
|
if (isEulerType(lender)) return accountLensAbi;
|
|
30040
32151
|
if (isCompoundV2Type(lender))
|
|
@@ -30148,7 +32259,7 @@ function unflattenLenderData(pools) {
|
|
|
30148
32259
|
}
|
|
30149
32260
|
return result;
|
|
30150
32261
|
}
|
|
30151
|
-
var getLenderUserDataResult = async (chainId, queriesRaw,
|
|
32262
|
+
var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
|
|
30152
32263
|
const queries = organizeUserQueries(queriesRaw);
|
|
30153
32264
|
const builtCalls = await Promise.all(
|
|
30154
32265
|
queries.map(async (query3) => {
|
|
@@ -30158,7 +32269,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient17, allowF
|
|
|
30158
32269
|
query3.lender,
|
|
30159
32270
|
query3.account,
|
|
30160
32271
|
query3.params,
|
|
30161
|
-
|
|
32272
|
+
getEvmClient18
|
|
30162
32273
|
);
|
|
30163
32274
|
return callData.map((call) => ({ call, abi: call.abi ?? abi }));
|
|
30164
32275
|
})
|
|
@@ -30168,7 +32279,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient17, allowF
|
|
|
30168
32279
|
chainId,
|
|
30169
32280
|
calls.map((call) => call.abi),
|
|
30170
32281
|
calls.map((call) => call.call),
|
|
30171
|
-
|
|
32282
|
+
getEvmClient18,
|
|
30172
32283
|
concurrency,
|
|
30173
32284
|
retries,
|
|
30174
32285
|
allowFailure,
|
|
@@ -30588,7 +32699,7 @@ var MORPHO_API_CHAIN_IDS = {
|
|
|
30588
32699
|
[Chain.UNICHAIN]: 130
|
|
30589
32700
|
};
|
|
30590
32701
|
var FETCH_TIMEOUT_MS = 3e3;
|
|
30591
|
-
var
|
|
32702
|
+
var CACHE_TTL_MS2 = 2e3;
|
|
30592
32703
|
var buildSubgraphQuery = (account) => `
|
|
30593
32704
|
{
|
|
30594
32705
|
account(id: "${account.toLowerCase()}") {
|
|
@@ -30643,11 +32754,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
|
|
|
30643
32754
|
}
|
|
30644
32755
|
var inflight = /* @__PURE__ */ new Map();
|
|
30645
32756
|
var resolved = /* @__PURE__ */ new Map();
|
|
30646
|
-
function
|
|
32757
|
+
function cacheKey2(chainId, account) {
|
|
30647
32758
|
return `${chainId}:${account.toLowerCase()}`;
|
|
30648
32759
|
}
|
|
30649
32760
|
async function dedupedFetch(chainId, account, loader) {
|
|
30650
|
-
const key =
|
|
32761
|
+
const key = cacheKey2(chainId, account);
|
|
30651
32762
|
const now = Date.now();
|
|
30652
32763
|
const cached = resolved.get(key);
|
|
30653
32764
|
if (cached && cached.expiresAt > now) {
|
|
@@ -30656,7 +32767,7 @@ async function dedupedFetch(chainId, account, loader) {
|
|
|
30656
32767
|
const existing = inflight.get(key);
|
|
30657
32768
|
if (existing) return existing;
|
|
30658
32769
|
const promise = loader().then((value) => {
|
|
30659
|
-
resolved.set(key, { value, expiresAt: Date.now() +
|
|
32770
|
+
resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS2 });
|
|
30660
32771
|
return value;
|
|
30661
32772
|
}).finally(() => {
|
|
30662
32773
|
inflight.delete(key);
|
|
@@ -30788,8 +32899,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
|
|
|
30788
32899
|
return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
|
|
30789
32900
|
}
|
|
30790
32901
|
function calculateWeightedAprs(items) {
|
|
30791
|
-
const wa = (
|
|
30792
|
-
items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[
|
|
32902
|
+
const wa = (field8, weightField) => calculateWeightedAverage(
|
|
32903
|
+
items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field8], weight: Math.abs(i[weightField]) }))
|
|
30793
32904
|
);
|
|
30794
32905
|
return {
|
|
30795
32906
|
apr: wa("apr", "nav"),
|
|
@@ -32059,8 +34170,8 @@ var rswethFetcher = {
|
|
|
32059
34170
|
};
|
|
32060
34171
|
|
|
32061
34172
|
// src/yields/intrinsic/annualizeRate.ts
|
|
32062
|
-
var
|
|
32063
|
-
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (
|
|
34173
|
+
var YEAR_SECONDS2 = 365 * 24 * 60 * 60;
|
|
34174
|
+
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS2 / elapsedSeconds) * 100;
|
|
32064
34175
|
var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
|
|
32065
34176
|
const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
|
|
32066
34177
|
return annualizeGrowthPercent(growth, elapsedSeconds);
|
|
@@ -32528,8 +34639,8 @@ var TIMEOUT_MS = 8e3;
|
|
|
32528
34639
|
var slisBnbFetcher = {
|
|
32529
34640
|
label: "SLISBNB",
|
|
32530
34641
|
fetch: async () => {
|
|
32531
|
-
const
|
|
32532
|
-
const url = `${HISTORY_URL}?name=slisBNBRate&cycle=1&startTime=${
|
|
34642
|
+
const nowSec5 = Math.floor(Date.now() / 1e3);
|
|
34643
|
+
const url = `${HISTORY_URL}?name=slisBNBRate&cycle=1&startTime=${nowSec5 - LOOKBACK_SECONDS}&endTime=${nowSec5}`;
|
|
32533
34644
|
const controller = new AbortController();
|
|
32534
34645
|
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
32535
34646
|
try {
|
|
@@ -38811,10 +40922,10 @@ function createAssetArrayPerChain() {
|
|
|
38811
40922
|
return assetsPerChain;
|
|
38812
40923
|
}
|
|
38813
40924
|
var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
|
|
38814
|
-
function createSimpleArrayPerChain(fork,
|
|
40925
|
+
function createSimpleArrayPerChain(fork, field8 = void 0) {
|
|
38815
40926
|
let pools = {};
|
|
38816
40927
|
Object.entries(fork ?? {}).forEach(([b2, data]) => {
|
|
38817
|
-
Object.entries(
|
|
40928
|
+
Object.entries(field8 ? data[field8] : data).forEach(
|
|
38818
40929
|
([chainId, address]) => {
|
|
38819
40930
|
if (!pools[chainId]) pools[chainId] = [];
|
|
38820
40931
|
pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
|
|
@@ -41023,9 +43134,9 @@ query EvkByAssets($assets: [Bytes!]!) {
|
|
|
41023
43134
|
`;
|
|
41024
43135
|
var ZERO = 0n;
|
|
41025
43136
|
var RAY_TO_PERCENT3 = 1e25;
|
|
41026
|
-
function readAddress2(
|
|
41027
|
-
if (!
|
|
41028
|
-
return
|
|
43137
|
+
function readAddress2(field8) {
|
|
43138
|
+
if (!field8) return void 0;
|
|
43139
|
+
return field8.toLowerCase();
|
|
41029
43140
|
}
|
|
41030
43141
|
function parseVaultFee(v) {
|
|
41031
43142
|
if (v.performanceFee == null) return 0;
|
|
@@ -41459,7 +43570,7 @@ var Multicall3BalanceAbi = [
|
|
|
41459
43570
|
outputs: [{ type: "uint256" }]
|
|
41460
43571
|
}
|
|
41461
43572
|
];
|
|
41462
|
-
var
|
|
43573
|
+
var toBigInt12 = (v) => {
|
|
41463
43574
|
if (v === void 0 || v === null) return void 0;
|
|
41464
43575
|
if (typeof v === "bigint") return v;
|
|
41465
43576
|
if (typeof v === "number") return BigInt(v);
|
|
@@ -41483,12 +43594,12 @@ var readerBeetsStS = (entry) => ({
|
|
|
41483
43594
|
],
|
|
41484
43595
|
abis: [TotalSupplyAbi, BeetsStSAbi, BeetsStSAbi],
|
|
41485
43596
|
parse: ([supply, rate, pool]) => {
|
|
41486
|
-
const totalSupply =
|
|
41487
|
-
const exchangeRate =
|
|
43597
|
+
const totalSupply = toBigInt12(supply);
|
|
43598
|
+
const exchangeRate = toBigInt12(rate);
|
|
41488
43599
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41489
43600
|
return void 0;
|
|
41490
43601
|
}
|
|
41491
|
-
const liquidity =
|
|
43602
|
+
const liquidity = toBigInt12(pool);
|
|
41492
43603
|
return {
|
|
41493
43604
|
totalAssets: totalSupply * exchangeRate / ONE_E186,
|
|
41494
43605
|
totalSupply,
|
|
@@ -41529,12 +43640,12 @@ var readerBenqiSavax = (entry) => ({
|
|
|
41529
43640
|
],
|
|
41530
43641
|
abis: [TotalSupplyAbi, BenqiSavaxAbi, BenqiSavaxAbi],
|
|
41531
43642
|
parse: ([supply, rate, totalPooled]) => {
|
|
41532
|
-
const totalSupply =
|
|
41533
|
-
const exchangeRate =
|
|
43643
|
+
const totalSupply = toBigInt12(supply);
|
|
43644
|
+
const exchangeRate = toBigInt12(rate);
|
|
41534
43645
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41535
43646
|
return void 0;
|
|
41536
43647
|
}
|
|
41537
|
-
const totalAssets =
|
|
43648
|
+
const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E186;
|
|
41538
43649
|
return {
|
|
41539
43650
|
totalAssets,
|
|
41540
43651
|
totalSupply,
|
|
@@ -41548,7 +43659,7 @@ var readerBgtWrapper1to1 = (entry) => ({
|
|
|
41548
43659
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
41549
43660
|
abis: [TotalSupplyAbi],
|
|
41550
43661
|
parse: ([supply]) => {
|
|
41551
|
-
const totalSupply =
|
|
43662
|
+
const totalSupply = toBigInt12(supply);
|
|
41552
43663
|
if (totalSupply === void 0) return void 0;
|
|
41553
43664
|
return {
|
|
41554
43665
|
totalAssets: totalSupply,
|
|
@@ -41577,8 +43688,8 @@ var readerDineroBeraEth = (entry) => ({
|
|
|
41577
43688
|
],
|
|
41578
43689
|
abis: [TotalSupplyAbi, DineroBeraEthAbi],
|
|
41579
43690
|
parse: ([supply, rate]) => {
|
|
41580
|
-
const totalSupply =
|
|
41581
|
-
const exchangeRate =
|
|
43691
|
+
const totalSupply = toBigInt12(supply);
|
|
43692
|
+
const exchangeRate = toBigInt12(rate);
|
|
41582
43693
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41583
43694
|
return void 0;
|
|
41584
43695
|
}
|
|
@@ -41599,9 +43710,9 @@ var readerErc4626 = (entry) => ({
|
|
|
41599
43710
|
],
|
|
41600
43711
|
abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
|
|
41601
43712
|
parse: ([assets, supply, rate]) => {
|
|
41602
|
-
const totalAssets =
|
|
41603
|
-
const totalSupply =
|
|
41604
|
-
const exchangeRate =
|
|
43713
|
+
const totalAssets = toBigInt12(assets);
|
|
43714
|
+
const totalSupply = toBigInt12(supply);
|
|
43715
|
+
const exchangeRate = toBigInt12(rate);
|
|
41605
43716
|
if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
|
|
41606
43717
|
return void 0;
|
|
41607
43718
|
}
|
|
@@ -41616,9 +43727,9 @@ var readerErc4626PreviewRedeem = (entry) => ({
|
|
|
41616
43727
|
],
|
|
41617
43728
|
abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
|
|
41618
43729
|
parse: ([assets, supply, rate]) => {
|
|
41619
|
-
const totalAssets =
|
|
41620
|
-
const totalSupply =
|
|
41621
|
-
const exchangeRate =
|
|
43730
|
+
const totalAssets = toBigInt12(assets);
|
|
43731
|
+
const totalSupply = toBigInt12(supply);
|
|
43732
|
+
const exchangeRate = toBigInt12(rate);
|
|
41622
43733
|
if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
|
|
41623
43734
|
return void 0;
|
|
41624
43735
|
}
|
|
@@ -41678,15 +43789,15 @@ var readerEtherFiWeEth = (entry) => {
|
|
|
41678
43789
|
calls,
|
|
41679
43790
|
abis,
|
|
41680
43791
|
parse: (slice) => {
|
|
41681
|
-
const totalSupply =
|
|
41682
|
-
const exchangeRate =
|
|
43792
|
+
const totalSupply = toBigInt12(slice[0]);
|
|
43793
|
+
const exchangeRate = toBigInt12(slice[1]);
|
|
41683
43794
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41684
43795
|
return void 0;
|
|
41685
43796
|
}
|
|
41686
43797
|
let liquidity;
|
|
41687
43798
|
if (lp) {
|
|
41688
|
-
const lpBalance =
|
|
41689
|
-
const locked =
|
|
43799
|
+
const lpBalance = toBigInt12(slice[2]);
|
|
43800
|
+
const locked = toBigInt12(slice[3]);
|
|
41690
43801
|
if (lpBalance !== void 0 && locked !== void 0) {
|
|
41691
43802
|
liquidity = lpBalance > locked ? lpBalance - locked : 0n;
|
|
41692
43803
|
}
|
|
@@ -41720,7 +43831,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
41720
43831
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
41721
43832
|
abis: [TotalSupplyAbi],
|
|
41722
43833
|
parse: ([supply]) => {
|
|
41723
|
-
const totalSupply =
|
|
43834
|
+
const totalSupply = toBigInt12(supply);
|
|
41724
43835
|
if (totalSupply === void 0) return void 0;
|
|
41725
43836
|
return {
|
|
41726
43837
|
totalAssets: totalSupply,
|
|
@@ -41737,8 +43848,8 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
41737
43848
|
],
|
|
41738
43849
|
abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
|
|
41739
43850
|
parse: ([supply, rate]) => {
|
|
41740
|
-
const totalSupply =
|
|
41741
|
-
const exchangeRate =
|
|
43851
|
+
const totalSupply = toBigInt12(supply);
|
|
43852
|
+
const exchangeRate = toBigInt12(rate);
|
|
41742
43853
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41743
43854
|
return void 0;
|
|
41744
43855
|
}
|
|
@@ -41770,7 +43881,7 @@ var readerKelpRsEth = (entry) => {
|
|
|
41770
43881
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
41771
43882
|
abis: [TotalSupplyAbi],
|
|
41772
43883
|
parse: ([supply]) => {
|
|
41773
|
-
const totalSupply =
|
|
43884
|
+
const totalSupply = toBigInt12(supply);
|
|
41774
43885
|
if (totalSupply === void 0) return void 0;
|
|
41775
43886
|
return {
|
|
41776
43887
|
totalAssets: totalSupply,
|
|
@@ -41787,8 +43898,8 @@ var readerKelpRsEth = (entry) => {
|
|
|
41787
43898
|
],
|
|
41788
43899
|
abis: [TotalSupplyAbi, KelpLrtOracleAbi],
|
|
41789
43900
|
parse: ([supply, rate]) => {
|
|
41790
|
-
const totalSupply =
|
|
41791
|
-
const exchangeRate =
|
|
43901
|
+
const totalSupply = toBigInt12(supply);
|
|
43902
|
+
const exchangeRate = toBigInt12(rate);
|
|
41792
43903
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41793
43904
|
return void 0;
|
|
41794
43905
|
}
|
|
@@ -41820,7 +43931,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
41820
43931
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
41821
43932
|
abis: [TotalSupplyAbi],
|
|
41822
43933
|
parse: ([supply]) => {
|
|
41823
|
-
const totalSupply =
|
|
43934
|
+
const totalSupply = toBigInt12(supply);
|
|
41824
43935
|
if (totalSupply === void 0) return void 0;
|
|
41825
43936
|
return {
|
|
41826
43937
|
totalAssets: totalSupply,
|
|
@@ -41837,8 +43948,8 @@ var readerKinetiqKHype = (entry) => {
|
|
|
41837
43948
|
],
|
|
41838
43949
|
abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
|
|
41839
43950
|
parse: ([supply, rate]) => {
|
|
41840
|
-
const totalSupply =
|
|
41841
|
-
const exchangeRate =
|
|
43951
|
+
const totalSupply = toBigInt12(supply);
|
|
43952
|
+
const exchangeRate = toBigInt12(rate);
|
|
41842
43953
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41843
43954
|
return void 0;
|
|
41844
43955
|
}
|
|
@@ -41878,12 +43989,12 @@ var readerLairStKaia = (entry) => ({
|
|
|
41878
43989
|
],
|
|
41879
43990
|
abis: [TotalSupplyAbi, LairStKaiaAbi, LairStKaiaAbi],
|
|
41880
43991
|
parse: ([supply, rate, totalStaking]) => {
|
|
41881
|
-
const totalSupply =
|
|
41882
|
-
const exchangeRate =
|
|
43992
|
+
const totalSupply = toBigInt12(supply);
|
|
43993
|
+
const exchangeRate = toBigInt12(rate);
|
|
41883
43994
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41884
43995
|
return void 0;
|
|
41885
43996
|
}
|
|
41886
|
-
const totalAssets =
|
|
43997
|
+
const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E186;
|
|
41887
43998
|
return {
|
|
41888
43999
|
totalAssets,
|
|
41889
44000
|
totalSupply,
|
|
@@ -41911,8 +44022,8 @@ var readerLidoWstEth = (entry) => ({
|
|
|
41911
44022
|
],
|
|
41912
44023
|
abis: [TotalSupplyAbi, LidoWstEthAbi],
|
|
41913
44024
|
parse: ([supply, rate]) => {
|
|
41914
|
-
const totalSupply =
|
|
41915
|
-
const exchangeRate =
|
|
44025
|
+
const totalSupply = toBigInt12(supply);
|
|
44026
|
+
const exchangeRate = toBigInt12(rate);
|
|
41916
44027
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41917
44028
|
return void 0;
|
|
41918
44029
|
}
|
|
@@ -41950,7 +44061,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
41950
44061
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
41951
44062
|
abis: [TotalSupplyAbi],
|
|
41952
44063
|
parse: ([supply]) => {
|
|
41953
|
-
const totalSupply =
|
|
44064
|
+
const totalSupply = toBigInt12(supply);
|
|
41954
44065
|
if (totalSupply === void 0) return void 0;
|
|
41955
44066
|
return {
|
|
41956
44067
|
totalAssets: totalSupply,
|
|
@@ -41968,12 +44079,12 @@ var readerListaSlisBnb = (entry) => {
|
|
|
41968
44079
|
],
|
|
41969
44080
|
abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
|
|
41970
44081
|
parse: ([supply, rate, pooled]) => {
|
|
41971
|
-
const totalSupply =
|
|
41972
|
-
const exchangeRate =
|
|
44082
|
+
const totalSupply = toBigInt12(supply);
|
|
44083
|
+
const exchangeRate = toBigInt12(rate);
|
|
41973
44084
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
41974
44085
|
return void 0;
|
|
41975
44086
|
}
|
|
41976
|
-
const pooledBnb =
|
|
44087
|
+
const pooledBnb = toBigInt12(pooled);
|
|
41977
44088
|
const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E186;
|
|
41978
44089
|
return { totalAssets, totalSupply, exchangeRate };
|
|
41979
44090
|
}
|
|
@@ -41999,7 +44110,7 @@ var readerMantleMEth = (entry) => {
|
|
|
41999
44110
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42000
44111
|
abis: [TotalSupplyAbi],
|
|
42001
44112
|
parse: ([supply]) => {
|
|
42002
|
-
const totalSupply =
|
|
44113
|
+
const totalSupply = toBigInt12(supply);
|
|
42003
44114
|
if (totalSupply === void 0) return void 0;
|
|
42004
44115
|
return {
|
|
42005
44116
|
totalAssets: totalSupply,
|
|
@@ -42016,8 +44127,8 @@ var readerMantleMEth = (entry) => {
|
|
|
42016
44127
|
],
|
|
42017
44128
|
abis: [TotalSupplyAbi, MantleStakingAbi],
|
|
42018
44129
|
parse: ([supply, rate]) => {
|
|
42019
|
-
const totalSupply =
|
|
42020
|
-
const exchangeRate =
|
|
44130
|
+
const totalSupply = toBigInt12(supply);
|
|
44131
|
+
const exchangeRate = toBigInt12(rate);
|
|
42021
44132
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42022
44133
|
return void 0;
|
|
42023
44134
|
}
|
|
@@ -42038,7 +44149,7 @@ var readerOffChain = (entry) => {
|
|
|
42038
44149
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42039
44150
|
abis: [TotalSupplyAbi],
|
|
42040
44151
|
parse: ([supply]) => {
|
|
42041
|
-
const totalSupply =
|
|
44152
|
+
const totalSupply = toBigInt12(supply);
|
|
42042
44153
|
if (totalSupply === void 0) return void 0;
|
|
42043
44154
|
return {
|
|
42044
44155
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
@@ -42072,7 +44183,7 @@ var readerRenzoEzEth = (entry) => {
|
|
|
42072
44183
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42073
44184
|
abis: [TotalSupplyAbi],
|
|
42074
44185
|
parse: ([supply]) => {
|
|
42075
|
-
const totalSupply =
|
|
44186
|
+
const totalSupply = toBigInt12(supply);
|
|
42076
44187
|
if (totalSupply === void 0) return void 0;
|
|
42077
44188
|
return {
|
|
42078
44189
|
totalAssets: totalSupply,
|
|
@@ -42089,9 +44200,9 @@ var readerRenzoEzEth = (entry) => {
|
|
|
42089
44200
|
],
|
|
42090
44201
|
abis: [TotalSupplyAbi, RenzoRestakeManagerAbi],
|
|
42091
44202
|
parse: ([supply, tvls]) => {
|
|
42092
|
-
const totalSupply =
|
|
44203
|
+
const totalSupply = toBigInt12(supply);
|
|
42093
44204
|
if (totalSupply === void 0 || totalSupply === 0n) return void 0;
|
|
42094
|
-
const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ?
|
|
44205
|
+
const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ? toBigInt12(tvls[2]) : void 0;
|
|
42095
44206
|
if (totalTvl === void 0) return void 0;
|
|
42096
44207
|
return {
|
|
42097
44208
|
totalAssets: totalTvl,
|
|
@@ -42145,12 +44256,12 @@ var readerRocketReth = (entry) => {
|
|
|
42145
44256
|
calls,
|
|
42146
44257
|
abis,
|
|
42147
44258
|
parse: (slice) => {
|
|
42148
|
-
const totalSupply =
|
|
42149
|
-
const exchangeRate =
|
|
44259
|
+
const totalSupply = toBigInt12(slice[0]);
|
|
44260
|
+
const exchangeRate = toBigInt12(slice[1]);
|
|
42150
44261
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42151
44262
|
return void 0;
|
|
42152
44263
|
}
|
|
42153
|
-
const liquidity = depositPool ?
|
|
44264
|
+
const liquidity = depositPool ? toBigInt12(slice[2]) : void 0;
|
|
42154
44265
|
return {
|
|
42155
44266
|
totalAssets: totalSupply * exchangeRate / ONE_E186,
|
|
42156
44267
|
totalSupply,
|
|
@@ -42189,7 +44300,7 @@ var readerStaderEthx = (entry) => {
|
|
|
42189
44300
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42190
44301
|
abis: [TotalSupplyAbi],
|
|
42191
44302
|
parse: ([supply]) => {
|
|
42192
|
-
const totalSupply =
|
|
44303
|
+
const totalSupply = toBigInt12(supply);
|
|
42193
44304
|
if (totalSupply === void 0) return void 0;
|
|
42194
44305
|
return {
|
|
42195
44306
|
totalAssets: totalSupply,
|
|
@@ -42206,8 +44317,8 @@ var readerStaderEthx = (entry) => {
|
|
|
42206
44317
|
],
|
|
42207
44318
|
abis: [TotalSupplyAbi, StaderEthxAbi],
|
|
42208
44319
|
parse: ([supply, rate]) => {
|
|
42209
|
-
const totalSupply =
|
|
42210
|
-
const exchangeRate =
|
|
44320
|
+
const totalSupply = toBigInt12(supply);
|
|
44321
|
+
const exchangeRate = toBigInt12(rate);
|
|
42211
44322
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42212
44323
|
return void 0;
|
|
42213
44324
|
}
|
|
@@ -42235,10 +44346,10 @@ var readerStaderMaticX = (entry) => {
|
|
|
42235
44346
|
],
|
|
42236
44347
|
abis: [TotalSupplyAbi, StaderMaticXAbi],
|
|
42237
44348
|
parse: ([supply, tup]) => {
|
|
42238
|
-
const totalSupply =
|
|
44349
|
+
const totalSupply = toBigInt12(supply);
|
|
42239
44350
|
if (!Array.isArray(tup) || tup.length < 3) return void 0;
|
|
42240
|
-
const amountInMatic =
|
|
42241
|
-
const totalPooledMatic =
|
|
44351
|
+
const amountInMatic = toBigInt12(tup[0]);
|
|
44352
|
+
const totalPooledMatic = toBigInt12(tup[2]);
|
|
42242
44353
|
if (totalSupply === void 0 || amountInMatic === void 0) {
|
|
42243
44354
|
return void 0;
|
|
42244
44355
|
}
|
|
@@ -42271,7 +44382,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
42271
44382
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42272
44383
|
abis: [TotalSupplyAbi],
|
|
42273
44384
|
parse: ([supply]) => {
|
|
42274
|
-
const totalSupply =
|
|
44385
|
+
const totalSupply = toBigInt12(supply);
|
|
42275
44386
|
if (totalSupply === void 0) return void 0;
|
|
42276
44387
|
return {
|
|
42277
44388
|
totalAssets: totalSupply,
|
|
@@ -42288,8 +44399,8 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
42288
44399
|
],
|
|
42289
44400
|
abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
|
|
42290
44401
|
parse: ([supply, rate]) => {
|
|
42291
|
-
const totalSupply =
|
|
42292
|
-
const exchangeRate =
|
|
44402
|
+
const totalSupply = toBigInt12(supply);
|
|
44403
|
+
const exchangeRate = toBigInt12(rate);
|
|
42293
44404
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42294
44405
|
return void 0;
|
|
42295
44406
|
}
|
|
@@ -42321,7 +44432,7 @@ var readerStCelo = (entry) => {
|
|
|
42321
44432
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42322
44433
|
abis: [TotalSupplyAbi],
|
|
42323
44434
|
parse: ([supply]) => {
|
|
42324
|
-
const totalSupply =
|
|
44435
|
+
const totalSupply = toBigInt12(supply);
|
|
42325
44436
|
if (totalSupply === void 0) return void 0;
|
|
42326
44437
|
return {
|
|
42327
44438
|
totalAssets: totalSupply,
|
|
@@ -42338,8 +44449,8 @@ var readerStCelo = (entry) => {
|
|
|
42338
44449
|
],
|
|
42339
44450
|
abis: [TotalSupplyAbi, StCeloManagerAbi],
|
|
42340
44451
|
parse: ([supply, rate]) => {
|
|
42341
|
-
const totalSupply =
|
|
42342
|
-
const exchangeRate =
|
|
44452
|
+
const totalSupply = toBigInt12(supply);
|
|
44453
|
+
const exchangeRate = toBigInt12(rate);
|
|
42343
44454
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42344
44455
|
return void 0;
|
|
42345
44456
|
}
|
|
@@ -42371,8 +44482,8 @@ var readerSwellGetRate = (entry) => ({
|
|
|
42371
44482
|
],
|
|
42372
44483
|
abis: [TotalSupplyAbi, SwellGetRateAbi],
|
|
42373
44484
|
parse: ([supply, rate]) => {
|
|
42374
|
-
const totalSupply =
|
|
42375
|
-
const exchangeRate =
|
|
44485
|
+
const totalSupply = toBigInt12(supply);
|
|
44486
|
+
const exchangeRate = toBigInt12(rate);
|
|
42376
44487
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42377
44488
|
return void 0;
|
|
42378
44489
|
}
|
|
@@ -42403,7 +44514,7 @@ var readerValantisWstHype = (entry) => {
|
|
|
42403
44514
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42404
44515
|
abis: [TotalSupplyAbi],
|
|
42405
44516
|
parse: ([supply]) => {
|
|
42406
|
-
const totalSupply =
|
|
44517
|
+
const totalSupply = toBigInt12(supply);
|
|
42407
44518
|
if (totalSupply === void 0) return void 0;
|
|
42408
44519
|
return {
|
|
42409
44520
|
totalAssets: totalSupply,
|
|
@@ -42420,8 +44531,8 @@ var readerValantisWstHype = (entry) => {
|
|
|
42420
44531
|
],
|
|
42421
44532
|
abis: [TotalSupplyAbi, ValantisStHypeAbi],
|
|
42422
44533
|
parse: ([supply, rate]) => {
|
|
42423
|
-
const totalSupply =
|
|
42424
|
-
const exchangeRate =
|
|
44534
|
+
const totalSupply = toBigInt12(supply);
|
|
44535
|
+
const exchangeRate = toBigInt12(rate);
|
|
42425
44536
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42426
44537
|
return void 0;
|
|
42427
44538
|
}
|
|
@@ -42455,7 +44566,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
42455
44566
|
calls: [{ address: entry.address, name: "totalSupply", params: [] }],
|
|
42456
44567
|
abis: [TotalSupplyAbi],
|
|
42457
44568
|
parse: ([supply]) => {
|
|
42458
|
-
const totalSupply =
|
|
44569
|
+
const totalSupply = toBigInt12(supply);
|
|
42459
44570
|
if (totalSupply === void 0) return void 0;
|
|
42460
44571
|
return {
|
|
42461
44572
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
@@ -42473,8 +44584,8 @@ var readerVedaAccountant = (entry) => {
|
|
|
42473
44584
|
],
|
|
42474
44585
|
abis: [TotalSupplyAbi, VedaAccountantGetRateAbi],
|
|
42475
44586
|
parse: ([supply, rate]) => {
|
|
42476
|
-
const totalSupply =
|
|
42477
|
-
const rawRate =
|
|
44587
|
+
const totalSupply = toBigInt12(supply);
|
|
44588
|
+
const rawRate = toBigInt12(rate);
|
|
42478
44589
|
if (totalSupply === void 0 || rawRate === void 0) return void 0;
|
|
42479
44590
|
const exchangeRate = rawRate * scale;
|
|
42480
44591
|
return {
|
|
@@ -42509,8 +44620,8 @@ var readerAnkrRatio = (entry) => ({
|
|
|
42509
44620
|
],
|
|
42510
44621
|
abis: [TotalSupplyAbi, AnkrRatioAbi],
|
|
42511
44622
|
parse: ([supply, ratio]) => {
|
|
42512
|
-
const totalSupply =
|
|
42513
|
-
const r =
|
|
44623
|
+
const totalSupply = toBigInt12(supply);
|
|
44624
|
+
const r = toBigInt12(ratio);
|
|
42514
44625
|
if (totalSupply === void 0 || r === void 0 || r === 0n) {
|
|
42515
44626
|
return void 0;
|
|
42516
44627
|
}
|
|
@@ -42553,8 +44664,8 @@ var readerCoreEarnRate = (entry) => {
|
|
|
42553
44664
|
],
|
|
42554
44665
|
abis: [CoreEarnRateAbi, TotalSupplyAbi],
|
|
42555
44666
|
parse: ([rate, supply]) => {
|
|
42556
|
-
const r =
|
|
42557
|
-
const totalSupply =
|
|
44667
|
+
const r = toBigInt12(rate);
|
|
44668
|
+
const totalSupply = toBigInt12(supply);
|
|
42558
44669
|
if (r === void 0 || r === 0n || totalSupply === void 0) {
|
|
42559
44670
|
return void 0;
|
|
42560
44671
|
}
|
|
@@ -42575,8 +44686,8 @@ var readerCoreStakedRatio = (entry) => {
|
|
|
42575
44686
|
],
|
|
42576
44687
|
abis: [CoreTotalStakedAbi, TotalSupplyAbi],
|
|
42577
44688
|
parse: ([staked, supply]) => {
|
|
42578
|
-
const totalStaked =
|
|
42579
|
-
const totalSupply =
|
|
44689
|
+
const totalStaked = toBigInt12(staked);
|
|
44690
|
+
const totalSupply = toBigInt12(supply);
|
|
42580
44691
|
if (totalStaked === void 0 || totalSupply === void 0 || totalSupply === 0n) {
|
|
42581
44692
|
return void 0;
|
|
42582
44693
|
}
|
|
@@ -42620,12 +44731,12 @@ var readerStellaStDot = (entry) => ({
|
|
|
42620
44731
|
],
|
|
42621
44732
|
abis: [TotalSupplyAbi, StellaStDotAbi, StellaStDotAbi],
|
|
42622
44733
|
parse: ([supply, rate, pooled]) => {
|
|
42623
|
-
const totalSupply =
|
|
42624
|
-
const exchangeRate =
|
|
44734
|
+
const totalSupply = toBigInt12(supply);
|
|
44735
|
+
const exchangeRate = toBigInt12(rate);
|
|
42625
44736
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
42626
44737
|
return void 0;
|
|
42627
44738
|
}
|
|
42628
|
-
const totalAssets =
|
|
44739
|
+
const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E186;
|
|
42629
44740
|
return {
|
|
42630
44741
|
totalAssets,
|
|
42631
44742
|
totalSupply,
|
|
@@ -42660,8 +44771,8 @@ var readerKintsuSMon = (entry) => ({
|
|
|
42660
44771
|
],
|
|
42661
44772
|
abis: [KintsuSMonAbi, KintsuSMonAbi],
|
|
42662
44773
|
parse: ([pooled, shares]) => {
|
|
42663
|
-
const totalAssets =
|
|
42664
|
-
const totalSupply =
|
|
44774
|
+
const totalAssets = toBigInt12(pooled);
|
|
44775
|
+
const totalSupply = toBigInt12(shares);
|
|
42665
44776
|
if (totalAssets === void 0 || totalSupply === void 0) return void 0;
|
|
42666
44777
|
const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E186 / totalSupply : ONE_E186;
|
|
42667
44778
|
return { totalAssets, totalSupply, exchangeRate };
|
|
@@ -43182,7 +45293,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
43182
45293
|
const validatorsByAddress = new Map(validatorEntries);
|
|
43183
45294
|
const idleByAddress = /* @__PURE__ */ new Map();
|
|
43184
45295
|
idleEntries.forEach((e, i) => {
|
|
43185
|
-
const bal =
|
|
45296
|
+
const bal = toBigInt12(idleResults[i]);
|
|
43186
45297
|
if (bal !== void 0) idleByAddress.set(e.address.toLowerCase(), bal);
|
|
43187
45298
|
});
|
|
43188
45299
|
const rawResults = new Array(allCalls.length);
|
|
@@ -43312,7 +45423,7 @@ var BeetsStSWithdrawalAbi = [
|
|
|
43312
45423
|
];
|
|
43313
45424
|
|
|
43314
45425
|
// src/vaults/lst/withdrawals/readers/shared.ts
|
|
43315
|
-
var
|
|
45426
|
+
var toBigInt13 = (v) => {
|
|
43316
45427
|
if (v === void 0 || v === null) return void 0;
|
|
43317
45428
|
if (typeof v === "bigint") return v;
|
|
43318
45429
|
if (typeof v === "number") return BigInt(v);
|
|
@@ -43327,7 +45438,7 @@ var toBigInt12 = (v) => {
|
|
|
43327
45438
|
return void 0;
|
|
43328
45439
|
};
|
|
43329
45440
|
var toNumber = (v) => {
|
|
43330
|
-
const b =
|
|
45441
|
+
const b = toBigInt13(v);
|
|
43331
45442
|
if (b === void 0) return void 0;
|
|
43332
45443
|
if (b > BigInt(Number.MAX_SAFE_INTEGER)) return void 0;
|
|
43333
45444
|
return Number(b);
|
|
@@ -43364,7 +45475,7 @@ var readerBeets = {
|
|
|
43364
45475
|
const out = [];
|
|
43365
45476
|
for (let i = 0; i < reqs.length; i++) {
|
|
43366
45477
|
const r = reqs[i];
|
|
43367
|
-
const amount =
|
|
45478
|
+
const amount = toBigInt13(r.assetAmount);
|
|
43368
45479
|
const ts = toNumber(r.requestTimestamp);
|
|
43369
45480
|
const isWithdrawn = Boolean(r.isWithdrawn);
|
|
43370
45481
|
if (amount === void 0 || ts === void 0) continue;
|
|
@@ -43456,13 +45567,13 @@ var readerBeHype = {
|
|
|
43456
45567
|
const q = stage2[i * 2];
|
|
43457
45568
|
const canClaim = Boolean(stage2[i * 2 + 1]);
|
|
43458
45569
|
if (!q) continue;
|
|
43459
|
-
const hypeAmount = Array.isArray(q) ?
|
|
45570
|
+
const hypeAmount = Array.isArray(q) ? toBigInt13(q[2]) : toBigInt13(q.hypeAmount);
|
|
43460
45571
|
if (hypeAmount === void 0) continue;
|
|
43461
45572
|
out.push({
|
|
43462
45573
|
lst: entry.lst,
|
|
43463
45574
|
brand: entry.brand,
|
|
43464
45575
|
symbol: entry.symbol,
|
|
43465
|
-
requestId: String(
|
|
45576
|
+
requestId: String(toBigInt13(ids[i]) ?? i),
|
|
43466
45577
|
amountUnderlying: hypeAmount.toString(),
|
|
43467
45578
|
status: canClaim ? "claimable" : "pending"
|
|
43468
45579
|
});
|
|
@@ -43565,7 +45676,7 @@ var readerBenqi = {
|
|
|
43565
45676
|
for (let i = 0; i < reqs.length; i++) {
|
|
43566
45677
|
const r = reqs[i];
|
|
43567
45678
|
const startedAt = toNumber(r.startedAt);
|
|
43568
|
-
const shareAmount =
|
|
45679
|
+
const shareAmount = toBigInt13(r.shareAmount);
|
|
43569
45680
|
if (startedAt === void 0 || shareAmount === void 0) continue;
|
|
43570
45681
|
const readyAt = startedAt + cooldown;
|
|
43571
45682
|
const expiresAt = readyAt + claimWindow;
|
|
@@ -43628,8 +45739,8 @@ var readerBeraPaw = {
|
|
|
43628
45739
|
}
|
|
43629
45740
|
const pos = res[0];
|
|
43630
45741
|
if (!pos) return [];
|
|
43631
|
-
const queued = Array.isArray(pos) ?
|
|
43632
|
-
const available = Array.isArray(pos) ?
|
|
45742
|
+
const queued = Array.isArray(pos) ? toBigInt13(pos[0]) : toBigInt13(pos.queued);
|
|
45743
|
+
const available = Array.isArray(pos) ? toBigInt13(pos[1]) : toBigInt13(pos.available);
|
|
43633
45744
|
const out = [];
|
|
43634
45745
|
if (available !== void 0 && available > 0n) {
|
|
43635
45746
|
out.push({
|
|
@@ -43711,7 +45822,7 @@ var readerIbera = {
|
|
|
43711
45822
|
return [];
|
|
43712
45823
|
}
|
|
43713
45824
|
const length = toNumber(stage1[0]) ?? 0;
|
|
43714
|
-
const frontier =
|
|
45825
|
+
const frontier = toBigInt13(stage1[1]) ?? 0n;
|
|
43715
45826
|
if (length === 0) return [];
|
|
43716
45827
|
const start = length > MAX_SCAN ? length - MAX_SCAN : 0;
|
|
43717
45828
|
const ids = Array.from({ length: length - start }, (_3, k) => start + k);
|
|
@@ -43735,7 +45846,7 @@ var readerIbera = {
|
|
|
43735
45846
|
const r = stage2[k];
|
|
43736
45847
|
if (!r) continue;
|
|
43737
45848
|
const receiver = Array.isArray(r) ? r[2] : r.receiver;
|
|
43738
|
-
const amount = Array.isArray(r) ?
|
|
45849
|
+
const amount = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.amount);
|
|
43739
45850
|
if (typeof receiver !== "string" || receiver.toLowerCase() !== target || amount === void 0 || amount === 0n) {
|
|
43740
45851
|
continue;
|
|
43741
45852
|
}
|
|
@@ -43808,7 +45919,7 @@ var readerPrimeStaking = {
|
|
|
43808
45919
|
return [];
|
|
43809
45920
|
}
|
|
43810
45921
|
const length = toNumber(stage1[0]) ?? 0;
|
|
43811
|
-
const frontier =
|
|
45922
|
+
const frontier = toBigInt13(stage1[1]) ?? 0n;
|
|
43812
45923
|
if (length === 0) return [];
|
|
43813
45924
|
const start = length > MAX_SCAN2 ? length - MAX_SCAN2 : 0;
|
|
43814
45925
|
const ids = Array.from({ length: length - start }, (_3, k) => start + k);
|
|
@@ -43832,7 +45943,7 @@ var readerPrimeStaking = {
|
|
|
43832
45943
|
const r = stage2[k];
|
|
43833
45944
|
if (!r) continue;
|
|
43834
45945
|
const receiver = Array.isArray(r) ? r[1] : r.receiver;
|
|
43835
|
-
const assets = Array.isArray(r) ?
|
|
45946
|
+
const assets = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.assets);
|
|
43836
45947
|
const processed = Array.isArray(r) ? r[4] : r.processed;
|
|
43837
45948
|
if (typeof receiver !== "string" || receiver.toLowerCase() !== target || assets === void 0 || assets === 0n) {
|
|
43838
45949
|
continue;
|
|
@@ -43902,8 +46013,8 @@ var readerErc7540 = {
|
|
|
43902
46013
|
],
|
|
43903
46014
|
abi: [Erc7540Abi, Erc7540Abi]
|
|
43904
46015
|
});
|
|
43905
|
-
const pending =
|
|
43906
|
-
const claimable =
|
|
46016
|
+
const pending = toBigInt13(stage1[0]) ?? 0n;
|
|
46017
|
+
const claimable = toBigInt13(stage1[1]) ?? 0n;
|
|
43907
46018
|
const out = [];
|
|
43908
46019
|
if (claimable > 0n) {
|
|
43909
46020
|
const stage2 = await multicallRetry({
|
|
@@ -43917,7 +46028,7 @@ var readerErc7540 = {
|
|
|
43917
46028
|
],
|
|
43918
46029
|
abi: [Erc7540Abi]
|
|
43919
46030
|
});
|
|
43920
|
-
const amount =
|
|
46031
|
+
const amount = toBigInt13(stage2[0]) ?? claimable;
|
|
43921
46032
|
out.push({
|
|
43922
46033
|
lst: entry.lst,
|
|
43923
46034
|
brand: entry.brand,
|
|
@@ -43971,11 +46082,11 @@ var readerEthenaCooldown = {
|
|
|
43971
46082
|
let cooldownEnd;
|
|
43972
46083
|
let amount;
|
|
43973
46084
|
if (Array.isArray(cell)) {
|
|
43974
|
-
cooldownEnd =
|
|
43975
|
-
amount =
|
|
46085
|
+
cooldownEnd = toBigInt13(cell[0]);
|
|
46086
|
+
amount = toBigInt13(cell[1]);
|
|
43976
46087
|
} else if (cell && typeof cell === "object") {
|
|
43977
|
-
cooldownEnd =
|
|
43978
|
-
amount =
|
|
46088
|
+
cooldownEnd = toBigInt13(cell.cooldownEnd);
|
|
46089
|
+
amount = toBigInt13(cell.underlyingAmount);
|
|
43979
46090
|
}
|
|
43980
46091
|
if (!amount || amount === 0n) return [];
|
|
43981
46092
|
const readyAt = Number(cooldownEnd ?? 0n);
|
|
@@ -44070,7 +46181,7 @@ var readerEtherFi = {
|
|
|
44070
46181
|
calls: enumCalls,
|
|
44071
46182
|
abi: enumCalls.map(() => EtherFiWithdrawRequestAbi)
|
|
44072
46183
|
});
|
|
44073
|
-
const ids = stage2.map(
|
|
46184
|
+
const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
|
|
44074
46185
|
if (ids.length === 0) return [];
|
|
44075
46186
|
const detailCalls = ids.flatMap((id) => [
|
|
44076
46187
|
{ address: entry.withdrawalContract, name: "getRequest", params: [id] },
|
|
@@ -44090,7 +46201,7 @@ var readerEtherFi = {
|
|
|
44090
46201
|
const isValid = Boolean(stage3[i * 3 + 2]);
|
|
44091
46202
|
if (!req) continue;
|
|
44092
46203
|
if (!isValid) continue;
|
|
44093
|
-
const amount =
|
|
46204
|
+
const amount = toBigInt13(req.amountOfEEth);
|
|
44094
46205
|
if (amount === void 0) continue;
|
|
44095
46206
|
out.push({
|
|
44096
46207
|
lst: entry.lst,
|
|
@@ -44185,7 +46296,7 @@ var readerKelp = {
|
|
|
44185
46296
|
}
|
|
44186
46297
|
],
|
|
44187
46298
|
abi: [KelpWithdrawalManagerAbi]
|
|
44188
|
-
}).then((res) =>
|
|
46299
|
+
}).then((res) => toBigInt13(res[0]) ?? 0n)
|
|
44189
46300
|
]);
|
|
44190
46301
|
lengths = storageReads;
|
|
44191
46302
|
currentBlock = block;
|
|
@@ -44215,9 +46326,9 @@ var readerKelp = {
|
|
|
44215
46326
|
for (let i = 0; i < detailCalls.length; i++) {
|
|
44216
46327
|
const r = stage2[i];
|
|
44217
46328
|
if (!r) continue;
|
|
44218
|
-
const expected = Array.isArray(r) ?
|
|
44219
|
-
const startBlock = Array.isArray(r) ?
|
|
44220
|
-
const nonce = Array.isArray(r) ?
|
|
46329
|
+
const expected = Array.isArray(r) ? toBigInt13(r[1]) : toBigInt13(r.expectedAssetAmount);
|
|
46330
|
+
const startBlock = Array.isArray(r) ? toBigInt13(r[2]) : toBigInt13(r.withdrawalStartBlock);
|
|
46331
|
+
const nonce = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.userNonce);
|
|
44221
46332
|
if (expected === void 0 || startBlock === void 0) continue;
|
|
44222
46333
|
const claimable = currentBlock >= startBlock + delayBlocks;
|
|
44223
46334
|
out.push({
|
|
@@ -44294,7 +46405,7 @@ var readerLido = {
|
|
|
44294
46405
|
abi: [LidoWithdrawalQueueAbi, LidoWithdrawalQueueAbi]
|
|
44295
46406
|
});
|
|
44296
46407
|
const ids = stage1[0];
|
|
44297
|
-
const frontier =
|
|
46408
|
+
const frontier = toBigInt13(stage1[1]) ?? 0n;
|
|
44298
46409
|
if (!Array.isArray(ids) || ids.length === 0) return [];
|
|
44299
46410
|
const stage2 = await multicallRetry({
|
|
44300
46411
|
chain: chainId,
|
|
@@ -44311,10 +46422,10 @@ var readerLido = {
|
|
|
44311
46422
|
if (!Array.isArray(statuses)) return [];
|
|
44312
46423
|
const out = [];
|
|
44313
46424
|
for (let i = 0; i < ids.length; i++) {
|
|
44314
|
-
const id =
|
|
46425
|
+
const id = toBigInt13(ids[i]);
|
|
44315
46426
|
const s = statuses[i];
|
|
44316
46427
|
if (id === void 0 || !s) continue;
|
|
44317
|
-
const amountOfStETH =
|
|
46428
|
+
const amountOfStETH = toBigInt13(s.amountOfStETH);
|
|
44318
46429
|
const isFinalized = Boolean(s.isFinalized);
|
|
44319
46430
|
const isClaimed = Boolean(s.isClaimed);
|
|
44320
46431
|
if (amountOfStETH === void 0) continue;
|
|
@@ -44423,11 +46534,11 @@ var readerLista = {
|
|
|
44423
46534
|
const status = stage2[i];
|
|
44424
46535
|
if (!status) continue;
|
|
44425
46536
|
const isClaimable = Array.isArray(status) ? Boolean(status[0]) : Boolean(status._isClaimable);
|
|
44426
|
-
const bnbAmount = Array.isArray(status) ?
|
|
44427
|
-
const snbnbAmount = Array.isArray(req) ?
|
|
46537
|
+
const bnbAmount = Array.isArray(status) ? toBigInt13(status[1]) : toBigInt13(status._amount);
|
|
46538
|
+
const snbnbAmount = Array.isArray(req) ? toBigInt13(req[1]) : toBigInt13(req?.amountInSnBnb);
|
|
44428
46539
|
const amount = bnbAmount ?? snbnbAmount;
|
|
44429
46540
|
if (amount === void 0) continue;
|
|
44430
|
-
const uuid = Array.isArray(req) ?
|
|
46541
|
+
const uuid = Array.isArray(req) ? toBigInt13(req[0]) : toBigInt13(req?.uuid);
|
|
44431
46542
|
out.push({
|
|
44432
46543
|
lst: entry.lst,
|
|
44433
46544
|
brand: entry.brand,
|
|
@@ -44512,7 +46623,7 @@ var readerRenzo = {
|
|
|
44512
46623
|
for (let i = 0; i < count; i++) {
|
|
44513
46624
|
const tup = stage2[i];
|
|
44514
46625
|
if (!Array.isArray(tup) || tup.length < 5) continue;
|
|
44515
|
-
const amountToRedeem =
|
|
46626
|
+
const amountToRedeem = toBigInt13(tup[2]);
|
|
44516
46627
|
const createdAt = toNumber(tup[4]);
|
|
44517
46628
|
if (amountToRedeem === void 0 || createdAt === void 0) continue;
|
|
44518
46629
|
const readyAt = createdAt + cooldown;
|
|
@@ -44585,9 +46696,9 @@ var readerStaderEthx2 = {
|
|
|
44585
46696
|
]
|
|
44586
46697
|
});
|
|
44587
46698
|
const ids = stage1[0];
|
|
44588
|
-
const frontier =
|
|
46699
|
+
const frontier = toBigInt13(stage1[1]) ?? 0n;
|
|
44589
46700
|
if (!Array.isArray(ids) || ids.length === 0) return [];
|
|
44590
|
-
const idBigInts = ids.map(
|
|
46701
|
+
const idBigInts = ids.map(toBigInt13).filter((v) => v !== void 0);
|
|
44591
46702
|
const detailCalls = idBigInts.map((id) => ({
|
|
44592
46703
|
address: entry.withdrawalContract,
|
|
44593
46704
|
name: "userWithdrawRequests",
|
|
@@ -44603,8 +46714,8 @@ var readerStaderEthx2 = {
|
|
|
44603
46714
|
const id = idBigInts[i];
|
|
44604
46715
|
const tup = stage2[i];
|
|
44605
46716
|
if (!Array.isArray(tup) || tup.length < 5) continue;
|
|
44606
|
-
const ethExpected =
|
|
44607
|
-
const ethFinalized =
|
|
46717
|
+
const ethExpected = toBigInt13(tup[2]) ?? 0n;
|
|
46718
|
+
const ethFinalized = toBigInt13(tup[3]) ?? 0n;
|
|
44608
46719
|
const isFinalized = id < frontier && ethFinalized > 0n;
|
|
44609
46720
|
const queuePosition = isFinalized ? 0 : Number(id - frontier);
|
|
44610
46721
|
out.push({
|
|
@@ -44683,13 +46794,13 @@ var readerStaderMaticX2 = {
|
|
|
44683
46794
|
});
|
|
44684
46795
|
const arr = stage1[0];
|
|
44685
46796
|
if (!Array.isArray(arr)) return [];
|
|
44686
|
-
const currentEpoch = stakeManager ?
|
|
44687
|
-
const delay = stakeManager ?
|
|
46797
|
+
const currentEpoch = stakeManager ? toBigInt13(stage1[1]) ?? 0n : 0n;
|
|
46798
|
+
const delay = stakeManager ? toBigInt13(stage1[2]) ?? 0n : 0n;
|
|
44688
46799
|
const out = [];
|
|
44689
46800
|
for (let i = 0; i < arr.length; i++) {
|
|
44690
46801
|
const r = arr[i];
|
|
44691
|
-
const amount =
|
|
44692
|
-
const requestEpoch =
|
|
46802
|
+
const amount = toBigInt13(r.amount) ?? 0n;
|
|
46803
|
+
const requestEpoch = toBigInt13(r.requestEpoch);
|
|
44693
46804
|
if (requestEpoch === void 0) continue;
|
|
44694
46805
|
const ready = stakeManager ? currentEpoch >= requestEpoch + delay : false;
|
|
44695
46806
|
out.push({
|
|
@@ -44776,9 +46887,9 @@ var readerMantle = {
|
|
|
44776
46887
|
if (typeof requester === "string" && requester.toLowerCase() !== lcUser) {
|
|
44777
46888
|
continue;
|
|
44778
46889
|
}
|
|
44779
|
-
const ethRequested = Array.isArray(detail) ?
|
|
46890
|
+
const ethRequested = Array.isArray(detail) ? toBigInt13(detail[3]) : toBigInt13(detail.ethRequested);
|
|
44780
46891
|
const isFinalized = Array.isArray(info) ? Boolean(info[0]) : Boolean(info.isFinalized);
|
|
44781
|
-
const claimable = Array.isArray(info) ?
|
|
46892
|
+
const claimable = Array.isArray(info) ? toBigInt13(info[1]) : toBigInt13(info.claimableAmount);
|
|
44782
46893
|
if (ethRequested === void 0) continue;
|
|
44783
46894
|
out.push({
|
|
44784
46895
|
lst: entry.lst,
|
|
@@ -44857,8 +46968,8 @@ var readerPuffer = {
|
|
|
44857
46968
|
calls,
|
|
44858
46969
|
abi: calls.map(() => PufferWithdrawalManagerAbi)
|
|
44859
46970
|
});
|
|
44860
|
-
const finalizedBatch =
|
|
44861
|
-
const batchSize =
|
|
46971
|
+
const finalizedBatch = toBigInt13(results[detailCalls.length]) ?? 0n;
|
|
46972
|
+
const batchSize = toBigInt13(results[detailCalls.length + 1]) ?? 0n;
|
|
44862
46973
|
const out = [];
|
|
44863
46974
|
const lcUser = user.toLowerCase();
|
|
44864
46975
|
for (let i = 0; i < ids.length; i++) {
|
|
@@ -44868,7 +46979,7 @@ var readerPuffer = {
|
|
|
44868
46979
|
if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
|
|
44869
46980
|
continue;
|
|
44870
46981
|
}
|
|
44871
|
-
const pufETHAmount = Array.isArray(d) ?
|
|
46982
|
+
const pufETHAmount = Array.isArray(d) ? toBigInt13(d[0]) : toBigInt13(d.pufETHAmount);
|
|
44872
46983
|
if (pufETHAmount === void 0) continue;
|
|
44873
46984
|
const batchIdx = batchSize > 0n ? ids[i] / batchSize : 0n;
|
|
44874
46985
|
const claimable = batchIdx <= finalizedBatch;
|
|
@@ -44966,7 +47077,7 @@ var readerKinetiq = {
|
|
|
44966
47077
|
for (let i = 0; i < count; i++) {
|
|
44967
47078
|
const r = stage2[i];
|
|
44968
47079
|
if (!r) continue;
|
|
44969
|
-
const hypeAmount = Array.isArray(r) ?
|
|
47080
|
+
const hypeAmount = Array.isArray(r) ? toBigInt13(r[0]) : toBigInt13(r.hypeAmount);
|
|
44970
47081
|
const timestamp = Array.isArray(r) ? toNumber(r[4]) : toNumber(r.timestamp);
|
|
44971
47082
|
if (hypeAmount === void 0 || hypeAmount === 0n || timestamp === void 0) {
|
|
44972
47083
|
continue;
|
|
@@ -45094,7 +47205,7 @@ var readerStakeWise = {
|
|
|
45094
47205
|
const claimedByIdx = /* @__PURE__ */ new Map();
|
|
45095
47206
|
for (let i = 0; i < onChainChecks.length; i++) {
|
|
45096
47207
|
const cell = checkResults[i];
|
|
45097
|
-
const claimed = Array.isArray(cell) ?
|
|
47208
|
+
const claimed = Array.isArray(cell) ? toBigInt13(cell[2]) : toBigInt13(cell?.claimedAssets);
|
|
45098
47209
|
if (claimed !== void 0 && claimed > 0n) {
|
|
45099
47210
|
claimedByIdx.set(onChainChecks[i].idx, claimed);
|
|
45100
47211
|
}
|
|
@@ -45102,7 +47213,7 @@ var readerStakeWise = {
|
|
|
45102
47213
|
const out = [];
|
|
45103
47214
|
for (let i = 0; i < requests.length; i++) {
|
|
45104
47215
|
const r = requests[i];
|
|
45105
|
-
const amount =
|
|
47216
|
+
const amount = toBigInt13(r.totalAssets) ?? 0n;
|
|
45106
47217
|
const onChainClaimed = claimedByIdx.get(i);
|
|
45107
47218
|
const claimable = onChainClaimed !== void 0 || r.isClaimable;
|
|
45108
47219
|
out.push({
|
|
@@ -45159,7 +47270,7 @@ var readerStCelo2 = {
|
|
|
45159
47270
|
const timestamps = cell[1] ?? [];
|
|
45160
47271
|
const out = [];
|
|
45161
47272
|
for (let i = 0; i < values.length; i++) {
|
|
45162
|
-
const amount =
|
|
47273
|
+
const amount = toBigInt13(values[i]);
|
|
45163
47274
|
const readyAt = toNumber(timestamps[i]);
|
|
45164
47275
|
if (amount === void 0 || readyAt === void 0) continue;
|
|
45165
47276
|
out.push({
|
|
@@ -45204,11 +47315,11 @@ var readerStellaUnbond = {
|
|
|
45204
47315
|
let waiting;
|
|
45205
47316
|
let unbonded;
|
|
45206
47317
|
if (Array.isArray(cell)) {
|
|
45207
|
-
waiting =
|
|
45208
|
-
unbonded =
|
|
47318
|
+
waiting = toBigInt13(cell[0]);
|
|
47319
|
+
unbonded = toBigInt13(cell[1]);
|
|
45209
47320
|
} else if (cell && typeof cell === "object") {
|
|
45210
|
-
waiting =
|
|
45211
|
-
unbonded =
|
|
47321
|
+
waiting = toBigInt13(cell.waiting);
|
|
47322
|
+
unbonded = toBigInt13(cell.unbonded);
|
|
45212
47323
|
}
|
|
45213
47324
|
const out = [];
|
|
45214
47325
|
if (unbonded && unbonded > 0n) {
|
|
@@ -45298,7 +47409,7 @@ var readerSwell = {
|
|
|
45298
47409
|
abi: [SwellRswExitAbi, SwellRswExitAbi]
|
|
45299
47410
|
});
|
|
45300
47411
|
const count = toNumber(stage1[0]) ?? 0;
|
|
45301
|
-
const lastProcessed =
|
|
47412
|
+
const lastProcessed = toBigInt13(stage1[1]) ?? 0n;
|
|
45302
47413
|
if (count === 0) return [];
|
|
45303
47414
|
const enumCalls = Array.from({ length: count }, (_3, i) => ({
|
|
45304
47415
|
address: entry.withdrawalContract,
|
|
@@ -45310,7 +47421,7 @@ var readerSwell = {
|
|
|
45310
47421
|
calls: enumCalls,
|
|
45311
47422
|
abi: enumCalls.map(() => SwellRswExitAbi)
|
|
45312
47423
|
});
|
|
45313
|
-
const ids = stage2.map(
|
|
47424
|
+
const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
|
|
45314
47425
|
if (ids.length === 0) return [];
|
|
45315
47426
|
const detailCalls = ids.map((id) => ({
|
|
45316
47427
|
address: entry.withdrawalContract,
|
|
@@ -45327,7 +47438,7 @@ var readerSwell = {
|
|
|
45327
47438
|
const id = ids[i];
|
|
45328
47439
|
const r = stage3[i];
|
|
45329
47440
|
if (!r) continue;
|
|
45330
|
-
const amount =
|
|
47441
|
+
const amount = toBigInt13(r.amount);
|
|
45331
47442
|
if (amount === void 0) continue;
|
|
45332
47443
|
const claimable = id <= lastProcessed;
|
|
45333
47444
|
out.push({
|
|
@@ -45401,14 +47512,14 @@ var readerValantis = {
|
|
|
45401
47512
|
for (let i = 0; i < burns.length; i++) {
|
|
45402
47513
|
const b = burns[i];
|
|
45403
47514
|
if (!b) continue;
|
|
45404
|
-
const amount = Array.isArray(b) ?
|
|
47515
|
+
const amount = Array.isArray(b) ? toBigInt13(b[0]) : toBigInt13(b.amount);
|
|
45405
47516
|
const completed = Array.isArray(b) ? Boolean(b[2]) : Boolean(b.completed);
|
|
45406
47517
|
if (amount === void 0 || completed) continue;
|
|
45407
47518
|
out.push({
|
|
45408
47519
|
lst: entry.lst,
|
|
45409
47520
|
brand: entry.brand,
|
|
45410
47521
|
symbol: entry.symbol,
|
|
45411
|
-
requestId: String(
|
|
47522
|
+
requestId: String(toBigInt13(ids[i]) ?? i),
|
|
45412
47523
|
amountUnderlying: amount.toString(),
|
|
45413
47524
|
status: redeemable[i] ? "claimable" : "pending"
|
|
45414
47525
|
});
|
|
@@ -45481,7 +47592,7 @@ var readerTruFin = {
|
|
|
45481
47592
|
if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
|
|
45482
47593
|
continue;
|
|
45483
47594
|
}
|
|
45484
|
-
const amount = Array.isArray(w) ?
|
|
47595
|
+
const amount = Array.isArray(w) ? toBigInt13(w[1]) : toBigInt13(w.amount);
|
|
45485
47596
|
if (amount === void 0 || amount === 0n) continue;
|
|
45486
47597
|
out.push({
|
|
45487
47598
|
lst: entry.lst,
|
|
@@ -45577,7 +47688,7 @@ var readerYieldNest = {
|
|
|
45577
47688
|
calls: enumCalls,
|
|
45578
47689
|
abi: enumCalls.map(() => YieldNestWithdrawalQueueAbi)
|
|
45579
47690
|
});
|
|
45580
|
-
const ids = stage2.map(
|
|
47691
|
+
const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
|
|
45581
47692
|
if (ids.length === 0) return [];
|
|
45582
47693
|
const detailCalls = ids.map((id) => ({
|
|
45583
47694
|
address: entry.withdrawalContract,
|
|
@@ -45596,7 +47707,7 @@ var readerYieldNest = {
|
|
|
45596
47707
|
const id = ids[i];
|
|
45597
47708
|
const r = stage3[i];
|
|
45598
47709
|
if (!r) continue;
|
|
45599
|
-
const amount =
|
|
47710
|
+
const amount = toBigInt13(r.amount);
|
|
45600
47711
|
const created = toNumber(r.creationTimestamp);
|
|
45601
47712
|
const processed = Boolean(r.processed);
|
|
45602
47713
|
if (amount === void 0 || created === void 0) continue;
|
|
@@ -46189,7 +48300,7 @@ var getLstWithdrawalRegistry = (chainId, extraEntries) => {
|
|
|
46189
48300
|
const extra = extraEntries.filter((e) => !seen.has(e.lst.toLowerCase()));
|
|
46190
48301
|
return extra.length === 0 ? base : [...base, ...extra];
|
|
46191
48302
|
};
|
|
46192
|
-
var
|
|
48303
|
+
var warn5 = (...args) => {
|
|
46193
48304
|
};
|
|
46194
48305
|
var getLstWithdrawalRequests = async (user, chainId, multicallRetry, options) => {
|
|
46195
48306
|
const entries = getLstWithdrawalRegistry(chainId, options?.extraEntries);
|
|
@@ -46204,7 +48315,7 @@ var getLstWithdrawalRequests = async (user, chainId, multicallRetry, options) =>
|
|
|
46204
48315
|
try {
|
|
46205
48316
|
return await reader.fetch(lcUser, multicallRetry, chainId, entry, ids);
|
|
46206
48317
|
} catch (e) {
|
|
46207
|
-
|
|
48318
|
+
warn5(
|
|
46208
48319
|
`[lst-withdrawals] ${entry.brand} ${entry.symbol} (${entry.lst}) failed:`,
|
|
46209
48320
|
e?.message ?? e
|
|
46210
48321
|
);
|
|
@@ -46249,7 +48360,7 @@ var Erc4626ReadAbi2 = [
|
|
|
46249
48360
|
|
|
46250
48361
|
// src/vaults/savings/readers/shared.ts
|
|
46251
48362
|
var ONE_E188 = 10n ** 18n;
|
|
46252
|
-
var
|
|
48363
|
+
var toBigInt14 = (v) => {
|
|
46253
48364
|
if (v === void 0 || v === null) return void 0;
|
|
46254
48365
|
if (typeof v === "bigint") return v;
|
|
46255
48366
|
if (typeof v === "number") return BigInt(v);
|
|
@@ -46280,9 +48391,9 @@ var readerErc46262 = (entry) => {
|
|
|
46280
48391
|
],
|
|
46281
48392
|
abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2],
|
|
46282
48393
|
parse: ([assets, supply, rate]) => {
|
|
46283
|
-
const totalAssets =
|
|
46284
|
-
const totalSupply =
|
|
46285
|
-
const convertToAssetsRaw =
|
|
48394
|
+
const totalAssets = toBigInt14(assets);
|
|
48395
|
+
const totalSupply = toBigInt14(supply);
|
|
48396
|
+
const convertToAssetsRaw = toBigInt14(rate);
|
|
46286
48397
|
if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
|
|
46287
48398
|
return void 0;
|
|
46288
48399
|
}
|
|
@@ -46733,7 +48844,7 @@ var resolveAaveEarnCuratorName = (chainId, owner) => {
|
|
|
46733
48844
|
|
|
46734
48845
|
// src/vaults/aave-earn/fetchPublic.ts
|
|
46735
48846
|
var BRAND2 = "Aave";
|
|
46736
|
-
var
|
|
48847
|
+
var toBigInt15 = (v) => {
|
|
46737
48848
|
if (v === void 0 || v === null) return void 0;
|
|
46738
48849
|
if (typeof v === "bigint") return v;
|
|
46739
48850
|
if (typeof v === "number") return BigInt(v);
|
|
@@ -46793,15 +48904,15 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
46793
48904
|
const token = v.usedReserve.underlyingToken;
|
|
46794
48905
|
const underlyingLc = token.address.toLowerCase();
|
|
46795
48906
|
const assetDecimals = token.decimals;
|
|
46796
|
-
const shareDecOnChain =
|
|
48907
|
+
const shareDecOnChain = toBigInt15(slice[1]);
|
|
46797
48908
|
const decimals = shareDecOnChain !== void 0 ? Number(shareDecOnChain) : assetDecimals;
|
|
46798
|
-
const totalSupply =
|
|
48909
|
+
const totalSupply = toBigInt15(slice[2]);
|
|
46799
48910
|
if (totalSupply === void 0) continue;
|
|
46800
48911
|
const shareUnit = 10n ** BigInt(decimals);
|
|
46801
48912
|
const underlyingUnit = 10n ** BigInt(assetDecimals);
|
|
46802
|
-
const convertToAssets =
|
|
48913
|
+
const convertToAssets = toBigInt15(slice[3]) ?? 0n;
|
|
46803
48914
|
const convertToShares = convertToAssets > 0n ? shareUnit * underlyingUnit / convertToAssets : 0n;
|
|
46804
|
-
const totalAssets =
|
|
48915
|
+
const totalAssets = toBigInt15(slice[0]) ?? totalSupply * convertToAssets / shareUnit;
|
|
46805
48916
|
const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
|
|
46806
48917
|
const asset = tokenList[underlyingLc];
|
|
46807
48918
|
const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num2(v.balance.usdPerToken) : void 0);
|
|
@@ -48045,23 +50156,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
|
|
|
48045
50156
|
const indexMax = price(prices, m.indexToken)?.max;
|
|
48046
50157
|
if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
|
|
48047
50158
|
const base = i * SLOTS;
|
|
48048
|
-
const
|
|
50159
|
+
const big3 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
|
|
48049
50160
|
const cap = computeDepositCapacityUsd(
|
|
48050
|
-
[info?.longTokenAmount, longMax,
|
|
48051
|
-
[info?.shortTokenAmount, shortMax,
|
|
50161
|
+
[info?.longTokenAmount, longMax, big3(0), big3(2)],
|
|
50162
|
+
[info?.shortTokenAmount, shortMax, big3(1), big3(3)]
|
|
48052
50163
|
);
|
|
48053
50164
|
if (cap != null) value.depositCapacityUsd = cap;
|
|
48054
50165
|
if (indexMax != null) {
|
|
48055
50166
|
const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
|
|
48056
|
-
const reservedUsdLong = (
|
|
48057
|
-
const reservedUsdShort = (
|
|
50167
|
+
const reservedUsdLong = (big3(4) + big3(5)) / divisor * indexMax;
|
|
50168
|
+
const reservedUsdShort = (big3(6) + big3(7)) / divisor;
|
|
48058
50169
|
const liq = computeLiquidityUsd(
|
|
48059
50170
|
info?.longTokenUsd,
|
|
48060
50171
|
info?.shortTokenUsd,
|
|
48061
50172
|
reservedUsdLong,
|
|
48062
50173
|
reservedUsdShort,
|
|
48063
|
-
|
|
48064
|
-
|
|
50174
|
+
big3(8),
|
|
50175
|
+
big3(9)
|
|
48065
50176
|
);
|
|
48066
50177
|
if (liq != null)
|
|
48067
50178
|
value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
|
|
@@ -48260,21 +50371,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
|
|
|
48260
50371
|
} catch {
|
|
48261
50372
|
return void 0;
|
|
48262
50373
|
}
|
|
48263
|
-
const
|
|
48264
|
-
const base =
|
|
48265
|
-
const mult =
|
|
50374
|
+
const big3 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
|
|
50375
|
+
const base = big3(0);
|
|
50376
|
+
const mult = big3(1);
|
|
48266
50377
|
if (base === 0n && mult === 0n) return void 0;
|
|
48267
50378
|
const PRECISION = 10n ** 30n;
|
|
48268
50379
|
const adjusted = (opGas) => base + opGas * mult / PRECISION;
|
|
48269
50380
|
const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
|
|
48270
|
-
const glvExtra =
|
|
50381
|
+
const glvExtra = big3(6) * GLV_NOMINAL_MARKET_COUNT;
|
|
48271
50382
|
return {
|
|
48272
50383
|
chainId,
|
|
48273
50384
|
gasPriceWei: gasPriceWei.toString(),
|
|
48274
|
-
deposit: fee(
|
|
48275
|
-
withdrawal: fee(
|
|
48276
|
-
glvDeposit: fee(
|
|
48277
|
-
glvWithdrawal: fee(
|
|
50385
|
+
deposit: fee(big3(2)),
|
|
50386
|
+
withdrawal: fee(big3(3)),
|
|
50387
|
+
glvDeposit: fee(big3(4) + glvExtra),
|
|
50388
|
+
glvWithdrawal: fee(big3(5) + glvExtra)
|
|
48278
50389
|
};
|
|
48279
50390
|
};
|
|
48280
50391
|
|
|
@@ -48661,7 +50772,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
|
|
|
48661
50772
|
};
|
|
48662
50773
|
|
|
48663
50774
|
// src/vaults/yield/annualize.ts
|
|
48664
|
-
var
|
|
50775
|
+
var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
|
|
48665
50776
|
var SCALE = 10n ** 18n;
|
|
48666
50777
|
var appendSnapshot = (points, snap, options) => {
|
|
48667
50778
|
const maxPoints = options?.maxPoints ?? 90;
|
|
@@ -48690,7 +50801,7 @@ var computeVaultApr = (points, options) => {
|
|
|
48690
50801
|
if (pThen === 0n) return void 0;
|
|
48691
50802
|
const ratioScaled = BigInt(now.p) * SCALE / pThen;
|
|
48692
50803
|
const ratio = Number(ratioScaled) / 1e18;
|
|
48693
|
-
const apr = (ratio - 1) * (
|
|
50804
|
+
const apr = (ratio - 1) * (YEAR_SECONDS3 / windowSeconds);
|
|
48694
50805
|
return {
|
|
48695
50806
|
apr,
|
|
48696
50807
|
sharePriceNow: now.p,
|
|
@@ -48745,7 +50856,7 @@ function buildVaultLookup(data) {
|
|
|
48745
50856
|
addEntries(data.yearn, "yearn");
|
|
48746
50857
|
return map;
|
|
48747
50858
|
}
|
|
48748
|
-
var
|
|
50859
|
+
var warn6 = (...args) => {
|
|
48749
50860
|
};
|
|
48750
50861
|
var HYPERCORE_PROVIDER_CHAIN = "999";
|
|
48751
50862
|
var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices = {}, tokenList = {}, options) => {
|
|
@@ -48758,7 +50869,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48758
50869
|
fetchFluidFTokens(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48759
50870
|
out.fluid = res;
|
|
48760
50871
|
}).catch((e) => {
|
|
48761
|
-
|
|
50872
|
+
warn6(
|
|
48762
50873
|
`[vaults] fluid fetch failed for chain ${chainId}:`,
|
|
48763
50874
|
e?.message ?? e
|
|
48764
50875
|
);
|
|
@@ -48770,7 +50881,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48770
50881
|
fetchGearboxV3Pools(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48771
50882
|
out.gearbox = res;
|
|
48772
50883
|
}).catch((e) => {
|
|
48773
|
-
|
|
50884
|
+
warn6(
|
|
48774
50885
|
`[vaults] gearbox fetch failed for chain ${chainId}:`,
|
|
48775
50886
|
e?.message ?? e
|
|
48776
50887
|
);
|
|
@@ -48782,7 +50893,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48782
50893
|
fetchMorphoVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48783
50894
|
out.morpho = res;
|
|
48784
50895
|
}).catch((e) => {
|
|
48785
|
-
|
|
50896
|
+
warn6(
|
|
48786
50897
|
`[vaults] morpho fetch failed for chain ${chainId}:`,
|
|
48787
50898
|
e?.message ?? e
|
|
48788
50899
|
);
|
|
@@ -48794,7 +50905,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48794
50905
|
fetchListaVaultsFromChain(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48795
50906
|
out.lista = res;
|
|
48796
50907
|
}).catch((e) => {
|
|
48797
|
-
|
|
50908
|
+
warn6(
|
|
48798
50909
|
`[vaults] lista fetch failed for chain ${chainId}:`,
|
|
48799
50910
|
e?.message ?? e
|
|
48800
50911
|
);
|
|
@@ -48809,7 +50920,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48809
50920
|
}).then((res) => {
|
|
48810
50921
|
out.silo = res;
|
|
48811
50922
|
}).catch((e) => {
|
|
48812
|
-
|
|
50923
|
+
warn6(
|
|
48813
50924
|
`[vaults] silo fetch failed for chain ${chainId}:`,
|
|
48814
50925
|
e?.message ?? e
|
|
48815
50926
|
);
|
|
@@ -48821,7 +50932,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48821
50932
|
fetchEulerEarnVaults(chainId, prices, tokenList, multicallRetry).then((res) => {
|
|
48822
50933
|
out["euler-earn"] = res;
|
|
48823
50934
|
}).catch((e) => {
|
|
48824
|
-
|
|
50935
|
+
warn6(
|
|
48825
50936
|
`[vaults] euler-earn fetch failed for chain ${chainId}:`,
|
|
48826
50937
|
e?.message ?? e
|
|
48827
50938
|
);
|
|
@@ -48833,7 +50944,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48833
50944
|
fetchLstShareTokens(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48834
50945
|
out.lst = res;
|
|
48835
50946
|
}).catch((e) => {
|
|
48836
|
-
|
|
50947
|
+
warn6(
|
|
48837
50948
|
`[vaults] lst fetch failed for chain ${chainId}:`,
|
|
48838
50949
|
e?.message ?? e
|
|
48839
50950
|
);
|
|
@@ -48845,7 +50956,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48845
50956
|
fetchSavingsVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48846
50957
|
out.savings = res;
|
|
48847
50958
|
}).catch((e) => {
|
|
48848
|
-
|
|
50959
|
+
warn6(
|
|
48849
50960
|
`[vaults] savings fetch failed for chain ${chainId}:`,
|
|
48850
50961
|
e?.message ?? e
|
|
48851
50962
|
);
|
|
@@ -48857,7 +50968,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48857
50968
|
fetchLagoonVaults(chainId, prices, tokenList).then((res) => {
|
|
48858
50969
|
out.lagoon = res;
|
|
48859
50970
|
}).catch((e) => {
|
|
48860
|
-
|
|
50971
|
+
warn6(
|
|
48861
50972
|
`[vaults] lagoon fetch failed for chain ${chainId}:`,
|
|
48862
50973
|
e?.message ?? e
|
|
48863
50974
|
);
|
|
@@ -48869,7 +50980,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48869
50980
|
fetchAaveEarnVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48870
50981
|
out["aave-earn"] = res;
|
|
48871
50982
|
}).catch((e) => {
|
|
48872
|
-
|
|
50983
|
+
warn6(
|
|
48873
50984
|
`[vaults] aave-earn fetch failed for chain ${chainId}:`,
|
|
48874
50985
|
e?.message ?? e
|
|
48875
50986
|
);
|
|
@@ -48881,7 +50992,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48881
50992
|
fetchUpshiftVaults(chainId, prices, tokenList).then((res) => {
|
|
48882
50993
|
out.upshift = res;
|
|
48883
50994
|
}).catch((e) => {
|
|
48884
|
-
|
|
50995
|
+
warn6(
|
|
48885
50996
|
`[vaults] upshift fetch failed for chain ${chainId}:`,
|
|
48886
50997
|
e?.message ?? e
|
|
48887
50998
|
);
|
|
@@ -48893,7 +51004,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48893
51004
|
fetchYearnVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
|
|
48894
51005
|
out.yearn = res;
|
|
48895
51006
|
}).catch((e) => {
|
|
48896
|
-
|
|
51007
|
+
warn6(
|
|
48897
51008
|
`[vaults] yearn fetch failed for chain ${chainId}:`,
|
|
48898
51009
|
e?.message ?? e
|
|
48899
51010
|
);
|
|
@@ -48905,7 +51016,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48905
51016
|
fetchHypercoreVaults().then((res) => {
|
|
48906
51017
|
out.hypercore = res;
|
|
48907
51018
|
}).catch((e) => {
|
|
48908
|
-
|
|
51019
|
+
warn6(
|
|
48909
51020
|
`[vaults] hypercore fetch failed for chain ${chainId}:`,
|
|
48910
51021
|
e?.message ?? e
|
|
48911
51022
|
);
|
|
@@ -48917,7 +51028,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48917
51028
|
fetchGmxVaults(chainId, multicallRetry).then((res) => {
|
|
48918
51029
|
out.gmx = res;
|
|
48919
51030
|
}).catch((e) => {
|
|
48920
|
-
|
|
51031
|
+
warn6(
|
|
48921
51032
|
`[vaults] gmx fetch failed for chain ${chainId}:`,
|
|
48922
51033
|
e?.message ?? e
|
|
48923
51034
|
);
|
|
@@ -48933,7 +51044,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
|
|
|
48933
51044
|
);
|
|
48934
51045
|
if (fees) out.gmxExecutionFees = fees;
|
|
48935
51046
|
})().catch((e) => {
|
|
48936
|
-
|
|
51047
|
+
warn6(
|
|
48937
51048
|
`[vaults] gmx execution-fee fetch failed for chain ${chainId}:`,
|
|
48938
51049
|
e?.message ?? e
|
|
48939
51050
|
);
|
|
@@ -49480,6 +51591,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
|
|
|
49480
51591
|
return parseTokenBalanceResult(rawResult, prepared.query);
|
|
49481
51592
|
}
|
|
49482
51593
|
|
|
49483
|
-
export { ApiBookSource, DEFAULT_MIDNIGHT_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyVault, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, convertLenderUserDataResult, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchLagoonApiVaults, fetchLagoonVaults, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchSiloVaults, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, isStablecoinSymbol, isYearnV3, keysFromMaps, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, readVaultSharePrices, resolveStCeloDepositGroup, selectAssetGroupPrices, stampVaultClassification, tickToAprNumber, tickToPrice, unflattenLenderData };
|
|
51594
|
+
export { ApiBookSource, DEFAULT_MIDNIGHT_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyVault, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, convertExactlyMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTermMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTermMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, isStablecoinSymbol, isYearnV3, keysFromMaps, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, readVaultSharePrices, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, termLenderKey, tickToAprNumber, tickToPrice, unflattenLenderData };
|
|
49484
51595
|
//# sourceMappingURL=index.js.map
|
|
49485
51596
|
//# sourceMappingURL=index.js.map
|