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