@1delta/margin-fetcher 0.0.409 → 0.0.410
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/ccip-VK5PCUV6.js +5 -0
- package/dist/{ccip-5UG36BRY.js.map → ccip-VK5PCUV6.js.map} +1 -1
- package/dist/{chunk-SRWUFRRR.js → chunk-YILYOOYB.js} +200 -4
- package/dist/chunk-YILYOOYB.js.map +1 -0
- package/dist/index.d.ts +180 -9
- package/dist/index.js +1689 -288
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/ccip-5UG36BRY.js +0 -5
- package/dist/chunk-SRWUFRRR.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice,
|
|
1
|
+
import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, stringToHex, erc20Abi, 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, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
4
|
+
import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isUsdd, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
|
|
5
5
|
export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
|
|
6
|
-
import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, 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, usddLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, usddConfigFor, usddChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, 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';
|
|
7
7
|
import lodash from 'lodash';
|
|
8
8
|
import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
|
|
9
|
-
import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
|
|
9
|
+
import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
|
|
10
10
|
export { MorphoLensAbi } from '@1delta/abis';
|
|
11
11
|
import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
|
|
12
12
|
import { proxyNativeFetch } from '@1delta/proxy-fetch';
|
|
@@ -7519,6 +7519,9 @@ var getLendersForChain = (c) => {
|
|
|
7519
7519
|
for (const l of inverseLendersByChain(c)) {
|
|
7520
7520
|
lenders.push(l);
|
|
7521
7521
|
}
|
|
7522
|
+
for (const l of usddLendersByChain(c)) {
|
|
7523
|
+
lenders.push(l);
|
|
7524
|
+
}
|
|
7522
7525
|
if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
|
|
7523
7526
|
lenders.push(Lender.TELLER);
|
|
7524
7527
|
}
|
|
@@ -7540,7 +7543,7 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
|
|
|
7540
7543
|
(b) => protocolList.includes(b)
|
|
7541
7544
|
);
|
|
7542
7545
|
return allLenders.filter(
|
|
7543
|
-
(lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER")
|
|
7546
|
+
(lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER") || protocolList.includes(Lender.USDD) && lender?.startsWith("USDD")
|
|
7544
7547
|
);
|
|
7545
7548
|
};
|
|
7546
7549
|
var getAavesForChain = () => {
|
|
@@ -11205,8 +11208,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
|
|
|
11205
11208
|
const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
|
|
11206
11209
|
const ids = Object.keys(brokers);
|
|
11207
11210
|
const out = {};
|
|
11208
|
-
const
|
|
11209
|
-
BROKER_USER_CACHE[
|
|
11211
|
+
const cacheKey6 = `${chainId}:${account.toLowerCase()}`;
|
|
11212
|
+
BROKER_USER_CACHE[cacheKey6] = out;
|
|
11210
11213
|
if (ids.length === 0) return out;
|
|
11211
11214
|
try {
|
|
11212
11215
|
const client = getClient(chainId);
|
|
@@ -13035,7 +13038,7 @@ function normalizeToBytes(input) {
|
|
|
13035
13038
|
return out;
|
|
13036
13039
|
}
|
|
13037
13040
|
function readAddress(bytes, offset, len) {
|
|
13038
|
-
const hex =
|
|
13041
|
+
const hex = toHex2(bytes.subarray(offset, offset + len));
|
|
13039
13042
|
return "0x" + hex;
|
|
13040
13043
|
}
|
|
13041
13044
|
function readUintBE(bytes, offset, len) {
|
|
@@ -13046,7 +13049,7 @@ function readUintBE(bytes, offset, len) {
|
|
|
13046
13049
|
}
|
|
13047
13050
|
return v;
|
|
13048
13051
|
}
|
|
13049
|
-
function
|
|
13052
|
+
function toHex2(arr) {
|
|
13050
13053
|
let s = "";
|
|
13051
13054
|
for (let i = 0; i < arr.length; i++) {
|
|
13052
13055
|
const h = arr[i].toString(16).padStart(2, "0");
|
|
@@ -22915,7 +22918,7 @@ async function fetchTellerMarkets(chainId) {
|
|
|
22915
22918
|
} catch {
|
|
22916
22919
|
return { chainId, pools: [] };
|
|
22917
22920
|
}
|
|
22918
|
-
const
|
|
22921
|
+
const big9 = (i) => {
|
|
22919
22922
|
const r = results[i];
|
|
22920
22923
|
if (typeof r === "bigint") return r;
|
|
22921
22924
|
if (typeof r === "number") return BigInt(r);
|
|
@@ -22929,20 +22932,20 @@ async function fetchTellerMarkets(chainId) {
|
|
|
22929
22932
|
return null;
|
|
22930
22933
|
};
|
|
22931
22934
|
const num9 = (i) => {
|
|
22932
|
-
const b =
|
|
22935
|
+
const b = big9(i);
|
|
22933
22936
|
return b === null ? null : Number(b);
|
|
22934
22937
|
};
|
|
22935
22938
|
const pool0 = pools.map((config, i) => {
|
|
22936
22939
|
const base = i * READS_PER_POOL;
|
|
22937
22940
|
return {
|
|
22938
22941
|
config,
|
|
22939
|
-
available:
|
|
22940
|
-
committed:
|
|
22942
|
+
available: big9(base),
|
|
22943
|
+
committed: big9(base + 1),
|
|
22941
22944
|
minRateBps: num9(base + 2),
|
|
22942
|
-
collateralPerPrincipal:
|
|
22945
|
+
collateralPerPrincipal: big9(base + 3),
|
|
22943
22946
|
maxLoanDuration: num9(base + 4),
|
|
22944
|
-
marketId:
|
|
22945
|
-
totalAssets:
|
|
22947
|
+
marketId: big9(base + 5),
|
|
22948
|
+
totalAssets: big9(base + 6)
|
|
22946
22949
|
};
|
|
22947
22950
|
});
|
|
22948
22951
|
const attByMarket = /* @__PURE__ */ new Map();
|
|
@@ -24175,6 +24178,264 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
24175
24178
|
}
|
|
24176
24179
|
return out;
|
|
24177
24180
|
}
|
|
24181
|
+
var READS_PER_ILK = 4;
|
|
24182
|
+
var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
|
|
24183
|
+
var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
|
|
24184
|
+
async function fetchUsddMarkets(lender, chainId) {
|
|
24185
|
+
const config = usddConfigFor(lender, chainId);
|
|
24186
|
+
const chainData = usddChainData(lender, chainId);
|
|
24187
|
+
const markets = chainData?.markets ?? [];
|
|
24188
|
+
if (!config || markets.length === 0) {
|
|
24189
|
+
return { lender, config, chainData, markets: [] };
|
|
24190
|
+
}
|
|
24191
|
+
const calls = markets.flatMap((m) => {
|
|
24192
|
+
const ilk32 = usddIlkBytes32(m.ilk);
|
|
24193
|
+
return [
|
|
24194
|
+
{ address: config.vat, name: "ilks", params: [ilk32] },
|
|
24195
|
+
{ address: config.jug, name: "ilks", params: [ilk32] },
|
|
24196
|
+
{ address: config.spot, name: "ilks", params: [ilk32] },
|
|
24197
|
+
{ address: m.collToken, name: "balanceOf", params: [m.gemJoin] }
|
|
24198
|
+
];
|
|
24199
|
+
});
|
|
24200
|
+
let results = [];
|
|
24201
|
+
try {
|
|
24202
|
+
results = await multicallRetryUniversal({
|
|
24203
|
+
chain: chainId,
|
|
24204
|
+
calls,
|
|
24205
|
+
abi: markets.flatMap(() => USDD_ABI_PER_READ),
|
|
24206
|
+
allowFailure: true
|
|
24207
|
+
});
|
|
24208
|
+
} catch {
|
|
24209
|
+
return { lender, config, chainData, markets: [] };
|
|
24210
|
+
}
|
|
24211
|
+
const big9 = (v) => {
|
|
24212
|
+
if (typeof v === "bigint") return v;
|
|
24213
|
+
if (typeof v === "number") return BigInt(v);
|
|
24214
|
+
return null;
|
|
24215
|
+
};
|
|
24216
|
+
const field12 = (res, name, idx) => big9(res?.[name] ?? res?.[idx]);
|
|
24217
|
+
const out = markets.map((market, i) => {
|
|
24218
|
+
const base = i * READS_PER_ILK;
|
|
24219
|
+
const vatIlk = results[base];
|
|
24220
|
+
const jugIlk = results[base + 1];
|
|
24221
|
+
const spotIlk = results[base + 2];
|
|
24222
|
+
return {
|
|
24223
|
+
market,
|
|
24224
|
+
Art: field12(vatIlk, "Art", 0),
|
|
24225
|
+
rate: field12(vatIlk, "rate", 1),
|
|
24226
|
+
spot: field12(vatIlk, "spot", 2),
|
|
24227
|
+
line: field12(vatIlk, "line", 3),
|
|
24228
|
+
dust: field12(vatIlk, "dust", 4),
|
|
24229
|
+
duty: field12(jugIlk, "duty", 0),
|
|
24230
|
+
mat: field12(spotIlk, "mat", 1),
|
|
24231
|
+
joinBalance: big9(results[base + 3])
|
|
24232
|
+
};
|
|
24233
|
+
});
|
|
24234
|
+
return { lender, config, chainData, markets: out };
|
|
24235
|
+
}
|
|
24236
|
+
|
|
24237
|
+
// src/lending/public-data/usdd/convertPublic.ts
|
|
24238
|
+
function usddLenderKey(lender, chainId, ilk) {
|
|
24239
|
+
return `${lender}_${chainId}_${ilk}`;
|
|
24240
|
+
}
|
|
24241
|
+
function usddKeyParts(key) {
|
|
24242
|
+
if (!key.startsWith("USDD_")) return void 0;
|
|
24243
|
+
const suffix = key.slice("USDD_".length);
|
|
24244
|
+
const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
|
|
24245
|
+
if (!m) return void 0;
|
|
24246
|
+
return { lender: "USDD", chainId: m[1], ilk: m[2] };
|
|
24247
|
+
}
|
|
24248
|
+
var WAD8 = 1e18;
|
|
24249
|
+
var RAY3 = 1e27;
|
|
24250
|
+
var RAD = 1e45;
|
|
24251
|
+
var YEAR_SECONDS2 = 31536e3;
|
|
24252
|
+
function toHuman4(raw, decimals) {
|
|
24253
|
+
return Number(raw) / 10 ** decimals;
|
|
24254
|
+
}
|
|
24255
|
+
function currencyFor9(address, decimals, symbol, tokens) {
|
|
24256
|
+
const lower3 = address.toLowerCase();
|
|
24257
|
+
return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
|
|
24258
|
+
}
|
|
24259
|
+
function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
|
|
24260
|
+
intrinsicYields: {},
|
|
24261
|
+
lenderRewards: {},
|
|
24262
|
+
loaded: true
|
|
24263
|
+
}, tokens = {}) {
|
|
24264
|
+
const out = {};
|
|
24265
|
+
const cfg = raw?.config;
|
|
24266
|
+
const chainData = raw?.chainData;
|
|
24267
|
+
if (!cfg || !chainData) return out;
|
|
24268
|
+
const debtAddr = cfg.usdd.toLowerCase();
|
|
24269
|
+
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
24270
|
+
const debtToken = tokens[debtAddr];
|
|
24271
|
+
const debtSymbol = debtToken?.symbol ?? "USDD";
|
|
24272
|
+
const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
|
|
24273
|
+
const debtPrice = prices[debtPriceKey] || 1;
|
|
24274
|
+
for (const m of raw.markets ?? []) {
|
|
24275
|
+
const market = m.market;
|
|
24276
|
+
const lenderKey = usddLenderKey(raw.lender, chainId, market.ilk);
|
|
24277
|
+
const collAddr = market.collToken.toLowerCase();
|
|
24278
|
+
const collDecimals = market.collDecimals;
|
|
24279
|
+
const collToken = tokens[collAddr];
|
|
24280
|
+
const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
|
|
24281
|
+
const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
|
|
24282
|
+
const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
|
|
24283
|
+
const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY3 * (Number(m.mat) / RAY3) : 0;
|
|
24284
|
+
const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
|
|
24285
|
+
const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
|
|
24286
|
+
const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
|
|
24287
|
+
const mat = m.mat !== null ? Number(m.mat) / RAY3 : Number(market.mat) / RAY3 || 1.5;
|
|
24288
|
+
const ltv = mat > 0 ? 1 / mat : 0;
|
|
24289
|
+
const chop = market.chop ? Number(market.chop) / WAD8 : 0;
|
|
24290
|
+
const liqPenalty = chop > 1 ? chop - 1 : 0;
|
|
24291
|
+
const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
|
|
24292
|
+
const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY3 * YEAR_SECONDS2 * 100 : 0;
|
|
24293
|
+
const line = m.line !== null ? Number(m.line) / RAD : 0;
|
|
24294
|
+
let borrowLiquidity = Math.max(0, line - totalDebt);
|
|
24295
|
+
const halted = line === 0;
|
|
24296
|
+
const entry = { data: {} };
|
|
24297
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
24298
|
+
entry.data[collUid] = {
|
|
24299
|
+
marketUid: collUid,
|
|
24300
|
+
name: "Collateral " + collSymbol,
|
|
24301
|
+
poolId: market.gemJoin.toLowerCase(),
|
|
24302
|
+
underlying: collAddr,
|
|
24303
|
+
asset: currencyFor9(collAddr, collDecimals, collSymbol, tokens),
|
|
24304
|
+
totalDeposits: totalColl,
|
|
24305
|
+
totalDebtStable: 0,
|
|
24306
|
+
totalDebt: 0,
|
|
24307
|
+
totalLiquidity: totalColl,
|
|
24308
|
+
borrowLiquidity: 0,
|
|
24309
|
+
totalLiquidityUSD: totalColl * collPrice,
|
|
24310
|
+
borrowLiquidityUSD: 0,
|
|
24311
|
+
totalDepositsUSD: totalColl * collPrice,
|
|
24312
|
+
totalDebtStableUSD: 0,
|
|
24313
|
+
totalDebtUSD: 0,
|
|
24314
|
+
utilization: 0,
|
|
24315
|
+
depositRate: 0,
|
|
24316
|
+
variableBorrowRate: 0,
|
|
24317
|
+
stableBorrowRate: 0,
|
|
24318
|
+
intrinsicYield: 0,
|
|
24319
|
+
rewards: void 0,
|
|
24320
|
+
decimals: collDecimals,
|
|
24321
|
+
config: {
|
|
24322
|
+
0: {
|
|
24323
|
+
category: 0,
|
|
24324
|
+
borrowCollateralFactor: ltv,
|
|
24325
|
+
collateralFactor: ltv,
|
|
24326
|
+
borrowFactor: 1,
|
|
24327
|
+
liquidationPenalty: liqPenalty,
|
|
24328
|
+
closeFactor: 1,
|
|
24329
|
+
collateralDisabled: false,
|
|
24330
|
+
debtDisabled: true
|
|
24331
|
+
}
|
|
24332
|
+
},
|
|
24333
|
+
closeFactor: 1,
|
|
24334
|
+
collateralActive: true,
|
|
24335
|
+
borrowingEnabled: false,
|
|
24336
|
+
depositsEnabled: !halted,
|
|
24337
|
+
hasStable: false,
|
|
24338
|
+
isActive: !halted,
|
|
24339
|
+
isFrozen: halted
|
|
24340
|
+
};
|
|
24341
|
+
const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
|
|
24342
|
+
entry.data[loanUid] = {
|
|
24343
|
+
marketUid: loanUid,
|
|
24344
|
+
name: debtSymbol,
|
|
24345
|
+
poolId: cfg.vat.toLowerCase(),
|
|
24346
|
+
underlying: debtAddr,
|
|
24347
|
+
asset: currencyFor9(debtAddr, debtDecimals, debtSymbol, tokens),
|
|
24348
|
+
totalDeposits: 0,
|
|
24349
|
+
totalDebtStable: 0,
|
|
24350
|
+
totalDebt,
|
|
24351
|
+
totalLiquidity: borrowLiquidity,
|
|
24352
|
+
borrowLiquidity,
|
|
24353
|
+
totalLiquidityUSD: borrowLiquidity * debtPrice,
|
|
24354
|
+
borrowLiquidityUSD: borrowLiquidity * debtPrice,
|
|
24355
|
+
totalDepositsUSD: 0,
|
|
24356
|
+
totalDebtStableUSD: 0,
|
|
24357
|
+
totalDebtUSD: totalDebt * debtPrice,
|
|
24358
|
+
utilization: 0,
|
|
24359
|
+
// The earn side is sUSDD (savings provider), not a lending deposit.
|
|
24360
|
+
depositRate: 0,
|
|
24361
|
+
variableBorrowRate: borrowApr,
|
|
24362
|
+
stableBorrowRate: 0,
|
|
24363
|
+
// Governance-set per-ilk stability fee — no utilization curve.
|
|
24364
|
+
rateModel: "protocolSet",
|
|
24365
|
+
intrinsicYield: 0,
|
|
24366
|
+
rewards: void 0,
|
|
24367
|
+
decimals: debtDecimals,
|
|
24368
|
+
config: {
|
|
24369
|
+
0: {
|
|
24370
|
+
category: 0,
|
|
24371
|
+
borrowCollateralFactor: 0,
|
|
24372
|
+
collateralFactor: 0,
|
|
24373
|
+
borrowFactor: 1,
|
|
24374
|
+
liquidationPenalty: liqPenalty,
|
|
24375
|
+
closeFactor: 1,
|
|
24376
|
+
collateralDisabled: true,
|
|
24377
|
+
debtDisabled: halted
|
|
24378
|
+
}
|
|
24379
|
+
},
|
|
24380
|
+
closeFactor: 1,
|
|
24381
|
+
collateralActive: false,
|
|
24382
|
+
borrowingEnabled: !halted,
|
|
24383
|
+
depositsEnabled: false,
|
|
24384
|
+
hasStable: false,
|
|
24385
|
+
variableBorrowDisabled: halted,
|
|
24386
|
+
isActive: !halted,
|
|
24387
|
+
isFrozen: halted
|
|
24388
|
+
};
|
|
24389
|
+
entry.params = {
|
|
24390
|
+
market: {
|
|
24391
|
+
lender: lenderKey,
|
|
24392
|
+
name: marketName,
|
|
24393
|
+
loanDecimals: debtDecimals,
|
|
24394
|
+
collateralDecimals: collDecimals,
|
|
24395
|
+
// The gem join doubles as the market id (marketUid address) — one
|
|
24396
|
+
// adapter per ilk, like River's TroveManager.
|
|
24397
|
+
id: market.gemJoin.toLowerCase(),
|
|
24398
|
+
lltv: m.mat !== null ? m.mat.toString() : market.mat,
|
|
24399
|
+
oracle: market.pip ?? zeroAddress,
|
|
24400
|
+
irm: zeroAddress,
|
|
24401
|
+
collateralAddress: collAddr,
|
|
24402
|
+
loanAddress: debtAddr,
|
|
24403
|
+
// --- USDD descriptor (metadata + live snapshot; consumed by the
|
|
24404
|
+
// calldata builders + worker-api resolvers) ---
|
|
24405
|
+
usdd: {
|
|
24406
|
+
ilk: market.ilk,
|
|
24407
|
+
/** Per-second stability fee (ray string) — live, metadata fallback. */
|
|
24408
|
+
duty: duty.toString(),
|
|
24409
|
+
/** Liquidation ratio (ray string). */
|
|
24410
|
+
mat: m.mat !== null ? m.mat.toString() : market.mat,
|
|
24411
|
+
/** Liquidation penalty multiplier (wad string, Dog.chop). */
|
|
24412
|
+
chop: market.chop,
|
|
24413
|
+
/** Ilk debt ceiling / per-CDP floor (rad strings). */
|
|
24414
|
+
line: m.line !== null ? m.line.toString() : market.line,
|
|
24415
|
+
dust: m.dust !== null ? m.dust.toString() : market.dust,
|
|
24416
|
+
/** Debt accumulator (ray string) — art × rate = debt. */
|
|
24417
|
+
rate: m.rate !== null ? m.rate.toString() : void 0,
|
|
24418
|
+
addresses: {
|
|
24419
|
+
vat: cfg.vat,
|
|
24420
|
+
jug: cfg.jug,
|
|
24421
|
+
spot: cfg.spot,
|
|
24422
|
+
dog: cfg.dog,
|
|
24423
|
+
cdpManager: cfg.cdpManager,
|
|
24424
|
+
proxyActions: cfg.proxyActions,
|
|
24425
|
+
proxyRegistry: cfg.proxyRegistry,
|
|
24426
|
+
usddJoin: cfg.usddJoin,
|
|
24427
|
+
gemJoin: market.gemJoin,
|
|
24428
|
+
clip: market.clip,
|
|
24429
|
+
pip: market.pip
|
|
24430
|
+
}
|
|
24431
|
+
}
|
|
24432
|
+
}
|
|
24433
|
+
};
|
|
24434
|
+
entry.chainId = chainId;
|
|
24435
|
+
out[lenderKey] = entry;
|
|
24436
|
+
}
|
|
24437
|
+
return out;
|
|
24438
|
+
}
|
|
24178
24439
|
|
|
24179
24440
|
// src/lending/public-data/silo-v2/fetchPublic.ts
|
|
24180
24441
|
var BASE_URL2 = "https://api-v3.silo.finance";
|
|
@@ -24785,6 +25046,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
|
|
|
24785
25046
|
if (isTeller(lender)) return await fetchTellerMarkets(chainId);
|
|
24786
25047
|
if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
|
|
24787
25048
|
if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
|
|
25049
|
+
if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
|
|
24788
25050
|
return {};
|
|
24789
25051
|
}
|
|
24790
25052
|
function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
|
|
@@ -24846,6 +25108,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
|
|
|
24846
25108
|
additionalYields,
|
|
24847
25109
|
list
|
|
24848
25110
|
);
|
|
25111
|
+
if (isUsdd(lender))
|
|
25112
|
+
return convertUsddMarketsToResponse(
|
|
25113
|
+
data,
|
|
25114
|
+
chainId,
|
|
25115
|
+
prices,
|
|
25116
|
+
additionalYields,
|
|
25117
|
+
list
|
|
25118
|
+
);
|
|
24849
25119
|
if (isTermMax(lender))
|
|
24850
25120
|
return convertTermMaxMarketsToResponse(
|
|
24851
25121
|
data,
|
|
@@ -25055,6 +25325,7 @@ function lenderApiOnly(lender, chainId) {
|
|
|
25055
25325
|
if (isTeller(lender)) return true;
|
|
25056
25326
|
if (isInverse(lender)) return true;
|
|
25057
25327
|
if (isTermMax(lender)) return true;
|
|
25328
|
+
if (isUsdd(lender)) return true;
|
|
25058
25329
|
return false;
|
|
25059
25330
|
}
|
|
25060
25331
|
function lenderApiWithOnChainFallback(lender, chainId) {
|
|
@@ -26246,15 +26517,132 @@ var buildInverseUserCall = (chainId, lender, account) => {
|
|
|
26246
26517
|
);
|
|
26247
26518
|
return calls;
|
|
26248
26519
|
};
|
|
26249
|
-
var
|
|
26520
|
+
var USDD_CALLS_PER_CDP = 1;
|
|
26521
|
+
var MAX_CDP_WALK = 64;
|
|
26250
26522
|
var CACHE_TTL_MS2 = 5 * 6e4;
|
|
26251
26523
|
var discoveryCache2 = /* @__PURE__ */ new Map();
|
|
26252
26524
|
var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
26253
|
-
var
|
|
26525
|
+
var getCachedUsddCdps = (chainId, account) => {
|
|
26254
26526
|
const hit = discoveryCache2.get(cacheKey2(chainId, account));
|
|
26255
26527
|
if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
|
|
26256
26528
|
return hit;
|
|
26257
26529
|
};
|
|
26530
|
+
var big = (v) => {
|
|
26531
|
+
try {
|
|
26532
|
+
if (typeof v === "bigint") return v;
|
|
26533
|
+
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
26534
|
+
} catch {
|
|
26535
|
+
}
|
|
26536
|
+
return 0n;
|
|
26537
|
+
};
|
|
26538
|
+
var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
|
|
26539
|
+
var buildUsddUserCall = async (chainId, lender, account) => {
|
|
26540
|
+
const cfg = usddConfigFor(lender, chainId);
|
|
26541
|
+
const markets = usddChainData(lender, chainId)?.markets ?? [];
|
|
26542
|
+
const stash = (d) => discoveryCache2.set(cacheKey2(chainId, account), d);
|
|
26543
|
+
if (!cfg || markets.length === 0) {
|
|
26544
|
+
stash({ cdps: [], ilks: [], at: Date.now() });
|
|
26545
|
+
return [];
|
|
26546
|
+
}
|
|
26547
|
+
const curated = new Set(markets.map((m) => m.ilk));
|
|
26548
|
+
const zero = "0x0000000000000000000000000000000000000000";
|
|
26549
|
+
const owners = [];
|
|
26550
|
+
try {
|
|
26551
|
+
const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
|
|
26552
|
+
chain: chainId,
|
|
26553
|
+
abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
|
|
26554
|
+
calls: [
|
|
26555
|
+
{ address: cfg.cdpManager, name: "count", params: [account] },
|
|
26556
|
+
{ address: cfg.cdpManager, name: "first", params: [account] },
|
|
26557
|
+
{ address: cfg.proxyRegistry, name: "proxies", params: [account] }
|
|
26558
|
+
],
|
|
26559
|
+
allowFailure: false
|
|
26560
|
+
});
|
|
26561
|
+
owners.push({ owner: account, count: big(rawCount), cursor: big(rawFirst) });
|
|
26562
|
+
const proxy = String(rawProxy ?? zero);
|
|
26563
|
+
if (proxy.toLowerCase() !== zero) {
|
|
26564
|
+
const [pCount, pFirst] = await multicallRetryUniversal({
|
|
26565
|
+
chain: chainId,
|
|
26566
|
+
abi: UsddCdpManagerAbi,
|
|
26567
|
+
calls: [
|
|
26568
|
+
{ address: cfg.cdpManager, name: "count", params: [proxy] },
|
|
26569
|
+
{ address: cfg.cdpManager, name: "first", params: [proxy] }
|
|
26570
|
+
],
|
|
26571
|
+
allowFailure: false
|
|
26572
|
+
});
|
|
26573
|
+
owners.push({ owner: proxy, count: big(pCount), cursor: big(pFirst) });
|
|
26574
|
+
}
|
|
26575
|
+
} catch {
|
|
26576
|
+
return [];
|
|
26577
|
+
}
|
|
26578
|
+
const live = owners.filter((o) => o.count > 0n && o.cursor !== 0n);
|
|
26579
|
+
if (live.length === 0) {
|
|
26580
|
+
stash({ cdps: [], ilks: [], at: Date.now() });
|
|
26581
|
+
return [];
|
|
26582
|
+
}
|
|
26583
|
+
const cdps = [];
|
|
26584
|
+
try {
|
|
26585
|
+
for (const head of live) {
|
|
26586
|
+
let cursor = head.cursor;
|
|
26587
|
+
const steps = Number(
|
|
26588
|
+
head.count > BigInt(MAX_CDP_WALK) ? MAX_CDP_WALK : head.count
|
|
26589
|
+
);
|
|
26590
|
+
if (head.count > BigInt(MAX_CDP_WALK)) {
|
|
26591
|
+
console.warn(
|
|
26592
|
+
`USDD: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
|
|
26593
|
+
);
|
|
26594
|
+
}
|
|
26595
|
+
for (let i = 0; i < steps && cursor !== 0n; i++) {
|
|
26596
|
+
const [urn, ilk32, link] = await multicallRetryUniversal({
|
|
26597
|
+
chain: chainId,
|
|
26598
|
+
abi: UsddCdpManagerAbi,
|
|
26599
|
+
calls: [
|
|
26600
|
+
{ address: cfg.cdpManager, name: "urns", params: [cursor] },
|
|
26601
|
+
{ address: cfg.cdpManager, name: "ilks", params: [cursor] },
|
|
26602
|
+
{ address: cfg.cdpManager, name: "list", params: [cursor] }
|
|
26603
|
+
],
|
|
26604
|
+
allowFailure: false
|
|
26605
|
+
});
|
|
26606
|
+
let ilk = "";
|
|
26607
|
+
try {
|
|
26608
|
+
ilk = hexToString(ilk32, { size: 32 }).replace(/[\s\0]+$/g, "");
|
|
26609
|
+
} catch {
|
|
26610
|
+
}
|
|
26611
|
+
if (curated.has(ilk)) {
|
|
26612
|
+
cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
|
|
26613
|
+
}
|
|
26614
|
+
cursor = big(field6(link, "next", 1));
|
|
26615
|
+
}
|
|
26616
|
+
}
|
|
26617
|
+
} catch {
|
|
26618
|
+
return [];
|
|
26619
|
+
}
|
|
26620
|
+
const ilks = [...new Set(cdps.map((c) => c.ilk))];
|
|
26621
|
+
stash({ cdps, ilks, at: Date.now() });
|
|
26622
|
+
if (cdps.length === 0) return [];
|
|
26623
|
+
const calls = cdps.map((c) => ({
|
|
26624
|
+
address: cfg.vat,
|
|
26625
|
+
name: "urns",
|
|
26626
|
+
params: [usddIlkBytes32(c.ilk), c.urn]
|
|
26627
|
+
}));
|
|
26628
|
+
for (const ilk of ilks) {
|
|
26629
|
+
calls.push({
|
|
26630
|
+
address: cfg.vat,
|
|
26631
|
+
name: "ilks",
|
|
26632
|
+
params: [usddIlkBytes32(ilk)]
|
|
26633
|
+
});
|
|
26634
|
+
}
|
|
26635
|
+
return calls;
|
|
26636
|
+
};
|
|
26637
|
+
var TELLER_CALLS_PER_BID = 4;
|
|
26638
|
+
var CACHE_TTL_MS3 = 5 * 6e4;
|
|
26639
|
+
var discoveryCache3 = /* @__PURE__ */ new Map();
|
|
26640
|
+
var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
26641
|
+
var getCachedTellerBids = (chainId, account) => {
|
|
26642
|
+
const hit = discoveryCache3.get(cacheKey3(chainId, account));
|
|
26643
|
+
if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
|
|
26644
|
+
return hit;
|
|
26645
|
+
};
|
|
26258
26646
|
var nowSec5 = () => Math.floor(Date.now() / 1e3);
|
|
26259
26647
|
var toBigints = (arr) => {
|
|
26260
26648
|
if (!Array.isArray(arr)) return [];
|
|
@@ -26292,7 +26680,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26292
26680
|
return [];
|
|
26293
26681
|
}
|
|
26294
26682
|
if (ids.length === 0) {
|
|
26295
|
-
|
|
26683
|
+
discoveryCache3.set(cacheKey3(chainId, account), { bids: [], at: Date.now() });
|
|
26296
26684
|
return [];
|
|
26297
26685
|
}
|
|
26298
26686
|
const poolByAddr = /* @__PURE__ */ new Map();
|
|
@@ -26319,7 +26707,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26319
26707
|
const pool = poolByAddr.get(lenderAddr);
|
|
26320
26708
|
if (pool) kept.push({ bidId: id, pool });
|
|
26321
26709
|
});
|
|
26322
|
-
|
|
26710
|
+
discoveryCache3.set(cacheKey3(chainId, account), { bids: kept, at: Date.now() });
|
|
26323
26711
|
if (kept.length === 0) return [];
|
|
26324
26712
|
const ts = nowSec5();
|
|
26325
26713
|
const calls = [];
|
|
@@ -26344,12 +26732,12 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26344
26732
|
return calls;
|
|
26345
26733
|
};
|
|
26346
26734
|
var TERMMAX_CALLS_PER_ACCOUNT = 1;
|
|
26347
|
-
var
|
|
26348
|
-
var
|
|
26349
|
-
var
|
|
26735
|
+
var CACHE_TTL_MS4 = 5 * 6e4;
|
|
26736
|
+
var discoveryCache4 = /* @__PURE__ */ new Map();
|
|
26737
|
+
var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
26350
26738
|
var getCachedTermMaxDiscovery = (chainId, account) => {
|
|
26351
|
-
const hit =
|
|
26352
|
-
if (!hit || Date.now() - hit.at >
|
|
26739
|
+
const hit = discoveryCache4.get(cacheKey4(chainId, account));
|
|
26740
|
+
if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
|
|
26353
26741
|
return hit;
|
|
26354
26742
|
};
|
|
26355
26743
|
var buildTermMaxUserCall = async (chainId, _lender, account) => {
|
|
@@ -26364,11 +26752,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
|
|
|
26364
26752
|
}
|
|
26365
26753
|
}
|
|
26366
26754
|
if (markets.length === 0) {
|
|
26367
|
-
|
|
26755
|
+
discoveryCache4.set(cacheKey4(chainId, account), { markets: [], at: Date.now() });
|
|
26368
26756
|
return [];
|
|
26369
26757
|
}
|
|
26370
26758
|
markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
|
|
26371
|
-
|
|
26759
|
+
discoveryCache4.set(cacheKey4(chainId, account), { markets, at: Date.now() });
|
|
26372
26760
|
return [
|
|
26373
26761
|
{
|
|
26374
26762
|
address: proto.viewer,
|
|
@@ -26401,22 +26789,30 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
|
|
|
26401
26789
|
if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
|
|
26402
26790
|
if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
|
|
26403
26791
|
if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
|
|
26792
|
+
if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
|
|
26404
26793
|
if (isCompoundV3Type(lender))
|
|
26405
26794
|
return buildCompoundV3UserCall(chainId, lender, account);
|
|
26406
26795
|
if (isEulerType(lender))
|
|
26407
|
-
return buildEulerUserCall(
|
|
26408
|
-
|
|
26409
|
-
|
|
26410
|
-
|
|
26411
|
-
|
|
26796
|
+
return buildEulerUserCall(
|
|
26797
|
+
chainId,
|
|
26798
|
+
lender,
|
|
26799
|
+
account,
|
|
26800
|
+
params?.subAccountIndexes
|
|
26801
|
+
);
|
|
26802
|
+
if (isSiloV2Type(lender)) return buildSiloV2UserCall(chainId, lender, account);
|
|
26803
|
+
if (isSiloV3Type(lender)) return buildSiloV3UserCall(chainId, lender, account);
|
|
26412
26804
|
if (isCompoundV2Type(lender))
|
|
26413
26805
|
return buildCompoundV2UserCall(chainId, lender, account);
|
|
26414
|
-
if (isFluid(lender))
|
|
26415
|
-
return buildFluidUserCall(chainId, lender, account);
|
|
26806
|
+
if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
|
|
26416
26807
|
if (isGearboxV3(lender))
|
|
26417
26808
|
return buildGearboxV3UserCall(chainId, lender, account);
|
|
26418
26809
|
if (isDolomite(lender))
|
|
26419
|
-
return buildDolomiteUserCall(
|
|
26810
|
+
return buildDolomiteUserCall(
|
|
26811
|
+
chainId,
|
|
26812
|
+
lender,
|
|
26813
|
+
account,
|
|
26814
|
+
params?.accountNumbers
|
|
26815
|
+
);
|
|
26420
26816
|
return [];
|
|
26421
26817
|
}
|
|
26422
26818
|
function organizeUserQueries(queries) {
|
|
@@ -26429,10 +26825,11 @@ function organizeUserQueries(queries) {
|
|
|
26429
26825
|
const river = queries.filter((q) => isRiver(q.lender));
|
|
26430
26826
|
const teller = queries.filter((q) => isTeller(q.lender));
|
|
26431
26827
|
const termMax = queries.filter((q) => isTermMax(q.lender));
|
|
26432
|
-
|
|
26828
|
+
const usdd = queries.filter((q) => isUsdd(q.lender));
|
|
26829
|
+
if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0)
|
|
26433
26830
|
return queries;
|
|
26434
26831
|
const others = queries.filter(
|
|
26435
|
-
(q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender)
|
|
26832
|
+
(q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isUsdd(q.lender)
|
|
26436
26833
|
);
|
|
26437
26834
|
const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
|
|
26438
26835
|
const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
|
|
@@ -26493,6 +26890,14 @@ function organizeUserQueries(queries) {
|
|
|
26493
26890
|
assets: void 0
|
|
26494
26891
|
});
|
|
26495
26892
|
}
|
|
26893
|
+
if (usdd.length > 0) {
|
|
26894
|
+
result.push({
|
|
26895
|
+
lender: Lender.USDD,
|
|
26896
|
+
account: usdd[0].account,
|
|
26897
|
+
params: usdd.map((p) => p.lender),
|
|
26898
|
+
assets: void 0
|
|
26899
|
+
});
|
|
26900
|
+
}
|
|
26496
26901
|
if (teller.length > 0) {
|
|
26497
26902
|
result.push({
|
|
26498
26903
|
lender: Lender.TELLER,
|
|
@@ -28856,7 +29261,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28856
29261
|
totalCalls
|
|
28857
29262
|
];
|
|
28858
29263
|
};
|
|
28859
|
-
var
|
|
29264
|
+
var WAD9 = 1000000000000000000n;
|
|
28860
29265
|
function toBigInt11(v) {
|
|
28861
29266
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
28862
29267
|
if (typeof v === "bigint") return v;
|
|
@@ -28898,8 +29303,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28898
29303
|
const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
|
|
28899
29304
|
const debtNum = Number(debtStr);
|
|
28900
29305
|
const repoBalance = toBigInt11(balanceResult);
|
|
28901
|
-
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) ||
|
|
28902
|
-
const lentUnits = repoBalance * redemptionValue /
|
|
29306
|
+
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
|
|
29307
|
+
const lentUnits = repoBalance * redemptionValue / WAD9;
|
|
28903
29308
|
const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
|
|
28904
29309
|
const depositsNum = Number(depositsStr);
|
|
28905
29310
|
const posData = {};
|
|
@@ -28976,20 +29381,43 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28976
29381
|
];
|
|
28977
29382
|
};
|
|
28978
29383
|
var nowSec6 = () => Math.floor(Date.now() / 1e3);
|
|
29384
|
+
var DAY_SECONDS = 86400n;
|
|
29385
|
+
var WAD10 = 10n ** 18n;
|
|
28979
29386
|
function sumPreview(positions) {
|
|
28980
29387
|
return positions.reduce((acc, p) => acc + p.previewValue, 0n);
|
|
28981
29388
|
}
|
|
28982
|
-
|
|
28983
|
-
|
|
28984
|
-
|
|
28985
|
-
|
|
28986
|
-
|
|
28987
|
-
|
|
28988
|
-
previewValue
|
|
28989
|
-
|
|
28990
|
-
|
|
29389
|
+
var faceOf = (p) => p.position.principal + p.position.fee;
|
|
29390
|
+
function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
|
|
29391
|
+
return positions.map((p) => {
|
|
29392
|
+
const maturity = Number(p.maturity);
|
|
29393
|
+
const overdue = maturity < now;
|
|
29394
|
+
const face = faceOf(p);
|
|
29395
|
+
const gap = face > p.previewValue ? face - p.previewValue : 0n;
|
|
29396
|
+
const excess = p.previewValue > face ? p.previewValue - face : 0n;
|
|
29397
|
+
return {
|
|
29398
|
+
maturity,
|
|
29399
|
+
kind,
|
|
29400
|
+
principal: p.position.principal.toString(),
|
|
29401
|
+
fee: p.position.fee.toString(),
|
|
29402
|
+
faceValue: face.toString(),
|
|
29403
|
+
previewValue: p.previewValue.toString(),
|
|
29404
|
+
overdue,
|
|
29405
|
+
secondsLate: overdue ? now - maturity : 0,
|
|
29406
|
+
...kind === "borrow" ? {
|
|
29407
|
+
...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
|
|
29408
|
+
// face × penaltyRate × 1 day — what another day of being late adds.
|
|
29409
|
+
latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD10).toString(),
|
|
29410
|
+
latePenaltyApr: penaltyApr
|
|
29411
|
+
} : {
|
|
29412
|
+
...overdue ? {} : { earlyExitCost: gap.toString() },
|
|
29413
|
+
// Deposits carry no penalty: at/after maturity the payout is face.
|
|
29414
|
+
latePenaltyPerDay: "0",
|
|
29415
|
+
latePenaltyApr: 0
|
|
29416
|
+
}
|
|
29417
|
+
};
|
|
29418
|
+
});
|
|
28991
29419
|
}
|
|
28992
|
-
var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
29420
|
+
var getExactlyUserDataConverter = (_lender, chainId, account, meta, requestedLenders) => {
|
|
28993
29421
|
const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
|
|
28994
29422
|
return [
|
|
28995
29423
|
(data) => {
|
|
@@ -28998,6 +29426,44 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28998
29426
|
if (!res || res === "0x" || !Array.isArray(res)) return void 0;
|
|
28999
29427
|
const markets = res;
|
|
29000
29428
|
const now = nowSec6();
|
|
29429
|
+
const enteredCollateral = markets.filter(
|
|
29430
|
+
(c) => c.isCollateral && c.floatingDepositAssets + sumPreview(c.fixedDepositPositions) > 0n
|
|
29431
|
+
);
|
|
29432
|
+
const collateralRow = (c, lenderKey, metaMap) => {
|
|
29433
|
+
const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
|
|
29434
|
+
const collAddr = c.asset.toLowerCase();
|
|
29435
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
29436
|
+
const collMeta = metaMap[collUid];
|
|
29437
|
+
const collDec = collMeta?.asset?.decimals ?? c.decimals;
|
|
29438
|
+
const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
29439
|
+
const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
|
|
29440
|
+
const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
|
|
29441
|
+
const collStr = parseRawAmount(cDeposit.toString(), collDec);
|
|
29442
|
+
const collNum = Number(collStr);
|
|
29443
|
+
return {
|
|
29444
|
+
uid: collUid,
|
|
29445
|
+
usd24h: collNum * collPriceHist,
|
|
29446
|
+
row: {
|
|
29447
|
+
marketUid: collUid,
|
|
29448
|
+
underlying: collAddr,
|
|
29449
|
+
deposits: collStr,
|
|
29450
|
+
debt: "0",
|
|
29451
|
+
debtStable: "0",
|
|
29452
|
+
depositsUSD: collNum * collDisplayPrice,
|
|
29453
|
+
debtUSD: 0,
|
|
29454
|
+
debtStableUSD: 0,
|
|
29455
|
+
depositsUSDOracle: collNum * collOraclePrice,
|
|
29456
|
+
debtUSDOracle: 0,
|
|
29457
|
+
debtStableUSDOracle: 0,
|
|
29458
|
+
stableBorrowRate: "0",
|
|
29459
|
+
collateralEnabled: true,
|
|
29460
|
+
claimableRewards: 0,
|
|
29461
|
+
// The SAME deposit reports as the own-asset row under its own
|
|
29462
|
+
// market key — cross-key aggregation must skip flagged rows.
|
|
29463
|
+
crossCollateral: true
|
|
29464
|
+
}
|
|
29465
|
+
};
|
|
29466
|
+
};
|
|
29001
29467
|
const out = {};
|
|
29002
29468
|
for (const m of markets) {
|
|
29003
29469
|
const lenderKey = exactlyLenderKey(m.market);
|
|
@@ -29023,9 +29489,22 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29023
29489
|
decimals
|
|
29024
29490
|
);
|
|
29025
29491
|
const fixedDebtStr = parseRawAmount(fixedDebtUnits.toString(), decimals);
|
|
29492
|
+
const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
|
|
29026
29493
|
const fixedPositions = [
|
|
29027
|
-
...toDetail(
|
|
29028
|
-
|
|
29494
|
+
...toDetail(
|
|
29495
|
+
m.fixedDepositPositions,
|
|
29496
|
+
"deposit",
|
|
29497
|
+
now,
|
|
29498
|
+
m.penaltyRate,
|
|
29499
|
+
penaltyApr
|
|
29500
|
+
),
|
|
29501
|
+
...toDetail(
|
|
29502
|
+
m.fixedBorrowPositions,
|
|
29503
|
+
"borrow",
|
|
29504
|
+
now,
|
|
29505
|
+
m.penaltyRate,
|
|
29506
|
+
penaltyApr
|
|
29507
|
+
)
|
|
29029
29508
|
];
|
|
29030
29509
|
const posData = {};
|
|
29031
29510
|
let depositsUSD24h = depositsNum * loanPriceHist;
|
|
@@ -29051,6 +29530,11 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29051
29530
|
for (const p of m.fixedBorrowPositions) {
|
|
29052
29531
|
const maturity = Number(p.maturity);
|
|
29053
29532
|
const trancheStr = parseRawAmount(p.previewValue.toString(), decimals);
|
|
29533
|
+
const isMatured = maturity < now;
|
|
29534
|
+
const face = faceOf(p);
|
|
29535
|
+
const faceStr = parseRawAmount(face.toString(), decimals);
|
|
29536
|
+
const discount = isMatured ? "0" : parseRawAmount((face - p.previewValue).toString(), decimals);
|
|
29537
|
+
const penalty = isMatured ? parseRawAmount((p.previewValue - face).toString(), decimals) : "0";
|
|
29054
29538
|
posData[`${loanUid}#${maturity}`] = {
|
|
29055
29539
|
marketUid: loanUid,
|
|
29056
29540
|
underlying: assetAddr,
|
|
@@ -29070,49 +29554,35 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29070
29554
|
loanId: String(maturity),
|
|
29071
29555
|
termId: maturity,
|
|
29072
29556
|
isDynamic: false,
|
|
29557
|
+
// `debt` is the repay-NOW cost (discounted early, penalized when
|
|
29558
|
+
// overdue); `faceValue` is what settling AT maturity costs.
|
|
29073
29559
|
debt: trancheStr,
|
|
29560
|
+
faceValue: faceStr,
|
|
29074
29561
|
maturity,
|
|
29075
29562
|
accruedInterest: parseRawAmount(
|
|
29076
29563
|
p.position.fee.toString(),
|
|
29077
29564
|
decimals
|
|
29078
29565
|
),
|
|
29079
|
-
isMatured
|
|
29566
|
+
isMatured,
|
|
29567
|
+
/** rebate if repaid now, before maturity (never a fee) */
|
|
29568
|
+
earlyRepayDiscount: discount,
|
|
29569
|
+
/** penalty already accrued past maturity */
|
|
29570
|
+
latePenalty: penalty,
|
|
29571
|
+
/** further penalty per day overdue — linear on face */
|
|
29572
|
+
latePenaltyPerDay: parseRawAmount(
|
|
29573
|
+
(face * m.penaltyRate * DAY_SECONDS / WAD10).toString(),
|
|
29574
|
+
decimals
|
|
29575
|
+
),
|
|
29576
|
+
latePenaltyApr: penaltyApr,
|
|
29577
|
+
secondsLate: isMatured ? now - maturity : 0
|
|
29080
29578
|
}
|
|
29081
29579
|
};
|
|
29082
29580
|
}
|
|
29083
|
-
|
|
29084
|
-
|
|
29085
|
-
|
|
29086
|
-
|
|
29087
|
-
|
|
29088
|
-
if (cDeposit === 0n) continue;
|
|
29089
|
-
const collAddr = c.asset.toLowerCase();
|
|
29090
|
-
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
29091
|
-
const collMeta = metaMap[collUid];
|
|
29092
|
-
const collDec = collMeta?.asset?.decimals ?? c.decimals;
|
|
29093
|
-
const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
29094
|
-
const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
|
|
29095
|
-
const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
|
|
29096
|
-
const collStr = parseRawAmount(cDeposit.toString(), collDec);
|
|
29097
|
-
const collNum = Number(collStr);
|
|
29098
|
-
depositsUSD24h += collNum * collPriceHist;
|
|
29099
|
-
posData[collUid] = {
|
|
29100
|
-
marketUid: collUid,
|
|
29101
|
-
underlying: collAddr,
|
|
29102
|
-
deposits: collStr,
|
|
29103
|
-
debt: "0",
|
|
29104
|
-
debtStable: "0",
|
|
29105
|
-
depositsUSD: collNum * collDisplayPrice,
|
|
29106
|
-
debtUSD: 0,
|
|
29107
|
-
debtStableUSD: 0,
|
|
29108
|
-
depositsUSDOracle: collNum * collOraclePrice,
|
|
29109
|
-
debtUSDOracle: 0,
|
|
29110
|
-
debtStableUSDOracle: 0,
|
|
29111
|
-
stableBorrowRate: "0",
|
|
29112
|
-
collateralEnabled: true,
|
|
29113
|
-
claimableRewards: 0
|
|
29114
|
-
};
|
|
29115
|
-
}
|
|
29581
|
+
for (const c of enteredCollateral) {
|
|
29582
|
+
if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
|
|
29583
|
+
const { uid, usd24h, row } = collateralRow(c, lenderKey, metaMap);
|
|
29584
|
+
posData[uid] = row;
|
|
29585
|
+
depositsUSD24h += usd24h;
|
|
29116
29586
|
}
|
|
29117
29587
|
const userData = createMultiAccountTypeUserState(
|
|
29118
29588
|
{
|
|
@@ -29131,12 +29601,41 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29131
29601
|
);
|
|
29132
29602
|
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
29133
29603
|
}
|
|
29604
|
+
if (enteredCollateral.length > 0 && requestedLenders?.length) {
|
|
29605
|
+
for (const req of new Set(
|
|
29606
|
+
requestedLenders.map((l) => l?.toUpperCase())
|
|
29607
|
+
)) {
|
|
29608
|
+
if (!req?.startsWith("EXACTLY_") || out[req]) continue;
|
|
29609
|
+
const metaMap = meta?.[req];
|
|
29610
|
+
if (!metaMap) continue;
|
|
29611
|
+
const posData = {};
|
|
29612
|
+
let depositsUSD24h = 0;
|
|
29613
|
+
for (const c of enteredCollateral) {
|
|
29614
|
+
if (exactlyLenderKey(c.market) === req) continue;
|
|
29615
|
+
const { uid, usd24h, row } = collateralRow(c, req, metaMap);
|
|
29616
|
+
posData[uid] = row;
|
|
29617
|
+
depositsUSD24h += usd24h;
|
|
29618
|
+
}
|
|
29619
|
+
if (Object.keys(posData).length === 0) continue;
|
|
29620
|
+
const userData = createMultiAccountTypeUserState(
|
|
29621
|
+
{
|
|
29622
|
+
chainId,
|
|
29623
|
+
account,
|
|
29624
|
+
lendingPositions: { "0": posData },
|
|
29625
|
+
modes: { "0": 0 }
|
|
29626
|
+
},
|
|
29627
|
+
metaMap,
|
|
29628
|
+
{ "0": { totalDeposits24h: depositsUSD24h, totalDebt24h: 0 } }
|
|
29629
|
+
);
|
|
29630
|
+
if (userData && userData.data.length > 0) out[req] = userData;
|
|
29631
|
+
}
|
|
29632
|
+
}
|
|
29134
29633
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
29135
29634
|
},
|
|
29136
29635
|
expected
|
|
29137
29636
|
];
|
|
29138
29637
|
};
|
|
29139
|
-
var
|
|
29638
|
+
var big2 = (v) => {
|
|
29140
29639
|
try {
|
|
29141
29640
|
if (typeof v === "bigint") return v;
|
|
29142
29641
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29144,7 +29643,7 @@ var big = (v) => {
|
|
|
29144
29643
|
}
|
|
29145
29644
|
return 0n;
|
|
29146
29645
|
};
|
|
29147
|
-
var
|
|
29646
|
+
var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
|
|
29148
29647
|
var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
29149
29648
|
const cfg = liquityConfigFor(lender, chainId);
|
|
29150
29649
|
const branches = liquityBranchesByChain(lender, chainId);
|
|
@@ -29191,29 +29690,29 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29191
29690
|
const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
|
|
29192
29691
|
if (owner !== accountLower) return;
|
|
29193
29692
|
if (!troveData || troveData === "0x") return;
|
|
29194
|
-
const entireDebt =
|
|
29195
|
-
const entireColl =
|
|
29693
|
+
const entireDebt = field7(troveData, "entireDebt", 0);
|
|
29694
|
+
const entireColl = field7(troveData, "entireColl", 1);
|
|
29196
29695
|
if (entireDebt === 0n && entireColl === 0n) return;
|
|
29197
29696
|
const troveInfo = {
|
|
29198
29697
|
troveId: t.troveId,
|
|
29199
29698
|
collIndex: branch.collIndex,
|
|
29200
|
-
annualInterestRate:
|
|
29699
|
+
annualInterestRate: field7(
|
|
29201
29700
|
troveData,
|
|
29202
29701
|
"annualInterestRate",
|
|
29203
29702
|
6
|
|
29204
29703
|
).toString(),
|
|
29205
29704
|
lastInterestRateAdjTime: Number(
|
|
29206
|
-
|
|
29705
|
+
field7(troveData, "lastInterestRateAdjTime", 9)
|
|
29207
29706
|
),
|
|
29208
29707
|
zombie: t.zombie,
|
|
29209
|
-
redistCollGain:
|
|
29210
|
-
redistBoldDebtGain:
|
|
29708
|
+
redistCollGain: field7(troveData, "redistCollGain", 3).toString(),
|
|
29709
|
+
redistBoldDebtGain: field7(
|
|
29211
29710
|
troveData,
|
|
29212
29711
|
"redistBoldDebtGain",
|
|
29213
29712
|
2
|
|
29214
29713
|
).toString(),
|
|
29215
|
-
accruedInterest:
|
|
29216
|
-
accruedBatchManagementFee:
|
|
29714
|
+
accruedInterest: field7(troveData, "accruedInterest", 4).toString(),
|
|
29715
|
+
accruedBatchManagementFee: field7(
|
|
29217
29716
|
troveData,
|
|
29218
29717
|
"accruedBatchManagementFee",
|
|
29219
29718
|
8
|
|
@@ -29265,11 +29764,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29265
29764
|
};
|
|
29266
29765
|
});
|
|
29267
29766
|
const spBase = troves.length * 2;
|
|
29268
|
-
const spDeposit =
|
|
29269
|
-
const spYield =
|
|
29270
|
-
const spCollGain =
|
|
29271
|
-
const spStashed =
|
|
29272
|
-
const collSurplus = branch.collSurplusPool ?
|
|
29767
|
+
const spDeposit = big2(slice2[spBase]);
|
|
29768
|
+
const spYield = big2(slice2[spBase + 1]);
|
|
29769
|
+
const spCollGain = big2(slice2[spBase + 2]);
|
|
29770
|
+
const spStashed = big2(slice2[spBase + 3]);
|
|
29771
|
+
const collSurplus = branch.collSurplusPool ? big2(slice2[spBase + 4]) : 0n;
|
|
29273
29772
|
const spStable = spDeposit + spYield;
|
|
29274
29773
|
const spColl = spCollGain + spStashed + collSurplus;
|
|
29275
29774
|
if (spStable > 0n || spColl > 0n) {
|
|
@@ -29348,7 +29847,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29348
29847
|
expected
|
|
29349
29848
|
];
|
|
29350
29849
|
};
|
|
29351
|
-
var
|
|
29850
|
+
var big3 = (v) => {
|
|
29352
29851
|
try {
|
|
29353
29852
|
if (typeof v === "bigint") return v;
|
|
29354
29853
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29356,7 +29855,7 @@ var big2 = (v) => {
|
|
|
29356
29855
|
}
|
|
29357
29856
|
return 0n;
|
|
29358
29857
|
};
|
|
29359
|
-
var
|
|
29858
|
+
var field8 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
|
|
29360
29859
|
var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
29361
29860
|
const cfg = riverConfigFor(lender, chainId);
|
|
29362
29861
|
const markets = riverChainData(lender, chainId)?.markets ?? [];
|
|
@@ -29368,13 +29867,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29368
29867
|
const debtAddr = cfg.debtToken.toLowerCase();
|
|
29369
29868
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
29370
29869
|
const out = {};
|
|
29371
|
-
const spDeposit =
|
|
29870
|
+
const spDeposit = big3(data[markets.length * RIVER_CALLS_PER_MARKET]);
|
|
29372
29871
|
markets.forEach((market, i) => {
|
|
29373
29872
|
const base = i * RIVER_CALLS_PER_MARKET;
|
|
29374
29873
|
const entire = data[base];
|
|
29375
29874
|
if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
|
|
29376
|
-
const status = Number(
|
|
29377
|
-
const surplus =
|
|
29875
|
+
const status = Number(big3(data[base + 1]));
|
|
29876
|
+
const surplus = big3(data[base + 2]);
|
|
29378
29877
|
const lenderKey = riverLenderKey(lender, chainId, market.index);
|
|
29379
29878
|
const metaMap = meta?.[lenderKey];
|
|
29380
29879
|
if (!metaMap) return;
|
|
@@ -29393,8 +29892,8 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29393
29892
|
const lendingPositions = {};
|
|
29394
29893
|
const modes = {};
|
|
29395
29894
|
const hist = {};
|
|
29396
|
-
const debt =
|
|
29397
|
-
const coll =
|
|
29895
|
+
const debt = field8(entire, "debt", 0);
|
|
29896
|
+
const coll = field8(entire, "coll", 1);
|
|
29398
29897
|
if (status === 1 && (debt > 0n || coll > 0n)) {
|
|
29399
29898
|
const riverInfo = {
|
|
29400
29899
|
index: market.index,
|
|
@@ -29482,7 +29981,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29482
29981
|
expected
|
|
29483
29982
|
];
|
|
29484
29983
|
};
|
|
29485
|
-
var
|
|
29984
|
+
var big4 = (v) => {
|
|
29486
29985
|
try {
|
|
29487
29986
|
if (typeof v === "bigint") return v;
|
|
29488
29987
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29501,20 +30000,20 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29501
30000
|
const dolaAddr = cfg.dola.toLowerCase();
|
|
29502
30001
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
29503
30002
|
const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
|
|
29504
|
-
const dbrBalance =
|
|
29505
|
-
const dbrDeficit =
|
|
30003
|
+
const dbrBalance = big4(data[tailBase]);
|
|
30004
|
+
const dbrDeficit = big4(data[tailBase + 1]);
|
|
29506
30005
|
const dbrSignedRaw = data[tailBase + 2];
|
|
29507
|
-
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n :
|
|
30006
|
+
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big4(dbrSignedRaw);
|
|
29508
30007
|
const out = {};
|
|
29509
30008
|
markets.forEach((market, i) => {
|
|
29510
30009
|
const base = i * INVERSE_CALLS_PER_MARKET;
|
|
29511
|
-
const escrowBal = isFailedCall(data[base]) ? 0n :
|
|
30010
|
+
const escrowBal = isFailedCall(data[base]) ? 0n : big4(data[base]);
|
|
29512
30011
|
const debtRaw = data[base + 1];
|
|
29513
30012
|
if (isFailedCall(debtRaw)) return;
|
|
29514
|
-
const debt =
|
|
30013
|
+
const debt = big4(debtRaw);
|
|
29515
30014
|
if (escrowBal === 0n && debt === 0n) return;
|
|
29516
|
-
const creditLimit = isFailedCall(data[base + 2]) ? 0n :
|
|
29517
|
-
const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n :
|
|
30015
|
+
const creditLimit = isFailedCall(data[base + 2]) ? 0n : big4(data[base + 2]);
|
|
30016
|
+
const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big4(data[base + 3]);
|
|
29518
30017
|
const lenderKey = inverseLenderKey(lender, market.address);
|
|
29519
30018
|
const metaMap = meta?.[lenderKey];
|
|
29520
30019
|
if (!metaMap) return;
|
|
@@ -29597,10 +30096,132 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29597
30096
|
expected
|
|
29598
30097
|
];
|
|
29599
30098
|
};
|
|
30099
|
+
var RAY4 = 10n ** 27n;
|
|
30100
|
+
var big5 = (v) => {
|
|
30101
|
+
try {
|
|
30102
|
+
if (typeof v === "bigint") return v;
|
|
30103
|
+
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
30104
|
+
} catch {
|
|
30105
|
+
}
|
|
30106
|
+
return 0n;
|
|
30107
|
+
};
|
|
30108
|
+
var field9 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
|
|
30109
|
+
var getUsddUserDataConverter = (lender, chainId, account, meta) => {
|
|
30110
|
+
const cfg = usddConfigFor(lender, chainId);
|
|
30111
|
+
const markets = usddChainData(lender, chainId)?.markets ?? [];
|
|
30112
|
+
const discovery = getCachedUsddCdps(chainId, account);
|
|
30113
|
+
const cdps = discovery?.cdps ?? [];
|
|
30114
|
+
const ilks = discovery?.ilks ?? [];
|
|
30115
|
+
const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * USDD_CALLS_PER_CDP + ilks.length : 0;
|
|
30116
|
+
return [
|
|
30117
|
+
(data) => {
|
|
30118
|
+
if (!cfg || expected === 0) return void 0;
|
|
30119
|
+
if (!data || data.length < expected) return void 0;
|
|
30120
|
+
const debtAddr = cfg.usdd.toLowerCase();
|
|
30121
|
+
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
30122
|
+
const rateByIlk = /* @__PURE__ */ new Map();
|
|
30123
|
+
ilks.forEach((ilk, i) => {
|
|
30124
|
+
const res = data[cdps.length * USDD_CALLS_PER_CDP + i];
|
|
30125
|
+
if (!isFailedCall(res)) rateByIlk.set(ilk, field9(res, "rate", 1));
|
|
30126
|
+
});
|
|
30127
|
+
const perMarket = /* @__PURE__ */ new Map();
|
|
30128
|
+
cdps.forEach((cdp, i) => {
|
|
30129
|
+
const res = data[i * USDD_CALLS_PER_CDP];
|
|
30130
|
+
if (isFailedCall(res)) return;
|
|
30131
|
+
const ink = field9(res, "ink", 0);
|
|
30132
|
+
const art = field9(res, "art", 1);
|
|
30133
|
+
const rate = rateByIlk.get(cdp.ilk) ?? RAY4;
|
|
30134
|
+
const debt = art * rate / RAY4;
|
|
30135
|
+
if (ink === 0n && debt === 0n) return;
|
|
30136
|
+
const market = markets.find((m) => m.ilk === cdp.ilk);
|
|
30137
|
+
if (!market) return;
|
|
30138
|
+
const key = usddLenderKey(lender, chainId, cdp.ilk);
|
|
30139
|
+
if (!perMarket.has(key)) perMarket.set(key, { market, positions: [] });
|
|
30140
|
+
perMarket.get(key).positions.push({ cdp, ink, debt });
|
|
30141
|
+
});
|
|
30142
|
+
const out = {};
|
|
30143
|
+
for (const [lenderKey, { market, positions }] of perMarket) {
|
|
30144
|
+
const metaMap = meta?.[lenderKey];
|
|
30145
|
+
if (!metaMap) continue;
|
|
30146
|
+
const collAddr = market.collToken.toLowerCase();
|
|
30147
|
+
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
30148
|
+
const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
|
|
30149
|
+
const collMeta = metaMap[collUid];
|
|
30150
|
+
const loanMeta = metaMap[loanUid];
|
|
30151
|
+
collMeta?.asset?.decimals ?? market.collDecimals;
|
|
30152
|
+
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
30153
|
+
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
30154
|
+
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
30155
|
+
const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
|
|
30156
|
+
const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
|
|
30157
|
+
const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
|
|
30158
|
+
const lendingPositions = {};
|
|
30159
|
+
const modes = {};
|
|
30160
|
+
const hist = {};
|
|
30161
|
+
for (const { cdp, ink, debt } of positions) {
|
|
30162
|
+
const collStr = parseRawAmount(ink.toString(), 18);
|
|
30163
|
+
const collNum = Number(collStr);
|
|
30164
|
+
const debtStr = parseRawAmount(debt.toString(), debtDecimals);
|
|
30165
|
+
const debtNum = Number(debtStr);
|
|
30166
|
+
const usddInfo = { ...cdp };
|
|
30167
|
+
lendingPositions[cdp.cdpId] = {
|
|
30168
|
+
[collUid]: {
|
|
30169
|
+
marketUid: collUid,
|
|
30170
|
+
underlying: collAddr,
|
|
30171
|
+
deposits: collStr,
|
|
30172
|
+
debt: "0",
|
|
30173
|
+
debtStable: "0",
|
|
30174
|
+
depositsUSD: collNum * collDisplay,
|
|
30175
|
+
debtUSD: 0,
|
|
30176
|
+
debtStableUSD: 0,
|
|
30177
|
+
depositsUSDOracle: collNum * collOracle,
|
|
30178
|
+
debtUSDOracle: 0,
|
|
30179
|
+
debtStableUSDOracle: 0,
|
|
30180
|
+
stableBorrowRate: "0",
|
|
30181
|
+
collateralEnabled: true,
|
|
30182
|
+
claimableRewards: 0
|
|
30183
|
+
},
|
|
30184
|
+
[loanUid]: {
|
|
30185
|
+
marketUid: loanUid,
|
|
30186
|
+
underlying: debtAddr,
|
|
30187
|
+
deposits: "0",
|
|
30188
|
+
debt: debtStr,
|
|
30189
|
+
debtStable: "0",
|
|
30190
|
+
depositsUSD: 0,
|
|
30191
|
+
debtUSD: debtNum * loanDisplay,
|
|
30192
|
+
debtStableUSD: 0,
|
|
30193
|
+
depositsUSDOracle: 0,
|
|
30194
|
+
debtUSDOracle: debtNum * loanOracle,
|
|
30195
|
+
debtStableUSDOracle: 0,
|
|
30196
|
+
stableBorrowRate: "0",
|
|
30197
|
+
collateralEnabled: false,
|
|
30198
|
+
claimableRewards: 0,
|
|
30199
|
+
usddInfo
|
|
30200
|
+
}
|
|
30201
|
+
};
|
|
30202
|
+
modes[cdp.cdpId] = 0;
|
|
30203
|
+
hist[cdp.cdpId] = {
|
|
30204
|
+
totalDeposits24h: collNum * collHist,
|
|
30205
|
+
totalDebt24h: debtNum * loanHist
|
|
30206
|
+
};
|
|
30207
|
+
}
|
|
30208
|
+
if (Object.keys(lendingPositions).length === 0) continue;
|
|
30209
|
+
const userData = createMultiAccountTypeUserState(
|
|
30210
|
+
{ chainId, account, lendingPositions, modes },
|
|
30211
|
+
metaMap,
|
|
30212
|
+
hist
|
|
30213
|
+
);
|
|
30214
|
+
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
30215
|
+
}
|
|
30216
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
30217
|
+
},
|
|
30218
|
+
expected
|
|
30219
|
+
];
|
|
30220
|
+
};
|
|
29600
30221
|
|
|
29601
30222
|
// src/lending/user-data/teller/userCallParse.ts
|
|
29602
30223
|
var nowSec7 = () => Math.floor(Date.now() / 1e3);
|
|
29603
|
-
var
|
|
30224
|
+
var big6 = (v) => {
|
|
29604
30225
|
try {
|
|
29605
30226
|
if (typeof v === "bigint") return v;
|
|
29606
30227
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29608,7 +30229,7 @@ var big4 = (v) => {
|
|
|
29608
30229
|
}
|
|
29609
30230
|
return 0n;
|
|
29610
30231
|
};
|
|
29611
|
-
var
|
|
30232
|
+
var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
|
|
29612
30233
|
var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
29613
30234
|
const discovery = getCachedTellerBids(chainId, account);
|
|
29614
30235
|
const kept = discovery?.bids ?? [];
|
|
@@ -29622,7 +30243,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29622
30243
|
const base = i * TELLER_CALLS_PER_BID;
|
|
29623
30244
|
const bidRes = data[base];
|
|
29624
30245
|
const owed = data[base + 1];
|
|
29625
|
-
const collAmount =
|
|
30246
|
+
const collAmount = big6(data[base + 2]);
|
|
29626
30247
|
const defaulted = !!data[base + 3];
|
|
29627
30248
|
if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
|
|
29628
30249
|
const pool = b.pool;
|
|
@@ -29643,17 +30264,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29643
30264
|
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
29644
30265
|
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
29645
30266
|
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
29646
|
-
const owedPrincipal =
|
|
29647
|
-
const owedInterest =
|
|
30267
|
+
const owedPrincipal = big6(field10(owed, "principal", 0));
|
|
30268
|
+
const owedInterest = big6(field10(owed, "interest", 1));
|
|
29648
30269
|
const owedTotal = owedPrincipal + owedInterest;
|
|
29649
30270
|
if (owedTotal === 0n && collAmount === 0n) return;
|
|
29650
|
-
const loanDetails =
|
|
29651
|
-
const terms =
|
|
30271
|
+
const loanDetails = field10(bidRes, "loanDetails", 5);
|
|
30272
|
+
const terms = field10(bidRes, "terms", 6);
|
|
29652
30273
|
const acceptedTs = Number(
|
|
29653
|
-
|
|
30274
|
+
big6(field10(loanDetails, "acceptedTimestamp", 4))
|
|
29654
30275
|
);
|
|
29655
|
-
const loanDuration = Number(
|
|
29656
|
-
const aprBps = Number(
|
|
30276
|
+
const loanDuration = Number(big6(field10(loanDetails, "loanDuration", 6)));
|
|
30277
|
+
const aprBps = Number(big6(field10(terms, "APR", 2)));
|
|
29657
30278
|
const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
|
|
29658
30279
|
const isMatured = defaulted || maturity !== void 0 && maturity < now;
|
|
29659
30280
|
const collStr = parseRawAmount(collAmount.toString(), collDecimals);
|
|
@@ -29751,7 +30372,7 @@ function toBigInt12(v) {
|
|
|
29751
30372
|
return 0n;
|
|
29752
30373
|
}
|
|
29753
30374
|
}
|
|
29754
|
-
function
|
|
30375
|
+
function field11(res, name, index) {
|
|
29755
30376
|
if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
|
|
29756
30377
|
return res[name];
|
|
29757
30378
|
}
|
|
@@ -29759,18 +30380,18 @@ function field9(res, name, index) {
|
|
|
29759
30380
|
return void 0;
|
|
29760
30381
|
}
|
|
29761
30382
|
function parsePosition(res) {
|
|
29762
|
-
const ftBalance = toBigInt12(
|
|
29763
|
-
const xtBalance = toBigInt12(
|
|
29764
|
-
const rawGts =
|
|
30383
|
+
const ftBalance = toBigInt12(field11(res, "ftBalance", 2));
|
|
30384
|
+
const xtBalance = toBigInt12(field11(res, "xtBalance", 3));
|
|
30385
|
+
const rawGts = field11(res, "gtInfo", 4);
|
|
29765
30386
|
const gts = [];
|
|
29766
30387
|
if (Array.isArray(rawGts)) {
|
|
29767
30388
|
for (const g of rawGts) {
|
|
29768
|
-
const loanId = toBigInt12(
|
|
30389
|
+
const loanId = toBigInt12(field11(g, "loanId", 0));
|
|
29769
30390
|
if (loanId === 0n) continue;
|
|
29770
30391
|
gts.push({
|
|
29771
30392
|
loanId: loanId.toString(),
|
|
29772
|
-
collateralAmt: toBigInt12(
|
|
29773
|
-
debtAmt: toBigInt12(
|
|
30393
|
+
collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
|
|
30394
|
+
debtAmt: toBigInt12(field11(g, "debtAmt", 2))
|
|
29774
30395
|
});
|
|
29775
30396
|
}
|
|
29776
30397
|
}
|
|
@@ -29940,7 +30561,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
29940
30561
|
if (isTerm(lender))
|
|
29941
30562
|
return getTermUserDataConverter(lender, chainId, account, meta);
|
|
29942
30563
|
if (isExactly(lender))
|
|
29943
|
-
return getExactlyUserDataConverter(lender, chainId, account, meta);
|
|
30564
|
+
return getExactlyUserDataConverter(lender, chainId, account, meta, params);
|
|
29944
30565
|
if (isLiquityFamily(lender))
|
|
29945
30566
|
return getLiquityUserDataConverter(lender, chainId, account, meta);
|
|
29946
30567
|
if (isRiver(lender))
|
|
@@ -29951,6 +30572,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
29951
30572
|
return getTermMaxUserDataConverter(lender, chainId, account, meta);
|
|
29952
30573
|
if (isInverse(lender))
|
|
29953
30574
|
return getInverseUserDataConverter(lender, chainId, account, meta);
|
|
30575
|
+
if (isUsdd(lender))
|
|
30576
|
+
return getUsddUserDataConverter(lender, chainId, account, meta);
|
|
29954
30577
|
if (isCompoundV3Type(lender))
|
|
29955
30578
|
return getCompoundV3UserDataConverter(
|
|
29956
30579
|
lender,
|
|
@@ -30063,7 +30686,7 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
|
|
|
30063
30686
|
};
|
|
30064
30687
|
|
|
30065
30688
|
// src/utils/rpcCall.ts
|
|
30066
|
-
var
|
|
30689
|
+
var multicall3Abi2 = [
|
|
30067
30690
|
{
|
|
30068
30691
|
type: "function",
|
|
30069
30692
|
name: "aggregate3",
|
|
@@ -30139,7 +30762,7 @@ function createMulticallRpcCall(preparedCalls, multicallAddress, batchSize = MUL
|
|
|
30139
30762
|
};
|
|
30140
30763
|
});
|
|
30141
30764
|
const multicallData = encodeFunctionData({
|
|
30142
|
-
abi:
|
|
30765
|
+
abi: multicall3Abi2,
|
|
30143
30766
|
functionName: "aggregate3",
|
|
30144
30767
|
args: [aggregate3Calls]
|
|
30145
30768
|
});
|
|
@@ -34550,6 +35173,7 @@ var getAbi2 = (lender) => {
|
|
|
34550
35173
|
return [...TellerV2Abi, ...TellerCollateralManagerAbi];
|
|
34551
35174
|
if (isInverse(lender))
|
|
34552
35175
|
return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
|
|
35176
|
+
if (isUsdd(lender)) return [...UsddVatAbi];
|
|
34553
35177
|
if (isInit(lender)) return InitLensAbi;
|
|
34554
35178
|
if (isEulerType(lender)) return accountLensAbi;
|
|
34555
35179
|
if (isCompoundV2Type(lender))
|
|
@@ -35106,7 +35730,7 @@ var MORPHO_API_CHAIN_IDS = {
|
|
|
35106
35730
|
[Chain.UNICHAIN]: 130
|
|
35107
35731
|
};
|
|
35108
35732
|
var FETCH_TIMEOUT_MS = 3e3;
|
|
35109
|
-
var
|
|
35733
|
+
var CACHE_TTL_MS5 = 2e3;
|
|
35110
35734
|
var buildSubgraphQuery = (account) => `
|
|
35111
35735
|
{
|
|
35112
35736
|
account(id: "${account.toLowerCase()}") {
|
|
@@ -35161,11 +35785,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
|
|
|
35161
35785
|
}
|
|
35162
35786
|
var inflight = /* @__PURE__ */ new Map();
|
|
35163
35787
|
var resolved = /* @__PURE__ */ new Map();
|
|
35164
|
-
function
|
|
35788
|
+
function cacheKey5(chainId, account) {
|
|
35165
35789
|
return `${chainId}:${account.toLowerCase()}`;
|
|
35166
35790
|
}
|
|
35167
35791
|
async function dedupedFetch(chainId, account, loader) {
|
|
35168
|
-
const key =
|
|
35792
|
+
const key = cacheKey5(chainId, account);
|
|
35169
35793
|
const now = Date.now();
|
|
35170
35794
|
const cached = resolved.get(key);
|
|
35171
35795
|
if (cached && cached.expiresAt > now) {
|
|
@@ -35174,7 +35798,7 @@ async function dedupedFetch(chainId, account, loader) {
|
|
|
35174
35798
|
const existing = inflight.get(key);
|
|
35175
35799
|
if (existing) return existing;
|
|
35176
35800
|
const promise = loader().then((value) => {
|
|
35177
|
-
resolved.set(key, { value, expiresAt: Date.now() +
|
|
35801
|
+
resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
|
|
35178
35802
|
return value;
|
|
35179
35803
|
}).finally(() => {
|
|
35180
35804
|
inflight.delete(key);
|
|
@@ -35306,8 +35930,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
|
|
|
35306
35930
|
return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
|
|
35307
35931
|
}
|
|
35308
35932
|
function calculateWeightedAprs(items) {
|
|
35309
|
-
const wa = (
|
|
35310
|
-
items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[
|
|
35933
|
+
const wa = (field12, weightField) => calculateWeightedAverage(
|
|
35934
|
+
items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field12], weight: Math.abs(i[weightField]) }))
|
|
35311
35935
|
);
|
|
35312
35936
|
return {
|
|
35313
35937
|
apr: wa("apr", "nav"),
|
|
@@ -36577,8 +37201,8 @@ var rswethFetcher = {
|
|
|
36577
37201
|
};
|
|
36578
37202
|
|
|
36579
37203
|
// src/yields/intrinsic/annualizeRate.ts
|
|
36580
|
-
var
|
|
36581
|
-
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (
|
|
37204
|
+
var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
|
|
37205
|
+
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS3 / elapsedSeconds) * 100;
|
|
36582
37206
|
var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
|
|
36583
37207
|
const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
|
|
36584
37208
|
return annualizeGrowthPercent(growth, elapsedSeconds);
|
|
@@ -37045,8 +37669,8 @@ var stKaiaFetcher = {
|
|
|
37045
37669
|
// src/yields/intrinsic/fetchers/lista.ts
|
|
37046
37670
|
var HISTORY_URL = "https://api.lista.org/api/datachart/history";
|
|
37047
37671
|
var SLISBNB = "Lista Staked BNB::slisBNB";
|
|
37048
|
-
var
|
|
37049
|
-
var LOOKBACK_SECONDS = 14 *
|
|
37672
|
+
var DAY_SECONDS2 = 86400;
|
|
37673
|
+
var LOOKBACK_SECONDS = 14 * DAY_SECONDS2;
|
|
37050
37674
|
var TIMEOUT_MS = 8e3;
|
|
37051
37675
|
var slisBnbFetcher = {
|
|
37052
37676
|
label: "SLISBNB",
|
|
@@ -37620,7 +38244,7 @@ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
|
|
|
37620
38244
|
var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
|
|
37621
38245
|
var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
|
|
37622
38246
|
var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
|
|
37623
|
-
var
|
|
38247
|
+
var YEAR_SECONDS4 = 31536000n;
|
|
37624
38248
|
var ONE_E186 = 10n ** 18n;
|
|
37625
38249
|
var SFRXETH_KEY = "SFRXETH";
|
|
37626
38250
|
var SFRXUSD_KEY = "SFRXUSD";
|
|
@@ -37720,7 +38344,7 @@ var fetchSfrxEthAprOnChain = async () => {
|
|
|
37720
38344
|
const window = BigInt(cycleEnd) - BigInt(lastSync);
|
|
37721
38345
|
if (window <= 0n || totalAssets === 0n) return 0;
|
|
37722
38346
|
const perSecond = lastRewardAmount / window;
|
|
37723
|
-
return Number(perSecond *
|
|
38347
|
+
return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / totalAssets) / 1e16;
|
|
37724
38348
|
};
|
|
37725
38349
|
var fetchSfrxEthApr = async () => {
|
|
37726
38350
|
try {
|
|
@@ -37752,7 +38376,7 @@ var fetchFraxSavingsAprs = async () => {
|
|
|
37752
38376
|
const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
|
|
37753
38377
|
const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
|
|
37754
38378
|
const perSecond = uncapped < cap ? uncapped : cap;
|
|
37755
|
-
return Number(perSecond *
|
|
38379
|
+
return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / storedTotalAssets) / 1e16;
|
|
37756
38380
|
};
|
|
37757
38381
|
return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
|
|
37758
38382
|
};
|
|
@@ -39380,8 +40004,8 @@ var hastraPrimeFetcher = {
|
|
|
39380
40004
|
return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
|
|
39381
40005
|
}
|
|
39382
40006
|
};
|
|
39383
|
-
var
|
|
39384
|
-
var
|
|
40007
|
+
var RAY5 = 10n ** 27n;
|
|
40008
|
+
var YEAR_SECONDS5 = 31536e3;
|
|
39385
40009
|
var SPARK_VAULTS_V2 = [
|
|
39386
40010
|
{
|
|
39387
40011
|
chainId: Chain.ETHEREUM_MAINNET,
|
|
@@ -39457,9 +40081,9 @@ var SSR_ABI = [
|
|
|
39457
40081
|
}
|
|
39458
40082
|
];
|
|
39459
40083
|
var aprFromVsr = (vsr) => {
|
|
39460
|
-
if (vsr <=
|
|
39461
|
-
const perSecond = Number(vsr -
|
|
39462
|
-
return perSecond *
|
|
40084
|
+
if (vsr <= RAY5) return 0;
|
|
40085
|
+
const perSecond = Number(vsr - RAY5) / 1e27;
|
|
40086
|
+
return perSecond * YEAR_SECONDS5 * 100;
|
|
39463
40087
|
};
|
|
39464
40088
|
var chainsOf = (vaults) => [
|
|
39465
40089
|
...new Set(vaults.map((v) => v.chainId))
|
|
@@ -39478,7 +40102,7 @@ var fetchChain = async (chainId, vaults) => {
|
|
|
39478
40102
|
const out = {};
|
|
39479
40103
|
vaults.forEach((v, i) => {
|
|
39480
40104
|
const vsr = results[i];
|
|
39481
|
-
if (typeof vsr !== "bigint" || vsr <
|
|
40105
|
+
if (typeof vsr !== "bigint" || vsr < RAY5) return;
|
|
39482
40106
|
const apr = aprFromVsr(vsr);
|
|
39483
40107
|
out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
|
|
39484
40108
|
if (v.assetGroup) out[v.assetGroup] = apr;
|
|
@@ -39492,7 +40116,7 @@ var fetchSusdcApr = async () => {
|
|
|
39492
40116
|
calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
|
|
39493
40117
|
allowFailure: false
|
|
39494
40118
|
});
|
|
39495
|
-
if (typeof ssr !== "bigint" || ssr <
|
|
40119
|
+
if (typeof ssr !== "bigint" || ssr < RAY5) {
|
|
39496
40120
|
throw new Error("Spark sUSDC: unreadable ssr()");
|
|
39497
40121
|
}
|
|
39498
40122
|
const apr = aprFromVsr(ssr);
|
|
@@ -39551,9 +40175,9 @@ var SUSDP_VAULTS = [
|
|
|
39551
40175
|
address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
|
|
39552
40176
|
}
|
|
39553
40177
|
];
|
|
39554
|
-
var
|
|
40178
|
+
var YEAR_SECONDS6 = 31536e3;
|
|
39555
40179
|
var BASE_27 = 1e27;
|
|
39556
|
-
var aprFromRate = (rate) => Number(rate) / BASE_27 *
|
|
40180
|
+
var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS6 * 100;
|
|
39557
40181
|
var SUSDP_KEY = "SUSDP";
|
|
39558
40182
|
var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
|
|
39559
40183
|
var parallelFetcher = {
|
|
@@ -39716,7 +40340,9 @@ var reProtocolFetcher = {
|
|
|
39716
40340
|
var USD3_KEY = "3JANE::USD3";
|
|
39717
40341
|
var SUSD3_KEY = "3JANE::sUSD3";
|
|
39718
40342
|
var USD3_GROUP_KEY = "3Jane USD3::USD3";
|
|
39719
|
-
var SUSD3_GROUP_KEY = "3Jane Staked USD3::
|
|
40343
|
+
var SUSD3_GROUP_KEY = "3Jane Staked USD3::sUSD3";
|
|
40344
|
+
var USD3_LEGACY_GROUP_KEY = "USD3::USD3";
|
|
40345
|
+
var SUSD3_LEGACY_GROUP_KEY = "sUSD3::sUSD3";
|
|
39720
40346
|
var USD3_POOL = "f8cd444e-d99f-4132-b234-fd3482bf8806";
|
|
39721
40347
|
var SUSD3_POOL = "a99bb965-ebaa-4d98-9ed2-fa18de52c605";
|
|
39722
40348
|
var threeJaneFetcher = {
|
|
@@ -39731,11 +40357,13 @@ var threeJaneFetcher = {
|
|
|
39731
40357
|
const apr = apyToAprPercent(usd3.value);
|
|
39732
40358
|
out[USD3_KEY] = apr;
|
|
39733
40359
|
out[USD3_GROUP_KEY] = apr;
|
|
40360
|
+
out[USD3_LEGACY_GROUP_KEY] = apr;
|
|
39734
40361
|
}
|
|
39735
40362
|
if (susd3.status === "fulfilled") {
|
|
39736
40363
|
const apr = apyToAprPercent(susd3.value);
|
|
39737
40364
|
out[SUSD3_KEY] = apr;
|
|
39738
40365
|
out[SUSD3_GROUP_KEY] = apr;
|
|
40366
|
+
out[SUSD3_LEGACY_GROUP_KEY] = apr;
|
|
39739
40367
|
}
|
|
39740
40368
|
if (Object.keys(out).length === 0) {
|
|
39741
40369
|
throw new Error("3Jane: DefiLlama returned no apy for either pool");
|
|
@@ -39771,7 +40399,7 @@ var toriFetcher = {
|
|
|
39771
40399
|
};
|
|
39772
40400
|
var CHAIN_ID8 = Chain.ETHEREUM_MAINNET;
|
|
39773
40401
|
var SNUSD = "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313";
|
|
39774
|
-
var
|
|
40402
|
+
var YEAR_SECONDS7 = 31536000n;
|
|
39775
40403
|
var ONE_E187 = 10n ** 18n;
|
|
39776
40404
|
var SNUSD_KEY = "SNUSD";
|
|
39777
40405
|
var SNUSD_GROUP_KEY = "Staked NUSD::sNUSD";
|
|
@@ -39823,7 +40451,7 @@ var fetchSnusdAprOnChain = async () => {
|
|
|
39823
40451
|
const window = elapsed > vestingPeriod ? elapsed : vestingPeriod;
|
|
39824
40452
|
if (window <= 0n) return 0;
|
|
39825
40453
|
const perSecond = vestingAmount / window;
|
|
39826
|
-
return Number(perSecond *
|
|
40454
|
+
return Number(perSecond * YEAR_SECONDS7 * ONE_E187 / totalAssets) / 1e16;
|
|
39827
40455
|
};
|
|
39828
40456
|
var snusdFetcher = {
|
|
39829
40457
|
label: "SNUSD",
|
|
@@ -39836,8 +40464,179 @@ var snusdFetcher = {
|
|
|
39836
40464
|
};
|
|
39837
40465
|
}
|
|
39838
40466
|
};
|
|
39839
|
-
var
|
|
39840
|
-
var
|
|
40467
|
+
var CHAIN_ID9 = Chain.ETHEREUM_MAINNET;
|
|
40468
|
+
var APYUSD = "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a";
|
|
40469
|
+
var APYX_LINEAR_VEST = "0x0d62b4cc02b4b51ed19ddf41d7a7979cf394c99f";
|
|
40470
|
+
var APYX_DISCOVER_URL = "https://api.apyx.fi/v1/rewards/seasons/2/discover";
|
|
40471
|
+
var APYX_DEFILLAMA_POOL = "cb6139f9-4a68-4efd-8245-0312a92aee55";
|
|
40472
|
+
var YEAR_SECONDS8 = 31536000n;
|
|
40473
|
+
var ONE_E188 = 10n ** 18n;
|
|
40474
|
+
var APYUSD_KEY = "APYUSD";
|
|
40475
|
+
var APYUSD_GROUP_KEY = "apyUSD::APYUSD";
|
|
40476
|
+
var APYUSD_LEGACY_GROUP_KEY = "apyUSD::apyUSD";
|
|
40477
|
+
var APYX_READ_ABI = [
|
|
40478
|
+
{
|
|
40479
|
+
name: "totalAssets",
|
|
40480
|
+
type: "function",
|
|
40481
|
+
stateMutability: "view",
|
|
40482
|
+
inputs: [],
|
|
40483
|
+
outputs: [{ type: "uint256" }]
|
|
40484
|
+
},
|
|
40485
|
+
{
|
|
40486
|
+
name: "unvestedAmount",
|
|
40487
|
+
type: "function",
|
|
40488
|
+
stateMutability: "view",
|
|
40489
|
+
inputs: [],
|
|
40490
|
+
outputs: [{ type: "uint256" }]
|
|
40491
|
+
},
|
|
40492
|
+
{
|
|
40493
|
+
name: "vestingPeriodRemaining",
|
|
40494
|
+
type: "function",
|
|
40495
|
+
stateMutability: "view",
|
|
40496
|
+
inputs: [],
|
|
40497
|
+
outputs: [{ type: "uint256" }]
|
|
40498
|
+
}
|
|
40499
|
+
];
|
|
40500
|
+
var fetchApyusdAprOnChain = async () => {
|
|
40501
|
+
const [totalAssets, unvested, periodRemaining] = await multicallRetryUniversal({
|
|
40502
|
+
chain: CHAIN_ID9,
|
|
40503
|
+
abi: APYX_READ_ABI,
|
|
40504
|
+
calls: [
|
|
40505
|
+
{ address: APYUSD, name: "totalAssets", params: [] },
|
|
40506
|
+
{ address: APYX_LINEAR_VEST, name: "unvestedAmount", params: [] },
|
|
40507
|
+
{
|
|
40508
|
+
address: APYX_LINEAR_VEST,
|
|
40509
|
+
name: "vestingPeriodRemaining",
|
|
40510
|
+
params: []
|
|
40511
|
+
}
|
|
40512
|
+
],
|
|
40513
|
+
allowFailure: false
|
|
40514
|
+
});
|
|
40515
|
+
if (totalAssets === 0n || periodRemaining === 0n || unvested === 0n) {
|
|
40516
|
+
throw new Error("apyx vesting state empty");
|
|
40517
|
+
}
|
|
40518
|
+
const perSecond = unvested / periodRemaining;
|
|
40519
|
+
return Number(perSecond * YEAR_SECONDS8 * ONE_E188 / totalAssets) / 1e16;
|
|
40520
|
+
};
|
|
40521
|
+
var fetchApyusdApyFromApi = async () => {
|
|
40522
|
+
const res = await fetch(APYX_DISCOVER_URL, {
|
|
40523
|
+
headers: { accept: "application/json" },
|
|
40524
|
+
signal: AbortSignal.timeout(8e3)
|
|
40525
|
+
});
|
|
40526
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
40527
|
+
const items = (await res.json())?.data?.items ?? [];
|
|
40528
|
+
const row = items.find(
|
|
40529
|
+
(it) => it?.protocol === "Apyx" && it?.network === "ethereum" && Array.isArray(it?.assetSymbols) && it.assetSymbols.includes("apyUSD") && it?.apy != null
|
|
40530
|
+
);
|
|
40531
|
+
const apy = Number(row?.apy);
|
|
40532
|
+
if (Number.isFinite(apy) && apy > 0) return apy;
|
|
40533
|
+
throw new Error("apyUSD apy missing");
|
|
40534
|
+
};
|
|
40535
|
+
var apyxFetcher = {
|
|
40536
|
+
label: "APYUSD",
|
|
40537
|
+
fetch: async () => {
|
|
40538
|
+
const apr = await fetchApyusdAprOnChain().catch(async () => apyToAprPercent(await fetchApyusdApyFromApi())).catch(() => fetchDefiLlamaApy(APYX_DEFILLAMA_POOL)).catch(() => 0);
|
|
40539
|
+
return {
|
|
40540
|
+
[APYUSD_KEY]: apr,
|
|
40541
|
+
[APYUSD_GROUP_KEY]: apr,
|
|
40542
|
+
[APYUSD_LEGACY_GROUP_KEY]: apr
|
|
40543
|
+
};
|
|
40544
|
+
}
|
|
40545
|
+
};
|
|
40546
|
+
|
|
40547
|
+
// src/yields/intrinsic/fetchers/strata.ts
|
|
40548
|
+
var STRATA_ANALYTICS_URL = "https://s3.strata.money/tranches/analytics-v18.json";
|
|
40549
|
+
var SRUSDE_KEY = "Strata Senior USDe::SRUSDE";
|
|
40550
|
+
var JRUSDE_KEY = "Strata Junior USDe::jrUSDe";
|
|
40551
|
+
var SRNUSD_KEY = "Strata Senior NUSD::srNUSD";
|
|
40552
|
+
var JRNUSD_KEY = "Strata Junior NUSD::JRNUSD";
|
|
40553
|
+
var SRMHYPER_KEY = "Strata Senior mHYPER::srmHYPER";
|
|
40554
|
+
var JRMHYPER_KEY = "Strata Junior mHYPER::JRMHYPER";
|
|
40555
|
+
var SRMM1USD_KEY = "Strata Senior mM1-USD::SRMM1-USD";
|
|
40556
|
+
var JRMM1USD_KEY = "Strata Junior mM1-USD::JRMM1-USD";
|
|
40557
|
+
var SRUSDAT_KEY = "Strata Senior USDat::SRUSDAT";
|
|
40558
|
+
var JRUSDAT_KEY = "Strata Junior USDat::JRUSDAT";
|
|
40559
|
+
var SRPRIME_KEY = "Strata Senior PRIME::srPRIME";
|
|
40560
|
+
var JRPRIME_KEY = "Strata Junior PRIME::jrPRIME";
|
|
40561
|
+
var STRATA_MARKETS = [
|
|
40562
|
+
{
|
|
40563
|
+
cdo: "ethenaCdo",
|
|
40564
|
+
sr: { key: SRUSDE_KEY, llamaPool: "843be062-d836-43ef-9670-c78d6ecb60bf" },
|
|
40565
|
+
jr: { key: JRUSDE_KEY, llamaPool: "8352355c-5ad7-45c5-aca2-628de224f8d8" }
|
|
40566
|
+
},
|
|
40567
|
+
{
|
|
40568
|
+
cdo: "neutrlCdo",
|
|
40569
|
+
sr: { key: SRNUSD_KEY, llamaPool: "979711ce-d0c0-4aae-a5fc-d7b76e868649" },
|
|
40570
|
+
jr: { key: JRNUSD_KEY, llamaPool: "947928b7-c446-49d7-a378-392df37660f7" }
|
|
40571
|
+
},
|
|
40572
|
+
{
|
|
40573
|
+
cdo: "mhyperCdo",
|
|
40574
|
+
sr: {
|
|
40575
|
+
key: SRMHYPER_KEY,
|
|
40576
|
+
llamaPool: "a0560647-eb43-45d9-880d-3155db6d357e"
|
|
40577
|
+
},
|
|
40578
|
+
jr: {
|
|
40579
|
+
key: JRMHYPER_KEY,
|
|
40580
|
+
llamaPool: "908664de-79ee-4f4f-9347-40da76a43552"
|
|
40581
|
+
}
|
|
40582
|
+
},
|
|
40583
|
+
{
|
|
40584
|
+
cdo: "mm1usdCdo",
|
|
40585
|
+
sr: {
|
|
40586
|
+
key: SRMM1USD_KEY,
|
|
40587
|
+
llamaPool: "8139ac7b-c983-4800-bb98-60abe3d68157"
|
|
40588
|
+
},
|
|
40589
|
+
jr: {
|
|
40590
|
+
key: JRMM1USD_KEY,
|
|
40591
|
+
llamaPool: "2172d4b0-9a76-4452-af46-2ce833d2c612"
|
|
40592
|
+
}
|
|
40593
|
+
},
|
|
40594
|
+
{
|
|
40595
|
+
cdo: "saturnCdo",
|
|
40596
|
+
sr: { key: SRUSDAT_KEY, llamaPool: "d0f93146-6936-4fac-841e-68178b5a59b2" },
|
|
40597
|
+
jr: { key: JRUSDAT_KEY, llamaPool: "1f42963b-ff24-4563-acb7-0fd35e6ec45b" }
|
|
40598
|
+
},
|
|
40599
|
+
{
|
|
40600
|
+
cdo: "figureCdo",
|
|
40601
|
+
sr: { key: SRPRIME_KEY, llamaPool: "c590eff9-9de2-462c-b629-7e9c89f0b8e9" },
|
|
40602
|
+
jr: { key: JRPRIME_KEY, llamaPool: "f88ff950-9096-46c0-bb9e-93f4d8266c41" }
|
|
40603
|
+
}
|
|
40604
|
+
];
|
|
40605
|
+
var fetchStrataAnalytics = async () => {
|
|
40606
|
+
const res = await fetch(STRATA_ANALYTICS_URL, {
|
|
40607
|
+
headers: { accept: "application/json" },
|
|
40608
|
+
signal: AbortSignal.timeout(8e3)
|
|
40609
|
+
});
|
|
40610
|
+
if (!res.ok) throw new Error(`Strata analytics HTTP ${res.status}`);
|
|
40611
|
+
return await res.json();
|
|
40612
|
+
};
|
|
40613
|
+
var strataFetcher = {
|
|
40614
|
+
label: "STRATA",
|
|
40615
|
+
fetch: async () => {
|
|
40616
|
+
const analytics = await fetchStrataAnalytics().catch(() => null);
|
|
40617
|
+
const out = {};
|
|
40618
|
+
await Promise.all(
|
|
40619
|
+
STRATA_MARKETS.flatMap(
|
|
40620
|
+
({ cdo, sr, jr }) => [
|
|
40621
|
+
[sr, analytics?.[cdo]?.week?.srt?.apr],
|
|
40622
|
+
[jr, analytics?.[cdo]?.week?.jrt?.apr]
|
|
40623
|
+
].map(async ([tranche, apr]) => {
|
|
40624
|
+
if (typeof apr === "number" && Number.isFinite(apr)) {
|
|
40625
|
+
out[tranche.key] = apr;
|
|
40626
|
+
return;
|
|
40627
|
+
}
|
|
40628
|
+
const llamaApy = await fetchDefiLlamaApy(tranche.llamaPool).catch(
|
|
40629
|
+
() => null
|
|
40630
|
+
);
|
|
40631
|
+
if (llamaApy !== null) out[tranche.key] = apyToAprPercent(llamaApy);
|
|
40632
|
+
})
|
|
40633
|
+
)
|
|
40634
|
+
);
|
|
40635
|
+
return out;
|
|
40636
|
+
}
|
|
40637
|
+
};
|
|
40638
|
+
var RAY6 = 10n ** 27n;
|
|
40639
|
+
var YEAR_SECONDS9 = 31536e3;
|
|
39841
40640
|
var DSR_ABI = [
|
|
39842
40641
|
{
|
|
39843
40642
|
name: "dsr",
|
|
@@ -39863,9 +40662,9 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
|
|
|
39863
40662
|
var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
|
|
39864
40663
|
var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
|
|
39865
40664
|
var aprFromDsr = (dsr) => {
|
|
39866
|
-
if (dsr <=
|
|
39867
|
-
const perSecond = Number(dsr -
|
|
39868
|
-
return perSecond *
|
|
40665
|
+
if (dsr <= RAY6) return 0;
|
|
40666
|
+
const perSecond = Number(dsr - RAY6) / 1e27;
|
|
40667
|
+
return perSecond * YEAR_SECONDS9 * 100;
|
|
39869
40668
|
};
|
|
39870
40669
|
var fetchChainDsr = async (chainId, pot) => {
|
|
39871
40670
|
const [dsr] = await multicallRetryUniversal({
|
|
@@ -39874,7 +40673,7 @@ var fetchChainDsr = async (chainId, pot) => {
|
|
|
39874
40673
|
calls: [{ address: pot, name: "dsr", params: [] }],
|
|
39875
40674
|
allowFailure: false
|
|
39876
40675
|
});
|
|
39877
|
-
if (typeof dsr !== "bigint" || dsr <
|
|
40676
|
+
if (typeof dsr !== "bigint" || dsr < RAY6) {
|
|
39878
40677
|
throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
|
|
39879
40678
|
}
|
|
39880
40679
|
return aprFromDsr(dsr);
|
|
@@ -41410,6 +42209,270 @@ var SINGLE_CHAIN_ENTRIES = {
|
|
|
41410
42209
|
yieldFetcher: snusdFetcher,
|
|
41411
42210
|
yieldKey: SNUSD_KEY
|
|
41412
42211
|
},
|
|
42212
|
+
{
|
|
42213
|
+
// Apyx apyUSD — ERC-4626 over apxUSD, the "Dividend-Backed
|
|
42214
|
+
// Dollar" (variable-rate perpetual preferred stock of DAT
|
|
42215
|
+
// companies, STRC/Strategy). Yield = off-chain dividends minted
|
|
42216
|
+
// as apxUSD and dripped in through a 14-day LinearVestV0
|
|
42217
|
+
// (0x0d62b4cc…, `pullVestedYield`). No on-chain solvency
|
|
42218
|
+
// invariant — RWA/NAV trust class. apxUSD minting is
|
|
42219
|
+
// EIP-712/m-of-n gated (institutional) but the 4626 stake side is
|
|
42220
|
+
// permissionless (`maxDeposit` = uint.max), with deep secondary
|
|
42221
|
+
// apxUSD liquidity (Curve / Uni v4).
|
|
42222
|
+
//
|
|
42223
|
+
// EXIT (fork-verified 2026-08-04, and NOT what the docs site
|
|
42224
|
+
// describes): a 4626 redeem pays the caller nothing. It takes the
|
|
42225
|
+
// vault's flat `unlockingFee()` (0.1%), escrows the apxUSD in the
|
|
42226
|
+
// unlock-RECEIPT contract (`receipt()` = 0x9bf51f33…) and mints a
|
|
42227
|
+
// soulbound ERC-721 keyed by tokenId. Claims are blocked for
|
|
42228
|
+
// `feeCurve.minDuration` (3 days — hence the cooldown below) and
|
|
42229
|
+
// then carry a fee decaying to zero at `maxDuration` (20 days):
|
|
42230
|
+
// measured 3.40% at 3d, 2.60% at 7d, 0% at 20d. The curve is
|
|
42231
|
+
// GLOBAL and admin-settable (capped 5%), so it re-prices receipts
|
|
42232
|
+
// already in flight — quote `previewClaim(tokenId)` live rather
|
|
42233
|
+
// than trusting a stored figure. The vault's legacy
|
|
42234
|
+
// `unlockToken()` (0x93775e2d…) is still deployed but off the
|
|
42235
|
+
// redemption path. Base/BNB carry bridged mirrors whose 4626
|
|
42236
|
+
// surface reverts (plus Solana) — Ethereum-only row.
|
|
42237
|
+
address: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
|
|
42238
|
+
underlying: "0x98a878b1cd98131b271883b390f68d2c90674665",
|
|
42239
|
+
// apxUSD
|
|
42240
|
+
symbol: "apyUSD",
|
|
42241
|
+
brand: "Apyx",
|
|
42242
|
+
description: "apxUSD is Apyx's dividend-backed dollar \u2014 collateralized by variable-rate perpetual preferred stock issued by Digital Asset Treasury companies (e.g. Strategy's STRC). apyUSD stakes it and accrues the preferred-share dividends via an appreciating share price. Exiting mints a transfer-locked receipt NFT: it cannot be claimed for 3 days, then costs a fee that decays from ~3.4% to zero at 20 days (plus a flat 0.1% on the way out). The backing lives off-chain (NAV trust).",
|
|
42243
|
+
decimals: 18,
|
|
42244
|
+
isRebasing: false,
|
|
42245
|
+
isMintable: true,
|
|
42246
|
+
withdrawalMode: "request-based",
|
|
42247
|
+
// Earliest claim = the receipt's `claimableAt` (`feeCurve.minDuration`,
|
|
42248
|
+
// 3 days). Waiting the full 20 days is what makes the exit free —
|
|
42249
|
+
// see the note above; both bounds are admin-mutable.
|
|
42250
|
+
withdrawalCooldownSeconds: 3 * 86400,
|
|
42251
|
+
withdrawQueue: "0x9bf51f33955ec70f87c4b5c49441815589043237",
|
|
42252
|
+
yieldFetcher: apyxFetcher,
|
|
42253
|
+
yieldKey: APYUSD_KEY
|
|
42254
|
+
},
|
|
42255
|
+
// ---- Strata (docs.strata.markets) — senior/junior risk tranches ----
|
|
42256
|
+
//
|
|
42257
|
+
// Six CDO markets, twelve ERC-4626 tranche tokens, all Ethereum.
|
|
42258
|
+
// Each market pools a yield-bearing collateral (sUSDe, sNUSD,
|
|
42259
|
+
// mHYPER, mM1-USD, sUSDat, PRIME) and splits its realized yield:
|
|
42260
|
+
// the senior earns a benchmark-floored rate (its `maxDeposit` is
|
|
42261
|
+
// coverage-cap-gated), the junior takes the residual — levered
|
|
42262
|
+
// upside AND first-loss capital (jrUSDat marked down to ~0.36
|
|
42263
|
+
// absorbing the 2026-07 USDat depeg; junior redemptions pause when
|
|
42264
|
+
// senior coverage drops below the market's minimum). Exits are
|
|
42265
|
+
// two-legged and both escrow through the market's cooldown
|
|
42266
|
+
// contracts, claimed via `finalize`: redeeming into the collateral
|
|
42267
|
+
// token runs a governance cooldown (0 seconds = effectively instant
|
|
42268
|
+
// on every market at integration), while the plain-4626 base-asset
|
|
42269
|
+
// redeem unstakes the collateral first (7d Ethena, 10d Neutrl, ≲3d
|
|
42270
|
+
// Midas) — hence `request-based`, with `withdrawQueue` pointing at
|
|
42271
|
+
// the market's UnstakeCooldown. `previewRedeem` (but NOT
|
|
42272
|
+
// `convertToAssets`) already nets the coverage-dependent exit fee
|
|
42273
|
+
// (0–20 bps). Rates are Strata's own trailing-7d realized figures —
|
|
42274
|
+
// see the fetcher for the junior-tranche caveats. Verified on-chain
|
|
42275
|
+
// 2026-08-04.
|
|
42276
|
+
{
|
|
42277
|
+
address: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
|
|
42278
|
+
underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
|
|
42279
|
+
// USDe
|
|
42280
|
+
symbol: "srUSDe",
|
|
42281
|
+
brand: "Strata",
|
|
42282
|
+
description: "Strata's senior tranche over Ethena USDe: pooled deposits sit in sUSDe and the senior earns a benchmark-floored share of its yield, with the junior tranche absorbing losses first. Exits claim through cooldown contracts \u2014 the sUSDe leg is effectively instant, the USDe leg waits Ethena's 7-day unstake \u2014 minus a small coverage-dependent exit fee.",
|
|
42283
|
+
decimals: 18,
|
|
42284
|
+
isRebasing: false,
|
|
42285
|
+
isMintable: true,
|
|
42286
|
+
withdrawalMode: "request-based",
|
|
42287
|
+
withdrawalCooldownSeconds: 7 * 86400,
|
|
42288
|
+
withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
|
|
42289
|
+
yieldFetcher: strataFetcher,
|
|
42290
|
+
yieldKey: SRUSDE_KEY
|
|
42291
|
+
},
|
|
42292
|
+
{
|
|
42293
|
+
address: "0xc58d044404d8b14e953c115e67823784dea53d8f",
|
|
42294
|
+
underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
|
|
42295
|
+
// USDe
|
|
42296
|
+
symbol: "jrUSDe",
|
|
42297
|
+
brand: "Strata",
|
|
42298
|
+
description: "Strata's junior tranche over Ethena USDe: earns the residual sUSDe yield after the senior's benchmark payment \u2014 levered upside when rates run hot, first-loss capital when they don't (the trailing APR can go negative). Exits mirror srUSDe (instant-ish sUSDe leg, 7-day USDe leg) but pause while senior coverage is below 105%.",
|
|
42299
|
+
decimals: 18,
|
|
42300
|
+
isRebasing: false,
|
|
42301
|
+
isMintable: true,
|
|
42302
|
+
withdrawalMode: "request-based",
|
|
42303
|
+
withdrawalCooldownSeconds: 7 * 86400,
|
|
42304
|
+
withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
|
|
42305
|
+
yieldFetcher: strataFetcher,
|
|
42306
|
+
yieldKey: JRUSDE_KEY
|
|
42307
|
+
},
|
|
42308
|
+
{
|
|
42309
|
+
address: "0x65a44528e8868166401ea08b549e19552af589db",
|
|
42310
|
+
underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
|
|
42311
|
+
// NUSD
|
|
42312
|
+
symbol: "srNUSD",
|
|
42313
|
+
brand: "Strata",
|
|
42314
|
+
description: "Strata's senior tranche over Neutrl NUSD: pooled deposits sit in sNUSD and the senior earns a benchmark-floored share of its yield, junior-protected. Exits claim through cooldown contracts \u2014 the sNUSD leg is effectively instant, the NUSD leg waits Neutrl's 10-day unstake \u2014 minus a 0\u20135 bps coverage-dependent exit fee.",
|
|
42315
|
+
decimals: 18,
|
|
42316
|
+
isRebasing: false,
|
|
42317
|
+
isMintable: true,
|
|
42318
|
+
withdrawalMode: "request-based",
|
|
42319
|
+
withdrawalCooldownSeconds: 10 * 86400,
|
|
42320
|
+
withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
|
|
42321
|
+
yieldFetcher: strataFetcher,
|
|
42322
|
+
yieldKey: SRNUSD_KEY
|
|
42323
|
+
},
|
|
42324
|
+
{
|
|
42325
|
+
address: "0xfc807058a352b61aeef6a38e2d0fc3990225e772",
|
|
42326
|
+
underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
|
|
42327
|
+
// NUSD
|
|
42328
|
+
symbol: "jrNUSD",
|
|
42329
|
+
brand: "Strata",
|
|
42330
|
+
description: "Strata's junior tranche over Neutrl NUSD: residual yield after the senior's benchmark payment, first-loss against sNUSD underperformance. Exits run the same cooldown claims as srNUSD (NUSD leg = 10-day unstake) with a 0\u201320 bps coverage-dependent fee, and pause while senior coverage is below the market minimum.",
|
|
42331
|
+
decimals: 18,
|
|
42332
|
+
isRebasing: false,
|
|
42333
|
+
isMintable: true,
|
|
42334
|
+
withdrawalMode: "request-based",
|
|
42335
|
+
withdrawalCooldownSeconds: 10 * 86400,
|
|
42336
|
+
withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
|
|
42337
|
+
yieldFetcher: strataFetcher,
|
|
42338
|
+
yieldKey: JRNUSD_KEY
|
|
42339
|
+
},
|
|
42340
|
+
{
|
|
42341
|
+
// 18-dec shares over 6-dec USDC (the yUSD case) — the collateral
|
|
42342
|
+
// is 18-dec mHYPER, but the vault accounts in USDC.
|
|
42343
|
+
address: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
|
|
42344
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42345
|
+
// USDC
|
|
42346
|
+
symbol: "srmHYPER",
|
|
42347
|
+
brand: "Strata",
|
|
42348
|
+
description: "Strata's senior tranche over Midas mHYPER (Hyperithm's multi-chain stablecoin yield strategy), accounted in USDC: benchmark-floored yield (Aave USDC/USDT supply rate + 3% premium), junior-protected. Exits claim through cooldown contracts \u2014 the mHYPER leg is effectively instant, the USDC leg follows Midas's \u22723-day redemption schedule \u2014 minus a 0\u20135 bps fee.",
|
|
42349
|
+
decimals: 18,
|
|
42350
|
+
underlyingDecimals: 6,
|
|
42351
|
+
isRebasing: false,
|
|
42352
|
+
isMintable: true,
|
|
42353
|
+
withdrawalMode: "request-based",
|
|
42354
|
+
withdrawalCooldownSeconds: 3 * 86400,
|
|
42355
|
+
withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
|
|
42356
|
+
yieldFetcher: strataFetcher,
|
|
42357
|
+
yieldKey: SRMHYPER_KEY
|
|
42358
|
+
},
|
|
42359
|
+
{
|
|
42360
|
+
address: "0xeb205d26e9e605ec82d1c0d652e00037c278714b",
|
|
42361
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42362
|
+
// USDC
|
|
42363
|
+
symbol: "jrmHYPER",
|
|
42364
|
+
brand: "Strata",
|
|
42365
|
+
description: "Strata's junior tranche over Midas mHYPER, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mHYPER strategy. Exits mirror srmHYPER (USDC leg \u22723 days via Midas) and pause while senior coverage is below the market minimum.",
|
|
42366
|
+
decimals: 18,
|
|
42367
|
+
underlyingDecimals: 6,
|
|
42368
|
+
isRebasing: false,
|
|
42369
|
+
isMintable: true,
|
|
42370
|
+
withdrawalMode: "request-based",
|
|
42371
|
+
withdrawalCooldownSeconds: 3 * 86400,
|
|
42372
|
+
withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
|
|
42373
|
+
yieldFetcher: strataFetcher,
|
|
42374
|
+
yieldKey: JRMHYPER_KEY
|
|
42375
|
+
},
|
|
42376
|
+
{
|
|
42377
|
+
address: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
|
|
42378
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42379
|
+
// USDC
|
|
42380
|
+
symbol: "srmM1-USD",
|
|
42381
|
+
brand: "Strata",
|
|
42382
|
+
description: "Strata's senior tranche over Midas mM1-USD, accounted in USDC: benchmark-floored share of the mM1-USD yield, junior-protected. Exits claim through cooldown contracts \u2014 the mM1-USD leg is effectively instant, the USDC leg follows Midas's redemption schedule.",
|
|
42383
|
+
decimals: 18,
|
|
42384
|
+
underlyingDecimals: 6,
|
|
42385
|
+
isRebasing: false,
|
|
42386
|
+
isMintable: true,
|
|
42387
|
+
withdrawalMode: "request-based",
|
|
42388
|
+
withdrawalCooldownSeconds: 3 * 86400,
|
|
42389
|
+
withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
|
|
42390
|
+
yieldFetcher: strataFetcher,
|
|
42391
|
+
yieldKey: SRMM1USD_KEY
|
|
42392
|
+
},
|
|
42393
|
+
{
|
|
42394
|
+
address: "0xf7eb8dfec75c42d2d2247fe76ccaedc59f821688",
|
|
42395
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42396
|
+
// USDC
|
|
42397
|
+
symbol: "jrmM1-USD",
|
|
42398
|
+
brand: "Strata",
|
|
42399
|
+
description: "Strata's junior tranche over Midas mM1-USD, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mM1-USD strategy. Exits mirror srmM1-USD and pause while senior coverage is below the market minimum.",
|
|
42400
|
+
decimals: 18,
|
|
42401
|
+
underlyingDecimals: 6,
|
|
42402
|
+
isRebasing: false,
|
|
42403
|
+
isMintable: true,
|
|
42404
|
+
withdrawalMode: "request-based",
|
|
42405
|
+
withdrawalCooldownSeconds: 3 * 86400,
|
|
42406
|
+
withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
|
|
42407
|
+
yieldFetcher: strataFetcher,
|
|
42408
|
+
yieldKey: JRMM1USD_KEY
|
|
42409
|
+
},
|
|
42410
|
+
{
|
|
42411
|
+
// Accounted in 6-dec USDat (Saturn Dollar); collateral is staked
|
|
42412
|
+
// 18-dec sUSDat.
|
|
42413
|
+
address: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
|
|
42414
|
+
underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
|
|
42415
|
+
// USDat
|
|
42416
|
+
symbol: "srUSDat",
|
|
42417
|
+
brand: "Strata",
|
|
42418
|
+
description: "Strata's senior tranche over Saturn USDat (a Strategy-preferred-stock-backed dollar): fixed yield at 65% of the STRC dividend rate, junior-protected \u2014 the senior held its rate straight through the 2026-07 USDat depeg that the junior absorbed. Exits claim through cooldown contracts (the sUSDat leg effectively instant) minus a 0\u20135 bps fee.",
|
|
42419
|
+
decimals: 18,
|
|
42420
|
+
underlyingDecimals: 6,
|
|
42421
|
+
isRebasing: false,
|
|
42422
|
+
isMintable: true,
|
|
42423
|
+
withdrawalMode: "request-based",
|
|
42424
|
+
withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
|
|
42425
|
+
yieldFetcher: strataFetcher,
|
|
42426
|
+
yieldKey: SRUSDAT_KEY
|
|
42427
|
+
},
|
|
42428
|
+
{
|
|
42429
|
+
address: "0x011e55d2b28306458e37ca7e997c879bb25a455d",
|
|
42430
|
+
underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
|
|
42431
|
+
// USDat
|
|
42432
|
+
symbol: "jrUSDat",
|
|
42433
|
+
brand: "Strata",
|
|
42434
|
+
description: "Strata's junior tranche over Saturn USDat \u2014 first-loss capital that proved it: the 2026-07 USDat collateral depeg marked jrUSDat down to ~0.36 while the senior stayed whole, and its trailing APR is depeg-recovery-inflated. Exits claim through cooldown contracts and pause while senior coverage is below the market minimum.",
|
|
42435
|
+
decimals: 18,
|
|
42436
|
+
underlyingDecimals: 6,
|
|
42437
|
+
isRebasing: false,
|
|
42438
|
+
isMintable: true,
|
|
42439
|
+
withdrawalMode: "request-based",
|
|
42440
|
+
withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
|
|
42441
|
+
yieldFetcher: strataFetcher,
|
|
42442
|
+
yieldKey: JRUSDAT_KEY
|
|
42443
|
+
},
|
|
42444
|
+
{
|
|
42445
|
+
address: "0x35bff778d3fc53a561486bf28e761428499232eb",
|
|
42446
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42447
|
+
// USDC
|
|
42448
|
+
symbol: "srPRIME",
|
|
42449
|
+
brand: "Strata",
|
|
42450
|
+
description: "Strata's senior tranche over Hastra PRIME (yield sourced from Figure's YLDS-based lending), accounted in USDC: benchmark-floored share of the PRIME yield, junior-protected. Exits claim through cooldown contracts \u2014 the PRIME leg is effectively instant, the USDC leg follows the strategy's redemption schedule.",
|
|
42451
|
+
decimals: 18,
|
|
42452
|
+
underlyingDecimals: 6,
|
|
42453
|
+
isRebasing: false,
|
|
42454
|
+
isMintable: true,
|
|
42455
|
+
withdrawalMode: "request-based",
|
|
42456
|
+
withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
|
|
42457
|
+
yieldFetcher: strataFetcher,
|
|
42458
|
+
yieldKey: SRPRIME_KEY
|
|
42459
|
+
},
|
|
42460
|
+
{
|
|
42461
|
+
address: "0xf4c91f24e20ee8ed5eda905e501a1136334c2f27",
|
|
42462
|
+
underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
|
42463
|
+
// USDC
|
|
42464
|
+
symbol: "jrPRIME",
|
|
42465
|
+
brand: "Strata",
|
|
42466
|
+
description: "Strata's junior tranche over Hastra PRIME, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the PRIME strategy. Exits mirror srPRIME and pause while senior coverage is below the market minimum.",
|
|
42467
|
+
decimals: 18,
|
|
42468
|
+
underlyingDecimals: 6,
|
|
42469
|
+
isRebasing: false,
|
|
42470
|
+
isMintable: true,
|
|
42471
|
+
withdrawalMode: "request-based",
|
|
42472
|
+
withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
|
|
42473
|
+
yieldFetcher: strataFetcher,
|
|
42474
|
+
yieldKey: JRPRIME_KEY
|
|
42475
|
+
},
|
|
41413
42476
|
{
|
|
41414
42477
|
// Avant savETH — staked avETH (Ethereum, where avETH is native);
|
|
41415
42478
|
// StakedUSDeV2-style 24h cooldown.
|
|
@@ -42639,25 +43702,14 @@ var tethFetcher = {
|
|
|
42639
43702
|
}
|
|
42640
43703
|
};
|
|
42641
43704
|
|
|
42642
|
-
// src/yields/intrinsic/fetchers/strata.ts
|
|
42643
|
-
var SRNUSD_POOL_ID = "979711ce-d0c0-4aae-a5fc-d7b76e868649";
|
|
42644
|
-
var KEYS3 = ["Strata Senior NUSD::srNUSD"];
|
|
42645
|
-
var srnusdFetcher = {
|
|
42646
|
-
label: "SRNUSD",
|
|
42647
|
-
fetch: async () => {
|
|
42648
|
-
const apr = apyToAprPercent(await fetchDefiLlamaApy(SRNUSD_POOL_ID));
|
|
42649
|
-
return Object.fromEntries(KEYS3.map((k) => [k, apr]));
|
|
42650
|
-
}
|
|
42651
|
-
};
|
|
42652
|
-
|
|
42653
43705
|
// src/yields/intrinsic/fetchers/anzen.ts
|
|
42654
43706
|
var SUSDZ_POOL_ID = "46518e93-8197-4539-9861-2340c2ac965a";
|
|
42655
|
-
var
|
|
43707
|
+
var KEYS3 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
|
|
42656
43708
|
var susdzFetcher = {
|
|
42657
43709
|
label: "SUSDZ",
|
|
42658
43710
|
fetch: async () => {
|
|
42659
43711
|
const apr = apyToAprPercent(await fetchDefiLlamaApy(SUSDZ_POOL_ID));
|
|
42660
|
-
return Object.fromEntries(
|
|
43712
|
+
return Object.fromEntries(KEYS3.map((k) => [k, apr]));
|
|
42661
43713
|
}
|
|
42662
43714
|
};
|
|
42663
43715
|
|
|
@@ -42692,7 +43744,8 @@ var LENDING_ONLY_FETCHERS = [
|
|
|
42692
43744
|
// DefiLlama-mapped intrinsic yields for classifier assets lacking a bespoke source
|
|
42693
43745
|
lsethFetcher,
|
|
42694
43746
|
tethFetcher,
|
|
42695
|
-
|
|
43747
|
+
// strataFetcher is NOT here: the Strata tranche savings rows vault-wire
|
|
43748
|
+
// it, so it reaches the global map via `collectVaultFetchers`.
|
|
42696
43749
|
susdzFetcher
|
|
42697
43750
|
];
|
|
42698
43751
|
var collectVaultFetchers = () => {
|
|
@@ -46876,10 +47929,10 @@ function createAssetArrayPerChain() {
|
|
|
46876
47929
|
return assetsPerChain;
|
|
46877
47930
|
}
|
|
46878
47931
|
var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
|
|
46879
|
-
function createSimpleArrayPerChain(fork,
|
|
47932
|
+
function createSimpleArrayPerChain(fork, field12 = void 0) {
|
|
46880
47933
|
let pools = {};
|
|
46881
47934
|
Object.entries(fork ?? {}).forEach(([b2, data]) => {
|
|
46882
|
-
Object.entries(
|
|
47935
|
+
Object.entries(field12 ? data[field12] : data).forEach(
|
|
46883
47936
|
([chainId, address]) => {
|
|
46884
47937
|
if (!pools[chainId]) pools[chainId] = [];
|
|
46885
47938
|
pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
|
|
@@ -49088,9 +50141,9 @@ query EvkByAssets($assets: [Bytes!]!) {
|
|
|
49088
50141
|
`;
|
|
49089
50142
|
var ZERO = 0n;
|
|
49090
50143
|
var RAY_TO_PERCENT3 = 1e25;
|
|
49091
|
-
function readAddress2(
|
|
49092
|
-
if (!
|
|
49093
|
-
return
|
|
50144
|
+
function readAddress2(field12) {
|
|
50145
|
+
if (!field12) return void 0;
|
|
50146
|
+
return field12.toLowerCase();
|
|
49094
50147
|
}
|
|
49095
50148
|
function parseVaultFee(v) {
|
|
49096
50149
|
if (v.performanceFee == null) return 0;
|
|
@@ -49455,7 +50508,7 @@ var num2 = (v) => {
|
|
|
49455
50508
|
const n = Number(v);
|
|
49456
50509
|
return Number.isFinite(n) ? n : 0;
|
|
49457
50510
|
};
|
|
49458
|
-
var
|
|
50511
|
+
var big7 = (v) => {
|
|
49459
50512
|
try {
|
|
49460
50513
|
if (v === void 0 || v === null || v === "") return "0";
|
|
49461
50514
|
const s = String(v);
|
|
@@ -49491,12 +50544,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
49491
50544
|
const assetEntry = tokenList[underlying];
|
|
49492
50545
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
|
|
49493
50546
|
const priceUsd = prices[priceKey];
|
|
49494
|
-
const totalAssets =
|
|
49495
|
-
const totalSupply =
|
|
50547
|
+
const totalAssets = big7(r.totalAssets);
|
|
50548
|
+
const totalSupply = big7(r.totalSupplyAmt);
|
|
49496
50549
|
const totalAssetsFormatted = Number(totalAssets) / scale;
|
|
49497
50550
|
const supplyRate = num2(r.apr) * 100;
|
|
49498
50551
|
const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
|
|
49499
|
-
const rawLiquidity = BigInt(
|
|
50552
|
+
const rawLiquidity = BigInt(big7(r.redeemableAmt ?? r.idleFunds ?? "0"));
|
|
49500
50553
|
const totalAssetsBig = BigInt(totalAssets);
|
|
49501
50554
|
const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
|
|
49502
50555
|
const liquidityFormatted = Number(liquidity) / scale;
|
|
@@ -49532,7 +50585,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
49532
50585
|
liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
|
|
49533
50586
|
version: r.version,
|
|
49534
50587
|
isPaused: r.isPaused === true || void 0,
|
|
49535
|
-
supplyCap: r.capacity ?
|
|
50588
|
+
supplyCap: r.capacity ? big7(r.capacity) : void 0,
|
|
49536
50589
|
basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
|
|
49537
50590
|
};
|
|
49538
50591
|
}
|
|
@@ -49588,7 +50641,7 @@ var Erc20DecimalsBalanceAbi = [
|
|
|
49588
50641
|
|
|
49589
50642
|
// src/vaults/termmax/fetchFromChain.ts
|
|
49590
50643
|
var DECIMAL_BASE2 = 100000000n;
|
|
49591
|
-
var
|
|
50644
|
+
var big8 = (v) => {
|
|
49592
50645
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
49593
50646
|
try {
|
|
49594
50647
|
return typeof v === "bigint" ? v : BigInt(v);
|
|
@@ -49652,7 +50705,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49652
50705
|
vaults.forEach((address, i) => {
|
|
49653
50706
|
const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
|
|
49654
50707
|
const asset = addr(at("asset"));
|
|
49655
|
-
const totalAssets =
|
|
50708
|
+
const totalAssets = big8(at("totalAssets"));
|
|
49656
50709
|
if (!asset || totalAssets === 0n) return;
|
|
49657
50710
|
rows.push({
|
|
49658
50711
|
address,
|
|
@@ -49661,11 +50714,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49661
50714
|
decimals: num3(at("decimals")) ?? 18,
|
|
49662
50715
|
asset,
|
|
49663
50716
|
totalAssets,
|
|
49664
|
-
totalSupply:
|
|
49665
|
-
annualizedInterest:
|
|
49666
|
-
accretingPrincipal:
|
|
49667
|
-
performanceFeeRate:
|
|
49668
|
-
aprRaw: at("apr") != null ?
|
|
50717
|
+
totalSupply: big8(at("totalSupply")),
|
|
50718
|
+
annualizedInterest: big8(at("annualizedInterest")),
|
|
50719
|
+
accretingPrincipal: big8(at("accretingPrincipal")),
|
|
50720
|
+
performanceFeeRate: big8(at("performanceFeeRate")),
|
|
50721
|
+
aprRaw: at("apr") != null ? big8(at("apr")) : void 0,
|
|
49669
50722
|
curator: addr(at("curator")),
|
|
49670
50723
|
guardian: addr(at("guardian")),
|
|
49671
50724
|
timelock: num3(at("timelock")),
|
|
@@ -49686,7 +50739,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49686
50739
|
const out = {};
|
|
49687
50740
|
rows.forEach((r, i) => {
|
|
49688
50741
|
const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
|
|
49689
|
-
const idle =
|
|
50742
|
+
const idle = big8(res2[i * 2 + 1]);
|
|
49690
50743
|
const assetEntry = tokenList[r.asset];
|
|
49691
50744
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
|
|
49692
50745
|
const priceUsd = prices[priceKey];
|
|
@@ -49806,7 +50859,7 @@ var Erc4626PreviewRedeemAbi = [
|
|
|
49806
50859
|
];
|
|
49807
50860
|
|
|
49808
50861
|
// src/vaults/lst/readers/shared.ts
|
|
49809
|
-
var
|
|
50862
|
+
var ONE_E189 = 10n ** 18n;
|
|
49810
50863
|
var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
|
|
49811
50864
|
var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
49812
50865
|
var Multicall3BalanceAbi = [
|
|
@@ -49849,7 +50902,7 @@ var readerBeetsStS = (entry) => ({
|
|
|
49849
50902
|
}
|
|
49850
50903
|
const liquidity = toBigInt13(pool);
|
|
49851
50904
|
return {
|
|
49852
|
-
totalAssets: totalSupply * exchangeRate /
|
|
50905
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
49853
50906
|
totalSupply,
|
|
49854
50907
|
exchangeRate,
|
|
49855
50908
|
liquidity
|
|
@@ -49882,7 +50935,7 @@ var readerBenqiSavax = (entry) => ({
|
|
|
49882
50935
|
{
|
|
49883
50936
|
address: entry.address,
|
|
49884
50937
|
name: "getPooledAvaxByShares",
|
|
49885
|
-
params: [
|
|
50938
|
+
params: [ONE_E189]
|
|
49886
50939
|
},
|
|
49887
50940
|
{ address: entry.address, name: "totalPooledAvax", params: [] }
|
|
49888
50941
|
],
|
|
@@ -49893,7 +50946,7 @@ var readerBenqiSavax = (entry) => ({
|
|
|
49893
50946
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
49894
50947
|
return void 0;
|
|
49895
50948
|
}
|
|
49896
|
-
const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate /
|
|
50949
|
+
const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
|
|
49897
50950
|
return {
|
|
49898
50951
|
totalAssets,
|
|
49899
50952
|
totalSupply,
|
|
@@ -49912,7 +50965,7 @@ var readerBgtWrapper1to1 = (entry) => ({
|
|
|
49912
50965
|
return {
|
|
49913
50966
|
totalAssets: totalSupply,
|
|
49914
50967
|
totalSupply,
|
|
49915
|
-
exchangeRate:
|
|
50968
|
+
exchangeRate: ONE_E189
|
|
49916
50969
|
};
|
|
49917
50970
|
}
|
|
49918
50971
|
});
|
|
@@ -49942,7 +50995,7 @@ var readerDineroBeraEth = (entry) => ({
|
|
|
49942
50995
|
return void 0;
|
|
49943
50996
|
}
|
|
49944
50997
|
return {
|
|
49945
|
-
totalAssets: totalSupply * exchangeRate /
|
|
50998
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
49946
50999
|
totalSupply,
|
|
49947
51000
|
exchangeRate
|
|
49948
51001
|
};
|
|
@@ -49954,7 +51007,7 @@ var readerErc4626 = (entry) => ({
|
|
|
49954
51007
|
calls: [
|
|
49955
51008
|
{ address: entry.address, name: "totalAssets", params: [] },
|
|
49956
51009
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
49957
|
-
{ address: entry.address, name: "convertToAssets", params: [
|
|
51010
|
+
{ address: entry.address, name: "convertToAssets", params: [ONE_E189] }
|
|
49958
51011
|
],
|
|
49959
51012
|
abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
|
|
49960
51013
|
parse: ([assets, supply, rate]) => {
|
|
@@ -49971,7 +51024,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
|
|
|
49971
51024
|
calls: [
|
|
49972
51025
|
{ address: entry.address, name: "totalAssets", params: [] },
|
|
49973
51026
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
49974
|
-
{ address: entry.address, name: "previewRedeem", params: [
|
|
51027
|
+
{ address: entry.address, name: "previewRedeem", params: [ONE_E189] }
|
|
49975
51028
|
],
|
|
49976
51029
|
abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
|
|
49977
51030
|
parse: ([assets, supply, rate]) => {
|
|
@@ -50051,7 +51104,7 @@ var readerEtherFiWeEth = (entry) => {
|
|
|
50051
51104
|
}
|
|
50052
51105
|
}
|
|
50053
51106
|
return {
|
|
50054
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51107
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50055
51108
|
totalSupply,
|
|
50056
51109
|
exchangeRate,
|
|
50057
51110
|
liquidity
|
|
@@ -50084,7 +51137,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50084
51137
|
return {
|
|
50085
51138
|
totalAssets: totalSupply,
|
|
50086
51139
|
totalSupply,
|
|
50087
|
-
exchangeRate:
|
|
51140
|
+
exchangeRate: ONE_E189
|
|
50088
51141
|
};
|
|
50089
51142
|
}
|
|
50090
51143
|
};
|
|
@@ -50092,7 +51145,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50092
51145
|
return {
|
|
50093
51146
|
calls: [
|
|
50094
51147
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50095
|
-
{ address: stakingCore, name: "BeHYPEToHYPE", params: [
|
|
51148
|
+
{ address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
|
|
50096
51149
|
],
|
|
50097
51150
|
abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
|
|
50098
51151
|
parse: ([supply, rate]) => {
|
|
@@ -50102,7 +51155,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50102
51155
|
return void 0;
|
|
50103
51156
|
}
|
|
50104
51157
|
return {
|
|
50105
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51158
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50106
51159
|
totalSupply,
|
|
50107
51160
|
exchangeRate
|
|
50108
51161
|
};
|
|
@@ -50134,7 +51187,7 @@ var readerKelpRsEth = (entry) => {
|
|
|
50134
51187
|
return {
|
|
50135
51188
|
totalAssets: totalSupply,
|
|
50136
51189
|
totalSupply,
|
|
50137
|
-
exchangeRate:
|
|
51190
|
+
exchangeRate: ONE_E189
|
|
50138
51191
|
};
|
|
50139
51192
|
}
|
|
50140
51193
|
};
|
|
@@ -50152,7 +51205,7 @@ var readerKelpRsEth = (entry) => {
|
|
|
50152
51205
|
return void 0;
|
|
50153
51206
|
}
|
|
50154
51207
|
return {
|
|
50155
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51208
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50156
51209
|
totalSupply,
|
|
50157
51210
|
exchangeRate
|
|
50158
51211
|
};
|
|
@@ -50184,7 +51237,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50184
51237
|
return {
|
|
50185
51238
|
totalAssets: totalSupply,
|
|
50186
51239
|
totalSupply,
|
|
50187
|
-
exchangeRate:
|
|
51240
|
+
exchangeRate: ONE_E189
|
|
50188
51241
|
};
|
|
50189
51242
|
}
|
|
50190
51243
|
};
|
|
@@ -50192,7 +51245,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50192
51245
|
return {
|
|
50193
51246
|
calls: [
|
|
50194
51247
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50195
|
-
{ address: accountant, name: "kHYPEToHYPE", params: [
|
|
51248
|
+
{ address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
|
|
50196
51249
|
],
|
|
50197
51250
|
abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
|
|
50198
51251
|
parse: ([supply, rate]) => {
|
|
@@ -50202,7 +51255,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50202
51255
|
return void 0;
|
|
50203
51256
|
}
|
|
50204
51257
|
return {
|
|
50205
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51258
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50206
51259
|
totalSupply,
|
|
50207
51260
|
exchangeRate
|
|
50208
51261
|
};
|
|
@@ -50242,7 +51295,7 @@ var readerLairStKaia = (entry) => ({
|
|
|
50242
51295
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
50243
51296
|
return void 0;
|
|
50244
51297
|
}
|
|
50245
|
-
const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate /
|
|
51298
|
+
const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
|
|
50246
51299
|
return {
|
|
50247
51300
|
totalAssets,
|
|
50248
51301
|
totalSupply,
|
|
@@ -50276,7 +51329,7 @@ var readerLidoWstEth = (entry) => ({
|
|
|
50276
51329
|
return void 0;
|
|
50277
51330
|
}
|
|
50278
51331
|
return {
|
|
50279
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51332
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50280
51333
|
totalSupply,
|
|
50281
51334
|
exchangeRate
|
|
50282
51335
|
};
|
|
@@ -50314,7 +51367,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50314
51367
|
return {
|
|
50315
51368
|
totalAssets: totalSupply,
|
|
50316
51369
|
totalSupply,
|
|
50317
|
-
exchangeRate:
|
|
51370
|
+
exchangeRate: ONE_E189
|
|
50318
51371
|
};
|
|
50319
51372
|
}
|
|
50320
51373
|
};
|
|
@@ -50322,7 +51375,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50322
51375
|
return {
|
|
50323
51376
|
calls: [
|
|
50324
51377
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50325
|
-
{ address: manager, name: "convertSnBnbToBnb", params: [
|
|
51378
|
+
{ address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
|
|
50326
51379
|
{ address: manager, name: "getTotalPooledBnb", params: [] }
|
|
50327
51380
|
],
|
|
50328
51381
|
abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
|
|
@@ -50333,7 +51386,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50333
51386
|
return void 0;
|
|
50334
51387
|
}
|
|
50335
51388
|
const pooledBnb = toBigInt13(pooled);
|
|
50336
|
-
const totalAssets = pooledBnb ?? totalSupply * exchangeRate /
|
|
51389
|
+
const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
|
|
50337
51390
|
return { totalAssets, totalSupply, exchangeRate };
|
|
50338
51391
|
}
|
|
50339
51392
|
};
|
|
@@ -50363,7 +51416,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50363
51416
|
return {
|
|
50364
51417
|
totalAssets: totalSupply,
|
|
50365
51418
|
totalSupply,
|
|
50366
|
-
exchangeRate:
|
|
51419
|
+
exchangeRate: ONE_E189
|
|
50367
51420
|
};
|
|
50368
51421
|
}
|
|
50369
51422
|
};
|
|
@@ -50371,7 +51424,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50371
51424
|
return {
|
|
50372
51425
|
calls: [
|
|
50373
51426
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50374
|
-
{ address: staking, name: "mETHToETH", params: [
|
|
51427
|
+
{ address: staking, name: "mETHToETH", params: [ONE_E189] }
|
|
50375
51428
|
],
|
|
50376
51429
|
abis: [TotalSupplyAbi, MantleStakingAbi],
|
|
50377
51430
|
parse: ([supply, rate]) => {
|
|
@@ -50381,7 +51434,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50381
51434
|
return void 0;
|
|
50382
51435
|
}
|
|
50383
51436
|
return {
|
|
50384
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51437
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50385
51438
|
totalSupply,
|
|
50386
51439
|
exchangeRate
|
|
50387
51440
|
};
|
|
@@ -50402,7 +51455,7 @@ var readerOffChain = (entry) => {
|
|
|
50402
51455
|
return {
|
|
50403
51456
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
50404
51457
|
totalSupply,
|
|
50405
|
-
exchangeRate:
|
|
51458
|
+
exchangeRate: ONE_E189
|
|
50406
51459
|
};
|
|
50407
51460
|
}
|
|
50408
51461
|
};
|
|
@@ -50436,7 +51489,7 @@ var readerRenzoEzEth = (entry) => {
|
|
|
50436
51489
|
return {
|
|
50437
51490
|
totalAssets: totalSupply,
|
|
50438
51491
|
totalSupply,
|
|
50439
|
-
exchangeRate:
|
|
51492
|
+
exchangeRate: ONE_E189
|
|
50440
51493
|
};
|
|
50441
51494
|
}
|
|
50442
51495
|
};
|
|
@@ -50455,7 +51508,7 @@ var readerRenzoEzEth = (entry) => {
|
|
|
50455
51508
|
return {
|
|
50456
51509
|
totalAssets: totalTvl,
|
|
50457
51510
|
totalSupply,
|
|
50458
|
-
exchangeRate: totalTvl *
|
|
51511
|
+
exchangeRate: totalTvl * ONE_E189 / totalSupply
|
|
50459
51512
|
};
|
|
50460
51513
|
}
|
|
50461
51514
|
};
|
|
@@ -50511,7 +51564,7 @@ var readerRocketReth = (entry) => {
|
|
|
50511
51564
|
}
|
|
50512
51565
|
const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
|
|
50513
51566
|
return {
|
|
50514
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51567
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50515
51568
|
totalSupply,
|
|
50516
51569
|
exchangeRate,
|
|
50517
51570
|
liquidity
|
|
@@ -50553,7 +51606,7 @@ var readerStaderEthx = (entry) => {
|
|
|
50553
51606
|
return {
|
|
50554
51607
|
totalAssets: totalSupply,
|
|
50555
51608
|
totalSupply,
|
|
50556
|
-
exchangeRate:
|
|
51609
|
+
exchangeRate: ONE_E189
|
|
50557
51610
|
};
|
|
50558
51611
|
}
|
|
50559
51612
|
};
|
|
@@ -50571,7 +51624,7 @@ var readerStaderEthx = (entry) => {
|
|
|
50571
51624
|
return void 0;
|
|
50572
51625
|
}
|
|
50573
51626
|
return {
|
|
50574
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51627
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50575
51628
|
totalSupply,
|
|
50576
51629
|
exchangeRate
|
|
50577
51630
|
};
|
|
@@ -50588,7 +51641,7 @@ var readerStaderMaticX = (entry) => {
|
|
|
50588
51641
|
{
|
|
50589
51642
|
address: rateAddress,
|
|
50590
51643
|
name: "convertMaticXToMatic",
|
|
50591
|
-
params: [
|
|
51644
|
+
params: [ONE_E189],
|
|
50592
51645
|
chainId: homeChainId
|
|
50593
51646
|
}
|
|
50594
51647
|
],
|
|
@@ -50603,7 +51656,7 @@ var readerStaderMaticX = (entry) => {
|
|
|
50603
51656
|
}
|
|
50604
51657
|
const isCrossChain = homeContract !== void 0;
|
|
50605
51658
|
return {
|
|
50606
|
-
totalAssets: isCrossChain ? totalSupply * amountInMatic /
|
|
51659
|
+
totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
|
|
50607
51660
|
totalSupply,
|
|
50608
51661
|
exchangeRate: amountInMatic
|
|
50609
51662
|
};
|
|
@@ -50635,7 +51688,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50635
51688
|
return {
|
|
50636
51689
|
totalAssets: totalSupply,
|
|
50637
51690
|
totalSupply,
|
|
50638
|
-
exchangeRate:
|
|
51691
|
+
exchangeRate: ONE_E189
|
|
50639
51692
|
};
|
|
50640
51693
|
}
|
|
50641
51694
|
};
|
|
@@ -50643,7 +51696,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50643
51696
|
return {
|
|
50644
51697
|
calls: [
|
|
50645
51698
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50646
|
-
{ address: controller, name: "convertToAssets", params: [
|
|
51699
|
+
{ address: controller, name: "convertToAssets", params: [ONE_E189] }
|
|
50647
51700
|
],
|
|
50648
51701
|
abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
|
|
50649
51702
|
parse: ([supply, rate]) => {
|
|
@@ -50653,7 +51706,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50653
51706
|
return void 0;
|
|
50654
51707
|
}
|
|
50655
51708
|
return {
|
|
50656
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51709
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50657
51710
|
totalSupply,
|
|
50658
51711
|
exchangeRate
|
|
50659
51712
|
};
|
|
@@ -50685,7 +51738,7 @@ var readerStCelo = (entry) => {
|
|
|
50685
51738
|
return {
|
|
50686
51739
|
totalAssets: totalSupply,
|
|
50687
51740
|
totalSupply,
|
|
50688
|
-
exchangeRate:
|
|
51741
|
+
exchangeRate: ONE_E189
|
|
50689
51742
|
};
|
|
50690
51743
|
}
|
|
50691
51744
|
};
|
|
@@ -50693,7 +51746,7 @@ var readerStCelo = (entry) => {
|
|
|
50693
51746
|
return {
|
|
50694
51747
|
calls: [
|
|
50695
51748
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50696
|
-
{ address: manager, name: "toCelo", params: [
|
|
51749
|
+
{ address: manager, name: "toCelo", params: [ONE_E189] }
|
|
50697
51750
|
],
|
|
50698
51751
|
abis: [TotalSupplyAbi, StCeloManagerAbi],
|
|
50699
51752
|
parse: ([supply, rate]) => {
|
|
@@ -50703,7 +51756,7 @@ var readerStCelo = (entry) => {
|
|
|
50703
51756
|
return void 0;
|
|
50704
51757
|
}
|
|
50705
51758
|
return {
|
|
50706
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51759
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50707
51760
|
totalSupply,
|
|
50708
51761
|
exchangeRate
|
|
50709
51762
|
};
|
|
@@ -50736,7 +51789,7 @@ var readerSwellGetRate = (entry) => ({
|
|
|
50736
51789
|
return void 0;
|
|
50737
51790
|
}
|
|
50738
51791
|
return {
|
|
50739
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51792
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50740
51793
|
totalSupply,
|
|
50741
51794
|
exchangeRate
|
|
50742
51795
|
};
|
|
@@ -50767,7 +51820,7 @@ var readerValantisWstHype = (entry) => {
|
|
|
50767
51820
|
return {
|
|
50768
51821
|
totalAssets: totalSupply,
|
|
50769
51822
|
totalSupply,
|
|
50770
|
-
exchangeRate:
|
|
51823
|
+
exchangeRate: ONE_E189
|
|
50771
51824
|
};
|
|
50772
51825
|
}
|
|
50773
51826
|
};
|
|
@@ -50785,7 +51838,7 @@ var readerValantisWstHype = (entry) => {
|
|
|
50785
51838
|
return void 0;
|
|
50786
51839
|
}
|
|
50787
51840
|
return {
|
|
50788
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51841
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50789
51842
|
totalSupply,
|
|
50790
51843
|
exchangeRate
|
|
50791
51844
|
};
|
|
@@ -50819,7 +51872,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
50819
51872
|
return {
|
|
50820
51873
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
50821
51874
|
totalSupply,
|
|
50822
|
-
exchangeRate:
|
|
51875
|
+
exchangeRate: ONE_E189
|
|
50823
51876
|
};
|
|
50824
51877
|
}
|
|
50825
51878
|
};
|
|
@@ -50838,7 +51891,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
50838
51891
|
const exchangeRate = rawRate * scale;
|
|
50839
51892
|
return {
|
|
50840
51893
|
totalAssets: rescaleDecimals(
|
|
50841
|
-
totalSupply * exchangeRate /
|
|
51894
|
+
totalSupply * exchangeRate / ONE_E189,
|
|
50842
51895
|
shareDec,
|
|
50843
51896
|
underlyingDec
|
|
50844
51897
|
),
|
|
@@ -50874,9 +51927,9 @@ var readerAnkrRatio = (entry) => ({
|
|
|
50874
51927
|
return void 0;
|
|
50875
51928
|
}
|
|
50876
51929
|
return {
|
|
50877
|
-
totalAssets: totalSupply *
|
|
51930
|
+
totalAssets: totalSupply * ONE_E189 / r,
|
|
50878
51931
|
totalSupply,
|
|
50879
|
-
exchangeRate:
|
|
51932
|
+
exchangeRate: ONE_E189 * ONE_E189 / r
|
|
50880
51933
|
};
|
|
50881
51934
|
}
|
|
50882
51935
|
});
|
|
@@ -50920,7 +51973,7 @@ var readerCoreEarnRate = (entry) => {
|
|
|
50920
51973
|
return {
|
|
50921
51974
|
totalAssets: totalSupply * r / CORE_RATE_DENOM,
|
|
50922
51975
|
totalSupply,
|
|
50923
|
-
exchangeRate: r *
|
|
51976
|
+
exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
|
|
50924
51977
|
};
|
|
50925
51978
|
}
|
|
50926
51979
|
};
|
|
@@ -50942,7 +51995,7 @@ var readerCoreStakedRatio = (entry) => {
|
|
|
50942
51995
|
return {
|
|
50943
51996
|
totalAssets: totalStaked,
|
|
50944
51997
|
totalSupply,
|
|
50945
|
-
exchangeRate: totalStaked *
|
|
51998
|
+
exchangeRate: totalStaked * ONE_E189 / totalSupply
|
|
50946
51999
|
};
|
|
50947
52000
|
}
|
|
50948
52001
|
};
|
|
@@ -50973,7 +52026,7 @@ var readerStellaStDot = (entry) => ({
|
|
|
50973
52026
|
{
|
|
50974
52027
|
address: entry.address,
|
|
50975
52028
|
name: "getPooledTokenByShares",
|
|
50976
|
-
params: [
|
|
52029
|
+
params: [ONE_E189]
|
|
50977
52030
|
},
|
|
50978
52031
|
{ address: entry.address, name: "getTotalPooledToken", params: [] }
|
|
50979
52032
|
],
|
|
@@ -50984,7 +52037,7 @@ var readerStellaStDot = (entry) => ({
|
|
|
50984
52037
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
50985
52038
|
return void 0;
|
|
50986
52039
|
}
|
|
50987
|
-
const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate /
|
|
52040
|
+
const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E189;
|
|
50988
52041
|
return {
|
|
50989
52042
|
totalAssets,
|
|
50990
52043
|
totalSupply,
|
|
@@ -51022,7 +52075,7 @@ var readerKintsuSMon = (entry) => ({
|
|
|
51022
52075
|
const totalAssets = toBigInt13(pooled);
|
|
51023
52076
|
const totalSupply = toBigInt13(shares);
|
|
51024
52077
|
if (totalAssets === void 0 || totalSupply === void 0) return void 0;
|
|
51025
|
-
const exchangeRate = totalSupply > 0n ? totalAssets *
|
|
52078
|
+
const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
|
|
51026
52079
|
return { totalAssets, totalSupply, exchangeRate };
|
|
51027
52080
|
}
|
|
51028
52081
|
});
|
|
@@ -51458,7 +52511,7 @@ var getLstValidators = async (chainId, shareToken) => {
|
|
|
51458
52511
|
};
|
|
51459
52512
|
|
|
51460
52513
|
// src/vaults/lst/fetchPublic.ts
|
|
51461
|
-
var
|
|
52514
|
+
var ONE_E1810 = 10n ** 18n;
|
|
51462
52515
|
var ERC20_BALANCE_ABI = parseAbi([
|
|
51463
52516
|
"function balanceOf(address) view returns (uint256)"
|
|
51464
52517
|
]);
|
|
@@ -51573,8 +52626,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
51573
52626
|
const underlyingUnit = 10n ** BigInt(underlyingDec);
|
|
51574
52627
|
const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
|
|
51575
52628
|
const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
|
|
51576
|
-
const convertToAssets = state.exchangeRate * underlyingUnit /
|
|
51577
|
-
const convertToShares = state.exchangeRate > 0n ?
|
|
52629
|
+
const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
|
|
52630
|
+
const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
|
|
51578
52631
|
let liquidityRaw;
|
|
51579
52632
|
if (state.liquidity !== void 0) {
|
|
51580
52633
|
liquidityRaw = state.liquidity;
|
|
@@ -52245,16 +53298,17 @@ var Erc7540Abi = [
|
|
|
52245
53298
|
// src/vaults/lst/withdrawals/readers/erc7540.ts
|
|
52246
53299
|
var readerErc7540 = {
|
|
52247
53300
|
fetch: async (user, multicallRetry, chainId, entry) => {
|
|
53301
|
+
const requestContract = entry.lst;
|
|
52248
53302
|
const stage1 = await multicallRetry({
|
|
52249
53303
|
chain: chainId,
|
|
52250
53304
|
calls: [
|
|
52251
53305
|
{
|
|
52252
|
-
address:
|
|
53306
|
+
address: requestContract,
|
|
52253
53307
|
name: "pendingRedeemRequest",
|
|
52254
53308
|
params: [0n, user]
|
|
52255
53309
|
},
|
|
52256
53310
|
{
|
|
52257
|
-
address:
|
|
53311
|
+
address: requestContract,
|
|
52258
53312
|
name: "claimableRedeemRequest",
|
|
52259
53313
|
params: [0n, user]
|
|
52260
53314
|
}
|
|
@@ -52269,7 +53323,7 @@ var readerErc7540 = {
|
|
|
52269
53323
|
chain: chainId,
|
|
52270
53324
|
calls: [
|
|
52271
53325
|
{
|
|
52272
|
-
address:
|
|
53326
|
+
address: requestContract,
|
|
52273
53327
|
name: "convertToAssets",
|
|
52274
53328
|
params: [claimable]
|
|
52275
53329
|
}
|
|
@@ -52283,6 +53337,8 @@ var readerErc7540 = {
|
|
|
52283
53337
|
symbol: entry.symbol,
|
|
52284
53338
|
requestId: "0",
|
|
52285
53339
|
amountUnderlying: amount.toString(),
|
|
53340
|
+
// The 7540 claim (`redeem`) takes the share amount.
|
|
53341
|
+
shares: claimable.toString(),
|
|
52286
53342
|
status: "claimable"
|
|
52287
53343
|
});
|
|
52288
53344
|
}
|
|
@@ -52295,6 +53351,7 @@ var readerErc7540 = {
|
|
|
52295
53351
|
// Approximate to the share value at current price; UI can
|
|
52296
53352
|
// re-convert if it has the share exchangeRate.
|
|
52297
53353
|
amountUnderlying: pending.toString(),
|
|
53354
|
+
shares: pending.toString(),
|
|
52298
53355
|
status: "pending"
|
|
52299
53356
|
});
|
|
52300
53357
|
}
|
|
@@ -52353,6 +53410,172 @@ var readerEthenaCooldown = {
|
|
|
52353
53410
|
}
|
|
52354
53411
|
};
|
|
52355
53412
|
|
|
53413
|
+
// src/vaults/lst/withdrawals/abis/susd3.ts
|
|
53414
|
+
var Susd3CooldownStatusAbi = [
|
|
53415
|
+
{
|
|
53416
|
+
name: "getCooldownStatus",
|
|
53417
|
+
type: "function",
|
|
53418
|
+
stateMutability: "view",
|
|
53419
|
+
inputs: [{ type: "address", name: "user" }],
|
|
53420
|
+
outputs: [
|
|
53421
|
+
{ type: "uint256", name: "cooldownEnd" },
|
|
53422
|
+
{ type: "uint256", name: "windowEnd" },
|
|
53423
|
+
{ type: "uint256", name: "shares" }
|
|
53424
|
+
]
|
|
53425
|
+
},
|
|
53426
|
+
{
|
|
53427
|
+
name: "convertToAssets",
|
|
53428
|
+
type: "function",
|
|
53429
|
+
stateMutability: "view",
|
|
53430
|
+
inputs: [{ type: "uint256", name: "shares" }],
|
|
53431
|
+
outputs: [{ type: "uint256", name: "assets" }]
|
|
53432
|
+
}
|
|
53433
|
+
];
|
|
53434
|
+
|
|
53435
|
+
// src/vaults/lst/withdrawals/readers/susd3.ts
|
|
53436
|
+
var readerSusd3Cooldown = {
|
|
53437
|
+
fetch: async (user, multicallRetry, chainId, entry) => {
|
|
53438
|
+
const res = await multicallRetry({
|
|
53439
|
+
chain: chainId,
|
|
53440
|
+
calls: [
|
|
53441
|
+
{ address: entry.lst, name: "getCooldownStatus", params: [user] }
|
|
53442
|
+
],
|
|
53443
|
+
abi: [Susd3CooldownStatusAbi]
|
|
53444
|
+
});
|
|
53445
|
+
const cell = res[0];
|
|
53446
|
+
let cooldownEnd;
|
|
53447
|
+
let windowEnd;
|
|
53448
|
+
let shares;
|
|
53449
|
+
if (Array.isArray(cell)) {
|
|
53450
|
+
cooldownEnd = toBigInt14(cell[0]);
|
|
53451
|
+
windowEnd = toBigInt14(cell[1]);
|
|
53452
|
+
shares = toBigInt14(cell[2]);
|
|
53453
|
+
} else if (cell && typeof cell === "object") {
|
|
53454
|
+
cooldownEnd = toBigInt14(cell.cooldownEnd);
|
|
53455
|
+
windowEnd = toBigInt14(cell.windowEnd);
|
|
53456
|
+
shares = toBigInt14(cell.shares);
|
|
53457
|
+
}
|
|
53458
|
+
if (!shares || shares === 0n) return [];
|
|
53459
|
+
let amount = shares;
|
|
53460
|
+
try {
|
|
53461
|
+
const stage2 = await multicallRetry({
|
|
53462
|
+
chain: chainId,
|
|
53463
|
+
calls: [
|
|
53464
|
+
{ address: entry.lst, name: "convertToAssets", params: [shares] }
|
|
53465
|
+
],
|
|
53466
|
+
abi: [Susd3CooldownStatusAbi]
|
|
53467
|
+
});
|
|
53468
|
+
amount = toBigInt14(stage2[0]) ?? shares;
|
|
53469
|
+
} catch {
|
|
53470
|
+
}
|
|
53471
|
+
const readyAt = Number(cooldownEnd ?? 0n);
|
|
53472
|
+
const expiresAt = windowEnd && windowEnd > 0n && windowEnd < 10n ** 12n ? Number(windowEnd) : void 0;
|
|
53473
|
+
const out = [
|
|
53474
|
+
{
|
|
53475
|
+
lst: entry.lst,
|
|
53476
|
+
brand: entry.brand,
|
|
53477
|
+
symbol: entry.symbol,
|
|
53478
|
+
requestId: "0",
|
|
53479
|
+
amountUnderlying: amount.toString(),
|
|
53480
|
+
shares: shares.toString(),
|
|
53481
|
+
status: computeStatus(readyAt, expiresAt),
|
|
53482
|
+
readyAt,
|
|
53483
|
+
...expiresAt !== void 0 ? { expiresAt } : {}
|
|
53484
|
+
}
|
|
53485
|
+
];
|
|
53486
|
+
return out;
|
|
53487
|
+
}
|
|
53488
|
+
};
|
|
53489
|
+
|
|
53490
|
+
// src/vaults/lst/withdrawals/abis/strataCooldown.ts
|
|
53491
|
+
var StrataCooldownBalanceAbi = [
|
|
53492
|
+
{
|
|
53493
|
+
name: "balanceOf",
|
|
53494
|
+
type: "function",
|
|
53495
|
+
stateMutability: "view",
|
|
53496
|
+
inputs: [
|
|
53497
|
+
{ type: "address", name: "token" },
|
|
53498
|
+
{ type: "address", name: "user" }
|
|
53499
|
+
],
|
|
53500
|
+
outputs: [
|
|
53501
|
+
{
|
|
53502
|
+
type: "tuple",
|
|
53503
|
+
name: "state",
|
|
53504
|
+
components: [
|
|
53505
|
+
{ type: "uint256", name: "pending" },
|
|
53506
|
+
{ type: "uint256", name: "claimable" },
|
|
53507
|
+
{ type: "uint256", name: "nextUnlockAt" },
|
|
53508
|
+
{ type: "uint256", name: "nextUnlockAmount" },
|
|
53509
|
+
{ type: "uint256", name: "totalRequests" }
|
|
53510
|
+
]
|
|
53511
|
+
}
|
|
53512
|
+
]
|
|
53513
|
+
}
|
|
53514
|
+
];
|
|
53515
|
+
|
|
53516
|
+
// src/vaults/lst/withdrawals/readers/strataCooldown.ts
|
|
53517
|
+
var readerStrataCooldown = {
|
|
53518
|
+
fetch: async (user, multicallRetry, chainId, entry) => {
|
|
53519
|
+
const escrowToken = entry.escrowToken;
|
|
53520
|
+
if (!escrowToken) return [];
|
|
53521
|
+
const contracts = [
|
|
53522
|
+
entry.withdrawalContract,
|
|
53523
|
+
entry.secondaryWithdrawalContract
|
|
53524
|
+
].filter((c) => !!c);
|
|
53525
|
+
if (contracts.length === 0) return [];
|
|
53526
|
+
const res = await multicallRetry({
|
|
53527
|
+
chain: chainId,
|
|
53528
|
+
calls: contracts.map((address) => ({
|
|
53529
|
+
address,
|
|
53530
|
+
name: "balanceOf",
|
|
53531
|
+
params: [escrowToken, user]
|
|
53532
|
+
})),
|
|
53533
|
+
abi: contracts.map(() => StrataCooldownBalanceAbi)
|
|
53534
|
+
});
|
|
53535
|
+
const out = [];
|
|
53536
|
+
for (let i = 0; i < contracts.length; i++) {
|
|
53537
|
+
const cell = res[i];
|
|
53538
|
+
let pending;
|
|
53539
|
+
let claimable;
|
|
53540
|
+
let nextUnlockAt;
|
|
53541
|
+
if (Array.isArray(cell)) {
|
|
53542
|
+
pending = toBigInt14(cell[0]);
|
|
53543
|
+
claimable = toBigInt14(cell[1]);
|
|
53544
|
+
nextUnlockAt = toNumber(cell[2]);
|
|
53545
|
+
} else if (cell && typeof cell === "object") {
|
|
53546
|
+
pending = toBigInt14(cell.pending);
|
|
53547
|
+
claimable = toBigInt14(cell.claimable);
|
|
53548
|
+
nextUnlockAt = toNumber(cell.nextUnlockAt);
|
|
53549
|
+
}
|
|
53550
|
+
const escrow = { withdrawQueue: contracts[i], claimToken: escrowToken };
|
|
53551
|
+
if (claimable && claimable > 0n) {
|
|
53552
|
+
out.push({
|
|
53553
|
+
lst: entry.lst,
|
|
53554
|
+
brand: entry.brand,
|
|
53555
|
+
symbol: entry.symbol,
|
|
53556
|
+
requestId: `${i * 2}`,
|
|
53557
|
+
amountUnderlying: claimable.toString(),
|
|
53558
|
+
status: "claimable",
|
|
53559
|
+
...escrow
|
|
53560
|
+
});
|
|
53561
|
+
}
|
|
53562
|
+
if (pending && pending > 0n) {
|
|
53563
|
+
out.push({
|
|
53564
|
+
lst: entry.lst,
|
|
53565
|
+
brand: entry.brand,
|
|
53566
|
+
symbol: entry.symbol,
|
|
53567
|
+
requestId: `${i * 2 + 1}`,
|
|
53568
|
+
amountUnderlying: pending.toString(),
|
|
53569
|
+
status: "pending",
|
|
53570
|
+
...nextUnlockAt ? { readyAt: nextUnlockAt } : {},
|
|
53571
|
+
...escrow
|
|
53572
|
+
});
|
|
53573
|
+
}
|
|
53574
|
+
}
|
|
53575
|
+
return out;
|
|
53576
|
+
}
|
|
53577
|
+
};
|
|
53578
|
+
|
|
52356
53579
|
// src/vaults/lst/withdrawals/abis/etherfi.ts
|
|
52357
53580
|
var EtherFiWithdrawRequestAbi = [
|
|
52358
53581
|
{
|
|
@@ -52567,7 +53790,9 @@ var readerKelp = {
|
|
|
52567
53790
|
}
|
|
52568
53791
|
const stage2 = await multicallRetry({
|
|
52569
53792
|
chain: chainId,
|
|
52570
|
-
calls: detailCalls.map(
|
|
53793
|
+
calls: detailCalls.map(
|
|
53794
|
+
({ _asset: _3, ...rest }) => rest
|
|
53795
|
+
),
|
|
52571
53796
|
abi: detailCalls.map(() => KelpWithdrawalManagerAbi)
|
|
52572
53797
|
});
|
|
52573
53798
|
const out = [];
|
|
@@ -53121,9 +54346,7 @@ var readerMantle = {
|
|
|
53121
54346
|
const results = await multicallRetry({
|
|
53122
54347
|
chain: chainId,
|
|
53123
54348
|
calls,
|
|
53124
|
-
abi: calls.map(
|
|
53125
|
-
() => MantleUnstakeRequestsManagerAbi
|
|
53126
|
-
)
|
|
54349
|
+
abi: calls.map(() => MantleUnstakeRequestsManagerAbi)
|
|
53127
54350
|
});
|
|
53128
54351
|
const out = [];
|
|
53129
54352
|
const lcUser = user.toLowerCase();
|
|
@@ -54000,6 +55223,10 @@ var buildWithdrawalReader = (entry) => {
|
|
|
54000
55223
|
return readerErc7540;
|
|
54001
55224
|
case "ethenaCooldown":
|
|
54002
55225
|
return readerEthenaCooldown;
|
|
55226
|
+
case "susd3Cooldown":
|
|
55227
|
+
return readerSusd3Cooldown;
|
|
55228
|
+
case "strataCooldown":
|
|
55229
|
+
return readerStrataCooldown;
|
|
54003
55230
|
case "swellNft":
|
|
54004
55231
|
return readerSwell;
|
|
54005
55232
|
case "stakeWiseSubgraph":
|
|
@@ -54063,6 +55290,14 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54063
55290
|
symbol: "LBTC",
|
|
54064
55291
|
reader: "unverified"
|
|
54065
55292
|
},
|
|
55293
|
+
{
|
|
55294
|
+
// Lombard LBTCv (Veda BoringVault) — queue mechanics not yet
|
|
55295
|
+
// implemented; placeholder so the orchestrator surfaces the asset.
|
|
55296
|
+
lst: "0x5401b8620e5fb570064ca9114fd1e135fd77d57c",
|
|
55297
|
+
brand: "Lombard",
|
|
55298
|
+
symbol: "LBTCv",
|
|
55299
|
+
reader: "unverified"
|
|
55300
|
+
},
|
|
54066
55301
|
{
|
|
54067
55302
|
lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
|
|
54068
55303
|
brand: "ether.fi",
|
|
@@ -54129,6 +55364,134 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54129
55364
|
symbol: "savETH",
|
|
54130
55365
|
reader: "ethenaCooldown"
|
|
54131
55366
|
},
|
|
55367
|
+
{
|
|
55368
|
+
// Tori strUSD — StakedUSDeV2 clone over trUSD; same cooldowns(address)
|
|
55369
|
+
// escrow surface (7d, owner-mutable), claim via `unstake`.
|
|
55370
|
+
lst: "0x280839980a7ed0d7717f64125fe241012e5f5815",
|
|
55371
|
+
brand: "Tori",
|
|
55372
|
+
symbol: "strUSD",
|
|
55373
|
+
reader: "ethenaCooldown"
|
|
55374
|
+
},
|
|
55375
|
+
{
|
|
55376
|
+
// Neutrl sNUSD — StakedUSDeV2 clone over NUSD; cooldowns(address)
|
|
55377
|
+
// escrow (10d), claim via `unstake`.
|
|
55378
|
+
lst: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313",
|
|
55379
|
+
brand: "Neutrl",
|
|
55380
|
+
symbol: "sNUSD",
|
|
55381
|
+
reader: "ethenaCooldown"
|
|
55382
|
+
},
|
|
55383
|
+
{
|
|
55384
|
+
// 3Jane sUSD3 — startCooldown(shares) → 30d → plain 4626 redeem
|
|
55385
|
+
// inside the withdrawal window; getCooldownStatus(address) getter.
|
|
55386
|
+
lst: "0xf689555121e529ff0463e191f9bd9d1e496164a7",
|
|
55387
|
+
brand: "3Jane",
|
|
55388
|
+
symbol: "sUSD3",
|
|
55389
|
+
reader: "susd3Cooldown"
|
|
55390
|
+
},
|
|
55391
|
+
{
|
|
55392
|
+
// Apyx apyUSD — NOT enumerable today. The 4626 redeem escrows the
|
|
55393
|
+
// apxUSD and mints a **soulbound ERC-721** on the receipt contract
|
|
55394
|
+
// `apyUSD.receipt()` = 0x9bf51f33…, which is the only handle on the
|
|
55395
|
+
// pending exit and exposes no per-owner enumeration. The vault also
|
|
55396
|
+
// has an `unlockToken()` (0x93775e2d…) carrying 7540-shaped getters,
|
|
55397
|
+
// but they are the wrong surface: verified 2026-08-04 that
|
|
55398
|
+
// `pendingRedeemRequest(0, user)` / `claimableRedeemRequest(0, user)`
|
|
55399
|
+
// both return 0 for addresses genuinely holding open receipt NFTs.
|
|
55400
|
+
// The claim needs the `tokenId` (read from the redeem's `Transfer`
|
|
55401
|
+
// log), so the real fix is a caller-supplied-ids reader in the
|
|
55402
|
+
// Mantle/Puffer/TruFin mould — see INDEXING_STRATEGIES.md.
|
|
55403
|
+
lst: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
|
|
55404
|
+
brand: "Apyx",
|
|
55405
|
+
symbol: "apyUSD",
|
|
55406
|
+
reader: "unverified"
|
|
55407
|
+
},
|
|
55408
|
+
// Strata tranche markets — ONE entry per market (not per tranche):
|
|
55409
|
+
// both tranches escrow into the same two per-market ICooldown
|
|
55410
|
+
// contracts keyed by (escrowToken, user) with no tranche
|
|
55411
|
+
// attribution, so per-tranche rows would double-report. `lst` is the
|
|
55412
|
+
// SENIOR tranche address — the catalog resolves it to the savings
|
|
55413
|
+
// provider, and the calldata-sdk `strata` claim built against it
|
|
55414
|
+
// finalizes the whole market's unlocked requests (senior AND
|
|
55415
|
+
// junior). The escrow is KEYED by the collateral token but its
|
|
55416
|
+
// recorded amounts are per-leg — see the reader for the trap.
|
|
55417
|
+
{
|
|
55418
|
+
lst: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
|
|
55419
|
+
// srUSDe
|
|
55420
|
+
brand: "Strata",
|
|
55421
|
+
symbol: "srUSDe/jrUSDe",
|
|
55422
|
+
reader: "strataCooldown",
|
|
55423
|
+
withdrawalContract: "0x735eddf50ca2371aa48466469c742e684c610f74",
|
|
55424
|
+
// UnstakeCooldown
|
|
55425
|
+
secondaryWithdrawalContract: "0xd6dad17d025cddded27305aebab8b277996a6faf",
|
|
55426
|
+
// ERC20Cooldown
|
|
55427
|
+
escrowToken: "0x9d39a5de30e57443bff2a8307a4256c8797a3497"
|
|
55428
|
+
// sUSDe
|
|
55429
|
+
},
|
|
55430
|
+
{
|
|
55431
|
+
lst: "0x65a44528e8868166401ea08b549e19552af589db",
|
|
55432
|
+
// srNUSD
|
|
55433
|
+
brand: "Strata",
|
|
55434
|
+
symbol: "srNUSD/jrNUSD",
|
|
55435
|
+
reader: "strataCooldown",
|
|
55436
|
+
withdrawalContract: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
|
|
55437
|
+
// NeutrlUnstakeCooldown
|
|
55438
|
+
secondaryWithdrawalContract: "0x1abc3c3c15a862276d057b2acbcfeab358907990",
|
|
55439
|
+
// NeutrlERC20Cooldown
|
|
55440
|
+
escrowToken: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313"
|
|
55441
|
+
// sNUSD
|
|
55442
|
+
},
|
|
55443
|
+
{
|
|
55444
|
+
lst: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
|
|
55445
|
+
// srmHYPER
|
|
55446
|
+
brand: "Strata",
|
|
55447
|
+
symbol: "srmHYPER/jrmHYPER",
|
|
55448
|
+
reader: "strataCooldown",
|
|
55449
|
+
withdrawalContract: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
|
|
55450
|
+
// MHyperUnstakeCooldown
|
|
55451
|
+
secondaryWithdrawalContract: "0x71ec07bba60e854c4b2466068be1c8d5b5788fda",
|
|
55452
|
+
// MHyperERC20Cooldown
|
|
55453
|
+
escrowToken: "0x9b5528528656dbc094765e2abb79f293c21191b9"
|
|
55454
|
+
// mHYPER
|
|
55455
|
+
},
|
|
55456
|
+
{
|
|
55457
|
+
lst: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
|
|
55458
|
+
// srmM1-USD
|
|
55459
|
+
brand: "Strata",
|
|
55460
|
+
symbol: "srmM1-USD/jrmM1-USD",
|
|
55461
|
+
reader: "strataCooldown",
|
|
55462
|
+
withdrawalContract: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
|
|
55463
|
+
// MM1USDUnstakeCooldown
|
|
55464
|
+
secondaryWithdrawalContract: "0x4c2680ae06a0bb0b091e5ccca13cb03f4f72296e",
|
|
55465
|
+
// MM1USDERC20Cooldown
|
|
55466
|
+
escrowToken: "0xcc5c22c7a6bcc25e66726aef011dde74289ed203"
|
|
55467
|
+
// mM1-USD
|
|
55468
|
+
},
|
|
55469
|
+
{
|
|
55470
|
+
lst: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
|
|
55471
|
+
// srUSDat
|
|
55472
|
+
brand: "Strata",
|
|
55473
|
+
symbol: "srUSDat/jrUSDat",
|
|
55474
|
+
reader: "strataCooldown",
|
|
55475
|
+
withdrawalContract: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
|
|
55476
|
+
// SaturnUnstakeCooldown
|
|
55477
|
+
secondaryWithdrawalContract: "0x25138d10837ab0278eb860454e1045f2b92929ab",
|
|
55478
|
+
// SaturnERC20Cooldown
|
|
55479
|
+
escrowToken: "0xd166337499e176bbc38a1fbd113ab144e5bd2df7"
|
|
55480
|
+
// sUSDat
|
|
55481
|
+
},
|
|
55482
|
+
{
|
|
55483
|
+
lst: "0x35bff778d3fc53a561486bf28e761428499232eb",
|
|
55484
|
+
// srPRIME
|
|
55485
|
+
brand: "Strata",
|
|
55486
|
+
symbol: "srPRIME/jrPRIME",
|
|
55487
|
+
reader: "strataCooldown",
|
|
55488
|
+
withdrawalContract: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
|
|
55489
|
+
// FigureUnstakeCooldown
|
|
55490
|
+
secondaryWithdrawalContract: "0xbe71d21addba5c9aac5b4e006db1715ef1e324be",
|
|
55491
|
+
// FigureERC20Cooldown
|
|
55492
|
+
escrowToken: "0x19ebb35279a16207ec4ba82799cc64715065f7f6"
|
|
55493
|
+
// PRIME
|
|
55494
|
+
},
|
|
54132
55495
|
{
|
|
54133
55496
|
lst: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee",
|
|
54134
55497
|
brand: "EtherFi",
|
|
@@ -54228,6 +55591,14 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54228
55591
|
symbol: "rETH",
|
|
54229
55592
|
reader: "noQueue"
|
|
54230
55593
|
},
|
|
55594
|
+
{
|
|
55595
|
+
// Frax sfrxETH — vanilla ERC-4626 instant redeem to frxETH (the
|
|
55596
|
+
// frxETH → ETH leg is DEX-only, not a protocol queue).
|
|
55597
|
+
lst: "0xac3e018457b222d93114458476f3e3416abbe38f",
|
|
55598
|
+
brand: "Frax",
|
|
55599
|
+
symbol: "sfrxETH",
|
|
55600
|
+
reader: "noQueue"
|
|
55601
|
+
},
|
|
54231
55602
|
{
|
|
54232
55603
|
lst: "0xbe9895146f7af43049ca1c1ae358b0541ea49704",
|
|
54233
55604
|
brand: "Coinbase",
|
|
@@ -54350,6 +55721,36 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54350
55721
|
reader: "ethenaCooldown"
|
|
54351
55722
|
}
|
|
54352
55723
|
],
|
|
55724
|
+
// Monad LSTs — all four are `queued` in the main registry but their
|
|
55725
|
+
// per-protocol request enumeration is not implemented yet; listed as
|
|
55726
|
+
// `unverified` placeholders so the orchestrator surfaces the asset
|
|
55727
|
+
// (returning []) instead of silently omitting it.
|
|
55728
|
+
"143": [
|
|
55729
|
+
{
|
|
55730
|
+
lst: "0x1b68626dca36c7fe922fd2d55e4f631d962de19c",
|
|
55731
|
+
brand: "Shmonad",
|
|
55732
|
+
symbol: "shMON",
|
|
55733
|
+
reader: "unverified"
|
|
55734
|
+
},
|
|
55735
|
+
{
|
|
55736
|
+
lst: "0x0c65a0bc65a5d819235b71f554d210d3f80e0852",
|
|
55737
|
+
brand: "aPriori",
|
|
55738
|
+
symbol: "aprMON",
|
|
55739
|
+
reader: "unverified"
|
|
55740
|
+
},
|
|
55741
|
+
{
|
|
55742
|
+
lst: "0xa3227c5969757783154c60bf0bc1944180ed81b9",
|
|
55743
|
+
brand: "Kintsu",
|
|
55744
|
+
symbol: "sMON",
|
|
55745
|
+
reader: "unverified"
|
|
55746
|
+
},
|
|
55747
|
+
{
|
|
55748
|
+
lst: "0x8498312a6b3cbd158bf0c93abdcf29e6e4f55081",
|
|
55749
|
+
brand: "Magma",
|
|
55750
|
+
symbol: "gMON",
|
|
55751
|
+
reader: "unverified"
|
|
55752
|
+
}
|
|
55753
|
+
],
|
|
54353
55754
|
"146": [
|
|
54354
55755
|
{
|
|
54355
55756
|
lst: "0xe5da20f15420ad15de0fa650600afc998bbe3955",
|
|
@@ -54631,7 +56032,7 @@ var NavOracleReadAbi = [
|
|
|
54631
56032
|
];
|
|
54632
56033
|
|
|
54633
56034
|
// src/vaults/savings/readers/shared.ts
|
|
54634
|
-
var
|
|
56035
|
+
var ONE_E1811 = 10n ** 18n;
|
|
54635
56036
|
var toBigInt15 = (v) => {
|
|
54636
56037
|
if (v === void 0 || v === null) return void 0;
|
|
54637
56038
|
if (typeof v === "bigint") return v;
|
|
@@ -54672,7 +56073,7 @@ var readerErc46262 = (entry) => {
|
|
|
54672
56073
|
return {
|
|
54673
56074
|
totalAssets,
|
|
54674
56075
|
totalSupply,
|
|
54675
|
-
exchangeRate: convertToAssetsRaw *
|
|
56076
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
|
|
54676
56077
|
};
|
|
54677
56078
|
}
|
|
54678
56079
|
};
|
|
@@ -54780,7 +56181,7 @@ var readerErc4626Idle = (entry) => {
|
|
|
54780
56181
|
return {
|
|
54781
56182
|
totalAssets,
|
|
54782
56183
|
totalSupply,
|
|
54783
|
-
exchangeRate: convertToAssetsRaw *
|
|
56184
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
|
|
54784
56185
|
...capacity !== void 0 ? {
|
|
54785
56186
|
instantRedeemCapacity: capacity,
|
|
54786
56187
|
instantRedeemEnabled: true,
|
|
@@ -54829,7 +56230,7 @@ var readerErc4626WithdrawLimit = (entry) => {
|
|
|
54829
56230
|
return {
|
|
54830
56231
|
totalAssets,
|
|
54831
56232
|
totalSupply,
|
|
54832
|
-
exchangeRate: convertToAssetsRaw *
|
|
56233
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
|
|
54833
56234
|
...capacity !== void 0 ? {
|
|
54834
56235
|
instantRedeemCapacity: capacity,
|
|
54835
56236
|
instantRedeemEnabled: true,
|
|
@@ -54861,7 +56262,7 @@ var readerNavOracle = (entry) => {
|
|
|
54861
56262
|
const exchangeRate = toBigInt15(raw);
|
|
54862
56263
|
if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
|
|
54863
56264
|
return {
|
|
54864
|
-
totalAssets: totalSupply * exchangeRate * underlyingUnit / (
|
|
56265
|
+
totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
|
|
54865
56266
|
totalSupply,
|
|
54866
56267
|
exchangeRate
|
|
54867
56268
|
};
|
|
@@ -54875,7 +56276,7 @@ var readerNativeWnlp = (entry) => {
|
|
|
54875
56276
|
return {
|
|
54876
56277
|
calls: [
|
|
54877
56278
|
{ address, name: "totalSupply", params: [] },
|
|
54878
|
-
{ address, name: "getNlpByWnlp", params: [
|
|
56279
|
+
{ address, name: "getNlpByWnlp", params: [ONE_E1811] },
|
|
54879
56280
|
{ address, name: "instantRedeemFeeBips", params: [] },
|
|
54880
56281
|
{ address, name: "instantRedeemEnabled", params: [] },
|
|
54881
56282
|
// Falls back to the vault itself when no CreditVault is pinned —
|
|
@@ -54909,7 +56310,7 @@ var readerNativeWnlp = (entry) => {
|
|
|
54909
56310
|
const windowSeconds = toBigInt15(window);
|
|
54910
56311
|
const bips = toBigInt15(feeBips);
|
|
54911
56312
|
return {
|
|
54912
|
-
totalAssets: totalSupply * exchangeRate /
|
|
56313
|
+
totalAssets: totalSupply * exchangeRate / ONE_E1811,
|
|
54913
56314
|
totalSupply,
|
|
54914
56315
|
exchangeRate,
|
|
54915
56316
|
// `instantRedeemFeeBips` on-chain is already basis points, so it
|
|
@@ -54947,7 +56348,7 @@ var buildReader2 = (entry) => {
|
|
|
54947
56348
|
var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
|
|
54948
56349
|
|
|
54949
56350
|
// src/vaults/savings/fetchPublic.ts
|
|
54950
|
-
var
|
|
56351
|
+
var ONE_E1812 = 10n ** 18n;
|
|
54951
56352
|
var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
|
|
54952
56353
|
const entries = getSavingsRegistry(chainId);
|
|
54953
56354
|
if (entries.length === 0) return {};
|
|
@@ -54996,8 +56397,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
54996
56397
|
1,
|
|
54997
56398
|
Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
|
|
54998
56399
|
) : 1;
|
|
54999
|
-
const convertToAssets = state.exchangeRate * underlyingUnit /
|
|
55000
|
-
const convertToShares = state.exchangeRate > 0n ?
|
|
56400
|
+
const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1812;
|
|
56401
|
+
const convertToShares = state.exchangeRate > 0n ? ONE_E1812 * shareUnit / state.exchangeRate : 0n;
|
|
55001
56402
|
const displayName = composeVaultDisplayName(
|
|
55002
56403
|
entry.brand,
|
|
55003
56404
|
entry.brand,
|
|
@@ -56714,23 +58115,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
|
|
|
56714
58115
|
const indexMax = price(prices, m.indexToken)?.max;
|
|
56715
58116
|
if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
|
|
56716
58117
|
const base = i * SLOTS;
|
|
56717
|
-
const
|
|
58118
|
+
const big9 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
|
|
56718
58119
|
const cap = computeDepositCapacityUsd(
|
|
56719
|
-
[info?.longTokenAmount, longMax,
|
|
56720
|
-
[info?.shortTokenAmount, shortMax,
|
|
58120
|
+
[info?.longTokenAmount, longMax, big9(0), big9(2)],
|
|
58121
|
+
[info?.shortTokenAmount, shortMax, big9(1), big9(3)]
|
|
56721
58122
|
);
|
|
56722
58123
|
if (cap != null) value.depositCapacityUsd = cap;
|
|
56723
58124
|
if (indexMax != null) {
|
|
56724
58125
|
const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
|
|
56725
|
-
const reservedUsdLong = (
|
|
56726
|
-
const reservedUsdShort = (
|
|
58126
|
+
const reservedUsdLong = (big9(4) + big9(5)) / divisor * indexMax;
|
|
58127
|
+
const reservedUsdShort = (big9(6) + big9(7)) / divisor;
|
|
56727
58128
|
const liq = computeLiquidityUsd(
|
|
56728
58129
|
info?.longTokenUsd,
|
|
56729
58130
|
info?.shortTokenUsd,
|
|
56730
58131
|
reservedUsdLong,
|
|
56731
58132
|
reservedUsdShort,
|
|
56732
|
-
|
|
56733
|
-
|
|
58133
|
+
big9(8),
|
|
58134
|
+
big9(9)
|
|
56734
58135
|
);
|
|
56735
58136
|
if (liq != null)
|
|
56736
58137
|
value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
|
|
@@ -56929,21 +58330,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
|
|
|
56929
58330
|
} catch {
|
|
56930
58331
|
return void 0;
|
|
56931
58332
|
}
|
|
56932
|
-
const
|
|
56933
|
-
const base =
|
|
56934
|
-
const mult =
|
|
58333
|
+
const big9 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
|
|
58334
|
+
const base = big9(0);
|
|
58335
|
+
const mult = big9(1);
|
|
56935
58336
|
if (base === 0n && mult === 0n) return void 0;
|
|
56936
58337
|
const PRECISION = 10n ** 30n;
|
|
56937
58338
|
const adjusted = (opGas) => base + opGas * mult / PRECISION;
|
|
56938
58339
|
const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
|
|
56939
|
-
const glvExtra =
|
|
58340
|
+
const glvExtra = big9(6) * GLV_NOMINAL_MARKET_COUNT;
|
|
56940
58341
|
return {
|
|
56941
58342
|
chainId,
|
|
56942
58343
|
gasPriceWei: gasPriceWei.toString(),
|
|
56943
|
-
deposit: fee(
|
|
56944
|
-
withdrawal: fee(
|
|
56945
|
-
glvDeposit: fee(
|
|
56946
|
-
glvWithdrawal: fee(
|
|
58344
|
+
deposit: fee(big9(2)),
|
|
58345
|
+
withdrawal: fee(big9(3)),
|
|
58346
|
+
glvDeposit: fee(big9(4) + glvExtra),
|
|
58347
|
+
glvWithdrawal: fee(big9(5) + glvExtra)
|
|
56947
58348
|
};
|
|
56948
58349
|
};
|
|
56949
58350
|
|
|
@@ -57330,7 +58731,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
|
|
|
57330
58731
|
};
|
|
57331
58732
|
|
|
57332
58733
|
// src/vaults/yield/annualize.ts
|
|
57333
|
-
var
|
|
58734
|
+
var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
|
|
57334
58735
|
var SCALE = 10n ** 18n;
|
|
57335
58736
|
var appendSnapshot = (points, snap, options) => {
|
|
57336
58737
|
const maxPoints = options?.maxPoints ?? 90;
|
|
@@ -57359,7 +58760,7 @@ var computeVaultApr = (points, options) => {
|
|
|
57359
58760
|
if (pThen === 0n) return void 0;
|
|
57360
58761
|
const ratioScaled = BigInt(now.p) * SCALE / pThen;
|
|
57361
58762
|
const ratio = Number(ratioScaled) / 1e18;
|
|
57362
|
-
const apr = (ratio - 1) * (
|
|
58763
|
+
const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
|
|
57363
58764
|
return {
|
|
57364
58765
|
apr,
|
|
57365
58766
|
sharePriceNow: now.p,
|
|
@@ -58162,6 +59563,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
|
|
|
58162
59563
|
return parseTokenBalanceResult(rawResult, prepared.query);
|
|
58163
59564
|
}
|
|
58164
59565
|
|
|
58165
|
-
export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats };
|
|
59566
|
+
export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey };
|
|
58166
59567
|
//# sourceMappingURL=index.js.map
|
|
58167
59568
|
//# sourceMappingURL=index.js.map
|