@1delta/margin-fetcher 0.0.408 → 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 +1707 -291
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- 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();
|
|
@@ -23706,6 +23709,12 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
23706
23709
|
// up as a term product.
|
|
23707
23710
|
stableBorrowRate: borrowAprPct,
|
|
23708
23711
|
intrinsicYield: 0,
|
|
23712
|
+
// One-off GT-mint fee as a PERCENT of the amount borrowed, charged once at
|
|
23713
|
+
// borrow time (`issueFee = debt · mintGtFeeRatio / 1e8`). The canonical
|
|
23714
|
+
// top-level field — `fixedTerm.fees.originationFeePercent` alone is not
|
|
23715
|
+
// read by the cost math, which is why this fee was never folded into
|
|
23716
|
+
// borrow cost downstream. NOT an APR: never add it to a rate.
|
|
23717
|
+
originationFee: originationFeePercent || void 0,
|
|
23709
23718
|
rewards: void 0,
|
|
23710
23719
|
decimals: config.debtDecimals,
|
|
23711
23720
|
config: {
|
|
@@ -23725,9 +23734,18 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
23725
23734
|
borrowingEnabled: !matured && borrowLiquidity > 0,
|
|
23726
23735
|
depositsEnabled: !matured,
|
|
23727
23736
|
hasStable: false,
|
|
23728
|
-
//
|
|
23729
|
-
//
|
|
23730
|
-
|
|
23737
|
+
// TermMax has NO variable rate at all — `variableBorrowRate` above is only
|
|
23738
|
+
// ever a MIRROR of the best term APR. When no order quotes the borrow side
|
|
23739
|
+
// the mirror is 0, and a consumer that reads it as a floating rate sees a
|
|
23740
|
+
// FREE borrow and levers against it (observed: 9 of 15 chain-1 pairs
|
|
23741
|
+
// sorting to the top of the optimizer at 128% "net APR").
|
|
23742
|
+
//
|
|
23743
|
+
// Flag it, exactly as Term Finance and Teller do — a `variableBorrowRate`
|
|
23744
|
+
// of 0 is NOT a free borrow. Consumers read the `terms[]` card (and
|
|
23745
|
+
// `fixedTerm`) instead. Deliberately unconditional rather than
|
|
23746
|
+
// `borrowAprPct === 0`: the semantic is "this lender has no variable
|
|
23747
|
+
// product", which does not change with book depth.
|
|
23748
|
+
variableBorrowDisabled: true,
|
|
23731
23749
|
isActive: true,
|
|
23732
23750
|
isFrozen: false
|
|
23733
23751
|
};
|
|
@@ -24160,6 +24178,264 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
|
|
|
24160
24178
|
}
|
|
24161
24179
|
return out;
|
|
24162
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
|
+
}
|
|
24163
24439
|
|
|
24164
24440
|
// src/lending/public-data/silo-v2/fetchPublic.ts
|
|
24165
24441
|
var BASE_URL2 = "https://api-v3.silo.finance";
|
|
@@ -24770,6 +25046,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
|
|
|
24770
25046
|
if (isTeller(lender)) return await fetchTellerMarkets(chainId);
|
|
24771
25047
|
if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
|
|
24772
25048
|
if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
|
|
25049
|
+
if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
|
|
24773
25050
|
return {};
|
|
24774
25051
|
}
|
|
24775
25052
|
function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
|
|
@@ -24831,6 +25108,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
|
|
|
24831
25108
|
additionalYields,
|
|
24832
25109
|
list
|
|
24833
25110
|
);
|
|
25111
|
+
if (isUsdd(lender))
|
|
25112
|
+
return convertUsddMarketsToResponse(
|
|
25113
|
+
data,
|
|
25114
|
+
chainId,
|
|
25115
|
+
prices,
|
|
25116
|
+
additionalYields,
|
|
25117
|
+
list
|
|
25118
|
+
);
|
|
24834
25119
|
if (isTermMax(lender))
|
|
24835
25120
|
return convertTermMaxMarketsToResponse(
|
|
24836
25121
|
data,
|
|
@@ -25040,6 +25325,7 @@ function lenderApiOnly(lender, chainId) {
|
|
|
25040
25325
|
if (isTeller(lender)) return true;
|
|
25041
25326
|
if (isInverse(lender)) return true;
|
|
25042
25327
|
if (isTermMax(lender)) return true;
|
|
25328
|
+
if (isUsdd(lender)) return true;
|
|
25043
25329
|
return false;
|
|
25044
25330
|
}
|
|
25045
25331
|
function lenderApiWithOnChainFallback(lender, chainId) {
|
|
@@ -26231,15 +26517,132 @@ var buildInverseUserCall = (chainId, lender, account) => {
|
|
|
26231
26517
|
);
|
|
26232
26518
|
return calls;
|
|
26233
26519
|
};
|
|
26234
|
-
var
|
|
26520
|
+
var USDD_CALLS_PER_CDP = 1;
|
|
26521
|
+
var MAX_CDP_WALK = 64;
|
|
26235
26522
|
var CACHE_TTL_MS2 = 5 * 6e4;
|
|
26236
26523
|
var discoveryCache2 = /* @__PURE__ */ new Map();
|
|
26237
26524
|
var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
26238
|
-
var
|
|
26525
|
+
var getCachedUsddCdps = (chainId, account) => {
|
|
26239
26526
|
const hit = discoveryCache2.get(cacheKey2(chainId, account));
|
|
26240
26527
|
if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
|
|
26241
26528
|
return hit;
|
|
26242
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
|
+
};
|
|
26243
26646
|
var nowSec5 = () => Math.floor(Date.now() / 1e3);
|
|
26244
26647
|
var toBigints = (arr) => {
|
|
26245
26648
|
if (!Array.isArray(arr)) return [];
|
|
@@ -26277,7 +26680,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26277
26680
|
return [];
|
|
26278
26681
|
}
|
|
26279
26682
|
if (ids.length === 0) {
|
|
26280
|
-
|
|
26683
|
+
discoveryCache3.set(cacheKey3(chainId, account), { bids: [], at: Date.now() });
|
|
26281
26684
|
return [];
|
|
26282
26685
|
}
|
|
26283
26686
|
const poolByAddr = /* @__PURE__ */ new Map();
|
|
@@ -26304,7 +26707,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26304
26707
|
const pool = poolByAddr.get(lenderAddr);
|
|
26305
26708
|
if (pool) kept.push({ bidId: id, pool });
|
|
26306
26709
|
});
|
|
26307
|
-
|
|
26710
|
+
discoveryCache3.set(cacheKey3(chainId, account), { bids: kept, at: Date.now() });
|
|
26308
26711
|
if (kept.length === 0) return [];
|
|
26309
26712
|
const ts = nowSec5();
|
|
26310
26713
|
const calls = [];
|
|
@@ -26329,12 +26732,12 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
|
|
|
26329
26732
|
return calls;
|
|
26330
26733
|
};
|
|
26331
26734
|
var TERMMAX_CALLS_PER_ACCOUNT = 1;
|
|
26332
|
-
var
|
|
26333
|
-
var
|
|
26334
|
-
var
|
|
26735
|
+
var CACHE_TTL_MS4 = 5 * 6e4;
|
|
26736
|
+
var discoveryCache4 = /* @__PURE__ */ new Map();
|
|
26737
|
+
var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
|
|
26335
26738
|
var getCachedTermMaxDiscovery = (chainId, account) => {
|
|
26336
|
-
const hit =
|
|
26337
|
-
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;
|
|
26338
26741
|
return hit;
|
|
26339
26742
|
};
|
|
26340
26743
|
var buildTermMaxUserCall = async (chainId, _lender, account) => {
|
|
@@ -26349,11 +26752,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
|
|
|
26349
26752
|
}
|
|
26350
26753
|
}
|
|
26351
26754
|
if (markets.length === 0) {
|
|
26352
|
-
|
|
26755
|
+
discoveryCache4.set(cacheKey4(chainId, account), { markets: [], at: Date.now() });
|
|
26353
26756
|
return [];
|
|
26354
26757
|
}
|
|
26355
26758
|
markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
|
|
26356
|
-
|
|
26759
|
+
discoveryCache4.set(cacheKey4(chainId, account), { markets, at: Date.now() });
|
|
26357
26760
|
return [
|
|
26358
26761
|
{
|
|
26359
26762
|
address: proto.viewer,
|
|
@@ -26386,22 +26789,30 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
|
|
|
26386
26789
|
if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
|
|
26387
26790
|
if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
|
|
26388
26791
|
if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
|
|
26792
|
+
if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
|
|
26389
26793
|
if (isCompoundV3Type(lender))
|
|
26390
26794
|
return buildCompoundV3UserCall(chainId, lender, account);
|
|
26391
26795
|
if (isEulerType(lender))
|
|
26392
|
-
return buildEulerUserCall(
|
|
26393
|
-
|
|
26394
|
-
|
|
26395
|
-
|
|
26396
|
-
|
|
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);
|
|
26397
26804
|
if (isCompoundV2Type(lender))
|
|
26398
26805
|
return buildCompoundV2UserCall(chainId, lender, account);
|
|
26399
|
-
if (isFluid(lender))
|
|
26400
|
-
return buildFluidUserCall(chainId, lender, account);
|
|
26806
|
+
if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
|
|
26401
26807
|
if (isGearboxV3(lender))
|
|
26402
26808
|
return buildGearboxV3UserCall(chainId, lender, account);
|
|
26403
26809
|
if (isDolomite(lender))
|
|
26404
|
-
return buildDolomiteUserCall(
|
|
26810
|
+
return buildDolomiteUserCall(
|
|
26811
|
+
chainId,
|
|
26812
|
+
lender,
|
|
26813
|
+
account,
|
|
26814
|
+
params?.accountNumbers
|
|
26815
|
+
);
|
|
26405
26816
|
return [];
|
|
26406
26817
|
}
|
|
26407
26818
|
function organizeUserQueries(queries) {
|
|
@@ -26414,10 +26825,11 @@ function organizeUserQueries(queries) {
|
|
|
26414
26825
|
const river = queries.filter((q) => isRiver(q.lender));
|
|
26415
26826
|
const teller = queries.filter((q) => isTeller(q.lender));
|
|
26416
26827
|
const termMax = queries.filter((q) => isTermMax(q.lender));
|
|
26417
|
-
|
|
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)
|
|
26418
26830
|
return queries;
|
|
26419
26831
|
const others = queries.filter(
|
|
26420
|
-
(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)
|
|
26421
26833
|
);
|
|
26422
26834
|
const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
|
|
26423
26835
|
const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
|
|
@@ -26478,6 +26890,14 @@ function organizeUserQueries(queries) {
|
|
|
26478
26890
|
assets: void 0
|
|
26479
26891
|
});
|
|
26480
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
|
+
}
|
|
26481
26901
|
if (teller.length > 0) {
|
|
26482
26902
|
result.push({
|
|
26483
26903
|
lender: Lender.TELLER,
|
|
@@ -28841,7 +29261,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28841
29261
|
totalCalls
|
|
28842
29262
|
];
|
|
28843
29263
|
};
|
|
28844
|
-
var
|
|
29264
|
+
var WAD9 = 1000000000000000000n;
|
|
28845
29265
|
function toBigInt11(v) {
|
|
28846
29266
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
28847
29267
|
if (typeof v === "bigint") return v;
|
|
@@ -28883,8 +29303,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28883
29303
|
const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
|
|
28884
29304
|
const debtNum = Number(debtStr);
|
|
28885
29305
|
const repoBalance = toBigInt11(balanceResult);
|
|
28886
|
-
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) ||
|
|
28887
|
-
const lentUnits = repoBalance * redemptionValue /
|
|
29306
|
+
const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
|
|
29307
|
+
const lentUnits = repoBalance * redemptionValue / WAD9;
|
|
28888
29308
|
const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
|
|
28889
29309
|
const depositsNum = Number(depositsStr);
|
|
28890
29310
|
const posData = {};
|
|
@@ -28961,20 +29381,43 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28961
29381
|
];
|
|
28962
29382
|
};
|
|
28963
29383
|
var nowSec6 = () => Math.floor(Date.now() / 1e3);
|
|
29384
|
+
var DAY_SECONDS = 86400n;
|
|
29385
|
+
var WAD10 = 10n ** 18n;
|
|
28964
29386
|
function sumPreview(positions) {
|
|
28965
29387
|
return positions.reduce((acc, p) => acc + p.previewValue, 0n);
|
|
28966
29388
|
}
|
|
28967
|
-
|
|
28968
|
-
|
|
28969
|
-
|
|
28970
|
-
|
|
28971
|
-
|
|
28972
|
-
|
|
28973
|
-
previewValue
|
|
28974
|
-
|
|
28975
|
-
|
|
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
|
+
});
|
|
28976
29419
|
}
|
|
28977
|
-
var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
29420
|
+
var getExactlyUserDataConverter = (_lender, chainId, account, meta, requestedLenders) => {
|
|
28978
29421
|
const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
|
|
28979
29422
|
return [
|
|
28980
29423
|
(data) => {
|
|
@@ -28983,6 +29426,44 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
28983
29426
|
if (!res || res === "0x" || !Array.isArray(res)) return void 0;
|
|
28984
29427
|
const markets = res;
|
|
28985
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
|
+
};
|
|
28986
29467
|
const out = {};
|
|
28987
29468
|
for (const m of markets) {
|
|
28988
29469
|
const lenderKey = exactlyLenderKey(m.market);
|
|
@@ -29008,9 +29489,22 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29008
29489
|
decimals
|
|
29009
29490
|
);
|
|
29010
29491
|
const fixedDebtStr = parseRawAmount(fixedDebtUnits.toString(), decimals);
|
|
29492
|
+
const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
|
|
29011
29493
|
const fixedPositions = [
|
|
29012
|
-
...toDetail(
|
|
29013
|
-
|
|
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
|
+
)
|
|
29014
29508
|
];
|
|
29015
29509
|
const posData = {};
|
|
29016
29510
|
let depositsUSD24h = depositsNum * loanPriceHist;
|
|
@@ -29036,6 +29530,11 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29036
29530
|
for (const p of m.fixedBorrowPositions) {
|
|
29037
29531
|
const maturity = Number(p.maturity);
|
|
29038
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";
|
|
29039
29538
|
posData[`${loanUid}#${maturity}`] = {
|
|
29040
29539
|
marketUid: loanUid,
|
|
29041
29540
|
underlying: assetAddr,
|
|
@@ -29055,49 +29554,35 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29055
29554
|
loanId: String(maturity),
|
|
29056
29555
|
termId: maturity,
|
|
29057
29556
|
isDynamic: false,
|
|
29557
|
+
// `debt` is the repay-NOW cost (discounted early, penalized when
|
|
29558
|
+
// overdue); `faceValue` is what settling AT maturity costs.
|
|
29058
29559
|
debt: trancheStr,
|
|
29560
|
+
faceValue: faceStr,
|
|
29059
29561
|
maturity,
|
|
29060
29562
|
accruedInterest: parseRawAmount(
|
|
29061
29563
|
p.position.fee.toString(),
|
|
29062
29564
|
decimals
|
|
29063
29565
|
),
|
|
29064
|
-
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
|
|
29065
29578
|
}
|
|
29066
29579
|
};
|
|
29067
29580
|
}
|
|
29068
|
-
|
|
29069
|
-
|
|
29070
|
-
|
|
29071
|
-
|
|
29072
|
-
|
|
29073
|
-
if (cDeposit === 0n) continue;
|
|
29074
|
-
const collAddr = c.asset.toLowerCase();
|
|
29075
|
-
const collUid = createMarketUid(chainId, lenderKey, collAddr);
|
|
29076
|
-
const collMeta = metaMap[collUid];
|
|
29077
|
-
const collDec = collMeta?.asset?.decimals ?? c.decimals;
|
|
29078
|
-
const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
29079
|
-
const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
|
|
29080
|
-
const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
|
|
29081
|
-
const collStr = parseRawAmount(cDeposit.toString(), collDec);
|
|
29082
|
-
const collNum = Number(collStr);
|
|
29083
|
-
depositsUSD24h += collNum * collPriceHist;
|
|
29084
|
-
posData[collUid] = {
|
|
29085
|
-
marketUid: collUid,
|
|
29086
|
-
underlying: collAddr,
|
|
29087
|
-
deposits: collStr,
|
|
29088
|
-
debt: "0",
|
|
29089
|
-
debtStable: "0",
|
|
29090
|
-
depositsUSD: collNum * collDisplayPrice,
|
|
29091
|
-
debtUSD: 0,
|
|
29092
|
-
debtStableUSD: 0,
|
|
29093
|
-
depositsUSDOracle: collNum * collOraclePrice,
|
|
29094
|
-
debtUSDOracle: 0,
|
|
29095
|
-
debtStableUSDOracle: 0,
|
|
29096
|
-
stableBorrowRate: "0",
|
|
29097
|
-
collateralEnabled: true,
|
|
29098
|
-
claimableRewards: 0
|
|
29099
|
-
};
|
|
29100
|
-
}
|
|
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;
|
|
29101
29586
|
}
|
|
29102
29587
|
const userData = createMultiAccountTypeUserState(
|
|
29103
29588
|
{
|
|
@@ -29116,12 +29601,41 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29116
29601
|
);
|
|
29117
29602
|
if (userData && userData.data.length > 0) out[lenderKey] = userData;
|
|
29118
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
|
+
}
|
|
29119
29633
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
29120
29634
|
},
|
|
29121
29635
|
expected
|
|
29122
29636
|
];
|
|
29123
29637
|
};
|
|
29124
|
-
var
|
|
29638
|
+
var big2 = (v) => {
|
|
29125
29639
|
try {
|
|
29126
29640
|
if (typeof v === "bigint") return v;
|
|
29127
29641
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29129,7 +29643,7 @@ var big = (v) => {
|
|
|
29129
29643
|
}
|
|
29130
29644
|
return 0n;
|
|
29131
29645
|
};
|
|
29132
|
-
var
|
|
29646
|
+
var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
|
|
29133
29647
|
var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
29134
29648
|
const cfg = liquityConfigFor(lender, chainId);
|
|
29135
29649
|
const branches = liquityBranchesByChain(lender, chainId);
|
|
@@ -29176,29 +29690,29 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29176
29690
|
const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
|
|
29177
29691
|
if (owner !== accountLower) return;
|
|
29178
29692
|
if (!troveData || troveData === "0x") return;
|
|
29179
|
-
const entireDebt =
|
|
29180
|
-
const entireColl =
|
|
29693
|
+
const entireDebt = field7(troveData, "entireDebt", 0);
|
|
29694
|
+
const entireColl = field7(troveData, "entireColl", 1);
|
|
29181
29695
|
if (entireDebt === 0n && entireColl === 0n) return;
|
|
29182
29696
|
const troveInfo = {
|
|
29183
29697
|
troveId: t.troveId,
|
|
29184
29698
|
collIndex: branch.collIndex,
|
|
29185
|
-
annualInterestRate:
|
|
29699
|
+
annualInterestRate: field7(
|
|
29186
29700
|
troveData,
|
|
29187
29701
|
"annualInterestRate",
|
|
29188
29702
|
6
|
|
29189
29703
|
).toString(),
|
|
29190
29704
|
lastInterestRateAdjTime: Number(
|
|
29191
|
-
|
|
29705
|
+
field7(troveData, "lastInterestRateAdjTime", 9)
|
|
29192
29706
|
),
|
|
29193
29707
|
zombie: t.zombie,
|
|
29194
|
-
redistCollGain:
|
|
29195
|
-
redistBoldDebtGain:
|
|
29708
|
+
redistCollGain: field7(troveData, "redistCollGain", 3).toString(),
|
|
29709
|
+
redistBoldDebtGain: field7(
|
|
29196
29710
|
troveData,
|
|
29197
29711
|
"redistBoldDebtGain",
|
|
29198
29712
|
2
|
|
29199
29713
|
).toString(),
|
|
29200
|
-
accruedInterest:
|
|
29201
|
-
accruedBatchManagementFee:
|
|
29714
|
+
accruedInterest: field7(troveData, "accruedInterest", 4).toString(),
|
|
29715
|
+
accruedBatchManagementFee: field7(
|
|
29202
29716
|
troveData,
|
|
29203
29717
|
"accruedBatchManagementFee",
|
|
29204
29718
|
8
|
|
@@ -29250,11 +29764,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29250
29764
|
};
|
|
29251
29765
|
});
|
|
29252
29766
|
const spBase = troves.length * 2;
|
|
29253
|
-
const spDeposit =
|
|
29254
|
-
const spYield =
|
|
29255
|
-
const spCollGain =
|
|
29256
|
-
const spStashed =
|
|
29257
|
-
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;
|
|
29258
29772
|
const spStable = spDeposit + spYield;
|
|
29259
29773
|
const spColl = spCollGain + spStashed + collSurplus;
|
|
29260
29774
|
if (spStable > 0n || spColl > 0n) {
|
|
@@ -29333,7 +29847,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29333
29847
|
expected
|
|
29334
29848
|
];
|
|
29335
29849
|
};
|
|
29336
|
-
var
|
|
29850
|
+
var big3 = (v) => {
|
|
29337
29851
|
try {
|
|
29338
29852
|
if (typeof v === "bigint") return v;
|
|
29339
29853
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29341,7 +29855,7 @@ var big2 = (v) => {
|
|
|
29341
29855
|
}
|
|
29342
29856
|
return 0n;
|
|
29343
29857
|
};
|
|
29344
|
-
var
|
|
29858
|
+
var field8 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
|
|
29345
29859
|
var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
29346
29860
|
const cfg = riverConfigFor(lender, chainId);
|
|
29347
29861
|
const markets = riverChainData(lender, chainId)?.markets ?? [];
|
|
@@ -29353,13 +29867,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29353
29867
|
const debtAddr = cfg.debtToken.toLowerCase();
|
|
29354
29868
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
29355
29869
|
const out = {};
|
|
29356
|
-
const spDeposit =
|
|
29870
|
+
const spDeposit = big3(data[markets.length * RIVER_CALLS_PER_MARKET]);
|
|
29357
29871
|
markets.forEach((market, i) => {
|
|
29358
29872
|
const base = i * RIVER_CALLS_PER_MARKET;
|
|
29359
29873
|
const entire = data[base];
|
|
29360
29874
|
if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
|
|
29361
|
-
const status = Number(
|
|
29362
|
-
const surplus =
|
|
29875
|
+
const status = Number(big3(data[base + 1]));
|
|
29876
|
+
const surplus = big3(data[base + 2]);
|
|
29363
29877
|
const lenderKey = riverLenderKey(lender, chainId, market.index);
|
|
29364
29878
|
const metaMap = meta?.[lenderKey];
|
|
29365
29879
|
if (!metaMap) return;
|
|
@@ -29378,8 +29892,8 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29378
29892
|
const lendingPositions = {};
|
|
29379
29893
|
const modes = {};
|
|
29380
29894
|
const hist = {};
|
|
29381
|
-
const debt =
|
|
29382
|
-
const coll =
|
|
29895
|
+
const debt = field8(entire, "debt", 0);
|
|
29896
|
+
const coll = field8(entire, "coll", 1);
|
|
29383
29897
|
if (status === 1 && (debt > 0n || coll > 0n)) {
|
|
29384
29898
|
const riverInfo = {
|
|
29385
29899
|
index: market.index,
|
|
@@ -29467,7 +29981,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29467
29981
|
expected
|
|
29468
29982
|
];
|
|
29469
29983
|
};
|
|
29470
|
-
var
|
|
29984
|
+
var big4 = (v) => {
|
|
29471
29985
|
try {
|
|
29472
29986
|
if (typeof v === "bigint") return v;
|
|
29473
29987
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29486,20 +30000,20 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29486
30000
|
const dolaAddr = cfg.dola.toLowerCase();
|
|
29487
30001
|
const debtDecimals = cfg.debtDecimals ?? 18;
|
|
29488
30002
|
const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
|
|
29489
|
-
const dbrBalance =
|
|
29490
|
-
const dbrDeficit =
|
|
30003
|
+
const dbrBalance = big4(data[tailBase]);
|
|
30004
|
+
const dbrDeficit = big4(data[tailBase + 1]);
|
|
29491
30005
|
const dbrSignedRaw = data[tailBase + 2];
|
|
29492
|
-
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n :
|
|
30006
|
+
const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big4(dbrSignedRaw);
|
|
29493
30007
|
const out = {};
|
|
29494
30008
|
markets.forEach((market, i) => {
|
|
29495
30009
|
const base = i * INVERSE_CALLS_PER_MARKET;
|
|
29496
|
-
const escrowBal = isFailedCall(data[base]) ? 0n :
|
|
30010
|
+
const escrowBal = isFailedCall(data[base]) ? 0n : big4(data[base]);
|
|
29497
30011
|
const debtRaw = data[base + 1];
|
|
29498
30012
|
if (isFailedCall(debtRaw)) return;
|
|
29499
|
-
const debt =
|
|
30013
|
+
const debt = big4(debtRaw);
|
|
29500
30014
|
if (escrowBal === 0n && debt === 0n) return;
|
|
29501
|
-
const creditLimit = isFailedCall(data[base + 2]) ? 0n :
|
|
29502
|
-
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]);
|
|
29503
30017
|
const lenderKey = inverseLenderKey(lender, market.address);
|
|
29504
30018
|
const metaMap = meta?.[lenderKey];
|
|
29505
30019
|
if (!metaMap) return;
|
|
@@ -29582,10 +30096,132 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
|
|
|
29582
30096
|
expected
|
|
29583
30097
|
];
|
|
29584
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
|
+
};
|
|
29585
30221
|
|
|
29586
30222
|
// src/lending/user-data/teller/userCallParse.ts
|
|
29587
30223
|
var nowSec7 = () => Math.floor(Date.now() / 1e3);
|
|
29588
|
-
var
|
|
30224
|
+
var big6 = (v) => {
|
|
29589
30225
|
try {
|
|
29590
30226
|
if (typeof v === "bigint") return v;
|
|
29591
30227
|
if (typeof v === "number" || typeof v === "string") return BigInt(v);
|
|
@@ -29593,7 +30229,7 @@ var big4 = (v) => {
|
|
|
29593
30229
|
}
|
|
29594
30230
|
return 0n;
|
|
29595
30231
|
};
|
|
29596
|
-
var
|
|
30232
|
+
var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
|
|
29597
30233
|
var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
29598
30234
|
const discovery = getCachedTellerBids(chainId, account);
|
|
29599
30235
|
const kept = discovery?.bids ?? [];
|
|
@@ -29607,7 +30243,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29607
30243
|
const base = i * TELLER_CALLS_PER_BID;
|
|
29608
30244
|
const bidRes = data[base];
|
|
29609
30245
|
const owed = data[base + 1];
|
|
29610
|
-
const collAmount =
|
|
30246
|
+
const collAmount = big6(data[base + 2]);
|
|
29611
30247
|
const defaulted = !!data[base + 3];
|
|
29612
30248
|
if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
|
|
29613
30249
|
const pool = b.pool;
|
|
@@ -29628,17 +30264,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
|
|
|
29628
30264
|
const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
|
|
29629
30265
|
const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
|
|
29630
30266
|
const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
|
|
29631
|
-
const owedPrincipal =
|
|
29632
|
-
const owedInterest =
|
|
30267
|
+
const owedPrincipal = big6(field10(owed, "principal", 0));
|
|
30268
|
+
const owedInterest = big6(field10(owed, "interest", 1));
|
|
29633
30269
|
const owedTotal = owedPrincipal + owedInterest;
|
|
29634
30270
|
if (owedTotal === 0n && collAmount === 0n) return;
|
|
29635
|
-
const loanDetails =
|
|
29636
|
-
const terms =
|
|
30271
|
+
const loanDetails = field10(bidRes, "loanDetails", 5);
|
|
30272
|
+
const terms = field10(bidRes, "terms", 6);
|
|
29637
30273
|
const acceptedTs = Number(
|
|
29638
|
-
|
|
30274
|
+
big6(field10(loanDetails, "acceptedTimestamp", 4))
|
|
29639
30275
|
);
|
|
29640
|
-
const loanDuration = Number(
|
|
29641
|
-
const aprBps = Number(
|
|
30276
|
+
const loanDuration = Number(big6(field10(loanDetails, "loanDuration", 6)));
|
|
30277
|
+
const aprBps = Number(big6(field10(terms, "APR", 2)));
|
|
29642
30278
|
const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
|
|
29643
30279
|
const isMatured = defaulted || maturity !== void 0 && maturity < now;
|
|
29644
30280
|
const collStr = parseRawAmount(collAmount.toString(), collDecimals);
|
|
@@ -29736,7 +30372,7 @@ function toBigInt12(v) {
|
|
|
29736
30372
|
return 0n;
|
|
29737
30373
|
}
|
|
29738
30374
|
}
|
|
29739
|
-
function
|
|
30375
|
+
function field11(res, name, index) {
|
|
29740
30376
|
if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
|
|
29741
30377
|
return res[name];
|
|
29742
30378
|
}
|
|
@@ -29744,18 +30380,18 @@ function field9(res, name, index) {
|
|
|
29744
30380
|
return void 0;
|
|
29745
30381
|
}
|
|
29746
30382
|
function parsePosition(res) {
|
|
29747
|
-
const ftBalance = toBigInt12(
|
|
29748
|
-
const xtBalance = toBigInt12(
|
|
29749
|
-
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);
|
|
29750
30386
|
const gts = [];
|
|
29751
30387
|
if (Array.isArray(rawGts)) {
|
|
29752
30388
|
for (const g of rawGts) {
|
|
29753
|
-
const loanId = toBigInt12(
|
|
30389
|
+
const loanId = toBigInt12(field11(g, "loanId", 0));
|
|
29754
30390
|
if (loanId === 0n) continue;
|
|
29755
30391
|
gts.push({
|
|
29756
30392
|
loanId: loanId.toString(),
|
|
29757
|
-
collateralAmt: toBigInt12(
|
|
29758
|
-
debtAmt: toBigInt12(
|
|
30393
|
+
collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
|
|
30394
|
+
debtAmt: toBigInt12(field11(g, "debtAmt", 2))
|
|
29759
30395
|
});
|
|
29760
30396
|
}
|
|
29761
30397
|
}
|
|
@@ -29925,7 +30561,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
29925
30561
|
if (isTerm(lender))
|
|
29926
30562
|
return getTermUserDataConverter(lender, chainId, account, meta);
|
|
29927
30563
|
if (isExactly(lender))
|
|
29928
|
-
return getExactlyUserDataConverter(lender, chainId, account, meta);
|
|
30564
|
+
return getExactlyUserDataConverter(lender, chainId, account, meta, params);
|
|
29929
30565
|
if (isLiquityFamily(lender))
|
|
29930
30566
|
return getLiquityUserDataConverter(lender, chainId, account, meta);
|
|
29931
30567
|
if (isRiver(lender))
|
|
@@ -29936,6 +30572,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
29936
30572
|
return getTermMaxUserDataConverter(lender, chainId, account, meta);
|
|
29937
30573
|
if (isInverse(lender))
|
|
29938
30574
|
return getInverseUserDataConverter(lender, chainId, account, meta);
|
|
30575
|
+
if (isUsdd(lender))
|
|
30576
|
+
return getUsddUserDataConverter(lender, chainId, account, meta);
|
|
29939
30577
|
if (isCompoundV3Type(lender))
|
|
29940
30578
|
return getCompoundV3UserDataConverter(
|
|
29941
30579
|
lender,
|
|
@@ -30048,7 +30686,7 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
|
|
|
30048
30686
|
};
|
|
30049
30687
|
|
|
30050
30688
|
// src/utils/rpcCall.ts
|
|
30051
|
-
var
|
|
30689
|
+
var multicall3Abi2 = [
|
|
30052
30690
|
{
|
|
30053
30691
|
type: "function",
|
|
30054
30692
|
name: "aggregate3",
|
|
@@ -30124,7 +30762,7 @@ function createMulticallRpcCall(preparedCalls, multicallAddress, batchSize = MUL
|
|
|
30124
30762
|
};
|
|
30125
30763
|
});
|
|
30126
30764
|
const multicallData = encodeFunctionData({
|
|
30127
|
-
abi:
|
|
30765
|
+
abi: multicall3Abi2,
|
|
30128
30766
|
functionName: "aggregate3",
|
|
30129
30767
|
args: [aggregate3Calls]
|
|
30130
30768
|
});
|
|
@@ -34535,6 +35173,7 @@ var getAbi2 = (lender) => {
|
|
|
34535
35173
|
return [...TellerV2Abi, ...TellerCollateralManagerAbi];
|
|
34536
35174
|
if (isInverse(lender))
|
|
34537
35175
|
return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
|
|
35176
|
+
if (isUsdd(lender)) return [...UsddVatAbi];
|
|
34538
35177
|
if (isInit(lender)) return InitLensAbi;
|
|
34539
35178
|
if (isEulerType(lender)) return accountLensAbi;
|
|
34540
35179
|
if (isCompoundV2Type(lender))
|
|
@@ -35091,7 +35730,7 @@ var MORPHO_API_CHAIN_IDS = {
|
|
|
35091
35730
|
[Chain.UNICHAIN]: 130
|
|
35092
35731
|
};
|
|
35093
35732
|
var FETCH_TIMEOUT_MS = 3e3;
|
|
35094
|
-
var
|
|
35733
|
+
var CACHE_TTL_MS5 = 2e3;
|
|
35095
35734
|
var buildSubgraphQuery = (account) => `
|
|
35096
35735
|
{
|
|
35097
35736
|
account(id: "${account.toLowerCase()}") {
|
|
@@ -35146,11 +35785,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
|
|
|
35146
35785
|
}
|
|
35147
35786
|
var inflight = /* @__PURE__ */ new Map();
|
|
35148
35787
|
var resolved = /* @__PURE__ */ new Map();
|
|
35149
|
-
function
|
|
35788
|
+
function cacheKey5(chainId, account) {
|
|
35150
35789
|
return `${chainId}:${account.toLowerCase()}`;
|
|
35151
35790
|
}
|
|
35152
35791
|
async function dedupedFetch(chainId, account, loader) {
|
|
35153
|
-
const key =
|
|
35792
|
+
const key = cacheKey5(chainId, account);
|
|
35154
35793
|
const now = Date.now();
|
|
35155
35794
|
const cached = resolved.get(key);
|
|
35156
35795
|
if (cached && cached.expiresAt > now) {
|
|
@@ -35159,7 +35798,7 @@ async function dedupedFetch(chainId, account, loader) {
|
|
|
35159
35798
|
const existing = inflight.get(key);
|
|
35160
35799
|
if (existing) return existing;
|
|
35161
35800
|
const promise = loader().then((value) => {
|
|
35162
|
-
resolved.set(key, { value, expiresAt: Date.now() +
|
|
35801
|
+
resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
|
|
35163
35802
|
return value;
|
|
35164
35803
|
}).finally(() => {
|
|
35165
35804
|
inflight.delete(key);
|
|
@@ -35291,8 +35930,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
|
|
|
35291
35930
|
return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
|
|
35292
35931
|
}
|
|
35293
35932
|
function calculateWeightedAprs(items) {
|
|
35294
|
-
const wa = (
|
|
35295
|
-
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]) }))
|
|
35296
35935
|
);
|
|
35297
35936
|
return {
|
|
35298
35937
|
apr: wa("apr", "nav"),
|
|
@@ -36562,8 +37201,8 @@ var rswethFetcher = {
|
|
|
36562
37201
|
};
|
|
36563
37202
|
|
|
36564
37203
|
// src/yields/intrinsic/annualizeRate.ts
|
|
36565
|
-
var
|
|
36566
|
-
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (
|
|
37204
|
+
var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
|
|
37205
|
+
var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS3 / elapsedSeconds) * 100;
|
|
36567
37206
|
var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
|
|
36568
37207
|
const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
|
|
36569
37208
|
return annualizeGrowthPercent(growth, elapsedSeconds);
|
|
@@ -37030,8 +37669,8 @@ var stKaiaFetcher = {
|
|
|
37030
37669
|
// src/yields/intrinsic/fetchers/lista.ts
|
|
37031
37670
|
var HISTORY_URL = "https://api.lista.org/api/datachart/history";
|
|
37032
37671
|
var SLISBNB = "Lista Staked BNB::slisBNB";
|
|
37033
|
-
var
|
|
37034
|
-
var LOOKBACK_SECONDS = 14 *
|
|
37672
|
+
var DAY_SECONDS2 = 86400;
|
|
37673
|
+
var LOOKBACK_SECONDS = 14 * DAY_SECONDS2;
|
|
37035
37674
|
var TIMEOUT_MS = 8e3;
|
|
37036
37675
|
var slisBnbFetcher = {
|
|
37037
37676
|
label: "SLISBNB",
|
|
@@ -37605,7 +38244,7 @@ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
|
|
|
37605
38244
|
var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
|
|
37606
38245
|
var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
|
|
37607
38246
|
var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
|
|
37608
|
-
var
|
|
38247
|
+
var YEAR_SECONDS4 = 31536000n;
|
|
37609
38248
|
var ONE_E186 = 10n ** 18n;
|
|
37610
38249
|
var SFRXETH_KEY = "SFRXETH";
|
|
37611
38250
|
var SFRXUSD_KEY = "SFRXUSD";
|
|
@@ -37705,7 +38344,7 @@ var fetchSfrxEthAprOnChain = async () => {
|
|
|
37705
38344
|
const window = BigInt(cycleEnd) - BigInt(lastSync);
|
|
37706
38345
|
if (window <= 0n || totalAssets === 0n) return 0;
|
|
37707
38346
|
const perSecond = lastRewardAmount / window;
|
|
37708
|
-
return Number(perSecond *
|
|
38347
|
+
return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / totalAssets) / 1e16;
|
|
37709
38348
|
};
|
|
37710
38349
|
var fetchSfrxEthApr = async () => {
|
|
37711
38350
|
try {
|
|
@@ -37737,7 +38376,7 @@ var fetchFraxSavingsAprs = async () => {
|
|
|
37737
38376
|
const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
|
|
37738
38377
|
const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
|
|
37739
38378
|
const perSecond = uncapped < cap ? uncapped : cap;
|
|
37740
|
-
return Number(perSecond *
|
|
38379
|
+
return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / storedTotalAssets) / 1e16;
|
|
37741
38380
|
};
|
|
37742
38381
|
return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
|
|
37743
38382
|
};
|
|
@@ -39365,8 +40004,8 @@ var hastraPrimeFetcher = {
|
|
|
39365
40004
|
return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
|
|
39366
40005
|
}
|
|
39367
40006
|
};
|
|
39368
|
-
var
|
|
39369
|
-
var
|
|
40007
|
+
var RAY5 = 10n ** 27n;
|
|
40008
|
+
var YEAR_SECONDS5 = 31536e3;
|
|
39370
40009
|
var SPARK_VAULTS_V2 = [
|
|
39371
40010
|
{
|
|
39372
40011
|
chainId: Chain.ETHEREUM_MAINNET,
|
|
@@ -39442,9 +40081,9 @@ var SSR_ABI = [
|
|
|
39442
40081
|
}
|
|
39443
40082
|
];
|
|
39444
40083
|
var aprFromVsr = (vsr) => {
|
|
39445
|
-
if (vsr <=
|
|
39446
|
-
const perSecond = Number(vsr -
|
|
39447
|
-
return perSecond *
|
|
40084
|
+
if (vsr <= RAY5) return 0;
|
|
40085
|
+
const perSecond = Number(vsr - RAY5) / 1e27;
|
|
40086
|
+
return perSecond * YEAR_SECONDS5 * 100;
|
|
39448
40087
|
};
|
|
39449
40088
|
var chainsOf = (vaults) => [
|
|
39450
40089
|
...new Set(vaults.map((v) => v.chainId))
|
|
@@ -39463,7 +40102,7 @@ var fetchChain = async (chainId, vaults) => {
|
|
|
39463
40102
|
const out = {};
|
|
39464
40103
|
vaults.forEach((v, i) => {
|
|
39465
40104
|
const vsr = results[i];
|
|
39466
|
-
if (typeof vsr !== "bigint" || vsr <
|
|
40105
|
+
if (typeof vsr !== "bigint" || vsr < RAY5) return;
|
|
39467
40106
|
const apr = aprFromVsr(vsr);
|
|
39468
40107
|
out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
|
|
39469
40108
|
if (v.assetGroup) out[v.assetGroup] = apr;
|
|
@@ -39477,7 +40116,7 @@ var fetchSusdcApr = async () => {
|
|
|
39477
40116
|
calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
|
|
39478
40117
|
allowFailure: false
|
|
39479
40118
|
});
|
|
39480
|
-
if (typeof ssr !== "bigint" || ssr <
|
|
40119
|
+
if (typeof ssr !== "bigint" || ssr < RAY5) {
|
|
39481
40120
|
throw new Error("Spark sUSDC: unreadable ssr()");
|
|
39482
40121
|
}
|
|
39483
40122
|
const apr = aprFromVsr(ssr);
|
|
@@ -39536,9 +40175,9 @@ var SUSDP_VAULTS = [
|
|
|
39536
40175
|
address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
|
|
39537
40176
|
}
|
|
39538
40177
|
];
|
|
39539
|
-
var
|
|
40178
|
+
var YEAR_SECONDS6 = 31536e3;
|
|
39540
40179
|
var BASE_27 = 1e27;
|
|
39541
|
-
var aprFromRate = (rate) => Number(rate) / BASE_27 *
|
|
40180
|
+
var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS6 * 100;
|
|
39542
40181
|
var SUSDP_KEY = "SUSDP";
|
|
39543
40182
|
var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
|
|
39544
40183
|
var parallelFetcher = {
|
|
@@ -39701,7 +40340,9 @@ var reProtocolFetcher = {
|
|
|
39701
40340
|
var USD3_KEY = "3JANE::USD3";
|
|
39702
40341
|
var SUSD3_KEY = "3JANE::sUSD3";
|
|
39703
40342
|
var USD3_GROUP_KEY = "3Jane USD3::USD3";
|
|
39704
|
-
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";
|
|
39705
40346
|
var USD3_POOL = "f8cd444e-d99f-4132-b234-fd3482bf8806";
|
|
39706
40347
|
var SUSD3_POOL = "a99bb965-ebaa-4d98-9ed2-fa18de52c605";
|
|
39707
40348
|
var threeJaneFetcher = {
|
|
@@ -39716,11 +40357,13 @@ var threeJaneFetcher = {
|
|
|
39716
40357
|
const apr = apyToAprPercent(usd3.value);
|
|
39717
40358
|
out[USD3_KEY] = apr;
|
|
39718
40359
|
out[USD3_GROUP_KEY] = apr;
|
|
40360
|
+
out[USD3_LEGACY_GROUP_KEY] = apr;
|
|
39719
40361
|
}
|
|
39720
40362
|
if (susd3.status === "fulfilled") {
|
|
39721
40363
|
const apr = apyToAprPercent(susd3.value);
|
|
39722
40364
|
out[SUSD3_KEY] = apr;
|
|
39723
40365
|
out[SUSD3_GROUP_KEY] = apr;
|
|
40366
|
+
out[SUSD3_LEGACY_GROUP_KEY] = apr;
|
|
39724
40367
|
}
|
|
39725
40368
|
if (Object.keys(out).length === 0) {
|
|
39726
40369
|
throw new Error("3Jane: DefiLlama returned no apy for either pool");
|
|
@@ -39756,7 +40399,7 @@ var toriFetcher = {
|
|
|
39756
40399
|
};
|
|
39757
40400
|
var CHAIN_ID8 = Chain.ETHEREUM_MAINNET;
|
|
39758
40401
|
var SNUSD = "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313";
|
|
39759
|
-
var
|
|
40402
|
+
var YEAR_SECONDS7 = 31536000n;
|
|
39760
40403
|
var ONE_E187 = 10n ** 18n;
|
|
39761
40404
|
var SNUSD_KEY = "SNUSD";
|
|
39762
40405
|
var SNUSD_GROUP_KEY = "Staked NUSD::sNUSD";
|
|
@@ -39808,7 +40451,7 @@ var fetchSnusdAprOnChain = async () => {
|
|
|
39808
40451
|
const window = elapsed > vestingPeriod ? elapsed : vestingPeriod;
|
|
39809
40452
|
if (window <= 0n) return 0;
|
|
39810
40453
|
const perSecond = vestingAmount / window;
|
|
39811
|
-
return Number(perSecond *
|
|
40454
|
+
return Number(perSecond * YEAR_SECONDS7 * ONE_E187 / totalAssets) / 1e16;
|
|
39812
40455
|
};
|
|
39813
40456
|
var snusdFetcher = {
|
|
39814
40457
|
label: "SNUSD",
|
|
@@ -39821,8 +40464,179 @@ var snusdFetcher = {
|
|
|
39821
40464
|
};
|
|
39822
40465
|
}
|
|
39823
40466
|
};
|
|
39824
|
-
var
|
|
39825
|
-
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;
|
|
39826
40640
|
var DSR_ABI = [
|
|
39827
40641
|
{
|
|
39828
40642
|
name: "dsr",
|
|
@@ -39848,9 +40662,9 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
|
|
|
39848
40662
|
var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
|
|
39849
40663
|
var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
|
|
39850
40664
|
var aprFromDsr = (dsr) => {
|
|
39851
|
-
if (dsr <=
|
|
39852
|
-
const perSecond = Number(dsr -
|
|
39853
|
-
return perSecond *
|
|
40665
|
+
if (dsr <= RAY6) return 0;
|
|
40666
|
+
const perSecond = Number(dsr - RAY6) / 1e27;
|
|
40667
|
+
return perSecond * YEAR_SECONDS9 * 100;
|
|
39854
40668
|
};
|
|
39855
40669
|
var fetchChainDsr = async (chainId, pot) => {
|
|
39856
40670
|
const [dsr] = await multicallRetryUniversal({
|
|
@@ -39859,7 +40673,7 @@ var fetchChainDsr = async (chainId, pot) => {
|
|
|
39859
40673
|
calls: [{ address: pot, name: "dsr", params: [] }],
|
|
39860
40674
|
allowFailure: false
|
|
39861
40675
|
});
|
|
39862
|
-
if (typeof dsr !== "bigint" || dsr <
|
|
40676
|
+
if (typeof dsr !== "bigint" || dsr < RAY6) {
|
|
39863
40677
|
throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
|
|
39864
40678
|
}
|
|
39865
40679
|
return aprFromDsr(dsr);
|
|
@@ -41395,6 +42209,270 @@ var SINGLE_CHAIN_ENTRIES = {
|
|
|
41395
42209
|
yieldFetcher: snusdFetcher,
|
|
41396
42210
|
yieldKey: SNUSD_KEY
|
|
41397
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
|
+
},
|
|
41398
42476
|
{
|
|
41399
42477
|
// Avant savETH — staked avETH (Ethereum, where avETH is native);
|
|
41400
42478
|
// StakedUSDeV2-style 24h cooldown.
|
|
@@ -42624,25 +43702,14 @@ var tethFetcher = {
|
|
|
42624
43702
|
}
|
|
42625
43703
|
};
|
|
42626
43704
|
|
|
42627
|
-
// src/yields/intrinsic/fetchers/strata.ts
|
|
42628
|
-
var SRNUSD_POOL_ID = "979711ce-d0c0-4aae-a5fc-d7b76e868649";
|
|
42629
|
-
var KEYS3 = ["Strata Senior NUSD::srNUSD"];
|
|
42630
|
-
var srnusdFetcher = {
|
|
42631
|
-
label: "SRNUSD",
|
|
42632
|
-
fetch: async () => {
|
|
42633
|
-
const apr = apyToAprPercent(await fetchDefiLlamaApy(SRNUSD_POOL_ID));
|
|
42634
|
-
return Object.fromEntries(KEYS3.map((k) => [k, apr]));
|
|
42635
|
-
}
|
|
42636
|
-
};
|
|
42637
|
-
|
|
42638
43705
|
// src/yields/intrinsic/fetchers/anzen.ts
|
|
42639
43706
|
var SUSDZ_POOL_ID = "46518e93-8197-4539-9861-2340c2ac965a";
|
|
42640
|
-
var
|
|
43707
|
+
var KEYS3 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
|
|
42641
43708
|
var susdzFetcher = {
|
|
42642
43709
|
label: "SUSDZ",
|
|
42643
43710
|
fetch: async () => {
|
|
42644
43711
|
const apr = apyToAprPercent(await fetchDefiLlamaApy(SUSDZ_POOL_ID));
|
|
42645
|
-
return Object.fromEntries(
|
|
43712
|
+
return Object.fromEntries(KEYS3.map((k) => [k, apr]));
|
|
42646
43713
|
}
|
|
42647
43714
|
};
|
|
42648
43715
|
|
|
@@ -42677,7 +43744,8 @@ var LENDING_ONLY_FETCHERS = [
|
|
|
42677
43744
|
// DefiLlama-mapped intrinsic yields for classifier assets lacking a bespoke source
|
|
42678
43745
|
lsethFetcher,
|
|
42679
43746
|
tethFetcher,
|
|
42680
|
-
|
|
43747
|
+
// strataFetcher is NOT here: the Strata tranche savings rows vault-wire
|
|
43748
|
+
// it, so it reaches the global map via `collectVaultFetchers`.
|
|
42681
43749
|
susdzFetcher
|
|
42682
43750
|
];
|
|
42683
43751
|
var collectVaultFetchers = () => {
|
|
@@ -46861,10 +47929,10 @@ function createAssetArrayPerChain() {
|
|
|
46861
47929
|
return assetsPerChain;
|
|
46862
47930
|
}
|
|
46863
47931
|
var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
|
|
46864
|
-
function createSimpleArrayPerChain(fork,
|
|
47932
|
+
function createSimpleArrayPerChain(fork, field12 = void 0) {
|
|
46865
47933
|
let pools = {};
|
|
46866
47934
|
Object.entries(fork ?? {}).forEach(([b2, data]) => {
|
|
46867
|
-
Object.entries(
|
|
47935
|
+
Object.entries(field12 ? data[field12] : data).forEach(
|
|
46868
47936
|
([chainId, address]) => {
|
|
46869
47937
|
if (!pools[chainId]) pools[chainId] = [];
|
|
46870
47938
|
pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
|
|
@@ -49073,9 +50141,9 @@ query EvkByAssets($assets: [Bytes!]!) {
|
|
|
49073
50141
|
`;
|
|
49074
50142
|
var ZERO = 0n;
|
|
49075
50143
|
var RAY_TO_PERCENT3 = 1e25;
|
|
49076
|
-
function readAddress2(
|
|
49077
|
-
if (!
|
|
49078
|
-
return
|
|
50144
|
+
function readAddress2(field12) {
|
|
50145
|
+
if (!field12) return void 0;
|
|
50146
|
+
return field12.toLowerCase();
|
|
49079
50147
|
}
|
|
49080
50148
|
function parseVaultFee(v) {
|
|
49081
50149
|
if (v.performanceFee == null) return 0;
|
|
@@ -49440,7 +50508,7 @@ var num2 = (v) => {
|
|
|
49440
50508
|
const n = Number(v);
|
|
49441
50509
|
return Number.isFinite(n) ? n : 0;
|
|
49442
50510
|
};
|
|
49443
|
-
var
|
|
50511
|
+
var big7 = (v) => {
|
|
49444
50512
|
try {
|
|
49445
50513
|
if (v === void 0 || v === null || v === "") return "0";
|
|
49446
50514
|
const s = String(v);
|
|
@@ -49476,12 +50544,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
49476
50544
|
const assetEntry = tokenList[underlying];
|
|
49477
50545
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
|
|
49478
50546
|
const priceUsd = prices[priceKey];
|
|
49479
|
-
const totalAssets =
|
|
49480
|
-
const totalSupply =
|
|
50547
|
+
const totalAssets = big7(r.totalAssets);
|
|
50548
|
+
const totalSupply = big7(r.totalSupplyAmt);
|
|
49481
50549
|
const totalAssetsFormatted = Number(totalAssets) / scale;
|
|
49482
50550
|
const supplyRate = num2(r.apr) * 100;
|
|
49483
50551
|
const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
|
|
49484
|
-
const rawLiquidity = BigInt(
|
|
50552
|
+
const rawLiquidity = BigInt(big7(r.redeemableAmt ?? r.idleFunds ?? "0"));
|
|
49485
50553
|
const totalAssetsBig = BigInt(totalAssets);
|
|
49486
50554
|
const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
|
|
49487
50555
|
const liquidityFormatted = Number(liquidity) / scale;
|
|
@@ -49517,7 +50585,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
|
|
|
49517
50585
|
liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
|
|
49518
50586
|
version: r.version,
|
|
49519
50587
|
isPaused: r.isPaused === true || void 0,
|
|
49520
|
-
supplyCap: r.capacity ?
|
|
50588
|
+
supplyCap: r.capacity ? big7(r.capacity) : void 0,
|
|
49521
50589
|
basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
|
|
49522
50590
|
};
|
|
49523
50591
|
}
|
|
@@ -49573,7 +50641,7 @@ var Erc20DecimalsBalanceAbi = [
|
|
|
49573
50641
|
|
|
49574
50642
|
// src/vaults/termmax/fetchFromChain.ts
|
|
49575
50643
|
var DECIMAL_BASE2 = 100000000n;
|
|
49576
|
-
var
|
|
50644
|
+
var big8 = (v) => {
|
|
49577
50645
|
if (v === void 0 || v === null || v === "0x") return 0n;
|
|
49578
50646
|
try {
|
|
49579
50647
|
return typeof v === "bigint" ? v : BigInt(v);
|
|
@@ -49637,7 +50705,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49637
50705
|
vaults.forEach((address, i) => {
|
|
49638
50706
|
const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
|
|
49639
50707
|
const asset = addr(at("asset"));
|
|
49640
|
-
const totalAssets =
|
|
50708
|
+
const totalAssets = big8(at("totalAssets"));
|
|
49641
50709
|
if (!asset || totalAssets === 0n) return;
|
|
49642
50710
|
rows.push({
|
|
49643
50711
|
address,
|
|
@@ -49646,11 +50714,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49646
50714
|
decimals: num3(at("decimals")) ?? 18,
|
|
49647
50715
|
asset,
|
|
49648
50716
|
totalAssets,
|
|
49649
|
-
totalSupply:
|
|
49650
|
-
annualizedInterest:
|
|
49651
|
-
accretingPrincipal:
|
|
49652
|
-
performanceFeeRate:
|
|
49653
|
-
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,
|
|
49654
50722
|
curator: addr(at("curator")),
|
|
49655
50723
|
guardian: addr(at("guardian")),
|
|
49656
50724
|
timelock: num3(at("timelock")),
|
|
@@ -49671,7 +50739,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
|
|
|
49671
50739
|
const out = {};
|
|
49672
50740
|
rows.forEach((r, i) => {
|
|
49673
50741
|
const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
|
|
49674
|
-
const idle =
|
|
50742
|
+
const idle = big8(res2[i * 2 + 1]);
|
|
49675
50743
|
const assetEntry = tokenList[r.asset];
|
|
49676
50744
|
const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
|
|
49677
50745
|
const priceUsd = prices[priceKey];
|
|
@@ -49791,7 +50859,7 @@ var Erc4626PreviewRedeemAbi = [
|
|
|
49791
50859
|
];
|
|
49792
50860
|
|
|
49793
50861
|
// src/vaults/lst/readers/shared.ts
|
|
49794
|
-
var
|
|
50862
|
+
var ONE_E189 = 10n ** 18n;
|
|
49795
50863
|
var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
|
|
49796
50864
|
var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
49797
50865
|
var Multicall3BalanceAbi = [
|
|
@@ -49834,7 +50902,7 @@ var readerBeetsStS = (entry) => ({
|
|
|
49834
50902
|
}
|
|
49835
50903
|
const liquidity = toBigInt13(pool);
|
|
49836
50904
|
return {
|
|
49837
|
-
totalAssets: totalSupply * exchangeRate /
|
|
50905
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
49838
50906
|
totalSupply,
|
|
49839
50907
|
exchangeRate,
|
|
49840
50908
|
liquidity
|
|
@@ -49867,7 +50935,7 @@ var readerBenqiSavax = (entry) => ({
|
|
|
49867
50935
|
{
|
|
49868
50936
|
address: entry.address,
|
|
49869
50937
|
name: "getPooledAvaxByShares",
|
|
49870
|
-
params: [
|
|
50938
|
+
params: [ONE_E189]
|
|
49871
50939
|
},
|
|
49872
50940
|
{ address: entry.address, name: "totalPooledAvax", params: [] }
|
|
49873
50941
|
],
|
|
@@ -49878,7 +50946,7 @@ var readerBenqiSavax = (entry) => ({
|
|
|
49878
50946
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
49879
50947
|
return void 0;
|
|
49880
50948
|
}
|
|
49881
|
-
const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate /
|
|
50949
|
+
const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
|
|
49882
50950
|
return {
|
|
49883
50951
|
totalAssets,
|
|
49884
50952
|
totalSupply,
|
|
@@ -49897,7 +50965,7 @@ var readerBgtWrapper1to1 = (entry) => ({
|
|
|
49897
50965
|
return {
|
|
49898
50966
|
totalAssets: totalSupply,
|
|
49899
50967
|
totalSupply,
|
|
49900
|
-
exchangeRate:
|
|
50968
|
+
exchangeRate: ONE_E189
|
|
49901
50969
|
};
|
|
49902
50970
|
}
|
|
49903
50971
|
});
|
|
@@ -49927,7 +50995,7 @@ var readerDineroBeraEth = (entry) => ({
|
|
|
49927
50995
|
return void 0;
|
|
49928
50996
|
}
|
|
49929
50997
|
return {
|
|
49930
|
-
totalAssets: totalSupply * exchangeRate /
|
|
50998
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
49931
50999
|
totalSupply,
|
|
49932
51000
|
exchangeRate
|
|
49933
51001
|
};
|
|
@@ -49939,7 +51007,7 @@ var readerErc4626 = (entry) => ({
|
|
|
49939
51007
|
calls: [
|
|
49940
51008
|
{ address: entry.address, name: "totalAssets", params: [] },
|
|
49941
51009
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
49942
|
-
{ address: entry.address, name: "convertToAssets", params: [
|
|
51010
|
+
{ address: entry.address, name: "convertToAssets", params: [ONE_E189] }
|
|
49943
51011
|
],
|
|
49944
51012
|
abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
|
|
49945
51013
|
parse: ([assets, supply, rate]) => {
|
|
@@ -49956,7 +51024,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
|
|
|
49956
51024
|
calls: [
|
|
49957
51025
|
{ address: entry.address, name: "totalAssets", params: [] },
|
|
49958
51026
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
49959
|
-
{ address: entry.address, name: "previewRedeem", params: [
|
|
51027
|
+
{ address: entry.address, name: "previewRedeem", params: [ONE_E189] }
|
|
49960
51028
|
],
|
|
49961
51029
|
abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
|
|
49962
51030
|
parse: ([assets, supply, rate]) => {
|
|
@@ -50036,7 +51104,7 @@ var readerEtherFiWeEth = (entry) => {
|
|
|
50036
51104
|
}
|
|
50037
51105
|
}
|
|
50038
51106
|
return {
|
|
50039
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51107
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50040
51108
|
totalSupply,
|
|
50041
51109
|
exchangeRate,
|
|
50042
51110
|
liquidity
|
|
@@ -50069,7 +51137,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50069
51137
|
return {
|
|
50070
51138
|
totalAssets: totalSupply,
|
|
50071
51139
|
totalSupply,
|
|
50072
|
-
exchangeRate:
|
|
51140
|
+
exchangeRate: ONE_E189
|
|
50073
51141
|
};
|
|
50074
51142
|
}
|
|
50075
51143
|
};
|
|
@@ -50077,7 +51145,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50077
51145
|
return {
|
|
50078
51146
|
calls: [
|
|
50079
51147
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50080
|
-
{ address: stakingCore, name: "BeHYPEToHYPE", params: [
|
|
51148
|
+
{ address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
|
|
50081
51149
|
],
|
|
50082
51150
|
abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
|
|
50083
51151
|
parse: ([supply, rate]) => {
|
|
@@ -50087,7 +51155,7 @@ var readerHyperbeatBeHype = (entry) => {
|
|
|
50087
51155
|
return void 0;
|
|
50088
51156
|
}
|
|
50089
51157
|
return {
|
|
50090
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51158
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50091
51159
|
totalSupply,
|
|
50092
51160
|
exchangeRate
|
|
50093
51161
|
};
|
|
@@ -50119,7 +51187,7 @@ var readerKelpRsEth = (entry) => {
|
|
|
50119
51187
|
return {
|
|
50120
51188
|
totalAssets: totalSupply,
|
|
50121
51189
|
totalSupply,
|
|
50122
|
-
exchangeRate:
|
|
51190
|
+
exchangeRate: ONE_E189
|
|
50123
51191
|
};
|
|
50124
51192
|
}
|
|
50125
51193
|
};
|
|
@@ -50137,7 +51205,7 @@ var readerKelpRsEth = (entry) => {
|
|
|
50137
51205
|
return void 0;
|
|
50138
51206
|
}
|
|
50139
51207
|
return {
|
|
50140
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51208
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50141
51209
|
totalSupply,
|
|
50142
51210
|
exchangeRate
|
|
50143
51211
|
};
|
|
@@ -50169,7 +51237,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50169
51237
|
return {
|
|
50170
51238
|
totalAssets: totalSupply,
|
|
50171
51239
|
totalSupply,
|
|
50172
|
-
exchangeRate:
|
|
51240
|
+
exchangeRate: ONE_E189
|
|
50173
51241
|
};
|
|
50174
51242
|
}
|
|
50175
51243
|
};
|
|
@@ -50177,7 +51245,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50177
51245
|
return {
|
|
50178
51246
|
calls: [
|
|
50179
51247
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50180
|
-
{ address: accountant, name: "kHYPEToHYPE", params: [
|
|
51248
|
+
{ address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
|
|
50181
51249
|
],
|
|
50182
51250
|
abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
|
|
50183
51251
|
parse: ([supply, rate]) => {
|
|
@@ -50187,7 +51255,7 @@ var readerKinetiqKHype = (entry) => {
|
|
|
50187
51255
|
return void 0;
|
|
50188
51256
|
}
|
|
50189
51257
|
return {
|
|
50190
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51258
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50191
51259
|
totalSupply,
|
|
50192
51260
|
exchangeRate
|
|
50193
51261
|
};
|
|
@@ -50227,7 +51295,7 @@ var readerLairStKaia = (entry) => ({
|
|
|
50227
51295
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
50228
51296
|
return void 0;
|
|
50229
51297
|
}
|
|
50230
|
-
const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate /
|
|
51298
|
+
const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
|
|
50231
51299
|
return {
|
|
50232
51300
|
totalAssets,
|
|
50233
51301
|
totalSupply,
|
|
@@ -50261,7 +51329,7 @@ var readerLidoWstEth = (entry) => ({
|
|
|
50261
51329
|
return void 0;
|
|
50262
51330
|
}
|
|
50263
51331
|
return {
|
|
50264
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51332
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50265
51333
|
totalSupply,
|
|
50266
51334
|
exchangeRate
|
|
50267
51335
|
};
|
|
@@ -50299,7 +51367,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50299
51367
|
return {
|
|
50300
51368
|
totalAssets: totalSupply,
|
|
50301
51369
|
totalSupply,
|
|
50302
|
-
exchangeRate:
|
|
51370
|
+
exchangeRate: ONE_E189
|
|
50303
51371
|
};
|
|
50304
51372
|
}
|
|
50305
51373
|
};
|
|
@@ -50307,7 +51375,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50307
51375
|
return {
|
|
50308
51376
|
calls: [
|
|
50309
51377
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50310
|
-
{ address: manager, name: "convertSnBnbToBnb", params: [
|
|
51378
|
+
{ address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
|
|
50311
51379
|
{ address: manager, name: "getTotalPooledBnb", params: [] }
|
|
50312
51380
|
],
|
|
50313
51381
|
abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
|
|
@@ -50318,7 +51386,7 @@ var readerListaSlisBnb = (entry) => {
|
|
|
50318
51386
|
return void 0;
|
|
50319
51387
|
}
|
|
50320
51388
|
const pooledBnb = toBigInt13(pooled);
|
|
50321
|
-
const totalAssets = pooledBnb ?? totalSupply * exchangeRate /
|
|
51389
|
+
const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
|
|
50322
51390
|
return { totalAssets, totalSupply, exchangeRate };
|
|
50323
51391
|
}
|
|
50324
51392
|
};
|
|
@@ -50348,7 +51416,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50348
51416
|
return {
|
|
50349
51417
|
totalAssets: totalSupply,
|
|
50350
51418
|
totalSupply,
|
|
50351
|
-
exchangeRate:
|
|
51419
|
+
exchangeRate: ONE_E189
|
|
50352
51420
|
};
|
|
50353
51421
|
}
|
|
50354
51422
|
};
|
|
@@ -50356,7 +51424,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50356
51424
|
return {
|
|
50357
51425
|
calls: [
|
|
50358
51426
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50359
|
-
{ address: staking, name: "mETHToETH", params: [
|
|
51427
|
+
{ address: staking, name: "mETHToETH", params: [ONE_E189] }
|
|
50360
51428
|
],
|
|
50361
51429
|
abis: [TotalSupplyAbi, MantleStakingAbi],
|
|
50362
51430
|
parse: ([supply, rate]) => {
|
|
@@ -50366,7 +51434,7 @@ var readerMantleMEth = (entry) => {
|
|
|
50366
51434
|
return void 0;
|
|
50367
51435
|
}
|
|
50368
51436
|
return {
|
|
50369
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51437
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50370
51438
|
totalSupply,
|
|
50371
51439
|
exchangeRate
|
|
50372
51440
|
};
|
|
@@ -50387,7 +51455,7 @@ var readerOffChain = (entry) => {
|
|
|
50387
51455
|
return {
|
|
50388
51456
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
50389
51457
|
totalSupply,
|
|
50390
|
-
exchangeRate:
|
|
51458
|
+
exchangeRate: ONE_E189
|
|
50391
51459
|
};
|
|
50392
51460
|
}
|
|
50393
51461
|
};
|
|
@@ -50421,7 +51489,7 @@ var readerRenzoEzEth = (entry) => {
|
|
|
50421
51489
|
return {
|
|
50422
51490
|
totalAssets: totalSupply,
|
|
50423
51491
|
totalSupply,
|
|
50424
|
-
exchangeRate:
|
|
51492
|
+
exchangeRate: ONE_E189
|
|
50425
51493
|
};
|
|
50426
51494
|
}
|
|
50427
51495
|
};
|
|
@@ -50440,7 +51508,7 @@ var readerRenzoEzEth = (entry) => {
|
|
|
50440
51508
|
return {
|
|
50441
51509
|
totalAssets: totalTvl,
|
|
50442
51510
|
totalSupply,
|
|
50443
|
-
exchangeRate: totalTvl *
|
|
51511
|
+
exchangeRate: totalTvl * ONE_E189 / totalSupply
|
|
50444
51512
|
};
|
|
50445
51513
|
}
|
|
50446
51514
|
};
|
|
@@ -50496,7 +51564,7 @@ var readerRocketReth = (entry) => {
|
|
|
50496
51564
|
}
|
|
50497
51565
|
const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
|
|
50498
51566
|
return {
|
|
50499
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51567
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50500
51568
|
totalSupply,
|
|
50501
51569
|
exchangeRate,
|
|
50502
51570
|
liquidity
|
|
@@ -50538,7 +51606,7 @@ var readerStaderEthx = (entry) => {
|
|
|
50538
51606
|
return {
|
|
50539
51607
|
totalAssets: totalSupply,
|
|
50540
51608
|
totalSupply,
|
|
50541
|
-
exchangeRate:
|
|
51609
|
+
exchangeRate: ONE_E189
|
|
50542
51610
|
};
|
|
50543
51611
|
}
|
|
50544
51612
|
};
|
|
@@ -50556,7 +51624,7 @@ var readerStaderEthx = (entry) => {
|
|
|
50556
51624
|
return void 0;
|
|
50557
51625
|
}
|
|
50558
51626
|
return {
|
|
50559
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51627
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50560
51628
|
totalSupply,
|
|
50561
51629
|
exchangeRate
|
|
50562
51630
|
};
|
|
@@ -50573,7 +51641,7 @@ var readerStaderMaticX = (entry) => {
|
|
|
50573
51641
|
{
|
|
50574
51642
|
address: rateAddress,
|
|
50575
51643
|
name: "convertMaticXToMatic",
|
|
50576
|
-
params: [
|
|
51644
|
+
params: [ONE_E189],
|
|
50577
51645
|
chainId: homeChainId
|
|
50578
51646
|
}
|
|
50579
51647
|
],
|
|
@@ -50588,7 +51656,7 @@ var readerStaderMaticX = (entry) => {
|
|
|
50588
51656
|
}
|
|
50589
51657
|
const isCrossChain = homeContract !== void 0;
|
|
50590
51658
|
return {
|
|
50591
|
-
totalAssets: isCrossChain ? totalSupply * amountInMatic /
|
|
51659
|
+
totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
|
|
50592
51660
|
totalSupply,
|
|
50593
51661
|
exchangeRate: amountInMatic
|
|
50594
51662
|
};
|
|
@@ -50620,7 +51688,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50620
51688
|
return {
|
|
50621
51689
|
totalAssets: totalSupply,
|
|
50622
51690
|
totalSupply,
|
|
50623
|
-
exchangeRate:
|
|
51691
|
+
exchangeRate: ONE_E189
|
|
50624
51692
|
};
|
|
50625
51693
|
}
|
|
50626
51694
|
};
|
|
@@ -50628,7 +51696,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50628
51696
|
return {
|
|
50629
51697
|
calls: [
|
|
50630
51698
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50631
|
-
{ address: controller, name: "convertToAssets", params: [
|
|
51699
|
+
{ address: controller, name: "convertToAssets", params: [ONE_E189] }
|
|
50632
51700
|
],
|
|
50633
51701
|
abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
|
|
50634
51702
|
parse: ([supply, rate]) => {
|
|
@@ -50638,7 +51706,7 @@ var readerStakeWiseOsEth = (entry) => {
|
|
|
50638
51706
|
return void 0;
|
|
50639
51707
|
}
|
|
50640
51708
|
return {
|
|
50641
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51709
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50642
51710
|
totalSupply,
|
|
50643
51711
|
exchangeRate
|
|
50644
51712
|
};
|
|
@@ -50670,7 +51738,7 @@ var readerStCelo = (entry) => {
|
|
|
50670
51738
|
return {
|
|
50671
51739
|
totalAssets: totalSupply,
|
|
50672
51740
|
totalSupply,
|
|
50673
|
-
exchangeRate:
|
|
51741
|
+
exchangeRate: ONE_E189
|
|
50674
51742
|
};
|
|
50675
51743
|
}
|
|
50676
51744
|
};
|
|
@@ -50678,7 +51746,7 @@ var readerStCelo = (entry) => {
|
|
|
50678
51746
|
return {
|
|
50679
51747
|
calls: [
|
|
50680
51748
|
{ address: entry.address, name: "totalSupply", params: [] },
|
|
50681
|
-
{ address: manager, name: "toCelo", params: [
|
|
51749
|
+
{ address: manager, name: "toCelo", params: [ONE_E189] }
|
|
50682
51750
|
],
|
|
50683
51751
|
abis: [TotalSupplyAbi, StCeloManagerAbi],
|
|
50684
51752
|
parse: ([supply, rate]) => {
|
|
@@ -50688,7 +51756,7 @@ var readerStCelo = (entry) => {
|
|
|
50688
51756
|
return void 0;
|
|
50689
51757
|
}
|
|
50690
51758
|
return {
|
|
50691
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51759
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50692
51760
|
totalSupply,
|
|
50693
51761
|
exchangeRate
|
|
50694
51762
|
};
|
|
@@ -50721,7 +51789,7 @@ var readerSwellGetRate = (entry) => ({
|
|
|
50721
51789
|
return void 0;
|
|
50722
51790
|
}
|
|
50723
51791
|
return {
|
|
50724
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51792
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50725
51793
|
totalSupply,
|
|
50726
51794
|
exchangeRate
|
|
50727
51795
|
};
|
|
@@ -50752,7 +51820,7 @@ var readerValantisWstHype = (entry) => {
|
|
|
50752
51820
|
return {
|
|
50753
51821
|
totalAssets: totalSupply,
|
|
50754
51822
|
totalSupply,
|
|
50755
|
-
exchangeRate:
|
|
51823
|
+
exchangeRate: ONE_E189
|
|
50756
51824
|
};
|
|
50757
51825
|
}
|
|
50758
51826
|
};
|
|
@@ -50770,7 +51838,7 @@ var readerValantisWstHype = (entry) => {
|
|
|
50770
51838
|
return void 0;
|
|
50771
51839
|
}
|
|
50772
51840
|
return {
|
|
50773
|
-
totalAssets: totalSupply * exchangeRate /
|
|
51841
|
+
totalAssets: totalSupply * exchangeRate / ONE_E189,
|
|
50774
51842
|
totalSupply,
|
|
50775
51843
|
exchangeRate
|
|
50776
51844
|
};
|
|
@@ -50804,7 +51872,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
50804
51872
|
return {
|
|
50805
51873
|
totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
|
|
50806
51874
|
totalSupply,
|
|
50807
|
-
exchangeRate:
|
|
51875
|
+
exchangeRate: ONE_E189
|
|
50808
51876
|
};
|
|
50809
51877
|
}
|
|
50810
51878
|
};
|
|
@@ -50823,7 +51891,7 @@ var readerVedaAccountant = (entry) => {
|
|
|
50823
51891
|
const exchangeRate = rawRate * scale;
|
|
50824
51892
|
return {
|
|
50825
51893
|
totalAssets: rescaleDecimals(
|
|
50826
|
-
totalSupply * exchangeRate /
|
|
51894
|
+
totalSupply * exchangeRate / ONE_E189,
|
|
50827
51895
|
shareDec,
|
|
50828
51896
|
underlyingDec
|
|
50829
51897
|
),
|
|
@@ -50859,9 +51927,9 @@ var readerAnkrRatio = (entry) => ({
|
|
|
50859
51927
|
return void 0;
|
|
50860
51928
|
}
|
|
50861
51929
|
return {
|
|
50862
|
-
totalAssets: totalSupply *
|
|
51930
|
+
totalAssets: totalSupply * ONE_E189 / r,
|
|
50863
51931
|
totalSupply,
|
|
50864
|
-
exchangeRate:
|
|
51932
|
+
exchangeRate: ONE_E189 * ONE_E189 / r
|
|
50865
51933
|
};
|
|
50866
51934
|
}
|
|
50867
51935
|
});
|
|
@@ -50905,7 +51973,7 @@ var readerCoreEarnRate = (entry) => {
|
|
|
50905
51973
|
return {
|
|
50906
51974
|
totalAssets: totalSupply * r / CORE_RATE_DENOM,
|
|
50907
51975
|
totalSupply,
|
|
50908
|
-
exchangeRate: r *
|
|
51976
|
+
exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
|
|
50909
51977
|
};
|
|
50910
51978
|
}
|
|
50911
51979
|
};
|
|
@@ -50927,7 +51995,7 @@ var readerCoreStakedRatio = (entry) => {
|
|
|
50927
51995
|
return {
|
|
50928
51996
|
totalAssets: totalStaked,
|
|
50929
51997
|
totalSupply,
|
|
50930
|
-
exchangeRate: totalStaked *
|
|
51998
|
+
exchangeRate: totalStaked * ONE_E189 / totalSupply
|
|
50931
51999
|
};
|
|
50932
52000
|
}
|
|
50933
52001
|
};
|
|
@@ -50958,7 +52026,7 @@ var readerStellaStDot = (entry) => ({
|
|
|
50958
52026
|
{
|
|
50959
52027
|
address: entry.address,
|
|
50960
52028
|
name: "getPooledTokenByShares",
|
|
50961
|
-
params: [
|
|
52029
|
+
params: [ONE_E189]
|
|
50962
52030
|
},
|
|
50963
52031
|
{ address: entry.address, name: "getTotalPooledToken", params: [] }
|
|
50964
52032
|
],
|
|
@@ -50969,7 +52037,7 @@ var readerStellaStDot = (entry) => ({
|
|
|
50969
52037
|
if (totalSupply === void 0 || exchangeRate === void 0) {
|
|
50970
52038
|
return void 0;
|
|
50971
52039
|
}
|
|
50972
|
-
const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate /
|
|
52040
|
+
const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E189;
|
|
50973
52041
|
return {
|
|
50974
52042
|
totalAssets,
|
|
50975
52043
|
totalSupply,
|
|
@@ -51007,7 +52075,7 @@ var readerKintsuSMon = (entry) => ({
|
|
|
51007
52075
|
const totalAssets = toBigInt13(pooled);
|
|
51008
52076
|
const totalSupply = toBigInt13(shares);
|
|
51009
52077
|
if (totalAssets === void 0 || totalSupply === void 0) return void 0;
|
|
51010
|
-
const exchangeRate = totalSupply > 0n ? totalAssets *
|
|
52078
|
+
const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
|
|
51011
52079
|
return { totalAssets, totalSupply, exchangeRate };
|
|
51012
52080
|
}
|
|
51013
52081
|
});
|
|
@@ -51443,7 +52511,7 @@ var getLstValidators = async (chainId, shareToken) => {
|
|
|
51443
52511
|
};
|
|
51444
52512
|
|
|
51445
52513
|
// src/vaults/lst/fetchPublic.ts
|
|
51446
|
-
var
|
|
52514
|
+
var ONE_E1810 = 10n ** 18n;
|
|
51447
52515
|
var ERC20_BALANCE_ABI = parseAbi([
|
|
51448
52516
|
"function balanceOf(address) view returns (uint256)"
|
|
51449
52517
|
]);
|
|
@@ -51558,8 +52626,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
51558
52626
|
const underlyingUnit = 10n ** BigInt(underlyingDec);
|
|
51559
52627
|
const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
|
|
51560
52628
|
const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
|
|
51561
|
-
const convertToAssets = state.exchangeRate * underlyingUnit /
|
|
51562
|
-
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;
|
|
51563
52631
|
let liquidityRaw;
|
|
51564
52632
|
if (state.liquidity !== void 0) {
|
|
51565
52633
|
liquidityRaw = state.liquidity;
|
|
@@ -52230,16 +53298,17 @@ var Erc7540Abi = [
|
|
|
52230
53298
|
// src/vaults/lst/withdrawals/readers/erc7540.ts
|
|
52231
53299
|
var readerErc7540 = {
|
|
52232
53300
|
fetch: async (user, multicallRetry, chainId, entry) => {
|
|
53301
|
+
const requestContract = entry.lst;
|
|
52233
53302
|
const stage1 = await multicallRetry({
|
|
52234
53303
|
chain: chainId,
|
|
52235
53304
|
calls: [
|
|
52236
53305
|
{
|
|
52237
|
-
address:
|
|
53306
|
+
address: requestContract,
|
|
52238
53307
|
name: "pendingRedeemRequest",
|
|
52239
53308
|
params: [0n, user]
|
|
52240
53309
|
},
|
|
52241
53310
|
{
|
|
52242
|
-
address:
|
|
53311
|
+
address: requestContract,
|
|
52243
53312
|
name: "claimableRedeemRequest",
|
|
52244
53313
|
params: [0n, user]
|
|
52245
53314
|
}
|
|
@@ -52254,7 +53323,7 @@ var readerErc7540 = {
|
|
|
52254
53323
|
chain: chainId,
|
|
52255
53324
|
calls: [
|
|
52256
53325
|
{
|
|
52257
|
-
address:
|
|
53326
|
+
address: requestContract,
|
|
52258
53327
|
name: "convertToAssets",
|
|
52259
53328
|
params: [claimable]
|
|
52260
53329
|
}
|
|
@@ -52268,6 +53337,8 @@ var readerErc7540 = {
|
|
|
52268
53337
|
symbol: entry.symbol,
|
|
52269
53338
|
requestId: "0",
|
|
52270
53339
|
amountUnderlying: amount.toString(),
|
|
53340
|
+
// The 7540 claim (`redeem`) takes the share amount.
|
|
53341
|
+
shares: claimable.toString(),
|
|
52271
53342
|
status: "claimable"
|
|
52272
53343
|
});
|
|
52273
53344
|
}
|
|
@@ -52280,6 +53351,7 @@ var readerErc7540 = {
|
|
|
52280
53351
|
// Approximate to the share value at current price; UI can
|
|
52281
53352
|
// re-convert if it has the share exchangeRate.
|
|
52282
53353
|
amountUnderlying: pending.toString(),
|
|
53354
|
+
shares: pending.toString(),
|
|
52283
53355
|
status: "pending"
|
|
52284
53356
|
});
|
|
52285
53357
|
}
|
|
@@ -52338,6 +53410,172 @@ var readerEthenaCooldown = {
|
|
|
52338
53410
|
}
|
|
52339
53411
|
};
|
|
52340
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
|
+
|
|
52341
53579
|
// src/vaults/lst/withdrawals/abis/etherfi.ts
|
|
52342
53580
|
var EtherFiWithdrawRequestAbi = [
|
|
52343
53581
|
{
|
|
@@ -52552,7 +53790,9 @@ var readerKelp = {
|
|
|
52552
53790
|
}
|
|
52553
53791
|
const stage2 = await multicallRetry({
|
|
52554
53792
|
chain: chainId,
|
|
52555
|
-
calls: detailCalls.map(
|
|
53793
|
+
calls: detailCalls.map(
|
|
53794
|
+
({ _asset: _3, ...rest }) => rest
|
|
53795
|
+
),
|
|
52556
53796
|
abi: detailCalls.map(() => KelpWithdrawalManagerAbi)
|
|
52557
53797
|
});
|
|
52558
53798
|
const out = [];
|
|
@@ -53106,9 +54346,7 @@ var readerMantle = {
|
|
|
53106
54346
|
const results = await multicallRetry({
|
|
53107
54347
|
chain: chainId,
|
|
53108
54348
|
calls,
|
|
53109
|
-
abi: calls.map(
|
|
53110
|
-
() => MantleUnstakeRequestsManagerAbi
|
|
53111
|
-
)
|
|
54349
|
+
abi: calls.map(() => MantleUnstakeRequestsManagerAbi)
|
|
53112
54350
|
});
|
|
53113
54351
|
const out = [];
|
|
53114
54352
|
const lcUser = user.toLowerCase();
|
|
@@ -53985,6 +55223,10 @@ var buildWithdrawalReader = (entry) => {
|
|
|
53985
55223
|
return readerErc7540;
|
|
53986
55224
|
case "ethenaCooldown":
|
|
53987
55225
|
return readerEthenaCooldown;
|
|
55226
|
+
case "susd3Cooldown":
|
|
55227
|
+
return readerSusd3Cooldown;
|
|
55228
|
+
case "strataCooldown":
|
|
55229
|
+
return readerStrataCooldown;
|
|
53988
55230
|
case "swellNft":
|
|
53989
55231
|
return readerSwell;
|
|
53990
55232
|
case "stakeWiseSubgraph":
|
|
@@ -54048,6 +55290,14 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54048
55290
|
symbol: "LBTC",
|
|
54049
55291
|
reader: "unverified"
|
|
54050
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
|
+
},
|
|
54051
55301
|
{
|
|
54052
55302
|
lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
|
|
54053
55303
|
brand: "ether.fi",
|
|
@@ -54114,6 +55364,134 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54114
55364
|
symbol: "savETH",
|
|
54115
55365
|
reader: "ethenaCooldown"
|
|
54116
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
|
+
},
|
|
54117
55495
|
{
|
|
54118
55496
|
lst: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee",
|
|
54119
55497
|
brand: "EtherFi",
|
|
@@ -54213,6 +55591,14 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54213
55591
|
symbol: "rETH",
|
|
54214
55592
|
reader: "noQueue"
|
|
54215
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
|
+
},
|
|
54216
55602
|
{
|
|
54217
55603
|
lst: "0xbe9895146f7af43049ca1c1ae358b0541ea49704",
|
|
54218
55604
|
brand: "Coinbase",
|
|
@@ -54335,6 +55721,36 @@ var LST_WITHDRAWAL_REGISTRY = {
|
|
|
54335
55721
|
reader: "ethenaCooldown"
|
|
54336
55722
|
}
|
|
54337
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
|
+
],
|
|
54338
55754
|
"146": [
|
|
54339
55755
|
{
|
|
54340
55756
|
lst: "0xe5da20f15420ad15de0fa650600afc998bbe3955",
|
|
@@ -54616,7 +56032,7 @@ var NavOracleReadAbi = [
|
|
|
54616
56032
|
];
|
|
54617
56033
|
|
|
54618
56034
|
// src/vaults/savings/readers/shared.ts
|
|
54619
|
-
var
|
|
56035
|
+
var ONE_E1811 = 10n ** 18n;
|
|
54620
56036
|
var toBigInt15 = (v) => {
|
|
54621
56037
|
if (v === void 0 || v === null) return void 0;
|
|
54622
56038
|
if (typeof v === "bigint") return v;
|
|
@@ -54657,7 +56073,7 @@ var readerErc46262 = (entry) => {
|
|
|
54657
56073
|
return {
|
|
54658
56074
|
totalAssets,
|
|
54659
56075
|
totalSupply,
|
|
54660
|
-
exchangeRate: convertToAssetsRaw *
|
|
56076
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
|
|
54661
56077
|
};
|
|
54662
56078
|
}
|
|
54663
56079
|
};
|
|
@@ -54765,7 +56181,7 @@ var readerErc4626Idle = (entry) => {
|
|
|
54765
56181
|
return {
|
|
54766
56182
|
totalAssets,
|
|
54767
56183
|
totalSupply,
|
|
54768
|
-
exchangeRate: convertToAssetsRaw *
|
|
56184
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
|
|
54769
56185
|
...capacity !== void 0 ? {
|
|
54770
56186
|
instantRedeemCapacity: capacity,
|
|
54771
56187
|
instantRedeemEnabled: true,
|
|
@@ -54814,7 +56230,7 @@ var readerErc4626WithdrawLimit = (entry) => {
|
|
|
54814
56230
|
return {
|
|
54815
56231
|
totalAssets,
|
|
54816
56232
|
totalSupply,
|
|
54817
|
-
exchangeRate: convertToAssetsRaw *
|
|
56233
|
+
exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
|
|
54818
56234
|
...capacity !== void 0 ? {
|
|
54819
56235
|
instantRedeemCapacity: capacity,
|
|
54820
56236
|
instantRedeemEnabled: true,
|
|
@@ -54846,7 +56262,7 @@ var readerNavOracle = (entry) => {
|
|
|
54846
56262
|
const exchangeRate = toBigInt15(raw);
|
|
54847
56263
|
if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
|
|
54848
56264
|
return {
|
|
54849
|
-
totalAssets: totalSupply * exchangeRate * underlyingUnit / (
|
|
56265
|
+
totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
|
|
54850
56266
|
totalSupply,
|
|
54851
56267
|
exchangeRate
|
|
54852
56268
|
};
|
|
@@ -54860,7 +56276,7 @@ var readerNativeWnlp = (entry) => {
|
|
|
54860
56276
|
return {
|
|
54861
56277
|
calls: [
|
|
54862
56278
|
{ address, name: "totalSupply", params: [] },
|
|
54863
|
-
{ address, name: "getNlpByWnlp", params: [
|
|
56279
|
+
{ address, name: "getNlpByWnlp", params: [ONE_E1811] },
|
|
54864
56280
|
{ address, name: "instantRedeemFeeBips", params: [] },
|
|
54865
56281
|
{ address, name: "instantRedeemEnabled", params: [] },
|
|
54866
56282
|
// Falls back to the vault itself when no CreditVault is pinned —
|
|
@@ -54894,7 +56310,7 @@ var readerNativeWnlp = (entry) => {
|
|
|
54894
56310
|
const windowSeconds = toBigInt15(window);
|
|
54895
56311
|
const bips = toBigInt15(feeBips);
|
|
54896
56312
|
return {
|
|
54897
|
-
totalAssets: totalSupply * exchangeRate /
|
|
56313
|
+
totalAssets: totalSupply * exchangeRate / ONE_E1811,
|
|
54898
56314
|
totalSupply,
|
|
54899
56315
|
exchangeRate,
|
|
54900
56316
|
// `instantRedeemFeeBips` on-chain is already basis points, so it
|
|
@@ -54932,7 +56348,7 @@ var buildReader2 = (entry) => {
|
|
|
54932
56348
|
var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
|
|
54933
56349
|
|
|
54934
56350
|
// src/vaults/savings/fetchPublic.ts
|
|
54935
|
-
var
|
|
56351
|
+
var ONE_E1812 = 10n ** 18n;
|
|
54936
56352
|
var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
|
|
54937
56353
|
const entries = getSavingsRegistry(chainId);
|
|
54938
56354
|
if (entries.length === 0) return {};
|
|
@@ -54981,8 +56397,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
|
|
|
54981
56397
|
1,
|
|
54982
56398
|
Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
|
|
54983
56399
|
) : 1;
|
|
54984
|
-
const convertToAssets = state.exchangeRate * underlyingUnit /
|
|
54985
|
-
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;
|
|
54986
56402
|
const displayName = composeVaultDisplayName(
|
|
54987
56403
|
entry.brand,
|
|
54988
56404
|
entry.brand,
|
|
@@ -56699,23 +58115,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
|
|
|
56699
58115
|
const indexMax = price(prices, m.indexToken)?.max;
|
|
56700
58116
|
if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
|
|
56701
58117
|
const base = i * SLOTS;
|
|
56702
|
-
const
|
|
58118
|
+
const big9 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
|
|
56703
58119
|
const cap = computeDepositCapacityUsd(
|
|
56704
|
-
[info?.longTokenAmount, longMax,
|
|
56705
|
-
[info?.shortTokenAmount, shortMax,
|
|
58120
|
+
[info?.longTokenAmount, longMax, big9(0), big9(2)],
|
|
58121
|
+
[info?.shortTokenAmount, shortMax, big9(1), big9(3)]
|
|
56706
58122
|
);
|
|
56707
58123
|
if (cap != null) value.depositCapacityUsd = cap;
|
|
56708
58124
|
if (indexMax != null) {
|
|
56709
58125
|
const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
|
|
56710
|
-
const reservedUsdLong = (
|
|
56711
|
-
const reservedUsdShort = (
|
|
58126
|
+
const reservedUsdLong = (big9(4) + big9(5)) / divisor * indexMax;
|
|
58127
|
+
const reservedUsdShort = (big9(6) + big9(7)) / divisor;
|
|
56712
58128
|
const liq = computeLiquidityUsd(
|
|
56713
58129
|
info?.longTokenUsd,
|
|
56714
58130
|
info?.shortTokenUsd,
|
|
56715
58131
|
reservedUsdLong,
|
|
56716
58132
|
reservedUsdShort,
|
|
56717
|
-
|
|
56718
|
-
|
|
58133
|
+
big9(8),
|
|
58134
|
+
big9(9)
|
|
56719
58135
|
);
|
|
56720
58136
|
if (liq != null)
|
|
56721
58137
|
value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
|
|
@@ -56914,21 +58330,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
|
|
|
56914
58330
|
} catch {
|
|
56915
58331
|
return void 0;
|
|
56916
58332
|
}
|
|
56917
|
-
const
|
|
56918
|
-
const base =
|
|
56919
|
-
const mult =
|
|
58333
|
+
const big9 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
|
|
58334
|
+
const base = big9(0);
|
|
58335
|
+
const mult = big9(1);
|
|
56920
58336
|
if (base === 0n && mult === 0n) return void 0;
|
|
56921
58337
|
const PRECISION = 10n ** 30n;
|
|
56922
58338
|
const adjusted = (opGas) => base + opGas * mult / PRECISION;
|
|
56923
58339
|
const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
|
|
56924
|
-
const glvExtra =
|
|
58340
|
+
const glvExtra = big9(6) * GLV_NOMINAL_MARKET_COUNT;
|
|
56925
58341
|
return {
|
|
56926
58342
|
chainId,
|
|
56927
58343
|
gasPriceWei: gasPriceWei.toString(),
|
|
56928
|
-
deposit: fee(
|
|
56929
|
-
withdrawal: fee(
|
|
56930
|
-
glvDeposit: fee(
|
|
56931
|
-
glvWithdrawal: fee(
|
|
58344
|
+
deposit: fee(big9(2)),
|
|
58345
|
+
withdrawal: fee(big9(3)),
|
|
58346
|
+
glvDeposit: fee(big9(4) + glvExtra),
|
|
58347
|
+
glvWithdrawal: fee(big9(5) + glvExtra)
|
|
56932
58348
|
};
|
|
56933
58349
|
};
|
|
56934
58350
|
|
|
@@ -57315,7 +58731,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
|
|
|
57315
58731
|
};
|
|
57316
58732
|
|
|
57317
58733
|
// src/vaults/yield/annualize.ts
|
|
57318
|
-
var
|
|
58734
|
+
var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
|
|
57319
58735
|
var SCALE = 10n ** 18n;
|
|
57320
58736
|
var appendSnapshot = (points, snap, options) => {
|
|
57321
58737
|
const maxPoints = options?.maxPoints ?? 90;
|
|
@@ -57344,7 +58760,7 @@ var computeVaultApr = (points, options) => {
|
|
|
57344
58760
|
if (pThen === 0n) return void 0;
|
|
57345
58761
|
const ratioScaled = BigInt(now.p) * SCALE / pThen;
|
|
57346
58762
|
const ratio = Number(ratioScaled) / 1e18;
|
|
57347
|
-
const apr = (ratio - 1) * (
|
|
58763
|
+
const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
|
|
57348
58764
|
return {
|
|
57349
58765
|
apr,
|
|
57350
58766
|
sharePriceNow: now.p,
|
|
@@ -58147,6 +59563,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
|
|
|
58147
59563
|
return parseTokenBalanceResult(rawResult, prepared.query);
|
|
58148
59564
|
}
|
|
58149
59565
|
|
|
58150
|
-
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 };
|
|
58151
59567
|
//# sourceMappingURL=index.js.map
|
|
58152
59568
|
//# sourceMappingURL=index.js.map
|