@1delta/margin-fetcher 5.0.2 → 5.0.3
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.js +1929 -604
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
|
|
2
2
|
import './chunk-BYTNVMX7.js';
|
|
3
3
|
import './chunk-PR4QN5HX.js';
|
|
4
|
-
import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isUsdd, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
4
|
+
import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isUsdd, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isCurvance, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
5
5
|
export { hasCrossMarginRisk, 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, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, llamaLendLendersByChain, usddLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, usddConfigFor, usddChainData, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
|
|
6
|
+
import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, llamaLendLendersByChain, usddLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, usddConfigFor, usddChainData, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
|
|
7
7
|
import lodash from 'lodash';
|
|
8
8
|
import { Chain } from '@1delta/chain-registry';
|
|
9
9
|
import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
|
|
10
|
-
import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, ResupplyUtilitiesAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
|
|
10
|
+
import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, ResupplyUtilitiesAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
|
|
11
11
|
export { MorphoLensAbi } from '@1delta/abis';
|
|
12
12
|
import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
|
|
13
13
|
import { proxyNativeFetch } from '@1delta/proxy-fetch';
|
|
@@ -6430,6 +6430,9 @@ var getLendersForChain = (c) => {
|
|
|
6430
6430
|
for (const l of resupplyLendersByChain(c)) {
|
|
6431
6431
|
lenders.push(l);
|
|
6432
6432
|
}
|
|
6433
|
+
for (const l of curvanceLendersByChain(c)) {
|
|
6434
|
+
lenders.push(l);
|
|
6435
|
+
}
|
|
6433
6436
|
if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
|
|
6434
6437
|
lenders.push(Lender.TELLER);
|
|
6435
6438
|
}
|
|
@@ -7050,9 +7053,9 @@ var calculateRateForCompoundType2 = (n) => {
|
|
|
7050
7053
|
const rate = Number(formatEther(BigInt(n)));
|
|
7051
7054
|
return (Math.pow(rate * 60 * 60 * 24 / 12 + 1, 365) - 1) * 100;
|
|
7052
7055
|
};
|
|
7053
|
-
var calculateRateForCompoundType = (n, chainId,
|
|
7056
|
+
var calculateRateForCompoundType = (n, chainId, scale2 = 1 /* SECOND */) => {
|
|
7054
7057
|
const rate = Number(formatEther(BigInt(n)));
|
|
7055
|
-
if (
|
|
7058
|
+
if (scale2 === 0 /* BLOCK */)
|
|
7056
7059
|
return (Math.pow(
|
|
7057
7060
|
rate * 60 * 60 * 24 / (BLOCK_TIMES[chainId] ?? "1") + 1,
|
|
7058
7061
|
365
|
|
@@ -7226,6 +7229,31 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
7226
7229
|
}
|
|
7227
7230
|
}
|
|
7228
7231
|
};
|
|
7232
|
+
|
|
7233
|
+
// src/lending/public-data/aave-v3-type/reserveIndexSanity.ts
|
|
7234
|
+
var RAY = 10n ** 27n;
|
|
7235
|
+
var MAX_PLAUSIBLE_INDEX_MULTIPLE = 1000n;
|
|
7236
|
+
function isReserveIndexSane(index) {
|
|
7237
|
+
if (index === void 0 || index === null) return true;
|
|
7238
|
+
let value;
|
|
7239
|
+
try {
|
|
7240
|
+
value = BigInt(index);
|
|
7241
|
+
} catch {
|
|
7242
|
+
return true;
|
|
7243
|
+
}
|
|
7244
|
+
if (value === 0n) return true;
|
|
7245
|
+
return value <= RAY * MAX_PLAUSIBLE_INDEX_MULTIPLE;
|
|
7246
|
+
}
|
|
7247
|
+
function reserveIndicesAreSane(params) {
|
|
7248
|
+
const { chainId, lender, asset, liquidityIndex, variableBorrowIndex } = params;
|
|
7249
|
+
const liquidityOk = isReserveIndexSane(liquidityIndex);
|
|
7250
|
+
const borrowOk = isReserveIndexSane(variableBorrowIndex);
|
|
7251
|
+
if (liquidityOk && borrowOk) return true;
|
|
7252
|
+
console.error(
|
|
7253
|
+
`[reserve-index-sanity] dropping ${lender} ${asset} on chain ${chainId}: liquidityIndex=${liquidityIndex} variableBorrowIndex=${variableBorrowIndex} \u2014 implausible accumulator, refusing to publish derived balances`
|
|
7254
|
+
);
|
|
7255
|
+
return false;
|
|
7256
|
+
}
|
|
7229
7257
|
var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
|
|
7230
7258
|
if (isAaveV32Type(lender))
|
|
7231
7259
|
return parseAave32(
|
|
@@ -7284,6 +7312,14 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
7284
7312
|
const debtCeiling = data[i * stride + 4];
|
|
7285
7313
|
const reserveEMode = data[i * stride + 5];
|
|
7286
7314
|
const aTokenBalanceRaw = data[i * stride + 6];
|
|
7315
|
+
if (!reserveIndicesAreSane({
|
|
7316
|
+
chainId,
|
|
7317
|
+
lender,
|
|
7318
|
+
asset,
|
|
7319
|
+
liquidityIndex: reserveData?.[9 /* liquidityIndex */],
|
|
7320
|
+
variableBorrowIndex: reserveData?.[10 /* variableBorrowIndex */]
|
|
7321
|
+
}))
|
|
7322
|
+
continue;
|
|
7287
7323
|
const assetMeta = tokenList[asset];
|
|
7288
7324
|
const decimals = assetMeta?.decimals ?? 18;
|
|
7289
7325
|
const totalDeposits = parseRawAmount(
|
|
@@ -7300,7 +7336,9 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
7300
7336
|
);
|
|
7301
7337
|
const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
|
|
7302
7338
|
const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
|
|
7303
|
-
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7339
|
+
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7340
|
+
parseRawAmount(availableLiquidityRaw?.toString(), decimals)
|
|
7341
|
+
) : Math.max(
|
|
7304
7342
|
0,
|
|
7305
7343
|
Number(totalDeposits) - Number(totalDebt) - Number(totalDebtStable)
|
|
7306
7344
|
);
|
|
@@ -7387,7 +7425,13 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
7387
7425
|
...(() => {
|
|
7388
7426
|
const bc = Number(reserveCaps[0]?.toString());
|
|
7389
7427
|
const liq = resultReserves[marketUid].totalLiquidity;
|
|
7390
|
-
const bl = bc > 0 ? Math.min(
|
|
7428
|
+
const bl = bc > 0 ? Math.min(
|
|
7429
|
+
liq,
|
|
7430
|
+
Math.max(
|
|
7431
|
+
0,
|
|
7432
|
+
bc - Number(totalDebt) - Number(totalDebtStable)
|
|
7433
|
+
)
|
|
7434
|
+
) : liq;
|
|
7391
7435
|
return {
|
|
7392
7436
|
borrowLiquidity: bl,
|
|
7393
7437
|
borrowLiquidityUSD: bl * price2
|
|
@@ -7553,7 +7597,9 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
|
|
|
7553
7597
|
);
|
|
7554
7598
|
const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
|
|
7555
7599
|
const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
|
|
7556
|
-
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7600
|
+
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7601
|
+
parseRawAmount(availableLiquidityRaw?.toString(), decimals)
|
|
7602
|
+
) : Math.max(0, Number(totalAToken) - Number(totalVariableDebt));
|
|
7557
7603
|
const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
|
|
7558
7604
|
const price2 = prices[oracleKey] ?? 0;
|
|
7559
7605
|
const totalDepositsUSD = Number(totalAToken) * price2;
|
|
@@ -7695,6 +7741,14 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
7695
7741
|
const reserveCaps = data[i * stride + 3];
|
|
7696
7742
|
const debtCeiling = data[i * stride + 4];
|
|
7697
7743
|
const aTokenBalanceRaw = data[i * stride + 5];
|
|
7744
|
+
if (!reserveIndicesAreSane({
|
|
7745
|
+
chainId,
|
|
7746
|
+
lender,
|
|
7747
|
+
asset,
|
|
7748
|
+
liquidityIndex: reserveData?.[9 /* liquidityIndex */],
|
|
7749
|
+
variableBorrowIndex: reserveData?.[10 /* variableBorrowIndex */]
|
|
7750
|
+
}))
|
|
7751
|
+
continue;
|
|
7698
7752
|
const assetMeta = tokenList[asset];
|
|
7699
7753
|
const decimals = assetMeta?.decimals ?? 18;
|
|
7700
7754
|
const totalDeposits = parseRawAmount(
|
|
@@ -7711,7 +7765,9 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
7711
7765
|
);
|
|
7712
7766
|
const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
|
|
7713
7767
|
const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
|
|
7714
|
-
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7768
|
+
const liquidity = availableLiquidityRaw !== void 0 ? Number(
|
|
7769
|
+
parseRawAmount(availableLiquidityRaw?.toString(), decimals)
|
|
7770
|
+
) : Math.max(
|
|
7715
7771
|
0,
|
|
7716
7772
|
Number(totalDeposits) - Number(totalDebt) - Number(totalDebtStable)
|
|
7717
7773
|
);
|
|
@@ -7800,7 +7856,13 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
7800
7856
|
...(() => {
|
|
7801
7857
|
const bc = Number(reserveCaps[0]?.toString());
|
|
7802
7858
|
const liq = resultReserves[marketUid].totalLiquidity;
|
|
7803
|
-
const bl = bc > 0 ? Math.min(
|
|
7859
|
+
const bl = bc > 0 ? Math.min(
|
|
7860
|
+
liq,
|
|
7861
|
+
Math.max(
|
|
7862
|
+
0,
|
|
7863
|
+
bc - Number(totalDebt) - Number(totalDebtStable)
|
|
7864
|
+
)
|
|
7865
|
+
) : liq;
|
|
7804
7866
|
return {
|
|
7805
7867
|
borrowLiquidity: bl,
|
|
7806
7868
|
borrowLiquidityUSD: bl * price2
|
|
@@ -7945,9 +8007,9 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
|
|
|
7945
8007
|
});
|
|
7946
8008
|
});
|
|
7947
8009
|
Object.entries(eModes).forEach(([modeId, modeData]) => {
|
|
7948
|
-
Object.entries(result).forEach(([
|
|
7949
|
-
if (!result[
|
|
7950
|
-
result[
|
|
8010
|
+
Object.entries(result).forEach(([key2, _3]) => {
|
|
8011
|
+
if (!result[key2].config[modeId]) {
|
|
8012
|
+
result[key2].config[modeId] = {
|
|
7951
8013
|
label: modeData.label,
|
|
7952
8014
|
category: modeData.category,
|
|
7953
8015
|
debtDisabled: true,
|
|
@@ -10019,8 +10081,8 @@ var brokerAbi = parseAbi([
|
|
|
10019
10081
|
var BROKER_CACHE = {};
|
|
10020
10082
|
var FIXED_TERMS_CACHE = {};
|
|
10021
10083
|
var BROKER_USER_CACHE = {};
|
|
10022
|
-
function toBytes32MarketId(
|
|
10023
|
-
const raw =
|
|
10084
|
+
function toBytes32MarketId(key2) {
|
|
10085
|
+
const raw = key2.startsWith("LISTA_DAO_") ? "0x" + key2.slice("LISTA_DAO_".length) : key2;
|
|
10024
10086
|
return raw.toLowerCase();
|
|
10025
10087
|
}
|
|
10026
10088
|
function ceilDiv(a, b) {
|
|
@@ -10055,8 +10117,8 @@ async function resolveListaBrokers(chainId, marketKeys, getClient = getEvmClient
|
|
|
10055
10117
|
if (!moolah || marketKeys.length === 0) return out;
|
|
10056
10118
|
const cache = BROKER_CACHE[chainId] ??= {};
|
|
10057
10119
|
const missing = [];
|
|
10058
|
-
for (const
|
|
10059
|
-
const id = toBytes32MarketId(
|
|
10120
|
+
for (const key2 of marketKeys) {
|
|
10121
|
+
const id = toBytes32MarketId(key2);
|
|
10060
10122
|
if (cache[id] === void 0) missing.push(id);
|
|
10061
10123
|
}
|
|
10062
10124
|
if (missing.length > 0) {
|
|
@@ -10079,8 +10141,8 @@ async function resolveListaBrokers(chainId, marketKeys, getClient = getEvmClient
|
|
|
10079
10141
|
} catch {
|
|
10080
10142
|
}
|
|
10081
10143
|
}
|
|
10082
|
-
for (const
|
|
10083
|
-
const id = toBytes32MarketId(
|
|
10144
|
+
for (const key2 of marketKeys) {
|
|
10145
|
+
const id = toBytes32MarketId(key2);
|
|
10084
10146
|
const broker = cache[id];
|
|
10085
10147
|
if (broker && broker !== zeroAddress) out[id] = broker;
|
|
10086
10148
|
}
|
|
@@ -10402,15 +10464,15 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
|
|
|
10402
10464
|
oracleDebt += debtStableUSDOracle;
|
|
10403
10465
|
oracleDebt += debtUSDOracle;
|
|
10404
10466
|
(rewards ?? []).forEach((rewardData) => {
|
|
10405
|
-
const
|
|
10467
|
+
const key2 = rewardData.asset;
|
|
10406
10468
|
rewardDepositAccrual += rewardData.depositRate * depositsUSD;
|
|
10407
10469
|
rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
|
|
10408
10470
|
const rewDepo = rewardData.depositRate * depositsUSD;
|
|
10409
10471
|
const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
|
|
10410
|
-
if (!rewardsPerAsset[
|
|
10411
|
-
rewardsPerAsset[
|
|
10412
|
-
if (rewDepo > 0) rewardsPerAsset[
|
|
10413
|
-
if (rewDebt > 0) rewardsPerAsset[
|
|
10472
|
+
if (!rewardsPerAsset[key2])
|
|
10473
|
+
rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
|
|
10474
|
+
if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
|
|
10475
|
+
if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
|
|
10414
10476
|
});
|
|
10415
10477
|
stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
|
|
10416
10478
|
stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
|
|
@@ -11136,15 +11198,15 @@ function createSumerUserState(payload, lenderData, totalDeposits24h = 0, totalDe
|
|
|
11136
11198
|
oracleDebt += debtStableUSDOracle;
|
|
11137
11199
|
oracleDebt += debtUSDOracle;
|
|
11138
11200
|
(rewards ?? []).forEach((rewardData) => {
|
|
11139
|
-
const
|
|
11201
|
+
const key2 = rewardData.asset;
|
|
11140
11202
|
rewardDepositAccrual += rewardData.depositRate * depositsUSD;
|
|
11141
11203
|
rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
|
|
11142
11204
|
const rewDepo = rewardData.depositRate * depositsUSD;
|
|
11143
11205
|
const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
|
|
11144
|
-
if (!rewardsPerAsset[
|
|
11145
|
-
rewardsPerAsset[
|
|
11146
|
-
if (rewDepo > 0) rewardsPerAsset[
|
|
11147
|
-
if (rewDebt > 0) rewardsPerAsset[
|
|
11206
|
+
if (!rewardsPerAsset[key2])
|
|
11207
|
+
rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
|
|
11208
|
+
if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
|
|
11209
|
+
if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
|
|
11148
11210
|
});
|
|
11149
11211
|
stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
|
|
11150
11212
|
stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
|
|
@@ -11490,12 +11552,12 @@ function rateToApy(rate) {
|
|
|
11490
11552
|
);
|
|
11491
11553
|
}
|
|
11492
11554
|
function parseLtv(ltv) {
|
|
11493
|
-
let
|
|
11555
|
+
let str4 = 0;
|
|
11494
11556
|
try {
|
|
11495
|
-
|
|
11557
|
+
str4 = Number(formatUnits(BigInt(ltv), 18));
|
|
11496
11558
|
} catch (e) {
|
|
11497
11559
|
}
|
|
11498
|
-
return
|
|
11560
|
+
return str4;
|
|
11499
11561
|
}
|
|
11500
11562
|
function liquidationPenaltyFromLltv(lltv) {
|
|
11501
11563
|
if (!lltv || lltv <= 0) return 0;
|
|
@@ -15138,11 +15200,11 @@ function toAddress(value) {
|
|
|
15138
15200
|
return value.toString();
|
|
15139
15201
|
throw new Error(`Cannot convert value to address string: ${String(value)}`);
|
|
15140
15202
|
}
|
|
15141
|
-
function field(src,
|
|
15203
|
+
function field(src, key2, index) {
|
|
15142
15204
|
if (src == null) throw new Error("Source is null/undefined");
|
|
15143
|
-
if (
|
|
15205
|
+
if (key2 in src) return src[key2];
|
|
15144
15206
|
if (Array.isArray(src)) return src[index];
|
|
15145
|
-
return src[
|
|
15207
|
+
return src[key2];
|
|
15146
15208
|
}
|
|
15147
15209
|
function parseMarketIncentives(input) {
|
|
15148
15210
|
return {
|
|
@@ -15213,11 +15275,11 @@ function toBigInt2(value) {
|
|
|
15213
15275
|
}
|
|
15214
15276
|
throw new Error(`Cannot convert value to bigint: ${String(value)}`);
|
|
15215
15277
|
}
|
|
15216
|
-
function field2(src,
|
|
15278
|
+
function field2(src, key2, index) {
|
|
15217
15279
|
if (src == null) throw new Error("Source is null/undefined");
|
|
15218
|
-
if (
|
|
15280
|
+
if (key2 in src) return src[key2];
|
|
15219
15281
|
if (Array.isArray(src)) return src[index];
|
|
15220
|
-
return src[
|
|
15282
|
+
return src[key2];
|
|
15221
15283
|
}
|
|
15222
15284
|
function computeApy(rateRaw, timestampsPerYear) {
|
|
15223
15285
|
const rate = Number(formatEther(rateRaw));
|
|
@@ -15278,11 +15340,11 @@ function toBool3(value) {
|
|
|
15278
15340
|
if (typeof value === "number") return value !== 0;
|
|
15279
15341
|
return Boolean(value);
|
|
15280
15342
|
}
|
|
15281
|
-
function field3(src,
|
|
15343
|
+
function field3(src, key2, index) {
|
|
15282
15344
|
if (src == null) throw new Error("Source is null/undefined");
|
|
15283
|
-
if (
|
|
15345
|
+
if (key2 in src) return src[key2];
|
|
15284
15346
|
if (Array.isArray(src)) return src[index];
|
|
15285
|
-
return src[
|
|
15347
|
+
return src[key2];
|
|
15286
15348
|
}
|
|
15287
15349
|
function parseTectonicMarketData(input) {
|
|
15288
15350
|
return {
|
|
@@ -15350,11 +15412,11 @@ function toBool4(value) {
|
|
|
15350
15412
|
if (typeof value === "number") return value !== 0;
|
|
15351
15413
|
return Boolean(value);
|
|
15352
15414
|
}
|
|
15353
|
-
function field4(src,
|
|
15415
|
+
function field4(src, key2, index) {
|
|
15354
15416
|
if (src == null) throw new Error("Source is null/undefined");
|
|
15355
|
-
if (
|
|
15417
|
+
if (key2 in src) return src[key2];
|
|
15356
15418
|
if (Array.isArray(src)) return src[index];
|
|
15357
|
-
return src[
|
|
15419
|
+
return src[key2];
|
|
15358
15420
|
}
|
|
15359
15421
|
function parseKineticMarketMetadata(input) {
|
|
15360
15422
|
return {
|
|
@@ -15793,11 +15855,11 @@ function toBool5(value) {
|
|
|
15793
15855
|
if (typeof value === "number") return value !== 0;
|
|
15794
15856
|
return Boolean(value);
|
|
15795
15857
|
}
|
|
15796
|
-
function field5(src,
|
|
15858
|
+
function field5(src, key2, index) {
|
|
15797
15859
|
if (src == null) throw new Error("Source is null/undefined");
|
|
15798
|
-
if (
|
|
15860
|
+
if (key2 in src) return src[key2];
|
|
15799
15861
|
if (Array.isArray(src)) return src[index];
|
|
15800
|
-
return src[
|
|
15862
|
+
return src[key2];
|
|
15801
15863
|
}
|
|
15802
15864
|
function parseToken(raw) {
|
|
15803
15865
|
return {
|
|
@@ -16025,11 +16087,11 @@ function capRate(rate) {
|
|
|
16025
16087
|
if (!Number.isFinite(rate)) return MAX_RATE;
|
|
16026
16088
|
return Math.min(rate, MAX_RATE);
|
|
16027
16089
|
}
|
|
16028
|
-
function pick(meta,
|
|
16090
|
+
function pick(meta, key2, index) {
|
|
16029
16091
|
if (meta == null) return void 0;
|
|
16030
|
-
if (
|
|
16092
|
+
if (key2 in meta) return meta[key2];
|
|
16031
16093
|
if (Array.isArray(meta)) return meta[index];
|
|
16032
|
-
return meta[
|
|
16094
|
+
return meta[key2];
|
|
16033
16095
|
}
|
|
16034
16096
|
var DEFAULT_PAUSED_ACTIONS = {
|
|
16035
16097
|
[0 /* MINT */]: false,
|
|
@@ -17373,8 +17435,8 @@ function getActiveCollaterals(ltvInfo) {
|
|
|
17373
17435
|
return active;
|
|
17374
17436
|
}
|
|
17375
17437
|
function findVaultInfo(normalizedAddr, vaultData) {
|
|
17376
|
-
for (const [
|
|
17377
|
-
if (
|
|
17438
|
+
for (const [key2, value] of vaultData) {
|
|
17439
|
+
if (key2.toLowerCase() === normalizedAddr) return value;
|
|
17378
17440
|
}
|
|
17379
17441
|
return void 0;
|
|
17380
17442
|
}
|
|
@@ -17484,9 +17546,9 @@ var LTV_SCALE = 10000n;
|
|
|
17484
17546
|
function ltvToNumber(ltv) {
|
|
17485
17547
|
return Number(ltv) / Number(LTV_SCALE);
|
|
17486
17548
|
}
|
|
17487
|
-
var
|
|
17549
|
+
var RAY2 = 10n ** 27n;
|
|
17488
17550
|
function rayToNumber(ray) {
|
|
17489
|
-
return Number(ray) / Number(
|
|
17551
|
+
return Number(ray) / Number(RAY2);
|
|
17490
17552
|
}
|
|
17491
17553
|
function toTokenAmount(raw, decimals) {
|
|
17492
17554
|
return Number(raw) / 10 ** Number(decimals);
|
|
@@ -17656,8 +17718,8 @@ function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
|
|
|
17656
17718
|
};
|
|
17657
17719
|
}
|
|
17658
17720
|
function findInfo(addr2, vaultData) {
|
|
17659
|
-
for (const [
|
|
17660
|
-
if (
|
|
17721
|
+
for (const [key2, value] of vaultData) {
|
|
17722
|
+
if (key2.toLowerCase() === addr2) return value;
|
|
17661
17723
|
}
|
|
17662
17724
|
return void 0;
|
|
17663
17725
|
}
|
|
@@ -17859,11 +17921,11 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
|
|
|
17859
17921
|
{ address: spokeAddr, name: "getReserveDebt", params: [rid] },
|
|
17860
17922
|
{ address: spokeAddr, name: "getReserveTotalDebt", params: [rid] }
|
|
17861
17923
|
);
|
|
17862
|
-
for (let
|
|
17924
|
+
for (let key2 = 0; key2 < dynConfigCount; key2++) {
|
|
17863
17925
|
calls.push({
|
|
17864
17926
|
address: spokeAddr,
|
|
17865
17927
|
name: "getDynamicReserveConfig",
|
|
17866
|
-
params: [rid,
|
|
17928
|
+
params: [rid, key2]
|
|
17867
17929
|
});
|
|
17868
17930
|
}
|
|
17869
17931
|
}
|
|
@@ -17947,12 +18009,12 @@ function toTokenNumber(raw, decimals) {
|
|
|
17947
18009
|
if (raw === 0n) return 0;
|
|
17948
18010
|
return parseFloat(toTokenAmount2(raw, decimals));
|
|
17949
18011
|
}
|
|
17950
|
-
var
|
|
18012
|
+
var RAY3 = 1e27;
|
|
17951
18013
|
var MAX_SPOKE_CAP = 2 ** 40 - 1;
|
|
17952
18014
|
var RAY_BIGINT = 10n ** 27n;
|
|
17953
18015
|
function rayRateToApr(rateRay) {
|
|
17954
18016
|
if (rateRay === 0n) return 0;
|
|
17955
|
-
return Number(rateRay) /
|
|
18017
|
+
return Number(rateRay) / RAY3 * 100;
|
|
17956
18018
|
}
|
|
17957
18019
|
function normalizeAaveV4(spokeDataList, chainId, spokeLenderKeyArg, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn) {
|
|
17958
18020
|
const spokeData = spokeDataList[0];
|
|
@@ -18188,11 +18250,11 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
18188
18250
|
const rawTotalDebt = data[offset + 4];
|
|
18189
18251
|
offset += BASE_CALLS_PER_RESERVE;
|
|
18190
18252
|
const dynamicConfigs = {};
|
|
18191
|
-
for (let
|
|
18253
|
+
for (let key2 = 0; key2 < dynConfigCount; key2++) {
|
|
18192
18254
|
const rawDynConfig = data[offset];
|
|
18193
18255
|
offset += 1;
|
|
18194
18256
|
if (rawDynConfig && rawDynConfig !== "0x") {
|
|
18195
|
-
dynamicConfigs[
|
|
18257
|
+
dynamicConfigs[key2] = {
|
|
18196
18258
|
collateralFactor: Number(rawDynConfig?.collateralFactor ?? 0),
|
|
18197
18259
|
maxLiquidationBonus: Number(
|
|
18198
18260
|
rawDynConfig?.maxLiquidationBonus ?? 0
|
|
@@ -20049,7 +20111,7 @@ var MIDNIGHT_BOOK_LEVELS = 20;
|
|
|
20049
20111
|
var LKG_TTL_SEC = 30 * 60;
|
|
20050
20112
|
var lastGood = /* @__PURE__ */ new Map();
|
|
20051
20113
|
async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec9) {
|
|
20052
|
-
const
|
|
20114
|
+
const key2 = `${chainId}:${marketId}`;
|
|
20053
20115
|
let fresh = null;
|
|
20054
20116
|
if (source.getTopAndBook) {
|
|
20055
20117
|
fresh = await source.getTopAndBook(marketId, MIDNIGHT_BOOK_LEVELS).catch(() => null);
|
|
@@ -20058,10 +20120,10 @@ async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec9) {
|
|
|
20058
20120
|
if (top) fresh = { top, book: { bids: [], asks: [] } };
|
|
20059
20121
|
}
|
|
20060
20122
|
if (fresh) {
|
|
20061
|
-
lastGood.set(
|
|
20123
|
+
lastGood.set(key2, { top: fresh.top, book: fresh.book, at: nowSec9 });
|
|
20062
20124
|
return { top: fresh.top, book: fresh.book };
|
|
20063
20125
|
}
|
|
20064
|
-
const cached = lastGood.get(
|
|
20126
|
+
const cached = lastGood.get(key2);
|
|
20065
20127
|
if (cached && nowSec9 - cached.at <= LKG_TTL_SEC) {
|
|
20066
20128
|
return { top: cached.top, book: cached.book };
|
|
20067
20129
|
}
|
|
@@ -20529,8 +20591,8 @@ var TermSubgraphSource = class {
|
|
|
20529
20591
|
const auction = data.termAuctions?.[0];
|
|
20530
20592
|
const clearingRate = toNum(auction?.auctionClearingPrice);
|
|
20531
20593
|
const aprPct = clearingRate > 0 ? clearingRate / WAD3 * 100 : 0;
|
|
20532
|
-
const
|
|
20533
|
-
const toLoan = (repoUnits) => Number(repoUnits * redemptionRatio / BigInt(WAD3)) /
|
|
20594
|
+
const scale2 = Math.pow(10, config.loanDecimals);
|
|
20595
|
+
const toLoan = (repoUnits) => Number(repoUnits * redemptionRatio / BigInt(WAD3)) / scale2;
|
|
20534
20596
|
const orders = (data.termOrders ?? []).map((o) => ({
|
|
20535
20597
|
remaining: toBig3(o.originalOrderAmount) - toBig3(o.filledAmount),
|
|
20536
20598
|
isAsk: String(o.makerToken).toLowerCase() === repoToken
|
|
@@ -20619,7 +20681,7 @@ var TermSubgraphSource = class {
|
|
|
20619
20681
|
{ term, who }
|
|
20620
20682
|
);
|
|
20621
20683
|
if (!data) return null;
|
|
20622
|
-
const
|
|
20684
|
+
const scale2 = Math.pow(10, config.loanDecimals);
|
|
20623
20685
|
const toOrder = (o, side, revealedRaw) => {
|
|
20624
20686
|
const a = o.auction ?? {};
|
|
20625
20687
|
const complete = Boolean(a.auctionComplete);
|
|
@@ -20631,7 +20693,7 @@ var TermSubgraphSource = class {
|
|
|
20631
20693
|
auctionId: String(a.id ?? ""),
|
|
20632
20694
|
account,
|
|
20633
20695
|
amount: String(o.amount ?? "0"),
|
|
20634
|
-
assets: Number(toBig3(o.amount)) /
|
|
20696
|
+
assets: Number(toBig3(o.amount)) / scale2,
|
|
20635
20697
|
assignedAmount: String(o.assignedAmount ?? "0"),
|
|
20636
20698
|
locked: Boolean(o.locked),
|
|
20637
20699
|
revealed,
|
|
@@ -20662,7 +20724,7 @@ var TERM_BOOK_LEVELS = 20;
|
|
|
20662
20724
|
var LKG_TTL_SEC2 = 30 * 60;
|
|
20663
20725
|
var lastGood2 = /* @__PURE__ */ new Map();
|
|
20664
20726
|
async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
|
|
20665
|
-
const
|
|
20727
|
+
const key2 = `${chainId}:${config.termRepoId}`;
|
|
20666
20728
|
let fresh = null;
|
|
20667
20729
|
if (source.getTopAndBook) {
|
|
20668
20730
|
fresh = await source.getTopAndBook(config, TERM_BOOK_LEVELS).catch(() => null);
|
|
@@ -20671,7 +20733,7 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
|
|
|
20671
20733
|
if (top) fresh = { top, book: { bids: [], asks: [] }, auction: null };
|
|
20672
20734
|
}
|
|
20673
20735
|
if (fresh) {
|
|
20674
|
-
lastGood2.set(
|
|
20736
|
+
lastGood2.set(key2, {
|
|
20675
20737
|
top: fresh.top,
|
|
20676
20738
|
book: fresh.book,
|
|
20677
20739
|
auction: fresh.auction ?? null,
|
|
@@ -20679,7 +20741,7 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
|
|
|
20679
20741
|
});
|
|
20680
20742
|
return { top: fresh.top, book: fresh.book, auction: fresh.auction ?? null };
|
|
20681
20743
|
}
|
|
20682
|
-
const cached = lastGood2.get(
|
|
20744
|
+
const cached = lastGood2.get(key2);
|
|
20683
20745
|
if (cached && nowSec9 - cached.at <= LKG_TTL_SEC2) {
|
|
20684
20746
|
const stillOpen = cached.auction && cached.auction.endTime > nowSec9 ? cached.auction : null;
|
|
20685
20747
|
return { top: cached.top, book: cached.book, auction: stillOpen };
|
|
@@ -21270,10 +21332,10 @@ async function fetchLiquityMarkets(lender, chainId) {
|
|
|
21270
21332
|
function liquityLenderKey(lender, chainId, collIndex) {
|
|
21271
21333
|
return `${lender}_${chainId}_${collIndex}`;
|
|
21272
21334
|
}
|
|
21273
|
-
function liquityKeyParts(
|
|
21274
|
-
const base = LIQUITY_FAMILY_LENDERS.find((b) =>
|
|
21335
|
+
function liquityKeyParts(key2) {
|
|
21336
|
+
const base = LIQUITY_FAMILY_LENDERS.find((b) => key2.startsWith(b + "_"));
|
|
21275
21337
|
if (!base) return void 0;
|
|
21276
|
-
const suffix =
|
|
21338
|
+
const suffix = key2.slice(base.length + 1);
|
|
21277
21339
|
const m = suffix.match(/^(\d+)_(\d+)$/);
|
|
21278
21340
|
if (!m) return void 0;
|
|
21279
21341
|
return { lender: base, chainId: m[1], collIndex: Number(m[2]) };
|
|
@@ -21317,7 +21379,7 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
21317
21379
|
const collDecimals = branch.collDecimals;
|
|
21318
21380
|
const collToken = tokens[collAddr];
|
|
21319
21381
|
const collSymbol = collToken?.symbol ?? branch.name?.split(" / ").pop() ?? "COLL";
|
|
21320
|
-
const
|
|
21382
|
+
const marketName2 = branch.name ?? `${stableSymbol} / ${collSymbol}`;
|
|
21321
21383
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
21322
21384
|
const collPrice = liquityCollateralPrice(b.collPrice, collDecimals, branch.priceDecimals) || (prices[collPriceKey] ?? 0);
|
|
21323
21385
|
const entireDebt = b.entireDebt !== null ? toHuman2(b.entireDebt, stableDecimals) : 0;
|
|
@@ -21439,7 +21501,7 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
21439
21501
|
entry.params = {
|
|
21440
21502
|
market: {
|
|
21441
21503
|
lender: lenderKey,
|
|
21442
|
-
name:
|
|
21504
|
+
name: marketName2,
|
|
21443
21505
|
loanDecimals: stableDecimals,
|
|
21444
21506
|
collateralDecimals: collDecimals,
|
|
21445
21507
|
// TroveManager doubles as the branch/market id (marketUid address).
|
|
@@ -21557,9 +21619,9 @@ async function fetchRiverMarkets(lender, chainId) {
|
|
|
21557
21619
|
function riverLenderKey(lender, chainId, index) {
|
|
21558
21620
|
return `${lender}_${chainId}_${index}`;
|
|
21559
21621
|
}
|
|
21560
|
-
function riverKeyParts(
|
|
21561
|
-
if (!
|
|
21562
|
-
const suffix =
|
|
21622
|
+
function riverKeyParts(key2) {
|
|
21623
|
+
if (!key2.startsWith("RIVER_")) return void 0;
|
|
21624
|
+
const suffix = key2.slice("RIVER_".length);
|
|
21563
21625
|
const m = suffix.match(/^(\d+)_(\d+)$/);
|
|
21564
21626
|
if (!m) return void 0;
|
|
21565
21627
|
return { lender: "RIVER", chainId: m[1], index: Number(m[2]) };
|
|
@@ -21595,7 +21657,7 @@ function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYie
|
|
|
21595
21657
|
const collDecimals = market.collDecimals;
|
|
21596
21658
|
const collToken = tokens[collAddr];
|
|
21597
21659
|
const collSymbol = collToken?.symbol ?? market.name?.split(" / ").pop() ?? "COLL";
|
|
21598
|
-
const
|
|
21660
|
+
const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
|
|
21599
21661
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
21600
21662
|
const collPrice = (m.price !== null ? Number(m.price) / WAD7 : 0) || (prices[collPriceKey] ?? 0);
|
|
21601
21663
|
const entireDebt = m.entireDebt !== null ? toHuman3(m.entireDebt, debtDecimals) : 0;
|
|
@@ -21720,7 +21782,7 @@ function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYie
|
|
|
21720
21782
|
entry.params = {
|
|
21721
21783
|
market: {
|
|
21722
21784
|
lender: lenderKey,
|
|
21723
|
-
name:
|
|
21785
|
+
name: marketName2,
|
|
21724
21786
|
loanDecimals: debtDecimals,
|
|
21725
21787
|
collateralDecimals: collDecimals,
|
|
21726
21788
|
// TroveManager doubles as the market id (marketUid address).
|
|
@@ -21799,7 +21861,7 @@ async function fetchTellerMarkets(chainId) {
|
|
|
21799
21861
|
} catch {
|
|
21800
21862
|
return { chainId, pools: [] };
|
|
21801
21863
|
}
|
|
21802
|
-
const
|
|
21864
|
+
const big15 = (i) => {
|
|
21803
21865
|
const r = results[i];
|
|
21804
21866
|
if (typeof r === "bigint") return r;
|
|
21805
21867
|
if (typeof r === "number") return BigInt(r);
|
|
@@ -21812,21 +21874,21 @@ async function fetchTellerMarkets(chainId) {
|
|
|
21812
21874
|
}
|
|
21813
21875
|
return null;
|
|
21814
21876
|
};
|
|
21815
|
-
const
|
|
21816
|
-
const b =
|
|
21877
|
+
const num12 = (i) => {
|
|
21878
|
+
const b = big15(i);
|
|
21817
21879
|
return b === null ? null : Number(b);
|
|
21818
21880
|
};
|
|
21819
21881
|
const pool0 = pools.map((config, i) => {
|
|
21820
21882
|
const base = i * READS_PER_POOL;
|
|
21821
21883
|
return {
|
|
21822
21884
|
config,
|
|
21823
|
-
available:
|
|
21824
|
-
committed:
|
|
21825
|
-
minRateBps:
|
|
21826
|
-
collateralPerPrincipal:
|
|
21827
|
-
maxLoanDuration:
|
|
21828
|
-
marketId:
|
|
21829
|
-
totalAssets:
|
|
21885
|
+
available: big15(base),
|
|
21886
|
+
committed: big15(base + 1),
|
|
21887
|
+
minRateBps: num12(base + 2),
|
|
21888
|
+
collateralPerPrincipal: big15(base + 3),
|
|
21889
|
+
maxLoanDuration: num12(base + 4),
|
|
21890
|
+
marketId: big15(base + 5),
|
|
21891
|
+
totalAssets: big15(base + 6)
|
|
21830
21892
|
};
|
|
21831
21893
|
});
|
|
21832
21894
|
const attByMarket = /* @__PURE__ */ new Map();
|
|
@@ -22110,8 +22172,8 @@ function getCachedTermMaxMarkets(chainId) {
|
|
|
22110
22172
|
const prefix = `${chainId}:`;
|
|
22111
22173
|
const now = Date.now();
|
|
22112
22174
|
const out = [];
|
|
22113
|
-
for (const [
|
|
22114
|
-
if (!
|
|
22175
|
+
for (const [key2, hit] of marketCache) {
|
|
22176
|
+
if (!key2.startsWith(prefix)) continue;
|
|
22115
22177
|
if (now - hit.at > MARKET_CACHE_TTL_MS) continue;
|
|
22116
22178
|
out.push(hit.config);
|
|
22117
22179
|
}
|
|
@@ -22177,8 +22239,8 @@ function fmtDuration2(sec) {
|
|
|
22177
22239
|
function priceFor(address, chainId, tokens, prices) {
|
|
22178
22240
|
const lower3 = address.toLowerCase();
|
|
22179
22241
|
const token = tokens[lower3];
|
|
22180
|
-
const
|
|
22181
|
-
return prices[
|
|
22242
|
+
const key2 = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower3, chainId);
|
|
22243
|
+
return prices[key2] ?? 0;
|
|
22182
22244
|
}
|
|
22183
22245
|
function convertTellerMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
22184
22246
|
intrinsicYields: {},
|
|
@@ -22521,8 +22583,8 @@ function currencyFor7(address, decimals, tokens) {
|
|
|
22521
22583
|
}
|
|
22522
22584
|
function priceFor2(address, chainId, prices, tokens) {
|
|
22523
22585
|
const asset = tokens[address];
|
|
22524
|
-
const
|
|
22525
|
-
return prices[
|
|
22586
|
+
const key2 = toOracleKey(asset?.assetGroup) || toGenericPriceKey(address, chainId);
|
|
22587
|
+
return prices[key2] ?? 0;
|
|
22526
22588
|
}
|
|
22527
22589
|
function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
22528
22590
|
intrinsicYields: {},
|
|
@@ -22787,20 +22849,20 @@ async function fetchInverseMarkets(lender, chainId) {
|
|
|
22787
22849
|
if (Object.keys(byAddr).length > 0) {
|
|
22788
22850
|
const rows = markets.map((market) => {
|
|
22789
22851
|
const m = byAddr[market.address.toLowerCase()];
|
|
22790
|
-
const
|
|
22852
|
+
const num12 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
22791
22853
|
return {
|
|
22792
22854
|
market,
|
|
22793
|
-
totalDebt:
|
|
22794
|
-
dolaLiquidity:
|
|
22795
|
-
leftToBorrow:
|
|
22796
|
-
price:
|
|
22855
|
+
totalDebt: num12(m?.totalDebt),
|
|
22856
|
+
dolaLiquidity: num12(m?.dolaLiquidity),
|
|
22857
|
+
leftToBorrow: num12(m?.leftToBorrow),
|
|
22858
|
+
price: num12(m?.price),
|
|
22797
22859
|
borrowPaused: typeof m?.borrowPaused === "boolean" ? m.borrowPaused : null,
|
|
22798
|
-
dailyBorrows:
|
|
22860
|
+
dailyBorrows: num12(m?.dailyBorrows),
|
|
22799
22861
|
// The API serves it as a DECIMAL (`replenishmentIncentive: 0.1`),
|
|
22800
22862
|
// unlike the on-chain bps — normalize here, and fall back to the
|
|
22801
22863
|
// curated metadata value when the field is missing.
|
|
22802
22864
|
replenishmentIncentiveBps: (() => {
|
|
22803
|
-
const dec =
|
|
22865
|
+
const dec = num12(m?.replenishmentIncentive);
|
|
22804
22866
|
if (dec !== null) return Math.round(dec * 1e4);
|
|
22805
22867
|
const meta = Number(market.replenishmentIncentiveBps);
|
|
22806
22868
|
return Number.isFinite(meta) ? meta : null;
|
|
@@ -22885,8 +22947,8 @@ async function fetchInverseMarkets(lender, chainId) {
|
|
|
22885
22947
|
return { ...empty, dbrPriceDola: await dbrPricePromise };
|
|
22886
22948
|
}
|
|
22887
22949
|
}
|
|
22888
|
-
function num(api,
|
|
22889
|
-
const v = api?.[
|
|
22950
|
+
function num(api, key2) {
|
|
22951
|
+
const v = api?.[key2];
|
|
22890
22952
|
return typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
22891
22953
|
}
|
|
22892
22954
|
var BANDS_ENDPOINTS = [4, 10, 20, 50];
|
|
@@ -23338,13 +23400,354 @@ async function fetchResupplyMarkets(lender, chainId) {
|
|
|
23338
23400
|
return { lender, config, pairs };
|
|
23339
23401
|
}
|
|
23340
23402
|
|
|
23403
|
+
// src/prices/oracle-prices/fetchers/curvanceRoster.ts
|
|
23404
|
+
var rosterCache = /* @__PURE__ */ new Map();
|
|
23405
|
+
var key = (chainId, lender) => `${chainId}:${lender}`;
|
|
23406
|
+
function setCurvanceAssetRoster(chainId, lender, markets) {
|
|
23407
|
+
if (markets.length === 0) return;
|
|
23408
|
+
rosterCache.set(key(chainId, lender), markets);
|
|
23409
|
+
}
|
|
23410
|
+
function getCurvanceAssetRoster(chainId, lender) {
|
|
23411
|
+
return rosterCache.get(key(chainId, lender)) ?? [];
|
|
23412
|
+
}
|
|
23413
|
+
|
|
23414
|
+
// src/lending/public-data/curvance/fetchPublic.ts
|
|
23415
|
+
var FALLBACK_TOKEN_READS = 12;
|
|
23416
|
+
var zero = "0x0000000000000000000000000000000000000000";
|
|
23417
|
+
var big2 = (v) => {
|
|
23418
|
+
if (typeof v === "bigint") return v;
|
|
23419
|
+
if (typeof v === "number") return BigInt(v);
|
|
23420
|
+
if (typeof v === "string" && v !== "0x") {
|
|
23421
|
+
try {
|
|
23422
|
+
return BigInt(v);
|
|
23423
|
+
} catch {
|
|
23424
|
+
}
|
|
23425
|
+
}
|
|
23426
|
+
return 0n;
|
|
23427
|
+
};
|
|
23428
|
+
var num3 = (v, fallback) => {
|
|
23429
|
+
const n = Number(v);
|
|
23430
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
23431
|
+
};
|
|
23432
|
+
var str = (v, fallback) => typeof v === "string" && v.length > 0 ? v : fallback;
|
|
23433
|
+
async function fetchCurvanceMarkets(lender, chainId) {
|
|
23434
|
+
const config = curvanceConfigFor(lender, chainId);
|
|
23435
|
+
if (!config?.centralRegistry) return { lender, config, markets: [] };
|
|
23436
|
+
let result = { lender, config, markets: [] };
|
|
23437
|
+
if (config.protocolReader) {
|
|
23438
|
+
result = await fetchViaReader(lender, chainId, config);
|
|
23439
|
+
}
|
|
23440
|
+
if (result.markets.length === 0) {
|
|
23441
|
+
result = await fetchViaMulticall(lender, chainId, config);
|
|
23442
|
+
}
|
|
23443
|
+
setCurvanceAssetRoster(
|
|
23444
|
+
chainId,
|
|
23445
|
+
lender,
|
|
23446
|
+
result.markets.map((m) => ({
|
|
23447
|
+
marketManager: m.marketManager,
|
|
23448
|
+
assets: m.tokens.map((t) => t.asset.toLowerCase()).filter((a) => a && a !== zero)
|
|
23449
|
+
}))
|
|
23450
|
+
);
|
|
23451
|
+
return result;
|
|
23452
|
+
}
|
|
23453
|
+
async function fetchViaReader(lender, chainId, config) {
|
|
23454
|
+
const reader = config.protocolReader;
|
|
23455
|
+
let staticData = [];
|
|
23456
|
+
let dynamicData = [];
|
|
23457
|
+
for (let rpcId = 0; rpcId < 3 && staticData.length === 0; rpcId++) {
|
|
23458
|
+
try {
|
|
23459
|
+
const client = getEvmClientUniversal({ chain: chainId, rpcId });
|
|
23460
|
+
const [staticRes, dynamicRes] = await Promise.all([
|
|
23461
|
+
client.readContract({
|
|
23462
|
+
address: reader,
|
|
23463
|
+
abi: CurvanceProtocolReaderAbi,
|
|
23464
|
+
functionName: "getStaticMarketData"
|
|
23465
|
+
}),
|
|
23466
|
+
client.readContract({
|
|
23467
|
+
address: reader,
|
|
23468
|
+
abi: CurvanceProtocolReaderAbi,
|
|
23469
|
+
functionName: "getAllDynamicState",
|
|
23470
|
+
args: [zero]
|
|
23471
|
+
}).catch(() => void 0)
|
|
23472
|
+
]);
|
|
23473
|
+
if (Array.isArray(staticRes)) staticData = staticRes;
|
|
23474
|
+
if (Array.isArray(dynamicRes) && Array.isArray(dynamicRes[0])) {
|
|
23475
|
+
dynamicData = dynamicRes[0];
|
|
23476
|
+
}
|
|
23477
|
+
} catch {
|
|
23478
|
+
}
|
|
23479
|
+
}
|
|
23480
|
+
if (staticData.length === 0) return { lender, config, markets: [] };
|
|
23481
|
+
const dynamicByToken = /* @__PURE__ */ new Map();
|
|
23482
|
+
for (const m of dynamicData) {
|
|
23483
|
+
for (const t of m?.tokens ?? []) {
|
|
23484
|
+
if (t?._address) dynamicByToken.set(String(t._address).toLowerCase(), t);
|
|
23485
|
+
}
|
|
23486
|
+
}
|
|
23487
|
+
const allow = allowlist(config);
|
|
23488
|
+
const markets = [];
|
|
23489
|
+
for (const m of staticData) {
|
|
23490
|
+
const marketManager = String(m?._address ?? "");
|
|
23491
|
+
if (!marketManager.startsWith("0x")) continue;
|
|
23492
|
+
if (allow && !allow.has(marketManager.toLowerCase())) continue;
|
|
23493
|
+
const tokens = [];
|
|
23494
|
+
for (const t of m?.tokens ?? []) {
|
|
23495
|
+
const cToken = String(t?._address ?? "");
|
|
23496
|
+
if (!cToken.startsWith("0x")) continue;
|
|
23497
|
+
if (t?.isListed === false) continue;
|
|
23498
|
+
const d = dynamicByToken.get(cToken.toLowerCase());
|
|
23499
|
+
tokens.push({
|
|
23500
|
+
cToken,
|
|
23501
|
+
symbol: str(t?.symbol, "c?"),
|
|
23502
|
+
name: str(t?.name, "Curvance"),
|
|
23503
|
+
decimals: num3(t?.decimals, 18),
|
|
23504
|
+
asset: String(t?.asset?._address ?? zero),
|
|
23505
|
+
assetSymbol: str(t?.asset?.symbol, "?"),
|
|
23506
|
+
assetName: str(t?.asset?.name, "?"),
|
|
23507
|
+
assetDecimals: num3(t?.asset?.decimals, 18),
|
|
23508
|
+
collRatio: big2(t?.collRatio),
|
|
23509
|
+
collReqSoft: big2(t?.collReqSoft),
|
|
23510
|
+
collReqHard: big2(t?.collReqHard),
|
|
23511
|
+
liqIncBase: big2(t?.liqIncBase),
|
|
23512
|
+
liqIncCurve: big2(t?.liqIncCurve),
|
|
23513
|
+
closeFactorBase: big2(t?.closeFactorBase),
|
|
23514
|
+
maxLeverage: big2(t?.maxLeverage),
|
|
23515
|
+
collateralCap: big2(t?.collateralCap),
|
|
23516
|
+
debtCap: big2(t?.debtCap),
|
|
23517
|
+
mintPaused: !!t?.mintPaused,
|
|
23518
|
+
collateralizationPaused: !!t?.collateralizationPaused,
|
|
23519
|
+
borrowPaused: !!t?.borrowPaused,
|
|
23520
|
+
redeemPaused: !!t?.redeemPaused,
|
|
23521
|
+
totalAssets: big2(d?.totalAssets),
|
|
23522
|
+
totalSupply: big2(d?.totalSupply),
|
|
23523
|
+
exchangeRate: big2(d?.exchangeRate),
|
|
23524
|
+
collateral: big2(d?.collateral),
|
|
23525
|
+
debt: big2(d?.debt),
|
|
23526
|
+
liquidity: big2(d?.liquidity),
|
|
23527
|
+
assetPrice: big2(d?.assetPrice),
|
|
23528
|
+
assetPriceLower: big2(d?.assetPriceLower),
|
|
23529
|
+
borrowRate: big2(d?.borrowRate),
|
|
23530
|
+
predictedBorrowRate: big2(d?.predictedBorrowRate),
|
|
23531
|
+
supplyRate: big2(d?.supplyRate),
|
|
23532
|
+
utilizationRate: big2(d?.utilizationRate),
|
|
23533
|
+
interestFee: big2(t?.interestFee),
|
|
23534
|
+
irmTargetRate: big2(t?.irmTargetRate),
|
|
23535
|
+
irmMaxRate: big2(t?.irmMaxRate),
|
|
23536
|
+
irmTargetUtilization: big2(t?.irmTargetUtilization)
|
|
23537
|
+
});
|
|
23538
|
+
}
|
|
23539
|
+
if (tokens.length === 0) continue;
|
|
23540
|
+
markets.push({
|
|
23541
|
+
marketManager,
|
|
23542
|
+
cooldownLength: big2(m?.cooldownLength),
|
|
23543
|
+
tokens
|
|
23544
|
+
});
|
|
23545
|
+
}
|
|
23546
|
+
return { lender, config, markets };
|
|
23547
|
+
}
|
|
23548
|
+
async function fetchViaMulticall(lender, chainId, config) {
|
|
23549
|
+
let managers = [];
|
|
23550
|
+
try {
|
|
23551
|
+
const [res] = await multicallRetryUniversal({
|
|
23552
|
+
chain: chainId,
|
|
23553
|
+
calls: [
|
|
23554
|
+
{
|
|
23555
|
+
address: config.centralRegistry,
|
|
23556
|
+
name: "marketManagers",
|
|
23557
|
+
params: []
|
|
23558
|
+
}
|
|
23559
|
+
],
|
|
23560
|
+
abi: CurvanceCentralRegistryAbi,
|
|
23561
|
+
allowFailure: true
|
|
23562
|
+
});
|
|
23563
|
+
if (Array.isArray(res)) {
|
|
23564
|
+
managers = res.filter(
|
|
23565
|
+
(a) => typeof a === "string" && a.startsWith("0x")
|
|
23566
|
+
);
|
|
23567
|
+
}
|
|
23568
|
+
} catch {
|
|
23569
|
+
return { lender, config, markets: [] };
|
|
23570
|
+
}
|
|
23571
|
+
const allow = allowlist(config);
|
|
23572
|
+
if (allow) managers = managers.filter((m) => allow.has(m.toLowerCase()));
|
|
23573
|
+
if (managers.length === 0) return { lender, config, markets: [] };
|
|
23574
|
+
let listed = [];
|
|
23575
|
+
try {
|
|
23576
|
+
listed = await multicallRetryUniversal({
|
|
23577
|
+
chain: chainId,
|
|
23578
|
+
calls: managers.flatMap((mm) => [
|
|
23579
|
+
{ address: mm, name: "queryTokensListed", params: [] },
|
|
23580
|
+
{ address: mm, name: "redeemPaused", params: [] }
|
|
23581
|
+
]),
|
|
23582
|
+
abi: managers.flatMap(() => [
|
|
23583
|
+
CurvanceMarketManagerAbi,
|
|
23584
|
+
CurvanceMarketManagerAbi
|
|
23585
|
+
]),
|
|
23586
|
+
allowFailure: true
|
|
23587
|
+
});
|
|
23588
|
+
} catch {
|
|
23589
|
+
return { lender, config, markets: [] };
|
|
23590
|
+
}
|
|
23591
|
+
const pairs = [];
|
|
23592
|
+
managers.forEach((mm, i) => {
|
|
23593
|
+
const toks = listed[i * 2];
|
|
23594
|
+
const redeemPaused = big2(listed[i * 2 + 1]) === 2n;
|
|
23595
|
+
if (!Array.isArray(toks)) return;
|
|
23596
|
+
for (const t of toks) {
|
|
23597
|
+
if (typeof t === "string" && t.startsWith("0x")) {
|
|
23598
|
+
pairs.push({ mm, cToken: t, redeemPaused });
|
|
23599
|
+
}
|
|
23600
|
+
}
|
|
23601
|
+
});
|
|
23602
|
+
if (pairs.length === 0) return { lender, config, markets: [] };
|
|
23603
|
+
const calls = [];
|
|
23604
|
+
const abis = [];
|
|
23605
|
+
for (const { mm, cToken } of pairs) {
|
|
23606
|
+
calls.push(
|
|
23607
|
+
{ address: mm, name: "collConfig", params: [cToken] },
|
|
23608
|
+
{ address: mm, name: "liquidationConfig", params: [cToken] },
|
|
23609
|
+
{ address: mm, name: "collateralCaps", params: [cToken] },
|
|
23610
|
+
{ address: mm, name: "debtCaps", params: [cToken] },
|
|
23611
|
+
{ address: mm, name: "actionsPaused", params: [cToken] },
|
|
23612
|
+
{ address: cToken, name: "symbol", params: [] },
|
|
23613
|
+
{ address: cToken, name: "decimals", params: [] },
|
|
23614
|
+
{ address: cToken, name: "asset", params: [] },
|
|
23615
|
+
{ address: cToken, name: "totalAssets", params: [] },
|
|
23616
|
+
{ address: cToken, name: "marketOutstandingDebt", params: [] },
|
|
23617
|
+
{ address: cToken, name: "assetsHeld", params: [] },
|
|
23618
|
+
{ address: cToken, name: "interestFee", params: [] }
|
|
23619
|
+
);
|
|
23620
|
+
abis.push(
|
|
23621
|
+
CurvanceMarketManagerAbi,
|
|
23622
|
+
CurvanceMarketManagerAbi,
|
|
23623
|
+
CurvanceMarketManagerAbi,
|
|
23624
|
+
CurvanceMarketManagerAbi,
|
|
23625
|
+
CurvanceMarketManagerAbi,
|
|
23626
|
+
CurvanceCTokenAbi,
|
|
23627
|
+
CurvanceCTokenAbi,
|
|
23628
|
+
CurvanceCTokenAbi,
|
|
23629
|
+
CurvanceCTokenAbi,
|
|
23630
|
+
CurvanceCTokenAbi,
|
|
23631
|
+
CurvanceCTokenAbi,
|
|
23632
|
+
CurvanceCTokenAbi
|
|
23633
|
+
);
|
|
23634
|
+
}
|
|
23635
|
+
const TOKENS_PER_BATCH = 8;
|
|
23636
|
+
const results = [];
|
|
23637
|
+
for (let i = 0; i < pairs.length; i += TOKENS_PER_BATCH) {
|
|
23638
|
+
const from = i * FALLBACK_TOKEN_READS;
|
|
23639
|
+
const to = Math.min(i + TOKENS_PER_BATCH, pairs.length) * FALLBACK_TOKEN_READS;
|
|
23640
|
+
try {
|
|
23641
|
+
const chunk7 = await multicallRetryUniversal({
|
|
23642
|
+
chain: chainId,
|
|
23643
|
+
calls: calls.slice(from, to),
|
|
23644
|
+
abi: abis.slice(from, to),
|
|
23645
|
+
allowFailure: true
|
|
23646
|
+
});
|
|
23647
|
+
results.push(...chunk7);
|
|
23648
|
+
} catch {
|
|
23649
|
+
results.push(...new Array(to - from).fill("0x"));
|
|
23650
|
+
}
|
|
23651
|
+
}
|
|
23652
|
+
const assets = pairs.map((_3, i) => results[i * FALLBACK_TOKEN_READS + 7]);
|
|
23653
|
+
let assetMeta = [];
|
|
23654
|
+
try {
|
|
23655
|
+
assetMeta = await multicallRetryUniversal({
|
|
23656
|
+
chain: chainId,
|
|
23657
|
+
calls: assets.flatMap((a) => [
|
|
23658
|
+
{ address: a ?? zero, name: "symbol", params: [] },
|
|
23659
|
+
{ address: a ?? zero, name: "decimals", params: [] },
|
|
23660
|
+
{ address: a ?? zero, name: "name", params: [] }
|
|
23661
|
+
]),
|
|
23662
|
+
abi: assets.flatMap(() => [
|
|
23663
|
+
CurvanceCTokenAbi,
|
|
23664
|
+
CurvanceCTokenAbi,
|
|
23665
|
+
CurvanceCTokenAbi
|
|
23666
|
+
]),
|
|
23667
|
+
allowFailure: true
|
|
23668
|
+
});
|
|
23669
|
+
} catch {
|
|
23670
|
+
assetMeta = [];
|
|
23671
|
+
}
|
|
23672
|
+
const byManager = /* @__PURE__ */ new Map();
|
|
23673
|
+
pairs.forEach((p, i) => {
|
|
23674
|
+
const base = i * FALLBACK_TOKEN_READS;
|
|
23675
|
+
const coll = results[base];
|
|
23676
|
+
const liq = results[base + 1];
|
|
23677
|
+
const paused = results[base + 4];
|
|
23678
|
+
const asset = results[base + 7];
|
|
23679
|
+
if (!Array.isArray(coll) || typeof asset !== "string") return;
|
|
23680
|
+
const tuple = (v, idx) => Array.isArray(v) ? big2(v[idx]) : 0n;
|
|
23681
|
+
const held = big2(results[base + 10]);
|
|
23682
|
+
const debt = big2(results[base + 9]);
|
|
23683
|
+
const token = {
|
|
23684
|
+
cToken: p.cToken,
|
|
23685
|
+
symbol: str(results[base + 5], "c?"),
|
|
23686
|
+
name: str(results[base + 5], "Curvance"),
|
|
23687
|
+
decimals: num3(results[base + 6], 18),
|
|
23688
|
+
asset,
|
|
23689
|
+
assetSymbol: str(assetMeta[i * 3], "?"),
|
|
23690
|
+
assetDecimals: num3(assetMeta[i * 3 + 1], 18),
|
|
23691
|
+
assetName: str(assetMeta[i * 3 + 2], "?"),
|
|
23692
|
+
collRatio: tuple(coll, 0),
|
|
23693
|
+
collReqSoft: tuple(coll, 1),
|
|
23694
|
+
collReqHard: tuple(coll, 2),
|
|
23695
|
+
liqIncBase: tuple(liq, 0),
|
|
23696
|
+
liqIncCurve: tuple(liq, 1),
|
|
23697
|
+
closeFactorBase: tuple(liq, 4),
|
|
23698
|
+
maxLeverage: 0n,
|
|
23699
|
+
collateralCap: big2(results[base + 2]),
|
|
23700
|
+
debtCap: big2(results[base + 3]),
|
|
23701
|
+
mintPaused: Array.isArray(paused) ? !!paused[0] : false,
|
|
23702
|
+
collateralizationPaused: Array.isArray(paused) ? !!paused[1] : false,
|
|
23703
|
+
borrowPaused: Array.isArray(paused) ? !!paused[2] : false,
|
|
23704
|
+
redeemPaused: p.redeemPaused,
|
|
23705
|
+
totalAssets: big2(results[base + 8]),
|
|
23706
|
+
totalSupply: 0n,
|
|
23707
|
+
exchangeRate: 0n,
|
|
23708
|
+
collateral: 0n,
|
|
23709
|
+
debt,
|
|
23710
|
+
liquidity: held,
|
|
23711
|
+
// No reader ⇒ no prices from here. Left at 0 and treated as UNKNOWN by
|
|
23712
|
+
// the converter, which then falls back to the shared price map.
|
|
23713
|
+
assetPrice: 0n,
|
|
23714
|
+
assetPriceLower: 0n,
|
|
23715
|
+
borrowRate: 0n,
|
|
23716
|
+
predictedBorrowRate: 0n,
|
|
23717
|
+
supplyRate: 0n,
|
|
23718
|
+
utilizationRate: held + debt > 0n ? debt * 10n ** 18n / (held + debt) : 0n,
|
|
23719
|
+
interestFee: big2(results[base + 11]),
|
|
23720
|
+
irmTargetRate: 0n,
|
|
23721
|
+
irmMaxRate: 0n,
|
|
23722
|
+
irmTargetUtilization: 0n
|
|
23723
|
+
};
|
|
23724
|
+
const existing = byManager.get(p.mm);
|
|
23725
|
+
if (existing) existing.tokens.push(token);
|
|
23726
|
+
else
|
|
23727
|
+
byManager.set(p.mm, {
|
|
23728
|
+
marketManager: p.mm,
|
|
23729
|
+
// `MIN_HOLD_PERIOD` is a constant on every deployment; hardcoding the
|
|
23730
|
+
// known value here beats an extra round-trip in the fallback path.
|
|
23731
|
+
cooldownLength: 1200n,
|
|
23732
|
+
tokens: [token]
|
|
23733
|
+
});
|
|
23734
|
+
});
|
|
23735
|
+
return { lender, config, markets: [...byManager.values()] };
|
|
23736
|
+
}
|
|
23737
|
+
function allowlist(config) {
|
|
23738
|
+
if (!config.marketAllowlist || config.marketAllowlist.length === 0) {
|
|
23739
|
+
return void 0;
|
|
23740
|
+
}
|
|
23741
|
+
return new Set(config.marketAllowlist.map((m) => m.toLowerCase()));
|
|
23742
|
+
}
|
|
23743
|
+
|
|
23341
23744
|
// src/lending/public-data/inverse/convertPublic.ts
|
|
23342
23745
|
function inverseLenderKey(lender, market) {
|
|
23343
23746
|
return `${lender}_${market.replace(/^0x/i, "").toUpperCase()}`;
|
|
23344
23747
|
}
|
|
23345
|
-
function inverseKeyParts(
|
|
23346
|
-
if (!
|
|
23347
|
-
const suffix =
|
|
23748
|
+
function inverseKeyParts(key2) {
|
|
23749
|
+
if (!key2.startsWith("INVERSE_")) return void 0;
|
|
23750
|
+
const suffix = key2.slice("INVERSE_".length);
|
|
23348
23751
|
if (!/^[0-9A-F]{40}$/.test(suffix)) return void 0;
|
|
23349
23752
|
return { lender: "INVERSE", market: "0x" + suffix.toLowerCase() };
|
|
23350
23753
|
}
|
|
@@ -23374,7 +23777,7 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
23374
23777
|
const collDecimals = market.collDecimals;
|
|
23375
23778
|
const collToken = tokens[collAddr];
|
|
23376
23779
|
const collSymbol = collToken?.symbol ?? market.name ?? "COLL";
|
|
23377
|
-
const
|
|
23780
|
+
const marketName2 = `DOLA / ${market.name ?? collSymbol}`;
|
|
23378
23781
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
23379
23782
|
const collPrice = m.price ?? prices[collPriceKey] ?? 0;
|
|
23380
23783
|
const totalDebt = m.totalDebt ?? 0;
|
|
@@ -23481,7 +23884,7 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
23481
23884
|
entry.params = {
|
|
23482
23885
|
market: {
|
|
23483
23886
|
lender: lenderKey,
|
|
23484
|
-
name:
|
|
23887
|
+
name: marketName2,
|
|
23485
23888
|
loanDecimals: debtDecimals,
|
|
23486
23889
|
collateralDecimals: collDecimals,
|
|
23487
23890
|
// The Market contract doubles as the market id.
|
|
@@ -23532,9 +23935,9 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
23532
23935
|
function llamaLendLenderKey(lender, controller) {
|
|
23533
23936
|
return `${lender}_${controller.replace(/^0x/i, "").toUpperCase()}`;
|
|
23534
23937
|
}
|
|
23535
|
-
function llamaLendKeyParts(
|
|
23536
|
-
if (!
|
|
23537
|
-
const suffix =
|
|
23938
|
+
function llamaLendKeyParts(key2) {
|
|
23939
|
+
if (!key2.startsWith("LLAMALEND_")) return void 0;
|
|
23940
|
+
const suffix = key2.slice("LLAMALEND_".length);
|
|
23538
23941
|
if (!/^[0-9A-F]{40}$/.test(suffix)) return void 0;
|
|
23539
23942
|
return { lender: "LLAMALEND", controller: "0x" + suffix.toLowerCase() };
|
|
23540
23943
|
}
|
|
@@ -23561,7 +23964,7 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
|
|
|
23561
23964
|
const loanToken = tokens[loanAddr];
|
|
23562
23965
|
const collSymbol = collToken?.symbol ?? market.collateralSymbol ?? "COLL";
|
|
23563
23966
|
const loanSymbol = loanToken?.symbol ?? market.borrowedSymbol ?? "LOAN";
|
|
23564
|
-
const
|
|
23967
|
+
const marketName2 = market.name ?? `${loanSymbol} / ${collSymbol}`;
|
|
23565
23968
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
23566
23969
|
const loanPriceKey = toOracleKey(loanToken?.assetGroup) || toGenericPriceKey(loanAddr, chainId);
|
|
23567
23970
|
prices[collPriceKey] || m.collateralPriceUsd || 0;
|
|
@@ -23678,7 +24081,7 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
|
|
|
23678
24081
|
entry.params = {
|
|
23679
24082
|
market: {
|
|
23680
24083
|
lender: lenderKey,
|
|
23681
|
-
name:
|
|
24084
|
+
name: marketName2,
|
|
23682
24085
|
loanDecimals,
|
|
23683
24086
|
collateralDecimals: collDecimals,
|
|
23684
24087
|
// The Controller doubles as the market id.
|
|
@@ -23789,9 +24192,9 @@ function resolveWrappedMarket(chainId, collateralVault, pairName) {
|
|
|
23789
24192
|
function resupplyLenderKey(lender, chainId, pair) {
|
|
23790
24193
|
return `${lender}_${chainId}_${pair.replace(/^0x/i, "").toUpperCase()}`;
|
|
23791
24194
|
}
|
|
23792
|
-
function resupplyKeyParts(
|
|
23793
|
-
if (!
|
|
23794
|
-
const suffix =
|
|
24195
|
+
function resupplyKeyParts(key2) {
|
|
24196
|
+
if (!key2.startsWith("RESUPPLY_")) return void 0;
|
|
24197
|
+
const suffix = key2.slice("RESUPPLY_".length);
|
|
23795
24198
|
const m = suffix.match(/^(\d+)_([0-9A-Fa-f]{40})$/);
|
|
23796
24199
|
if (!m) return void 0;
|
|
23797
24200
|
return {
|
|
@@ -24021,6 +24424,233 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
|
|
|
24021
24424
|
}
|
|
24022
24425
|
return out;
|
|
24023
24426
|
}
|
|
24427
|
+
|
|
24428
|
+
// src/lending/public-data/curvance/convertPublic.ts
|
|
24429
|
+
function curvanceLenderKey(lender, chainId, marketManager) {
|
|
24430
|
+
return `${lender}_${chainId}_${marketManager.replace(/^0x/i, "").toUpperCase()}`;
|
|
24431
|
+
}
|
|
24432
|
+
var SECONDS_PER_YEAR10 = 31536e3;
|
|
24433
|
+
var BPS2 = 1e4;
|
|
24434
|
+
function ratePerSecToApr2(rate) {
|
|
24435
|
+
return Number(rate) / 1e18 * SECONDS_PER_YEAR10 * 100;
|
|
24436
|
+
}
|
|
24437
|
+
function currencyFor11(address, decimals, symbol, name, tokens) {
|
|
24438
|
+
const lower3 = address.toLowerCase();
|
|
24439
|
+
return tokens[lower3] ?? { address: lower3, symbol, name, decimals };
|
|
24440
|
+
}
|
|
24441
|
+
var toFloat = (raw, decimals) => Number(raw) / 10 ** decimals;
|
|
24442
|
+
function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
24443
|
+
intrinsicYields: {},
|
|
24444
|
+
lenderRewards: {},
|
|
24445
|
+
loaded: true
|
|
24446
|
+
}, tokens = {}) {
|
|
24447
|
+
const out = {};
|
|
24448
|
+
const cfg = raw?.config;
|
|
24449
|
+
if (!cfg) return out;
|
|
24450
|
+
for (const market of raw.markets ?? []) {
|
|
24451
|
+
if (!market.tokens || market.tokens.length === 0) continue;
|
|
24452
|
+
const lenderKey = curvanceLenderKey(
|
|
24453
|
+
raw.lender,
|
|
24454
|
+
chainId,
|
|
24455
|
+
market.marketManager
|
|
24456
|
+
);
|
|
24457
|
+
const entry = { data: {} };
|
|
24458
|
+
const descriptors = [];
|
|
24459
|
+
let published = 0;
|
|
24460
|
+
for (const t of market.tokens) {
|
|
24461
|
+
const assetAddr = t.asset.toLowerCase();
|
|
24462
|
+
if (assetAddr === zeroAddress) continue;
|
|
24463
|
+
const token = tokens[assetAddr];
|
|
24464
|
+
const priceKey = toOracleKey(token?.assetGroup) || toGenericPriceKey(assetAddr, chainId);
|
|
24465
|
+
const collPrice = t.assetPriceLower > 0n ? Number(t.assetPriceLower) / 1e18 : prices[priceKey] || 0;
|
|
24466
|
+
const debtPrice = t.assetPrice > 0n ? Number(t.assetPrice) / 1e18 : prices[priceKey] || 0;
|
|
24467
|
+
const dec = t.assetDecimals;
|
|
24468
|
+
const totalDeposits = toFloat(t.totalAssets, dec);
|
|
24469
|
+
const totalDebt = toFloat(t.debt, dec);
|
|
24470
|
+
const liquidity = toFloat(t.liquidity, dec);
|
|
24471
|
+
const borrowable = t.debtCap > 0n;
|
|
24472
|
+
const debtHeadroom = borrowable ? Math.max(toFloat(t.debtCap, dec) - totalDebt, 0) : 0;
|
|
24473
|
+
const borrowLiquidity = borrowable ? Math.min(liquidity, debtHeadroom) : 0;
|
|
24474
|
+
const collateralActive = t.collRatio > 0n && t.collateralCap > 0n;
|
|
24475
|
+
const ltv = Number(t.collRatio) / BPS2;
|
|
24476
|
+
const liqThresholdSoft = t.collReqSoft > 0n ? BPS2 / Number(t.collReqSoft) : 0;
|
|
24477
|
+
const liqThresholdHard = t.collReqHard > 0n ? BPS2 / Number(t.collReqHard) : 0;
|
|
24478
|
+
const liquidationPenalty = t.liqIncBase > BigInt(BPS2) ? Number(t.liqIncBase) / BPS2 - 1 : 0;
|
|
24479
|
+
const liquidationPenaltyMax = t.liqIncBase + t.liqIncCurve > BigInt(BPS2) ? Number(t.liqIncBase + t.liqIncCurve) / BPS2 - 1 : liquidationPenalty;
|
|
24480
|
+
const closeFactor = t.closeFactorBase > 0n ? Number(t.closeFactorBase) / BPS2 : 1;
|
|
24481
|
+
const borrowApr = ratePerSecToApr2(t.borrowRate);
|
|
24482
|
+
const supplyApr = ratePerSecToApr2(t.supplyRate);
|
|
24483
|
+
const utilization = Number(t.utilizationRate) / 1e18;
|
|
24484
|
+
const borrowHalted = !borrowable || t.borrowPaused || debtHeadroom <= 0;
|
|
24485
|
+
const depositsHalted = t.mintPaused;
|
|
24486
|
+
const uid = createMarketUid(chainId, lenderKey, assetAddr);
|
|
24487
|
+
entry.data[uid] = {
|
|
24488
|
+
marketUid: uid,
|
|
24489
|
+
name: t.assetSymbol,
|
|
24490
|
+
poolId: market.marketManager.toLowerCase(),
|
|
24491
|
+
underlying: assetAddr,
|
|
24492
|
+
asset: currencyFor11(assetAddr, dec, t.assetSymbol, t.assetName, tokens),
|
|
24493
|
+
totalDeposits,
|
|
24494
|
+
totalDebtStable: 0,
|
|
24495
|
+
totalDebt,
|
|
24496
|
+
totalLiquidity: liquidity,
|
|
24497
|
+
borrowLiquidity,
|
|
24498
|
+
totalLiquidityUSD: liquidity * collPrice,
|
|
24499
|
+
borrowLiquidityUSD: borrowLiquidity * debtPrice,
|
|
24500
|
+
totalDepositsUSD: totalDeposits * collPrice,
|
|
24501
|
+
totalDebtStableUSD: 0,
|
|
24502
|
+
totalDebtUSD: totalDebt * debtPrice,
|
|
24503
|
+
utilization,
|
|
24504
|
+
// A collateral-only leg genuinely pays 0% — there is no lender side on
|
|
24505
|
+
// it. Its return is the underlying's own yield, joined in elsewhere.
|
|
24506
|
+
depositRate: borrowable ? supplyApr : 0,
|
|
24507
|
+
variableBorrowRate: borrowable ? borrowApr : 0,
|
|
24508
|
+
stableBorrowRate: 0,
|
|
24509
|
+
rateModel: "curvance-dynamic",
|
|
24510
|
+
intrinsicYield: 0,
|
|
24511
|
+
rewards: void 0,
|
|
24512
|
+
decimals: dec,
|
|
24513
|
+
config: {
|
|
24514
|
+
0: {
|
|
24515
|
+
category: 0,
|
|
24516
|
+
borrowCollateralFactor: ltv,
|
|
24517
|
+
// The SOFT threshold — where the position first becomes
|
|
24518
|
+
// liquidatable, which is the number a risk display must show.
|
|
24519
|
+
collateralFactor: liqThresholdSoft,
|
|
24520
|
+
borrowFactor: 1,
|
|
24521
|
+
liquidationPenalty,
|
|
24522
|
+
closeFactor,
|
|
24523
|
+
collateralDisabled: !collateralActive,
|
|
24524
|
+
debtDisabled: borrowHalted
|
|
24525
|
+
}
|
|
24526
|
+
},
|
|
24527
|
+
closeFactor,
|
|
24528
|
+
collateralActive,
|
|
24529
|
+
borrowingEnabled: !borrowHalted,
|
|
24530
|
+
// Deposits stay open on a borrow-paused market so users can top up to
|
|
24531
|
+
// avoid liquidation; only the paused action itself is stopped.
|
|
24532
|
+
depositsEnabled: !depositsHalted,
|
|
24533
|
+
hasStable: false,
|
|
24534
|
+
variableBorrowDisabled: borrowHalted,
|
|
24535
|
+
isActive: !(depositsHalted && borrowHalted),
|
|
24536
|
+
isFrozen: depositsHalted && borrowHalted
|
|
24537
|
+
};
|
|
24538
|
+
published++;
|
|
24539
|
+
descriptors.push({
|
|
24540
|
+
cToken: t.cToken,
|
|
24541
|
+
underlying: assetAddr,
|
|
24542
|
+
symbol: t.symbol,
|
|
24543
|
+
assetSymbol: t.assetSymbol,
|
|
24544
|
+
decimals: t.decimals,
|
|
24545
|
+
assetDecimals: dec,
|
|
24546
|
+
/** THE borrowability gate — never `isBorrowable()`. */
|
|
24547
|
+
borrowable,
|
|
24548
|
+
debtCap: t.debtCap.toString(),
|
|
24549
|
+
collateralCap: t.collateralCap.toString(),
|
|
24550
|
+
/** BPS, verbatim, so a caller can reproduce the protocol's own math. */
|
|
24551
|
+
collRatioBps: t.collRatio.toString(),
|
|
24552
|
+
collReqSoftBps: t.collReqSoft.toString(),
|
|
24553
|
+
collReqHardBps: t.collReqHard.toString(),
|
|
24554
|
+
liqIncBaseBps: t.liqIncBase.toString(),
|
|
24555
|
+
liqIncCurveBps: t.liqIncCurve.toString(),
|
|
24556
|
+
closeFactorBaseBps: t.closeFactorBase.toString(),
|
|
24557
|
+
/** Inverted to liquidation-threshold form for convenience. */
|
|
24558
|
+
liquidationThresholdSoft: liqThresholdSoft,
|
|
24559
|
+
liquidationThresholdHard: liqThresholdHard,
|
|
24560
|
+
liquidationPenaltySoft: liquidationPenalty,
|
|
24561
|
+
liquidationPenaltyHard: liquidationPenaltyMax,
|
|
24562
|
+
maxLeverage: t.maxLeverage.toString(),
|
|
24563
|
+
mintPaused: t.mintPaused,
|
|
24564
|
+
collateralizationPaused: t.collateralizationPaused,
|
|
24565
|
+
borrowPaused: t.borrowPaused,
|
|
24566
|
+
redeemPaused: t.redeemPaused,
|
|
24567
|
+
/** Per-second WAD, as stored. Annualise nominally. */
|
|
24568
|
+
borrowRatePerSecond: t.borrowRate.toString(),
|
|
24569
|
+
/** One 600 s adjustment period ahead — the vertex multiplier moves. */
|
|
24570
|
+
predictedBorrowRatePerSecond: t.predictedBorrowRate.toString(),
|
|
24571
|
+
supplyRatePerSecond: t.supplyRate.toString(),
|
|
24572
|
+
interestFeeBps: t.interestFee.toString(),
|
|
24573
|
+
irmTargetRate: t.irmTargetRate.toString(),
|
|
24574
|
+
irmMaxRate: t.irmMaxRate.toString(),
|
|
24575
|
+
irmTargetUtilization: t.irmTargetUtilization.toString(),
|
|
24576
|
+
/** WAD USD from Curvance's own dual oracle, pessimistic both ways. */
|
|
24577
|
+
assetPrice: t.assetPrice.toString(),
|
|
24578
|
+
assetPriceLower: t.assetPriceLower.toString()
|
|
24579
|
+
});
|
|
24580
|
+
}
|
|
24581
|
+
if (published === 0) continue;
|
|
24582
|
+
const collLeg = market.tokens.find((t) => t.debtCap === 0n);
|
|
24583
|
+
const debtLeg = market.tokens.find((t) => t.debtCap > 0n);
|
|
24584
|
+
const positionManagers = resolvePositionManagers(cfg, market.marketManager);
|
|
24585
|
+
entry.params = {
|
|
24586
|
+
market: {
|
|
24587
|
+
lender: lenderKey,
|
|
24588
|
+
name: marketName(market.tokens),
|
|
24589
|
+
loanDecimals: debtLeg?.assetDecimals ?? 18,
|
|
24590
|
+
collateralDecimals: collLeg?.assetDecimals ?? 18,
|
|
24591
|
+
id: market.marketManager.toLowerCase(),
|
|
24592
|
+
lltv: (collLeg ?? market.tokens[0]).collRatio.toString(),
|
|
24593
|
+
// Pricing is the shared per-chain OracleManager, not a per-market feed.
|
|
24594
|
+
oracle: cfg.oracleManager ?? zeroAddress,
|
|
24595
|
+
irm: zeroAddress,
|
|
24596
|
+
collateralAddress: (collLeg ?? market.tokens[0]).asset.toLowerCase(),
|
|
24597
|
+
loanAddress: (debtLeg ?? market.tokens[0]).asset.toLowerCase(),
|
|
24598
|
+
// --- Curvance descriptor (consumed by the calldata builders, the
|
|
24599
|
+
// worker-api resolvers and the loop quoter) ---
|
|
24600
|
+
curvance: {
|
|
24601
|
+
marketManager: market.marketManager,
|
|
24602
|
+
tokens: descriptors,
|
|
24603
|
+
/**
|
|
24604
|
+
* `MIN_HOLD_PERIOD` in seconds. Stamped per account per market by
|
|
24605
|
+
* POSTING COLLATERAL and by BORROWING, and while it runs REPAYMENT,
|
|
24606
|
+
* REDEMPTION and share transfers all revert. So a position cannot be
|
|
24607
|
+
* closed, deleveraged or migrated out for 20 minutes after it is
|
|
24608
|
+
* opened or topped up — gate every exit flow on it.
|
|
24609
|
+
*/
|
|
24610
|
+
holdPeriodSeconds: Number(market.cooldownLength || 1200n),
|
|
24611
|
+
/**
|
|
24612
|
+
* Native-leverage entry points for this market, or `undefined` when
|
|
24613
|
+
* none is registered — which is a REAL state, not a gap: 5 of the 25
|
|
24614
|
+
* live Monad markets have no Position Manager, including the largest
|
|
24615
|
+
* one. `undefined` here means no one-click loop on this market.
|
|
24616
|
+
*/
|
|
24617
|
+
positionManagers,
|
|
24618
|
+
addresses: {
|
|
24619
|
+
centralRegistry: cfg.centralRegistry,
|
|
24620
|
+
oracleManager: cfg.oracleManager ?? void 0,
|
|
24621
|
+
protocolReader: cfg.protocolReader ?? void 0
|
|
24622
|
+
},
|
|
24623
|
+
/**
|
|
24624
|
+
* Swap targets with a registered calldata checker. The native
|
|
24625
|
+
* leverage path REJECTS any other target, and the mapping is
|
|
24626
|
+
* DAO-mutable in both directions, so treat this as a hint and probe
|
|
24627
|
+
* `externalCalldataChecker(target)` live before encoding.
|
|
24628
|
+
*/
|
|
24629
|
+
swapTargets: cfg.swapTargets ?? void 0
|
|
24630
|
+
}
|
|
24631
|
+
}
|
|
24632
|
+
};
|
|
24633
|
+
entry.chainId = chainId;
|
|
24634
|
+
out[lenderKey] = entry;
|
|
24635
|
+
}
|
|
24636
|
+
return out;
|
|
24637
|
+
}
|
|
24638
|
+
function marketName(tokens) {
|
|
24639
|
+
const coll = tokens.find((t) => t.debtCap === 0n) ?? tokens[0];
|
|
24640
|
+
const debt = tokens.find((t) => t !== coll) ?? tokens[tokens.length - 1];
|
|
24641
|
+
return `${coll.assetSymbol} / ${debt.assetSymbol}`;
|
|
24642
|
+
}
|
|
24643
|
+
function resolvePositionManagers(cfg, marketManager) {
|
|
24644
|
+
const map = cfg.positionManagers;
|
|
24645
|
+
if (!map) return void 0;
|
|
24646
|
+
const direct = map[marketManager];
|
|
24647
|
+
if (direct) return { ...direct };
|
|
24648
|
+
const target = marketManager.toLowerCase();
|
|
24649
|
+
for (const key2 of Object.keys(map)) {
|
|
24650
|
+
if (key2.toLowerCase() === target) return { ...map[key2] };
|
|
24651
|
+
}
|
|
24652
|
+
return void 0;
|
|
24653
|
+
}
|
|
24024
24654
|
var READS_PER_ILK = 4;
|
|
24025
24655
|
var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
|
|
24026
24656
|
var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
|
|
@@ -24051,12 +24681,12 @@ async function fetchUsddMarkets(lender, chainId) {
|
|
|
24051
24681
|
} catch {
|
|
24052
24682
|
return { lender, config, chainData, markets: [] };
|
|
24053
24683
|
}
|
|
24054
|
-
const
|
|
24684
|
+
const big15 = (v) => {
|
|
24055
24685
|
if (typeof v === "bigint") return v;
|
|
24056
24686
|
if (typeof v === "number") return BigInt(v);
|
|
24057
24687
|
return null;
|
|
24058
24688
|
};
|
|
24059
|
-
const field12 = (res, name, idx) =>
|
|
24689
|
+
const field12 = (res, name, idx) => big15(res?.[name] ?? res?.[idx]);
|
|
24060
24690
|
const out = markets.map((market, i) => {
|
|
24061
24691
|
const base = i * READS_PER_ILK;
|
|
24062
24692
|
const vatIlk = results[base];
|
|
@@ -24071,7 +24701,7 @@ async function fetchUsddMarkets(lender, chainId) {
|
|
|
24071
24701
|
dust: field12(vatIlk, "dust", 4),
|
|
24072
24702
|
duty: field12(jugIlk, "duty", 0),
|
|
24073
24703
|
mat: field12(spotIlk, "mat", 1),
|
|
24074
|
-
joinBalance:
|
|
24704
|
+
joinBalance: big15(results[base + 3])
|
|
24075
24705
|
};
|
|
24076
24706
|
});
|
|
24077
24707
|
return { lender, config, chainData, markets: out };
|
|
@@ -24081,21 +24711,21 @@ async function fetchUsddMarkets(lender, chainId) {
|
|
|
24081
24711
|
function usddLenderKey(lender, chainId, ilk) {
|
|
24082
24712
|
return `${lender}_${chainId}_${ilk}`;
|
|
24083
24713
|
}
|
|
24084
|
-
function usddKeyParts(
|
|
24085
|
-
if (!
|
|
24086
|
-
const suffix =
|
|
24714
|
+
function usddKeyParts(key2) {
|
|
24715
|
+
if (!key2.startsWith("USDD_")) return void 0;
|
|
24716
|
+
const suffix = key2.slice("USDD_".length);
|
|
24087
24717
|
const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
|
|
24088
24718
|
if (!m) return void 0;
|
|
24089
24719
|
return { lender: "USDD", chainId: m[1], ilk: m[2] };
|
|
24090
24720
|
}
|
|
24091
|
-
var
|
|
24092
|
-
var
|
|
24721
|
+
var WAD9 = 1e18;
|
|
24722
|
+
var RAY4 = 1e27;
|
|
24093
24723
|
var RAD = 1e45;
|
|
24094
24724
|
var YEAR_SECONDS2 = 31536e3;
|
|
24095
24725
|
function toHuman4(raw, decimals) {
|
|
24096
24726
|
return Number(raw) / 10 ** decimals;
|
|
24097
24727
|
}
|
|
24098
|
-
function
|
|
24728
|
+
function currencyFor12(address, decimals, symbol, tokens) {
|
|
24099
24729
|
const lower3 = address.toLowerCase();
|
|
24100
24730
|
return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
|
|
24101
24731
|
}
|
|
@@ -24121,18 +24751,18 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
|
|
|
24121
24751
|
const collDecimals = market.collDecimals;
|
|
24122
24752
|
const collToken = tokens[collAddr];
|
|
24123
24753
|
const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
|
|
24124
|
-
const
|
|
24754
|
+
const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
|
|
24125
24755
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
24126
|
-
const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) /
|
|
24756
|
+
const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY4 * (Number(m.mat) / RAY4) : 0;
|
|
24127
24757
|
const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
|
|
24128
24758
|
const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
|
|
24129
24759
|
const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
|
|
24130
|
-
const mat = m.mat !== null ? Number(m.mat) /
|
|
24760
|
+
const mat = m.mat !== null ? Number(m.mat) / RAY4 : Number(market.mat) / RAY4 || 1.5;
|
|
24131
24761
|
const ltv = mat > 0 ? 1 / mat : 0;
|
|
24132
|
-
const chop = market.chop ? Number(market.chop) /
|
|
24762
|
+
const chop = market.chop ? Number(market.chop) / WAD9 : 0;
|
|
24133
24763
|
const liqPenalty = chop > 1 ? chop - 1 : 0;
|
|
24134
24764
|
const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
|
|
24135
|
-
const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) /
|
|
24765
|
+
const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY4 * YEAR_SECONDS2 * 100 : 0;
|
|
24136
24766
|
const line = m.line !== null ? Number(m.line) / RAD : 0;
|
|
24137
24767
|
let borrowLiquidity = Math.max(0, line - totalDebt);
|
|
24138
24768
|
const halted = line === 0;
|
|
@@ -24143,7 +24773,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
|
|
|
24143
24773
|
name: "Collateral " + collSymbol,
|
|
24144
24774
|
poolId: market.gemJoin.toLowerCase(),
|
|
24145
24775
|
underlying: collAddr,
|
|
24146
|
-
asset:
|
|
24776
|
+
asset: currencyFor12(collAddr, collDecimals, collSymbol, tokens),
|
|
24147
24777
|
totalDeposits: totalColl,
|
|
24148
24778
|
totalDebtStable: 0,
|
|
24149
24779
|
totalDebt: 0,
|
|
@@ -24187,7 +24817,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
|
|
|
24187
24817
|
name: debtSymbol,
|
|
24188
24818
|
poolId: cfg.vat.toLowerCase(),
|
|
24189
24819
|
underlying: debtAddr,
|
|
24190
|
-
asset:
|
|
24820
|
+
asset: currencyFor12(debtAddr, debtDecimals, debtSymbol, tokens),
|
|
24191
24821
|
totalDeposits: 0,
|
|
24192
24822
|
totalDebtStable: 0,
|
|
24193
24823
|
totalDebt,
|
|
@@ -24232,7 +24862,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
|
|
|
24232
24862
|
entry.params = {
|
|
24233
24863
|
market: {
|
|
24234
24864
|
lender: lenderKey,
|
|
24235
|
-
name:
|
|
24865
|
+
name: marketName2,
|
|
24236
24866
|
loanDecimals: debtDecimals,
|
|
24237
24867
|
collateralDecimals: collDecimals,
|
|
24238
24868
|
// The gem join doubles as the market id (marketUid address) — one
|
|
@@ -24326,26 +24956,26 @@ async function fetchFrankencoinMarkets(lender, chainId) {
|
|
|
24326
24956
|
} catch {
|
|
24327
24957
|
return { lender, config, chainData, markets: [] };
|
|
24328
24958
|
}
|
|
24329
|
-
const
|
|
24959
|
+
const big15 = (v) => {
|
|
24330
24960
|
if (typeof v === "bigint") return v;
|
|
24331
24961
|
if (typeof v === "number") return BigInt(v);
|
|
24332
24962
|
return null;
|
|
24333
24963
|
};
|
|
24334
24964
|
const out = markets.map((market, i) => {
|
|
24335
24965
|
const base = i * READS_PER_MARKET3;
|
|
24336
|
-
const expiration =
|
|
24966
|
+
const expiration = big15(results[base + 7]);
|
|
24337
24967
|
return {
|
|
24338
24968
|
market,
|
|
24339
|
-
price:
|
|
24340
|
-
minted:
|
|
24341
|
-
availableForClones:
|
|
24342
|
-
annualInterestPPM:
|
|
24343
|
-
currentFeePPM:
|
|
24344
|
-
reserveContribution:
|
|
24345
|
-
challengedAmount:
|
|
24969
|
+
price: big15(results[base]),
|
|
24970
|
+
minted: big15(results[base + 1]),
|
|
24971
|
+
availableForClones: big15(results[base + 2]),
|
|
24972
|
+
annualInterestPPM: big15(results[base + 3]),
|
|
24973
|
+
currentFeePPM: big15(results[base + 4]),
|
|
24974
|
+
reserveContribution: big15(results[base + 5]),
|
|
24975
|
+
challengedAmount: big15(results[base + 6]),
|
|
24346
24976
|
expiration,
|
|
24347
24977
|
isClosed: typeof results[base + 8] === "boolean" ? results[base + 8] : null,
|
|
24348
|
-
collateralBalance:
|
|
24978
|
+
collateralBalance: big15(results[base + 9])
|
|
24349
24979
|
};
|
|
24350
24980
|
});
|
|
24351
24981
|
return { lender, config, chainData, markets: out };
|
|
@@ -24355,9 +24985,9 @@ async function fetchFrankencoinMarkets(lender, chainId) {
|
|
|
24355
24985
|
function frankencoinLenderKey(lender, chainId, position) {
|
|
24356
24986
|
return `${lender}_${chainId}_${position.replace(/^0x/i, "").toUpperCase()}`;
|
|
24357
24987
|
}
|
|
24358
|
-
function frankencoinKeyParts(
|
|
24359
|
-
if (!
|
|
24360
|
-
const suffix =
|
|
24988
|
+
function frankencoinKeyParts(key2) {
|
|
24989
|
+
if (!key2.startsWith("FRANKENCOIN_")) return void 0;
|
|
24990
|
+
const suffix = key2.slice("FRANKENCOIN_".length);
|
|
24361
24991
|
const m = suffix.match(/^(\d+)_([0-9A-Fa-f]{40})$/);
|
|
24362
24992
|
if (!m) return void 0;
|
|
24363
24993
|
return {
|
|
@@ -24367,7 +24997,7 @@ function frankencoinKeyParts(key) {
|
|
|
24367
24997
|
};
|
|
24368
24998
|
}
|
|
24369
24999
|
var PPM = 1e6;
|
|
24370
|
-
function
|
|
25000
|
+
function currencyFor13(address, decimals, symbol, tokens) {
|
|
24371
25001
|
const lower3 = address.toLowerCase();
|
|
24372
25002
|
return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
|
|
24373
25003
|
}
|
|
@@ -24394,7 +25024,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
|
|
|
24394
25024
|
const collDecimals = market.collDecimals;
|
|
24395
25025
|
const collToken = tokens[collAddr];
|
|
24396
25026
|
const collSymbol = collToken?.symbol ?? market.collSymbol ?? "COLL";
|
|
24397
|
-
const
|
|
25027
|
+
const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
|
|
24398
25028
|
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
24399
25029
|
const collPrice = prices[collPriceKey] ?? 0;
|
|
24400
25030
|
const declaredPrice = m.price !== null ? Number(m.price) / 10 ** (36 - collDecimals) : Number(market.price) / 10 ** (36 - collDecimals);
|
|
@@ -24418,7 +25048,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
|
|
|
24418
25048
|
name: "Collateral " + collSymbol,
|
|
24419
25049
|
poolId: market.position.toLowerCase(),
|
|
24420
25050
|
underlying: collAddr,
|
|
24421
|
-
asset:
|
|
25051
|
+
asset: currencyFor13(collAddr, collDecimals, collSymbol, tokens),
|
|
24422
25052
|
totalDeposits: totalColl,
|
|
24423
25053
|
totalDebtStable: 0,
|
|
24424
25054
|
totalDebt: 0,
|
|
@@ -24465,7 +25095,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
|
|
|
24465
25095
|
name: debtSymbol,
|
|
24466
25096
|
poolId: cfg.mintingHub.toLowerCase(),
|
|
24467
25097
|
underlying: debtAddr,
|
|
24468
|
-
asset:
|
|
25098
|
+
asset: currencyFor13(debtAddr, debtDecimals, debtSymbol, tokens),
|
|
24469
25099
|
totalDeposits: 0,
|
|
24470
25100
|
totalDebtStable: 0,
|
|
24471
25101
|
totalDebt,
|
|
@@ -24514,7 +25144,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
|
|
|
24514
25144
|
entry.params = {
|
|
24515
25145
|
market: {
|
|
24516
25146
|
lender: lenderKey,
|
|
24517
|
-
name:
|
|
25147
|
+
name: marketName2,
|
|
24518
25148
|
loanDecimals: debtDecimals,
|
|
24519
25149
|
collateralDecimals: collDecimals,
|
|
24520
25150
|
// The original position doubles as the market id.
|
|
@@ -25188,6 +25818,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
|
|
|
25188
25818
|
if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
|
|
25189
25819
|
if (isLlamaLend(lender)) return await fetchLlamaLendMarkets(lender, chainId);
|
|
25190
25820
|
if (isResupply(lender)) return await fetchResupplyMarkets(lender, chainId);
|
|
25821
|
+
if (isCurvance(lender)) return await fetchCurvanceMarkets(lender, chainId);
|
|
25191
25822
|
if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
|
|
25192
25823
|
if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
|
|
25193
25824
|
if (isFrankencoin(lender))
|
|
@@ -25269,6 +25900,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
|
|
|
25269
25900
|
additionalYields,
|
|
25270
25901
|
list
|
|
25271
25902
|
);
|
|
25903
|
+
if (isCurvance(lender))
|
|
25904
|
+
return convertCurvanceMarketsToResponse(
|
|
25905
|
+
data,
|
|
25906
|
+
chainId,
|
|
25907
|
+
prices,
|
|
25908
|
+
additionalYields,
|
|
25909
|
+
list
|
|
25910
|
+
);
|
|
25272
25911
|
if (isFrankencoin(lender))
|
|
25273
25912
|
return convertFrankencoinMarketsToResponse(
|
|
25274
25913
|
data,
|
|
@@ -25495,6 +26134,7 @@ function lenderApiOnly(lender, chainId) {
|
|
|
25495
26134
|
if (isInverse(lender)) return true;
|
|
25496
26135
|
if (isTermMax(lender)) return true;
|
|
25497
26136
|
if (isResupply(lender)) return true;
|
|
26137
|
+
if (isCurvance(lender)) return true;
|
|
25498
26138
|
if (isUsdd(lender)) return true;
|
|
25499
26139
|
if (isFrankencoin(lender)) return true;
|
|
25500
26140
|
if (isLlamaLend(lender)) return true;
|
|
@@ -26138,20 +26778,20 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
26138
26778
|
const asstsIn = assetsInRaw.map((a) => a.toLowerCase());
|
|
26139
26779
|
for (let i = 0; i < tokens.length; i++) {
|
|
26140
26780
|
const { cToken } = tokens[i];
|
|
26141
|
-
const
|
|
26781
|
+
const key2 = createMarketUid(chainId, lender, cToken);
|
|
26142
26782
|
const { dataForAsset, addedDebt, addedDeposits } = createCompoundV2Entry(
|
|
26143
26783
|
i,
|
|
26144
26784
|
data,
|
|
26145
|
-
|
|
26785
|
+
key2,
|
|
26146
26786
|
asstsIn,
|
|
26147
26787
|
cToken,
|
|
26148
|
-
metaMap[
|
|
26788
|
+
metaMap[key2],
|
|
26149
26789
|
0
|
|
26150
26790
|
);
|
|
26151
26791
|
if (!dataForAsset) continue;
|
|
26152
26792
|
totalDebt24h += addedDebt;
|
|
26153
26793
|
totalDeposits24h += addedDeposits;
|
|
26154
|
-
lendingPositions[
|
|
26794
|
+
lendingPositions[key2] = dataForAsset;
|
|
26155
26795
|
}
|
|
26156
26796
|
const payload = {
|
|
26157
26797
|
chainId,
|
|
@@ -26173,7 +26813,7 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
26173
26813
|
}
|
|
26174
26814
|
}
|
|
26175
26815
|
};
|
|
26176
|
-
function createCompoundV2Entry(i, data,
|
|
26816
|
+
function createCompoundV2Entry(i, data, key2, assetsIn, vToken, meta, claimableRewards) {
|
|
26177
26817
|
if (isFailedCall(data[3 * i]) || isFailedCall(data[3 * i + 1])) {
|
|
26178
26818
|
return {
|
|
26179
26819
|
dataForAsset: void 0,
|
|
@@ -26200,7 +26840,7 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
|
|
|
26200
26840
|
const oPrice = getOraclePrice(meta);
|
|
26201
26841
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
26202
26842
|
const dataForAsset = {
|
|
26203
|
-
marketUid:
|
|
26843
|
+
marketUid: key2,
|
|
26204
26844
|
underlying: assetMeta.address,
|
|
26205
26845
|
deposits: currentATokenBalance,
|
|
26206
26846
|
debtStable: "0",
|
|
@@ -26301,14 +26941,14 @@ function indexesFromApiPositions(positions, owner) {
|
|
|
26301
26941
|
return [...set];
|
|
26302
26942
|
}
|
|
26303
26943
|
function fetchEulerActiveIndexesViaApi(chainId, owner) {
|
|
26304
|
-
const
|
|
26305
|
-
const cached = accountCache.get(
|
|
26944
|
+
const key2 = `${chainId}:${owner.toLowerCase()}`;
|
|
26945
|
+
const cached = accountCache.get(key2);
|
|
26306
26946
|
if (cached) return cached.promise;
|
|
26307
26947
|
const promise = fetchEulerPositionsFromApi(chainId, owner).then(
|
|
26308
26948
|
(positions) => positions === void 0 ? void 0 : indexesFromApiPositions(positions, owner)
|
|
26309
26949
|
).catch(() => void 0);
|
|
26310
|
-
const timer = setTimeout(() => accountCache.delete(
|
|
26311
|
-
accountCache.set(
|
|
26950
|
+
const timer = setTimeout(() => accountCache.delete(key2), ACCOUNT_CACHE_TTL_MS);
|
|
26951
|
+
accountCache.set(key2, { promise, timer });
|
|
26312
26952
|
return promise;
|
|
26313
26953
|
}
|
|
26314
26954
|
async function fetchEulerSubAccountIndexes(chainId, owner) {
|
|
@@ -26323,14 +26963,14 @@ function getResolvedEulerSubAccountIndexes(chainId, account) {
|
|
|
26323
26963
|
return resolvedIndexesStore.get(`${chainId}:${account.toLowerCase()}`)?.indexes;
|
|
26324
26964
|
}
|
|
26325
26965
|
function storeResolvedIndexes(chainId, account, indexes) {
|
|
26326
|
-
const
|
|
26327
|
-
const existing = resolvedIndexesStore.get(
|
|
26966
|
+
const key2 = `${chainId}:${account.toLowerCase()}`;
|
|
26967
|
+
const existing = resolvedIndexesStore.get(key2);
|
|
26328
26968
|
if (existing) clearTimeout(existing.timer);
|
|
26329
26969
|
const timer = setTimeout(
|
|
26330
|
-
() => resolvedIndexesStore.delete(
|
|
26970
|
+
() => resolvedIndexesStore.delete(key2),
|
|
26331
26971
|
RESOLVED_STORE_TTL_MS
|
|
26332
26972
|
);
|
|
26333
|
-
resolvedIndexesStore.set(
|
|
26973
|
+
resolvedIndexesStore.set(key2, { indexes, timer });
|
|
26334
26974
|
}
|
|
26335
26975
|
function getSubAccountAddress(owner, index) {
|
|
26336
26976
|
const prefix = owner.slice(0, 40);
|
|
@@ -26553,12 +27193,12 @@ var SUBGRAPH_CACHE_TTL_MS = 3e4;
|
|
|
26553
27193
|
var SUBGRAPH_TIMEOUT_MS2 = 1e4;
|
|
26554
27194
|
var subgraphCache = /* @__PURE__ */ new Map();
|
|
26555
27195
|
function fetchDolomiteAccountNumbers(chainId, owner) {
|
|
26556
|
-
const
|
|
26557
|
-
const cached = subgraphCache.get(
|
|
27196
|
+
const key2 = `${chainId}:${owner.toLowerCase()}`;
|
|
27197
|
+
const cached = subgraphCache.get(key2);
|
|
26558
27198
|
if (cached) return cached.promise;
|
|
26559
27199
|
const promise = fetchAccountNumbersFromSubgraph(chainId, owner).then((ns) => dedupeWithDefault(ns)).catch(() => ["0"]);
|
|
26560
|
-
const timer = setTimeout(() => subgraphCache.delete(
|
|
26561
|
-
subgraphCache.set(
|
|
27200
|
+
const timer = setTimeout(() => subgraphCache.delete(key2), SUBGRAPH_CACHE_TTL_MS);
|
|
27201
|
+
subgraphCache.set(key2, { promise, timer });
|
|
26562
27202
|
return promise;
|
|
26563
27203
|
}
|
|
26564
27204
|
function dedupeWithDefault(numbers) {
|
|
@@ -26601,14 +27241,14 @@ function getResolvedDolomiteAccountNumbers(chainId, account) {
|
|
|
26601
27241
|
return resolvedStore.get(`${chainId}:${account.toLowerCase()}`)?.numbers;
|
|
26602
27242
|
}
|
|
26603
27243
|
function storeResolvedNumbers(chainId, account, numbers) {
|
|
26604
|
-
const
|
|
26605
|
-
const existing = resolvedStore.get(
|
|
27244
|
+
const key2 = `${chainId}:${account.toLowerCase()}`;
|
|
27245
|
+
const existing = resolvedStore.get(key2);
|
|
26606
27246
|
if (existing) clearTimeout(existing.timer);
|
|
26607
27247
|
const timer = setTimeout(
|
|
26608
|
-
() => resolvedStore.delete(
|
|
27248
|
+
() => resolvedStore.delete(key2),
|
|
26609
27249
|
RESOLVED_STORE_TTL_MS2
|
|
26610
27250
|
);
|
|
26611
|
-
resolvedStore.set(
|
|
27251
|
+
resolvedStore.set(key2, { numbers, timer });
|
|
26612
27252
|
}
|
|
26613
27253
|
var buildDolomiteUserCall = async (chainId, _lender, account, accountNumbers) => {
|
|
26614
27254
|
const margin = dolomiteConfigs()?.[chainId]?.dolomiteMargin;
|
|
@@ -26899,13 +27539,13 @@ var ONE3 = 10n ** 18n;
|
|
|
26899
27539
|
var ROSTER_TTL_MS = 5 * 6e4;
|
|
26900
27540
|
var DISCOVERY_TTL_MS = 6e4;
|
|
26901
27541
|
var SNAPSHOT_CHUNK = 12;
|
|
26902
|
-
var
|
|
27542
|
+
var rosterCache2 = /* @__PURE__ */ new Map();
|
|
26903
27543
|
var discoveryCache2 = /* @__PURE__ */ new Map();
|
|
26904
27544
|
var rosterKey = (chainId, lender) => `${chainId}:${lender}`;
|
|
26905
27545
|
var discoveryKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
|
|
26906
27546
|
var getCachedResupplyDiscovery = (chainId, lender, account) => discoveryCache2.get(discoveryKey(chainId, lender, account));
|
|
26907
|
-
var fetchRoster = async (chainId, lender, registry,
|
|
26908
|
-
const cached =
|
|
27547
|
+
var fetchRoster = async (chainId, lender, registry, allowlist2) => {
|
|
27548
|
+
const cached = rosterCache2.get(rosterKey(chainId, lender));
|
|
26909
27549
|
if (cached && Date.now() - cached.at < ROSTER_TTL_MS) return cached;
|
|
26910
27550
|
let addresses = [];
|
|
26911
27551
|
const [raw] = await multicallRetryUniversal({
|
|
@@ -26919,13 +27559,13 @@ var fetchRoster = async (chainId, lender, registry, allowlist) => {
|
|
|
26919
27559
|
(a) => typeof a === "string" && a.startsWith("0x")
|
|
26920
27560
|
);
|
|
26921
27561
|
}
|
|
26922
|
-
if (
|
|
26923
|
-
const allow = new Set(
|
|
27562
|
+
if (allowlist2 && allowlist2.length > 0) {
|
|
27563
|
+
const allow = new Set(allowlist2.map((p) => p.toLowerCase()));
|
|
26924
27564
|
addresses = addresses.filter((p) => allow.has(p.toLowerCase()));
|
|
26925
27565
|
}
|
|
26926
27566
|
if (addresses.length === 0) {
|
|
26927
27567
|
const empty = { pairs: [], at: Date.now() };
|
|
26928
|
-
|
|
27568
|
+
rosterCache2.set(rosterKey(chainId, lender), empty);
|
|
26929
27569
|
return empty;
|
|
26930
27570
|
}
|
|
26931
27571
|
const cols = await multicallRetryUniversal({
|
|
@@ -26942,7 +27582,7 @@ var fetchRoster = async (chainId, lender, registry, allowlist) => {
|
|
|
26942
27582
|
(p) => typeof p.collateral === "string" && p.collateral.startsWith("0x")
|
|
26943
27583
|
);
|
|
26944
27584
|
const roster = { pairs, at: Date.now() };
|
|
26945
|
-
|
|
27585
|
+
rosterCache2.set(rosterKey(chainId, lender), roster);
|
|
26946
27586
|
return roster;
|
|
26947
27587
|
};
|
|
26948
27588
|
var discoverPositions = async (chainId, pairs, account) => {
|
|
@@ -26977,8 +27617,8 @@ var discoverPositions = async (chainId, pairs, account) => {
|
|
|
26977
27617
|
};
|
|
26978
27618
|
var buildResupplyUserCall = async (chainId, lender, account) => {
|
|
26979
27619
|
const cfg = resupplyConfigFor(lender, chainId);
|
|
26980
|
-
const
|
|
26981
|
-
const stash = (positions2) => discoveryCache2.set(
|
|
27620
|
+
const key2 = discoveryKey(chainId, lender, account);
|
|
27621
|
+
const stash = (positions2) => discoveryCache2.set(key2, { positions: positions2, at: Date.now() });
|
|
26982
27622
|
if (!cfg?.registry) {
|
|
26983
27623
|
stash([]);
|
|
26984
27624
|
return [];
|
|
@@ -26993,7 +27633,7 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
|
|
|
26993
27633
|
stash([]);
|
|
26994
27634
|
return [];
|
|
26995
27635
|
}
|
|
26996
|
-
const cachedDiscovery = discoveryCache2.get(
|
|
27636
|
+
const cachedDiscovery = discoveryCache2.get(key2);
|
|
26997
27637
|
const positions = cachedDiscovery && Date.now() - cachedDiscovery.at < DISCOVERY_TTL_MS ? cachedDiscovery.positions : await discoverPositions(chainId, roster.pairs, account);
|
|
26998
27638
|
stash(positions);
|
|
26999
27639
|
if (positions.length === 0) return [];
|
|
@@ -27005,20 +27645,187 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
|
|
|
27005
27645
|
]);
|
|
27006
27646
|
};
|
|
27007
27647
|
function __resetResupplyUserCaches() {
|
|
27008
|
-
|
|
27648
|
+
rosterCache2.clear();
|
|
27009
27649
|
discoveryCache2.clear();
|
|
27010
27650
|
}
|
|
27651
|
+
var ROSTER_TTL_MS2 = 5 * 6e4;
|
|
27652
|
+
var DISCOVERY_TTL_MS2 = 6e4;
|
|
27653
|
+
var CURVANCE_MARKET_READS = 2;
|
|
27654
|
+
var CURVANCE_READS_PER_TOKEN = 4;
|
|
27655
|
+
var rosterCache3 = /* @__PURE__ */ new Map();
|
|
27656
|
+
var discoveryCache3 = /* @__PURE__ */ new Map();
|
|
27657
|
+
var rosterKey2 = (chainId, lender) => `${chainId}:${lender}`;
|
|
27658
|
+
var discoveryKey2 = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
|
|
27659
|
+
var getCachedCurvanceDiscovery = (chainId, lender, account) => discoveryCache3.get(discoveryKey2(chainId, lender, account));
|
|
27660
|
+
var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
|
|
27661
|
+
const cached = rosterCache3.get(rosterKey2(chainId, lender));
|
|
27662
|
+
if (cached && Date.now() - cached.at < ROSTER_TTL_MS2) return cached;
|
|
27663
|
+
let managers = [];
|
|
27664
|
+
const [raw] = await multicallRetryUniversal({
|
|
27665
|
+
chain: chainId,
|
|
27666
|
+
calls: [{ address: centralRegistry, name: "marketManagers", params: [] }],
|
|
27667
|
+
abi: CurvanceCentralRegistryAbi,
|
|
27668
|
+
allowFailure: true
|
|
27669
|
+
});
|
|
27670
|
+
if (Array.isArray(raw)) {
|
|
27671
|
+
managers = raw.filter(
|
|
27672
|
+
(a) => typeof a === "string" && a.startsWith("0x")
|
|
27673
|
+
);
|
|
27674
|
+
}
|
|
27675
|
+
if (allowlist2 && allowlist2.length > 0) {
|
|
27676
|
+
const allow = new Set(allowlist2.map((m) => m.toLowerCase()));
|
|
27677
|
+
managers = managers.filter((m) => allow.has(m.toLowerCase()));
|
|
27678
|
+
}
|
|
27679
|
+
if (managers.length === 0) {
|
|
27680
|
+
const empty = { markets: [], at: Date.now() };
|
|
27681
|
+
rosterCache3.set(rosterKey2(chainId, lender), empty);
|
|
27682
|
+
return empty;
|
|
27683
|
+
}
|
|
27684
|
+
const listed = await multicallRetryUniversal({
|
|
27685
|
+
chain: chainId,
|
|
27686
|
+
calls: managers.map((mm) => ({
|
|
27687
|
+
address: mm,
|
|
27688
|
+
name: "queryTokensListed",
|
|
27689
|
+
params: []
|
|
27690
|
+
})),
|
|
27691
|
+
abi: managers.map(() => CurvanceMarketManagerAbi),
|
|
27692
|
+
allowFailure: true
|
|
27693
|
+
});
|
|
27694
|
+
const withTokens = managers.map((marketManager, i) => ({
|
|
27695
|
+
marketManager,
|
|
27696
|
+
addresses: Array.isArray(listed[i]) ? listed[i].filter(
|
|
27697
|
+
(t) => typeof t === "string" && t.startsWith("0x")
|
|
27698
|
+
) : []
|
|
27699
|
+
})).filter((m) => m.addresses.length > 0);
|
|
27700
|
+
const flat = withTokens.flatMap(
|
|
27701
|
+
(m) => m.addresses.map((cToken) => ({ mm: m.marketManager, cToken }))
|
|
27702
|
+
);
|
|
27703
|
+
let assets = [];
|
|
27704
|
+
try {
|
|
27705
|
+
assets = await multicallRetryUniversal({
|
|
27706
|
+
chain: chainId,
|
|
27707
|
+
calls: flat.map((f) => ({
|
|
27708
|
+
address: f.cToken,
|
|
27709
|
+
name: "asset",
|
|
27710
|
+
params: []
|
|
27711
|
+
})),
|
|
27712
|
+
abi: flat.map(() => CurvanceCTokenAbi),
|
|
27713
|
+
allowFailure: true
|
|
27714
|
+
});
|
|
27715
|
+
} catch {
|
|
27716
|
+
assets = [];
|
|
27717
|
+
}
|
|
27718
|
+
const assetByToken = /* @__PURE__ */ new Map();
|
|
27719
|
+
flat.forEach((f, i) => {
|
|
27720
|
+
const a = assets[i];
|
|
27721
|
+
if (typeof a === "string" && a.startsWith("0x")) {
|
|
27722
|
+
assetByToken.set(f.cToken.toLowerCase(), a.toLowerCase());
|
|
27723
|
+
}
|
|
27724
|
+
});
|
|
27725
|
+
const markets = withTokens.map((m) => ({
|
|
27726
|
+
marketManager: m.marketManager,
|
|
27727
|
+
cTokens: m.addresses.map((cToken) => ({
|
|
27728
|
+
cToken,
|
|
27729
|
+
asset: assetByToken.get(cToken.toLowerCase()) ?? ""
|
|
27730
|
+
})).filter((t) => t.asset !== "")
|
|
27731
|
+
})).filter((m) => m.cTokens.length > 0);
|
|
27732
|
+
const roster = { markets, at: Date.now() };
|
|
27733
|
+
rosterCache3.set(rosterKey2(chainId, lender), roster);
|
|
27734
|
+
return roster;
|
|
27735
|
+
};
|
|
27736
|
+
var discoverPositions2 = async (chainId, markets, account) => {
|
|
27737
|
+
const CHUNK = 15;
|
|
27738
|
+
const active = [];
|
|
27739
|
+
for (let i = 0; i < markets.length; i += CHUNK) {
|
|
27740
|
+
const slice2 = markets.slice(i, i + CHUNK);
|
|
27741
|
+
let res = [];
|
|
27742
|
+
try {
|
|
27743
|
+
res = await multicallRetryUniversal({
|
|
27744
|
+
chain: chainId,
|
|
27745
|
+
calls: slice2.map((m) => ({
|
|
27746
|
+
address: m.marketManager,
|
|
27747
|
+
name: "assetsOf",
|
|
27748
|
+
params: [account]
|
|
27749
|
+
})),
|
|
27750
|
+
abi: slice2.map(() => CurvanceMarketManagerAbi),
|
|
27751
|
+
allowFailure: true
|
|
27752
|
+
});
|
|
27753
|
+
} catch {
|
|
27754
|
+
continue;
|
|
27755
|
+
}
|
|
27756
|
+
slice2.forEach((m, j) => {
|
|
27757
|
+
const assets = res[j];
|
|
27758
|
+
if (!Array.isArray(assets) || assets.length === 0) return;
|
|
27759
|
+
const open = new Set(
|
|
27760
|
+
assets.filter((a) => typeof a === "string").map((a) => a.toLowerCase())
|
|
27761
|
+
);
|
|
27762
|
+
const activeTokens = m.cTokens.filter(
|
|
27763
|
+
(t) => open.has(t.cToken.toLowerCase())
|
|
27764
|
+
);
|
|
27765
|
+
if (activeTokens.length === 0) return;
|
|
27766
|
+
active.push({ ...m, activeTokens });
|
|
27767
|
+
});
|
|
27768
|
+
}
|
|
27769
|
+
return active;
|
|
27770
|
+
};
|
|
27771
|
+
var buildCurvanceUserCall = async (chainId, lender, account) => {
|
|
27772
|
+
const cfg = curvanceConfigFor(lender, chainId);
|
|
27773
|
+
const key2 = discoveryKey2(chainId, lender, account);
|
|
27774
|
+
const stash = (positions2) => discoveryCache3.set(key2, { positions: positions2, at: Date.now() });
|
|
27775
|
+
if (!cfg?.centralRegistry) {
|
|
27776
|
+
stash([]);
|
|
27777
|
+
return [];
|
|
27778
|
+
}
|
|
27779
|
+
let roster;
|
|
27780
|
+
try {
|
|
27781
|
+
roster = await fetchRoster2(
|
|
27782
|
+
chainId,
|
|
27783
|
+
lender,
|
|
27784
|
+
cfg.centralRegistry,
|
|
27785
|
+
cfg.marketAllowlist
|
|
27786
|
+
);
|
|
27787
|
+
} catch {
|
|
27788
|
+
return [];
|
|
27789
|
+
}
|
|
27790
|
+
if (roster.markets.length === 0) {
|
|
27791
|
+
stash([]);
|
|
27792
|
+
return [];
|
|
27793
|
+
}
|
|
27794
|
+
const cached = discoveryCache3.get(key2);
|
|
27795
|
+
const positions = cached && Date.now() - cached.at < DISCOVERY_TTL_MS2 ? cached.positions : await discoverPositions2(chainId, roster.markets, account);
|
|
27796
|
+
stash(positions);
|
|
27797
|
+
if (positions.length === 0) return [];
|
|
27798
|
+
return positions.flatMap((p) => [
|
|
27799
|
+
// The hold-period stamp. `cooldownTimestamp + MIN_HOLD_PERIOD` is when
|
|
27800
|
+
// repay / redeem / transfer become possible again — a first-class gate on
|
|
27801
|
+
// every exit flow, not a display detail.
|
|
27802
|
+
{ address: p.marketManager, name: "accountAssets", params: [account] },
|
|
27803
|
+
// `(collateral, maxDebt, debt)` in WAD USD, priced by Curvance's own
|
|
27804
|
+
// pessimistic dual oracle — i.e. the numbers the protocol itself
|
|
27805
|
+
// liquidates against.
|
|
27806
|
+
{ address: p.marketManager, name: "statusOf", params: [account] },
|
|
27807
|
+
...p.activeTokens.flatMap(({ cToken }) => [
|
|
27808
|
+
{ address: cToken, name: "balanceOf", params: [account] },
|
|
27809
|
+
{ address: cToken, name: "collateralPosted", params: [account] },
|
|
27810
|
+
{ address: cToken, name: "debtBalanceUpdated", params: [account] },
|
|
27811
|
+
// `assets per 1e18 shares` — the divisor is WAD regardless of the
|
|
27812
|
+
// cToken's own decimals. Read live: it drifts up with accrued interest,
|
|
27813
|
+
// so a cached rate under-reports a collateral balance.
|
|
27814
|
+
{ address: cToken, name: "exchangeRate", params: [] }
|
|
27815
|
+
])
|
|
27816
|
+
]);
|
|
27817
|
+
};
|
|
27011
27818
|
var USDD_CALLS_PER_CDP = 1;
|
|
27012
27819
|
var MAX_CDP_WALK = 64;
|
|
27013
27820
|
var CACHE_TTL_MS2 = 5 * 6e4;
|
|
27014
|
-
var
|
|
27821
|
+
var discoveryCache4 = /* @__PURE__ */ new Map();
|
|
27015
27822
|
var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
27016
27823
|
var getCachedUsddCdps = (chainId, account) => {
|
|
27017
|
-
const hit =
|
|
27824
|
+
const hit = discoveryCache4.get(cacheKey2(chainId, account));
|
|
27018
27825
|
if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
|
|
27019
27826
|
return hit;
|
|
27020
27827
|
};
|
|
27021
|
-
var
|
|
27828
|
+
var big3 = (v) => {
|
|
27022
27829
|
try {
|
|
27023
27830
|
if (typeof v === "bigint") return v;
|
|
27024
27831
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -27030,13 +27837,13 @@ var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
|
|
|
27030
27837
|
var buildUsddUserCall = async (chainId, lender, account) => {
|
|
27031
27838
|
const cfg = usddConfigFor(lender, chainId);
|
|
27032
27839
|
const markets = usddChainData(lender, chainId)?.markets ?? [];
|
|
27033
|
-
const stash = (d) =>
|
|
27840
|
+
const stash = (d) => discoveryCache4.set(cacheKey2(chainId, account), d);
|
|
27034
27841
|
if (!cfg || markets.length === 0) {
|
|
27035
27842
|
stash({ cdps: [], ilks: [], at: Date.now() });
|
|
27036
27843
|
return [];
|
|
27037
27844
|
}
|
|
27038
27845
|
const curated = new Set(markets.map((m) => m.ilk));
|
|
27039
|
-
const
|
|
27846
|
+
const zero2 = "0x0000000000000000000000000000000000000000";
|
|
27040
27847
|
const owners = [];
|
|
27041
27848
|
try {
|
|
27042
27849
|
const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
|
|
@@ -27049,9 +27856,9 @@ var buildUsddUserCall = async (chainId, lender, account) => {
|
|
|
27049
27856
|
],
|
|
27050
27857
|
allowFailure: false
|
|
27051
27858
|
});
|
|
27052
|
-
owners.push({ owner: account, count:
|
|
27053
|
-
const proxy = String(rawProxy ??
|
|
27054
|
-
if (proxy.toLowerCase() !==
|
|
27859
|
+
owners.push({ owner: account, count: big3(rawCount), cursor: big3(rawFirst) });
|
|
27860
|
+
const proxy = String(rawProxy ?? zero2);
|
|
27861
|
+
if (proxy.toLowerCase() !== zero2) {
|
|
27055
27862
|
const [pCount, pFirst] = await multicallRetryUniversal({
|
|
27056
27863
|
chain: chainId,
|
|
27057
27864
|
abi: UsddCdpManagerAbi,
|
|
@@ -27061,7 +27868,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
|
|
|
27061
27868
|
],
|
|
27062
27869
|
allowFailure: false
|
|
27063
27870
|
});
|
|
27064
|
-
owners.push({ owner: proxy, count:
|
|
27871
|
+
owners.push({ owner: proxy, count: big3(pCount), cursor: big3(pFirst) });
|
|
27065
27872
|
}
|
|
27066
27873
|
} catch {
|
|
27067
27874
|
return [];
|
|
@@ -27102,7 +27909,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
|
|
|
27102
27909
|
if (curated.has(ilk)) {
|
|
27103
27910
|
cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
|
|
27104
27911
|
}
|
|
27105
|
-
cursor =
|
|
27912
|
+
cursor = big3(field6(link, "next", 1));
|
|
27106
27913
|
}
|
|
27107
27914
|
}
|
|
27108
27915
|
} catch {
|
|
@@ -27127,7 +27934,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
|
|
|
27127
27934
|
};
|
|
27128
27935
|
var FRANKENCOIN_CALLS_PER_POSITION = 6;
|
|
27129
27936
|
var BOOK_TTL_MS = 5 * 6e4;
|
|
27130
|
-
var
|
|
27937
|
+
var DISCOVERY_TTL_MS3 = 5 * 6e4;
|
|
27131
27938
|
var API_BASE = "https://api.frankencoin.com";
|
|
27132
27939
|
var bookCache;
|
|
27133
27940
|
var fetchBook = async () => {
|
|
@@ -27151,17 +27958,17 @@ var fetchBook = async () => {
|
|
|
27151
27958
|
bookCache = { at: Date.now(), entries };
|
|
27152
27959
|
return entries;
|
|
27153
27960
|
};
|
|
27154
|
-
var
|
|
27961
|
+
var discoveryCache5 = /* @__PURE__ */ new Map();
|
|
27155
27962
|
var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
27156
27963
|
var getCachedFrankencoinPositions = (chainId, account) => {
|
|
27157
|
-
const hit =
|
|
27158
|
-
if (!hit || Date.now() - hit.at >
|
|
27964
|
+
const hit = discoveryCache5.get(cacheKey3(chainId, account));
|
|
27965
|
+
if (!hit || Date.now() - hit.at > DISCOVERY_TTL_MS3) return void 0;
|
|
27159
27966
|
return hit;
|
|
27160
27967
|
};
|
|
27161
27968
|
var buildFrankencoinUserCall = async (chainId, lender, account) => {
|
|
27162
27969
|
const cfg = frankencoinConfigFor(lender, chainId);
|
|
27163
27970
|
const markets = frankencoinChainData(lender, chainId)?.markets ?? [];
|
|
27164
|
-
const stash = (d) =>
|
|
27971
|
+
const stash = (d) => discoveryCache5.set(cacheKey3(chainId, account), d);
|
|
27165
27972
|
if (!cfg || markets.length === 0) {
|
|
27166
27973
|
stash({ positions: [], at: Date.now() });
|
|
27167
27974
|
return [];
|
|
@@ -27198,10 +28005,10 @@ var buildFrankencoinUserCall = async (chainId, lender, account) => {
|
|
|
27198
28005
|
};
|
|
27199
28006
|
var TELLER_CALLS_PER_BID = 4;
|
|
27200
28007
|
var CACHE_TTL_MS3 = 5 * 6e4;
|
|
27201
|
-
var
|
|
28008
|
+
var discoveryCache6 = /* @__PURE__ */ new Map();
|
|
27202
28009
|
var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
27203
28010
|
var getCachedTellerBids = (chainId, account) => {
|
|
27204
|
-
const hit =
|
|
28011
|
+
const hit = discoveryCache6.get(cacheKey4(chainId, account));
|
|
27205
28012
|
if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
|
|
27206
28013
|
return hit;
|
|
27207
28014
|
};
|
|
@@ -27242,7 +28049,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
27242
28049
|
return [];
|
|
27243
28050
|
}
|
|
27244
28051
|
if (ids.length === 0) {
|
|
27245
|
-
|
|
28052
|
+
discoveryCache6.set(cacheKey4(chainId, account), { bids: [], at: Date.now() });
|
|
27246
28053
|
return [];
|
|
27247
28054
|
}
|
|
27248
28055
|
const poolByAddr = /* @__PURE__ */ new Map();
|
|
@@ -27269,7 +28076,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
27269
28076
|
const pool = poolByAddr.get(lenderAddr);
|
|
27270
28077
|
if (pool) kept.push({ bidId: id, pool });
|
|
27271
28078
|
});
|
|
27272
|
-
|
|
28079
|
+
discoveryCache6.set(cacheKey4(chainId, account), { bids: kept, at: Date.now() });
|
|
27273
28080
|
if (kept.length === 0) return [];
|
|
27274
28081
|
const ts = nowSec5();
|
|
27275
28082
|
const calls = [];
|
|
@@ -27295,10 +28102,10 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
27295
28102
|
};
|
|
27296
28103
|
var TERMMAX_CALLS_PER_ACCOUNT = 1;
|
|
27297
28104
|
var CACHE_TTL_MS4 = 5 * 6e4;
|
|
27298
|
-
var
|
|
28105
|
+
var discoveryCache7 = /* @__PURE__ */ new Map();
|
|
27299
28106
|
var cacheKey5 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
27300
28107
|
var getCachedTermMaxDiscovery = (chainId, account) => {
|
|
27301
|
-
const hit =
|
|
28108
|
+
const hit = discoveryCache7.get(cacheKey5(chainId, account));
|
|
27302
28109
|
if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
|
|
27303
28110
|
return hit;
|
|
27304
28111
|
};
|
|
@@ -27314,11 +28121,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
|
|
|
27314
28121
|
}
|
|
27315
28122
|
}
|
|
27316
28123
|
if (markets.length === 0) {
|
|
27317
|
-
|
|
28124
|
+
discoveryCache7.set(cacheKey5(chainId, account), { markets: [], at: Date.now() });
|
|
27318
28125
|
return [];
|
|
27319
28126
|
}
|
|
27320
28127
|
markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
|
|
27321
|
-
|
|
28128
|
+
discoveryCache7.set(cacheKey5(chainId, account), { markets, at: Date.now() });
|
|
27322
28129
|
return [
|
|
27323
28130
|
{
|
|
27324
28131
|
address: proto.viewer,
|
|
@@ -27354,6 +28161,7 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
|
|
|
27354
28161
|
if (isLlamaLend(lender))
|
|
27355
28162
|
return buildLlamaLendUserCall(chainId, lender, account);
|
|
27356
28163
|
if (isResupply(lender)) return buildResupplyUserCall(chainId, lender, account);
|
|
28164
|
+
if (isCurvance(lender)) return buildCurvanceUserCall(chainId, lender, account);
|
|
27357
28165
|
if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
|
|
27358
28166
|
if (isFrankencoin(lender))
|
|
27359
28167
|
return buildFrankencoinUserCall(chainId, lender, account);
|
|
@@ -27532,13 +28340,13 @@ var getAaveV2UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27532
28340
|
let totalDeposits24h = 0;
|
|
27533
28341
|
for (let i = 0; i < assetsToQuery.length; i++) {
|
|
27534
28342
|
const asset = assetsToQuery[i];
|
|
27535
|
-
const
|
|
27536
|
-
const metaEntity = metaMap?.[
|
|
27537
|
-
const { dataForAsset, addedDebt, addedDeposits } = createAaveV2Entry(i, data,
|
|
28343
|
+
const key2 = createMarketUid(chainId, lender, asset);
|
|
28344
|
+
const metaEntity = metaMap?.[key2];
|
|
28345
|
+
const { dataForAsset, addedDebt, addedDeposits } = createAaveV2Entry(i, data, key2, metaEntity, 0);
|
|
27538
28346
|
if (!dataForAsset) continue;
|
|
27539
28347
|
totalDebt24h += addedDebt;
|
|
27540
28348
|
totalDeposits24h += addedDeposits;
|
|
27541
|
-
lendingPositions[
|
|
28349
|
+
lendingPositions[key2] = dataForAsset;
|
|
27542
28350
|
}
|
|
27543
28351
|
const payload = {
|
|
27544
28352
|
chainId,
|
|
@@ -27559,7 +28367,7 @@ var getAaveV2UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27559
28367
|
}
|
|
27560
28368
|
}
|
|
27561
28369
|
};
|
|
27562
|
-
function createAaveV2Entry(i, data,
|
|
28370
|
+
function createAaveV2Entry(i, data, key2, meta, claimableRewards) {
|
|
27563
28371
|
const reserveData = data[i];
|
|
27564
28372
|
if (isFailedCall(reserveData)) {
|
|
27565
28373
|
return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
|
|
@@ -27583,7 +28391,7 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
|
|
|
27583
28391
|
const oPrice = getOraclePrice(meta);
|
|
27584
28392
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
27585
28393
|
const dataForAsset = {
|
|
27586
|
-
marketUid:
|
|
28394
|
+
marketUid: key2,
|
|
27587
28395
|
underlying: assetMeta.address,
|
|
27588
28396
|
deposits: currentATokenBalance,
|
|
27589
28397
|
debtStable: currentStableDebt,
|
|
@@ -27628,18 +28436,18 @@ var getAaveV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27628
28436
|
let totalDeposits24h = 0;
|
|
27629
28437
|
for (let i = 0; i < assetsToQuery.length; i++) {
|
|
27630
28438
|
const asset = assetsToQuery[i];
|
|
27631
|
-
const
|
|
27632
|
-
const metaEntity = metaMap?.[
|
|
28439
|
+
const key2 = createMarketUid(chainId, lender, asset);
|
|
28440
|
+
const metaEntity = metaMap?.[key2];
|
|
27633
28441
|
const { dataForAsset, addedDebt, addedDeposits } = createAaveV3Entry(
|
|
27634
28442
|
i,
|
|
27635
28443
|
data,
|
|
27636
|
-
|
|
28444
|
+
key2,
|
|
27637
28445
|
metaEntity
|
|
27638
28446
|
);
|
|
27639
28447
|
if (!dataForAsset) continue;
|
|
27640
28448
|
totalDebt24h += addedDebt;
|
|
27641
28449
|
totalDeposits24h += addedDeposits;
|
|
27642
|
-
lendingPositions[
|
|
28450
|
+
lendingPositions[key2] = dataForAsset;
|
|
27643
28451
|
}
|
|
27644
28452
|
const payload = {
|
|
27645
28453
|
chainId,
|
|
@@ -27659,7 +28467,7 @@ var getAaveV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27659
28467
|
expectedNumberOfCalls
|
|
27660
28468
|
];
|
|
27661
28469
|
};
|
|
27662
|
-
function createAaveV3Entry(i, data,
|
|
28470
|
+
function createAaveV3Entry(i, data, key2, meta) {
|
|
27663
28471
|
const reserveData = data[i];
|
|
27664
28472
|
if (isFailedCall(reserveData)) {
|
|
27665
28473
|
return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
|
|
@@ -27683,7 +28491,7 @@ function createAaveV3Entry(i, data, key, meta) {
|
|
|
27683
28491
|
const oPrice = getOraclePrice(meta);
|
|
27684
28492
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
27685
28493
|
const dataForAsset = {
|
|
27686
|
-
marketUid:
|
|
28494
|
+
marketUid: key2,
|
|
27687
28495
|
underlying: assetMeta.address,
|
|
27688
28496
|
deposits: currentATokenBalance,
|
|
27689
28497
|
debtStable: currentStableDebt,
|
|
@@ -27727,8 +28535,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
|
|
|
27727
28535
|
(c) => {
|
|
27728
28536
|
const pool = c.pool.toLowerCase();
|
|
27729
28537
|
allPools[pool] = c.underlying.toLowerCase();
|
|
27730
|
-
const
|
|
27731
|
-
const metaEntity = metaMap?.[
|
|
28538
|
+
const key2 = createMarketUid(chainId, lender, pool);
|
|
28539
|
+
const metaEntity = metaMap?.[key2];
|
|
27732
28540
|
const decimals = metaEntity.asset?.decimals ?? 18;
|
|
27733
28541
|
const depositsRaw = c.amount.toString();
|
|
27734
28542
|
return {
|
|
@@ -27744,8 +28552,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
|
|
|
27744
28552
|
...data[2 /* debts */][index].map((c) => {
|
|
27745
28553
|
const pool = c.pool.toLowerCase();
|
|
27746
28554
|
allPools[pool] = c.underlying.toLowerCase();
|
|
27747
|
-
const
|
|
27748
|
-
const metaEntity = metaMap?.[
|
|
28555
|
+
const key2 = createMarketUid(chainId, lender, pool);
|
|
28556
|
+
const metaEntity = metaMap?.[key2];
|
|
27749
28557
|
const decimals = metaEntity.asset?.decimals ?? 18;
|
|
27750
28558
|
return {
|
|
27751
28559
|
[pool]: {
|
|
@@ -27759,8 +28567,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
|
|
|
27759
28567
|
{},
|
|
27760
28568
|
...Object.entries(allPools).map(
|
|
27761
28569
|
([pool, underlying]) => {
|
|
27762
|
-
const
|
|
27763
|
-
const metaEntity = metaMap?.[
|
|
28570
|
+
const key2 = createMarketUid(chainId, lender, pool);
|
|
28571
|
+
const metaEntity = metaMap?.[key2];
|
|
27764
28572
|
const price2 = getDisplayPrice(metaEntity);
|
|
27765
28573
|
const oPrice = getOraclePrice(metaEntity);
|
|
27766
28574
|
const priceHist = metaEntity?.price?.priceUsd24h ?? price2;
|
|
@@ -27774,8 +28582,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
|
|
|
27774
28582
|
histData[id].totalDebt24h += Number(debt) * priceHist;
|
|
27775
28583
|
histData[id].totalDeposits24h += Number(deposits) * priceHist;
|
|
27776
28584
|
return {
|
|
27777
|
-
[
|
|
27778
|
-
marketUid:
|
|
28585
|
+
[key2]: {
|
|
28586
|
+
marketUid: key2,
|
|
27779
28587
|
underlying,
|
|
27780
28588
|
deposits,
|
|
27781
28589
|
debt,
|
|
@@ -27862,8 +28670,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27862
28670
|
let result = {};
|
|
27863
28671
|
for (let i = 0; i < assetsNoBase.length; i++) {
|
|
27864
28672
|
const asset = assetsNoBase[i];
|
|
27865
|
-
const
|
|
27866
|
-
const metaEntity2 = metaMap?.[
|
|
28673
|
+
const key3 = createMarketUid(chainId, lender, asset);
|
|
28674
|
+
const metaEntity2 = metaMap?.[key3];
|
|
27867
28675
|
const assetMeta = metaEntity2.asset;
|
|
27868
28676
|
const decimals = assetMeta?.decimals ?? 18;
|
|
27869
28677
|
if (isFailedCall(data[i])) continue;
|
|
@@ -27874,8 +28682,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27874
28682
|
const oPrice2 = getOraclePrice(metaEntity2);
|
|
27875
28683
|
const priceHist2 = metaEntity2?.price?.priceUsd24h ?? price3;
|
|
27876
28684
|
totalDeposits24h += Number(deposits2) * priceHist2;
|
|
27877
|
-
result[
|
|
27878
|
-
marketUid:
|
|
28685
|
+
result[key3] = {
|
|
28686
|
+
marketUid: key3,
|
|
27879
28687
|
underlying: asset,
|
|
27880
28688
|
deposits: deposits2,
|
|
27881
28689
|
depositsUSD: Number(deposits2) * price3,
|
|
@@ -27892,8 +28700,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27892
28700
|
const baseFailed = isFailedCall(data[assetsNoBase.length]) || isFailedCall(data[assetsNoBase.length + 1]);
|
|
27893
28701
|
const depositsRaw = data[assetsNoBase.length]?.toString();
|
|
27894
28702
|
const debtRaw = data[assetsNoBase.length + 1]?.toString();
|
|
27895
|
-
const
|
|
27896
|
-
const metaEntity = metaMap?.[
|
|
28703
|
+
const key2 = createMarketUid(chainId, lender, baseAsset);
|
|
28704
|
+
const metaEntity = metaMap?.[key2];
|
|
27897
28705
|
const baseMeta = metaEntity.asset;
|
|
27898
28706
|
const baseDecimals = baseMeta.decimals ?? 18;
|
|
27899
28707
|
const deposits = baseFailed ? "0" : parseRawAmount(depositsRaw, baseDecimals);
|
|
@@ -27904,8 +28712,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27904
28712
|
totalDebt24h += Number(debt) * priceHist;
|
|
27905
28713
|
totalDeposits24h += Number(deposits) * priceHist;
|
|
27906
28714
|
const resultBase = baseFailed || depositsRaw === "0" && debtRaw === "0" ? {} : {
|
|
27907
|
-
[
|
|
27908
|
-
marketUid:
|
|
28715
|
+
[key2]: {
|
|
28716
|
+
marketUid: key2,
|
|
27909
28717
|
underlying: baseAsset,
|
|
27910
28718
|
deposits,
|
|
27911
28719
|
debt,
|
|
@@ -27964,18 +28772,18 @@ var getYldrUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27964
28772
|
let totalDeposits24h = 0;
|
|
27965
28773
|
for (let i = 0; i < assetsToQuery.length; i++) {
|
|
27966
28774
|
const asset = assetsToQuery[i];
|
|
27967
|
-
const
|
|
27968
|
-
const metaEntity = metaMap?.[
|
|
28775
|
+
const key2 = createMarketUid(chainId, lender, asset);
|
|
28776
|
+
const metaEntity = metaMap?.[key2];
|
|
27969
28777
|
const { dataForAsset, addedDebt, addedDeposits } = createAaveV3Entry2(
|
|
27970
28778
|
i,
|
|
27971
28779
|
data,
|
|
27972
|
-
|
|
28780
|
+
key2,
|
|
27973
28781
|
metaEntity
|
|
27974
28782
|
);
|
|
27975
28783
|
if (!dataForAsset) continue;
|
|
27976
28784
|
totalDebt24h += addedDebt;
|
|
27977
28785
|
totalDeposits24h += addedDeposits;
|
|
27978
|
-
lendingPositions[
|
|
28786
|
+
lendingPositions[key2] = dataForAsset;
|
|
27979
28787
|
}
|
|
27980
28788
|
const payload = {
|
|
27981
28789
|
chainId,
|
|
@@ -27995,7 +28803,7 @@ var getYldrUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
27995
28803
|
expectedNumberOfCalls
|
|
27996
28804
|
];
|
|
27997
28805
|
};
|
|
27998
|
-
function createAaveV3Entry2(i, data,
|
|
28806
|
+
function createAaveV3Entry2(i, data, key2, meta) {
|
|
27999
28807
|
const reserveData = data[i];
|
|
28000
28808
|
if (isFailedCall(reserveData)) {
|
|
28001
28809
|
return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
|
|
@@ -28017,7 +28825,7 @@ function createAaveV3Entry2(i, data, key, meta) {
|
|
|
28017
28825
|
const oPrice = getOraclePrice(meta);
|
|
28018
28826
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
28019
28827
|
const dataForAsset = {
|
|
28020
|
-
marketUid:
|
|
28828
|
+
marketUid: key2,
|
|
28021
28829
|
underlying: assetMeta.address,
|
|
28022
28830
|
deposits: currentATokenBalance,
|
|
28023
28831
|
debtStable: "0",
|
|
@@ -28394,8 +29202,8 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
|
|
|
28394
29202
|
const termPositions = {};
|
|
28395
29203
|
let aggregateDebtToken = borrowDec;
|
|
28396
29204
|
if (brokerData) {
|
|
28397
|
-
const mkTermPosition = (
|
|
28398
|
-
termPositions[
|
|
29205
|
+
const mkTermPosition = (key2, debtToken, term) => {
|
|
29206
|
+
termPositions[key2] = {
|
|
28399
29207
|
marketUid: loanMarketUid,
|
|
28400
29208
|
underlying: loanAddress,
|
|
28401
29209
|
loanId: term.loanId,
|
|
@@ -28824,15 +29632,15 @@ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalD
|
|
|
28824
29632
|
debt += debtUSD + (debtStableUSD ?? 0);
|
|
28825
29633
|
oracleDebt += debtUSDOracle + (pos.debtStableUSDOracle ?? debtStableUSD ?? 0);
|
|
28826
29634
|
(rewards ?? []).forEach((rewardData) => {
|
|
28827
|
-
const
|
|
29635
|
+
const key2 = rewardData.asset;
|
|
28828
29636
|
rewardDepositAccrual += rewardData.depositRate * depositsUSD;
|
|
28829
29637
|
rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD;
|
|
28830
29638
|
const rewDepo = rewardData.depositRate * depositsUSD;
|
|
28831
29639
|
const rewDebt = rewardData.variableBorrowRate * debtUSD;
|
|
28832
|
-
if (!rewardsPerAsset[
|
|
28833
|
-
rewardsPerAsset[
|
|
28834
|
-
if (rewDepo > 0) rewardsPerAsset[
|
|
28835
|
-
if (rewDebt > 0) rewardsPerAsset[
|
|
29640
|
+
if (!rewardsPerAsset[key2])
|
|
29641
|
+
rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
|
|
29642
|
+
if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
|
|
29643
|
+
if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
|
|
28836
29644
|
});
|
|
28837
29645
|
stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
|
|
28838
29646
|
stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
|
|
@@ -28990,8 +29798,8 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
|
|
|
28990
29798
|
const r = reserves[i];
|
|
28991
29799
|
const underlying = (r.underlying ?? "").toLowerCase();
|
|
28992
29800
|
if (!underlying) continue;
|
|
28993
|
-
const
|
|
28994
|
-
const metaEntity = flatMeta[
|
|
29801
|
+
const key2 = createMarketUid(chainId, lender, String(r.reserveId));
|
|
29802
|
+
const metaEntity = flatMeta[key2];
|
|
28995
29803
|
if (!metaEntity) continue;
|
|
28996
29804
|
const base = i * USER_CALLS_PER_RESERVE;
|
|
28997
29805
|
const userPositionResult = data[base + 3];
|
|
@@ -29001,7 +29809,7 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29001
29809
|
const { dataForAsset, addedDebt, addedDeposits } = createAaveV4Entry(
|
|
29002
29810
|
base,
|
|
29003
29811
|
data,
|
|
29004
|
-
|
|
29812
|
+
key2,
|
|
29005
29813
|
metaEntity,
|
|
29006
29814
|
spokeAddrLc
|
|
29007
29815
|
);
|
|
@@ -29009,7 +29817,7 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29009
29817
|
dataForAsset.userConfigKey = String(userDynConfigKey);
|
|
29010
29818
|
totalDebt24h += addedDebt;
|
|
29011
29819
|
totalDeposits24h += addedDeposits;
|
|
29012
|
-
lendingPositions[
|
|
29820
|
+
lendingPositions[key2] = dataForAsset;
|
|
29013
29821
|
}
|
|
29014
29822
|
const payload = {
|
|
29015
29823
|
chainId,
|
|
@@ -29034,7 +29842,7 @@ function getConfigOraclePrice(meta, spokeAddr) {
|
|
|
29034
29842
|
}
|
|
29035
29843
|
return getOraclePrice(meta);
|
|
29036
29844
|
}
|
|
29037
|
-
function createAaveV4Entry(base, data,
|
|
29845
|
+
function createAaveV4Entry(base, data, key2, meta, spokeAddr) {
|
|
29038
29846
|
const rawSupply = data[base];
|
|
29039
29847
|
const debtResult = data[base + 1];
|
|
29040
29848
|
const statusResult = data[base + 2];
|
|
@@ -29058,7 +29866,7 @@ function createAaveV4Entry(base, data, key, meta, spokeAddr) {
|
|
|
29058
29866
|
const oPrice = getConfigOraclePrice(meta, spokeAddr);
|
|
29059
29867
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
29060
29868
|
const dataForAsset = {
|
|
29061
|
-
marketUid:
|
|
29869
|
+
marketUid: key2,
|
|
29062
29870
|
underlying: assetMeta.address,
|
|
29063
29871
|
deposits: currentDeposits,
|
|
29064
29872
|
debtStable: "0",
|
|
@@ -29657,8 +30465,8 @@ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
29657
30465
|
const wei = weis[k];
|
|
29658
30466
|
if (!wei) return;
|
|
29659
30467
|
const underlying = normalizeUnderlying3(token);
|
|
29660
|
-
const
|
|
29661
|
-
const meta = metaMap?.[
|
|
30468
|
+
const key2 = createMarketUid(chainId, lender, String(marketIds[k]));
|
|
30469
|
+
const meta = metaMap?.[key2];
|
|
29662
30470
|
if (!meta) return;
|
|
29663
30471
|
const decimals = meta.asset?.decimals ?? 18;
|
|
29664
30472
|
const amount = parseRawAmount(wei.value, decimals);
|
|
@@ -29671,8 +30479,8 @@ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
29671
30479
|
const priceHist = meta?.price?.priceUsd24h ?? price2;
|
|
29672
30480
|
histData[id].totalDeposits24h += Number(deposits) * priceHist;
|
|
29673
30481
|
histData[id].totalDebt24h += Number(debt) * priceHist;
|
|
29674
|
-
lendingPositions[id][
|
|
29675
|
-
marketUid:
|
|
30482
|
+
lendingPositions[id][key2] = {
|
|
30483
|
+
marketUid: key2,
|
|
29676
30484
|
underlying,
|
|
29677
30485
|
deposits,
|
|
29678
30486
|
debt,
|
|
@@ -29850,7 +30658,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29850
30658
|
totalCalls
|
|
29851
30659
|
];
|
|
29852
30660
|
};
|
|
29853
|
-
var
|
|
30661
|
+
var WAD10 = 1000000000000000000n;
|
|
29854
30662
|
function toBigInt11(v) {
|
|
29855
30663
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
29856
30664
|
if (typeof v === "bigint") return v;
|
|
@@ -29892,8 +30700,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29892
30700
|
const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
|
|
29893
30701
|
const debtNum = Number(debtStr);
|
|
29894
30702
|
const repoBalance = toBigInt11(balanceResult);
|
|
29895
|
-
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) ||
|
|
29896
|
-
const lentUnits = repoBalance * redemptionValue /
|
|
30703
|
+
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD10;
|
|
30704
|
+
const lentUnits = repoBalance * redemptionValue / WAD10;
|
|
29897
30705
|
const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
|
|
29898
30706
|
const depositsNum = Number(depositsStr);
|
|
29899
30707
|
const posData = {};
|
|
@@ -29971,7 +30779,7 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29971
30779
|
};
|
|
29972
30780
|
var nowSec6 = () => Math.floor(Date.now() / 1e3);
|
|
29973
30781
|
var DAY_SECONDS = 86400n;
|
|
29974
|
-
var
|
|
30782
|
+
var WAD11 = 10n ** 18n;
|
|
29975
30783
|
function sumPreview(positions) {
|
|
29976
30784
|
return positions.reduce((acc, p) => acc + p.previewValue, 0n);
|
|
29977
30785
|
}
|
|
@@ -29995,7 +30803,7 @@ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
|
|
|
29995
30803
|
...kind === "borrow" ? {
|
|
29996
30804
|
...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
|
|
29997
30805
|
// face × penaltyRate × 1 day — what another day of being late adds.
|
|
29998
|
-
latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS /
|
|
30806
|
+
latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD11).toString(),
|
|
29999
30807
|
latePenaltyApr: penaltyApr
|
|
30000
30808
|
} : {
|
|
30001
30809
|
...overdue ? {} : { earlyExitCost: gap.toString() },
|
|
@@ -30124,7 +30932,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
30124
30932
|
latePenalty: penalty,
|
|
30125
30933
|
/** further penalty per day overdue — linear on face */
|
|
30126
30934
|
latePenaltyPerDay: parseRawAmount(
|
|
30127
|
-
(face * m.penaltyRate * DAY_SECONDS /
|
|
30935
|
+
(face * m.penaltyRate * DAY_SECONDS / WAD11).toString(),
|
|
30128
30936
|
decimals
|
|
30129
30937
|
),
|
|
30130
30938
|
latePenaltyApr: penaltyApr,
|
|
@@ -30155,7 +30963,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
30155
30963
|
expected
|
|
30156
30964
|
];
|
|
30157
30965
|
};
|
|
30158
|
-
var
|
|
30966
|
+
var big4 = (v) => {
|
|
30159
30967
|
try {
|
|
30160
30968
|
if (typeof v === "bigint") return v;
|
|
30161
30969
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30163,7 +30971,7 @@ var big3 = (v) => {
|
|
|
30163
30971
|
}
|
|
30164
30972
|
return 0n;
|
|
30165
30973
|
};
|
|
30166
|
-
var field7 = (res, name, idx) =>
|
|
30974
|
+
var field7 = (res, name, idx) => big4(res?.[name] ?? res?.[idx]);
|
|
30167
30975
|
var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
30168
30976
|
const cfg = liquityConfigFor(lender, chainId);
|
|
30169
30977
|
const branches = liquityBranchesByChain(lender, chainId);
|
|
@@ -30284,11 +31092,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30284
31092
|
};
|
|
30285
31093
|
});
|
|
30286
31094
|
const spBase = troves.length * 2;
|
|
30287
|
-
const spDeposit =
|
|
30288
|
-
const spYield =
|
|
30289
|
-
const spCollGain =
|
|
30290
|
-
const spStashed =
|
|
30291
|
-
const collSurplus = branch.collSurplusPool ?
|
|
31095
|
+
const spDeposit = big4(slice2[spBase]);
|
|
31096
|
+
const spYield = big4(slice2[spBase + 1]);
|
|
31097
|
+
const spCollGain = big4(slice2[spBase + 2]);
|
|
31098
|
+
const spStashed = big4(slice2[spBase + 3]);
|
|
31099
|
+
const collSurplus = branch.collSurplusPool ? big4(slice2[spBase + 4]) : 0n;
|
|
30292
31100
|
const spStable = spDeposit + spYield;
|
|
30293
31101
|
const spColl = spCollGain + spStashed + collSurplus;
|
|
30294
31102
|
if (spStable > 0n || spColl > 0n) {
|
|
@@ -30367,7 +31175,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30367
31175
|
expected
|
|
30368
31176
|
];
|
|
30369
31177
|
};
|
|
30370
|
-
var
|
|
31178
|
+
var big5 = (v) => {
|
|
30371
31179
|
try {
|
|
30372
31180
|
if (typeof v === "bigint") return v;
|
|
30373
31181
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30375,7 +31183,7 @@ var big4 = (v) => {
|
|
|
30375
31183
|
}
|
|
30376
31184
|
return 0n;
|
|
30377
31185
|
};
|
|
30378
|
-
var field8 = (res, name, idx) =>
|
|
31186
|
+
var field8 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
|
|
30379
31187
|
var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
30380
31188
|
const cfg = riverConfigFor(lender, chainId);
|
|
30381
31189
|
const markets = riverChainData(lender, chainId)?.markets ?? [];
|
|
@@ -30387,13 +31195,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30387
31195
|
const debtAddr = cfg.debtToken.toLowerCase();
|
|
30388
31196
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
30389
31197
|
const out = {};
|
|
30390
|
-
const spDeposit =
|
|
31198
|
+
const spDeposit = big5(data[markets.length * RIVER_CALLS_PER_MARKET]);
|
|
30391
31199
|
markets.forEach((market, i) => {
|
|
30392
31200
|
const base = i * RIVER_CALLS_PER_MARKET;
|
|
30393
31201
|
const entire = data[base];
|
|
30394
31202
|
if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
|
|
30395
|
-
const status = Number(
|
|
30396
|
-
const surplus =
|
|
31203
|
+
const status = Number(big5(data[base + 1]));
|
|
31204
|
+
const surplus = big5(data[base + 2]);
|
|
30397
31205
|
const lenderKey = riverLenderKey(lender, chainId, market.index);
|
|
30398
31206
|
const metaMap = meta?.[lenderKey];
|
|
30399
31207
|
if (!metaMap) return;
|
|
@@ -30501,7 +31309,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30501
31309
|
expected
|
|
30502
31310
|
];
|
|
30503
31311
|
};
|
|
30504
|
-
var
|
|
31312
|
+
var big6 = (v) => {
|
|
30505
31313
|
try {
|
|
30506
31314
|
if (typeof v === "bigint") return v;
|
|
30507
31315
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30520,24 +31328,24 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30520
31328
|
const dolaAddr = cfg.dola.toLowerCase();
|
|
30521
31329
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
30522
31330
|
const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
|
|
30523
|
-
const dbrBalance =
|
|
30524
|
-
const dbrDeficit =
|
|
31331
|
+
const dbrBalance = big6(data[tailBase]);
|
|
31332
|
+
const dbrDeficit = big6(data[tailBase + 1]);
|
|
30525
31333
|
const dbrSignedRaw = data[tailBase + 2];
|
|
30526
|
-
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n :
|
|
31334
|
+
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big6(dbrSignedRaw);
|
|
30527
31335
|
const dbrTotalDebtRaw = data[tailBase + 3];
|
|
30528
|
-
const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n :
|
|
31336
|
+
const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n : big6(dbrTotalDebtRaw);
|
|
30529
31337
|
const dbrRunway = dbrTotalDebt > 0n ? dbrBalance * 31536000n / dbrTotalDebt : 0n;
|
|
30530
31338
|
const nowSec9 = BigInt(Math.floor(Date.now() / 1e3));
|
|
30531
31339
|
const out = {};
|
|
30532
31340
|
markets.forEach((market, i) => {
|
|
30533
31341
|
const base = i * INVERSE_CALLS_PER_MARKET;
|
|
30534
|
-
const escrowBal = isFailedCall(data[base]) ? 0n :
|
|
31342
|
+
const escrowBal = isFailedCall(data[base]) ? 0n : big6(data[base]);
|
|
30535
31343
|
const debtRaw = data[base + 1];
|
|
30536
31344
|
if (isFailedCall(debtRaw)) return;
|
|
30537
|
-
const debt =
|
|
31345
|
+
const debt = big6(debtRaw);
|
|
30538
31346
|
if (escrowBal === 0n && debt === 0n) return;
|
|
30539
|
-
const creditLimit = isFailedCall(data[base + 2]) ? 0n :
|
|
30540
|
-
const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n :
|
|
31347
|
+
const creditLimit = isFailedCall(data[base + 2]) ? 0n : big6(data[base + 2]);
|
|
31348
|
+
const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big6(data[base + 3]);
|
|
30541
31349
|
const lenderKey = inverseLenderKey(lender, market.address);
|
|
30542
31350
|
const metaMap = meta?.[lenderKey];
|
|
30543
31351
|
if (!metaMap) return;
|
|
@@ -30623,7 +31431,7 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30623
31431
|
expected
|
|
30624
31432
|
];
|
|
30625
31433
|
};
|
|
30626
|
-
var
|
|
31434
|
+
var big7 = (v) => {
|
|
30627
31435
|
try {
|
|
30628
31436
|
if (typeof v === "bigint") return v;
|
|
30629
31437
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30633,7 +31441,7 @@ var big6 = (v) => {
|
|
|
30633
31441
|
};
|
|
30634
31442
|
var arrAt = (v, i) => {
|
|
30635
31443
|
if (isFailedCall(v) || !Array.isArray(v)) return 0n;
|
|
30636
|
-
return
|
|
31444
|
+
return big7(v[i]);
|
|
30637
31445
|
};
|
|
30638
31446
|
var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
|
|
30639
31447
|
const cfg = llamaLendConfigFor(lender, chainId);
|
|
@@ -30648,18 +31456,18 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30648
31456
|
const base = i * LLAMALEND_CALLS_PER_MARKET;
|
|
30649
31457
|
const stateRaw = data[base];
|
|
30650
31458
|
if (isFailedCall(stateRaw) || !Array.isArray(stateRaw)) return;
|
|
30651
|
-
const collateral =
|
|
30652
|
-
const bandBorrowed =
|
|
30653
|
-
const debt =
|
|
30654
|
-
const bandCount = Number(
|
|
31459
|
+
const collateral = big7(stateRaw[0]);
|
|
31460
|
+
const bandBorrowed = big7(stateRaw[1]);
|
|
31461
|
+
const debt = big7(stateRaw[2]);
|
|
31462
|
+
const bandCount = Number(big7(stateRaw[3]));
|
|
30655
31463
|
if (collateral === 0n && debt === 0n && bandBorrowed === 0n) return;
|
|
30656
31464
|
const healthRaw = data[base + 1];
|
|
30657
|
-
const health = isFailedCall(healthRaw) ? 0n :
|
|
31465
|
+
const health = isFailedCall(healthRaw) ? 0n : big7(healthRaw);
|
|
30658
31466
|
const pricesRaw = data[base + 2];
|
|
30659
31467
|
const priceUpper = arrAt(pricesRaw, 0);
|
|
30660
31468
|
const priceLower = arrAt(pricesRaw, 1);
|
|
30661
31469
|
const ticksRaw = data[base + 3];
|
|
30662
|
-
const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(
|
|
31470
|
+
const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big7(ticksRaw[0])), Number(big7(ticksRaw[1]))];
|
|
30663
31471
|
const approvalRaw = data[base + 4];
|
|
30664
31472
|
const delegated = isFailedCall(approvalRaw) ? false : approvalRaw === true;
|
|
30665
31473
|
const lenderKey = llamaLendLenderKey(lender, market.controller);
|
|
@@ -30756,7 +31564,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30756
31564
|
expected
|
|
30757
31565
|
];
|
|
30758
31566
|
};
|
|
30759
|
-
var
|
|
31567
|
+
var big8 = (v) => {
|
|
30760
31568
|
try {
|
|
30761
31569
|
if (typeof v === "bigint") return v;
|
|
30762
31570
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30764,7 +31572,7 @@ var big7 = (v) => {
|
|
|
30764
31572
|
}
|
|
30765
31573
|
return 0n;
|
|
30766
31574
|
};
|
|
30767
|
-
var tupleAt = (v, i) => Array.isArray(v) ?
|
|
31575
|
+
var tupleAt = (v, i) => Array.isArray(v) ? big8(v[i]) : 0n;
|
|
30768
31576
|
var ONE4 = 10n ** 18n;
|
|
30769
31577
|
function sharesToAmount(shares, totalAmount, totalShares) {
|
|
30770
31578
|
if (totalShares === 0n || shares === 0n) return 0n;
|
|
@@ -30790,7 +31598,7 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30790
31598
|
if (isFailedCall(accounting) || !Array.isArray(accounting)) return;
|
|
30791
31599
|
const totalBorrowAmount = tupleAt(accounting, 1);
|
|
30792
31600
|
const totalBorrowShares = tupleAt(accounting, 2);
|
|
30793
|
-
const sharePrice = isFailedCall(data[base + 1]) ? 0n :
|
|
31601
|
+
const sharePrice = isFailedCall(data[base + 1]) ? 0n : big8(data[base + 1]);
|
|
30794
31602
|
const lenderKey = resupplyLenderKey(lender, chainId, pair);
|
|
30795
31603
|
const metaMap = meta?.[lenderKey];
|
|
30796
31604
|
if (!metaMap) return;
|
|
@@ -30888,8 +31696,124 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30888
31696
|
expected
|
|
30889
31697
|
];
|
|
30890
31698
|
};
|
|
30891
|
-
var
|
|
30892
|
-
var
|
|
31699
|
+
var WAD12 = 10n ** 18n;
|
|
31700
|
+
var big9 = (v) => {
|
|
31701
|
+
try {
|
|
31702
|
+
if (typeof v === "bigint") return v;
|
|
31703
|
+
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
31704
|
+
} catch {
|
|
31705
|
+
}
|
|
31706
|
+
return 0n;
|
|
31707
|
+
};
|
|
31708
|
+
var tupleAt2 = (v, i) => Array.isArray(v) ? big9(v[i]) : 0n;
|
|
31709
|
+
var HOLD_PERIOD_SECONDS = 1200n;
|
|
31710
|
+
var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
|
|
31711
|
+
const cfg = curvanceConfigFor(lender, chainId);
|
|
31712
|
+
const discovery = getCachedCurvanceDiscovery(chainId, lender, account);
|
|
31713
|
+
const positions = discovery?.positions ?? [];
|
|
31714
|
+
const expected = cfg && positions.length > 0 ? positions.reduce(
|
|
31715
|
+
(acc, p) => acc + CURVANCE_MARKET_READS + p.activeTokens.length * CURVANCE_READS_PER_TOKEN,
|
|
31716
|
+
0
|
|
31717
|
+
) : 0;
|
|
31718
|
+
return [
|
|
31719
|
+
(data) => {
|
|
31720
|
+
if (!cfg || expected === 0) return void 0;
|
|
31721
|
+
if (!data || data.length < expected) return void 0;
|
|
31722
|
+
const out = {};
|
|
31723
|
+
const nowSeconds = BigInt(Math.floor(Date.now() / 1e3));
|
|
31724
|
+
let cursor = 0;
|
|
31725
|
+
for (const p of positions) {
|
|
31726
|
+
const base = cursor;
|
|
31727
|
+
cursor += CURVANCE_MARKET_READS + p.activeTokens.length * CURVANCE_READS_PER_TOKEN;
|
|
31728
|
+
const cooldownRaw = data[base];
|
|
31729
|
+
const status = data[base + 1];
|
|
31730
|
+
if (isFailedCall(status) || !Array.isArray(status)) continue;
|
|
31731
|
+
const cooldownTimestamp = isFailedCall(cooldownRaw) ? 0n : big9(cooldownRaw);
|
|
31732
|
+
const holdPeriodEndsAt = cooldownTimestamp > 0n ? cooldownTimestamp + HOLD_PERIOD_SECONDS : 0n;
|
|
31733
|
+
const holdPeriodActive = holdPeriodEndsAt > nowSeconds;
|
|
31734
|
+
const lenderKey = curvanceLenderKey(lender, chainId, p.marketManager);
|
|
31735
|
+
const metaMap = meta?.[lenderKey];
|
|
31736
|
+
if (!metaMap) continue;
|
|
31737
|
+
const info = {
|
|
31738
|
+
marketManager: p.marketManager,
|
|
31739
|
+
holdPeriodEndsAt: holdPeriodEndsAt.toString(),
|
|
31740
|
+
holdPeriodActive,
|
|
31741
|
+
collateralValueUsdWad: tupleAt2(status, 0).toString(),
|
|
31742
|
+
maxDebtUsdWad: tupleAt2(status, 1).toString(),
|
|
31743
|
+
debtValueUsdWad: tupleAt2(status, 2).toString(),
|
|
31744
|
+
tokens: {}
|
|
31745
|
+
};
|
|
31746
|
+
const lendingPositions = { "0": {} };
|
|
31747
|
+
const hist = {
|
|
31748
|
+
"0": { totalDeposits24h: 0, totalDebt24h: 0 }
|
|
31749
|
+
};
|
|
31750
|
+
let rows = 0;
|
|
31751
|
+
p.activeTokens.forEach(({ cToken, asset }, i) => {
|
|
31752
|
+
const tokenBase = base + CURVANCE_MARKET_READS + i * CURVANCE_READS_PER_TOKEN;
|
|
31753
|
+
const shares = isFailedCall(data[tokenBase]) ? 0n : big9(data[tokenBase]);
|
|
31754
|
+
const collateralShares = isFailedCall(data[tokenBase + 1]) ? 0n : big9(data[tokenBase + 1]);
|
|
31755
|
+
const debtRaw = isFailedCall(data[tokenBase + 2]) ? 0n : big9(data[tokenBase + 2]);
|
|
31756
|
+
const exchangeRate = isFailedCall(data[tokenBase + 3]) ? 0n : big9(data[tokenBase + 3]);
|
|
31757
|
+
info.tokens[cToken.toLowerCase()] = {
|
|
31758
|
+
shares: shares.toString(),
|
|
31759
|
+
collateralShares: collateralShares.toString(),
|
|
31760
|
+
debt: debtRaw.toString(),
|
|
31761
|
+
exchangeRate: exchangeRate.toString()
|
|
31762
|
+
};
|
|
31763
|
+
const uid = createMarketUid(chainId, lenderKey, asset);
|
|
31764
|
+
const rowMeta = metaMap[uid];
|
|
31765
|
+
if (!rowMeta) return;
|
|
31766
|
+
const assetDecimals = rowMeta.asset?.decimals ?? 18;
|
|
31767
|
+
const display = getDisplayPrice(rowMeta);
|
|
31768
|
+
const oracle = getOraclePrice(rowMeta);
|
|
31769
|
+
const histPrice = rowMeta.price?.priceUsd24h ?? display;
|
|
31770
|
+
const toUnderlying = (s) => exchangeRate > 0n ? s * exchangeRate / WAD12 : s;
|
|
31771
|
+
const depositsRaw = toUnderlying(collateralShares);
|
|
31772
|
+
const depositsStr = parseRawAmount(
|
|
31773
|
+
depositsRaw.toString(),
|
|
31774
|
+
assetDecimals
|
|
31775
|
+
);
|
|
31776
|
+
const depositsNum = Number(depositsStr);
|
|
31777
|
+
const debtStr = parseRawAmount(debtRaw.toString(), assetDecimals);
|
|
31778
|
+
const debtNum = Number(debtStr);
|
|
31779
|
+
lendingPositions["0"][uid] = {
|
|
31780
|
+
marketUid: uid,
|
|
31781
|
+
underlying: asset,
|
|
31782
|
+
deposits: depositsStr,
|
|
31783
|
+
debt: debtStr,
|
|
31784
|
+
debtStable: "0",
|
|
31785
|
+
depositsUSD: depositsNum * display,
|
|
31786
|
+
debtUSD: debtNum * display,
|
|
31787
|
+
debtStableUSD: 0,
|
|
31788
|
+
depositsUSDOracle: depositsNum * oracle,
|
|
31789
|
+
debtUSDOracle: debtNum * oracle,
|
|
31790
|
+
debtStableUSDOracle: 0,
|
|
31791
|
+
stableBorrowRate: "0",
|
|
31792
|
+
// In Curvance "collateral enabled" is not a per-market toggle: it
|
|
31793
|
+
// is whether shares are POSTED. Idle shares earn but back nothing.
|
|
31794
|
+
collateralEnabled: collateralShares > 0n,
|
|
31795
|
+
claimableRewards: 0,
|
|
31796
|
+
curvanceInfo: info
|
|
31797
|
+
};
|
|
31798
|
+
hist["0"].totalDeposits24h += depositsNum * histPrice;
|
|
31799
|
+
hist["0"].totalDebt24h += debtNum * histPrice;
|
|
31800
|
+
rows++;
|
|
31801
|
+
});
|
|
31802
|
+
if (rows === 0) continue;
|
|
31803
|
+
const userData = createMultiAccountTypeUserState(
|
|
31804
|
+
{ chainId, account, lendingPositions, modes: { "0": 0 } },
|
|
31805
|
+
metaMap,
|
|
31806
|
+
hist
|
|
31807
|
+
);
|
|
31808
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
31809
|
+
}
|
|
31810
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
31811
|
+
},
|
|
31812
|
+
expected
|
|
31813
|
+
];
|
|
31814
|
+
};
|
|
31815
|
+
var RAY5 = 10n ** 27n;
|
|
31816
|
+
var big10 = (v) => {
|
|
30893
31817
|
try {
|
|
30894
31818
|
if (typeof v === "bigint") return v;
|
|
30895
31819
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -30897,7 +31821,7 @@ var big8 = (v) => {
|
|
|
30897
31821
|
}
|
|
30898
31822
|
return 0n;
|
|
30899
31823
|
};
|
|
30900
|
-
var field9 = (res, name, idx) =>
|
|
31824
|
+
var field9 = (res, name, idx) => big10(res?.[name] ?? res?.[idx]);
|
|
30901
31825
|
var getUsddUserDataConverter = (lender, chainId, account, meta) => {
|
|
30902
31826
|
const cfg = usddConfigFor(lender, chainId);
|
|
30903
31827
|
const markets = usddChainData(lender, chainId)?.markets ?? [];
|
|
@@ -30922,14 +31846,14 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
30922
31846
|
if (isFailedCall(res)) return;
|
|
30923
31847
|
const ink = field9(res, "ink", 0);
|
|
30924
31848
|
const art = field9(res, "art", 1);
|
|
30925
|
-
const rate = rateByIlk.get(cdp.ilk) ??
|
|
30926
|
-
const debt = art * rate /
|
|
31849
|
+
const rate = rateByIlk.get(cdp.ilk) ?? RAY5;
|
|
31850
|
+
const debt = art * rate / RAY5;
|
|
30927
31851
|
if (ink === 0n && debt === 0n) return;
|
|
30928
31852
|
const market = markets.find((m) => m.ilk === cdp.ilk);
|
|
30929
31853
|
if (!market) return;
|
|
30930
|
-
const
|
|
30931
|
-
if (!perMarket.has(
|
|
30932
|
-
perMarket.get(
|
|
31854
|
+
const key2 = usddLenderKey(lender, chainId, cdp.ilk);
|
|
31855
|
+
if (!perMarket.has(key2)) perMarket.set(key2, { market, positions: [] });
|
|
31856
|
+
perMarket.get(key2).positions.push({ cdp, ink, debt });
|
|
30933
31857
|
});
|
|
30934
31858
|
const out = {};
|
|
30935
31859
|
for (const [lenderKey, { market, positions }] of perMarket) {
|
|
@@ -31010,7 +31934,7 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
31010
31934
|
expected
|
|
31011
31935
|
];
|
|
31012
31936
|
};
|
|
31013
|
-
var
|
|
31937
|
+
var big11 = (v) => {
|
|
31014
31938
|
try {
|
|
31015
31939
|
if (typeof v === "bigint") return v;
|
|
31016
31940
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -31040,17 +31964,17 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
31040
31964
|
const ownerRes = data[base];
|
|
31041
31965
|
if (isFailedCall(ownerRes)) return;
|
|
31042
31966
|
if (String(ownerRes).toLowerCase() !== lowerAccount) return;
|
|
31043
|
-
const minted =
|
|
31044
|
-
const price2 =
|
|
31045
|
-
const expiration =
|
|
31046
|
-
const challenged =
|
|
31047
|
-
const coll =
|
|
31967
|
+
const minted = big11(data[base + 1]);
|
|
31968
|
+
const price2 = big11(data[base + 2]);
|
|
31969
|
+
const expiration = big11(data[base + 3]);
|
|
31970
|
+
const challenged = big11(data[base + 4]);
|
|
31971
|
+
const coll = big11(data[base + 5]);
|
|
31048
31972
|
if (minted === 0n && coll === 0n) return;
|
|
31049
31973
|
const market = marketByOriginal.get(p.original);
|
|
31050
31974
|
if (!market) return;
|
|
31051
|
-
const
|
|
31052
|
-
if (!perMarket.has(
|
|
31053
|
-
perMarket.get(
|
|
31975
|
+
const key2 = frankencoinLenderKey(lender, chainId, market.position);
|
|
31976
|
+
if (!perMarket.has(key2)) perMarket.set(key2, { market, rows: [] });
|
|
31977
|
+
perMarket.get(key2).rows.push({
|
|
31054
31978
|
info: {
|
|
31055
31979
|
position: p.position,
|
|
31056
31980
|
original: p.original,
|
|
@@ -31145,7 +32069,7 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
31145
32069
|
|
|
31146
32070
|
// src/lending/user-data/teller/userCallParse.ts
|
|
31147
32071
|
var nowSec7 = () => Math.floor(Date.now() / 1e3);
|
|
31148
|
-
var
|
|
32072
|
+
var big12 = (v) => {
|
|
31149
32073
|
try {
|
|
31150
32074
|
if (typeof v === "bigint") return v;
|
|
31151
32075
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -31167,7 +32091,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
31167
32091
|
const base = i * TELLER_CALLS_PER_BID;
|
|
31168
32092
|
const bidRes = data[base];
|
|
31169
32093
|
const owed = data[base + 1];
|
|
31170
|
-
const collAmount =
|
|
32094
|
+
const collAmount = big12(data[base + 2]);
|
|
31171
32095
|
const defaulted = !!data[base + 3];
|
|
31172
32096
|
if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
|
|
31173
32097
|
const pool = b.pool;
|
|
@@ -31188,17 +32112,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
31188
32112
|
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
31189
32113
|
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
31190
32114
|
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
31191
|
-
const owedPrincipal =
|
|
31192
|
-
const owedInterest =
|
|
32115
|
+
const owedPrincipal = big12(field10(owed, "principal", 0));
|
|
32116
|
+
const owedInterest = big12(field10(owed, "interest", 1));
|
|
31193
32117
|
const owedTotal = owedPrincipal + owedInterest;
|
|
31194
32118
|
if (owedTotal === 0n && collAmount === 0n) return;
|
|
31195
32119
|
const loanDetails = field10(bidRes, "loanDetails", 5);
|
|
31196
32120
|
const terms = field10(bidRes, "terms", 6);
|
|
31197
32121
|
const acceptedTs = Number(
|
|
31198
|
-
|
|
32122
|
+
big12(field10(loanDetails, "acceptedTimestamp", 4))
|
|
31199
32123
|
);
|
|
31200
|
-
const loanDuration = Number(
|
|
31201
|
-
const aprBps = Number(
|
|
32124
|
+
const loanDuration = Number(big12(field10(loanDetails, "loanDuration", 6)));
|
|
32125
|
+
const aprBps = Number(big12(field10(terms, "APR", 2)));
|
|
31202
32126
|
const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
|
|
31203
32127
|
const isMatured = defaulted || maturity !== void 0 && maturity < now;
|
|
31204
32128
|
const collStr = parseRawAmount(collAmount.toString(), collDecimals);
|
|
@@ -31579,6 +32503,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
31579
32503
|
return getLlamaLendUserDataConverter(lender, chainId, account, meta);
|
|
31580
32504
|
if (isResupply(lender))
|
|
31581
32505
|
return getResupplyUserDataConverter(lender, chainId, account, meta);
|
|
32506
|
+
if (isCurvance(lender))
|
|
32507
|
+
return getCurvanceUserDataConverter(lender, chainId, account, meta);
|
|
31582
32508
|
if (isUsdd(lender))
|
|
31583
32509
|
return getUsddUserDataConverter(lender, chainId, account, meta);
|
|
31584
32510
|
if (isFrankencoin(lender))
|
|
@@ -31687,12 +32613,12 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
|
|
|
31687
32613
|
}
|
|
31688
32614
|
if (!convertedData) continue;
|
|
31689
32615
|
const incomplete = retryableFailedCalls > 0;
|
|
31690
|
-
const publish = (
|
|
32616
|
+
const publish = (key2, entry) => {
|
|
31691
32617
|
if (!entry) return;
|
|
31692
32618
|
const { kept, violations, dropped } = validateUserData(entry, incomplete);
|
|
31693
32619
|
if (dropped.length > 0) {
|
|
31694
32620
|
options?.onIncomplete?.({
|
|
31695
|
-
lender:
|
|
32621
|
+
lender: key2,
|
|
31696
32622
|
failedCalls,
|
|
31697
32623
|
retryableFailedCalls,
|
|
31698
32624
|
totalCalls: data.length,
|
|
@@ -31703,9 +32629,9 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
|
|
|
31703
32629
|
}
|
|
31704
32630
|
if (kept.length === 0) return;
|
|
31705
32631
|
entry.data = kept;
|
|
31706
|
-
entry.lender =
|
|
32632
|
+
entry.lender = key2;
|
|
31707
32633
|
if (incomplete) entry.incomplete = true;
|
|
31708
|
-
lenderData[
|
|
32634
|
+
lenderData[key2] = entry;
|
|
31709
32635
|
};
|
|
31710
32636
|
try {
|
|
31711
32637
|
if (isMultiMarket(query3.lender)) {
|
|
@@ -36243,6 +37169,8 @@ var getAbi2 = (lender) => {
|
|
|
36243
37169
|
return [...FrankencoinPositionAbi, ...erc20Abi];
|
|
36244
37170
|
if (isResupply(lender))
|
|
36245
37171
|
return [...ResupplyPairAbi, ...VAULT_CONVERT_ABI];
|
|
37172
|
+
if (isCurvance(lender))
|
|
37173
|
+
return [...CurvanceMarketManagerAbi, ...CurvanceCTokenAbi];
|
|
36246
37174
|
if (isInit(lender)) return InitLensAbi;
|
|
36247
37175
|
if (isEulerType(lender)) return accountLensAbi;
|
|
36248
37176
|
if (isCompoundV2Type(lender))
|
|
@@ -36257,9 +37185,9 @@ var getAbi2 = (lender) => {
|
|
|
36257
37185
|
};
|
|
36258
37186
|
|
|
36259
37187
|
// src/lending-pools/computeLendingPools.ts
|
|
36260
|
-
function resolvePrice(map,
|
|
37188
|
+
function resolvePrice(map, key2, fallbackKey) {
|
|
36261
37189
|
if (!map) return void 0;
|
|
36262
|
-
if (
|
|
37190
|
+
if (key2 != null && map[key2] != null) return map[key2];
|
|
36263
37191
|
if (fallbackKey != null && map[fallbackKey] != null) return map[fallbackKey];
|
|
36264
37192
|
return void 0;
|
|
36265
37193
|
}
|
|
@@ -36281,9 +37209,9 @@ var generateLendingPools = (lenderData, prices, histPrices) => {
|
|
|
36281
37209
|
}
|
|
36282
37210
|
const byMarket = /* @__PURE__ */ new Map();
|
|
36283
37211
|
for (const pool of flat) {
|
|
36284
|
-
const
|
|
36285
|
-
if (!byMarket.has(
|
|
36286
|
-
byMarket.get(
|
|
37212
|
+
const key2 = `${pool.chainId}:${pool.lender}`;
|
|
37213
|
+
if (!byMarket.has(key2)) byMarket.set(key2, []);
|
|
37214
|
+
byMarket.get(key2).push({
|
|
36287
37215
|
...pool,
|
|
36288
37216
|
apr: pool.depositRate + (pool.intrinsicYield ?? 0),
|
|
36289
37217
|
utilitzation: (Number(pool.totalDebt) + Number(pool.totalDebtStable ?? 0)) / Number(pool.totalDeposits),
|
|
@@ -36318,12 +37246,12 @@ var generateLendingPools = (lenderData, prices, histPrices) => {
|
|
|
36318
37246
|
}
|
|
36319
37247
|
for (const group of byMarket.values()) {
|
|
36320
37248
|
for (const pool of group) {
|
|
36321
|
-
const [assetGroup,
|
|
37249
|
+
const [assetGroup, key2] = getPriceKey(pool.asset) ?? [
|
|
36322
37250
|
void 0,
|
|
36323
37251
|
void 0
|
|
36324
37252
|
];
|
|
36325
|
-
pool.price = resolvePrice(prices,
|
|
36326
|
-
pool.histPrice = resolvePrice(histPrices,
|
|
37253
|
+
pool.price = resolvePrice(prices, key2, assetGroup);
|
|
37254
|
+
pool.histPrice = resolvePrice(histPrices, key2, assetGroup);
|
|
36327
37255
|
}
|
|
36328
37256
|
}
|
|
36329
37257
|
return Array.from(byMarket.values()).flat();
|
|
@@ -36736,8 +37664,8 @@ function needsLenderApproval(params) {
|
|
|
36736
37664
|
const { lender, lenderDebitData, tokenAddress, amount, chainId, cToken, isProtected } = params;
|
|
36737
37665
|
if (!lenderDebitData) return true;
|
|
36738
37666
|
if (isAaveV4Type(lender)) {
|
|
36739
|
-
const
|
|
36740
|
-
const entry2 = lenderDebitData[
|
|
37667
|
+
const key3 = (params.aaveV4Spoke ?? tokenAddress).toLowerCase();
|
|
37668
|
+
const entry2 = lenderDebitData[key3];
|
|
36741
37669
|
if (!entry2 || entry2.amount === void 0) return true;
|
|
36742
37670
|
return entry2.amount === 0n;
|
|
36743
37671
|
}
|
|
@@ -36746,8 +37674,8 @@ function needsLenderApproval(params) {
|
|
|
36746
37674
|
if (!entry2 || entry2.amount === void 0) return true;
|
|
36747
37675
|
return entry2.amount === 0n;
|
|
36748
37676
|
}
|
|
36749
|
-
const
|
|
36750
|
-
const entry = lenderDebitData[
|
|
37677
|
+
const key2 = resolveDebitDataKey(chainId, lender, tokenAddress, cToken, isProtected);
|
|
37678
|
+
const entry = lenderDebitData[key2];
|
|
36751
37679
|
if (!entry || entry.amount === void 0) return true;
|
|
36752
37680
|
if (isCompoundV2Type(lender) || isVenusType(lender)) {
|
|
36753
37681
|
const requiredShares = toCompoundV2Shares(entry, amount);
|
|
@@ -36867,21 +37795,21 @@ function cacheKey6(chainId, account) {
|
|
|
36867
37795
|
return `${chainId}:${account.toLowerCase()}`;
|
|
36868
37796
|
}
|
|
36869
37797
|
async function dedupedFetch(chainId, account, loader) {
|
|
36870
|
-
const
|
|
37798
|
+
const key2 = cacheKey6(chainId, account);
|
|
36871
37799
|
const now = Date.now();
|
|
36872
|
-
const cached = resolved.get(
|
|
37800
|
+
const cached = resolved.get(key2);
|
|
36873
37801
|
if (cached && cached.expiresAt > now) {
|
|
36874
37802
|
return cached.value;
|
|
36875
37803
|
}
|
|
36876
|
-
const existing = inflight.get(
|
|
37804
|
+
const existing = inflight.get(key2);
|
|
36877
37805
|
if (existing) return existing;
|
|
36878
37806
|
const promise = loader().then((value) => {
|
|
36879
|
-
resolved.set(
|
|
37807
|
+
resolved.set(key2, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
|
|
36880
37808
|
return value;
|
|
36881
37809
|
}).finally(() => {
|
|
36882
|
-
inflight.delete(
|
|
37810
|
+
inflight.delete(key2);
|
|
36883
37811
|
});
|
|
36884
|
-
inflight.set(
|
|
37812
|
+
inflight.set(key2, promise);
|
|
36885
37813
|
return promise;
|
|
36886
37814
|
}
|
|
36887
37815
|
function hasMorphoUserSubgraph(chainId) {
|
|
@@ -37710,14 +38638,14 @@ function getRewardYieldOpen(amountInUSD, amountOutUSD, irModeIn, cashFlowDeposit
|
|
|
37710
38638
|
const mapOut = rewardsToMap(yieldOut?.rewards);
|
|
37711
38639
|
if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
|
|
37712
38640
|
const data = {};
|
|
37713
|
-
for (const
|
|
37714
|
-
const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[
|
|
37715
|
-
const _flowOut = amountOutUSD * (mapOut[
|
|
38641
|
+
for (const key2 of keysFromMaps(mapIn, mapOut)) {
|
|
38642
|
+
const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key2]?.stableBorrowRate : mapIn[key2]?.variableBorrowRate) ?? 0);
|
|
38643
|
+
const _flowOut = amountOutUSD * (mapOut[key2]?.depositRate ?? 0);
|
|
37716
38644
|
const totalCashFlowDebt = cashFlowDebt + _flowIn;
|
|
37717
38645
|
const totalCashFlowDeposits = cashFlowDeposits + _flowOut;
|
|
37718
38646
|
const newCollat = deposits + amountOutUSD;
|
|
37719
38647
|
const newDebt = debt + amountInUSD;
|
|
37720
|
-
data[
|
|
38648
|
+
data[key2] = {
|
|
37721
38649
|
borrowApr: totalCashFlowDebt / newDebt,
|
|
37722
38650
|
depositApr: totalCashFlowDeposits / newCollat,
|
|
37723
38651
|
apr: (cashFlowDeposits + cashFlowDebt + _flowIn + _flowOut) / (newCollat - newDebt)
|
|
@@ -37730,14 +38658,14 @@ function getRewardYieldClose(amountInUSD, amountOutUSD, irModeOut, cashFlowDepos
|
|
|
37730
38658
|
const mapOut = rewardsToMap(yieldOut?.rewards);
|
|
37731
38659
|
if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
|
|
37732
38660
|
const data = {};
|
|
37733
|
-
for (const
|
|
37734
|
-
const _flowIn = amountInUSD * (mapIn[
|
|
37735
|
-
const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[
|
|
38661
|
+
for (const key2 of keysFromMaps(mapIn, mapOut)) {
|
|
38662
|
+
const _flowIn = amountInUSD * (mapIn[key2]?.depositRate ?? 0);
|
|
38663
|
+
const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key2]?.stableBorrowRate : mapOut[key2]?.variableBorrowRate) ?? 0);
|
|
37736
38664
|
const totalCashFlowDebt = cashFlowDebt - _flowOut;
|
|
37737
38665
|
const totalCashFlowDeposits = cashFlowDeposits - _flowIn;
|
|
37738
38666
|
const newCollat = deposits - amountInUSD;
|
|
37739
38667
|
const newDebt = debt - amountOutUSD;
|
|
37740
|
-
data[
|
|
38668
|
+
data[key2] = {
|
|
37741
38669
|
borrowApr: Math.abs(newDebt) < 0.01 ? 0 : totalCashFlowDebt / newDebt,
|
|
37742
38670
|
depositApr: totalCashFlowDeposits / newCollat,
|
|
37743
38671
|
apr: (cashFlowDeposits + cashFlowDebt - _flowIn - _flowOut) / (newCollat - newDebt)
|
|
@@ -37750,12 +38678,12 @@ function getRewardYieldDebtSwap(amountInUSD, amountOutUSD, irModeIn, irModeOut,
|
|
|
37750
38678
|
const mapOut = rewardsToMap(yieldOut?.rewards);
|
|
37751
38679
|
if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
|
|
37752
38680
|
const data = {};
|
|
37753
|
-
for (const
|
|
37754
|
-
const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[
|
|
37755
|
-
const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[
|
|
38681
|
+
for (const key2 of keysFromMaps(mapIn, mapOut)) {
|
|
38682
|
+
const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key2]?.stableBorrowRate : mapIn[key2]?.variableBorrowRate) ?? 0);
|
|
38683
|
+
const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key2]?.stableBorrowRate : mapOut[key2]?.variableBorrowRate) ?? 0);
|
|
37756
38684
|
const totalCashFlowDebt = cashFlowDebt + _flowIn - _flowOut;
|
|
37757
38685
|
const newDebt = debt - amountOutUSD + amountInUSD;
|
|
37758
|
-
data[
|
|
38686
|
+
data[key2] = {
|
|
37759
38687
|
borrowApr: Math.abs(newDebt) < 0.01 ? 0 : totalCashFlowDebt / newDebt,
|
|
37760
38688
|
depositApr: cashFlowDeposits / deposits,
|
|
37761
38689
|
apr: (cashFlowDeposits + totalCashFlowDebt) / (deposits - newDebt)
|
|
@@ -37768,12 +38696,12 @@ function getRewardYieldCollateralSwap(amountInUSD, amountOutUSD, cashFlowDeposit
|
|
|
37768
38696
|
const mapOut = rewardsToMap(yieldOut?.rewards);
|
|
37769
38697
|
if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
|
|
37770
38698
|
const data = {};
|
|
37771
|
-
for (const
|
|
37772
|
-
const _flowIn = amountInUSD * (mapIn[
|
|
37773
|
-
const _flowOut = amountOutUSD * (mapOut[
|
|
38699
|
+
for (const key2 of keysFromMaps(mapIn, mapOut)) {
|
|
38700
|
+
const _flowIn = amountInUSD * (mapIn[key2]?.depositRate ?? 0);
|
|
38701
|
+
const _flowOut = amountOutUSD * (mapOut[key2]?.depositRate ?? 0);
|
|
37774
38702
|
const totalCashFlowDeposits = cashFlowDeposits + _flowOut - _flowIn;
|
|
37775
38703
|
const newCollat = deposits + amountOutUSD - amountInUSD;
|
|
37776
|
-
data[
|
|
38704
|
+
data[key2] = {
|
|
37777
38705
|
borrowApr: Math.abs(debt) < 0.01 ? 0 : cashFlowDebt / debt,
|
|
37778
38706
|
depositApr: totalCashFlowDeposits / newCollat,
|
|
37779
38707
|
apr: (totalCashFlowDeposits + cashFlowDebt) / (newCollat - debt)
|
|
@@ -38570,9 +39498,9 @@ var yieldNestFetcher = {
|
|
|
38570
39498
|
}).then((r) => r.json());
|
|
38571
39499
|
const tokens = res?.data?.getLRTsData?.tokens ?? [];
|
|
38572
39500
|
const result = {};
|
|
38573
|
-
for (const { symbol, chainId, key } of YN_TOKENS) {
|
|
39501
|
+
for (const { symbol, chainId, key: key2 } of YN_TOKENS) {
|
|
38574
39502
|
const apr = findApr(tokens, symbol, chainId);
|
|
38575
|
-
if (apr > 0) result[
|
|
39503
|
+
if (apr > 0) result[key2] = apr;
|
|
38576
39504
|
}
|
|
38577
39505
|
return result;
|
|
38578
39506
|
}
|
|
@@ -38992,10 +39920,10 @@ var ankrFetcher = {
|
|
|
38992
39920
|
const services = res?.services ?? [];
|
|
38993
39921
|
const result = {};
|
|
38994
39922
|
for (const service of services) {
|
|
38995
|
-
const
|
|
38996
|
-
if (!
|
|
39923
|
+
const key2 = ANKR_SERVICE_KEYS[service?.serviceName];
|
|
39924
|
+
if (!key2) continue;
|
|
38997
39925
|
const apr = Number(service?.apy);
|
|
38998
|
-
if (apr > 0) result[
|
|
39926
|
+
if (apr > 0) result[key2] = apr;
|
|
38999
39927
|
}
|
|
39000
39928
|
return result;
|
|
39001
39929
|
}
|
|
@@ -39089,7 +40017,7 @@ var lombardLbtcFetcher = {
|
|
|
39089
40017
|
}
|
|
39090
40018
|
};
|
|
39091
40019
|
var LOMBARD_VAULT_APY_URL = "https://mainnet.prod.lombard.finance/api/v1/analytics/vault/apy/history";
|
|
39092
|
-
var createLombardVaultFetcher = (wrapper,
|
|
40020
|
+
var createLombardVaultFetcher = (wrapper, key2) => ({
|
|
39093
40021
|
label: `LOMBARD_VAULT:${wrapper}`,
|
|
39094
40022
|
fetch: async () => {
|
|
39095
40023
|
const url = `${LOMBARD_VAULT_APY_URL}?vault_wrapper=${wrapper}&interval=APY_INTERVAL_1M`;
|
|
@@ -39098,7 +40026,7 @@ var createLombardVaultFetcher = (wrapper, key) => ({
|
|
|
39098
40026
|
}).then((r) => r.json());
|
|
39099
40027
|
const latest = Array.isArray(res?.snapshots) ? res.snapshots[0] : void 0;
|
|
39100
40028
|
const frac = Number(latest?.total_apy);
|
|
39101
|
-
return { [
|
|
40029
|
+
return { [key2]: Number.isFinite(frac) ? frac * 100 : 0 };
|
|
39102
40030
|
}
|
|
39103
40031
|
});
|
|
39104
40032
|
var lombardLbtcvFetcher = createLombardVaultFetcher(
|
|
@@ -41002,7 +41930,7 @@ var hastraPrimeFetcher = {
|
|
|
41002
41930
|
return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
|
|
41003
41931
|
}
|
|
41004
41932
|
};
|
|
41005
|
-
var
|
|
41933
|
+
var RAY6 = 10n ** 27n;
|
|
41006
41934
|
var YEAR_SECONDS6 = 31536e3;
|
|
41007
41935
|
var SPARK_VAULTS_V2 = [
|
|
41008
41936
|
{
|
|
@@ -41079,8 +42007,8 @@ var SSR_ABI = [
|
|
|
41079
42007
|
}
|
|
41080
42008
|
];
|
|
41081
42009
|
var aprFromVsr = (vsr) => {
|
|
41082
|
-
if (vsr <=
|
|
41083
|
-
const perSecond = Number(vsr -
|
|
42010
|
+
if (vsr <= RAY6) return 0;
|
|
42011
|
+
const perSecond = Number(vsr - RAY6) / 1e27;
|
|
41084
42012
|
return perSecond * YEAR_SECONDS6 * 100;
|
|
41085
42013
|
};
|
|
41086
42014
|
var chainsOf = (vaults) => [
|
|
@@ -41100,7 +42028,7 @@ var fetchChain = async (chainId, vaults) => {
|
|
|
41100
42028
|
const out = {};
|
|
41101
42029
|
vaults.forEach((v, i) => {
|
|
41102
42030
|
const vsr = results[i];
|
|
41103
|
-
if (typeof vsr !== "bigint" || vsr <
|
|
42031
|
+
if (typeof vsr !== "bigint" || vsr < RAY6) return;
|
|
41104
42032
|
const apr = aprFromVsr(vsr);
|
|
41105
42033
|
out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
|
|
41106
42034
|
if (v.assetGroup) out[v.assetGroup] = apr;
|
|
@@ -41114,7 +42042,7 @@ var fetchSusdcApr = async () => {
|
|
|
41114
42042
|
calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
|
|
41115
42043
|
allowFailure: false
|
|
41116
42044
|
});
|
|
41117
|
-
if (typeof ssr !== "bigint" || ssr <
|
|
42045
|
+
if (typeof ssr !== "bigint" || ssr < RAY6) {
|
|
41118
42046
|
throw new Error("Spark sUSDC: unreadable ssr()");
|
|
41119
42047
|
}
|
|
41120
42048
|
const apr = aprFromVsr(ssr);
|
|
@@ -41276,7 +42204,7 @@ var rwaFundsFetcher = {
|
|
|
41276
42204
|
Object.entries(RWA_FUNDS).map(async ([label, fund]) => {
|
|
41277
42205
|
try {
|
|
41278
42206
|
const apr = apyToAprPercent(await fetchDefiLlamaApy(fund.pool));
|
|
41279
|
-
for (const
|
|
42207
|
+
for (const key2 of fund.keys) out[key2] = apr;
|
|
41280
42208
|
} catch {
|
|
41281
42209
|
}
|
|
41282
42210
|
})
|
|
@@ -41650,7 +42578,7 @@ var strataFetcher = {
|
|
|
41650
42578
|
return out;
|
|
41651
42579
|
}
|
|
41652
42580
|
};
|
|
41653
|
-
var
|
|
42581
|
+
var RAY7 = 10n ** 27n;
|
|
41654
42582
|
var YEAR_SECONDS10 = 31536e3;
|
|
41655
42583
|
var DSR_ABI = [
|
|
41656
42584
|
{
|
|
@@ -41677,8 +42605,8 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
|
|
|
41677
42605
|
var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
|
|
41678
42606
|
var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
|
|
41679
42607
|
var aprFromDsr = (dsr) => {
|
|
41680
|
-
if (dsr <=
|
|
41681
|
-
const perSecond = Number(dsr -
|
|
42608
|
+
if (dsr <= RAY7) return 0;
|
|
42609
|
+
const perSecond = Number(dsr - RAY7) / 1e27;
|
|
41682
42610
|
return perSecond * YEAR_SECONDS10 * 100;
|
|
41683
42611
|
};
|
|
41684
42612
|
var fetchChainDsr = async (chainId, pot) => {
|
|
@@ -41688,7 +42616,7 @@ var fetchChainDsr = async (chainId, pot) => {
|
|
|
41688
42616
|
calls: [{ address: pot, name: "dsr", params: [] }],
|
|
41689
42617
|
allowFailure: false
|
|
41690
42618
|
});
|
|
41691
|
-
if (typeof dsr !== "bigint" || dsr <
|
|
42619
|
+
if (typeof dsr !== "bigint" || dsr < RAY7) {
|
|
41692
42620
|
throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
|
|
41693
42621
|
}
|
|
41694
42622
|
return aprFromDsr(dsr);
|
|
@@ -41700,9 +42628,9 @@ var fetchApiAprs = async () => {
|
|
|
41700
42628
|
}).then((r) => r.json());
|
|
41701
42629
|
if (res?.code !== 0 || !res?.data) return {};
|
|
41702
42630
|
const out = {};
|
|
41703
|
-
for (const
|
|
41704
|
-
const apy = Number(res.data[
|
|
41705
|
-
if (Number.isFinite(apy) && apy > 0) out[
|
|
42631
|
+
for (const key2 of ["ethApy", "bscApy"]) {
|
|
42632
|
+
const apy = Number(res.data[key2]);
|
|
42633
|
+
if (Number.isFinite(apy) && apy > 0) out[key2] = apyToApr(apy) * 100;
|
|
41706
42634
|
}
|
|
41707
42635
|
return out;
|
|
41708
42636
|
};
|
|
@@ -44375,9 +45303,9 @@ async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]
|
|
|
44375
45303
|
try {
|
|
44376
45304
|
const data = await fetchPendlePricesRaw(assetType);
|
|
44377
45305
|
let prices = {};
|
|
44378
|
-
Object.entries(data).forEach(([
|
|
44379
|
-
const [chainId, address] =
|
|
44380
|
-
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ??
|
|
45306
|
+
Object.entries(data).forEach(([key2, val]) => {
|
|
45307
|
+
const [chainId, address] = key2.split("-");
|
|
45308
|
+
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key2;
|
|
44381
45309
|
prices[assetKey] = val;
|
|
44382
45310
|
});
|
|
44383
45311
|
return prices;
|
|
@@ -44597,7 +45525,7 @@ var midasFetcher = {
|
|
|
44597
45525
|
const apy = apys[apyKey];
|
|
44598
45526
|
if (typeof apy === "number" && apy > 0 && apy <= MAX_DECIMAL_APY) {
|
|
44599
45527
|
const apr = apyToAprPercent(apy * 100);
|
|
44600
|
-
for (const
|
|
45528
|
+
for (const key2 of keys) result[key2] = apr;
|
|
44601
45529
|
}
|
|
44602
45530
|
}
|
|
44603
45531
|
return result;
|
|
@@ -44819,10 +45747,10 @@ var yearnKatanaFetcher = {
|
|
|
44819
45747
|
).then((r) => r.json());
|
|
44820
45748
|
let map = {};
|
|
44821
45749
|
Object.entries(res).forEach(([addr2, data]) => {
|
|
44822
|
-
const
|
|
44823
|
-
if (
|
|
45750
|
+
const key2 = addressToAssetYearn[addr2.toLowerCase()];
|
|
45751
|
+
if (key2) {
|
|
44824
45752
|
const apr = ((data.apr.netAPR ?? 0) + (data.apr.extra?.extrinsicYield ?? 0) + (data.apr.extra?.katanaNativeYield ?? 0)) * 100;
|
|
44825
|
-
map[
|
|
45753
|
+
map[key2] = apr;
|
|
44826
45754
|
}
|
|
44827
45755
|
});
|
|
44828
45756
|
return map;
|
|
@@ -45106,6 +46034,297 @@ var morphoCollateralMerklRewardFetcher = createMerklRewardFetcher({
|
|
|
45106
46034
|
};
|
|
45107
46035
|
}
|
|
45108
46036
|
});
|
|
46037
|
+
var DLEND_POOLS = [
|
|
46038
|
+
{
|
|
46039
|
+
chainId: Chain.ETHEREUM_MAINNET,
|
|
46040
|
+
lender: Lender.DTRINITY,
|
|
46041
|
+
pool: "0x6598DaD18Bda89A0E58A1F427c8CeBc0dE90F153"
|
|
46042
|
+
}
|
|
46043
|
+
];
|
|
46044
|
+
var ZERO_ADDRESS5 = "0x0000000000000000000000000000000000000000";
|
|
46045
|
+
var SECONDS_PER_YEAR11 = 31536e3;
|
|
46046
|
+
var ABI = [
|
|
46047
|
+
{
|
|
46048
|
+
name: "getReservesList",
|
|
46049
|
+
type: "function",
|
|
46050
|
+
stateMutability: "view",
|
|
46051
|
+
inputs: [],
|
|
46052
|
+
outputs: [{ type: "address[]" }]
|
|
46053
|
+
},
|
|
46054
|
+
{
|
|
46055
|
+
name: "ADDRESSES_PROVIDER",
|
|
46056
|
+
type: "function",
|
|
46057
|
+
stateMutability: "view",
|
|
46058
|
+
inputs: [],
|
|
46059
|
+
outputs: [{ type: "address" }]
|
|
46060
|
+
},
|
|
46061
|
+
{
|
|
46062
|
+
name: "getPriceOracle",
|
|
46063
|
+
type: "function",
|
|
46064
|
+
stateMutability: "view",
|
|
46065
|
+
inputs: [],
|
|
46066
|
+
outputs: [{ type: "address" }]
|
|
46067
|
+
},
|
|
46068
|
+
{
|
|
46069
|
+
name: "getAssetPrice",
|
|
46070
|
+
type: "function",
|
|
46071
|
+
stateMutability: "view",
|
|
46072
|
+
inputs: [{ type: "address" }],
|
|
46073
|
+
outputs: [{ type: "uint256" }]
|
|
46074
|
+
},
|
|
46075
|
+
{
|
|
46076
|
+
name: "getReserveData",
|
|
46077
|
+
type: "function",
|
|
46078
|
+
stateMutability: "view",
|
|
46079
|
+
inputs: [{ type: "address" }],
|
|
46080
|
+
outputs: [
|
|
46081
|
+
{
|
|
46082
|
+
type: "tuple",
|
|
46083
|
+
components: [
|
|
46084
|
+
{
|
|
46085
|
+
name: "configuration",
|
|
46086
|
+
type: "tuple",
|
|
46087
|
+
components: [{ name: "data", type: "uint256" }]
|
|
46088
|
+
},
|
|
46089
|
+
{ name: "liquidityIndex", type: "uint128" },
|
|
46090
|
+
{ name: "currentLiquidityRate", type: "uint128" },
|
|
46091
|
+
{ name: "variableBorrowIndex", type: "uint128" },
|
|
46092
|
+
{ name: "currentVariableBorrowRate", type: "uint128" },
|
|
46093
|
+
{ name: "currentStableBorrowRate", type: "uint128" },
|
|
46094
|
+
{ name: "lastUpdateTimestamp", type: "uint40" },
|
|
46095
|
+
{ name: "id", type: "uint16" },
|
|
46096
|
+
{ name: "aTokenAddress", type: "address" },
|
|
46097
|
+
{ name: "stableDebtTokenAddress", type: "address" },
|
|
46098
|
+
{ name: "variableDebtTokenAddress", type: "address" },
|
|
46099
|
+
{ name: "interestRateStrategyAddress", type: "address" },
|
|
46100
|
+
{ name: "accruedToTreasury", type: "uint128" },
|
|
46101
|
+
{ name: "unbacked", type: "uint128" },
|
|
46102
|
+
{ name: "isolationModeTotalDebt", type: "uint128" }
|
|
46103
|
+
]
|
|
46104
|
+
}
|
|
46105
|
+
]
|
|
46106
|
+
},
|
|
46107
|
+
{
|
|
46108
|
+
name: "getIncentivesController",
|
|
46109
|
+
type: "function",
|
|
46110
|
+
stateMutability: "view",
|
|
46111
|
+
inputs: [],
|
|
46112
|
+
outputs: [{ type: "address" }]
|
|
46113
|
+
},
|
|
46114
|
+
{
|
|
46115
|
+
name: "getRewardsByAsset",
|
|
46116
|
+
type: "function",
|
|
46117
|
+
stateMutability: "view",
|
|
46118
|
+
inputs: [{ type: "address" }],
|
|
46119
|
+
outputs: [{ type: "address[]" }]
|
|
46120
|
+
},
|
|
46121
|
+
{
|
|
46122
|
+
name: "getRewardsData",
|
|
46123
|
+
type: "function",
|
|
46124
|
+
stateMutability: "view",
|
|
46125
|
+
inputs: [{ type: "address" }, { type: "address" }],
|
|
46126
|
+
outputs: [
|
|
46127
|
+
{ name: "index", type: "uint256" },
|
|
46128
|
+
{ name: "emissionPerSecond", type: "uint256" },
|
|
46129
|
+
{ name: "lastUpdateTimestamp", type: "uint256" },
|
|
46130
|
+
{ name: "distributionEnd", type: "uint256" }
|
|
46131
|
+
]
|
|
46132
|
+
},
|
|
46133
|
+
{
|
|
46134
|
+
name: "totalSupply",
|
|
46135
|
+
type: "function",
|
|
46136
|
+
stateMutability: "view",
|
|
46137
|
+
inputs: [],
|
|
46138
|
+
outputs: [{ type: "uint256" }]
|
|
46139
|
+
},
|
|
46140
|
+
{
|
|
46141
|
+
name: "decimals",
|
|
46142
|
+
type: "function",
|
|
46143
|
+
stateMutability: "view",
|
|
46144
|
+
inputs: [],
|
|
46145
|
+
outputs: [{ type: "uint8" }]
|
|
46146
|
+
}
|
|
46147
|
+
];
|
|
46148
|
+
var isZero = (a) => !a || a.toLowerCase() === ZERO_ADDRESS5;
|
|
46149
|
+
var scale = (raw, decimals) => Number(raw) / 10 ** decimals;
|
|
46150
|
+
function emptyReward2() {
|
|
46151
|
+
return {
|
|
46152
|
+
distribution: "onchain-incentives",
|
|
46153
|
+
deposit: 0,
|
|
46154
|
+
borrow: 0,
|
|
46155
|
+
additionalDepositData: [],
|
|
46156
|
+
additionalBorrowData: []
|
|
46157
|
+
};
|
|
46158
|
+
}
|
|
46159
|
+
function rebateApr(params) {
|
|
46160
|
+
const {
|
|
46161
|
+
emissionPerSecond,
|
|
46162
|
+
distributionEnd,
|
|
46163
|
+
rewardDecimals,
|
|
46164
|
+
rewardPrice,
|
|
46165
|
+
balanceTotalSupply,
|
|
46166
|
+
balanceDecimals,
|
|
46167
|
+
assetPrice,
|
|
46168
|
+
nowSeconds
|
|
46169
|
+
} = params;
|
|
46170
|
+
if (nowSeconds >= Number(distributionEnd)) return 0;
|
|
46171
|
+
if (emissionPerSecond <= 0n || balanceTotalSupply <= 0n) return 0;
|
|
46172
|
+
if (!(rewardPrice > 0) || !(assetPrice > 0)) return 0;
|
|
46173
|
+
const rewardsPerYearUsd = scale(emissionPerSecond, rewardDecimals) * SECONDS_PER_YEAR11 * rewardPrice;
|
|
46174
|
+
const baseUsd = scale(balanceTotalSupply, balanceDecimals) * assetPrice;
|
|
46175
|
+
if (!(baseUsd > 0)) return 0;
|
|
46176
|
+
return rewardsPerYearUsd / baseUsd * 100;
|
|
46177
|
+
}
|
|
46178
|
+
async function fetchForPool(chainId, lender, pool, nowSeconds) {
|
|
46179
|
+
const call = (address, name, params = []) => ({
|
|
46180
|
+
address,
|
|
46181
|
+
name,
|
|
46182
|
+
params
|
|
46183
|
+
});
|
|
46184
|
+
const [reservesList, addressesProvider] = await multicallRetryUniversal({
|
|
46185
|
+
chain: chainId,
|
|
46186
|
+
abi: ABI,
|
|
46187
|
+
calls: [call(pool, "getReservesList"), call(pool, "ADDRESSES_PROVIDER")],
|
|
46188
|
+
allowFailure: false
|
|
46189
|
+
});
|
|
46190
|
+
if (!reservesList?.length) return {};
|
|
46191
|
+
const round2 = await multicallRetryUniversal({
|
|
46192
|
+
chain: chainId,
|
|
46193
|
+
abi: ABI,
|
|
46194
|
+
calls: [
|
|
46195
|
+
call(addressesProvider, "getPriceOracle"),
|
|
46196
|
+
...reservesList.map((a) => call(pool, "getReserveData", [a]))
|
|
46197
|
+
],
|
|
46198
|
+
allowFailure: false
|
|
46199
|
+
});
|
|
46200
|
+
const oracle = round2[0];
|
|
46201
|
+
const reserveData = round2.slice(1);
|
|
46202
|
+
const legs = [];
|
|
46203
|
+
reservesList.forEach((asset, i) => {
|
|
46204
|
+
const rd = reserveData[i];
|
|
46205
|
+
if (!rd) return;
|
|
46206
|
+
const a = asset.toLowerCase();
|
|
46207
|
+
if (!isZero(rd.aTokenAddress))
|
|
46208
|
+
legs.push({ asset: a, balanceToken: rd.aTokenAddress, bucket: "deposit" });
|
|
46209
|
+
if (!isZero(rd.variableDebtTokenAddress))
|
|
46210
|
+
legs.push({
|
|
46211
|
+
asset: a,
|
|
46212
|
+
balanceToken: rd.variableDebtTokenAddress,
|
|
46213
|
+
bucket: "borrow"
|
|
46214
|
+
});
|
|
46215
|
+
});
|
|
46216
|
+
if (!legs.length) return {};
|
|
46217
|
+
const round3 = await multicallRetryUniversal({
|
|
46218
|
+
chain: chainId,
|
|
46219
|
+
abi: ABI,
|
|
46220
|
+
calls: [
|
|
46221
|
+
...legs.flatMap((l) => [
|
|
46222
|
+
call(l.balanceToken, "getIncentivesController"),
|
|
46223
|
+
call(l.balanceToken, "totalSupply"),
|
|
46224
|
+
call(l.balanceToken, "decimals")
|
|
46225
|
+
]),
|
|
46226
|
+
...reservesList.map((a) => call(oracle, "getAssetPrice", [a]))
|
|
46227
|
+
],
|
|
46228
|
+
allowFailure: false
|
|
46229
|
+
});
|
|
46230
|
+
const legState = legs.map((l, i) => ({
|
|
46231
|
+
...l,
|
|
46232
|
+
controller: round3[i * 3],
|
|
46233
|
+
totalSupply: round3[i * 3 + 1],
|
|
46234
|
+
decimals: Number(round3[i * 3 + 2])
|
|
46235
|
+
}));
|
|
46236
|
+
const priceOffset = legs.length * 3;
|
|
46237
|
+
const priceByAsset = {};
|
|
46238
|
+
reservesList.forEach((a, i) => {
|
|
46239
|
+
priceByAsset[a.toLowerCase()] = Number(round3[priceOffset + i] ?? 0n);
|
|
46240
|
+
});
|
|
46241
|
+
const incentivised = legState.filter((l) => !isZero(l.controller));
|
|
46242
|
+
if (!incentivised.length) return {};
|
|
46243
|
+
const rewardLists = await multicallRetryUniversal({
|
|
46244
|
+
chain: chainId,
|
|
46245
|
+
abi: ABI,
|
|
46246
|
+
calls: incentivised.map(
|
|
46247
|
+
(l) => call(l.controller, "getRewardsByAsset", [l.balanceToken])
|
|
46248
|
+
),
|
|
46249
|
+
allowFailure: false
|
|
46250
|
+
});
|
|
46251
|
+
const pairs = incentivised.flatMap(
|
|
46252
|
+
(l, i) => (rewardLists[i] ?? []).map((reward) => ({ leg: l, reward }))
|
|
46253
|
+
);
|
|
46254
|
+
if (!pairs.length) return {};
|
|
46255
|
+
const round5 = await multicallRetryUniversal({
|
|
46256
|
+
chain: chainId,
|
|
46257
|
+
abi: ABI,
|
|
46258
|
+
calls: pairs.flatMap((p) => [
|
|
46259
|
+
call(p.leg.controller, "getRewardsData", [p.leg.balanceToken, p.reward]),
|
|
46260
|
+
call(p.reward, "decimals"),
|
|
46261
|
+
call(oracle, "getAssetPrice", [p.reward])
|
|
46262
|
+
]),
|
|
46263
|
+
allowFailure: false
|
|
46264
|
+
});
|
|
46265
|
+
const result = {};
|
|
46266
|
+
pairs.forEach((p, i) => {
|
|
46267
|
+
const data = round5[i * 3];
|
|
46268
|
+
if (!data) return;
|
|
46269
|
+
const apr = rebateApr({
|
|
46270
|
+
emissionPerSecond: BigInt(data[1] ?? 0),
|
|
46271
|
+
distributionEnd: BigInt(data[3] ?? 0),
|
|
46272
|
+
rewardDecimals: Number(round5[i * 3 + 1] ?? 18),
|
|
46273
|
+
rewardPrice: Number(round5[i * 3 + 2] ?? 0n),
|
|
46274
|
+
balanceTotalSupply: BigInt(p.leg.totalSupply ?? 0),
|
|
46275
|
+
balanceDecimals: p.leg.decimals,
|
|
46276
|
+
assetPrice: priceByAsset[p.leg.asset] ?? 0,
|
|
46277
|
+
nowSeconds
|
|
46278
|
+
});
|
|
46279
|
+
if (!(apr > 0)) return;
|
|
46280
|
+
if (!result[chainId]) result[chainId] = {};
|
|
46281
|
+
if (!result[chainId][lender]) result[chainId][lender] = {};
|
|
46282
|
+
if (!result[chainId][lender][p.leg.asset])
|
|
46283
|
+
result[chainId][lender][p.leg.asset] = emptyReward2();
|
|
46284
|
+
const entry = result[chainId][lender][p.leg.asset];
|
|
46285
|
+
const breakdown = {
|
|
46286
|
+
tokenAddress: p.reward.toLowerCase(),
|
|
46287
|
+
emissionPerSecond: String(data[1]),
|
|
46288
|
+
distributionEnd: Number(data[3]),
|
|
46289
|
+
distributionType: "aave-incentives"
|
|
46290
|
+
};
|
|
46291
|
+
if (p.leg.bucket === "deposit") {
|
|
46292
|
+
entry.deposit += apr;
|
|
46293
|
+
entry.additionalDepositData.push(breakdown);
|
|
46294
|
+
} else {
|
|
46295
|
+
entry.borrow += apr;
|
|
46296
|
+
entry.additionalBorrowData.push(breakdown);
|
|
46297
|
+
}
|
|
46298
|
+
});
|
|
46299
|
+
return result;
|
|
46300
|
+
}
|
|
46301
|
+
var dtrinityRebateRewardFetcher = {
|
|
46302
|
+
label: "DTRINITY_REBATE",
|
|
46303
|
+
fetch: async () => {
|
|
46304
|
+
const nowSeconds = Math.floor(Date.now() / 1e3);
|
|
46305
|
+
const results = await Promise.all(
|
|
46306
|
+
DLEND_POOLS.map(async ({ chainId, lender, pool }) => {
|
|
46307
|
+
try {
|
|
46308
|
+
return await fetchForPool(chainId, lender, pool, nowSeconds);
|
|
46309
|
+
} catch (e) {
|
|
46310
|
+
console.error(`dTRINITY: rebate read failed on chain ${chainId}:`, e);
|
|
46311
|
+
return {};
|
|
46312
|
+
}
|
|
46313
|
+
})
|
|
46314
|
+
);
|
|
46315
|
+
const merged = {};
|
|
46316
|
+
for (const r of results) {
|
|
46317
|
+
for (const [chainId, lenders] of Object.entries(r)) {
|
|
46318
|
+
if (!merged[chainId]) merged[chainId] = {};
|
|
46319
|
+
for (const [lender, assets] of Object.entries(lenders)) {
|
|
46320
|
+
if (!merged[chainId][lender]) merged[chainId][lender] = {};
|
|
46321
|
+
Object.assign(merged[chainId][lender], assets);
|
|
46322
|
+
}
|
|
46323
|
+
}
|
|
46324
|
+
}
|
|
46325
|
+
return merged;
|
|
46326
|
+
}
|
|
46327
|
+
};
|
|
45109
46328
|
|
|
45110
46329
|
// src/yields/rewards/fetchLenderRewards.ts
|
|
45111
46330
|
function mergeRewardResults(target, source) {
|
|
@@ -45120,7 +46339,8 @@ function mergeRewardResults(target, source) {
|
|
|
45120
46339
|
var rewardFetchers = [
|
|
45121
46340
|
aaveMerklRewardFetcher,
|
|
45122
46341
|
eulerMerklRewardFetcher,
|
|
45123
|
-
morphoCollateralMerklRewardFetcher
|
|
46342
|
+
morphoCollateralMerklRewardFetcher,
|
|
46343
|
+
dtrinityRebateRewardFetcher
|
|
45124
46344
|
];
|
|
45125
46345
|
async function fetchLenderRewards() {
|
|
45126
46346
|
const results = await Promise.all(
|
|
@@ -45872,7 +47092,7 @@ function getLiquityCalls(chainId) {
|
|
|
45872
47092
|
}
|
|
45873
47093
|
function parseLiquityResults(data, meta, context) {
|
|
45874
47094
|
const { chainId } = context;
|
|
45875
|
-
const
|
|
47095
|
+
const key2 = liquityLenderKey(meta.lender, chainId, meta.collIndex);
|
|
45876
47096
|
const entries = [];
|
|
45877
47097
|
const raw = data?.[0];
|
|
45878
47098
|
const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
|
|
@@ -45886,8 +47106,8 @@ function parseLiquityResults(data, meta, context) {
|
|
|
45886
47106
|
asset: meta.collToken,
|
|
45887
47107
|
price: collUSD,
|
|
45888
47108
|
priceUSD: collUSD,
|
|
45889
|
-
marketUid: createMarketUid(chainId,
|
|
45890
|
-
targetLender:
|
|
47109
|
+
marketUid: createMarketUid(chainId, key2, meta.collToken),
|
|
47110
|
+
targetLender: key2,
|
|
45891
47111
|
description: "Liquity branch PriceFeed (USD)"
|
|
45892
47112
|
});
|
|
45893
47113
|
}
|
|
@@ -45896,8 +47116,8 @@ function parseLiquityResults(data, meta, context) {
|
|
|
45896
47116
|
asset: meta.debtToken,
|
|
45897
47117
|
price: 1,
|
|
45898
47118
|
priceUSD: 1,
|
|
45899
|
-
marketUid: createMarketUid(chainId,
|
|
45900
|
-
targetLender:
|
|
47119
|
+
marketUid: createMarketUid(chainId, key2, meta.debtToken),
|
|
47120
|
+
targetLender: key2,
|
|
45901
47121
|
description: "Liquity stablecoin (par)",
|
|
45902
47122
|
staticBase: true,
|
|
45903
47123
|
baseAsset: meta.debtToken
|
|
@@ -45941,7 +47161,7 @@ function getRiverCalls(chainId) {
|
|
|
45941
47161
|
}
|
|
45942
47162
|
function parseRiverResults(data, meta, context) {
|
|
45943
47163
|
const { chainId } = context;
|
|
45944
|
-
const
|
|
47164
|
+
const key2 = riverLenderKey(meta.lender, chainId, meta.index);
|
|
45945
47165
|
const entries = [];
|
|
45946
47166
|
const raw = data?.[0];
|
|
45947
47167
|
const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
|
|
@@ -45951,8 +47171,8 @@ function parseRiverResults(data, meta, context) {
|
|
|
45951
47171
|
asset: meta.collToken,
|
|
45952
47172
|
price: collUSD,
|
|
45953
47173
|
priceUSD: collUSD,
|
|
45954
|
-
marketUid: createMarketUid(chainId,
|
|
45955
|
-
targetLender:
|
|
47174
|
+
marketUid: createMarketUid(chainId, key2, meta.collToken),
|
|
47175
|
+
targetLender: key2,
|
|
45956
47176
|
description: "River TroveManager oracle (USD)"
|
|
45957
47177
|
});
|
|
45958
47178
|
}
|
|
@@ -45961,8 +47181,8 @@ function parseRiverResults(data, meta, context) {
|
|
|
45961
47181
|
asset: meta.debtToken,
|
|
45962
47182
|
price: 1,
|
|
45963
47183
|
priceUSD: 1,
|
|
45964
|
-
marketUid: createMarketUid(chainId,
|
|
45965
|
-
targetLender:
|
|
47184
|
+
marketUid: createMarketUid(chainId, key2, meta.debtToken),
|
|
47185
|
+
targetLender: key2,
|
|
45966
47186
|
description: "River satUSD (par)",
|
|
45967
47187
|
staticBase: true,
|
|
45968
47188
|
baseAsset: meta.debtToken
|
|
@@ -45978,6 +47198,82 @@ var riverFetcher = {
|
|
|
45978
47198
|
parse: parseRiverResults,
|
|
45979
47199
|
getAbi: getRiverAbi
|
|
45980
47200
|
};
|
|
47201
|
+
var READS_PER_ASSET = 2;
|
|
47202
|
+
function getCurvanceCalls(chainId) {
|
|
47203
|
+
const results = [];
|
|
47204
|
+
for (const lender of curvanceLendersByChain(chainId)) {
|
|
47205
|
+
const cfg = curvanceConfigFor(lender, chainId);
|
|
47206
|
+
const oracleManager = cfg?.oracleManager;
|
|
47207
|
+
if (!oracleManager) continue;
|
|
47208
|
+
const roster = getCurvanceAssetRoster(chainId, lender);
|
|
47209
|
+
for (const market of roster) {
|
|
47210
|
+
if (market.assets.length === 0) continue;
|
|
47211
|
+
const calls = market.assets.flatMap((asset) => [
|
|
47212
|
+
{
|
|
47213
|
+
address: oracleManager,
|
|
47214
|
+
name: "getPrice",
|
|
47215
|
+
params: [asset, true, true]
|
|
47216
|
+
},
|
|
47217
|
+
{
|
|
47218
|
+
address: oracleManager,
|
|
47219
|
+
name: "getPrice",
|
|
47220
|
+
params: [asset, true, false]
|
|
47221
|
+
}
|
|
47222
|
+
]);
|
|
47223
|
+
results.push({
|
|
47224
|
+
calls,
|
|
47225
|
+
meta: {
|
|
47226
|
+
lender,
|
|
47227
|
+
chainId,
|
|
47228
|
+
marketManager: market.marketManager,
|
|
47229
|
+
assets: market.assets
|
|
47230
|
+
},
|
|
47231
|
+
lender: curvanceLenderKey(lender, chainId, market.marketManager)
|
|
47232
|
+
});
|
|
47233
|
+
}
|
|
47234
|
+
}
|
|
47235
|
+
return results;
|
|
47236
|
+
}
|
|
47237
|
+
function parseCurvanceResults(data, meta, context) {
|
|
47238
|
+
const { chainId } = context;
|
|
47239
|
+
const key2 = curvanceLenderKey(meta.lender, chainId, meta.marketManager);
|
|
47240
|
+
const entries = [];
|
|
47241
|
+
meta.assets.forEach((asset, i) => {
|
|
47242
|
+
const lowerRes = data?.[i * READS_PER_ASSET];
|
|
47243
|
+
const upperRes = data?.[i * READS_PER_ASSET + 1];
|
|
47244
|
+
const lower3 = decode(lowerRes);
|
|
47245
|
+
const upper = decode(upperRes);
|
|
47246
|
+
if (!lower3 || lower3.errorCode !== 0n) return;
|
|
47247
|
+
const priceUSD = Number(lower3.price) / 1e18;
|
|
47248
|
+
if (!(priceUSD > 0 && priceUSD < 1e9)) return;
|
|
47249
|
+
const upperUSD = upper && upper.errorCode === 0n ? Number(upper.price) / 1e18 : void 0;
|
|
47250
|
+
entries.push({
|
|
47251
|
+
asset,
|
|
47252
|
+
price: priceUSD,
|
|
47253
|
+
priceUSD,
|
|
47254
|
+
marketUid: createMarketUid(chainId, key2, asset),
|
|
47255
|
+
targetLender: key2,
|
|
47256
|
+
description: upperUSD && upperUSD !== priceUSD ? "Curvance OracleManager (USD, pessimistic-low; dual feed)" : "Curvance OracleManager (USD)"
|
|
47257
|
+
});
|
|
47258
|
+
});
|
|
47259
|
+
return entries;
|
|
47260
|
+
}
|
|
47261
|
+
function decode(v) {
|
|
47262
|
+
if (!Array.isArray(v) || v.length < 2) return void 0;
|
|
47263
|
+
try {
|
|
47264
|
+
return { price: BigInt(v[0]), errorCode: BigInt(v[1]) };
|
|
47265
|
+
} catch {
|
|
47266
|
+
return void 0;
|
|
47267
|
+
}
|
|
47268
|
+
}
|
|
47269
|
+
function getCurvanceAbi() {
|
|
47270
|
+
return CurvanceOracleManagerAbi;
|
|
47271
|
+
}
|
|
47272
|
+
var curvanceFetcher = {
|
|
47273
|
+
getCalls: getCurvanceCalls,
|
|
47274
|
+
parse: parseCurvanceResults,
|
|
47275
|
+
getAbi: getCurvanceAbi
|
|
47276
|
+
};
|
|
45981
47277
|
function getInverseCalls(chainId) {
|
|
45982
47278
|
const results = [];
|
|
45983
47279
|
for (const lender of inverseLendersByChain(chainId)) {
|
|
@@ -46011,7 +47307,7 @@ function getInverseCalls(chainId) {
|
|
|
46011
47307
|
}
|
|
46012
47308
|
function parseInverseResults(data, meta, context) {
|
|
46013
47309
|
const { chainId } = context;
|
|
46014
|
-
const
|
|
47310
|
+
const key2 = inverseLenderKey(meta.lender, meta.market);
|
|
46015
47311
|
const entries = [];
|
|
46016
47312
|
const raw = data?.[0];
|
|
46017
47313
|
const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
|
|
@@ -46021,8 +47317,8 @@ function parseInverseResults(data, meta, context) {
|
|
|
46021
47317
|
asset: meta.collToken,
|
|
46022
47318
|
price: collUSD,
|
|
46023
47319
|
priceUSD: collUSD,
|
|
46024
|
-
marketUid: createMarketUid(chainId,
|
|
46025
|
-
targetLender:
|
|
47320
|
+
marketUid: createMarketUid(chainId, key2, meta.collToken),
|
|
47321
|
+
targetLender: key2,
|
|
46026
47322
|
description: "Inverse FiRM pessimistic oracle (USD, ~2-day low)"
|
|
46027
47323
|
});
|
|
46028
47324
|
}
|
|
@@ -46031,8 +47327,8 @@ function parseInverseResults(data, meta, context) {
|
|
|
46031
47327
|
asset: meta.dola,
|
|
46032
47328
|
price: 1,
|
|
46033
47329
|
priceUSD: 1,
|
|
46034
|
-
marketUid: createMarketUid(chainId,
|
|
46035
|
-
targetLender:
|
|
47330
|
+
marketUid: createMarketUid(chainId, key2, meta.dola),
|
|
47331
|
+
targetLender: key2,
|
|
46036
47332
|
description: "Inverse DOLA (par)",
|
|
46037
47333
|
staticBase: true,
|
|
46038
47334
|
baseAsset: meta.dola
|
|
@@ -46083,8 +47379,8 @@ function parseTellerResults(data, meta, context) {
|
|
|
46083
47379
|
const collateral = meta.collateral;
|
|
46084
47380
|
const lenderKey = tellerLenderKey(meta.pool);
|
|
46085
47381
|
const usdOf = (addr2) => {
|
|
46086
|
-
const
|
|
46087
|
-
return usdPrices[
|
|
47382
|
+
const key2 = tokenList?.[addr2]?.assetGroup ?? `${chainId}-${addr2}`;
|
|
47383
|
+
return usdPrices[key2] ?? usdPrices[addr2];
|
|
46088
47384
|
};
|
|
46089
47385
|
const principalUSD = usdOf(principal);
|
|
46090
47386
|
const collateralUSD = usdOf(collateral);
|
|
@@ -46709,11 +48005,11 @@ function getAaveV4OracleGroups(chainId) {
|
|
|
46709
48005
|
for (const entry of oracleEntries) {
|
|
46710
48006
|
if (!entry?.oracle || entry.oracle === "0x") continue;
|
|
46711
48007
|
if (!entry.spoke) continue;
|
|
46712
|
-
const
|
|
46713
|
-
let group = byOracle.get(
|
|
48008
|
+
const key2 = entry.oracle.toLowerCase();
|
|
48009
|
+
let group = byOracle.get(key2);
|
|
46714
48010
|
if (!group) {
|
|
46715
48011
|
group = { decimals: entry.decimals ?? 8, entries: [] };
|
|
46716
|
-
byOracle.set(
|
|
48012
|
+
byOracle.set(key2, group);
|
|
46717
48013
|
}
|
|
46718
48014
|
group.entries.push({
|
|
46719
48015
|
underlying: entry.underlying.toLowerCase(),
|
|
@@ -46808,7 +48104,7 @@ var SiloOracleAbi = [
|
|
|
46808
48104
|
type: "function"
|
|
46809
48105
|
}
|
|
46810
48106
|
];
|
|
46811
|
-
var
|
|
48107
|
+
var ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
|
|
46812
48108
|
function lookupUSD(context, asset) {
|
|
46813
48109
|
const lc = asset.toLowerCase();
|
|
46814
48110
|
const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
|
|
@@ -46820,7 +48116,7 @@ function getSiloV2Calls(chainId) {
|
|
|
46820
48116
|
const tokensWithRealOracle = /* @__PURE__ */ new Set();
|
|
46821
48117
|
for (const market of allMarkets) {
|
|
46822
48118
|
for (const half of [market.silo0, market.silo1]) {
|
|
46823
|
-
if (half.solvencyOracle && half.solvencyOracle !==
|
|
48119
|
+
if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS6) {
|
|
46824
48120
|
tokensWithRealOracle.add(half.token.toLowerCase());
|
|
46825
48121
|
}
|
|
46826
48122
|
}
|
|
@@ -46833,7 +48129,7 @@ function getSiloV2Calls(chainId) {
|
|
|
46833
48129
|
const lenderKey = siloV2LenderKey(market.siloConfig);
|
|
46834
48130
|
const halves = [market.silo0, market.silo1];
|
|
46835
48131
|
const isStatic = halves.map(
|
|
46836
|
-
(h) => !h.solvencyOracle || h.solvencyOracle ===
|
|
48132
|
+
(h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS6
|
|
46837
48133
|
);
|
|
46838
48134
|
if (isStatic[0] && isStatic[1]) {
|
|
46839
48135
|
const t0 = halves[0].token.toLowerCase();
|
|
@@ -46853,7 +48149,7 @@ function getSiloV2Calls(chainId) {
|
|
|
46853
48149
|
decimals: half.decimals,
|
|
46854
48150
|
silo: half.silo.toLowerCase(),
|
|
46855
48151
|
lenderKey,
|
|
46856
|
-
oracle:
|
|
48152
|
+
oracle: ZERO_ADDRESS6,
|
|
46857
48153
|
partnerToken: partnerLc,
|
|
46858
48154
|
isStatic: true
|
|
46859
48155
|
});
|
|
@@ -46977,7 +48273,7 @@ var SiloOracleAbi2 = [
|
|
|
46977
48273
|
type: "function"
|
|
46978
48274
|
}
|
|
46979
48275
|
];
|
|
46980
|
-
var
|
|
48276
|
+
var ZERO_ADDRESS7 = "0x0000000000000000000000000000000000000000";
|
|
46981
48277
|
function lookupUSD2(context, asset) {
|
|
46982
48278
|
const lc = asset.toLowerCase();
|
|
46983
48279
|
const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
|
|
@@ -46989,7 +48285,7 @@ function getSiloV3Calls(chainId) {
|
|
|
46989
48285
|
const tokensWithRealOracle = /* @__PURE__ */ new Set();
|
|
46990
48286
|
for (const market of allMarkets) {
|
|
46991
48287
|
for (const half of [market.silo0, market.silo1]) {
|
|
46992
|
-
if (half.solvencyOracle && half.solvencyOracle !==
|
|
48288
|
+
if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS7) {
|
|
46993
48289
|
tokensWithRealOracle.add(half.token.toLowerCase());
|
|
46994
48290
|
}
|
|
46995
48291
|
}
|
|
@@ -47002,7 +48298,7 @@ function getSiloV3Calls(chainId) {
|
|
|
47002
48298
|
const lenderKey = siloV3LenderKey(market.siloConfig);
|
|
47003
48299
|
const halves = [market.silo0, market.silo1];
|
|
47004
48300
|
const isStatic = halves.map(
|
|
47005
|
-
(h) => !h.solvencyOracle || h.solvencyOracle ===
|
|
48301
|
+
(h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS7
|
|
47006
48302
|
);
|
|
47007
48303
|
if (isStatic[0] && isStatic[1]) {
|
|
47008
48304
|
const t0 = halves[0].token.toLowerCase();
|
|
@@ -47022,7 +48318,7 @@ function getSiloV3Calls(chainId) {
|
|
|
47022
48318
|
decimals: half.decimals,
|
|
47023
48319
|
silo: half.silo.toLowerCase(),
|
|
47024
48320
|
lenderKey,
|
|
47025
|
-
oracle:
|
|
48321
|
+
oracle: ZERO_ADDRESS7,
|
|
47026
48322
|
partnerToken: partnerLc,
|
|
47027
48323
|
isStatic: true
|
|
47028
48324
|
});
|
|
@@ -47219,8 +48515,8 @@ function parseGearboxV3Results(data, _meta, context) {
|
|
|
47219
48515
|
const markets = data[0];
|
|
47220
48516
|
if (!Array.isArray(markets) || markets.length === 0) return entries;
|
|
47221
48517
|
const resolvePriceUSD = (token) => {
|
|
47222
|
-
const
|
|
47223
|
-
return usdPrices[
|
|
48518
|
+
const key2 = tokenList?.[token]?.assetGroup ?? `${chainId}-${token}`;
|
|
48519
|
+
return usdPrices[key2] ?? usdPrices[token];
|
|
47224
48520
|
};
|
|
47225
48521
|
for (const m of markets) {
|
|
47226
48522
|
try {
|
|
@@ -47401,7 +48697,7 @@ function lookupUSD3(context, asset) {
|
|
|
47401
48697
|
return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
|
|
47402
48698
|
}
|
|
47403
48699
|
function parseSiloV2GraphQLResults(items, context) {
|
|
47404
|
-
const
|
|
48700
|
+
const ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
|
|
47405
48701
|
const out = [];
|
|
47406
48702
|
const seen = /* @__PURE__ */ new Set();
|
|
47407
48703
|
for (const item of items) {
|
|
@@ -47424,8 +48720,8 @@ function parseSiloV2GraphQLResults(items, context) {
|
|
|
47424
48720
|
const partnerTokenLc = other.token.toLowerCase();
|
|
47425
48721
|
const dedupKey = `${lenderKey}:${tokenLc}`;
|
|
47426
48722
|
if (seen.has(dedupKey)) continue;
|
|
47427
|
-
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ??
|
|
47428
|
-
const isStatic = !oracleAddr || oracleAddr ===
|
|
48723
|
+
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS9).toLowerCase();
|
|
48724
|
+
const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS9;
|
|
47429
48725
|
const siloAddrLc = self.silo.toLowerCase();
|
|
47430
48726
|
try {
|
|
47431
48727
|
let priceUSD = 0;
|
|
@@ -47543,7 +48839,7 @@ function lookupUSD4(context, asset) {
|
|
|
47543
48839
|
return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
|
|
47544
48840
|
}
|
|
47545
48841
|
function parseSiloV3GraphQLResults(items, context) {
|
|
47546
|
-
const
|
|
48842
|
+
const ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
|
|
47547
48843
|
const out = [];
|
|
47548
48844
|
const seen = /* @__PURE__ */ new Set();
|
|
47549
48845
|
for (const item of items) {
|
|
@@ -47566,8 +48862,8 @@ function parseSiloV3GraphQLResults(items, context) {
|
|
|
47566
48862
|
const partnerTokenLc = other.token.toLowerCase();
|
|
47567
48863
|
const dedupKey = `${lenderKey}:${tokenLc}`;
|
|
47568
48864
|
if (seen.has(dedupKey)) continue;
|
|
47569
|
-
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ??
|
|
47570
|
-
const isStatic = !oracleAddr || oracleAddr ===
|
|
48865
|
+
const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS9).toLowerCase();
|
|
48866
|
+
const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS9;
|
|
47571
48867
|
const siloAddrLc = self.silo.toLowerCase();
|
|
47572
48868
|
try {
|
|
47573
48869
|
let priceUSD = 0;
|
|
@@ -47689,7 +48985,7 @@ var AGGREGATOR_ABI = [...ChainlinkAggregatorAbi, ...DESCRIPTION_ABI];
|
|
|
47689
48985
|
function isFailed(r) {
|
|
47690
48986
|
return r === "0x" || r === void 0 || r === null;
|
|
47691
48987
|
}
|
|
47692
|
-
var
|
|
48988
|
+
var ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
|
|
47693
48989
|
async function probeAaveFeedTimestamps(chainId, options = {}) {
|
|
47694
48990
|
const { rpcOverrides, batchSize, retries = 2 } = options;
|
|
47695
48991
|
const result = {};
|
|
@@ -47726,7 +49022,7 @@ async function probeAaveFeedTimestamps(chainId, options = {}) {
|
|
|
47726
49022
|
const raw = sourceResults[i];
|
|
47727
49023
|
if (isFailed(raw)) return;
|
|
47728
49024
|
const source = String(raw).toLowerCase();
|
|
47729
|
-
if (source ===
|
|
49025
|
+
if (source === ZERO_ADDRESS8) return;
|
|
47730
49026
|
sourceOf.set(i, source);
|
|
47731
49027
|
if (!sourceIndex.has(source)) {
|
|
47732
49028
|
sourceIndex.set(source, uniqueSources.length);
|
|
@@ -47900,6 +49196,12 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
47900
49196
|
if (isActive("termmax") && termMaxConfigByChain(chainId)) {
|
|
47901
49197
|
await fetchTermMaxMarkets(chainId).catch(() => []);
|
|
47902
49198
|
}
|
|
49199
|
+
if (isActive("curvance")) {
|
|
49200
|
+
for (const lender of curvanceLendersByChain(chainId)) {
|
|
49201
|
+
if (getCurvanceAssetRoster(chainId, lender).length > 0) continue;
|
|
49202
|
+
await fetchCurvanceMarkets(lender, chainId).catch(() => void 0);
|
|
49203
|
+
}
|
|
49204
|
+
}
|
|
47903
49205
|
const aaveResults = isActive("aave") ? safeGetCalls(
|
|
47904
49206
|
"aave",
|
|
47905
49207
|
() => aaveFetcher.getCalls(chainId),
|
|
@@ -47969,6 +49271,11 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
47969
49271
|
() => riverFetcher.getCalls(chainId),
|
|
47970
49272
|
getCallsErrors
|
|
47971
49273
|
) : [];
|
|
49274
|
+
const curvanceResults = isActive("curvance") ? safeGetCalls(
|
|
49275
|
+
"curvance",
|
|
49276
|
+
() => curvanceFetcher.getCalls(chainId),
|
|
49277
|
+
getCallsErrors
|
|
49278
|
+
) : [];
|
|
47972
49279
|
const inverseResults = isActive("inverse") ? safeGetCalls(
|
|
47973
49280
|
"inverse",
|
|
47974
49281
|
() => inverseFetcher.getCalls(chainId),
|
|
@@ -48093,6 +49400,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48093
49400
|
getRiverAbi(),
|
|
48094
49401
|
"direct"
|
|
48095
49402
|
);
|
|
49403
|
+
const curvanceGroup = buildGroup(
|
|
49404
|
+
"curvance",
|
|
49405
|
+
curvanceResults,
|
|
49406
|
+
curvanceFetcher.parse,
|
|
49407
|
+
curvanceFetcher.getAbi(),
|
|
49408
|
+
"direct"
|
|
49409
|
+
);
|
|
48096
49410
|
const inverseGroup = buildGroup(
|
|
48097
49411
|
"inverse",
|
|
48098
49412
|
inverseResults,
|
|
@@ -48164,6 +49478,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48164
49478
|
termGroup,
|
|
48165
49479
|
liquityGroup,
|
|
48166
49480
|
riverGroup,
|
|
49481
|
+
curvanceGroup,
|
|
48167
49482
|
inverseGroup,
|
|
48168
49483
|
tellerGroup,
|
|
48169
49484
|
termMaxGroup,
|
|
@@ -48212,6 +49527,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48212
49527
|
termData,
|
|
48213
49528
|
liquityData,
|
|
48214
49529
|
riverData,
|
|
49530
|
+
curvanceData,
|
|
48215
49531
|
inverseData,
|
|
48216
49532
|
tellerData,
|
|
48217
49533
|
termMaxData,
|
|
@@ -48331,6 +49647,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48331
49647
|
allowFailure,
|
|
48332
49648
|
rpcOverrides
|
|
48333
49649
|
),
|
|
49650
|
+
executeGroup(
|
|
49651
|
+
curvanceGroup,
|
|
49652
|
+
chainId,
|
|
49653
|
+
chainBatchSize,
|
|
49654
|
+
retries,
|
|
49655
|
+
allowFailure,
|
|
49656
|
+
rpcOverrides
|
|
49657
|
+
),
|
|
48334
49658
|
executeGroup(
|
|
48335
49659
|
inverseGroup,
|
|
48336
49660
|
chainId,
|
|
@@ -48481,6 +49805,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48481
49805
|
parseTrackers(termGroup, termData.results);
|
|
48482
49806
|
parseTrackers(liquityGroup, liquityData.results);
|
|
48483
49807
|
parseTrackers(riverGroup, riverData.results);
|
|
49808
|
+
parseTrackers(curvanceGroup, curvanceData.results);
|
|
48484
49809
|
parseTrackers(inverseGroup, inverseData.results);
|
|
48485
49810
|
if (siloV2GqlEntries != null) {
|
|
48486
49811
|
const diag2 = {
|
|
@@ -48541,8 +49866,8 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48541
49866
|
let gqlPushed = 0;
|
|
48542
49867
|
for (const entry of morphoGqlEntries) {
|
|
48543
49868
|
const lender = entry.targetLender ?? "MORPHO_BLUE";
|
|
48544
|
-
const
|
|
48545
|
-
if (onChainKeys.has(
|
|
49869
|
+
const key2 = `${lender}|${entry.marketUid}|${entry.asset}`;
|
|
49870
|
+
if (onChainKeys.has(key2)) continue;
|
|
48546
49871
|
if (!chainResult[lender]) chainResult[lender] = [];
|
|
48547
49872
|
entry.derivation = resolveDerivation(entry, "derived");
|
|
48548
49873
|
chainResult[lender].push(entry);
|
|
@@ -48611,9 +49936,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
48611
49936
|
if (!entry.updatedAt || entry.updatedAt <= 0) continue;
|
|
48612
49937
|
const staleSeconds = nowSeconds - entry.updatedAt;
|
|
48613
49938
|
if (staleSeconds <= stalenessThresholdSeconds) continue;
|
|
48614
|
-
const
|
|
48615
|
-
if (reported.has(
|
|
48616
|
-
reported.add(
|
|
49939
|
+
const key2 = `${lender}|${entry.asset}|${entry.feedSource ?? ""}`;
|
|
49940
|
+
if (reported.has(key2)) continue;
|
|
49941
|
+
reported.add(key2);
|
|
48617
49942
|
staleFeeds.push({
|
|
48618
49943
|
asset: entry.asset,
|
|
48619
49944
|
lender,
|
|
@@ -48760,8 +50085,8 @@ function ewma(prev, sample) {
|
|
|
48760
50085
|
function updateFeedStats(prev, observations, nowSeconds = Math.floor(Date.now() / 1e3)) {
|
|
48761
50086
|
const next = { ...prev };
|
|
48762
50087
|
for (const obs of observations) {
|
|
48763
|
-
const
|
|
48764
|
-
const existing = next[
|
|
50088
|
+
const key2 = feedStatKey(obs.chainId, obs.feedKey);
|
|
50089
|
+
const existing = next[key2];
|
|
48765
50090
|
const stat = existing ? { ...existing } : {
|
|
48766
50091
|
chainId: obs.chainId,
|
|
48767
50092
|
feedKey: obs.feedKey,
|
|
@@ -48788,7 +50113,7 @@ function updateFeedStats(prev, observations, nowSeconds = Math.floor(Date.now()
|
|
|
48788
50113
|
stat.deviationSamples += 1;
|
|
48789
50114
|
}
|
|
48790
50115
|
stat.lastObservedAt = nowSeconds;
|
|
48791
|
-
next[
|
|
50116
|
+
next[key2] = stat;
|
|
48792
50117
|
}
|
|
48793
50118
|
return next;
|
|
48794
50119
|
}
|
|
@@ -48881,8 +50206,8 @@ function collectFeedObservations(structuredPrices, lists = {}, guard = DEFAULT_O
|
|
|
48881
50206
|
}
|
|
48882
50207
|
function pruneFeedStats(stats, maxAgeSeconds = 30 * 24 * 3600, nowSeconds = Math.floor(Date.now() / 1e3)) {
|
|
48883
50208
|
const out = {};
|
|
48884
|
-
for (const [
|
|
48885
|
-
if (nowSeconds - stat.lastObservedAt <= maxAgeSeconds) out[
|
|
50209
|
+
for (const [key2, stat] of Object.entries(stats)) {
|
|
50210
|
+
if (nowSeconds - stat.lastObservedAt <= maxAgeSeconds) out[key2] = stat;
|
|
48886
50211
|
}
|
|
48887
50212
|
return out;
|
|
48888
50213
|
}
|
|
@@ -51652,11 +52977,11 @@ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}, multical
|
|
|
51652
52977
|
};
|
|
51653
52978
|
var warn6 = (...args) => {
|
|
51654
52979
|
};
|
|
51655
|
-
var
|
|
52980
|
+
var num4 = (v) => {
|
|
51656
52981
|
const n = Number(v);
|
|
51657
52982
|
return Number.isFinite(n) ? n : 0;
|
|
51658
52983
|
};
|
|
51659
|
-
var
|
|
52984
|
+
var big13 = (v) => {
|
|
51660
52985
|
try {
|
|
51661
52986
|
if (v === void 0 || v === null || v === "") return "0";
|
|
51662
52987
|
const s = String(v);
|
|
@@ -51687,21 +53012,21 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
51687
53012
|
const underlying = lower2(r?.asset?.contractAddress);
|
|
51688
53013
|
if (!address || !underlying) continue;
|
|
51689
53014
|
if (r.isEnabled === false) continue;
|
|
51690
|
-
const assetDecimals =
|
|
51691
|
-
const
|
|
53015
|
+
const assetDecimals = num4(r?.asset?.decimals) || 18;
|
|
53016
|
+
const scale2 = 10 ** assetDecimals;
|
|
51692
53017
|
const assetEntry = tokenList[underlying];
|
|
51693
53018
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
|
|
51694
53019
|
const priceUsd = prices[priceKey];
|
|
51695
|
-
const totalAssets =
|
|
51696
|
-
const totalSupply =
|
|
51697
|
-
const totalAssetsFormatted = Number(totalAssets) /
|
|
51698
|
-
const supplyRate =
|
|
51699
|
-
const rewardsRate =
|
|
51700
|
-
const rawLiquidity = BigInt(
|
|
53020
|
+
const totalAssets = big13(r.totalAssets);
|
|
53021
|
+
const totalSupply = big13(r.totalSupplyAmt);
|
|
53022
|
+
const totalAssetsFormatted = Number(totalAssets) / scale2;
|
|
53023
|
+
const supplyRate = num4(r.apr) * 100;
|
|
53024
|
+
const rewardsRate = num4(r?.incentiveData?.TMX_APR) * 100;
|
|
53025
|
+
const rawLiquidity = BigInt(big13(r.redeemableAmt ?? r.idleFunds ?? "0"));
|
|
51701
53026
|
const totalAssetsBig = BigInt(totalAssets);
|
|
51702
53027
|
const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
|
|
51703
|
-
const liquidityFormatted = Number(liquidity) /
|
|
51704
|
-
const totalSupplyValue =
|
|
53028
|
+
const liquidityFormatted = Number(liquidity) / scale2;
|
|
53029
|
+
const totalSupplyValue = num4(r.totalSupplyValue);
|
|
51705
53030
|
out[address] = {
|
|
51706
53031
|
address,
|
|
51707
53032
|
underlying,
|
|
@@ -51718,8 +53043,8 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
51718
53043
|
rewardsRate,
|
|
51719
53044
|
depositRate: supplyRate + rewardsRate,
|
|
51720
53045
|
// 1e8-scaled upstream (10000000 = 10%).
|
|
51721
|
-
fee:
|
|
51722
|
-
timelock:
|
|
53046
|
+
fee: num4(r.performanceFeeRate) / 1e6,
|
|
53047
|
+
timelock: num4(r.timeLockSeconds) || void 0,
|
|
51723
53048
|
curator: r?.curator?.curatorAddress ? lower2(r.curator.curatorAddress) : void 0,
|
|
51724
53049
|
// The API is the ONLY source for this — do not derive it from `name`.
|
|
51725
53050
|
curatorName: r?.curator?.name || void 0,
|
|
@@ -51733,7 +53058,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
51733
53058
|
liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
|
|
51734
53059
|
version: r.version,
|
|
51735
53060
|
isPaused: r.isPaused === true || void 0,
|
|
51736
|
-
supplyCap: r.capacity ?
|
|
53061
|
+
supplyCap: r.capacity ? big13(r.capacity) : void 0,
|
|
51737
53062
|
basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
|
|
51738
53063
|
};
|
|
51739
53064
|
}
|
|
@@ -51789,7 +53114,7 @@ var Erc20DecimalsBalanceAbi = [
|
|
|
51789
53114
|
|
|
51790
53115
|
// src/vaults/termmax/fetchFromChain.ts
|
|
51791
53116
|
var DECIMAL_BASE2 = 100000000n;
|
|
51792
|
-
var
|
|
53117
|
+
var big14 = (v) => {
|
|
51793
53118
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
51794
53119
|
try {
|
|
51795
53120
|
return typeof v === "bigint" ? v : BigInt(v);
|
|
@@ -51797,11 +53122,11 @@ var big12 = (v) => {
|
|
|
51797
53122
|
return 0n;
|
|
51798
53123
|
}
|
|
51799
53124
|
};
|
|
51800
|
-
var
|
|
53125
|
+
var num5 = (v) => {
|
|
51801
53126
|
const n = Number(v);
|
|
51802
53127
|
return Number.isFinite(n) ? n : void 0;
|
|
51803
53128
|
};
|
|
51804
|
-
var
|
|
53129
|
+
var str2 = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
|
|
51805
53130
|
var addr = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0{40}$/.test(v) ? v.toLowerCase() : void 0;
|
|
51806
53131
|
async function discoverVaultAddresses(chainId) {
|
|
51807
53132
|
const markets = await fetchTermMaxMarkets(chainId).catch(() => []);
|
|
@@ -51853,24 +53178,24 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
51853
53178
|
vaults.forEach((address, i) => {
|
|
51854
53179
|
const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
|
|
51855
53180
|
const asset = addr(at("asset"));
|
|
51856
|
-
const totalAssets =
|
|
53181
|
+
const totalAssets = big14(at("totalAssets"));
|
|
51857
53182
|
if (!asset || totalAssets === 0n) return;
|
|
51858
53183
|
rows.push({
|
|
51859
53184
|
address,
|
|
51860
|
-
name:
|
|
51861
|
-
symbol:
|
|
51862
|
-
decimals:
|
|
53185
|
+
name: str2(at("name")),
|
|
53186
|
+
symbol: str2(at("symbol")),
|
|
53187
|
+
decimals: num5(at("decimals")) ?? 18,
|
|
51863
53188
|
asset,
|
|
51864
53189
|
totalAssets,
|
|
51865
|
-
totalSupply:
|
|
51866
|
-
annualizedInterest:
|
|
51867
|
-
accretingPrincipal:
|
|
51868
|
-
performanceFeeRate:
|
|
51869
|
-
aprRaw: at("apr") != null ?
|
|
53190
|
+
totalSupply: big14(at("totalSupply")),
|
|
53191
|
+
annualizedInterest: big14(at("annualizedInterest")),
|
|
53192
|
+
accretingPrincipal: big14(at("accretingPrincipal")),
|
|
53193
|
+
performanceFeeRate: big14(at("performanceFeeRate")),
|
|
53194
|
+
aprRaw: at("apr") != null ? big14(at("apr")) : void 0,
|
|
51870
53195
|
curator: addr(at("curator")),
|
|
51871
53196
|
guardian: addr(at("guardian")),
|
|
51872
|
-
timelock:
|
|
51873
|
-
version:
|
|
53197
|
+
timelock: num5(at("timelock")),
|
|
53198
|
+
version: str2(at("getVersion"))
|
|
51874
53199
|
});
|
|
51875
53200
|
});
|
|
51876
53201
|
if (rows.length === 0) return {};
|
|
@@ -51886,8 +53211,8 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
51886
53211
|
});
|
|
51887
53212
|
const out = {};
|
|
51888
53213
|
rows.forEach((r, i) => {
|
|
51889
|
-
const assetDecimals =
|
|
51890
|
-
const idle =
|
|
53214
|
+
const assetDecimals = num5(res2[i * 2]) ?? r.decimals;
|
|
53215
|
+
const idle = big14(res2[i * 2 + 1]);
|
|
51891
53216
|
const assetEntry = tokenList[r.asset];
|
|
51892
53217
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
|
|
51893
53218
|
const priceUsd = prices[priceKey];
|
|
@@ -51901,9 +53226,9 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
51901
53226
|
if (r.aprRaw !== void 0 && r.aprRaw > 0n) {
|
|
51902
53227
|
supplyRate = Number(r.aprRaw) / Number(DECIMAL_BASE2) * 100;
|
|
51903
53228
|
}
|
|
51904
|
-
const
|
|
51905
|
-
const totalAssetsFormatted = Number(r.totalAssets) /
|
|
51906
|
-
const liquidityFormatted = Number(idle) /
|
|
53229
|
+
const scale2 = 10 ** assetDecimals;
|
|
53230
|
+
const totalAssetsFormatted = Number(r.totalAssets) / scale2;
|
|
53231
|
+
const liquidityFormatted = Number(idle) / scale2;
|
|
51907
53232
|
const convertToAssets = r.totalSupply > 0n ? (r.totalAssets * 10n ** BigInt(r.decimals) / r.totalSupply).toString() : "0";
|
|
51908
53233
|
const entry = {
|
|
51909
53234
|
address: r.address,
|
|
@@ -53025,7 +54350,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
53025
54350
|
}
|
|
53026
54351
|
};
|
|
53027
54352
|
}
|
|
53028
|
-
const
|
|
54353
|
+
const scale2 = 10n ** BigInt(18 - underlyingDec);
|
|
53029
54354
|
return {
|
|
53030
54355
|
calls: [
|
|
53031
54356
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
@@ -53036,7 +54361,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
53036
54361
|
const totalSupply = toBigInt13(supply);
|
|
53037
54362
|
const rawRate = toBigInt13(rate);
|
|
53038
54363
|
if (totalSupply === void 0 || rawRate === void 0) return void 0;
|
|
53039
|
-
const exchangeRate = rawRate *
|
|
54364
|
+
const exchangeRate = rawRate * scale2;
|
|
53040
54365
|
return {
|
|
53041
54366
|
totalAssets: rescaleDecimals(
|
|
53042
54367
|
totalSupply * exchangeRate / ONE_E189,
|
|
@@ -57640,7 +58965,7 @@ var pickApr = (apr) => {
|
|
|
57640
58965
|
if (apr.inception != null) return { rate: apr.inception, window: "inception" };
|
|
57641
58966
|
return { rate: 0, window: "none" };
|
|
57642
58967
|
};
|
|
57643
|
-
var
|
|
58968
|
+
var num6 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
57644
58969
|
function parseVault7(v, chainId, prices, tokenList) {
|
|
57645
58970
|
const address = (v?.address ?? "").toLowerCase();
|
|
57646
58971
|
const assetAddr = (v?.asset?.address ?? "").toLowerCase();
|
|
@@ -57656,14 +58981,14 @@ function parseVault7(v, chainId, prices, tokenList) {
|
|
|
57656
58981
|
parseRawAmount(totalAssetsRaw, assetDecimals)
|
|
57657
58982
|
);
|
|
57658
58983
|
const apr = {
|
|
57659
|
-
weekly:
|
|
57660
|
-
monthly:
|
|
57661
|
-
yearly:
|
|
57662
|
-
inception:
|
|
58984
|
+
weekly: num6(state.weeklyApr?.twrrNetApr),
|
|
58985
|
+
monthly: num6(state.monthlyApr?.twrrNetApr),
|
|
58986
|
+
yearly: num6(state.yearlyApr?.twrrNetApr),
|
|
58987
|
+
inception: num6(state.inceptionApr?.twrrNetApr)
|
|
57663
58988
|
};
|
|
57664
58989
|
const { rate: supplyRate, window: aprWindow } = pickApr(apr);
|
|
57665
58990
|
const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
|
|
57666
|
-
const apiTotalAssetsUsd =
|
|
58991
|
+
const apiTotalAssetsUsd = num6(state.totalAssetsUsd) ?? 0;
|
|
57667
58992
|
const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTotalAssetsUsd / totalAssetsFormatted : 0;
|
|
57668
58993
|
const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
|
|
57669
58994
|
const totalAssetsUsd = apiTotalAssetsUsd || totalAssetsFormatted * priceUsd;
|
|
@@ -57683,7 +59008,7 @@ function parseVault7(v, chainId, prices, tokenList) {
|
|
|
57683
59008
|
totalAssets: totalAssetsRaw,
|
|
57684
59009
|
totalSupply: totalSupplyRaw,
|
|
57685
59010
|
pricePerShare: state.pricePerShare?.toString() ?? "0",
|
|
57686
|
-
pricePerShareUsd:
|
|
59011
|
+
pricePerShareUsd: num6(state.pricePerShareUsd) ?? void 0,
|
|
57687
59012
|
supplyRate,
|
|
57688
59013
|
rewardsRate: 0,
|
|
57689
59014
|
depositRate: supplyRate,
|
|
@@ -57880,7 +59205,7 @@ var toBigInt16 = (v) => {
|
|
|
57880
59205
|
}
|
|
57881
59206
|
return void 0;
|
|
57882
59207
|
};
|
|
57883
|
-
var
|
|
59208
|
+
var num7 = (v) => {
|
|
57884
59209
|
const n = Number(v);
|
|
57885
59210
|
return Number.isFinite(n) ? n : 0;
|
|
57886
59211
|
};
|
|
@@ -57937,12 +59262,12 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
57937
59262
|
const totalAssets = toBigInt16(slice2[0]) ?? totalSupply * convertToAssets / shareUnit;
|
|
57938
59263
|
const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
|
|
57939
59264
|
const asset = tokenList[underlyingLc];
|
|
57940
|
-
const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ?
|
|
59265
|
+
const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num7(v.balance.usdPerToken) : void 0);
|
|
57941
59266
|
const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
|
|
57942
|
-
const supplyRate =
|
|
59267
|
+
const supplyRate = num7(v.vaultApr?.formatted);
|
|
57943
59268
|
const rewardsRate = 0;
|
|
57944
59269
|
const depositRate = supplyRate + rewardsRate;
|
|
57945
|
-
const fee =
|
|
59270
|
+
const fee = num7(v.fee?.value);
|
|
57946
59271
|
const symbol = (v.shareSymbol ?? "").trim();
|
|
57947
59272
|
const shareName = (v.shareName ?? "").trim();
|
|
57948
59273
|
const name = shareName || symbol;
|
|
@@ -57979,7 +59304,7 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
57979
59304
|
};
|
|
57980
59305
|
|
|
57981
59306
|
// src/vaults/upshift/fetchPublic.ts
|
|
57982
|
-
var
|
|
59307
|
+
var num8 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
57983
59308
|
var isEvmAddress = (a) => /^0x[0-9a-fA-F]{40}$/.test(a);
|
|
57984
59309
|
var derivePricePerShare = (totalAssetsRaw, totalSupplyRaw, shareDecimals) => {
|
|
57985
59310
|
try {
|
|
@@ -58006,12 +59331,12 @@ function parseVault8(v, chainId, prices, tokenList) {
|
|
|
58006
59331
|
const totalAssetsFormatted = Number(
|
|
58007
59332
|
parseRawAmount(totalAssetsRaw, assetDecimals)
|
|
58008
59333
|
);
|
|
58009
|
-
const base =
|
|
58010
|
-
const campaign =
|
|
59334
|
+
const base = num8(v.apy?.apy) ?? 0;
|
|
59335
|
+
const campaign = num8(v.apy?.campaignApy);
|
|
58011
59336
|
const supplyRate = apyToAprPercent(base);
|
|
58012
59337
|
const rewardsRate = campaign != null ? apyToAprPercent(campaign) : 0;
|
|
58013
59338
|
const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
|
|
58014
|
-
const apiTvlUsd =
|
|
59339
|
+
const apiTvlUsd = num8(v.latest_reported_tvl) ?? 0;
|
|
58015
59340
|
const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTvlUsd / totalAssetsFormatted : 0;
|
|
58016
59341
|
const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
|
|
58017
59342
|
const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
|
|
@@ -58036,10 +59361,10 @@ function parseVault8(v, chainId, prices, tokenList) {
|
|
|
58036
59361
|
rewardsRate,
|
|
58037
59362
|
depositRate: supplyRate + rewardsRate,
|
|
58038
59363
|
apy: {
|
|
58039
|
-
base:
|
|
59364
|
+
base: num8(v.apy?.apy),
|
|
58040
59365
|
campaign,
|
|
58041
|
-
points:
|
|
58042
|
-
underlying:
|
|
59366
|
+
points: num8(v.apy?.pointsApy),
|
|
59367
|
+
underlying: num8(v.apy?.underlyingApy)
|
|
58043
59368
|
},
|
|
58044
59369
|
isDepositPaused: v.isDepositPaused ?? false,
|
|
58045
59370
|
isWithdrawalPaused: v.isWithdrawalPaused ?? false,
|
|
@@ -58148,9 +59473,9 @@ var asBig = (v) => {
|
|
|
58148
59473
|
return null;
|
|
58149
59474
|
}
|
|
58150
59475
|
};
|
|
58151
|
-
var
|
|
59476
|
+
var num9 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
58152
59477
|
var toPct = (v) => {
|
|
58153
|
-
const n =
|
|
59478
|
+
const n = num9(v);
|
|
58154
59479
|
return n == null ? 0 : n * 100;
|
|
58155
59480
|
};
|
|
58156
59481
|
var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
|
|
@@ -58159,8 +59484,8 @@ var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
|
|
|
58159
59484
|
if (assets === 0n) return "0";
|
|
58160
59485
|
const pps = BigInt(pricePerShareRaw || "0");
|
|
58161
59486
|
if (pps <= 0n) return totalAssetsRaw;
|
|
58162
|
-
const
|
|
58163
|
-
return (assets *
|
|
59487
|
+
const scale2 = 10n ** BigInt(decimals);
|
|
59488
|
+
return (assets * scale2 / pps).toString();
|
|
58164
59489
|
} catch {
|
|
58165
59490
|
return totalAssetsRaw || "0";
|
|
58166
59491
|
}
|
|
@@ -58182,16 +59507,16 @@ function parseVault9(v, chainId, prices, tokenList) {
|
|
|
58182
59507
|
const totalAssetsFormatted = Number(
|
|
58183
59508
|
parseRawAmount(totalAssetsRaw, assetDecimals)
|
|
58184
59509
|
);
|
|
58185
|
-
const realized =
|
|
58186
|
-
const forward =
|
|
59510
|
+
const realized = num9(v.apr?.netAPR);
|
|
59511
|
+
const forward = num9(v.apr?.forwardAPR?.netAPR);
|
|
58187
59512
|
const isForwardApr = realized == null && forward != null;
|
|
58188
59513
|
const supplyRate = toPct(realized ?? forward);
|
|
58189
59514
|
const rewardsRate = toPct(v.apr?.extra?.stakingRewardsAPR);
|
|
58190
59515
|
const fee = toPct(v.apr?.fees?.performance);
|
|
58191
59516
|
const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
|
|
58192
|
-
const apiPrice =
|
|
59517
|
+
const apiPrice = num9(v.tvl?.price) ?? 0;
|
|
58193
59518
|
const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? apiPrice;
|
|
58194
|
-
const apiTvlUsd =
|
|
59519
|
+
const apiTvlUsd = num9(v.tvl?.tvl) ?? 0;
|
|
58195
59520
|
const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
|
|
58196
59521
|
const name = (v.name ?? "").trim();
|
|
58197
59522
|
const symbol = (v.symbol ?? "").trim();
|
|
@@ -58579,8 +59904,8 @@ var isStablecoinSymbol = (symbol) => {
|
|
|
58579
59904
|
return s.includes("USD");
|
|
58580
59905
|
};
|
|
58581
59906
|
var classifyVault = (input) => {
|
|
58582
|
-
const
|
|
58583
|
-
const yieldProfile = VOLATILE_VAULT_OVERRIDES.has(
|
|
59907
|
+
const key2 = `${input.chainId}-${input.address.toLowerCase()}`;
|
|
59908
|
+
const yieldProfile = VOLATILE_VAULT_OVERRIDES.has(key2) || VOLATILE_PROVIDERS.has(input.provider) ? "volatile" : "yield-bearing";
|
|
58584
59909
|
const denomination = isStablecoinSymbol(input.underlyingSymbol) ? "stable" : "volatile";
|
|
58585
59910
|
return { yieldProfile, denomination };
|
|
58586
59911
|
};
|
|
@@ -59128,10 +60453,10 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
|
|
|
59128
60453
|
const market = m.marketToken;
|
|
59129
60454
|
const long = m.longToken;
|
|
59130
60455
|
const short = m.shortToken;
|
|
59131
|
-
const get = (
|
|
60456
|
+
const get = (key2) => ({
|
|
59132
60457
|
address: c.dataStore,
|
|
59133
60458
|
name: "getUint",
|
|
59134
|
-
params: [
|
|
60459
|
+
params: [key2]
|
|
59135
60460
|
});
|
|
59136
60461
|
return [
|
|
59137
60462
|
get(maxPoolAmountKey(market, long)),
|
|
@@ -59179,23 +60504,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
|
|
|
59179
60504
|
const indexMax = price(prices, m.indexToken)?.max;
|
|
59180
60505
|
if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
|
|
59181
60506
|
const base = i * SLOTS;
|
|
59182
|
-
const
|
|
60507
|
+
const big15 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
|
|
59183
60508
|
const cap = computeDepositCapacityUsd(
|
|
59184
|
-
[info?.longTokenAmount, longMax,
|
|
59185
|
-
[info?.shortTokenAmount, shortMax,
|
|
60509
|
+
[info?.longTokenAmount, longMax, big15(0), big15(2)],
|
|
60510
|
+
[info?.shortTokenAmount, shortMax, big15(1), big15(3)]
|
|
59186
60511
|
);
|
|
59187
60512
|
if (cap != null) value.depositCapacityUsd = cap;
|
|
59188
60513
|
if (indexMax != null) {
|
|
59189
60514
|
const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
|
|
59190
|
-
const reservedUsdLong = (
|
|
59191
|
-
const reservedUsdShort = (
|
|
60515
|
+
const reservedUsdLong = (big15(4) + big15(5)) / divisor * indexMax;
|
|
60516
|
+
const reservedUsdShort = (big15(6) + big15(7)) / divisor;
|
|
59192
60517
|
const liq = computeLiquidityUsd(
|
|
59193
60518
|
info?.longTokenUsd,
|
|
59194
60519
|
info?.shortTokenUsd,
|
|
59195
60520
|
reservedUsdLong,
|
|
59196
60521
|
reservedUsdShort,
|
|
59197
|
-
|
|
59198
|
-
|
|
60522
|
+
big15(8),
|
|
60523
|
+
big15(9)
|
|
59199
60524
|
);
|
|
59200
60525
|
if (liq != null)
|
|
59201
60526
|
value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
|
|
@@ -59382,10 +60707,10 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
|
|
|
59382
60707
|
try {
|
|
59383
60708
|
res = await multicallRetry({
|
|
59384
60709
|
chain: chainId,
|
|
59385
|
-
calls: keys.map((
|
|
60710
|
+
calls: keys.map((key2) => ({
|
|
59386
60711
|
address: c.dataStore,
|
|
59387
60712
|
name: "getUint",
|
|
59388
|
-
params: [
|
|
60713
|
+
params: [key2]
|
|
59389
60714
|
})),
|
|
59390
60715
|
abi: GmxDataStoreUintAbi,
|
|
59391
60716
|
maxRetries: 3,
|
|
@@ -59394,27 +60719,27 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
|
|
|
59394
60719
|
} catch {
|
|
59395
60720
|
return void 0;
|
|
59396
60721
|
}
|
|
59397
|
-
const
|
|
59398
|
-
const base =
|
|
59399
|
-
const mult =
|
|
60722
|
+
const big15 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
|
|
60723
|
+
const base = big15(0);
|
|
60724
|
+
const mult = big15(1);
|
|
59400
60725
|
if (base === 0n && mult === 0n) return void 0;
|
|
59401
60726
|
const PRECISION = 10n ** 30n;
|
|
59402
60727
|
const adjusted = (opGas) => base + opGas * mult / PRECISION;
|
|
59403
60728
|
const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
|
|
59404
|
-
const glvExtra =
|
|
60729
|
+
const glvExtra = big15(6) * GLV_NOMINAL_MARKET_COUNT;
|
|
59405
60730
|
return {
|
|
59406
60731
|
chainId,
|
|
59407
60732
|
gasPriceWei: gasPriceWei.toString(),
|
|
59408
|
-
deposit: fee(
|
|
59409
|
-
withdrawal: fee(
|
|
59410
|
-
glvDeposit: fee(
|
|
59411
|
-
glvWithdrawal: fee(
|
|
60733
|
+
deposit: fee(big15(2)),
|
|
60734
|
+
withdrawal: fee(big15(3)),
|
|
60735
|
+
glvDeposit: fee(big15(4) + glvExtra),
|
|
60736
|
+
glvWithdrawal: fee(big15(5) + glvExtra)
|
|
59412
60737
|
};
|
|
59413
60738
|
};
|
|
59414
60739
|
|
|
59415
60740
|
// src/vaults/gmx/fetchPublic.ts
|
|
59416
60741
|
var GMX_TOKEN_DECIMALS = 18;
|
|
59417
|
-
var
|
|
60742
|
+
var num10 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
|
|
59418
60743
|
var minDefined = (a, b) => a == null ? b : b == null ? a : Math.min(a, b);
|
|
59419
60744
|
var glvMarketRoomUsd = (cap, priceUsd) => {
|
|
59420
60745
|
const currentUsd = Number(cap.balanceAmount) / 1e18 * priceUsd;
|
|
@@ -59448,37 +60773,37 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
|
|
|
59448
60773
|
indexToken: indexToken ? indexToken.toLowerCase() : void 0,
|
|
59449
60774
|
longSymbol,
|
|
59450
60775
|
shortSymbol,
|
|
59451
|
-
apy:
|
|
59452
|
-
baseApy:
|
|
59453
|
-
bonusApr:
|
|
60776
|
+
apy: num10(entry?.apy),
|
|
60777
|
+
baseApy: num10(entry?.baseApy),
|
|
60778
|
+
bonusApr: num10(entry?.bonusApr),
|
|
59454
60779
|
yieldProfile: "volatile",
|
|
59455
60780
|
denomination: denominationFor(longSymbol, shortSymbol)
|
|
59456
60781
|
};
|
|
59457
60782
|
};
|
|
59458
60783
|
for (const m of markets) {
|
|
59459
60784
|
if (!m.isListed) continue;
|
|
59460
|
-
const
|
|
59461
|
-
out[
|
|
60785
|
+
const key2 = m.marketToken.toLowerCase();
|
|
60786
|
+
out[key2] = build(
|
|
59462
60787
|
m.marketToken,
|
|
59463
60788
|
m.name,
|
|
59464
60789
|
"gm",
|
|
59465
60790
|
m.longToken,
|
|
59466
60791
|
m.shortToken,
|
|
59467
60792
|
m.indexToken,
|
|
59468
|
-
apy.markets?.[m.marketToken] ?? apy.markets?.[
|
|
60793
|
+
apy.markets?.[m.marketToken] ?? apy.markets?.[key2]
|
|
59469
60794
|
);
|
|
59470
60795
|
}
|
|
59471
60796
|
for (const g of glvs) {
|
|
59472
60797
|
if (!g.isListed) continue;
|
|
59473
|
-
const
|
|
59474
|
-
out[
|
|
60798
|
+
const key2 = g.glvToken.toLowerCase();
|
|
60799
|
+
out[key2] = build(
|
|
59475
60800
|
g.glvToken,
|
|
59476
60801
|
g.name,
|
|
59477
60802
|
"glv",
|
|
59478
60803
|
g.longToken,
|
|
59479
60804
|
g.shortToken,
|
|
59480
60805
|
void 0,
|
|
59481
|
-
apy.glvs?.[g.glvToken] ?? apy.glvs?.[
|
|
60806
|
+
apy.glvs?.[g.glvToken] ?? apy.glvs?.[key2]
|
|
59482
60807
|
);
|
|
59483
60808
|
}
|
|
59484
60809
|
if (multicallRetry) {
|
|
@@ -59561,7 +60886,7 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
|
|
|
59561
60886
|
// src/vaults/gmx/fetchUser.ts
|
|
59562
60887
|
var DEFAULT_CAP = 50;
|
|
59563
60888
|
var isBig = (v) => typeof v === "bigint";
|
|
59564
|
-
var
|
|
60889
|
+
var str3 = (v) => isBig(v) ? v.toString() : "0";
|
|
59565
60890
|
var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
|
|
59566
60891
|
const empty = {
|
|
59567
60892
|
chainId,
|
|
@@ -59653,15 +60978,15 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
|
|
|
59653
60978
|
const depositKeys = Array.isArray(keyRes[0]) ? keyRes[0] : [];
|
|
59654
60979
|
const withdrawalKeys = Array.isArray(keyRes[1]) ? keyRes[1] : [];
|
|
59655
60980
|
const readerCalls = [
|
|
59656
|
-
...depositKeys.map((
|
|
60981
|
+
...depositKeys.map((key2) => ({
|
|
59657
60982
|
address: c.reader,
|
|
59658
60983
|
name: "getDeposit",
|
|
59659
|
-
params: [c.dataStore,
|
|
60984
|
+
params: [c.dataStore, key2]
|
|
59660
60985
|
})),
|
|
59661
|
-
...withdrawalKeys.map((
|
|
60986
|
+
...withdrawalKeys.map((key2) => ({
|
|
59662
60987
|
address: c.reader,
|
|
59663
60988
|
name: "getWithdrawal",
|
|
59664
|
-
params: [c.dataStore,
|
|
60989
|
+
params: [c.dataStore, key2]
|
|
59665
60990
|
}))
|
|
59666
60991
|
];
|
|
59667
60992
|
const readerRes = readerCalls.length ? await safe(
|
|
@@ -59676,42 +61001,42 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
|
|
|
59676
61001
|
) : [];
|
|
59677
61002
|
const pendingDeposits = [];
|
|
59678
61003
|
const pendingWithdrawals = [];
|
|
59679
|
-
depositKeys.forEach((
|
|
61004
|
+
depositKeys.forEach((key2, i) => {
|
|
59680
61005
|
const d = readerRes[i];
|
|
59681
61006
|
const a = d?.addresses;
|
|
59682
61007
|
if (!a?.market) return;
|
|
59683
61008
|
const n = d.numbers;
|
|
59684
61009
|
pendingDeposits.push({
|
|
59685
|
-
key,
|
|
61010
|
+
key: key2,
|
|
59686
61011
|
kind: "gm",
|
|
59687
61012
|
account: a.account.toLowerCase(),
|
|
59688
61013
|
receiver: a.receiver.toLowerCase(),
|
|
59689
61014
|
market: a.market.toLowerCase(),
|
|
59690
61015
|
initialLongToken: a.initialLongToken.toLowerCase(),
|
|
59691
61016
|
initialShortToken: a.initialShortToken.toLowerCase(),
|
|
59692
|
-
initialLongTokenAmount:
|
|
59693
|
-
initialShortTokenAmount:
|
|
59694
|
-
minOut:
|
|
59695
|
-
executionFee:
|
|
59696
|
-
updatedAtTime:
|
|
61017
|
+
initialLongTokenAmount: str3(n.initialLongTokenAmount),
|
|
61018
|
+
initialShortTokenAmount: str3(n.initialShortTokenAmount),
|
|
61019
|
+
minOut: str3(n.minMarketTokens),
|
|
61020
|
+
executionFee: str3(n.executionFee),
|
|
61021
|
+
updatedAtTime: str3(n.updatedAtTime)
|
|
59697
61022
|
});
|
|
59698
61023
|
});
|
|
59699
|
-
withdrawalKeys.forEach((
|
|
61024
|
+
withdrawalKeys.forEach((key2, i) => {
|
|
59700
61025
|
const w = readerRes[depositKeys.length + i];
|
|
59701
61026
|
const a = w?.addresses;
|
|
59702
61027
|
if (!a?.market) return;
|
|
59703
61028
|
const n = w.numbers;
|
|
59704
61029
|
pendingWithdrawals.push({
|
|
59705
|
-
key,
|
|
61030
|
+
key: key2,
|
|
59706
61031
|
kind: "gm",
|
|
59707
61032
|
account: a.account.toLowerCase(),
|
|
59708
61033
|
receiver: a.receiver.toLowerCase(),
|
|
59709
61034
|
market: a.market.toLowerCase(),
|
|
59710
|
-
tokenAmount:
|
|
59711
|
-
minLongTokenAmount:
|
|
59712
|
-
minShortTokenAmount:
|
|
59713
|
-
executionFee:
|
|
59714
|
-
updatedAtTime:
|
|
61035
|
+
tokenAmount: str3(n.marketTokenAmount),
|
|
61036
|
+
minLongTokenAmount: str3(n.minLongTokenAmount),
|
|
61037
|
+
minShortTokenAmount: str3(n.minShortTokenAmount),
|
|
61038
|
+
executionFee: str3(n.executionFee),
|
|
61039
|
+
updatedAtTime: str3(n.updatedAtTime)
|
|
59715
61040
|
});
|
|
59716
61041
|
});
|
|
59717
61042
|
const glvDeposits = Array.isArray(glvRes[0]) ? glvRes[0] : [];
|
|
@@ -59728,11 +61053,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
|
|
|
59728
61053
|
glv: a.glv.toLowerCase(),
|
|
59729
61054
|
initialLongToken: a.initialLongToken.toLowerCase(),
|
|
59730
61055
|
initialShortToken: a.initialShortToken.toLowerCase(),
|
|
59731
|
-
initialLongTokenAmount:
|
|
59732
|
-
initialShortTokenAmount:
|
|
59733
|
-
minOut:
|
|
59734
|
-
executionFee:
|
|
59735
|
-
updatedAtTime:
|
|
61056
|
+
initialLongTokenAmount: str3(n.initialLongTokenAmount),
|
|
61057
|
+
initialShortTokenAmount: str3(n.initialShortTokenAmount),
|
|
61058
|
+
minOut: str3(n.minGlvTokens),
|
|
61059
|
+
executionFee: str3(n.executionFee),
|
|
61060
|
+
updatedAtTime: str3(n.updatedAtTime)
|
|
59736
61061
|
});
|
|
59737
61062
|
}
|
|
59738
61063
|
for (const w of glvWithdrawals) {
|
|
@@ -59745,11 +61070,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
|
|
|
59745
61070
|
receiver: a.receiver.toLowerCase(),
|
|
59746
61071
|
market: a.market.toLowerCase(),
|
|
59747
61072
|
glv: a.glv.toLowerCase(),
|
|
59748
|
-
tokenAmount:
|
|
59749
|
-
minLongTokenAmount:
|
|
59750
|
-
minShortTokenAmount:
|
|
59751
|
-
executionFee:
|
|
59752
|
-
updatedAtTime:
|
|
61073
|
+
tokenAmount: str3(n.glvTokenAmount),
|
|
61074
|
+
minLongTokenAmount: str3(n.minLongTokenAmount),
|
|
61075
|
+
minShortTokenAmount: str3(n.minShortTokenAmount),
|
|
61076
|
+
executionFee: str3(n.executionFee),
|
|
61077
|
+
updatedAtTime: str3(n.updatedAtTime)
|
|
59753
61078
|
});
|
|
59754
61079
|
}
|
|
59755
61080
|
return {
|
|
@@ -60633,7 +61958,7 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
|
|
|
60633
61958
|
var TERM_SHEET_SCHEMA_VERSION = 1;
|
|
60634
61959
|
|
|
60635
61960
|
// src/terms/input.ts
|
|
60636
|
-
var
|
|
61961
|
+
var num11 = (v) => {
|
|
60637
61962
|
if (v == null) return void 0;
|
|
60638
61963
|
const n = typeof v === "string" ? Number(v) : v;
|
|
60639
61964
|
return Number.isFinite(n) ? n : void 0;
|
|
@@ -60664,12 +61989,12 @@ function toTermSheetInput(row, ctx = {}) {
|
|
|
60664
61989
|
{
|
|
60665
61990
|
category: v?.category ?? k,
|
|
60666
61991
|
label: v?.label,
|
|
60667
|
-
borrowCollateralFactor:
|
|
60668
|
-
collateralFactor:
|
|
60669
|
-
borrowFactor:
|
|
60670
|
-
liquidationPenalty:
|
|
60671
|
-
closeFactor:
|
|
60672
|
-
targetHealthFactor:
|
|
61992
|
+
borrowCollateralFactor: num11(v?.borrowCollateralFactor),
|
|
61993
|
+
collateralFactor: num11(v?.collateralFactor),
|
|
61994
|
+
borrowFactor: num11(v?.borrowFactor),
|
|
61995
|
+
liquidationPenalty: num11(v?.liquidationPenalty),
|
|
61996
|
+
closeFactor: num11(v?.closeFactor),
|
|
61997
|
+
targetHealthFactor: num11(v?.targetHealthFactor),
|
|
60673
61998
|
collateralDisabled: v?.collateralDisabled === true,
|
|
60674
61999
|
debtDisabled: v?.debtDisabled === true
|
|
60675
62000
|
}
|
|
@@ -60677,11 +62002,11 @@ function toTermSheetInput(row, ctx = {}) {
|
|
|
60677
62002
|
) : void 0;
|
|
60678
62003
|
const rewards = pick2(row, "rewards")?.map((r) => ({
|
|
60679
62004
|
asset: r?.asset,
|
|
60680
|
-
depositRate:
|
|
60681
|
-
variableBorrowRate:
|
|
60682
|
-
stableBorrowRate:
|
|
62005
|
+
depositRate: num11(r?.depositRate),
|
|
62006
|
+
variableBorrowRate: num11(r?.variableBorrowRate),
|
|
62007
|
+
stableBorrowRate: num11(r?.stableBorrowRate),
|
|
60683
62008
|
kind: r?.kind,
|
|
60684
|
-
endsAt:
|
|
62009
|
+
endsAt: num11(r?.endsAt),
|
|
60685
62010
|
claim: r?.claim
|
|
60686
62011
|
}));
|
|
60687
62012
|
return {
|
|
@@ -60694,29 +62019,29 @@ function toTermSheetInput(row, ctx = {}) {
|
|
|
60694
62019
|
"underlyingInfo.asset"
|
|
60695
62020
|
),
|
|
60696
62021
|
underlying: pick2(row, "underlying"),
|
|
60697
|
-
decimals:
|
|
60698
|
-
depositRate:
|
|
60699
|
-
variableBorrowRate:
|
|
60700
|
-
stableBorrowRate:
|
|
60701
|
-
intrinsicYield:
|
|
62022
|
+
decimals: num11(pick2(row, "decimals")),
|
|
62023
|
+
depositRate: num11(pick2(row, "depositRate")),
|
|
62024
|
+
variableBorrowRate: num11(pick2(row, "variableBorrowRate")),
|
|
62025
|
+
stableBorrowRate: num11(pick2(row, "stableBorrowRate")),
|
|
62026
|
+
intrinsicYield: num11(pick2(row, "intrinsicYield")),
|
|
60702
62027
|
rewards,
|
|
60703
62028
|
rateModel: pick2(row, "rateModel"),
|
|
60704
|
-
originationFee:
|
|
60705
|
-
totalDeposits:
|
|
60706
|
-
totalDebt:
|
|
60707
|
-
totalDebtStable:
|
|
60708
|
-
totalLiquidity:
|
|
60709
|
-
borrowLiquidity:
|
|
60710
|
-
totalDepositsUsd:
|
|
60711
|
-
totalDebtUsd:
|
|
60712
|
-
totalLiquidityUsd:
|
|
60713
|
-
utilization:
|
|
60714
|
-
irmTotalDeposits:
|
|
60715
|
-
irmTotalDebt:
|
|
60716
|
-
lockupRatio:
|
|
62029
|
+
originationFee: num11(pick2(row, "originationFee")),
|
|
62030
|
+
totalDeposits: num11(pick2(row, "totalDeposits")),
|
|
62031
|
+
totalDebt: num11(pick2(row, "totalDebt")),
|
|
62032
|
+
totalDebtStable: num11(pick2(row, "totalDebtStable")),
|
|
62033
|
+
totalLiquidity: num11(pick2(row, "totalLiquidity")),
|
|
62034
|
+
borrowLiquidity: num11(pick2(row, "borrowLiquidity")),
|
|
62035
|
+
totalDepositsUsd: num11(pick2(row, "totalDepositsUSD", "totalDepositsUsd")),
|
|
62036
|
+
totalDebtUsd: num11(pick2(row, "totalDebtUSD", "totalDebtUsd")),
|
|
62037
|
+
totalLiquidityUsd: num11(pick2(row, "totalLiquidityUSD", "totalLiquidityUsd")),
|
|
62038
|
+
utilization: num11(pick2(row, "utilization")),
|
|
62039
|
+
irmTotalDeposits: num11(pick2(row, "irmTotalDeposits")),
|
|
62040
|
+
irmTotalDebt: num11(pick2(row, "irmTotalDebt")),
|
|
62041
|
+
lockupRatio: num11(pick2(row, "lockupRatio")),
|
|
60717
62042
|
minBorrow: pick2(row, "minBorrow", "caps.minBorrow") ?? void 0,
|
|
60718
|
-
supplyCap:
|
|
60719
|
-
borrowCap:
|
|
62043
|
+
supplyCap: num11(pick2(row, "supplyCap", "caps.supplyCap")),
|
|
62044
|
+
borrowCap: num11(pick2(row, "borrowCap", "caps.borrowCap")),
|
|
60720
62045
|
debtCeiling: pick2(row, "debtCeiling", "caps.debtCeiling"),
|
|
60721
62046
|
isActive: pick2(row, "isActive", "flags.isActive"),
|
|
60722
62047
|
isFrozen: pick2(row, "isFrozen", "flags.isFrozen"),
|
|
@@ -60742,8 +62067,8 @@ function toTermSheetInput(row, ctx = {}) {
|
|
|
60742
62067
|
"flags.variableBorrowDisabled"
|
|
60743
62068
|
),
|
|
60744
62069
|
config,
|
|
60745
|
-
closeFactor:
|
|
60746
|
-
targetHealthFactor:
|
|
62070
|
+
closeFactor: num11(pick2(row, "closeFactor")),
|
|
62071
|
+
targetHealthFactor: num11(pick2(row, "targetHealthFactor")),
|
|
60747
62072
|
fixedTerm: pick2(row, "fixedTerm") ?? ctx.fixedTerm,
|
|
60748
62073
|
terms: pick2(row, "terms"),
|
|
60749
62074
|
market: resolveMarketDescriptors(row, ctx.market)
|
|
@@ -61655,10 +62980,10 @@ function resolveMinDebt(input) {
|
|
|
61655
62980
|
];
|
|
61656
62981
|
for (const c of candidates) {
|
|
61657
62982
|
if (c == null) continue;
|
|
61658
|
-
const
|
|
61659
|
-
if (
|
|
61660
|
-
if (!/^\d+$/.test(
|
|
61661
|
-
return
|
|
62983
|
+
const str4 = String(c);
|
|
62984
|
+
if (str4 === "0" || str4 === "") continue;
|
|
62985
|
+
if (!/^\d+$/.test(str4)) continue;
|
|
62986
|
+
return str4;
|
|
61662
62987
|
}
|
|
61663
62988
|
return void 0;
|
|
61664
62989
|
}
|
|
@@ -61666,9 +62991,9 @@ function resolveMinCollateral(input) {
|
|
|
61666
62991
|
const m = input.market ?? {};
|
|
61667
62992
|
const raw = m.frankencoin?.minimumCollateral;
|
|
61668
62993
|
if (raw == null) return void 0;
|
|
61669
|
-
const
|
|
61670
|
-
if (
|
|
61671
|
-
return
|
|
62994
|
+
const str4 = String(raw);
|
|
62995
|
+
if (str4 === "0" || str4 === "" || !/^\d+$/.test(str4)) return void 0;
|
|
62996
|
+
return str4;
|
|
61672
62997
|
}
|
|
61673
62998
|
function capUtil(total, cap) {
|
|
61674
62999
|
if (!isNum(cap) || cap <= 0 || !isNum(total)) return void 0;
|
|
@@ -61764,12 +63089,12 @@ function buildModes(input) {
|
|
|
61764
63089
|
const keys = Object.keys(cfg);
|
|
61765
63090
|
if (keys.length <= 1) return void 0;
|
|
61766
63091
|
const out = [];
|
|
61767
|
-
for (const
|
|
61768
|
-
const c = cfg[
|
|
63092
|
+
for (const key2 of keys) {
|
|
63093
|
+
const c = cfg[key2];
|
|
61769
63094
|
if (!c) continue;
|
|
61770
|
-
const isDefault =
|
|
63095
|
+
const isDefault = key2 === "0";
|
|
61771
63096
|
out.push({
|
|
61772
|
-
modeId:
|
|
63097
|
+
modeId: key2,
|
|
61773
63098
|
label: c.label,
|
|
61774
63099
|
isDefault,
|
|
61775
63100
|
entry: isDefault ? void 0 : "user-selected",
|