@1delta/margin-fetcher 0.0.154 → 0.0.155
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-GIMPTIO7.js +5 -0
- package/dist/{ccip-ZCD57SLY.js.map → ccip-GIMPTIO7.js.map} +1 -1
- package/dist/{chunk-ODBGQEBG.js → chunk-2TBRXA5J.js} +20 -4
- package/dist/chunk-2TBRXA5J.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1844 -1214
- package/dist/index.js.map +1 -1
- package/dist/lending/index.d.ts +5 -6
- package/dist/lending/index.d.ts.map +1 -1
- package/dist/lending/public-data/aave-v2-type/misc.d.ts.map +1 -0
- package/dist/lending/public-data/aave-v2-type/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/publicCallParse.d.ts +3 -3
- package/dist/lending/public-data/aave-v2-type/publicCallParse.d.ts.map +1 -0
- package/dist/lending/{aave-v3-type → public-data/aave-v3-type}/publicCallBuild.d.ts +1 -1
- package/dist/lending/public-data/aave-v3-type/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{aave-v3-type → public-data/aave-v3-type}/publicCallParse.d.ts +3 -3
- package/dist/lending/public-data/aave-v3-type/publicCallParse.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/aave.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/aaveV2.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/aurelius.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/compoundV2.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/compoundV3.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/hana.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/init.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/lendle.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/meridian.d.ts.map +1 -0
- package/dist/lending/public-data/addresses/takotako.d.ts.map +1 -0
- package/dist/lending/public-data/compound-v2/getters/moonwell.d.ts.map +1 -0
- package/dist/lending/public-data/compound-v2/getters/types.d.ts.map +1 -0
- package/dist/lending/public-data/compound-v2/getters/venus.d.ts.map +1 -0
- package/dist/lending/public-data/compound-v2/publicCallBuild.d.ts +2 -0
- package/dist/lending/public-data/compound-v2/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{compound-v2 → public-data/compound-v2}/publicCallParse.d.ts +2 -2
- package/dist/lending/public-data/compound-v2/publicCallParse.d.ts.map +1 -0
- package/dist/lending/public-data/compound-v3/publicCallBuild.d.ts +2 -0
- package/dist/lending/public-data/compound-v3/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{compound-v3 → public-data/compound-v3}/publicCallParse.d.ts +3 -3
- package/dist/lending/public-data/compound-v3/publicCallParse.d.ts.map +1 -0
- package/dist/lending/{fetchLender.d.ts → public-data/fetchLender.d.ts} +2 -2
- package/dist/lending/public-data/fetchLender.d.ts.map +1 -0
- package/dist/lending/{fetchLenderAll.d.ts → public-data/fetchLenderAll.d.ts} +2 -2
- package/dist/lending/public-data/fetchLenderAll.d.ts.map +1 -0
- package/dist/lending/{fetchLenderExt.d.ts → public-data/fetchLenderExt.d.ts} +2 -2
- package/dist/lending/public-data/fetchLenderExt.d.ts.map +1 -0
- package/dist/lending/{init → public-data/init}/publicCallBuild.d.ts +1 -1
- package/dist/lending/public-data/init/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{init → public-data/init}/publicCallParse.d.ts +3 -3
- package/dist/lending/public-data/init/publicCallParse.d.ts.map +1 -0
- package/dist/lending/{lista → public-data/lista}/getMarketsFromChain.d.ts +2 -2
- package/dist/lending/public-data/lista/getMarketsFromChain.d.ts.map +1 -0
- package/dist/lending/public-data/lista/getMarketsOnChain.d.ts.map +1 -0
- package/dist/lending/{lista → public-data/lista}/publicCallBuild.d.ts +2 -2
- package/dist/lending/public-data/lista/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/{morpho → public-data/morpho}/convertPublic.d.ts +3 -3
- package/dist/lending/public-data/morpho/convertPublic.d.ts.map +1 -0
- package/dist/lending/public-data/morpho/fetchPublic.d.ts.map +1 -0
- package/dist/lending/{morpho → public-data/morpho}/getMarketsFromChain.d.ts +2 -2
- package/dist/lending/public-data/morpho/getMarketsFromChain.d.ts.map +1 -0
- package/dist/lending/public-data/morpho/index.d.ts.map +1 -0
- package/dist/lending/{morpho → public-data/morpho}/publicCallBuild.d.ts +3 -2
- package/dist/lending/public-data/morpho/publicCallBuild.d.ts.map +1 -0
- package/dist/lending/public-data/morpho/utils/evmParser.d.ts.map +1 -0
- package/dist/lending/public-data/morpho/utils/mathLib.d.ts.map +1 -0
- package/dist/lending/public-data/morpho/utils/parsers.d.ts.map +1 -0
- package/dist/lending/user-data/compound-v3/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/fetchUserData.d.ts +2 -2
- package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
- package/dist/lending/user-data/index.d.ts +1 -0
- package/dist/lending/user-data/index.d.ts.map +1 -1
- package/dist/lending/user-data/init/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/summary/buildPortfolioTotals.d.ts +19 -0
- package/dist/lending/user-data/summary/buildPortfolioTotals.d.ts.map +1 -0
- package/dist/lending/user-data/summary/buildSummaries.d.ts +28 -0
- package/dist/lending/user-data/summary/buildSummaries.d.ts.map +1 -0
- package/dist/lending/user-data/summary/index.d.ts +5 -0
- package/dist/lending/user-data/summary/index.d.ts.map +1 -0
- package/dist/lending/user-data/summary/types.d.ts +96 -0
- package/dist/lending/user-data/summary/types.d.ts.map +1 -0
- package/dist/lending/user-data/summary/utils.d.ts +24 -0
- package/dist/lending/user-data/summary/utils.d.ts.map +1 -0
- package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
- package/dist/lending/user-data/utils/createMultiAccountStyleUserState.d.ts.map +1 -1
- package/dist/lending/user-data/utils/types.d.ts +3 -0
- package/dist/lending/user-data/utils/types.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchOraclePrices.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/aave.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/compoundV2.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/compoundV3.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/lista.d.ts +30 -5
- package/dist/prices/oracle-prices/fetchers/lista.d.ts.map +1 -1
- package/dist/prices/oracle-prices/fetchers/morpho.d.ts +15 -5
- package/dist/prices/oracle-prices/fetchers/morpho.d.ts.map +1 -1
- package/dist/prices/oracle-prices/types.d.ts +6 -0
- package/dist/prices/oracle-prices/types.d.ts.map +1 -1
- package/dist/token/fetchTokenBalance.d.ts +47 -0
- package/dist/token/fetchTokenBalance.d.ts.map +1 -0
- package/dist/token/fetchTokenMetadata.d.ts +11 -0
- package/dist/token/fetchTokenMetadata.d.ts.map +1 -0
- package/dist/token/index.d.ts +4 -0
- package/dist/token/index.d.ts.map +1 -0
- package/dist/token/types.d.ts +32 -0
- package/dist/token/types.d.ts.map +1 -0
- package/dist/types/lender/aave-v2-types.d.ts +2 -0
- package/dist/types/lender/aave-v2-types.d.ts.map +1 -1
- package/dist/types/lender/aave-v3-types.d.ts +2 -0
- package/dist/types/lender/aave-v3-types.d.ts.map +1 -1
- package/dist/types/lender/compound-v2-types.d.ts +1 -0
- package/dist/types/lender/compound-v2-types.d.ts.map +1 -1
- package/dist/types/lender/compound-v3-types.d.ts +2 -0
- package/dist/types/lender/compound-v3-types.d.ts.map +1 -1
- package/dist/types/lender/init-types.d.ts +2 -0
- package/dist/types/lender/init-types.d.ts.map +1 -1
- package/dist/types/lender/morpho-types.d.ts +1 -0
- package/dist/types/lender/morpho-types.d.ts.map +1 -1
- package/dist/types/lenderTypes.d.ts +15 -9
- package/dist/types/lenderTypes.d.ts.map +1 -1
- package/dist/utils/marketUid.d.ts +7 -1
- package/dist/utils/marketUid.d.ts.map +1 -1
- package/dist/yields/fetchGeneralYields.d.ts +3 -0
- package/dist/yields/fetchGeneralYields.d.ts.map +1 -0
- package/dist/yields/fetchers/angle.d.ts +3 -0
- package/dist/yields/fetchers/angle.d.ts.map +1 -0
- package/dist/yields/fetchers/coinbase.d.ts +3 -0
- package/dist/yields/fetchers/coinbase.d.ts.map +1 -0
- package/dist/yields/fetchers/ethena.d.ts +3 -0
- package/dist/yields/fetchers/ethena.d.ts.map +1 -0
- package/dist/yields/fetchers/etherfi.d.ts +8 -0
- package/dist/yields/fetchers/etherfi.d.ts.map +1 -0
- package/dist/yields/fetchers/gmx.d.ts +3 -0
- package/dist/yields/fetchers/gmx.d.ts.map +1 -0
- package/dist/yields/fetchers/hyperbeat.d.ts +4 -0
- package/dist/yields/fetchers/hyperbeat.d.ts.map +1 -0
- package/dist/yields/fetchers/hyperlend.d.ts +3 -0
- package/dist/yields/fetchers/hyperlend.d.ts.map +1 -0
- package/dist/yields/fetchers/hyperliquid.d.ts +4 -0
- package/dist/yields/fetchers/hyperliquid.d.ts.map +1 -0
- package/dist/yields/fetchers/jito.d.ts +3 -0
- package/dist/yields/fetchers/jito.d.ts.map +1 -0
- package/dist/yields/fetchers/kelp.d.ts +3 -0
- package/dist/yields/fetchers/kelp.d.ts.map +1 -0
- package/dist/yields/fetchers/lido.d.ts +4 -0
- package/dist/yields/fetchers/lido.d.ts.map +1 -0
- package/dist/yields/fetchers/mantle.d.ts +3 -0
- package/dist/yields/fetchers/mantle.d.ts.map +1 -0
- package/dist/yields/fetchers/morphoVaults.d.ts +3 -0
- package/dist/yields/fetchers/morphoVaults.d.ts.map +1 -0
- package/dist/yields/fetchers/pendle.d.ts +3 -0
- package/dist/yields/fetchers/pendle.d.ts.map +1 -0
- package/dist/yields/fetchers/puffer.d.ts +3 -0
- package/dist/yields/fetchers/puffer.d.ts.map +1 -0
- package/dist/yields/fetchers/renzo.d.ts +3 -0
- package/dist/yields/fetchers/renzo.d.ts.map +1 -0
- package/dist/yields/fetchers/reserve.d.ts +3 -0
- package/dist/yields/fetchers/reserve.d.ts.map +1 -0
- package/dist/yields/fetchers/reservoir.d.ts +3 -0
- package/dist/yields/fetchers/reservoir.d.ts.map +1 -0
- package/dist/yields/fetchers/resolv.d.ts +4 -0
- package/dist/yields/fetchers/resolv.d.ts.map +1 -0
- package/dist/yields/fetchers/rocketpool.d.ts +3 -0
- package/dist/yields/fetchers/rocketpool.d.ts.map +1 -0
- package/dist/yields/fetchers/savax.d.ts +3 -0
- package/dist/yields/fetchers/savax.d.ts.map +1 -0
- package/dist/yields/fetchers/sky.d.ts +3 -0
- package/dist/yields/fetchers/sky.d.ts.map +1 -0
- package/dist/yields/fetchers/stader.d.ts +4 -0
- package/dist/yields/fetchers/stader.d.ts.map +1 -0
- package/dist/yields/fetchers/stakewise.d.ts +3 -0
- package/dist/yields/fetchers/stakewise.d.ts.map +1 -0
- package/dist/yields/fetchers/superreturn.d.ts +3 -0
- package/dist/yields/fetchers/superreturn.d.ts.map +1 -0
- package/dist/yields/fetchers/swell.d.ts +3 -0
- package/dist/yields/fetchers/swell.d.ts.map +1 -0
- package/dist/yields/fetchers/theo.d.ts +3 -0
- package/dist/yields/fetchers/theo.d.ts.map +1 -0
- package/dist/yields/fetchers/trufin.d.ts +3 -0
- package/dist/yields/fetchers/trufin.d.ts.map +1 -0
- package/dist/yields/fetchers/usdai.d.ts +3 -0
- package/dist/yields/fetchers/usdai.d.ts.map +1 -0
- package/dist/yields/fetchers/usdx.d.ts +3 -0
- package/dist/yields/fetchers/usdx.d.ts.map +1 -0
- package/dist/yields/fetchers/usual.d.ts +4 -0
- package/dist/yields/fetchers/usual.d.ts.map +1 -0
- package/dist/yields/fetchers/yearnKatana.d.ts +3 -0
- package/dist/yields/fetchers/yearnKatana.d.ts.map +1 -0
- package/dist/yields/fetchers/yieldfi.d.ts +3 -0
- package/dist/yields/fetchers/yieldfi.d.ts.map +1 -0
- package/dist/yields/fetchers/yieldnest.d.ts +3 -0
- package/dist/yields/fetchers/yieldnest.d.ts.map +1 -0
- package/dist/yields/fetchers/yoProtocol.d.ts +3 -0
- package/dist/yields/fetchers/yoProtocol.d.ts.map +1 -0
- package/dist/yields/helpers.d.ts +8 -0
- package/dist/yields/helpers.d.ts.map +1 -0
- package/dist/yields/index.d.ts +2 -20
- package/dist/yields/index.d.ts.map +1 -1
- package/dist/yields/types.d.ts +32 -0
- package/dist/yields/types.d.ts.map +1 -0
- package/package.json +4 -3
- package/dist/ccip-ZCD57SLY.js +0 -5
- package/dist/chunk-ODBGQEBG.js.map +0 -1
- package/dist/lending/aave-v2-type/misc.d.ts.map +0 -1
- package/dist/lending/aave-v2-type/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/aave-v2-type/publicCallParse.d.ts.map +0 -1
- package/dist/lending/aave-v3-type/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/aave-v3-type/publicCallParse.d.ts.map +0 -1
- package/dist/lending/addresses/aave.d.ts.map +0 -1
- package/dist/lending/addresses/aaveV2.d.ts.map +0 -1
- package/dist/lending/addresses/aurelius.d.ts.map +0 -1
- package/dist/lending/addresses/compoundV2.d.ts.map +0 -1
- package/dist/lending/addresses/compoundV3.d.ts.map +0 -1
- package/dist/lending/addresses/hana.d.ts.map +0 -1
- package/dist/lending/addresses/init.d.ts.map +0 -1
- package/dist/lending/addresses/lendle.d.ts.map +0 -1
- package/dist/lending/addresses/meridian.d.ts.map +0 -1
- package/dist/lending/addresses/takotako.d.ts.map +0 -1
- package/dist/lending/compound-v2/getters/moonwell.d.ts.map +0 -1
- package/dist/lending/compound-v2/getters/types.d.ts.map +0 -1
- package/dist/lending/compound-v2/getters/venus.d.ts.map +0 -1
- package/dist/lending/compound-v2/publicCallBuild.d.ts +0 -2
- package/dist/lending/compound-v2/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/compound-v2/publicCallParse.d.ts.map +0 -1
- package/dist/lending/compound-v3/publicCallBuild.d.ts +0 -2
- package/dist/lending/compound-v3/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/compound-v3/publicCallParse.d.ts.map +0 -1
- package/dist/lending/fetchLender.d.ts.map +0 -1
- package/dist/lending/fetchLenderAll.d.ts.map +0 -1
- package/dist/lending/fetchLenderExt.d.ts.map +0 -1
- package/dist/lending/init/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/init/publicCallParse.d.ts.map +0 -1
- package/dist/lending/lista/getMarketsFromChain.d.ts.map +0 -1
- package/dist/lending/lista/getMarketsOnChain.d.ts.map +0 -1
- package/dist/lending/lista/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/meta/index.d.ts +0 -23
- package/dist/lending/meta/index.d.ts.map +0 -1
- package/dist/lending/morpho/convertPublic.d.ts.map +0 -1
- package/dist/lending/morpho/fetchPublic.d.ts.map +0 -1
- package/dist/lending/morpho/getMarketsFromChain.d.ts.map +0 -1
- package/dist/lending/morpho/index.d.ts.map +0 -1
- package/dist/lending/morpho/publicCallBuild.d.ts.map +0 -1
- package/dist/lending/morpho/utils/evmParser.d.ts.map +0 -1
- package/dist/lending/morpho/utils/mathLib.d.ts.map +0 -1
- package/dist/lending/morpho/utils/parsers.d.ts.map +0 -1
- /package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/misc.d.ts +0 -0
- /package/dist/lending/{aave-v2-type → public-data/aave-v2-type}/publicCallBuild.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/aave.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/aaveV2.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/aurelius.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/compoundV2.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/compoundV3.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/hana.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/init.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/lendle.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/meridian.d.ts +0 -0
- /package/dist/lending/{addresses → public-data/addresses}/takotako.d.ts +0 -0
- /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/moonwell.d.ts +0 -0
- /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/types.d.ts +0 -0
- /package/dist/lending/{compound-v2 → public-data/compound-v2}/getters/venus.d.ts +0 -0
- /package/dist/lending/{lista → public-data/lista}/getMarketsOnChain.d.ts +0 -0
- /package/dist/lending/{morpho → public-data/morpho}/fetchPublic.d.ts +0 -0
- /package/dist/lending/{morpho → public-data/morpho}/index.d.ts +0 -0
- /package/dist/lending/{morpho → public-data/morpho}/utils/evmParser.d.ts +0 -0
- /package/dist/lending/{morpho → public-data/morpho}/utils/mathLib.d.ts +0 -0
- /package/dist/lending/{morpho → public-data/morpho}/utils/parsers.d.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters } from './chunk-
|
|
1
|
+
import { formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, isAddress, InvalidAddressError, pad, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-2TBRXA5J.js';
|
|
2
2
|
import './chunk-BYTNVMX7.js';
|
|
3
3
|
import './chunk-PR4QN5HX.js';
|
|
4
4
|
import { Lender, AAVE_V3_LENDERS, AAVE_V2_LENDERS, AAVE_V32_LENDERS, COMPOUND_V2_LENDERS, VENUS_LENDERS } from '@1delta/lender-registry';
|
|
5
5
|
import lodash from 'lodash';
|
|
6
|
-
import { getEvmChain, multicallRetry, getEvmClientUniversal } from '@1delta/providers';
|
|
6
|
+
import { getEvmChain, multicallRetry, getEvmClient, getEvmClientUniversal } from '@1delta/providers';
|
|
7
7
|
import { BALANCER_V2_FORKS, BALANCER_V3_FORKS, UNISWAP_V4_FORKS, FLASH_LOAN_IDS } from '@1delta/dex-registry';
|
|
8
8
|
|
|
9
9
|
// src/abis/aave-v2/ProtocolDataProvider.ts
|
|
@@ -6244,9 +6244,6 @@ var IrgetterAbi = [
|
|
|
6244
6244
|
// ../data-sdk/dist/index.mjs
|
|
6245
6245
|
var GLOBAL_CHAIN_DATA_KEY = "__1delta_chain_registry__";
|
|
6246
6246
|
globalThis[GLOBAL_CHAIN_DATA_KEY] = {};
|
|
6247
|
-
function initializeChainData({ chainsOverride }) {
|
|
6248
|
-
if (chainsOverride) globalThis[GLOBAL_CHAIN_DATA_KEY] = chainsOverride;
|
|
6249
|
-
}
|
|
6250
6247
|
var GLOBAL_LENDER_DATA_KEY = "__1delta_lender_registry__";
|
|
6251
6248
|
globalThis[GLOBAL_LENDER_DATA_KEY] = {
|
|
6252
6249
|
aaveTokens: {},
|
|
@@ -6271,46 +6268,6 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
|
|
|
6271
6268
|
function getGlobalData2() {
|
|
6272
6269
|
return globalThis[GLOBAL_LENDER_DATA_KEY];
|
|
6273
6270
|
}
|
|
6274
|
-
function initializeLenderData({
|
|
6275
|
-
aaveTokensOverride,
|
|
6276
|
-
aavePoolsOverride,
|
|
6277
|
-
aaveOraclesOverride,
|
|
6278
|
-
compoundV2OraclesOverride,
|
|
6279
|
-
compoundV3OraclesOverride,
|
|
6280
|
-
compoundV3PoolsOverride,
|
|
6281
|
-
compoundV3BaseDataOverride,
|
|
6282
|
-
morphoPoolsOverride,
|
|
6283
|
-
compoundV2TokensOverride,
|
|
6284
|
-
compoundV2TokenArrayOverride,
|
|
6285
|
-
compoundV2PoolsOverride,
|
|
6286
|
-
initConfigOverride,
|
|
6287
|
-
aaveReservesOverride,
|
|
6288
|
-
compoundV3ReservesOverride,
|
|
6289
|
-
compoundV2ReservesOverride,
|
|
6290
|
-
morphoOraclesOverride,
|
|
6291
|
-
morphoTypeOraclesOverride,
|
|
6292
|
-
morphoTypeMarketsOverride
|
|
6293
|
-
}) {
|
|
6294
|
-
const data = getGlobalData2();
|
|
6295
|
-
if (aaveTokensOverride) data.aaveTokens = aaveTokensOverride;
|
|
6296
|
-
if (aaveOraclesOverride) data.aaveOracles = aaveOraclesOverride;
|
|
6297
|
-
if (compoundV2OraclesOverride) data.compoundV2Oracles = compoundV2OraclesOverride;
|
|
6298
|
-
if (compoundV3OraclesOverride) data.compoundV3Oracles = compoundV3OraclesOverride;
|
|
6299
|
-
if (aavePoolsOverride) data.aavePools = aavePoolsOverride;
|
|
6300
|
-
if (compoundV3PoolsOverride) data.compoundV3Pools = compoundV3PoolsOverride;
|
|
6301
|
-
if (morphoPoolsOverride) data.morphoPools = morphoPoolsOverride;
|
|
6302
|
-
if (compoundV3BaseDataOverride) data.compoundV3BaseData = compoundV3BaseDataOverride;
|
|
6303
|
-
if (compoundV2TokensOverride) data.compoundV2Tokens = compoundV2TokensOverride;
|
|
6304
|
-
if (compoundV2TokenArrayOverride) data.compoundV2TokenArray = compoundV2TokenArrayOverride;
|
|
6305
|
-
if (compoundV2PoolsOverride) data.compoundV2Pools = compoundV2PoolsOverride;
|
|
6306
|
-
if (initConfigOverride) data.initConfig = initConfigOverride;
|
|
6307
|
-
if (aaveReservesOverride) data.aaveReserves = aaveReservesOverride;
|
|
6308
|
-
if (compoundV3ReservesOverride) data.compoundV3Reserves = compoundV3ReservesOverride;
|
|
6309
|
-
if (compoundV2ReservesOverride) data.compoundV2Reserves = compoundV2ReservesOverride;
|
|
6310
|
-
if (morphoOraclesOverride) data.morphoOracles = morphoOraclesOverride;
|
|
6311
|
-
if (morphoTypeOraclesOverride) data.morphoTypeOracles = morphoTypeOraclesOverride;
|
|
6312
|
-
if (morphoTypeMarketsOverride) data.morphoTypeMarkets = morphoTypeMarketsOverride;
|
|
6313
|
-
}
|
|
6314
6271
|
var aaveTokens = () => getGlobalData2()?.aaveTokens;
|
|
6315
6272
|
var aavePools = () => getGlobalData2()?.aavePools;
|
|
6316
6273
|
var aaveOracles = () => getGlobalData2()?.aaveOracles;
|
|
@@ -6328,9 +6285,28 @@ var compoundV2Pools = () => getGlobalData2()?.compoundV2Pools;
|
|
|
6328
6285
|
var compoundV2Tokens = () => getGlobalData2()?.compoundV2Tokens;
|
|
6329
6286
|
var compoundV2TokenArray = () => getGlobalData2()?.compoundV2TokenArray;
|
|
6330
6287
|
var initConfig = () => getGlobalData2()?.initConfig;
|
|
6288
|
+
var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
|
|
6289
|
+
async function fetchTokenList(chainId) {
|
|
6290
|
+
const data = await fetch(getListUrl(chainId));
|
|
6291
|
+
if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
|
|
6292
|
+
return (await data.json()).list;
|
|
6293
|
+
}
|
|
6294
|
+
async function fetchTokenLists(chainIds) {
|
|
6295
|
+
const promises = chainIds.map(async (chainId) => {
|
|
6296
|
+
const list = await fetchTokenList(chainId);
|
|
6297
|
+
return [chainId, list];
|
|
6298
|
+
});
|
|
6299
|
+
const results = await Promise.all(promises);
|
|
6300
|
+
return Object.fromEntries(results);
|
|
6301
|
+
}
|
|
6331
6302
|
|
|
6332
6303
|
// src/utils/marketUid.ts
|
|
6333
6304
|
function createMarketUid(chainId, lender, refAddress) {
|
|
6305
|
+
if (!refAddress || !lender || !chainId) {
|
|
6306
|
+
throw new Error(
|
|
6307
|
+
`Invalid marketUid parameters: lender=${lender}, chainId=${chainId}, refAddress=${refAddress}`
|
|
6308
|
+
);
|
|
6309
|
+
}
|
|
6334
6310
|
return `${lender}:${chainId}:${refAddress.toLowerCase()}`;
|
|
6335
6311
|
}
|
|
6336
6312
|
|
|
@@ -6383,22 +6359,22 @@ var ENABLED_COMPOUNDS = [
|
|
|
6383
6359
|
var getLendersForChain = (c) => {
|
|
6384
6360
|
let lenders = [];
|
|
6385
6361
|
Object.entries(aavePools() ?? {}).forEach(([l, data]) => {
|
|
6386
|
-
const
|
|
6387
|
-
if (
|
|
6362
|
+
const chains = Object.keys(data);
|
|
6363
|
+
if (chains.includes(c)) lenders.push(l);
|
|
6388
6364
|
});
|
|
6389
6365
|
if (compoundV3Pools()?.[c])
|
|
6390
6366
|
lenders = [...lenders, ...Object.keys(compoundV3Pools()?.[c])];
|
|
6391
6367
|
Object.entries(initConfig() ?? {}).forEach(([l, data]) => {
|
|
6392
|
-
const
|
|
6393
|
-
if (
|
|
6368
|
+
const chains = Object.keys(data);
|
|
6369
|
+
if (chains.includes(c)) lenders.push(l);
|
|
6394
6370
|
});
|
|
6395
6371
|
Object.entries(morphoPools() ?? {}).forEach(([l, data]) => {
|
|
6396
|
-
const
|
|
6397
|
-
if (
|
|
6372
|
+
const chains = Object.keys(data);
|
|
6373
|
+
if (chains.includes(c)) lenders.push(l);
|
|
6398
6374
|
});
|
|
6399
6375
|
Object.entries(compoundV2Pools() ?? {}).forEach(([l, data]) => {
|
|
6400
|
-
const
|
|
6401
|
-
if (
|
|
6376
|
+
const chains = Object.keys(data);
|
|
6377
|
+
if (chains.includes(c) && ENABLED_COMPOUNDS.includes(l)) lenders.push(l);
|
|
6402
6378
|
});
|
|
6403
6379
|
return lenders;
|
|
6404
6380
|
};
|
|
@@ -6462,7 +6438,7 @@ var toGenericPriceKey = (assetAddress, chainId) => {
|
|
|
6462
6438
|
return chainId + "-" + assetAddress;
|
|
6463
6439
|
};
|
|
6464
6440
|
|
|
6465
|
-
// src/lending/aave-v2-type/publicCallBuild.ts
|
|
6441
|
+
// src/lending/public-data/aave-v2-type/publicCallBuild.ts
|
|
6466
6442
|
var buildAaveV2StyleLenderReserveCall = (chainId, lender) => {
|
|
6467
6443
|
const providerAddress = getAaveTypePoolDataProviderAddress(chainId, lender);
|
|
6468
6444
|
const underlyingTokensArray = getAaveAssets(chainId, lender);
|
|
@@ -7581,7 +7557,7 @@ var Chain = /* @__PURE__ */ ((Chain2) => {
|
|
|
7581
7557
|
return Chain2;
|
|
7582
7558
|
})(Chain || {});
|
|
7583
7559
|
|
|
7584
|
-
// src/lending/aave-v3-type/publicCallBuild.ts
|
|
7560
|
+
// src/lending/public-data/aave-v3-type/publicCallBuild.ts
|
|
7585
7561
|
function range(n) {
|
|
7586
7562
|
return Array.from({ length: n + 1 }, (_2, i) => i);
|
|
7587
7563
|
}
|
|
@@ -7732,7 +7708,7 @@ var buildAaveV3StyleLenderReserveCall = (chainId, lender) => {
|
|
|
7732
7708
|
}
|
|
7733
7709
|
};
|
|
7734
7710
|
|
|
7735
|
-
// src/lending/addresses/init.ts
|
|
7711
|
+
// src/lending/public-data/addresses/init.ts
|
|
7736
7712
|
function getInitLensAddress(chainId) {
|
|
7737
7713
|
return addressesInitCore.PublicLens[chainId];
|
|
7738
7714
|
}
|
|
@@ -7771,7 +7747,7 @@ function getInitUnderlyingToPoolMap(chainId, lender) {
|
|
|
7771
7747
|
}, /* @__PURE__ */ new Map());
|
|
7772
7748
|
}
|
|
7773
7749
|
|
|
7774
|
-
// src/lending/init/publicCallBuild.ts
|
|
7750
|
+
// src/lending/public-data/init/publicCallBuild.ts
|
|
7775
7751
|
var INIT_MODES = [1, 2, 3, 4, 5, 6];
|
|
7776
7752
|
var buildInitStyleLenderReserveCall = (chainId, lender) => {
|
|
7777
7753
|
const lensAddress = getInitLensAddress(chainId);
|
|
@@ -7822,7 +7798,7 @@ function getCompoundV3BaseAsset(lender, chainId) {
|
|
|
7822
7798
|
return compoundV3BaseData()?.[lender]?.[chainId];
|
|
7823
7799
|
}
|
|
7824
7800
|
|
|
7825
|
-
// src/lending/compound-v3/publicCallBuild.ts
|
|
7801
|
+
// src/lending/public-data/compound-v3/publicCallBuild.ts
|
|
7826
7802
|
var buildCompoundV3StyleLenderReserveCall = (chainId, lender) => {
|
|
7827
7803
|
const baseAssetData = getCompoundV3BaseAsset(lender, chainId);
|
|
7828
7804
|
const underlyingArray = getCompoundV3Assets(chainId, lender);
|
|
@@ -7889,6 +7865,69 @@ var buildCompoundV3StyleLenderReserveCall = (chainId, lender) => {
|
|
|
7889
7865
|
return calls;
|
|
7890
7866
|
};
|
|
7891
7867
|
|
|
7868
|
+
// ../../node_modules/.pnpm/viem@2.45.1_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/viem/_esm/utils/abi/encodePacked.js
|
|
7869
|
+
function encodePacked(types, values) {
|
|
7870
|
+
if (types.length !== values.length)
|
|
7871
|
+
throw new AbiEncodingLengthMismatchError({
|
|
7872
|
+
expectedLength: types.length,
|
|
7873
|
+
givenLength: values.length
|
|
7874
|
+
});
|
|
7875
|
+
const data = [];
|
|
7876
|
+
for (let i = 0; i < types.length; i++) {
|
|
7877
|
+
const type = types[i];
|
|
7878
|
+
const value = values[i];
|
|
7879
|
+
data.push(encode(type, value));
|
|
7880
|
+
}
|
|
7881
|
+
return concatHex(data);
|
|
7882
|
+
}
|
|
7883
|
+
function encode(type, value, isArray2 = false) {
|
|
7884
|
+
if (type === "address") {
|
|
7885
|
+
const address = value;
|
|
7886
|
+
if (!isAddress(address))
|
|
7887
|
+
throw new InvalidAddressError({ address });
|
|
7888
|
+
return pad(address.toLowerCase(), {
|
|
7889
|
+
size: isArray2 ? 32 : null
|
|
7890
|
+
});
|
|
7891
|
+
}
|
|
7892
|
+
if (type === "string")
|
|
7893
|
+
return stringToHex(value);
|
|
7894
|
+
if (type === "bytes")
|
|
7895
|
+
return value;
|
|
7896
|
+
if (type === "bool")
|
|
7897
|
+
return pad(boolToHex(value), { size: isArray2 ? 32 : 1 });
|
|
7898
|
+
const intMatch = type.match(integerRegex);
|
|
7899
|
+
if (intMatch) {
|
|
7900
|
+
const [_type, baseType, bits = "256"] = intMatch;
|
|
7901
|
+
const size = Number.parseInt(bits, 10) / 8;
|
|
7902
|
+
return numberToHex(value, {
|
|
7903
|
+
size: isArray2 ? 32 : size,
|
|
7904
|
+
signed: baseType === "int"
|
|
7905
|
+
});
|
|
7906
|
+
}
|
|
7907
|
+
const bytesMatch = type.match(bytesRegex);
|
|
7908
|
+
if (bytesMatch) {
|
|
7909
|
+
const [_type, size] = bytesMatch;
|
|
7910
|
+
if (Number.parseInt(size, 10) !== (value.length - 2) / 2)
|
|
7911
|
+
throw new BytesSizeMismatchError({
|
|
7912
|
+
expectedSize: Number.parseInt(size, 10),
|
|
7913
|
+
givenSize: (value.length - 2) / 2
|
|
7914
|
+
});
|
|
7915
|
+
return pad(value, { dir: "right", size: isArray2 ? 32 : null });
|
|
7916
|
+
}
|
|
7917
|
+
const arrayMatch = type.match(arrayRegex);
|
|
7918
|
+
if (arrayMatch && Array.isArray(value)) {
|
|
7919
|
+
const [_type, childType] = arrayMatch;
|
|
7920
|
+
const data = [];
|
|
7921
|
+
for (let i = 0; i < value.length; i++) {
|
|
7922
|
+
data.push(encode(childType, value[i], true));
|
|
7923
|
+
}
|
|
7924
|
+
if (data.length === 0)
|
|
7925
|
+
return "0x";
|
|
7926
|
+
return concatHex(data);
|
|
7927
|
+
}
|
|
7928
|
+
throw new UnsupportedPackedAbiType(type);
|
|
7929
|
+
}
|
|
7930
|
+
|
|
7892
7931
|
// ../../node_modules/.pnpm/viem@2.45.1_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@5.0.10_zod@4.3.6/node_modules/viem/_esm/errors/unit.js
|
|
7893
7932
|
var InvalidDecimalNumberError = class extends BaseError {
|
|
7894
7933
|
constructor({ value }) {
|
|
@@ -8009,7 +8048,7 @@ var formatMorphoPrice = (price, collateralDec, debtDec) => {
|
|
|
8009
8048
|
}
|
|
8010
8049
|
};
|
|
8011
8050
|
|
|
8012
|
-
// src/lending/aave-v2-type/publicCallParse.ts
|
|
8051
|
+
// src/lending/public-data/aave-v2-type/publicCallParse.ts
|
|
8013
8052
|
var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
|
|
8014
8053
|
switch (lender) {
|
|
8015
8054
|
/** AAVE V2 style with rewards from state */
|
|
@@ -8050,7 +8089,9 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
8050
8089
|
const totalDebtUSD = Number(totalVariableDebt) * price;
|
|
8051
8090
|
const collateralActive = configData?.[5 /* usageAsCollateralEnabled */];
|
|
8052
8091
|
const borrowingEnabled = configData?.[6 /* borrowingEnabled */];
|
|
8092
|
+
const marketUid = createMarketUid(chainId, lender, asset);
|
|
8053
8093
|
resultReserves[asset] = {
|
|
8094
|
+
marketUid,
|
|
8054
8095
|
poolId: asset,
|
|
8055
8096
|
underlying: asset,
|
|
8056
8097
|
asset: assetMeta,
|
|
@@ -8111,15 +8152,15 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
8111
8152
|
isActive: configData?.[8 /* isActive */],
|
|
8112
8153
|
isFrozen: configData?.[9 /* isFrozen */]
|
|
8113
8154
|
};
|
|
8114
|
-
const
|
|
8115
|
-
if (!!
|
|
8155
|
+
const aaveTokens2 = aaveTokenMap[asset];
|
|
8156
|
+
if (!!aaveTokens2) {
|
|
8116
8157
|
resultReserves[asset] = {
|
|
8117
8158
|
...resultReserves[asset],
|
|
8118
8159
|
params: {
|
|
8119
8160
|
metadata: {
|
|
8120
|
-
aToken:
|
|
8121
|
-
vToken:
|
|
8122
|
-
sToken:
|
|
8161
|
+
aToken: aaveTokens2.aToken,
|
|
8162
|
+
vToken: aaveTokens2.vToken,
|
|
8163
|
+
sToken: aaveTokens2.sToken
|
|
8123
8164
|
}
|
|
8124
8165
|
}
|
|
8125
8166
|
};
|
|
@@ -8208,7 +8249,9 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
8208
8249
|
const price = prices[toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId)] ?? 0;
|
|
8209
8250
|
const usageAsCollateralEnabled = configData?.[5 /* usageAsCollateralEnabled */];
|
|
8210
8251
|
const borrowingEnabled = configData?.[6 /* borrowingEnabled */];
|
|
8252
|
+
const marketUid = createMarketUid(chainId, lender, asset);
|
|
8211
8253
|
resultReserves[asset] = {
|
|
8254
|
+
marketUid,
|
|
8212
8255
|
poolId: asset,
|
|
8213
8256
|
underlying: asset,
|
|
8214
8257
|
asset: assetMeta,
|
|
@@ -8269,15 +8312,15 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
|
|
|
8269
8312
|
)
|
|
8270
8313
|
)
|
|
8271
8314
|
};
|
|
8272
|
-
const
|
|
8273
|
-
if (!!
|
|
8315
|
+
const aaveTokens2 = aaveTokenMap[asset];
|
|
8316
|
+
if (!!aaveTokens2) {
|
|
8274
8317
|
resultReserves[asset] = {
|
|
8275
8318
|
...resultReserves[asset],
|
|
8276
8319
|
params: {
|
|
8277
8320
|
metadata: {
|
|
8278
|
-
aToken:
|
|
8279
|
-
vToken:
|
|
8280
|
-
sToken:
|
|
8321
|
+
aToken: aaveTokens2.aToken,
|
|
8322
|
+
vToken: aaveTokens2.vToken,
|
|
8323
|
+
sToken: aaveTokens2.sToken
|
|
8281
8324
|
}
|
|
8282
8325
|
}
|
|
8283
8326
|
};
|
|
@@ -8463,15 +8506,15 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
|
|
|
8463
8506
|
isActive: configData?.[7 /* isActive */],
|
|
8464
8507
|
isFrozen: configData?.[8 /* isFrozen */]
|
|
8465
8508
|
};
|
|
8466
|
-
const
|
|
8467
|
-
if (!!
|
|
8509
|
+
const aaveTokens2 = aaveTokenMap[asset];
|
|
8510
|
+
if (!!aaveTokens2) {
|
|
8468
8511
|
resultReserves[asset] = {
|
|
8469
8512
|
...resultReserves[asset],
|
|
8470
8513
|
params: {
|
|
8471
8514
|
metadata: {
|
|
8472
|
-
aToken:
|
|
8473
|
-
vToken:
|
|
8474
|
-
sToken:
|
|
8515
|
+
aToken: aaveTokens2.aToken,
|
|
8516
|
+
vToken: aaveTokens2.vToken,
|
|
8517
|
+
sToken: aaveTokens2.sToken
|
|
8475
8518
|
}
|
|
8476
8519
|
}
|
|
8477
8520
|
};
|
|
@@ -8610,15 +8653,15 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
8610
8653
|
)
|
|
8611
8654
|
)
|
|
8612
8655
|
};
|
|
8613
|
-
const
|
|
8614
|
-
if (!!
|
|
8656
|
+
const aaveTokens2 = aaveTokenMap[asset];
|
|
8657
|
+
if (!!aaveTokens2) {
|
|
8615
8658
|
resultReserves[asset] = {
|
|
8616
8659
|
...resultReserves[asset],
|
|
8617
8660
|
params: {
|
|
8618
8661
|
metadata: {
|
|
8619
|
-
aToken:
|
|
8620
|
-
vToken:
|
|
8621
|
-
sToken:
|
|
8662
|
+
aToken: aaveTokens2.aToken,
|
|
8663
|
+
vToken: aaveTokens2.vToken,
|
|
8664
|
+
sToken: aaveTokens2.sToken
|
|
8622
8665
|
}
|
|
8623
8666
|
}
|
|
8624
8667
|
};
|
|
@@ -8633,7 +8676,7 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
8633
8676
|
];
|
|
8634
8677
|
}
|
|
8635
8678
|
|
|
8636
|
-
// src/lending/init/publicCallParse.ts
|
|
8679
|
+
// src/lending/public-data/init/publicCallParse.ts
|
|
8637
8680
|
var INIT_EMODE_LABELS = {
|
|
8638
8681
|
[1]: "Default",
|
|
8639
8682
|
[2]: "Blue Chip Volatile",
|
|
@@ -8669,8 +8712,11 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
|
|
|
8669
8712
|
const liquidity = Number(totalDeposits) - Number(totalDebt);
|
|
8670
8713
|
const poolId = underlyingToPoolMap.get(asset);
|
|
8671
8714
|
const params = !!poolId ? { metadata: { poolId } } : void 0;
|
|
8715
|
+
if (!poolId) return;
|
|
8716
|
+
const marketUid = createMarketUid(chainId, lender, poolId);
|
|
8672
8717
|
return {
|
|
8673
8718
|
[asset]: {
|
|
8719
|
+
marketUid,
|
|
8674
8720
|
poolId: asset,
|
|
8675
8721
|
underlying: asset,
|
|
8676
8722
|
asset: meta,
|
|
@@ -8750,7 +8796,7 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
|
|
|
8750
8796
|
];
|
|
8751
8797
|
};
|
|
8752
8798
|
|
|
8753
|
-
// src/lending/compound-v3/publicCallParse.ts
|
|
8799
|
+
// src/lending/public-data/compound-v3/publicCallParse.ts
|
|
8754
8800
|
var COMET_RISK_DECIMALS = 18;
|
|
8755
8801
|
var SECONDS_PER_DAY = 3600 * 24;
|
|
8756
8802
|
var DAYS_IN_YEAR = 365;
|
|
@@ -8777,7 +8823,9 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
|
|
|
8777
8823
|
const totals = parseRawAmount(resultsTotals[0], decimals2);
|
|
8778
8824
|
const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
|
|
8779
8825
|
const totalUsd = Number(totals) * (prices[oracleKey] ?? 0);
|
|
8826
|
+
const marketUid = createMarketUid(chainId, lender, asset);
|
|
8780
8827
|
result[asset] = {
|
|
8828
|
+
marketUid,
|
|
8781
8829
|
poolId: asset,
|
|
8782
8830
|
underlying: asset,
|
|
8783
8831
|
asset: assetMeta,
|
|
@@ -8844,8 +8892,10 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
|
|
|
8844
8892
|
const price = prices[oracleKeyBase] ?? 1;
|
|
8845
8893
|
const liquidity = Number(resultsSupply) - Number(resultsBorrow);
|
|
8846
8894
|
const compPrice = prices["COMP"];
|
|
8895
|
+
const baseMarketUid = createMarketUid(chainId, lender, baseAssetData.baseAsset);
|
|
8847
8896
|
const baseData = {
|
|
8848
8897
|
[baseAssetData.baseAsset]: {
|
|
8898
|
+
marketUid: baseMarketUid,
|
|
8849
8899
|
poolId: baseAssetData.baseAsset,
|
|
8850
8900
|
underlying: baseAssetData.baseAsset,
|
|
8851
8901
|
asset: baseMeta,
|
|
@@ -10736,7 +10786,7 @@ var MORPHO_LENS = {
|
|
|
10736
10786
|
[Chain.KATANA]: "0xCe434378adacC51d54312c872113D687Ac19B516",
|
|
10737
10787
|
[Chain.HYPEREVM]: "0x6Bc6aCB905c1216B0119C87Bf9E178ce298310FA",
|
|
10738
10788
|
[Chain.SONEIUM]: "0x4b5458BB47dCBC1a41B31b41e1a8773dE312BE9d",
|
|
10739
|
-
[Chain.ETHEREUM_MAINNET]: "
|
|
10789
|
+
[Chain.ETHEREUM_MAINNET]: "0x5c4f2eacbdc1eb38f839bddd7620e250a36819d4",
|
|
10740
10790
|
[Chain.PLASMA_MAINNET]: "0xcB6Eb8df68153cebF60E1872273Ef52075a5C297",
|
|
10741
10791
|
[Chain.BERACHAIN]: "0x7a59ddbB76521E8982Fa3A08598C9a83b14A6C07",
|
|
10742
10792
|
[Chain.BNB_SMART_CHAIN_MAINNET]: "0x3375B2EF9C4D2c6434d39BBE5234c5101218500d",
|
|
@@ -10876,12 +10926,48 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
|
|
|
10876
10926
|
stakingBorrowApr: safeDivide(stakingBorrowAccrual, debt)
|
|
10877
10927
|
};
|
|
10878
10928
|
const userConfig = { selectedMode: mode, id: account, isWhitelisted };
|
|
10929
|
+
const creditLine = Math.max(
|
|
10930
|
+
0,
|
|
10931
|
+
borrowDiscountedCollateral - balanceData2.adjustedDebt
|
|
10932
|
+
);
|
|
10933
|
+
for (let i = 0; i < assetKeys.length; i++) {
|
|
10934
|
+
const marketUid = assetKeys[i];
|
|
10935
|
+
const pos = payload.lendingPositions["0"][marketUid];
|
|
10936
|
+
if (!pos || !lenderData?.[marketUid]) continue;
|
|
10937
|
+
const { configs, flags, price: priceInfo } = lenderData[marketUid];
|
|
10938
|
+
const config = configs?.[mode];
|
|
10939
|
+
const price = priceInfo?.priceUsd ?? 1;
|
|
10940
|
+
const bcf = config?.borrowCollateralFactor ?? 1;
|
|
10941
|
+
const bf = config?.borrowFactor ?? 1;
|
|
10942
|
+
let withdrawable;
|
|
10943
|
+
if (!pos.collateralEnabled || config?.collateralDisabled) {
|
|
10944
|
+
withdrawable = String(pos.deposits);
|
|
10945
|
+
} else if (balanceData2.debt === 0) {
|
|
10946
|
+
withdrawable = String(pos.deposits);
|
|
10947
|
+
} else {
|
|
10948
|
+
const withdrawableUSD = Math.max(creditLine / bcf, 0);
|
|
10949
|
+
withdrawable = String(
|
|
10950
|
+
Math.min(withdrawableUSD / price, Number(pos.deposits))
|
|
10951
|
+
);
|
|
10952
|
+
}
|
|
10953
|
+
let borrowable;
|
|
10954
|
+
if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
|
|
10955
|
+
borrowable = "0";
|
|
10956
|
+
} else {
|
|
10957
|
+
const borrowableUSD = Math.max(creditLine / bf, 0);
|
|
10958
|
+
borrowable = String(borrowableUSD / price);
|
|
10959
|
+
}
|
|
10960
|
+
pos.withdrawable = withdrawable;
|
|
10961
|
+
pos.borrowable = borrowable;
|
|
10962
|
+
}
|
|
10879
10963
|
return {
|
|
10964
|
+
lender: "",
|
|
10880
10965
|
account,
|
|
10881
10966
|
chainId,
|
|
10882
10967
|
data: [
|
|
10883
10968
|
{
|
|
10884
|
-
health: balanceData2.
|
|
10969
|
+
health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
|
|
10970
|
+
borrowCapacityUSD: creditLine,
|
|
10885
10971
|
accountId: "0",
|
|
10886
10972
|
balanceData: balanceData2,
|
|
10887
10973
|
aprData: aprData2,
|
|
@@ -10900,8 +10986,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
|
|
|
10900
10986
|
let data = [];
|
|
10901
10987
|
for (let j = 0; j < positionKeys.length; j++) {
|
|
10902
10988
|
const posId = positionKeys[j];
|
|
10903
|
-
const
|
|
10904
|
-
const { mode: posMode } = position;
|
|
10989
|
+
const posMode = payload.modes?.[posId];
|
|
10905
10990
|
const mode = posMode ?? LENDER_MODE_NO_MODE;
|
|
10906
10991
|
const userConfig = {
|
|
10907
10992
|
id: posId,
|
|
@@ -10972,9 +11057,39 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
|
|
|
10972
11057
|
stakingBorrowApr: safeDivide(stakingBorrowAccrual, debt),
|
|
10973
11058
|
rewards: {}
|
|
10974
11059
|
};
|
|
11060
|
+
const creditLine = Math.max(0, borrowDiscountedCollateral - adjustedDebt);
|
|
11061
|
+
for (let i = 0; i < marketUids.length; i++) {
|
|
11062
|
+
const marketUid = marketUids[i];
|
|
11063
|
+
const pos = payload.lendingPositions[posId]?.[marketUid];
|
|
11064
|
+
if (!pos || !lenderData?.[marketUid]) continue;
|
|
11065
|
+
const { configs, flags, price: priceInfo } = lenderData[marketUid];
|
|
11066
|
+
const config = configs?.[mode];
|
|
11067
|
+
const price = priceInfo?.priceUsd ?? 1;
|
|
11068
|
+
const bcf = config?.borrowCollateralFactor ?? 1;
|
|
11069
|
+
const bf = config?.borrowFactor ?? 1;
|
|
11070
|
+
let withdrawable;
|
|
11071
|
+
if (!pos.collateralEnabled || config?.collateralDisabled) {
|
|
11072
|
+
withdrawable = String(pos.deposits);
|
|
11073
|
+
} else if (balanceData2.debt === 0) {
|
|
11074
|
+
withdrawable = String(pos.deposits);
|
|
11075
|
+
} else {
|
|
11076
|
+
const withdrawableUSD = Math.max(creditLine / bcf, 0);
|
|
11077
|
+
withdrawable = String(Math.min(withdrawableUSD / price, Number(pos.deposits)));
|
|
11078
|
+
}
|
|
11079
|
+
let borrowable;
|
|
11080
|
+
if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
|
|
11081
|
+
borrowable = "0";
|
|
11082
|
+
} else {
|
|
11083
|
+
const borrowableUSD = Math.max(creditLine / bf, 0);
|
|
11084
|
+
borrowable = String(borrowableUSD / price);
|
|
11085
|
+
}
|
|
11086
|
+
pos.withdrawable = withdrawable;
|
|
11087
|
+
pos.borrowable = borrowable;
|
|
11088
|
+
}
|
|
10975
11089
|
data.push({
|
|
10976
11090
|
accountId: posId,
|
|
10977
|
-
health: balanceData2.
|
|
11091
|
+
health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
|
|
11092
|
+
borrowCapacityUSD: creditLine,
|
|
10978
11093
|
userConfig,
|
|
10979
11094
|
// aggregated balance data
|
|
10980
11095
|
balanceData: balanceData2,
|
|
@@ -10984,6 +11099,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
|
|
|
10984
11099
|
});
|
|
10985
11100
|
}
|
|
10986
11101
|
return {
|
|
11102
|
+
lender: "",
|
|
10987
11103
|
account,
|
|
10988
11104
|
chainId,
|
|
10989
11105
|
data
|
|
@@ -11004,7 +11120,7 @@ function divideAccrualsToAprs(aprs, nav, deposits, debt) {
|
|
|
11004
11120
|
return d;
|
|
11005
11121
|
}
|
|
11006
11122
|
|
|
11007
|
-
// src/lending/morpho/utils/parsers.ts
|
|
11123
|
+
// src/lending/public-data/morpho/utils/parsers.ts
|
|
11008
11124
|
var SECONDS_PER_YEAR3 = 31556952n;
|
|
11009
11125
|
var toFixed = (x, decimals) => new Intl.NumberFormat("en-US", {
|
|
11010
11126
|
style: "decimal",
|
|
@@ -11040,7 +11156,7 @@ function formatNr(n, d) {
|
|
|
11040
11156
|
return Number(formatUnits(BigInt(n ?? 0), d));
|
|
11041
11157
|
}
|
|
11042
11158
|
|
|
11043
|
-
// src/lending/morpho/convertPublic.ts
|
|
11159
|
+
// src/lending/public-data/morpho/convertPublic.ts
|
|
11044
11160
|
function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
|
|
11045
11161
|
intrinsicYields: {},
|
|
11046
11162
|
lenderRewards: {},
|
|
@@ -11066,6 +11182,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
|
|
|
11066
11182
|
const totalDeposits = formatNr(state.supplyAssets, loanAsset.decimals);
|
|
11067
11183
|
const totalDebt = formatNr(state.borrowAssets, loanAsset.decimals);
|
|
11068
11184
|
data[m].data[loanAssetAddress] = {
|
|
11185
|
+
marketUid: createMarketUid(chainId, m, loanAssetAddress),
|
|
11069
11186
|
poolId: loanAssetAddress,
|
|
11070
11187
|
underlying: loanAssetAddress,
|
|
11071
11188
|
asset: meta,
|
|
@@ -11103,6 +11220,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
|
|
|
11103
11220
|
const collateralAssetAddress = collateralAsset.address.toLowerCase();
|
|
11104
11221
|
const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
|
|
11105
11222
|
data[m].data[collateralAssetAddress] = {
|
|
11223
|
+
marketUid: createMarketUid(chainId, m, collateralAssetAddress),
|
|
11106
11224
|
poolId: collateralAssetAddress,
|
|
11107
11225
|
underlying: collateralAssetAddress,
|
|
11108
11226
|
asset: metaCollateral,
|
|
@@ -11161,7 +11279,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
|
|
|
11161
11279
|
return data;
|
|
11162
11280
|
}
|
|
11163
11281
|
|
|
11164
|
-
// src/lending/morpho/fetchPublic.ts
|
|
11282
|
+
// src/lending/public-data/morpho/fetchPublic.ts
|
|
11165
11283
|
var query = (first, skip, chainId) => `
|
|
11166
11284
|
query GetMarkets {
|
|
11167
11285
|
markets(first: ${first}, skip: ${skip}, where: {
|
|
@@ -11268,7 +11386,7 @@ async function fetchMorphoMarkets(chainId) {
|
|
|
11268
11386
|
};
|
|
11269
11387
|
}
|
|
11270
11388
|
|
|
11271
|
-
// src/lending/morpho/utils/evmParser.ts
|
|
11389
|
+
// src/lending/public-data/morpho/utils/evmParser.ts
|
|
11272
11390
|
var FIELD_SIZES = {
|
|
11273
11391
|
addr: 20,
|
|
11274
11392
|
u128: 16,
|
|
@@ -11458,33 +11576,31 @@ function toHex(arr) {
|
|
|
11458
11576
|
}
|
|
11459
11577
|
return s;
|
|
11460
11578
|
}
|
|
11461
|
-
|
|
11462
|
-
|
|
11579
|
+
var { chunk: chunk2 } = lodash;
|
|
11580
|
+
var MARKET_CHUNK_SIZE = 100;
|
|
11463
11581
|
function buildListaCall(chainId, marketsOverride) {
|
|
11464
11582
|
const markets = marketsOverride ?? morphoTypeMarkets().LISTA_DAO?.[chainId] ?? [];
|
|
11465
11583
|
const mb = morphoPools()?.LISTA_DAO?.[chainId];
|
|
11466
11584
|
if (!mb || markets.length === 0) return [];
|
|
11467
|
-
|
|
11468
|
-
|
|
11469
|
-
|
|
11470
|
-
|
|
11471
|
-
|
|
11472
|
-
|
|
11473
|
-
];
|
|
11585
|
+
const marketChunks = chunk2(markets, MARKET_CHUNK_SIZE);
|
|
11586
|
+
return marketChunks.map((marketGroup) => ({
|
|
11587
|
+
address: MORPHO_LENS[chainId],
|
|
11588
|
+
name: "getListaMarketDataCompact",
|
|
11589
|
+
params: [mb, marketGroup]
|
|
11590
|
+
}));
|
|
11474
11591
|
}
|
|
11475
|
-
|
|
11476
|
-
|
|
11592
|
+
var { chunk: chunk3 } = lodash;
|
|
11593
|
+
var MARKET_CHUNK_SIZE2 = 50;
|
|
11477
11594
|
function buildMorphoCall(chainId, marketsOverride) {
|
|
11478
11595
|
const markets = marketsOverride ?? morphoTypeMarkets()?.MORPHO_BLUE?.[chainId] ?? [];
|
|
11479
11596
|
const mb = morphoPools()?.MORPHO_BLUE?.[chainId];
|
|
11480
11597
|
if (!mb || markets.length === 0) return [];
|
|
11481
|
-
|
|
11482
|
-
|
|
11483
|
-
|
|
11484
|
-
|
|
11485
|
-
|
|
11486
|
-
|
|
11487
|
-
];
|
|
11598
|
+
const marketChunks = chunk3(markets, MARKET_CHUNK_SIZE2);
|
|
11599
|
+
return marketChunks.map((marketGroup) => ({
|
|
11600
|
+
address: MORPHO_LENS[chainId],
|
|
11601
|
+
name: "getMarketDataCompact",
|
|
11602
|
+
params: [mb, marketGroup]
|
|
11603
|
+
}));
|
|
11488
11604
|
}
|
|
11489
11605
|
function buildMorphoTypeCall(chainId, lender, marketsOVerride) {
|
|
11490
11606
|
if (lender.startsWith("LISTA_DAO"))
|
|
@@ -11492,7 +11608,7 @@ function buildMorphoTypeCall(chainId, lender, marketsOVerride) {
|
|
|
11492
11608
|
return buildMorphoCall(chainId, marketsOVerride);
|
|
11493
11609
|
}
|
|
11494
11610
|
|
|
11495
|
-
// src/lending/morpho/utils/mathLib.ts
|
|
11611
|
+
// src/lending/public-data/morpho/utils/mathLib.ts
|
|
11496
11612
|
var MathLib;
|
|
11497
11613
|
((MathLib2) => {
|
|
11498
11614
|
MathLib2.WAD = 1000000000000000000n;
|
|
@@ -11706,7 +11822,7 @@ var MathLib;
|
|
|
11706
11822
|
MathLib2._getBorrowRate = _getBorrowRate;
|
|
11707
11823
|
})(MathLib || (MathLib = {}));
|
|
11708
11824
|
|
|
11709
|
-
// src/lending/morpho/getMarketsFromChain.ts
|
|
11825
|
+
// src/lending/public-data/morpho/getMarketsFromChain.ts
|
|
11710
11826
|
function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields = {
|
|
11711
11827
|
intrinsicYields: {},
|
|
11712
11828
|
lenderRewards: {},
|
|
@@ -11715,7 +11831,11 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11715
11831
|
const markets = marketsOverride ?? morphoTypeMarkets()?.MORPHO_BLUE?.[chainId] ?? [];
|
|
11716
11832
|
return [
|
|
11717
11833
|
(rData) => {
|
|
11718
|
-
|
|
11834
|
+
let decoded = [];
|
|
11835
|
+
for (let j = 0; j < rData.length; j++) {
|
|
11836
|
+
const chunkDecoded = decodeMarkets(rData[j] ?? "0x");
|
|
11837
|
+
decoded.push(...chunkDecoded);
|
|
11838
|
+
}
|
|
11719
11839
|
const data = {};
|
|
11720
11840
|
decoded.forEach((market, i) => {
|
|
11721
11841
|
const uniqueKey = markets[i];
|
|
@@ -11726,30 +11846,29 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11726
11846
|
const loanRewards = {};
|
|
11727
11847
|
const loanAsset = tokens[loanToken.toLowerCase()];
|
|
11728
11848
|
const collateralAsset = tokens[collateralToken.toLowerCase()];
|
|
11729
|
-
const
|
|
11849
|
+
const loanDecimals = loanAsset?.decimals ?? 18;
|
|
11850
|
+
const collateralDecimals = collateralAsset?.decimals ?? 18;
|
|
11851
|
+
const loanKey = toOracleKey(loanAsset?.assetGroup) ?? toGenericPriceKey(loanAsset?.address ?? loanToken, chainId);
|
|
11730
11852
|
let loanPrice = prices[loanKey];
|
|
11731
11853
|
if (!loanPrice) {
|
|
11732
|
-
const collateralKey = toOracleKey(collateralAsset?.assetGroup) ?? toGenericPriceKey(
|
|
11854
|
+
const collateralKey = toOracleKey(collateralAsset?.assetGroup) ?? toGenericPriceKey(
|
|
11855
|
+
collateralAsset?.address ?? collateralToken,
|
|
11856
|
+
chainId
|
|
11857
|
+
);
|
|
11733
11858
|
const collateralPrice = prices[collateralKey];
|
|
11734
11859
|
if (collateralPrice) {
|
|
11735
11860
|
const priceDebtToCollateral = formatMorphoPrice(
|
|
11736
11861
|
state.price.toString(),
|
|
11737
|
-
|
|
11738
|
-
|
|
11862
|
+
loanDecimals,
|
|
11863
|
+
collateralDecimals
|
|
11739
11864
|
);
|
|
11740
11865
|
loanPrice = collateralPrice / priceDebtToCollateral;
|
|
11741
11866
|
}
|
|
11742
11867
|
}
|
|
11743
|
-
const loanTokenAddress = loanAsset?.address.toLowerCase();
|
|
11868
|
+
const loanTokenAddress = (loanAsset?.address ?? loanToken).toLowerCase();
|
|
11744
11869
|
const meta = tokens[loanTokenAddress] ?? loanAsset;
|
|
11745
|
-
const totalDeposits = formatNr(
|
|
11746
|
-
|
|
11747
|
-
loanAsset.decimals
|
|
11748
|
-
);
|
|
11749
|
-
const totalDebt = formatNr(
|
|
11750
|
-
state.totalBorrowAssets,
|
|
11751
|
-
loanAsset.decimals
|
|
11752
|
-
);
|
|
11870
|
+
const totalDeposits = formatNr(state.totalSupplyAssets, loanDecimals);
|
|
11871
|
+
const totalDebt = formatNr(state.totalBorrowAssets, loanDecimals);
|
|
11753
11872
|
const utilization = MathLib.getUtilization({
|
|
11754
11873
|
totalBorrowAssets: state.totalBorrowAssets,
|
|
11755
11874
|
totalSupplyAssets: state.totalSupplyAssets
|
|
@@ -11769,6 +11888,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11769
11888
|
const borrowApr = apyToApr2(Number(formatEther(borrowApy))) * 100;
|
|
11770
11889
|
const depositApr = apyToApr2(Number(formatEther(supplyApy))) * 100;
|
|
11771
11890
|
data[m].data[loanTokenAddress] = {
|
|
11891
|
+
marketUid: createMarketUid(chainId, m, loanTokenAddress),
|
|
11772
11892
|
poolId: loanTokenAddress,
|
|
11773
11893
|
underlying: loanTokenAddress,
|
|
11774
11894
|
asset: meta,
|
|
@@ -11785,7 +11905,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11785
11905
|
stableBorrowRate: 0,
|
|
11786
11906
|
stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
|
|
11787
11907
|
rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
|
|
11788
|
-
decimals:
|
|
11908
|
+
decimals: loanDecimals,
|
|
11789
11909
|
config: {
|
|
11790
11910
|
0: {
|
|
11791
11911
|
category: 0,
|
|
@@ -11803,9 +11923,10 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11803
11923
|
isFrozen: false
|
|
11804
11924
|
};
|
|
11805
11925
|
const ltv = parseLtv(lltv);
|
|
11806
|
-
const collateralAssetAddress = collateralAsset?.address.toLowerCase();
|
|
11926
|
+
const collateralAssetAddress = (collateralAsset?.address ?? collateralToken).toLowerCase();
|
|
11807
11927
|
const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
|
|
11808
11928
|
data[m].data[collateralAssetAddress] = {
|
|
11929
|
+
marketUid: createMarketUid(chainId, m, collateralAssetAddress),
|
|
11809
11930
|
poolId: collateralAssetAddress,
|
|
11810
11931
|
underlying: collateralAssetAddress,
|
|
11811
11932
|
asset: metaCollateral,
|
|
@@ -11823,7 +11944,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11823
11944
|
stableBorrowRate: 0,
|
|
11824
11945
|
stakingYield: additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
|
|
11825
11946
|
rewards: void 0,
|
|
11826
|
-
decimals:
|
|
11947
|
+
decimals: collateralDecimals,
|
|
11827
11948
|
config: {
|
|
11828
11949
|
0: {
|
|
11829
11950
|
category: 0,
|
|
@@ -11843,8 +11964,8 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11843
11964
|
data[m].params = {
|
|
11844
11965
|
market: {
|
|
11845
11966
|
lender: m,
|
|
11846
|
-
collateralDecimals
|
|
11847
|
-
loanDecimals
|
|
11967
|
+
collateralDecimals,
|
|
11968
|
+
loanDecimals,
|
|
11848
11969
|
id: uniqueKey,
|
|
11849
11970
|
lltv: lltv.toString(),
|
|
11850
11971
|
oracle,
|
|
@@ -11858,11 +11979,11 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
|
|
|
11858
11979
|
});
|
|
11859
11980
|
return data;
|
|
11860
11981
|
},
|
|
11861
|
-
markets.length > 0 ?
|
|
11982
|
+
markets.length > 0 ? Math.ceil(markets.length / MARKET_CHUNK_SIZE2) : 0
|
|
11862
11983
|
];
|
|
11863
11984
|
}
|
|
11864
11985
|
|
|
11865
|
-
// src/lending/lista/getMarketsFromChain.ts
|
|
11986
|
+
// src/lending/public-data/lista/getMarketsFromChain.ts
|
|
11866
11987
|
function getListaMarketDataConverter(lender, chainId, prices, additionalYields = {
|
|
11867
11988
|
intrinsicYields: {},
|
|
11868
11989
|
lenderRewards: {},
|
|
@@ -11871,7 +11992,11 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
|
|
|
11871
11992
|
const markets = marketsOverride ?? morphoTypeMarkets()?.LISTA_DAO?.[chainId] ?? [];
|
|
11872
11993
|
return [
|
|
11873
11994
|
(rData) => {
|
|
11874
|
-
|
|
11995
|
+
let decoded = [];
|
|
11996
|
+
for (let j = 0; j < rData.length; j++) {
|
|
11997
|
+
const chunkDecoded = decodeMarkets(rData[j] ?? "0x");
|
|
11998
|
+
decoded.push(...chunkDecoded);
|
|
11999
|
+
}
|
|
11875
12000
|
const data = {};
|
|
11876
12001
|
decoded.forEach((market, i) => {
|
|
11877
12002
|
const uniqueKey = markets[i];
|
|
@@ -11934,6 +12059,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
|
|
|
11934
12059
|
const borrowApr = apyToApr2(Number(formatEther(borrowApy))) * 100;
|
|
11935
12060
|
const depositApr = apyToApr2(Number(formatEther(supplyApy))) * 100;
|
|
11936
12061
|
data[m].data[loanTokenAddress] = {
|
|
12062
|
+
marketUid: createMarketUid(chainId, m, loanTokenAddress),
|
|
11937
12063
|
poolId: loanTokenAddress,
|
|
11938
12064
|
underlying: loanTokenAddress,
|
|
11939
12065
|
asset: meta,
|
|
@@ -11950,7 +12076,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
|
|
|
11950
12076
|
stableBorrowRate: 0,
|
|
11951
12077
|
stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
|
|
11952
12078
|
rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
|
|
11953
|
-
decimals:
|
|
12079
|
+
decimals: loanDecimals,
|
|
11954
12080
|
config: {
|
|
11955
12081
|
0: {
|
|
11956
12082
|
category: 0,
|
|
@@ -11970,6 +12096,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
|
|
|
11970
12096
|
const ltv = parseLtv(lltv);
|
|
11971
12097
|
const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
|
|
11972
12098
|
data[m].data[collateralAssetAddress] = {
|
|
12099
|
+
marketUid: createMarketUid(chainId, m, collateralAssetAddress),
|
|
11973
12100
|
poolId: collateralAssetAddress,
|
|
11974
12101
|
underlying: collateralAssetAddress,
|
|
11975
12102
|
asset: metaCollateral,
|
|
@@ -12027,7 +12154,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
|
|
|
12027
12154
|
});
|
|
12028
12155
|
return data;
|
|
12029
12156
|
},
|
|
12030
|
-
markets.length > 0 ?
|
|
12157
|
+
markets.length > 0 ? Math.ceil(markets.length / MARKET_CHUNK_SIZE2) : 0
|
|
12031
12158
|
];
|
|
12032
12159
|
}
|
|
12033
12160
|
|
|
@@ -12340,7 +12467,7 @@ var VenusLensLegacyAbi = [
|
|
|
12340
12467
|
}
|
|
12341
12468
|
];
|
|
12342
12469
|
|
|
12343
|
-
// src/lending/compound-v2/publicCallBuild.ts
|
|
12470
|
+
// src/lending/public-data/compound-v2/publicCallBuild.ts
|
|
12344
12471
|
var buildCompoundV2StyleLenderReserveCall = (chainId, lender) => {
|
|
12345
12472
|
const collateralTokens = getCompoundV2CollateralTokens(chainId, lender);
|
|
12346
12473
|
const getCTokenCall = getCall(lender, chainId);
|
|
@@ -12375,7 +12502,7 @@ function getCall(lender, chainId) {
|
|
|
12375
12502
|
});
|
|
12376
12503
|
}
|
|
12377
12504
|
|
|
12378
|
-
// src/lending/compound-v2/getters/types.ts
|
|
12505
|
+
// src/lending/public-data/compound-v2/getters/types.ts
|
|
12379
12506
|
var CAction = /* @__PURE__ */ ((CAction2) => {
|
|
12380
12507
|
CAction2[CAction2["MINT"] = 0] = "MINT";
|
|
12381
12508
|
CAction2[CAction2["REDEEM"] = 1] = "REDEEM";
|
|
@@ -12389,7 +12516,7 @@ var CAction = /* @__PURE__ */ ((CAction2) => {
|
|
|
12389
12516
|
return CAction2;
|
|
12390
12517
|
})(CAction || {});
|
|
12391
12518
|
|
|
12392
|
-
// src/lending/compound-v2/getters/venus.ts
|
|
12519
|
+
// src/lending/public-data/compound-v2/getters/venus.ts
|
|
12393
12520
|
function readVTokenMetadata(meta, token) {
|
|
12394
12521
|
const pick = (...values) => values.find((v) => v !== void 0);
|
|
12395
12522
|
return {
|
|
@@ -12452,7 +12579,7 @@ function decodePausedActions(bitmap) {
|
|
|
12452
12579
|
return result;
|
|
12453
12580
|
}
|
|
12454
12581
|
|
|
12455
|
-
// src/lending/compound-v2/getters/moonwell.ts
|
|
12582
|
+
// src/lending/public-data/compound-v2/getters/moonwell.ts
|
|
12456
12583
|
function toBigInt(value) {
|
|
12457
12584
|
if (typeof value === "bigint") return value;
|
|
12458
12585
|
if (typeof value === "number") return BigInt(value);
|
|
@@ -12545,7 +12672,7 @@ function parseMoonwellMarket(input, token) {
|
|
|
12545
12672
|
};
|
|
12546
12673
|
}
|
|
12547
12674
|
|
|
12548
|
-
// src/lending/compound-v2/publicCallParse.ts
|
|
12675
|
+
// src/lending/public-data/compound-v2/publicCallParse.ts
|
|
12549
12676
|
var PRICE_DECIMALS = 18;
|
|
12550
12677
|
var RESERVE_MANTISSA_DECIMALS = 18;
|
|
12551
12678
|
function convertSingleEntry(opts) {
|
|
@@ -12553,6 +12680,8 @@ function convertSingleEntry(opts) {
|
|
|
12553
12680
|
entryRaw,
|
|
12554
12681
|
reader,
|
|
12555
12682
|
asset,
|
|
12683
|
+
chainId,
|
|
12684
|
+
lender,
|
|
12556
12685
|
prices,
|
|
12557
12686
|
additionalYields,
|
|
12558
12687
|
cToken
|
|
@@ -12579,7 +12708,9 @@ function convertSingleEntry(opts) {
|
|
|
12579
12708
|
const poolId = asset.address;
|
|
12580
12709
|
const collateralActive = Boolean(currentEntry?.isListed);
|
|
12581
12710
|
const borrowingEnabled = Boolean(currentEntry?.isBorrowAllowed) && !pausedActions[2 /* BORROW */];
|
|
12711
|
+
const marketUid = createMarketUid(chainId, lender, cToken);
|
|
12582
12712
|
return {
|
|
12713
|
+
marketUid,
|
|
12583
12714
|
poolId,
|
|
12584
12715
|
asset,
|
|
12585
12716
|
// interest rates (use lender passed-in, not hardcoded)
|
|
@@ -12637,6 +12768,7 @@ var getCompoundV2DataConverter = (lender, chainId, prices, additionalYields, tok
|
|
|
12637
12768
|
const out = { data: {}, chainId };
|
|
12638
12769
|
for (let i = 0; i < compoundV2Tokens2.length; i++) {
|
|
12639
12770
|
const { underlying, cToken } = compoundV2Tokens2[i];
|
|
12771
|
+
if (!cToken || !underlying) continue;
|
|
12640
12772
|
const poolId = underlying;
|
|
12641
12773
|
const asset = tokenList[poolId];
|
|
12642
12774
|
const entryRaw = data[i];
|
|
@@ -12644,6 +12776,8 @@ var getCompoundV2DataConverter = (lender, chainId, prices, additionalYields, tok
|
|
|
12644
12776
|
entryRaw,
|
|
12645
12777
|
reader,
|
|
12646
12778
|
asset,
|
|
12779
|
+
chainId,
|
|
12780
|
+
lender,
|
|
12647
12781
|
prices,
|
|
12648
12782
|
additionalYields,
|
|
12649
12783
|
cToken
|
|
@@ -13476,7 +13610,7 @@ var VenusLensAbi = [
|
|
|
13476
13610
|
}
|
|
13477
13611
|
];
|
|
13478
13612
|
|
|
13479
|
-
// src/lending/fetchLender.ts
|
|
13613
|
+
// src/lending/public-data/fetchLender.ts
|
|
13480
13614
|
function getMorphoTypeMarketConverter(lender, chainId, prices, additionalYields, tokenList = {}, marketsOverride) {
|
|
13481
13615
|
if (lender.startsWith("LISTA_DAO"))
|
|
13482
13616
|
return getListaMarketDataConverter(
|
|
@@ -13641,7 +13775,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
|
|
|
13641
13775
|
return lenderData;
|
|
13642
13776
|
};
|
|
13643
13777
|
|
|
13644
|
-
// src/lending/fetchLenderExt.ts
|
|
13778
|
+
// src/lending/public-data/fetchLenderExt.ts
|
|
13645
13779
|
async function getLenderDataFromApi(lender, chainId, prices, additionalYields) {
|
|
13646
13780
|
if (isMorphoType(lender)) return await fetchMorphoMarkets(chainId);
|
|
13647
13781
|
return {};
|
|
@@ -13806,9 +13940,9 @@ var MULTICALL_ADDRESS = {
|
|
|
13806
13940
|
// src/utils/multicall.ts
|
|
13807
13941
|
var { isArray } = lodash;
|
|
13808
13942
|
var maxRetries = 3;
|
|
13809
|
-
var multicallViemAbiArray = async (chainId, abi, calls,
|
|
13943
|
+
var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient3, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
|
|
13810
13944
|
try {
|
|
13811
|
-
const provider =
|
|
13945
|
+
const provider = getEvmClient3(chainId, providerId);
|
|
13812
13946
|
const abiIsArray = isArray(abi[0]);
|
|
13813
13947
|
const returnData = await provider.multicall({
|
|
13814
13948
|
allowFailure,
|
|
@@ -13834,7 +13968,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient2, retry = t
|
|
|
13834
13968
|
chainId,
|
|
13835
13969
|
abi,
|
|
13836
13970
|
calls,
|
|
13837
|
-
|
|
13971
|
+
getEvmClient3,
|
|
13838
13972
|
retry,
|
|
13839
13973
|
providerId,
|
|
13840
13974
|
retries,
|
|
@@ -18533,27 +18667,20 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
|
|
|
18533
18667
|
}
|
|
18534
18668
|
const assetMeta = meta.asset;
|
|
18535
18669
|
const decimals = assetMeta?.decimals ?? 18;
|
|
18536
|
-
const currentATokenBalance =
|
|
18537
|
-
|
|
18538
|
-
);
|
|
18539
|
-
const currentStableDebt = Number(
|
|
18540
|
-
parseRawAmount(currentStableDebtRaw, decimals)
|
|
18541
|
-
);
|
|
18542
|
-
const currentVariableDebt = Number(
|
|
18543
|
-
parseRawAmount(currentVariableDebtRaw, decimals)
|
|
18544
|
-
);
|
|
18670
|
+
const currentATokenBalance = parseRawAmount(currentATokenBalanceRaw, decimals);
|
|
18671
|
+
const currentStableDebt = parseRawAmount(currentStableDebtRaw, decimals);
|
|
18672
|
+
const currentVariableDebt = parseRawAmount(currentVariableDebtRaw, decimals);
|
|
18545
18673
|
const price = meta?.price?.priceUsd ?? 1;
|
|
18546
18674
|
const priceHist = meta?.price?.priceUsd24h ?? price;
|
|
18547
18675
|
const dataForAsset = {
|
|
18548
|
-
|
|
18676
|
+
marketUid: key,
|
|
18549
18677
|
underlying: assetMeta.address,
|
|
18550
18678
|
deposits: currentATokenBalance,
|
|
18551
|
-
depositsRaw: currentATokenBalanceRaw,
|
|
18552
18679
|
debtStable: currentStableDebt,
|
|
18553
18680
|
debt: currentVariableDebt,
|
|
18554
|
-
depositsUSD: currentATokenBalance * price,
|
|
18555
|
-
debtStableUSD: currentStableDebt * price,
|
|
18556
|
-
debtUSD: currentVariableDebt * price,
|
|
18681
|
+
depositsUSD: Number(currentATokenBalance) * price,
|
|
18682
|
+
debtStableUSD: Number(currentStableDebt) * price,
|
|
18683
|
+
debtUSD: Number(currentVariableDebt) * price,
|
|
18557
18684
|
stableBorrowRate: reserveData[5 /* stableBorrowRate */]?.toString(),
|
|
18558
18685
|
collateralEnabled: Boolean(
|
|
18559
18686
|
reserveData[8 /* usageAsCollateralEnabled */]
|
|
@@ -18562,8 +18689,8 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
|
|
|
18562
18689
|
};
|
|
18563
18690
|
return {
|
|
18564
18691
|
dataForAsset,
|
|
18565
|
-
addedDeposits: currentATokenBalance * priceHist,
|
|
18566
|
-
addedDebt: (currentVariableDebt + currentStableDebt) * priceHist
|
|
18692
|
+
addedDeposits: Number(currentATokenBalance) * priceHist,
|
|
18693
|
+
addedDebt: (Number(currentVariableDebt) + Number(currentStableDebt)) * priceHist
|
|
18567
18694
|
};
|
|
18568
18695
|
}
|
|
18569
18696
|
|
|
@@ -18635,10 +18762,9 @@ function createAaveV3Entry(i, data, key, meta) {
|
|
|
18635
18762
|
const price = meta?.price?.priceUsd ?? 1;
|
|
18636
18763
|
const priceHist = meta?.price?.priceUsd24h ?? price;
|
|
18637
18764
|
const dataForAsset = {
|
|
18638
|
-
|
|
18765
|
+
marketUid: key,
|
|
18639
18766
|
underlying: assetMeta.address,
|
|
18640
18767
|
deposits: currentATokenBalance,
|
|
18641
|
-
depositsRaw: currentATokenBalanceRaw,
|
|
18642
18768
|
debtStable: currentStableDebt,
|
|
18643
18769
|
debt: currentVariableDebt,
|
|
18644
18770
|
depositsUSD: Number(currentATokenBalance) * price,
|
|
@@ -18672,6 +18798,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18672
18798
|
return { e, i };
|
|
18673
18799
|
}).filter((a) => a.e.owner.toLowerCase() === validOwner).map((a) => a.i);
|
|
18674
18800
|
let histData = {};
|
|
18801
|
+
const modes = {};
|
|
18675
18802
|
let allPools = {};
|
|
18676
18803
|
const result = Object.assign(
|
|
18677
18804
|
{},
|
|
@@ -18679,6 +18806,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18679
18806
|
const entry = data[0 /* posMeta */][index];
|
|
18680
18807
|
const mode = entry.mode;
|
|
18681
18808
|
const id = entry.posId.toString();
|
|
18809
|
+
modes[id] = mode;
|
|
18682
18810
|
const collatData = Object.assign(
|
|
18683
18811
|
{},
|
|
18684
18812
|
...data[1 /* collaterals */][index].map(
|
|
@@ -18691,8 +18819,7 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18691
18819
|
const depositsRaw = c.amount.toString();
|
|
18692
18820
|
return {
|
|
18693
18821
|
[pool]: {
|
|
18694
|
-
deposits: parseRawAmount(depositsRaw, decimals)
|
|
18695
|
-
depositsRaw
|
|
18822
|
+
deposits: parseRawAmount(depositsRaw, decimals)
|
|
18696
18823
|
}
|
|
18697
18824
|
};
|
|
18698
18825
|
}
|
|
@@ -18716,51 +18843,47 @@ var getInitUserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18716
18843
|
)
|
|
18717
18844
|
);
|
|
18718
18845
|
return {
|
|
18719
|
-
[id]:
|
|
18720
|
-
|
|
18721
|
-
...Object.
|
|
18722
|
-
{
|
|
18723
|
-
|
|
18724
|
-
|
|
18725
|
-
|
|
18726
|
-
|
|
18727
|
-
|
|
18728
|
-
|
|
18729
|
-
|
|
18730
|
-
|
|
18731
|
-
totalDebt24h: 0,
|
|
18732
|
-
totalDeposits24h: 0
|
|
18733
|
-
};
|
|
18734
|
-
const debt = debtData[pool]?.debt ?? 0;
|
|
18735
|
-
const deposits = collatData[pool]?.deposits ?? 0;
|
|
18736
|
-
const depositsRaw = collatData[pool]?.depositsRaw ?? "0";
|
|
18737
|
-
histData[id].totalDebt24h += Number(debt) * priceHist;
|
|
18738
|
-
histData[id].totalDeposits24h += Number(deposits) * priceHist;
|
|
18739
|
-
return {
|
|
18740
|
-
[key]: {
|
|
18741
|
-
poolId: key,
|
|
18742
|
-
underlying,
|
|
18743
|
-
deposits,
|
|
18744
|
-
depositsRaw,
|
|
18745
|
-
debt,
|
|
18746
|
-
debtStable: "0",
|
|
18747
|
-
debtStableUSD: 0,
|
|
18748
|
-
depositsUSD: price * Number(deposits),
|
|
18749
|
-
debtUSD: price * Number(debt),
|
|
18750
|
-
collateralEnabled: true,
|
|
18751
|
-
isAllowed: entry.approved.toLowerCase() === brokerAddress.toLowerCase()
|
|
18752
|
-
}
|
|
18846
|
+
[id]: Object.assign(
|
|
18847
|
+
{},
|
|
18848
|
+
...Object.entries(allPools).map(
|
|
18849
|
+
([pool, underlying]) => {
|
|
18850
|
+
const key = createMarketUid(chainId, lender, pool);
|
|
18851
|
+
const metaEntity = metaMap?.[key];
|
|
18852
|
+
const price = metaEntity?.price?.priceUsd ?? 1;
|
|
18853
|
+
const priceHist = metaEntity?.price?.priceUsd24h ?? price;
|
|
18854
|
+
if (!histData[id])
|
|
18855
|
+
histData[id] = {
|
|
18856
|
+
totalDebt24h: 0,
|
|
18857
|
+
totalDeposits24h: 0
|
|
18753
18858
|
};
|
|
18754
|
-
|
|
18755
|
-
|
|
18859
|
+
const debt = debtData[pool]?.debt ?? 0;
|
|
18860
|
+
const deposits = collatData[pool]?.deposits ?? 0;
|
|
18861
|
+
histData[id].totalDebt24h += Number(debt) * priceHist;
|
|
18862
|
+
histData[id].totalDeposits24h += Number(deposits) * priceHist;
|
|
18863
|
+
return {
|
|
18864
|
+
[key]: {
|
|
18865
|
+
marketUid: key,
|
|
18866
|
+
underlying,
|
|
18867
|
+
deposits,
|
|
18868
|
+
debt,
|
|
18869
|
+
debtStable: "0",
|
|
18870
|
+
debtStableUSD: 0,
|
|
18871
|
+
depositsUSD: price * Number(deposits),
|
|
18872
|
+
debtUSD: price * Number(debt),
|
|
18873
|
+
collateralEnabled: true,
|
|
18874
|
+
isAllowed: entry.approved.toLowerCase() === brokerAddress.toLowerCase()
|
|
18875
|
+
}
|
|
18876
|
+
};
|
|
18877
|
+
}
|
|
18756
18878
|
)
|
|
18757
|
-
|
|
18879
|
+
)
|
|
18758
18880
|
};
|
|
18759
18881
|
})
|
|
18760
18882
|
);
|
|
18761
18883
|
const payload = {
|
|
18762
18884
|
chainId,
|
|
18763
18885
|
lendingPositions: result,
|
|
18886
|
+
modes,
|
|
18764
18887
|
account
|
|
18765
18888
|
};
|
|
18766
18889
|
const userState = createMultiAccountTypeUserState(
|
|
@@ -18803,7 +18926,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18803
18926
|
const priceHist2 = metaEntity2?.price?.priceUsd24h ?? price2;
|
|
18804
18927
|
totalDeposits24h += Number(deposits2) * priceHist2;
|
|
18805
18928
|
result[key2] = {
|
|
18806
|
-
|
|
18929
|
+
marketUid: key2,
|
|
18807
18930
|
underlying: asset,
|
|
18808
18931
|
deposits: deposits2,
|
|
18809
18932
|
depositsUSD: Number(deposits2) * price2,
|
|
@@ -18811,10 +18934,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18811
18934
|
debt: "0",
|
|
18812
18935
|
debtStable: "0",
|
|
18813
18936
|
debtUSD: 0,
|
|
18814
|
-
collateralEnabled: true
|
|
18815
|
-
// user depos raw
|
|
18816
|
-
depositsRaw: depositsRaw2
|
|
18817
|
-
// flag for allowance
|
|
18937
|
+
collateralEnabled: true
|
|
18818
18938
|
};
|
|
18819
18939
|
}
|
|
18820
18940
|
const depositsRaw = data[assetsNoBase.length]?.toString();
|
|
@@ -18831,7 +18951,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18831
18951
|
totalDeposits24h += Number(deposits) * priceHist;
|
|
18832
18952
|
const resultBase = depositsRaw === "0" && debtRaw === "0" ? {} : {
|
|
18833
18953
|
[key]: {
|
|
18834
|
-
|
|
18954
|
+
marketUid: key,
|
|
18835
18955
|
underlying: baseAsset,
|
|
18836
18956
|
deposits,
|
|
18837
18957
|
debt,
|
|
@@ -18840,10 +18960,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
|
|
|
18840
18960
|
// populate values for totals
|
|
18841
18961
|
debtStable: "0",
|
|
18842
18962
|
debtStableUSD: 0,
|
|
18843
|
-
collateralEnabled: false
|
|
18844
|
-
// user depos raw
|
|
18845
|
-
depositsRaw
|
|
18846
|
-
// flag for allowance
|
|
18963
|
+
collateralEnabled: false
|
|
18847
18964
|
}
|
|
18848
18965
|
};
|
|
18849
18966
|
const earnedBalances = data[expectedNumberOfCalls - 1];
|
|
@@ -18938,10 +19055,9 @@ function createAaveV3Entry2(i, data, key, meta) {
|
|
|
18938
19055
|
const price = meta?.price?.priceUsd ?? 1;
|
|
18939
19056
|
const priceHist = meta?.price?.priceUsd24h ?? price;
|
|
18940
19057
|
const dataForAsset = {
|
|
18941
|
-
|
|
19058
|
+
marketUid: key,
|
|
18942
19059
|
underlying: assetMeta.address,
|
|
18943
19060
|
deposits: currentATokenBalance,
|
|
18944
|
-
depositsRaw: currentATokenBalanceRaw,
|
|
18945
19061
|
debtStable: "0",
|
|
18946
19062
|
debt: currentVariableDebt,
|
|
18947
19063
|
depositsUSD: Number(currentATokenBalance) * price,
|
|
@@ -19122,7 +19238,9 @@ var getMorphoUserDataConverterWithlens = (lender, chainId, account, markets, met
|
|
|
19122
19238
|
const lenderKey = createLenderKey(lender, marketId);
|
|
19123
19239
|
const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(
|
|
19124
19240
|
balanceData2,
|
|
19125
|
-
metaMap?.[lenderKey]
|
|
19241
|
+
metaMap?.[lenderKey],
|
|
19242
|
+
chainId,
|
|
19243
|
+
lenderKey
|
|
19126
19244
|
);
|
|
19127
19245
|
const payload = {
|
|
19128
19246
|
chainId,
|
|
@@ -19177,7 +19295,9 @@ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, meta
|
|
|
19177
19295
|
const lenderKey = createLenderKey(lender, marketId);
|
|
19178
19296
|
const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(
|
|
19179
19297
|
balanceData2,
|
|
19180
|
-
metaMap?.[lenderKey]
|
|
19298
|
+
metaMap?.[lenderKey],
|
|
19299
|
+
chainId,
|
|
19300
|
+
lenderKey
|
|
19181
19301
|
);
|
|
19182
19302
|
const payload = {
|
|
19183
19303
|
chainId,
|
|
@@ -19214,13 +19334,22 @@ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, meta
|
|
|
19214
19334
|
expectedNumberOfCalls
|
|
19215
19335
|
];
|
|
19216
19336
|
};
|
|
19217
|
-
function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
|
|
19337
|
+
function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lenderKey) {
|
|
19218
19338
|
const morphoPair = metaMap;
|
|
19219
19339
|
const _assets = Object.entries(
|
|
19220
19340
|
morphoPair ?? {}
|
|
19221
19341
|
);
|
|
19222
|
-
const [
|
|
19223
|
-
const [
|
|
19342
|
+
const loanEntry = _assets.find(([, meta]) => meta?.flags?.borrowingEnabled);
|
|
19343
|
+
const collateralEntry = _assets.find(([, meta]) => !meta?.flags?.borrowingEnabled);
|
|
19344
|
+
if (!loanEntry || !collateralEntry) {
|
|
19345
|
+
return {
|
|
19346
|
+
dataForMarket: {},
|
|
19347
|
+
addedDeposits: 0,
|
|
19348
|
+
addedDebt: 0
|
|
19349
|
+
};
|
|
19350
|
+
}
|
|
19351
|
+
const [loanKey, loanAssetMeta] = loanEntry;
|
|
19352
|
+
const [collateralKey, collateralAssetMeta] = collateralEntry;
|
|
19224
19353
|
const loanAddress = loanAssetMeta?.asset?.address?.toLowerCase();
|
|
19225
19354
|
const loanAsset = loanAssetMeta?.asset;
|
|
19226
19355
|
const priceLoan = loanAssetMeta?.price?.priceUsd ?? 1;
|
|
@@ -19244,10 +19373,9 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
|
|
|
19244
19373
|
const collateralDec = parseRawAmount(collateral.toString(), decimals);
|
|
19245
19374
|
const borrowDec = parseRawAmount(borrow.toString(), loanAsset?.decimals ?? 18);
|
|
19246
19375
|
const dataForLoanAsset = {
|
|
19247
|
-
|
|
19376
|
+
marketUid: createMarketUid(chainId, lenderKey, loanAddress),
|
|
19248
19377
|
underlying: loanAddress,
|
|
19249
19378
|
deposits: loanDepositNumber,
|
|
19250
|
-
depositsRaw: deposits.toString(),
|
|
19251
19379
|
debtStable: "0",
|
|
19252
19380
|
debt: borrowDec,
|
|
19253
19381
|
depositsUSD: Number(loanDepositNumber) * priceLoan,
|
|
@@ -19260,10 +19388,9 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap) {
|
|
|
19260
19388
|
const price = collateralAssetMeta?.price.priceUsd ?? 1;
|
|
19261
19389
|
const priceHist = collateralAssetMeta?.price.priceUsd24h ?? price;
|
|
19262
19390
|
const dataForCollateralAsset = {
|
|
19263
|
-
|
|
19391
|
+
marketUid: createMarketUid(chainId, lenderKey, collateralAddress),
|
|
19264
19392
|
underlying: collateralAddress,
|
|
19265
19393
|
deposits: collateralDec,
|
|
19266
|
-
depositsRaw: balanceInfo.collateral.toString(),
|
|
19267
19394
|
debtStable: "0",
|
|
19268
19395
|
debt: "0",
|
|
19269
19396
|
depositsUSD: Number(collateralDec) * price,
|
|
@@ -19378,27 +19505,26 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
|
|
|
19378
19505
|
}
|
|
19379
19506
|
const assetMeta = meta.asset;
|
|
19380
19507
|
const decimals = assetMeta?.decimals ?? 18;
|
|
19381
|
-
const currentATokenBalance =
|
|
19382
|
-
const currentVariableDebt =
|
|
19508
|
+
const currentATokenBalance = parseRawAmount(depositsRaw, decimals);
|
|
19509
|
+
const currentVariableDebt = parseRawAmount(borrowsRaw, decimals);
|
|
19383
19510
|
const price = meta?.price?.priceUsd ?? 1;
|
|
19384
19511
|
const priceHist = meta?.price?.priceUsd24h ?? price;
|
|
19385
19512
|
const dataForAsset = {
|
|
19386
|
-
|
|
19513
|
+
marketUid: key,
|
|
19387
19514
|
underlying: assetMeta.address,
|
|
19388
19515
|
deposits: currentATokenBalance,
|
|
19389
|
-
|
|
19390
|
-
debtStable: 0,
|
|
19516
|
+
debtStable: "0",
|
|
19391
19517
|
debt: currentVariableDebt,
|
|
19392
|
-
depositsUSD: currentATokenBalance * price,
|
|
19518
|
+
depositsUSD: Number(currentATokenBalance) * price,
|
|
19393
19519
|
debtStableUSD: 0,
|
|
19394
|
-
debtUSD: currentVariableDebt * price,
|
|
19520
|
+
debtUSD: Number(currentVariableDebt) * price,
|
|
19395
19521
|
collateralEnabled,
|
|
19396
19522
|
claimableRewards
|
|
19397
19523
|
};
|
|
19398
19524
|
return {
|
|
19399
19525
|
dataForAsset,
|
|
19400
|
-
addedDeposits: currentATokenBalance * priceHist,
|
|
19401
|
-
addedDebt: currentVariableDebt * priceHist
|
|
19526
|
+
addedDeposits: Number(currentATokenBalance) * priceHist,
|
|
19527
|
+
addedDebt: Number(currentVariableDebt) * priceHist
|
|
19402
19528
|
};
|
|
19403
19529
|
}
|
|
19404
19530
|
|
|
@@ -19544,7 +19670,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
|
|
|
19544
19670
|
meta?.[lender]
|
|
19545
19671
|
);
|
|
19546
19672
|
}
|
|
19547
|
-
var getLenderUserDataResult = async (chainId, queriesRaw,
|
|
19673
|
+
var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false) => {
|
|
19548
19674
|
let calls = [];
|
|
19549
19675
|
const queries = organizeUserQueries(queriesRaw);
|
|
19550
19676
|
for (const query2 of queries) {
|
|
@@ -19562,7 +19688,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient2, allowFa
|
|
|
19562
19688
|
chainId,
|
|
19563
19689
|
calls.map((call) => call.abi),
|
|
19564
19690
|
calls.map((call) => call.call),
|
|
19565
|
-
|
|
19691
|
+
getEvmClient3,
|
|
19566
19692
|
true,
|
|
19567
19693
|
0,
|
|
19568
19694
|
retries,
|
|
@@ -19605,6 +19731,16 @@ var prepareLenderUserDataRpcCalls = (chainId, queriesRaw, batchSize = MULTICALL_
|
|
|
19605
19731
|
rpcCalls
|
|
19606
19732
|
};
|
|
19607
19733
|
};
|
|
19734
|
+
var hasBalanceOrPositions = (entry) => {
|
|
19735
|
+
const hasBalance = entry.balanceData.deposits > 0 || entry.balanceData.debt > 0;
|
|
19736
|
+
const hasPositions = entry.positions && entry.positions.length > 0;
|
|
19737
|
+
return hasBalance || hasPositions;
|
|
19738
|
+
};
|
|
19739
|
+
var filterEmptyUserData = (userData) => {
|
|
19740
|
+
const filteredData = userData.data.filter(hasBalanceOrPositions);
|
|
19741
|
+
if (filteredData.length === 0) return null;
|
|
19742
|
+
return { ...userData, data: filteredData };
|
|
19743
|
+
};
|
|
19608
19744
|
var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState) => {
|
|
19609
19745
|
const queries = organizeUserQueries(queriesRaw);
|
|
19610
19746
|
const lenderData = {};
|
|
@@ -19623,10 +19759,18 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState)
|
|
|
19623
19759
|
if (convertedData) {
|
|
19624
19760
|
if (isMultiMarket(query2.lender)) {
|
|
19625
19761
|
Object.keys(convertedData).forEach((market) => {
|
|
19626
|
-
|
|
19762
|
+
const filtered = filterEmptyUserData(convertedData[market]);
|
|
19763
|
+
if (filtered) {
|
|
19764
|
+
filtered.lender = market;
|
|
19765
|
+
lenderData[market] = filtered;
|
|
19766
|
+
}
|
|
19627
19767
|
});
|
|
19628
19768
|
} else {
|
|
19629
|
-
|
|
19769
|
+
const filtered = filterEmptyUserData(convertedData);
|
|
19770
|
+
if (filtered) {
|
|
19771
|
+
filtered.lender = query2.lender;
|
|
19772
|
+
lenderData[query2.lender] = filtered;
|
|
19773
|
+
}
|
|
19630
19774
|
}
|
|
19631
19775
|
}
|
|
19632
19776
|
} catch (e) {
|
|
@@ -19695,140 +19839,277 @@ async function getLenderUserDataMulti(account, chainQueries, lenderState) {
|
|
|
19695
19839
|
return returndata;
|
|
19696
19840
|
}
|
|
19697
19841
|
|
|
19698
|
-
// src/lending/
|
|
19699
|
-
|
|
19700
|
-
|
|
19701
|
-
|
|
19702
|
-
|
|
19703
|
-
|
|
19704
|
-
|
|
19705
|
-
|
|
19706
|
-
|
|
19707
|
-
var morphoPools2 = baseUrl + "/config/morpho-pools.json";
|
|
19708
|
-
var morphoTypeMarkets2 = baseUrl + "/config/morpho-type-markets.json";
|
|
19709
|
-
var aaveReserves2 = baseUrl + "/data/aave-reserves.json";
|
|
19710
|
-
var compoundV2Reserves2 = baseUrl + "/data/compound-v2-reserves.json";
|
|
19711
|
-
var compoundV3Reserves2 = baseUrl + "/data/compound-v3-reserves.json";
|
|
19712
|
-
var initConfig2 = baseUrl + "/data/init-config.json";
|
|
19713
|
-
var aaveTokens2 = baseUrl + "/data/aave-tokens.json";
|
|
19714
|
-
var compoundV2CTokens = baseUrl + "/data/compound-v2-c-tokens.json";
|
|
19715
|
-
var compoundV2TokenArray2 = baseUrl + "/data/compound-v2-tokens.json";
|
|
19716
|
-
var compoundV3Base = baseUrl + "/data/compound-v3-base-data.json";
|
|
19717
|
-
var baseUrlChains = "https://raw.githubusercontent.com/1delta-DAO/chains/main";
|
|
19718
|
-
var chains = baseUrlChains + "/data.json";
|
|
19719
|
-
function inititalizeAllData(params) {
|
|
19720
|
-
const { chainsOverride, ...lenderOverrides } = params;
|
|
19721
|
-
initializeLenderData(lenderOverrides);
|
|
19722
|
-
initializeChainData({ chainsOverride });
|
|
19842
|
+
// src/lending/user-data/summary/utils.ts
|
|
19843
|
+
function calculateWeightedAverage(items) {
|
|
19844
|
+
const totalWeight = items.reduce((sum, item) => sum + item.weight, 0);
|
|
19845
|
+
if (totalWeight === 0) return 0;
|
|
19846
|
+
const weightedSum = items.reduce(
|
|
19847
|
+
(sum, item) => sum + item.value * item.weight,
|
|
19848
|
+
0
|
|
19849
|
+
);
|
|
19850
|
+
return weightedSum / totalWeight;
|
|
19723
19851
|
}
|
|
19724
|
-
|
|
19725
|
-
const
|
|
19726
|
-
|
|
19727
|
-
|
|
19728
|
-
|
|
19729
|
-
|
|
19730
|
-
|
|
19731
|
-
|
|
19732
|
-
|
|
19733
|
-
|
|
19734
|
-
|
|
19735
|
-
|
|
19736
|
-
|
|
19737
|
-
|
|
19738
|
-
|
|
19739
|
-
|
|
19740
|
-
|
|
19741
|
-
|
|
19742
|
-
|
|
19743
|
-
|
|
19744
|
-
|
|
19745
|
-
|
|
19746
|
-
|
|
19747
|
-
|
|
19748
|
-
|
|
19749
|
-
|
|
19750
|
-
|
|
19751
|
-
|
|
19752
|
-
|
|
19753
|
-
|
|
19754
|
-
|
|
19755
|
-
|
|
19756
|
-
|
|
19757
|
-
|
|
19758
|
-
|
|
19759
|
-
|
|
19760
|
-
|
|
19761
|
-
|
|
19762
|
-
|
|
19763
|
-
|
|
19764
|
-
|
|
19765
|
-
|
|
19852
|
+
function calculateNetApr(aprData2, balanceData2) {
|
|
19853
|
+
const deposits = balanceData2.deposits;
|
|
19854
|
+
const debt = balanceData2.debt;
|
|
19855
|
+
const nav = deposits - debt;
|
|
19856
|
+
if (nav === 0) return 0;
|
|
19857
|
+
const depositIncome = deposits * (aprData2.depositApr / 100);
|
|
19858
|
+
const borrowCost = debt * (aprData2.borrowApr / 100);
|
|
19859
|
+
const rewardIncome = deposits * (aprData2.rewardDepositApr / 100) + debt * (aprData2.rewardBorrowApr / 100);
|
|
19860
|
+
const netIncome = depositIncome - borrowCost + rewardIncome;
|
|
19861
|
+
return netIncome / nav * 100;
|
|
19862
|
+
}
|
|
19863
|
+
function calculateLeverage(deposits, netWorth) {
|
|
19864
|
+
return netWorth > 0 ? deposits / netWorth : 0;
|
|
19865
|
+
}
|
|
19866
|
+
function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, avgBorrowApr) {
|
|
19867
|
+
const totalNetWorth = totalDepositsUSD - totalDebtUSD;
|
|
19868
|
+
if (totalNetWorth === 0) return 0;
|
|
19869
|
+
return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
|
|
19870
|
+
}
|
|
19871
|
+
|
|
19872
|
+
// src/lending/user-data/summary/buildPortfolioTotals.ts
|
|
19873
|
+
function buildPortfolioTotals(userDataResult) {
|
|
19874
|
+
let totalDepositsUSD = 0;
|
|
19875
|
+
let totalDebtUSD = 0;
|
|
19876
|
+
let totalRewardApr = 0;
|
|
19877
|
+
let totalNav24h = 0;
|
|
19878
|
+
let lenderCount = 0;
|
|
19879
|
+
const aprItems = [];
|
|
19880
|
+
const activeChains = /* @__PURE__ */ new Set();
|
|
19881
|
+
for (const [chainId, lenders] of Object.entries(userDataResult)) {
|
|
19882
|
+
activeChains.add(chainId);
|
|
19883
|
+
for (const [, userData] of Object.entries(lenders)) {
|
|
19884
|
+
lenderCount++;
|
|
19885
|
+
let lenderDeposits = 0;
|
|
19886
|
+
let lenderDebt = 0;
|
|
19887
|
+
let lenderDepositAprSum = 0;
|
|
19888
|
+
let lenderBorrowAprSum = 0;
|
|
19889
|
+
let lenderDepositWeight = 0;
|
|
19890
|
+
let lenderDebtWeight = 0;
|
|
19891
|
+
for (const subAccount of userData.data) {
|
|
19892
|
+
const { balanceData: balanceData2, aprData: aprData2 } = subAccount;
|
|
19893
|
+
lenderDeposits += balanceData2.deposits;
|
|
19894
|
+
lenderDebt += balanceData2.debt;
|
|
19895
|
+
if (balanceData2.deposits > 0) {
|
|
19896
|
+
lenderDepositAprSum += aprData2.depositApr * balanceData2.deposits;
|
|
19897
|
+
lenderDepositWeight += balanceData2.deposits;
|
|
19898
|
+
}
|
|
19899
|
+
if (balanceData2.debt > 0) {
|
|
19900
|
+
lenderBorrowAprSum += aprData2.borrowApr * balanceData2.debt;
|
|
19901
|
+
lenderDebtWeight += balanceData2.debt;
|
|
19902
|
+
}
|
|
19903
|
+
totalNav24h += balanceData2.nav24h ?? 0;
|
|
19904
|
+
totalRewardApr += aprData2.rewardApr + aprData2.rewardDepositApr + aprData2.rewardBorrowApr + aprData2.stakingApr;
|
|
19905
|
+
}
|
|
19906
|
+
totalDepositsUSD += lenderDeposits;
|
|
19907
|
+
totalDebtUSD += lenderDebt;
|
|
19908
|
+
if (lenderDepositWeight > 0) {
|
|
19909
|
+
aprItems.push({
|
|
19910
|
+
depositApr: lenderDepositAprSum / lenderDepositWeight,
|
|
19911
|
+
borrowApr: lenderDebtWeight > 0 ? lenderBorrowAprSum / lenderDebtWeight : 0,
|
|
19912
|
+
deposits: lenderDeposits,
|
|
19913
|
+
debt: lenderDebt
|
|
19914
|
+
});
|
|
19915
|
+
}
|
|
19916
|
+
}
|
|
19917
|
+
}
|
|
19918
|
+
const totalNetWorth = totalDepositsUSD - totalDebtUSD;
|
|
19919
|
+
const totalDepositWeight = aprItems.reduce((sum, a) => sum + a.deposits, 0);
|
|
19920
|
+
const avgDepositApr = totalDepositWeight > 0 ? aprItems.reduce((sum, a) => sum + a.depositApr * a.deposits, 0) / totalDepositWeight : 0;
|
|
19921
|
+
const totalDebtWeight = aprItems.reduce((sum, a) => sum + a.debt, 0);
|
|
19922
|
+
const avgBorrowApr = totalDebtWeight > 0 ? aprItems.filter((a) => a.debt > 0).reduce((sum, a) => sum + a.borrowApr * a.debt, 0) / totalDebtWeight : 0;
|
|
19923
|
+
const avgNetApr = calculateOverallNetApr(
|
|
19924
|
+
totalDepositsUSD,
|
|
19925
|
+
totalDebtUSD,
|
|
19926
|
+
avgDepositApr,
|
|
19927
|
+
avgBorrowApr
|
|
19928
|
+
);
|
|
19929
|
+
const overallLeverage = calculateLeverage(totalDepositsUSD, totalNetWorth);
|
|
19930
|
+
return {
|
|
19931
|
+
totalDepositsUSD,
|
|
19932
|
+
totalDebtUSD,
|
|
19933
|
+
totalNetWorth,
|
|
19934
|
+
totalNetWorth24h: totalNav24h,
|
|
19935
|
+
avgDepositApr,
|
|
19936
|
+
avgBorrowApr,
|
|
19937
|
+
avgNetApr,
|
|
19938
|
+
totalRewardApr,
|
|
19939
|
+
overallLeverage,
|
|
19940
|
+
activeLenders: lenderCount,
|
|
19941
|
+
activeChains: activeChains.size
|
|
19942
|
+
};
|
|
19943
|
+
}
|
|
19944
|
+
|
|
19945
|
+
// src/lending/user-data/summary/buildSummaries.ts
|
|
19946
|
+
function aggregateLenderData(lender, userData) {
|
|
19947
|
+
const { chainId, data } = userData;
|
|
19948
|
+
let totalDepositsUSD = 0;
|
|
19949
|
+
let totalDebtUSD = 0;
|
|
19950
|
+
let totalCollateral = 0;
|
|
19951
|
+
let totalNav24h = 0;
|
|
19952
|
+
const subAccountSummaries = [];
|
|
19953
|
+
const aprItems = [];
|
|
19954
|
+
let totalRewardApr = 0;
|
|
19955
|
+
let healthSum = 0;
|
|
19956
|
+
let healthCount = 0;
|
|
19957
|
+
for (const subAccount of data) {
|
|
19958
|
+
const { balanceData: balanceData2, aprData: aprData2, positions, health, accountId, userConfig } = subAccount;
|
|
19959
|
+
totalDepositsUSD += balanceData2.deposits;
|
|
19960
|
+
totalDebtUSD += balanceData2.debt;
|
|
19961
|
+
totalCollateral += balanceData2.collateral;
|
|
19962
|
+
totalNav24h += balanceData2.nav24h ?? 0;
|
|
19963
|
+
if (balanceData2.deposits > 0) {
|
|
19964
|
+
aprItems.push({
|
|
19965
|
+
depositApr: aprData2.depositApr,
|
|
19966
|
+
borrowApr: aprData2.borrowApr,
|
|
19967
|
+
weight: balanceData2.deposits
|
|
19968
|
+
});
|
|
19969
|
+
}
|
|
19970
|
+
totalRewardApr += aprData2.rewardApr + aprData2.rewardDepositApr + aprData2.rewardBorrowApr + aprData2.stakingApr;
|
|
19971
|
+
if (health !== null && health > 0) {
|
|
19972
|
+
healthSum += health;
|
|
19973
|
+
healthCount++;
|
|
19974
|
+
}
|
|
19975
|
+
subAccountSummaries.push({
|
|
19976
|
+
accountId,
|
|
19977
|
+
health,
|
|
19978
|
+
balanceData: balanceData2,
|
|
19979
|
+
aprData: aprData2,
|
|
19980
|
+
userConfig,
|
|
19981
|
+
positionCount: positions.length
|
|
19982
|
+
});
|
|
19983
|
+
}
|
|
19984
|
+
const netWorth = totalDepositsUSD - totalDebtUSD;
|
|
19985
|
+
const depositApr = calculateWeightedAverage(
|
|
19986
|
+
aprItems.map((a) => ({ value: a.depositApr, weight: a.weight }))
|
|
19987
|
+
);
|
|
19988
|
+
const borrowApr = calculateWeightedAverage(
|
|
19989
|
+
aprItems.map((a) => ({
|
|
19990
|
+
value: a.borrowApr,
|
|
19991
|
+
weight: a.weight * (a.borrowApr > 0 ? 1 : 0)
|
|
19992
|
+
}))
|
|
19993
|
+
);
|
|
19994
|
+
const netApr = netWorth !== 0 ? (totalDepositsUSD * depositApr - totalDebtUSD * borrowApr) / netWorth * (netWorth > 0 ? 1 : -1) : 0;
|
|
19995
|
+
const leverage = calculateLeverage(totalDepositsUSD, netWorth);
|
|
19996
|
+
const healthFactor = healthCount > 0 ? healthSum / healthCount : totalDebtUSD > 0 ? null : null;
|
|
19997
|
+
return {
|
|
19998
|
+
lender,
|
|
19999
|
+
chainId,
|
|
20000
|
+
totalDepositsUSD,
|
|
20001
|
+
totalDebtUSD,
|
|
20002
|
+
netWorth,
|
|
20003
|
+
netWorth24h: totalNav24h,
|
|
20004
|
+
depositApr,
|
|
20005
|
+
borrowApr,
|
|
20006
|
+
netApr,
|
|
20007
|
+
rewardApr: totalRewardApr,
|
|
20008
|
+
healthFactor,
|
|
20009
|
+
leverage,
|
|
20010
|
+
collateral: totalCollateral,
|
|
20011
|
+
subAccounts: subAccountSummaries
|
|
20012
|
+
};
|
|
20013
|
+
}
|
|
20014
|
+
function buildSummaries(userDataResult) {
|
|
20015
|
+
const lenderSummaries = [];
|
|
20016
|
+
const chainMap = {};
|
|
20017
|
+
let totalDepositsUSD = 0;
|
|
20018
|
+
let totalDebtUSD = 0;
|
|
20019
|
+
let totalRewardApr = 0;
|
|
20020
|
+
let totalNav24h = 0;
|
|
20021
|
+
const aprItems = [];
|
|
20022
|
+
const activeChains = /* @__PURE__ */ new Set();
|
|
20023
|
+
for (const [chainId, lenders] of Object.entries(userDataResult)) {
|
|
20024
|
+
activeChains.add(chainId);
|
|
20025
|
+
if (!chainMap[chainId]) {
|
|
20026
|
+
chainMap[chainId] = {
|
|
20027
|
+
chainId,
|
|
20028
|
+
totalDepositsUSD: 0,
|
|
20029
|
+
totalDebtUSD: 0,
|
|
20030
|
+
netWorth: 0,
|
|
20031
|
+
lenderCount: 0
|
|
20032
|
+
};
|
|
20033
|
+
}
|
|
20034
|
+
for (const [lender, userData] of Object.entries(lenders)) {
|
|
20035
|
+
const summary = aggregateLenderData(lender, userData);
|
|
20036
|
+
lenderSummaries.push(summary);
|
|
20037
|
+
totalDepositsUSD += summary.totalDepositsUSD;
|
|
20038
|
+
totalDebtUSD += summary.totalDebtUSD;
|
|
20039
|
+
totalRewardApr += summary.rewardApr;
|
|
20040
|
+
totalNav24h += summary.netWorth24h;
|
|
20041
|
+
if (summary.totalDepositsUSD > 0) {
|
|
20042
|
+
aprItems.push({
|
|
20043
|
+
depositApr: summary.depositApr,
|
|
20044
|
+
borrowApr: summary.borrowApr,
|
|
20045
|
+
deposits: summary.totalDepositsUSD,
|
|
20046
|
+
debt: summary.totalDebtUSD
|
|
20047
|
+
});
|
|
20048
|
+
}
|
|
20049
|
+
chainMap[chainId].totalDepositsUSD += summary.totalDepositsUSD;
|
|
20050
|
+
chainMap[chainId].totalDebtUSD += summary.totalDebtUSD;
|
|
20051
|
+
chainMap[chainId].lenderCount++;
|
|
20052
|
+
}
|
|
20053
|
+
chainMap[chainId].netWorth = chainMap[chainId].totalDepositsUSD - chainMap[chainId].totalDebtUSD;
|
|
20054
|
+
}
|
|
20055
|
+
const totalNetWorth = totalDepositsUSD - totalDebtUSD;
|
|
20056
|
+
const avgDepositApr = calculateWeightedAverage(
|
|
20057
|
+
aprItems.map((a) => ({ value: a.depositApr, weight: a.deposits }))
|
|
20058
|
+
);
|
|
20059
|
+
const avgBorrowApr = calculateWeightedAverage(
|
|
20060
|
+
aprItems.filter((a) => a.debt > 0).map((a) => ({ value: a.borrowApr, weight: a.debt }))
|
|
20061
|
+
);
|
|
20062
|
+
const avgNetApr = calculateOverallNetApr(
|
|
20063
|
+
totalDepositsUSD,
|
|
20064
|
+
totalDebtUSD,
|
|
20065
|
+
avgDepositApr,
|
|
20066
|
+
avgBorrowApr
|
|
20067
|
+
);
|
|
20068
|
+
const overallLeverage = calculateLeverage(totalDepositsUSD, totalNetWorth);
|
|
20069
|
+
lenderSummaries.sort((a, b) => b.netWorth - a.netWorth);
|
|
20070
|
+
return {
|
|
20071
|
+
totalDepositsUSD,
|
|
20072
|
+
totalDebtUSD,
|
|
20073
|
+
totalNetWorth,
|
|
20074
|
+
totalNetWorth24h: totalNav24h,
|
|
20075
|
+
avgDepositApr,
|
|
20076
|
+
avgBorrowApr,
|
|
20077
|
+
avgNetApr,
|
|
20078
|
+
totalRewardApr,
|
|
20079
|
+
overallLeverage,
|
|
20080
|
+
activeLenders: lenderSummaries.length,
|
|
20081
|
+
activeChains: activeChains.size,
|
|
20082
|
+
lenders: lenderSummaries,
|
|
20083
|
+
chains: Object.values(chainMap)
|
|
20084
|
+
};
|
|
19766
20085
|
}
|
|
19767
|
-
|
|
19768
|
-
const
|
|
19769
|
-
|
|
19770
|
-
|
|
19771
|
-
compoundV3Pools2,
|
|
19772
|
-
// initPools,
|
|
19773
|
-
morphoPools2,
|
|
19774
|
-
aaveReserves2,
|
|
19775
|
-
compoundV2Reserves2,
|
|
19776
|
-
compoundV3Reserves2,
|
|
19777
|
-
initConfig2,
|
|
19778
|
-
aaveTokens2,
|
|
19779
|
-
compoundV2CTokens,
|
|
19780
|
-
compoundV2TokenArray2,
|
|
19781
|
-
compoundV3Base,
|
|
19782
|
-
aaveOracles2,
|
|
19783
|
-
compoundV2Oracles2,
|
|
19784
|
-
compoundV3Oracles2,
|
|
19785
|
-
morphoTypeOracles2,
|
|
19786
|
-
morphoTypeMarkets2,
|
|
19787
|
-
chains
|
|
19788
|
-
].map(async (a) => fetch(a).then(async (b) => await b.json()));
|
|
19789
|
-
const [
|
|
19790
|
-
aavePoolsOverride,
|
|
19791
|
-
compoundV2PoolsOverride,
|
|
19792
|
-
compoundV3PoolsOverride,
|
|
19793
|
-
// initPoolsOverride,
|
|
19794
|
-
morphoPoolsOverride,
|
|
19795
|
-
aaveReservesOverride,
|
|
19796
|
-
compoundV2ReservesOverride,
|
|
19797
|
-
compoundV3ReservesOverride,
|
|
19798
|
-
initConfigOverride,
|
|
19799
|
-
aaveTokensOverride,
|
|
19800
|
-
compoundV2TokensOverride,
|
|
19801
|
-
compoundV2TokenArrayOverride,
|
|
19802
|
-
compoundV3BaseDataOverride,
|
|
19803
|
-
aaveOraclesOverride,
|
|
19804
|
-
compoundV2OraclesOverride,
|
|
19805
|
-
compoundV3OraclesOverride,
|
|
19806
|
-
morphoTypeOraclesOverride,
|
|
19807
|
-
morphoTypeMarketsOverride,
|
|
19808
|
-
chainsOverride
|
|
19809
|
-
] = await Promise.all(promises);
|
|
20086
|
+
function filterActiveLenders(summary) {
|
|
20087
|
+
const activeLenders = summary.lenders.filter(
|
|
20088
|
+
(l) => l.totalDepositsUSD > 0 || l.totalDebtUSD > 0
|
|
20089
|
+
);
|
|
19810
20090
|
return {
|
|
19811
|
-
|
|
19812
|
-
|
|
19813
|
-
|
|
19814
|
-
// initPoolsOverride,
|
|
19815
|
-
morphoPoolsOverride,
|
|
19816
|
-
aaveReservesOverride,
|
|
19817
|
-
compoundV2ReservesOverride,
|
|
19818
|
-
compoundV3ReservesOverride,
|
|
19819
|
-
initConfigOverride,
|
|
19820
|
-
aaveTokensOverride,
|
|
19821
|
-
compoundV2TokensOverride,
|
|
19822
|
-
compoundV2TokenArrayOverride,
|
|
19823
|
-
compoundV3BaseDataOverride,
|
|
19824
|
-
aaveOraclesOverride,
|
|
19825
|
-
compoundV2OraclesOverride,
|
|
19826
|
-
compoundV3OraclesOverride,
|
|
19827
|
-
morphoTypeOraclesOverride,
|
|
19828
|
-
morphoTypeMarketsOverride,
|
|
19829
|
-
chainsOverride
|
|
20091
|
+
...summary,
|
|
20092
|
+
lenders: activeLenders,
|
|
20093
|
+
activeLenders: activeLenders.length
|
|
19830
20094
|
};
|
|
19831
20095
|
}
|
|
20096
|
+
function fuseLenderData(userDataResult, summary) {
|
|
20097
|
+
const entries = [];
|
|
20098
|
+
for (const lenderSummary of summary.lenders) {
|
|
20099
|
+
const { lender, chainId, subAccounts: _2, ...summaryFields } = lenderSummary;
|
|
20100
|
+
const userData = userDataResult[chainId]?.[lender];
|
|
20101
|
+
if (!userData) continue;
|
|
20102
|
+
entries.push({
|
|
20103
|
+
...summaryFields,
|
|
20104
|
+
lender,
|
|
20105
|
+
chainId,
|
|
20106
|
+
account: userData.account,
|
|
20107
|
+
data: userData.data
|
|
20108
|
+
});
|
|
20109
|
+
}
|
|
20110
|
+
entries.sort((a, b) => b.netWorth - a.netWorth);
|
|
20111
|
+
return entries;
|
|
20112
|
+
}
|
|
19832
20113
|
|
|
19833
20114
|
// src/assets/liquidityThresholds.ts
|
|
19834
20115
|
var DEFAULT_LIQUIDITY_THRESHOLDS = {
|
|
@@ -20173,375 +20454,198 @@ function getDistinctPairsByShortAsset(pairs) {
|
|
|
20173
20454
|
return result;
|
|
20174
20455
|
}
|
|
20175
20456
|
|
|
20176
|
-
// src/
|
|
20177
|
-
|
|
20178
|
-
|
|
20179
|
-
|
|
20180
|
-
|
|
20181
|
-
try {
|
|
20182
|
-
const response = await fetch(MARKETS_ENDPOINT);
|
|
20183
|
-
if (!response.ok) {
|
|
20184
|
-
throw new Error(`Failed to fetch all markets data: ${response.status}`);
|
|
20185
|
-
}
|
|
20186
|
-
const data = await response.json();
|
|
20187
|
-
const marketsByChain = {};
|
|
20188
|
-
if (data.markets) {
|
|
20189
|
-
for (const market of data.markets) {
|
|
20190
|
-
const chainId = market.chainId.toString();
|
|
20191
|
-
if (!marketsByChain[chainId]) {
|
|
20192
|
-
marketsByChain[chainId] = [];
|
|
20193
|
-
}
|
|
20194
|
-
marketsByChain[chainId].push(market);
|
|
20195
|
-
}
|
|
20196
|
-
}
|
|
20197
|
-
return marketsByChain;
|
|
20198
|
-
} catch (error) {
|
|
20199
|
-
console.error("Error fetching all markets data:", error);
|
|
20200
|
-
return {};
|
|
20201
|
-
}
|
|
20457
|
+
// src/yields/helpers.ts
|
|
20458
|
+
function averageDataLastN(arr, n = 7) {
|
|
20459
|
+
const last = arr.slice(-n);
|
|
20460
|
+
if (last.length === 0) return 0;
|
|
20461
|
+
return last.reduce((sum, x) => sum + x.data, 0) / last.length;
|
|
20202
20462
|
}
|
|
20203
|
-
|
|
20463
|
+
var safeFetch = async (label, fn) => {
|
|
20204
20464
|
try {
|
|
20205
|
-
|
|
20206
|
-
|
|
20207
|
-
|
|
20208
|
-
|
|
20209
|
-
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
|
|
20210
|
-
prices[assetKey] = val;
|
|
20211
|
-
});
|
|
20212
|
-
return prices;
|
|
20213
|
-
} catch (error) {
|
|
20214
|
-
console.error(`Error fetching prices pendle prices:`, error);
|
|
20215
|
-
return {};
|
|
20465
|
+
return await fn();
|
|
20466
|
+
} catch (e) {
|
|
20467
|
+
console.error(`Error fetching ${label}:`, e);
|
|
20468
|
+
return void 0;
|
|
20216
20469
|
}
|
|
20217
|
-
}
|
|
20218
|
-
async function
|
|
20219
|
-
|
|
20220
|
-
|
|
20221
|
-
|
|
20222
|
-
|
|
20223
|
-
} catch (error) {
|
|
20224
|
-
console.error(`Error fetching prices pendle prices:`, error);
|
|
20225
|
-
return {};
|
|
20470
|
+
};
|
|
20471
|
+
async function getListsMulti(chainIds) {
|
|
20472
|
+
const lists = await fetchTokenLists(chainIds);
|
|
20473
|
+
let res = {};
|
|
20474
|
+
for (const chainId of chainIds) {
|
|
20475
|
+
res[chainId] = { list: lists[chainId] };
|
|
20226
20476
|
}
|
|
20477
|
+
return res;
|
|
20227
20478
|
}
|
|
20228
|
-
|
|
20229
|
-
|
|
20230
|
-
|
|
20231
|
-
|
|
20232
|
-
|
|
20233
|
-
|
|
20234
|
-
|
|
20235
|
-
|
|
20236
|
-
|
|
20237
|
-
|
|
20238
|
-
|
|
20239
|
-
|
|
20240
|
-
|
|
20479
|
+
|
|
20480
|
+
// src/yields/fetchers/lido.ts
|
|
20481
|
+
var WSTETH_URL = "https://eth-api.lido.fi/v1/protocol/steth/apr/sma";
|
|
20482
|
+
var tETH = "Treehouse ETH::TETH";
|
|
20483
|
+
var wstethFetcher = {
|
|
20484
|
+
label: "WSTETH",
|
|
20485
|
+
fetch: async () => {
|
|
20486
|
+
const res = await fetch(WSTETH_URL).then((r) => r.json());
|
|
20487
|
+
const apr = Number(res.data.aprs.at(-1).apr) * 0.9;
|
|
20488
|
+
return {
|
|
20489
|
+
WSTETH: apr,
|
|
20490
|
+
[tETH]: apr
|
|
20491
|
+
};
|
|
20241
20492
|
}
|
|
20242
|
-
}
|
|
20243
|
-
|
|
20244
|
-
|
|
20245
|
-
|
|
20246
|
-
|
|
20247
|
-
return {};
|
|
20248
|
-
}
|
|
20249
|
-
const prices = await fetchPendlePricesRaw();
|
|
20250
|
-
let yields = {};
|
|
20251
|
-
const now = /* @__PURE__ */ new Date();
|
|
20252
|
-
Object.entries(marketsResponse).forEach(([chain, dataArr]) => {
|
|
20253
|
-
dataArr.forEach((market) => {
|
|
20254
|
-
const ptPrice = prices[market.pt];
|
|
20255
|
-
const ytPrice = prices[market.yt];
|
|
20256
|
-
if (ytPrice && ytPrice > 0) {
|
|
20257
|
-
const yearFraction = yearFractionToExpiry(market.expiry, now);
|
|
20258
|
-
const apr = ytPrice / ptPrice * 100 / yearFraction;
|
|
20259
|
-
const [chainId, address] = market.pt.split("-");
|
|
20260
|
-
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? market.pt;
|
|
20261
|
-
yields[assetKey] = apr;
|
|
20262
|
-
}
|
|
20263
|
-
});
|
|
20264
|
-
});
|
|
20265
|
-
return yields;
|
|
20266
|
-
} catch (error) {
|
|
20267
|
-
console.error("Error in fetchPendlePrices:", error);
|
|
20268
|
-
return {};
|
|
20493
|
+
};
|
|
20494
|
+
var stmaticFetcher = {
|
|
20495
|
+
label: "STMATIC",
|
|
20496
|
+
fetch: async () => {
|
|
20497
|
+
return { STMATIC: 0 };
|
|
20269
20498
|
}
|
|
20270
|
-
}
|
|
20271
|
-
function yearFractionToExpiry(expiryISO, now = /* @__PURE__ */ new Date()) {
|
|
20272
|
-
const expiry = new Date(expiryISO);
|
|
20273
|
-
const diffMs = expiry.getTime() - now.getTime();
|
|
20274
|
-
const yearFraction = diffMs / (1e3 * 60 * 60 * 24 * 365.25);
|
|
20275
|
-
return yearFraction;
|
|
20276
|
-
}
|
|
20277
|
-
|
|
20278
|
-
// src/yields/yieldTypes.ts
|
|
20279
|
-
var addressToAssetYearn = {
|
|
20280
|
-
"0xe007ca01894c863d7898045ed5a3b4abf0b18f37": "vbETH yVault::yvvbETH",
|
|
20281
|
-
"0x80c34bd3a3569e126e7055831036aa7b212cb159": "vbUSDC yVault::yvvbUSDC",
|
|
20282
|
-
"0x9a6bd7b6fd5c4f87eb66356441502fc7dcdd185b": "vbUSDT yVault::yvvbUSDT",
|
|
20283
|
-
"0xaa0362ecc584b985056e47812931270b99c91f9d": "vbWBTC yVault::yvvbWBTC",
|
|
20284
|
-
"0x93fec6639717b6215a48e5a72a162c50dcc40d68": "vbAUSD yVault::yvvbAUSD"
|
|
20285
20499
|
};
|
|
20286
20500
|
|
|
20287
|
-
// src/yields/
|
|
20288
|
-
var
|
|
20289
|
-
var
|
|
20290
|
-
|
|
20291
|
-
|
|
20292
|
-
|
|
20293
|
-
|
|
20294
|
-
var ethX = "Stader ETHx::ETHx";
|
|
20295
|
-
var pufEth = "PUFETH";
|
|
20296
|
-
var stUSD = "Angle Staked USDA::stUSD";
|
|
20297
|
-
var stEur = "Angle Staked EURA::stEUR";
|
|
20298
|
-
var sUsds = "sUSDS::SUSDS";
|
|
20299
|
-
var srUsd = "Reservoir srUSD::SRUSD";
|
|
20300
|
-
var wsrusd = "Wrapped Savings rUSD::WSRUSD";
|
|
20301
|
-
var yusd = "YieldFi yUSD::yUSD";
|
|
20302
|
-
var rlp = "Resolv RLP::RLP";
|
|
20303
|
-
var wstusr = "Resolv wstUSR::WSTUSR";
|
|
20304
|
-
var ethPlus = "ETHPlus::ETH+";
|
|
20305
|
-
var woEth = "Wrapped OETH::WOETH";
|
|
20306
|
-
var csusdl = "Coinshift USDL Morpho Vault::CSUSDL";
|
|
20307
|
-
var sfrxeth = "Staked Frax Ether::sfrxETH";
|
|
20308
|
-
var ceth = "cETH::CETH";
|
|
20309
|
-
var sfrax = "Staked FRAX::SFRAX";
|
|
20310
|
-
var rsweth = "Restaked Swell ETH::RSWETH";
|
|
20311
|
-
var ynethx = "ynETH MAX::YNETHX";
|
|
20312
|
-
var usdZeroPlus = "Staked USD0::USD0++";
|
|
20313
|
-
var ethZero = "ETH0::ETH0";
|
|
20314
|
-
var usdThree = "Web 3 Dollar::USD3";
|
|
20315
|
-
var jitoSol = "Jito Staked SOL::JitoSOL";
|
|
20316
|
-
var thBill = "Theo Short Duration US Treasury Fund::THBILL";
|
|
20317
|
-
var ssuperusd = "SuperReturn sSuperUSD::SSUPERUSD";
|
|
20318
|
-
var hbhype = "hyperbeat x ether.fi HYPE::beHYPE";
|
|
20319
|
-
var hbuhype = "Hyperbeat Ultra Hype::hbHYPE";
|
|
20320
|
-
var hlp = "Wrapped HLP::WHLP";
|
|
20321
|
-
var yoeth = "Yield Optimizer ETH::YOETH";
|
|
20322
|
-
var yobtc = "Yield Optimizer BTC::YOBTC";
|
|
20323
|
-
var yousd = "Yield Optimizer USD::YOUSD";
|
|
20324
|
-
var yoeur = "Yield Optimizer EUR::yoEUR";
|
|
20325
|
-
var hwhlp = "Hyperwave HLP::hwHLP";
|
|
20326
|
-
var weeths = "Super Symbiotic LRT::weETHs";
|
|
20327
|
-
var gmx_eth_usd = "GMX Market ETH/USD::GM [WETH-USDC]";
|
|
20328
|
-
var gmx_btc_usd = "GMX Market BTC/USD::GM [WBTC-USDC]";
|
|
20329
|
-
var glv_wbtc_usdc = "GMX Liquidity Vault [WBTC-USDC]::GLV [WBTC-USDC]";
|
|
20330
|
-
var glv_weth_usdc = "GMX Liquidity Vault [WETH-USDC]::GLV [WETH-USDC]";
|
|
20331
|
-
var gmx_eth_usd_address = "0x70d95587d40a2caf56bd97485ab3eec10bee6336";
|
|
20332
|
-
var gmx_btc_usd_address = "0x47c031236e19d024b42f8ae6780e44a573170703";
|
|
20333
|
-
var glv_wbtc_usdc_address = "0xdf03eed325b82bc1d4db8b49c30ecc9e05104b96";
|
|
20334
|
-
var glv_weth_usdc_address = "0x528a5bac7e746c9a509a1f4f6df58a03d44279f9";
|
|
20335
|
-
var susdx = "SUSDX";
|
|
20336
|
-
var FeedData = {
|
|
20337
|
-
WSTETH: "https://eth-api.lido.fi/v1/protocol/steth/apr/sma",
|
|
20338
|
-
STMATIC: "https://polygon.lido.fi/api/stats",
|
|
20339
|
-
CBETH: "https://api.exchange.coinbase.com/wrapped-assets/cbeth",
|
|
20340
|
-
MATICX: "https://universe.staderlabs.com/polygon/apy",
|
|
20341
|
-
METH: "https://meth.mantle.xyz/api/stats/apy",
|
|
20342
|
-
SUSDE: "https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df",
|
|
20343
|
-
EZETH: "https://app.renzoprotocol.com/api/stats?chainId=1",
|
|
20344
|
-
RETH: "https://api.rocketpool.net/api/mainnet/payload",
|
|
20345
|
-
WEETH: "https://www.ether.fi/api/apr",
|
|
20346
|
-
WEETHS: "https://api.sevenseas.capital/etherfi/ethereum/performance/0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88",
|
|
20347
|
-
SAVAX: "https://api.benqi.fi/liquidstaking/apr",
|
|
20348
|
-
RSETH: "https://universe.kelpdao.xyz/rseth/totalApy",
|
|
20349
|
-
TRUMATIC: "https://api.trufin.io/staker/apy?staker=MATIC",
|
|
20350
|
-
RTOKENS: "https://yields.reserve.org/pools",
|
|
20351
|
-
HYPE: "https://api.hyperlend.finance/data/nativeApy",
|
|
20352
|
-
ETHX: "https://universe.staderlabs.com/eth/apy",
|
|
20353
|
-
OSETH: "https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy",
|
|
20354
|
-
PUFETH: "https://api-v2.puffer.fi/backend-for-frontend/tvl/all",
|
|
20355
|
-
ANGLE: "https://exporter.angle.money/v2/savingsApr",
|
|
20356
|
-
SUSDS: "https://info-sky.blockanalitica.com/api/v1/overall/?format=json",
|
|
20357
|
-
SRUSD: "https://app.reservoir.xyz/api/website",
|
|
20358
|
-
YUSD: "https://ctrl.yield.fi/t/yusd/apy",
|
|
20359
|
-
RLP: "https://api.resolv.xyz/apr/rlp/7d",
|
|
20360
|
-
WSTUSR: "https://api.resolv.xyz/apr/staking/7d",
|
|
20361
|
-
MORPHO_VAULTS: "https://blue-api.morpho.org/graphql",
|
|
20362
|
-
// SDEUSD: 'https://api-deusd-prod-public.elixir.xyz/public/deusd_apy',
|
|
20363
|
-
RSWETH: "https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr",
|
|
20364
|
-
YNETHX: "https://gateway.yieldnest.finance/api/v1/graphql",
|
|
20365
|
-
USDZEROPLUS: "https://app.usual.money/api/rewards/rates/USD0++",
|
|
20366
|
-
ETHZERO: "https://app.usual.money/api/rewards/rates/ETH0",
|
|
20367
|
-
JITOSOL: "https://www.jito.network/api/getJitoPoolStats/",
|
|
20368
|
-
THBILL: "https://thbill-api.theo.xyz/snapshots",
|
|
20369
|
-
YEARN_KATANA: "https://katana-apr-service.vercel.app/api/vaults",
|
|
20370
|
-
SSUPERUSD: "https://www.superreturn.ai/api/trpc/cmc.getUSDCPrice,rewardBackend.getYield,rewardBackend.getTvlChange?batch=1&input=%7B%220%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%221%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%222%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%7D",
|
|
20371
|
-
HBHYPE: "https://api.hyperbeat.org/api/v1/staking?address=0xCeaD893b162D38e714D82d06a7fe0b0dc3c38E0b",
|
|
20372
|
-
HBUHYPE: "https://app.hyperbeat.org/api/hyperfolio/vault-infos?vaultAddress=0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB",
|
|
20373
|
-
HLP: "https://api-ui.hyperliquid.xyz/info",
|
|
20374
|
-
HWHLP: "https://api.hyperwavefi.xyz/stats/latest?asset=hwhlp_999",
|
|
20375
|
-
YO: "https://api.yo.xyz/api/v1/vault/stats",
|
|
20376
|
-
GMX: "https://arbitrum-api.gmxinfra.io/apy?period=1d",
|
|
20377
|
-
SUSDX: "https://app.usdx.money/v1/base/apyInfo"
|
|
20378
|
-
};
|
|
20379
|
-
function averageDataLastN(arr, n = 7) {
|
|
20380
|
-
const last = arr.slice(-n);
|
|
20381
|
-
if (last.length === 0) return 0;
|
|
20382
|
-
return last.reduce((sum, x) => sum + x.data, 0) / last.length;
|
|
20383
|
-
}
|
|
20384
|
-
var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
|
|
20385
|
-
async function getDeltaTokenList(chain) {
|
|
20386
|
-
const data = await fetch(getListUrl(chain));
|
|
20387
|
-
const list = (await data.json()).list;
|
|
20388
|
-
return list;
|
|
20389
|
-
}
|
|
20390
|
-
async function getListsMulti(chainIds) {
|
|
20391
|
-
const ps = chainIds.map(async (chainId) => await getDeltaTokenList(chainId));
|
|
20392
|
-
const lists = await Promise.all(ps);
|
|
20393
|
-
let res = {};
|
|
20394
|
-
for (let i = 0; i < chainIds.length; i++) {
|
|
20395
|
-
const chainId = chainIds[i];
|
|
20396
|
-
res[chainId] = { list: lists[i] };
|
|
20501
|
+
// src/yields/fetchers/renzo.ts
|
|
20502
|
+
var EZETH_URL = "https://app.renzoprotocol.com/api/stats?chainId=1";
|
|
20503
|
+
var ezethFetcher = {
|
|
20504
|
+
label: "EZETH",
|
|
20505
|
+
fetch: async () => {
|
|
20506
|
+
const res = await fetch(EZETH_URL).then((r) => r.json());
|
|
20507
|
+
return { EZETH: Number(res.data.apr.data.rate) };
|
|
20397
20508
|
}
|
|
20398
|
-
|
|
20399
|
-
|
|
20400
|
-
|
|
20401
|
-
|
|
20402
|
-
|
|
20403
|
-
|
|
20404
|
-
|
|
20405
|
-
|
|
20509
|
+
};
|
|
20510
|
+
|
|
20511
|
+
// src/yields/fetchers/rocketpool.ts
|
|
20512
|
+
var RETH_URL = "https://api.rocketpool.net/api/mainnet/payload";
|
|
20513
|
+
var rethFetcher = {
|
|
20514
|
+
label: "RETH",
|
|
20515
|
+
fetch: async () => {
|
|
20516
|
+
const res = await fetch(RETH_URL).then((r) => r.json());
|
|
20517
|
+
return { RETH: Number(res.rethAPR) };
|
|
20406
20518
|
}
|
|
20407
20519
|
};
|
|
20408
|
-
|
|
20409
|
-
|
|
20410
|
-
|
|
20411
|
-
|
|
20412
|
-
|
|
20413
|
-
|
|
20414
|
-
|
|
20415
|
-
|
|
20416
|
-
});
|
|
20417
|
-
const rethPromise = safeFetch("RETH", async () => {
|
|
20418
|
-
const res = await fetch(FeedData.RETH).then((r) => r.json());
|
|
20419
|
-
return Number(res.rethAPR);
|
|
20420
|
-
});
|
|
20421
|
-
const weethPromise = safeFetch("WEETH", async () => {
|
|
20520
|
+
|
|
20521
|
+
// src/yields/fetchers/etherfi.ts
|
|
20522
|
+
var WEETH_URL = "https://www.ether.fi/api/apr";
|
|
20523
|
+
var WEETHS_URL = "https://api.sevenseas.capital/etherfi/ethereum/performance/0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88";
|
|
20524
|
+
var weeths = "Super Symbiotic LRT::weETHs";
|
|
20525
|
+
var createWeethFetcher = (wstethPromise) => ({
|
|
20526
|
+
label: "WEETH",
|
|
20527
|
+
fetch: async () => {
|
|
20422
20528
|
const wstethRes = await wstethPromise;
|
|
20529
|
+
const wstethVal = wstethRes?.WSTETH ?? 0;
|
|
20423
20530
|
let aYield = 0;
|
|
20424
20531
|
try {
|
|
20425
|
-
const weethRes = await fetch(
|
|
20532
|
+
const weethRes = await fetch(WEETH_URL).then((r) => r.json());
|
|
20426
20533
|
aYield = Number(weethRes.lrt2Apr);
|
|
20427
20534
|
} catch (e) {
|
|
20428
20535
|
aYield = 0.5;
|
|
20429
20536
|
}
|
|
20430
|
-
return aYield +
|
|
20431
|
-
}
|
|
20432
|
-
|
|
20433
|
-
|
|
20434
|
-
|
|
20435
|
-
|
|
20436
|
-
const res = await fetch(
|
|
20437
|
-
return
|
|
20438
|
-
}
|
|
20439
|
-
|
|
20440
|
-
|
|
20441
|
-
|
|
20442
|
-
|
|
20443
|
-
|
|
20444
|
-
|
|
20445
|
-
|
|
20446
|
-
|
|
20447
|
-
|
|
20448
|
-
|
|
20449
|
-
|
|
20450
|
-
|
|
20451
|
-
|
|
20452
|
-
|
|
20453
|
-
|
|
20454
|
-
|
|
20455
|
-
|
|
20456
|
-
|
|
20457
|
-
}
|
|
20458
|
-
});
|
|
20459
|
-
const hbhypePromise = safeFetch("HBHYPE", async () => {
|
|
20460
|
-
try {
|
|
20461
|
-
const response = await fetch(FeedData.HBHYPE);
|
|
20462
|
-
if (!response.ok) {
|
|
20463
|
-
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
20464
|
-
}
|
|
20465
|
-
const result = await response.json();
|
|
20466
|
-
if (!result.success || !result.data || !Array.isArray(result.data.delegations)) {
|
|
20467
|
-
throw new Error("Invalid response structure");
|
|
20468
|
-
}
|
|
20469
|
-
const delegations = result.data.delegations;
|
|
20470
|
-
const totalApr = delegations.reduce(
|
|
20471
|
-
(sum, validator) => sum + Number(validator.apr ?? 0),
|
|
20472
|
-
0
|
|
20473
|
-
);
|
|
20474
|
-
const averageApr = totalApr / delegations.length;
|
|
20475
|
-
return averageApr;
|
|
20476
|
-
} catch (e) {
|
|
20477
|
-
return 0;
|
|
20478
|
-
}
|
|
20479
|
-
});
|
|
20480
|
-
const hbuhypePromise = safeFetch("HBUHYPE", async () => {
|
|
20537
|
+
return { WEETH: aYield + wstethVal };
|
|
20538
|
+
}
|
|
20539
|
+
});
|
|
20540
|
+
var weethsFetcher = {
|
|
20541
|
+
label: "WEETHS",
|
|
20542
|
+
fetch: async () => {
|
|
20543
|
+
const res = await fetch(WEETHS_URL).then((r) => r.json());
|
|
20544
|
+
return { [weeths]: apyToApr(res.Response.apy) * 100 };
|
|
20545
|
+
}
|
|
20546
|
+
};
|
|
20547
|
+
|
|
20548
|
+
// src/yields/fetchers/mantle.ts
|
|
20549
|
+
var METH_URL = "https://meth.mantle.xyz/api/stats/apy";
|
|
20550
|
+
var methFetcher = {
|
|
20551
|
+
label: "METH",
|
|
20552
|
+
fetch: async () => {
|
|
20553
|
+
const res = await fetch(METH_URL).then((r) => r.json());
|
|
20554
|
+
const apr = apyToApr(Number(res.data[0]?.OneDayAPY)) * 100;
|
|
20555
|
+
return { METH: apr, CMETH: apr };
|
|
20556
|
+
}
|
|
20557
|
+
};
|
|
20558
|
+
|
|
20559
|
+
// src/yields/fetchers/ethena.ts
|
|
20560
|
+
var SUSDE_URL = "https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df";
|
|
20561
|
+
var susdeFetcher = {
|
|
20562
|
+
label: "SUSDE",
|
|
20563
|
+
fetch: async () => {
|
|
20481
20564
|
try {
|
|
20482
|
-
const
|
|
20483
|
-
|
|
20484
|
-
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
20485
|
-
}
|
|
20486
|
-
const result = await response.json();
|
|
20487
|
-
const apy = result.currentAPY?.apy_1d ?? 0;
|
|
20488
|
-
return apyToAprPercent(apy);
|
|
20565
|
+
const res = await fetch(SUSDE_URL).then((r) => r.json());
|
|
20566
|
+
return { SUSDE: apyToAprPercent(res?.data[0]?.apy ?? 0) };
|
|
20489
20567
|
} catch (e) {
|
|
20490
|
-
return 0;
|
|
20568
|
+
return { SUSDE: 0 };
|
|
20491
20569
|
}
|
|
20492
|
-
}
|
|
20493
|
-
|
|
20570
|
+
}
|
|
20571
|
+
};
|
|
20572
|
+
|
|
20573
|
+
// src/yields/fetchers/stader.ts
|
|
20574
|
+
var MATICX_URL = "https://universe.staderlabs.com/polygon/apy";
|
|
20575
|
+
var ETHX_URL = "https://universe.staderlabs.com/eth/apy";
|
|
20576
|
+
var ethX = "Stader ETHx::ETHx";
|
|
20577
|
+
var maticxFetcher = {
|
|
20578
|
+
label: "MATICX",
|
|
20579
|
+
fetch: async () => {
|
|
20580
|
+
const res = await fetch(MATICX_URL).then((r) => r.json());
|
|
20581
|
+
return { MATICX: Number(res.value) * 0.9 };
|
|
20582
|
+
}
|
|
20583
|
+
};
|
|
20584
|
+
var ethxFetcher = {
|
|
20585
|
+
label: "ETHX",
|
|
20586
|
+
fetch: async () => {
|
|
20587
|
+
const res = await fetch(ETHX_URL).then((r) => r.json());
|
|
20588
|
+
return { [ethX]: apyToAprPercent(res.value) };
|
|
20589
|
+
}
|
|
20590
|
+
};
|
|
20591
|
+
|
|
20592
|
+
// src/yields/fetchers/savax.ts
|
|
20593
|
+
var SAVAX_URL = "https://api.benqi.fi/liquidstaking/apr";
|
|
20594
|
+
var savaxFetcher = {
|
|
20595
|
+
label: "SAVAX",
|
|
20596
|
+
fetch: async () => {
|
|
20597
|
+
const res = await fetch(SAVAX_URL).then((r) => r.json());
|
|
20598
|
+
return { SAVAX: Number(res.apr) * 100 };
|
|
20599
|
+
}
|
|
20600
|
+
};
|
|
20601
|
+
|
|
20602
|
+
// src/yields/fetchers/coinbase.ts
|
|
20603
|
+
var CBETH_URL = "https://api.exchange.coinbase.com/wrapped-assets/cbeth";
|
|
20604
|
+
var cbethFetcher = {
|
|
20605
|
+
label: "CBETH",
|
|
20606
|
+
fetch: async () => {
|
|
20494
20607
|
try {
|
|
20495
|
-
const res = await fetch(
|
|
20496
|
-
|
|
20497
|
-
|
|
20608
|
+
const res = await fetch(CBETH_URL, {
|
|
20609
|
+
headers: {
|
|
20610
|
+
"User-Agent": "1delta/yields",
|
|
20611
|
+
"Content-Type": "application/json"
|
|
20612
|
+
}
|
|
20498
20613
|
}).then((r) => r.json());
|
|
20499
|
-
return apyToAprPercent(res
|
|
20614
|
+
return { CBETH: apyToAprPercent(res.apy) * 100 };
|
|
20500
20615
|
} catch (e) {
|
|
20501
|
-
|
|
20616
|
+
console.log("CBETH failed", e);
|
|
20617
|
+
return { CBETH: 0 };
|
|
20502
20618
|
}
|
|
20503
|
-
}
|
|
20504
|
-
|
|
20505
|
-
|
|
20506
|
-
|
|
20507
|
-
|
|
20508
|
-
|
|
20509
|
-
|
|
20510
|
-
|
|
20511
|
-
|
|
20512
|
-
|
|
20513
|
-
|
|
20514
|
-
|
|
20515
|
-
|
|
20516
|
-
|
|
20517
|
-
|
|
20518
|
-
|
|
20519
|
-
|
|
20520
|
-
|
|
20521
|
-
const
|
|
20522
|
-
|
|
20523
|
-
|
|
20524
|
-
|
|
20525
|
-
|
|
20526
|
-
|
|
20527
|
-
|
|
20528
|
-
|
|
20529
|
-
|
|
20530
|
-
|
|
20531
|
-
|
|
20532
|
-
|
|
20533
|
-
let map = {};
|
|
20534
|
-
Object.entries(res).forEach(([addr, data2]) => {
|
|
20535
|
-
const key = addressToAssetYearn[addr.toLowerCase()];
|
|
20536
|
-
if (key) {
|
|
20537
|
-
const apr = ((data2.apr.netAPR ?? 0) + (data2.apr.extra.extrinsicYield ?? 0) + (data2.apr.extra.katanaNativeYield ?? 0)) * 100;
|
|
20538
|
-
map[key] = apr;
|
|
20539
|
-
}
|
|
20540
|
-
});
|
|
20541
|
-
return map;
|
|
20542
|
-
});
|
|
20543
|
-
const osEthPromise = safeFetch("OSETH", async () => {
|
|
20544
|
-
const res = await fetch(FeedData.OSETH, {
|
|
20619
|
+
}
|
|
20620
|
+
};
|
|
20621
|
+
|
|
20622
|
+
// src/yields/fetchers/kelp.ts
|
|
20623
|
+
var RSETH_URL = "https://universe.kelpdao.xyz/rseth/totalApy";
|
|
20624
|
+
var rsethFetcher = {
|
|
20625
|
+
label: "RSETH",
|
|
20626
|
+
fetch: async () => {
|
|
20627
|
+
const res = await fetch(RSETH_URL).then((r) => r.json());
|
|
20628
|
+
return { RSETH: apyToAprPercent(res.totalAPY) };
|
|
20629
|
+
}
|
|
20630
|
+
};
|
|
20631
|
+
|
|
20632
|
+
// src/yields/fetchers/trufin.ts
|
|
20633
|
+
var TRUMATIC_URL = "https://api.trufin.io/staker/apy?staker=MATIC";
|
|
20634
|
+
var trumaticFetcher = {
|
|
20635
|
+
label: "TRUMATIC",
|
|
20636
|
+
fetch: async () => {
|
|
20637
|
+
const res = await fetch(TRUMATIC_URL).then((r) => r.json());
|
|
20638
|
+
return { TRUMATIC: apyToAprPercent(res.apy) };
|
|
20639
|
+
}
|
|
20640
|
+
};
|
|
20641
|
+
|
|
20642
|
+
// src/yields/fetchers/stakewise.ts
|
|
20643
|
+
var OSETH_URL = "https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy";
|
|
20644
|
+
var osETH = "StakeWise Staked ETH::OSETH";
|
|
20645
|
+
var osethFetcher = {
|
|
20646
|
+
label: "OSETH",
|
|
20647
|
+
fetch: async () => {
|
|
20648
|
+
const res = await fetch(OSETH_URL, {
|
|
20545
20649
|
method: "POST",
|
|
20546
20650
|
headers: { Accept: "application/json" },
|
|
20547
20651
|
body: JSON.stringify({
|
|
@@ -20549,10 +20653,17 @@ var fetchGeneralYields = async () => {
|
|
|
20549
20653
|
operationName: "osTokenApy"
|
|
20550
20654
|
})
|
|
20551
20655
|
}).then((r) => r.json());
|
|
20552
|
-
return apyToAprPercent(res.data?.osTokens?.[0]?.apy);
|
|
20553
|
-
}
|
|
20554
|
-
|
|
20555
|
-
|
|
20656
|
+
return { [osETH]: apyToAprPercent(res.data?.osTokens?.[0]?.apy) };
|
|
20657
|
+
}
|
|
20658
|
+
};
|
|
20659
|
+
|
|
20660
|
+
// src/yields/fetchers/yieldnest.ts
|
|
20661
|
+
var YNETHX_URL = "https://gateway.yieldnest.finance/api/v1/graphql";
|
|
20662
|
+
var ynethx = "ynETH MAX::YNETHX";
|
|
20663
|
+
var ynethxFetcher = {
|
|
20664
|
+
label: "YNETHX",
|
|
20665
|
+
fetch: async () => {
|
|
20666
|
+
const res = await fetch(YNETHX_URL, {
|
|
20556
20667
|
method: "POST",
|
|
20557
20668
|
headers: {
|
|
20558
20669
|
Accept: "application/json",
|
|
@@ -20567,374 +20678,672 @@ var fetchGeneralYields = async () => {
|
|
|
20567
20678
|
})
|
|
20568
20679
|
}).then((r) => r.json());
|
|
20569
20680
|
const dat = res?.data?.getLRTsData?.tokens.find((x) => x.token === "ynETHx")?.blockchains?.find((b) => b.chainId === 1)?.apr?.apr31d;
|
|
20570
|
-
return Number(dat ?? 0);
|
|
20571
|
-
}
|
|
20572
|
-
|
|
20573
|
-
|
|
20574
|
-
|
|
20575
|
-
|
|
20576
|
-
|
|
20577
|
-
|
|
20578
|
-
|
|
20579
|
-
|
|
20580
|
-
const res = await fetch(
|
|
20681
|
+
return { [ynethx]: Number(dat ?? 0) };
|
|
20682
|
+
}
|
|
20683
|
+
};
|
|
20684
|
+
|
|
20685
|
+
// src/yields/fetchers/puffer.ts
|
|
20686
|
+
var PUFETH_URL = "https://api-v2.puffer.fi/backend-for-frontend/tvl/all";
|
|
20687
|
+
var pufEth = "PUFETH";
|
|
20688
|
+
var pufethFetcher = {
|
|
20689
|
+
label: "PUFETH",
|
|
20690
|
+
fetch: async () => {
|
|
20691
|
+
const res = await fetch(PUFETH_URL, {
|
|
20581
20692
|
method: "GET",
|
|
20582
20693
|
headers: { Accept: "application/json" }
|
|
20583
20694
|
}).then((r) => r.json());
|
|
20584
|
-
return
|
|
20585
|
-
}
|
|
20586
|
-
|
|
20587
|
-
|
|
20588
|
-
|
|
20589
|
-
|
|
20590
|
-
|
|
20591
|
-
|
|
20592
|
-
|
|
20593
|
-
|
|
20594
|
-
|
|
20595
|
-
const res = await fetch(FeedData.ETHZERO, {
|
|
20695
|
+
return { [pufEth]: apyToAprPercent(res.apy) };
|
|
20696
|
+
}
|
|
20697
|
+
};
|
|
20698
|
+
|
|
20699
|
+
// src/yields/fetchers/sky.ts
|
|
20700
|
+
var SUSDS_URL = "https://info-sky.blockanalitica.com/api/v1/overall/?format=json";
|
|
20701
|
+
var sUsds = "sUSDS::SUSDS";
|
|
20702
|
+
var susdsFetcher = {
|
|
20703
|
+
label: "SUSDS",
|
|
20704
|
+
fetch: async () => {
|
|
20705
|
+
const res = await fetch(SUSDS_URL, {
|
|
20596
20706
|
method: "GET",
|
|
20597
20707
|
headers: { Accept: "application/json" }
|
|
20598
20708
|
}).then((r) => r.json());
|
|
20599
|
-
return
|
|
20600
|
-
|
|
20601
|
-
|
|
20602
|
-
|
|
20709
|
+
return {
|
|
20710
|
+
[sUsds]: apyToApr(Number(res?.[0]?.sky_savings_rate_apy ?? 0)) * 100
|
|
20711
|
+
};
|
|
20712
|
+
}
|
|
20713
|
+
};
|
|
20714
|
+
|
|
20715
|
+
// src/yields/fetchers/reservoir.ts
|
|
20716
|
+
var SRUSD_URL = "https://app.reservoir.xyz/api/website";
|
|
20717
|
+
var srUsd = "Reservoir srUSD::SRUSD";
|
|
20718
|
+
var wsrusd = "Wrapped Savings rUSD::WSRUSD";
|
|
20719
|
+
var srusdFetcher = {
|
|
20720
|
+
label: "SRUSD",
|
|
20721
|
+
fetch: async () => {
|
|
20722
|
+
const res = await fetch(SRUSD_URL, {
|
|
20603
20723
|
method: "GET",
|
|
20604
20724
|
headers: { Accept: "application/json" }
|
|
20605
20725
|
}).then((r) => r.json());
|
|
20606
|
-
const
|
|
20607
|
-
const yoETH = datas.find((a) => a.id === "yoETH").yield?.["1d"];
|
|
20608
|
-
const yoBTC = datas.find((a) => a.id === "yoBTC").yield?.["1d"];
|
|
20609
|
-
const yoUSD = datas.find((a) => a.id === "yoUSD").yield?.["1d"];
|
|
20610
|
-
const yoEUR = datas.find((a) => a.id === "yoEUR").yield?.["1d"];
|
|
20726
|
+
const apr = apyToAprPercent(Number(res?.srusdApy ?? 0));
|
|
20611
20727
|
return {
|
|
20612
|
-
[
|
|
20613
|
-
[
|
|
20614
|
-
[yousd]: apyToAprPercent(yoUSD),
|
|
20615
|
-
[yoeur]: apyToAprPercent(yoEUR)
|
|
20728
|
+
[srUsd]: apr,
|
|
20729
|
+
[wsrusd]: apr
|
|
20616
20730
|
};
|
|
20617
|
-
}
|
|
20618
|
-
|
|
20619
|
-
|
|
20731
|
+
}
|
|
20732
|
+
};
|
|
20733
|
+
|
|
20734
|
+
// src/yields/fetchers/yieldfi.ts
|
|
20735
|
+
var YUSD_URL = "https://ctrl.yield.fi/t/yusd/apy";
|
|
20736
|
+
var yusd = "YieldFi yUSD::yUSD";
|
|
20737
|
+
var yusdFetcher = {
|
|
20738
|
+
label: "YUSD",
|
|
20739
|
+
fetch: async () => {
|
|
20740
|
+
const res = await fetch(YUSD_URL, {
|
|
20620
20741
|
method: "GET",
|
|
20621
20742
|
headers: { Accept: "application/json" }
|
|
20622
20743
|
}).then((r) => r.json());
|
|
20623
|
-
|
|
20624
|
-
|
|
20625
|
-
|
|
20626
|
-
|
|
20627
|
-
|
|
20628
|
-
|
|
20629
|
-
|
|
20630
|
-
|
|
20631
|
-
|
|
20632
|
-
|
|
20633
|
-
|
|
20634
|
-
|
|
20635
|
-
|
|
20636
|
-
rData[glv_weth_usdc] = apyToApr(d.apy) * 100;
|
|
20637
|
-
});
|
|
20638
|
-
return rData;
|
|
20639
|
-
});
|
|
20640
|
-
const susdsPromise = safeFetch("SUSDS", async () => {
|
|
20641
|
-
const res = await fetch(FeedData.SUSDS, {
|
|
20642
|
-
method: "GET",
|
|
20643
|
-
headers: { Accept: "application/json" }
|
|
20644
|
-
}).then((r) => r.json());
|
|
20645
|
-
return apyToApr(Number(res?.[0]?.sky_savings_rate_apy ?? 0)) * 100;
|
|
20646
|
-
});
|
|
20647
|
-
const srusdPromise = safeFetch("SRUSD", async () => {
|
|
20648
|
-
const res = await fetch(FeedData.SRUSD, {
|
|
20649
|
-
method: "GET",
|
|
20650
|
-
headers: { Accept: "application/json" }
|
|
20651
|
-
}).then((r) => r.json());
|
|
20652
|
-
return apyToAprPercent(Number(res?.srusdApy ?? 0));
|
|
20653
|
-
});
|
|
20654
|
-
const yusdPromise = safeFetch("YUSD", async () => {
|
|
20655
|
-
const res = await fetch(FeedData.YUSD, {
|
|
20656
|
-
method: "GET",
|
|
20657
|
-
headers: { Accept: "application/json" }
|
|
20658
|
-
}).then((r) => r.json());
|
|
20659
|
-
return apyToAprPercent(Number(res?.apy ?? 0));
|
|
20660
|
-
});
|
|
20661
|
-
const rlpPromise = safeFetch("RLP", async () => {
|
|
20662
|
-
const res = await fetch(FeedData.RLP, {
|
|
20744
|
+
return { [yusd]: apyToAprPercent(Number(res?.apy ?? 0)) };
|
|
20745
|
+
}
|
|
20746
|
+
};
|
|
20747
|
+
|
|
20748
|
+
// src/yields/fetchers/resolv.ts
|
|
20749
|
+
var RLP_URL = "https://api.resolv.xyz/apr/rlp/7d";
|
|
20750
|
+
var WSTUSR_URL = "https://api.resolv.xyz/apr/staking/7d";
|
|
20751
|
+
var rlp = "Resolv RLP::RLP";
|
|
20752
|
+
var wstusr = "Resolv wstUSR::WSTUSR";
|
|
20753
|
+
var rlpFetcher = {
|
|
20754
|
+
label: "RLP",
|
|
20755
|
+
fetch: async () => {
|
|
20756
|
+
const res = await fetch(RLP_URL, {
|
|
20663
20757
|
method: "GET",
|
|
20664
20758
|
headers: {
|
|
20665
20759
|
Accept: "application/json",
|
|
20666
20760
|
"User-Agent": "1delta/yields"
|
|
20667
20761
|
}
|
|
20668
20762
|
}).then((r) => r.json());
|
|
20669
|
-
return Number(res?.value ?? 0) * 100;
|
|
20670
|
-
}
|
|
20671
|
-
|
|
20672
|
-
|
|
20763
|
+
return { [rlp]: Number(res?.value ?? 0) * 100 };
|
|
20764
|
+
}
|
|
20765
|
+
};
|
|
20766
|
+
var wstusrFetcher = {
|
|
20767
|
+
label: "WSTUSR",
|
|
20768
|
+
fetch: async () => {
|
|
20769
|
+
const res = await fetch(WSTUSR_URL, {
|
|
20673
20770
|
method: "GET",
|
|
20674
20771
|
headers: {
|
|
20675
20772
|
Accept: "application/json",
|
|
20676
20773
|
"User-Agent": "1delta/yields"
|
|
20677
20774
|
}
|
|
20678
20775
|
}).then((r) => r.json());
|
|
20679
|
-
return Number(res?.value ?? 0) * 100;
|
|
20680
|
-
}
|
|
20681
|
-
|
|
20682
|
-
|
|
20776
|
+
return { [wstusr]: Number(res?.value ?? 0) * 100 };
|
|
20777
|
+
}
|
|
20778
|
+
};
|
|
20779
|
+
|
|
20780
|
+
// src/yields/fetchers/morphoVaults.ts
|
|
20781
|
+
var MORPHO_VAULTS_URL = "https://blue-api.morpho.org/graphql";
|
|
20782
|
+
var csusdl = "Coinshift USDL Morpho Vault::CSUSDL";
|
|
20783
|
+
var csusdlFetcher = {
|
|
20784
|
+
label: "CSUSDL",
|
|
20785
|
+
fetch: async () => {
|
|
20786
|
+
const res = await fetch(MORPHO_VAULTS_URL, {
|
|
20787
|
+
method: "POST",
|
|
20788
|
+
headers: { Accept: "application/json" },
|
|
20789
|
+
body: JSON.stringify({
|
|
20790
|
+
query: "query GetAllCurrentAPYFromVault($address: String!) {\n vaultByAddress(address: $address) {\n state {\n apy\n netApy\n }\n asset {\n yield {\n apr\n }\n }\n }\n}",
|
|
20791
|
+
variables: {
|
|
20792
|
+
address: "0xbEeFc011e94f43b8B7b455eBaB290C7Ab4E216f1"
|
|
20793
|
+
}
|
|
20794
|
+
})
|
|
20795
|
+
}).then((r) => r.json());
|
|
20796
|
+
const vba = res?.data?.vaultByAddress;
|
|
20797
|
+
return {
|
|
20798
|
+
[csusdl]: apyToAprPercent(vba.state.apy ?? 0) * 100 + (vba?.asset?.yield.apr ?? 0) * 100
|
|
20799
|
+
};
|
|
20800
|
+
}
|
|
20801
|
+
};
|
|
20802
|
+
|
|
20803
|
+
// src/yields/fetchers/swell.ts
|
|
20804
|
+
var RSWETH_URL = "https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr";
|
|
20805
|
+
var rsweth = "Restaked Swell ETH::RSWETH";
|
|
20806
|
+
var rswethFetcher = {
|
|
20807
|
+
label: "RSWETH",
|
|
20808
|
+
fetch: async () => {
|
|
20809
|
+
const res = await fetch(RSWETH_URL, {
|
|
20683
20810
|
method: "GET",
|
|
20684
20811
|
headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
|
|
20685
20812
|
}).then((r) => r.text());
|
|
20686
|
-
return Number(res) ?? 0;
|
|
20687
|
-
}
|
|
20688
|
-
|
|
20689
|
-
|
|
20813
|
+
return { [rsweth]: Number(res) ?? 0 };
|
|
20814
|
+
}
|
|
20815
|
+
};
|
|
20816
|
+
|
|
20817
|
+
// src/yields/fetchers/usual.ts
|
|
20818
|
+
var USDZEROPLUS_URL = "https://app.usual.money/api/rewards/rates/USD0++";
|
|
20819
|
+
var ETHZERO_URL = "https://app.usual.money/api/rewards/rates/ETH0";
|
|
20820
|
+
var usdZeroPlus = "Staked USD0::USD0++";
|
|
20821
|
+
var ethZero = "ETH0::ETH0";
|
|
20822
|
+
var usdZeroPlusFetcher = {
|
|
20823
|
+
label: "USDZEROPLUS",
|
|
20824
|
+
fetch: async () => {
|
|
20825
|
+
const res = await fetch(USDZEROPLUS_URL, {
|
|
20690
20826
|
method: "GET",
|
|
20691
20827
|
headers: { Accept: "application/json" }
|
|
20692
20828
|
}).then((r) => r.json());
|
|
20693
|
-
return Number(res
|
|
20694
|
-
}
|
|
20695
|
-
|
|
20696
|
-
|
|
20829
|
+
return { [usdZeroPlus]: Number(res?.rewards[0]?.apr ?? 0) * 100 };
|
|
20830
|
+
}
|
|
20831
|
+
};
|
|
20832
|
+
var ethZeroFetcher = {
|
|
20833
|
+
label: "ETHZERO",
|
|
20834
|
+
fetch: async () => {
|
|
20835
|
+
const res = await fetch(ETHZERO_URL, {
|
|
20836
|
+
method: "GET",
|
|
20837
|
+
headers: { Accept: "application/json" }
|
|
20838
|
+
}).then((r) => r.json());
|
|
20839
|
+
return { [ethZero]: Number(res?.rewards[0]?.apr ?? 0) * 100 };
|
|
20840
|
+
}
|
|
20841
|
+
};
|
|
20842
|
+
|
|
20843
|
+
// src/yields/fetchers/jito.ts
|
|
20844
|
+
var JITOSOL_URL = "https://www.jito.network/api/getJitoPoolStats/";
|
|
20845
|
+
var jitoSol = "Jito Staked SOL::JitoSOL";
|
|
20846
|
+
var jitoSolFetcher = {
|
|
20847
|
+
label: "JITOSOL",
|
|
20848
|
+
fetch: async () => {
|
|
20849
|
+
const res = await fetch(JITOSOL_URL, {
|
|
20850
|
+
method: "GET",
|
|
20851
|
+
headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
|
|
20852
|
+
}).then((r) => r.json());
|
|
20853
|
+
const val = averageDataLastN(res?.getStakePoolStats?.apy, 7);
|
|
20854
|
+
return { [jitoSol]: apyToApr(val) * 100 };
|
|
20855
|
+
}
|
|
20856
|
+
};
|
|
20857
|
+
|
|
20858
|
+
// src/yields/fetchers/theo.ts
|
|
20859
|
+
var THBILL_URL = "https://thbill-api.theo.xyz/snapshots";
|
|
20860
|
+
var thBill = "Theo Short Duration US Treasury Fund::THBILL";
|
|
20861
|
+
var thbillFetcher = {
|
|
20862
|
+
label: "THBILL",
|
|
20863
|
+
fetch: async () => {
|
|
20864
|
+
const res = await fetch(THBILL_URL).then((r) => r.json());
|
|
20865
|
+
const entrs = Object.values(res.history[0]?.composition ?? {}).flatMap(
|
|
20866
|
+
(a) => Object.entries(a)
|
|
20867
|
+
);
|
|
20868
|
+
const total = entrs.reduce((acc, b) => acc + Number(b[1]), 0);
|
|
20869
|
+
const val = entrs.filter((a) => a[0] === "ULTRA").reduce((acc, b) => acc + Number(b[1]), 0);
|
|
20870
|
+
return { [thBill]: val / total * 4.5 };
|
|
20871
|
+
}
|
|
20872
|
+
};
|
|
20873
|
+
|
|
20874
|
+
// src/yields/fetchers/superreturn.ts
|
|
20875
|
+
var SSUPERUSD_URL = "https://www.superreturn.ai/api/trpc/cmc.getUSDCPrice,rewardBackend.getYield,rewardBackend.getTvlChange?batch=1&input=%7B%220%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%221%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%222%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%7D";
|
|
20876
|
+
var ssuperusd = "SuperReturn sSuperUSD::SSUPERUSD";
|
|
20877
|
+
var ssuperusdFetcher = {
|
|
20878
|
+
label: "SSUPERUSD",
|
|
20879
|
+
fetch: async () => {
|
|
20880
|
+
try {
|
|
20881
|
+
const res = await fetch(SSUPERUSD_URL, {
|
|
20882
|
+
method: "GET",
|
|
20883
|
+
headers: { Accept: "application/json", "User-Agent": "1delta/yields" }
|
|
20884
|
+
}).then((r) => r.json());
|
|
20885
|
+
return { [ssuperusd]: apyToAprPercent(res?.[1]?.result.data.json ?? 0) };
|
|
20886
|
+
} catch (e) {
|
|
20887
|
+
return { [ssuperusd]: 0 };
|
|
20888
|
+
}
|
|
20889
|
+
}
|
|
20890
|
+
};
|
|
20891
|
+
|
|
20892
|
+
// src/yields/fetchers/hyperbeat.ts
|
|
20893
|
+
var HBHYPE_URL = "https://api.hyperbeat.org/api/v1/staking?address=0xCeaD893b162D38e714D82d06a7fe0b0dc3c38E0b";
|
|
20894
|
+
var HBUHYPE_URL = "https://app.hyperbeat.org/api/hyperfolio/vault-infos?vaultAddress=0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB";
|
|
20895
|
+
var hbhype = "hyperbeat x ether.fi HYPE::beHYPE";
|
|
20896
|
+
var hbuhype = "Hyperbeat Ultra Hype::hbHYPE";
|
|
20897
|
+
var hbhypeFetcher = {
|
|
20898
|
+
label: "HBHYPE",
|
|
20899
|
+
fetch: async () => {
|
|
20900
|
+
try {
|
|
20901
|
+
const response = await fetch(HBHYPE_URL);
|
|
20902
|
+
if (!response.ok) {
|
|
20903
|
+
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
20904
|
+
}
|
|
20905
|
+
const result = await response.json();
|
|
20906
|
+
if (!result.success || !result.data || !Array.isArray(result.data.delegations)) {
|
|
20907
|
+
throw new Error("Invalid response structure");
|
|
20908
|
+
}
|
|
20909
|
+
const delegations = result.data.delegations;
|
|
20910
|
+
const totalApr = delegations.reduce(
|
|
20911
|
+
(sum, validator) => sum + Number(validator.apr ?? 0),
|
|
20912
|
+
0
|
|
20913
|
+
);
|
|
20914
|
+
const averageApr = totalApr / delegations.length;
|
|
20915
|
+
return { [hbhype]: averageApr };
|
|
20916
|
+
} catch (e) {
|
|
20917
|
+
return { [hbhype]: 0 };
|
|
20918
|
+
}
|
|
20919
|
+
}
|
|
20920
|
+
};
|
|
20921
|
+
var hbuhypeFetcher = {
|
|
20922
|
+
label: "HBUHYPE",
|
|
20923
|
+
fetch: async () => {
|
|
20924
|
+
try {
|
|
20925
|
+
const response = await fetch(HBUHYPE_URL);
|
|
20926
|
+
if (!response.ok) {
|
|
20927
|
+
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
20928
|
+
}
|
|
20929
|
+
const result = await response.json();
|
|
20930
|
+
const apy = result.currentAPY?.apy_1d ?? 0;
|
|
20931
|
+
return { [hbuhype]: apyToAprPercent(apy) };
|
|
20932
|
+
} catch (e) {
|
|
20933
|
+
return { [hbuhype]: 0 };
|
|
20934
|
+
}
|
|
20935
|
+
}
|
|
20936
|
+
};
|
|
20937
|
+
|
|
20938
|
+
// src/yields/fetchers/hyperliquid.ts
|
|
20939
|
+
var HLP_URL = "https://api-ui.hyperliquid.xyz/info";
|
|
20940
|
+
var HWHLP_URL = "https://api.hyperwavefi.xyz/stats/latest?asset=hwhlp_999";
|
|
20941
|
+
var hlp = "Wrapped HLP::WHLP";
|
|
20942
|
+
var hwhlp = "Hyperwave HLP::hwHLP";
|
|
20943
|
+
var hlpFetcher = {
|
|
20944
|
+
label: "HLP",
|
|
20945
|
+
fetch: async () => {
|
|
20946
|
+
const res = await fetch(HLP_URL, {
|
|
20697
20947
|
method: "POST",
|
|
20698
|
-
headers: {
|
|
20948
|
+
headers: {
|
|
20949
|
+
Accept: "application/json",
|
|
20950
|
+
"Content-Type": "application/json"
|
|
20951
|
+
},
|
|
20699
20952
|
body: JSON.stringify({
|
|
20700
|
-
|
|
20701
|
-
|
|
20702
|
-
|
|
20953
|
+
type: "vaultDetails",
|
|
20954
|
+
vaultAddress: "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"
|
|
20955
|
+
})
|
|
20956
|
+
}).then((r) => r.json());
|
|
20957
|
+
let calculated;
|
|
20958
|
+
try {
|
|
20959
|
+
const p = res.portfolio[0][1];
|
|
20960
|
+
const val = p.accountValueHistory[p.accountValueHistory.length - 1][1];
|
|
20961
|
+
const pnl = p.pnlHistory[p.pnlHistory.length - 1][1];
|
|
20962
|
+
calculated = pnl / val * 100;
|
|
20963
|
+
} catch {
|
|
20964
|
+
calculated = (res?.apr ?? 0) * 100;
|
|
20965
|
+
}
|
|
20966
|
+
return { [hlp]: calculated };
|
|
20967
|
+
}
|
|
20968
|
+
};
|
|
20969
|
+
var hwhlpFetcher = {
|
|
20970
|
+
label: "HWHLP",
|
|
20971
|
+
fetch: async () => {
|
|
20972
|
+
const res = await fetch(HWHLP_URL, {
|
|
20973
|
+
method: "GET",
|
|
20974
|
+
headers: { Accept: "application/json" }
|
|
20975
|
+
}).then((r) => r.json());
|
|
20976
|
+
return { [hwhlp]: Number(res.data?.apr_1d ?? 0) };
|
|
20977
|
+
}
|
|
20978
|
+
};
|
|
20979
|
+
|
|
20980
|
+
// src/yields/fetchers/usdx.ts
|
|
20981
|
+
var SUSDX_URL = "https://app.usdx.money/v1/base/apyInfo";
|
|
20982
|
+
var susdx = "SUSDX";
|
|
20983
|
+
var susdxFetcher = {
|
|
20984
|
+
label: "SUSDX",
|
|
20985
|
+
fetch: async () => {
|
|
20986
|
+
const res = await fetch(SUSDX_URL).then((r) => r.json());
|
|
20987
|
+
return { [susdx]: apyToApr(res.result.susdxApy) * 100 };
|
|
20988
|
+
}
|
|
20989
|
+
};
|
|
20990
|
+
|
|
20991
|
+
// src/yields/fetchers/reserve.ts
|
|
20992
|
+
var RTOKENS_URL = "https://yields.reserve.org/pools";
|
|
20993
|
+
var hyUSD = "High Yield USD Base::HYUSD";
|
|
20994
|
+
var bsdETH = "Based ETH::BSDETH";
|
|
20995
|
+
var ethPlus = "ETHPlus::ETH+";
|
|
20996
|
+
var woEth = "Wrapped OETH::WOETH";
|
|
20997
|
+
var sfrxeth = "Staked Frax Ether::sfrxETH";
|
|
20998
|
+
var ceth = "cETH::CETH";
|
|
20999
|
+
var sfrax = "Staked FRAX::SFRAX";
|
|
21000
|
+
var usdThree = "Web 3 Dollar::USD3";
|
|
21001
|
+
var rtokensFetcher = {
|
|
21002
|
+
label: "RTOKENS",
|
|
21003
|
+
fetch: async () => {
|
|
21004
|
+
const res = await fetch(RTOKENS_URL).then((r) => r.json());
|
|
21005
|
+
const data = res.rtokens["8453"];
|
|
21006
|
+
const dataMainnet = res.rtokens["1"];
|
|
21007
|
+
const dataMainnetColalterals = res.collaterals["1"];
|
|
21008
|
+
return {
|
|
21009
|
+
[bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
|
|
21010
|
+
[hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
|
|
21011
|
+
[sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
|
|
21012
|
+
[sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
|
|
21013
|
+
[ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
|
|
21014
|
+
[ethPlus]: apyToAprPercent(dataMainnet["ETH+"] / 100) * 100,
|
|
21015
|
+
[usdThree]: apyToAprPercent(dataMainnet["USD3"] / 100) * 100,
|
|
21016
|
+
[woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100
|
|
21017
|
+
};
|
|
21018
|
+
}
|
|
21019
|
+
};
|
|
21020
|
+
|
|
21021
|
+
// src/yields/fetchers/hyperlend.ts
|
|
21022
|
+
var HYPE_URL = "https://api.hyperlend.finance/data/nativeApy";
|
|
21023
|
+
var wstHype = "Staked HYPE Shares::WSTHYPE";
|
|
21024
|
+
var kHYPE = "Kinetiq Staked HYPE::kHYPE";
|
|
21025
|
+
var hypeFetcher = {
|
|
21026
|
+
label: "HYPE",
|
|
21027
|
+
fetch: async () => {
|
|
21028
|
+
const res = await fetch(HYPE_URL).then((r) => r.json());
|
|
21029
|
+
return {
|
|
21030
|
+
[wstHype]: res.wstHYPE.latestApr,
|
|
21031
|
+
[kHYPE]: res.kHYPE.latestApr
|
|
21032
|
+
};
|
|
21033
|
+
}
|
|
21034
|
+
};
|
|
21035
|
+
|
|
21036
|
+
// src/yields/fetchers/angle.ts
|
|
21037
|
+
var ANGLE_URL = "https://exporter.angle.money/v2/savingsApr";
|
|
21038
|
+
var stUSD = "Angle Staked USDA::stUSD";
|
|
21039
|
+
var stEur = "Angle Staked EURA::stEUR";
|
|
21040
|
+
var angleFetcher = {
|
|
21041
|
+
label: "ANGLE",
|
|
21042
|
+
fetch: async () => {
|
|
21043
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
21044
|
+
const nowMinusWeek = now - 7 * 24 * 3600;
|
|
21045
|
+
const res = await fetch(
|
|
21046
|
+
ANGLE_URL + `?from=${nowMinusWeek}&to=${now}`
|
|
21047
|
+
).then((r) => r.json());
|
|
21048
|
+
return {
|
|
21049
|
+
[stEur]: apyToAprPercent(res.EURA) * 100,
|
|
21050
|
+
[stUSD]: apyToAprPercent(res.USDA) * 100
|
|
21051
|
+
};
|
|
21052
|
+
}
|
|
21053
|
+
};
|
|
21054
|
+
|
|
21055
|
+
// src/yields/yieldTypes.ts
|
|
21056
|
+
var addressToAssetYearn = {
|
|
21057
|
+
"0xe007ca01894c863d7898045ed5a3b4abf0b18f37": "vbETH yVault::yvvbETH",
|
|
21058
|
+
"0x80c34bd3a3569e126e7055831036aa7b212cb159": "vbUSDC yVault::yvvbUSDC",
|
|
21059
|
+
"0x9a6bd7b6fd5c4f87eb66356441502fc7dcdd185b": "vbUSDT yVault::yvvbUSDT",
|
|
21060
|
+
"0xaa0362ecc584b985056e47812931270b99c91f9d": "vbWBTC yVault::yvvbWBTC",
|
|
21061
|
+
"0x93fec6639717b6215a48e5a72a162c50dcc40d68": "vbAUSD yVault::yvvbAUSD"
|
|
21062
|
+
};
|
|
21063
|
+
|
|
21064
|
+
// src/yields/fetchers/yearnKatana.ts
|
|
21065
|
+
var YEARN_KATANA_URL = "https://katana-apr-service.vercel.app/api/vaults";
|
|
21066
|
+
var yearnKatanaFetcher = {
|
|
21067
|
+
label: "YEARN_KATANA",
|
|
21068
|
+
fetch: async () => {
|
|
21069
|
+
const res = await fetch(
|
|
21070
|
+
YEARN_KATANA_URL
|
|
21071
|
+
).then((r) => r.json());
|
|
21072
|
+
let map = {};
|
|
21073
|
+
Object.entries(res).forEach(([addr, data]) => {
|
|
21074
|
+
const key = addressToAssetYearn[addr.toLowerCase()];
|
|
21075
|
+
if (key) {
|
|
21076
|
+
const apr = ((data.apr.netAPR ?? 0) + (data.apr.extra.extrinsicYield ?? 0) + (data.apr.extra.katanaNativeYield ?? 0)) * 100;
|
|
21077
|
+
map[key] = apr;
|
|
21078
|
+
}
|
|
21079
|
+
});
|
|
21080
|
+
return map;
|
|
21081
|
+
}
|
|
21082
|
+
};
|
|
21083
|
+
|
|
21084
|
+
// src/yields/fetchers/yoProtocol.ts
|
|
21085
|
+
var YO_URL = "https://api.yo.xyz/api/v1/vault/stats";
|
|
21086
|
+
var yoeth = "Yield Optimizer ETH::YOETH";
|
|
21087
|
+
var yobtc = "Yield Optimizer BTC::YOBTC";
|
|
21088
|
+
var yousd = "Yield Optimizer USD::YOUSD";
|
|
21089
|
+
var yoeur = "Yield Optimizer EUR::yoEUR";
|
|
21090
|
+
var yoFetcher = {
|
|
21091
|
+
label: "YO",
|
|
21092
|
+
fetch: async () => {
|
|
21093
|
+
const res = await fetch(YO_URL, {
|
|
21094
|
+
method: "GET",
|
|
21095
|
+
headers: { Accept: "application/json" }
|
|
21096
|
+
}).then((r) => r.json());
|
|
21097
|
+
const datas = res?.data;
|
|
21098
|
+
const yoETH = datas.find((a) => a.id === "yoETH").yield?.["1d"];
|
|
21099
|
+
const yoBTC = datas.find((a) => a.id === "yoBTC").yield?.["1d"];
|
|
21100
|
+
const yoUSD = datas.find((a) => a.id === "yoUSD").yield?.["1d"];
|
|
21101
|
+
const yoEUR = datas.find((a) => a.id === "yoEUR").yield?.["1d"];
|
|
21102
|
+
return {
|
|
21103
|
+
[yoeth]: apyToAprPercent(yoETH),
|
|
21104
|
+
[yobtc]: apyToAprPercent(yoBTC),
|
|
21105
|
+
[yousd]: apyToAprPercent(yoUSD),
|
|
21106
|
+
[yoeur]: apyToAprPercent(yoEUR)
|
|
21107
|
+
};
|
|
21108
|
+
}
|
|
21109
|
+
};
|
|
21110
|
+
|
|
21111
|
+
// src/yields/fetchers/gmx.ts
|
|
21112
|
+
var GMX_URL = "https://arbitrum-api.gmxinfra.io/apy?period=1d";
|
|
21113
|
+
var gmx_eth_usd = "GMX Market ETH/USD::GM [WETH-USDC]";
|
|
21114
|
+
var gmx_btc_usd = "GMX Market BTC/USD::GM [WBTC-USDC]";
|
|
21115
|
+
var glv_wbtc_usdc = "GMX Liquidity Vault [WBTC-USDC]::GLV [WBTC-USDC]";
|
|
21116
|
+
var glv_weth_usdc = "GMX Liquidity Vault [WETH-USDC]::GLV [WETH-USDC]";
|
|
21117
|
+
var gmx_eth_usd_address = "0x70d95587d40a2caf56bd97485ab3eec10bee6336";
|
|
21118
|
+
var gmx_btc_usd_address = "0x47c031236e19d024b42f8ae6780e44a573170703";
|
|
21119
|
+
var glv_wbtc_usdc_address = "0xdf03eed325b82bc1d4db8b49c30ecc9e05104b96";
|
|
21120
|
+
var glv_weth_usdc_address = "0x528a5bac7e746c9a509a1f4f6df58a03d44279f9";
|
|
21121
|
+
var gmxFetcher = {
|
|
21122
|
+
label: "GMX",
|
|
21123
|
+
fetch: async () => {
|
|
21124
|
+
const res = await fetch(GMX_URL, {
|
|
21125
|
+
method: "GET",
|
|
21126
|
+
headers: { Accept: "application/json" }
|
|
21127
|
+
}).then((r) => r.json());
|
|
21128
|
+
let rData = {};
|
|
21129
|
+
const markets = res.markets;
|
|
21130
|
+
Object.entries(markets).forEach(([m, d]) => {
|
|
21131
|
+
if (m.toLowerCase() === gmx_eth_usd_address)
|
|
21132
|
+
rData[gmx_eth_usd] = apyToApr(d.apy) * 100;
|
|
21133
|
+
if (m.toLowerCase() === gmx_btc_usd_address)
|
|
21134
|
+
rData[gmx_btc_usd] = apyToApr(d.apy) * 100;
|
|
21135
|
+
});
|
|
21136
|
+
const glvs = res.glvs;
|
|
21137
|
+
Object.entries(glvs).forEach(([m, d]) => {
|
|
21138
|
+
if (m.toLowerCase() === glv_wbtc_usdc_address)
|
|
21139
|
+
rData[glv_wbtc_usdc] = apyToApr(d.apy) * 100;
|
|
21140
|
+
if (m.toLowerCase() === glv_weth_usdc_address)
|
|
21141
|
+
rData[glv_weth_usdc] = apyToApr(d.apy) * 100;
|
|
21142
|
+
});
|
|
21143
|
+
return rData;
|
|
21144
|
+
}
|
|
21145
|
+
};
|
|
21146
|
+
|
|
21147
|
+
// src/prices/pendle/fetchPendlePrices.ts
|
|
21148
|
+
var PENDLE_API_BASE = "https://api-v2.pendle.finance/core";
|
|
21149
|
+
var MARKETS_ENDPOINT = `${PENDLE_API_BASE}/v1/markets/all`;
|
|
21150
|
+
var PRICES_ENDPOINT = (types) => `${PENDLE_API_BASE}/v1/prices/assets${types ? `?type=${types.join(",")}` : ""}`;
|
|
21151
|
+
async function fetchPendleMarkets() {
|
|
21152
|
+
try {
|
|
21153
|
+
const response = await fetch(MARKETS_ENDPOINT);
|
|
21154
|
+
if (!response.ok) {
|
|
21155
|
+
throw new Error(`Failed to fetch all markets data: ${response.status}`);
|
|
21156
|
+
}
|
|
21157
|
+
const data = await response.json();
|
|
21158
|
+
const marketsByChain = {};
|
|
21159
|
+
if (data.markets) {
|
|
21160
|
+
for (const market of data.markets) {
|
|
21161
|
+
const chainId = market.chainId.toString();
|
|
21162
|
+
if (!marketsByChain[chainId]) {
|
|
21163
|
+
marketsByChain[chainId] = [];
|
|
21164
|
+
}
|
|
21165
|
+
marketsByChain[chainId].push(market);
|
|
21166
|
+
}
|
|
21167
|
+
}
|
|
21168
|
+
return marketsByChain;
|
|
21169
|
+
} catch (error) {
|
|
21170
|
+
console.error("Error fetching all markets data:", error);
|
|
21171
|
+
return {};
|
|
21172
|
+
}
|
|
21173
|
+
}
|
|
21174
|
+
async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]) {
|
|
21175
|
+
try {
|
|
21176
|
+
const data = await fetchPendlePricesRaw(assetType);
|
|
21177
|
+
let prices = {};
|
|
21178
|
+
Object.entries(data).forEach(([key, val]) => {
|
|
21179
|
+
const [chainId, address] = key.split("-");
|
|
21180
|
+
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
|
|
21181
|
+
prices[assetKey] = val;
|
|
21182
|
+
});
|
|
21183
|
+
return prices;
|
|
21184
|
+
} catch (error) {
|
|
21185
|
+
console.error(`Error fetching prices pendle prices:`, error);
|
|
21186
|
+
return {};
|
|
21187
|
+
}
|
|
21188
|
+
}
|
|
21189
|
+
async function fetchPendlePricesRaw(assetType = ["YT", "PT"]) {
|
|
21190
|
+
try {
|
|
21191
|
+
const response = await fetch(PRICES_ENDPOINT(assetType));
|
|
21192
|
+
const data = await response.json();
|
|
21193
|
+
return data.prices;
|
|
21194
|
+
} catch (error) {
|
|
21195
|
+
console.error(`Error fetching prices pendle prices:`, error);
|
|
21196
|
+
return {};
|
|
21197
|
+
}
|
|
21198
|
+
}
|
|
21199
|
+
async function fetchPendlePrices(lists = {}, assetType = ["YT", "PT"]) {
|
|
21200
|
+
try {
|
|
21201
|
+
const marketsResponse = await fetchPendleMarkets();
|
|
21202
|
+
if (!Object.keys(marketsResponse).length) {
|
|
21203
|
+
return {};
|
|
21204
|
+
}
|
|
21205
|
+
const allPrices = await fetchPendlePricesForAllChain(lists, assetType);
|
|
21206
|
+
return Object.fromEntries(
|
|
21207
|
+
Object.entries(allPrices).filter(([, price]) => !!price)
|
|
21208
|
+
);
|
|
21209
|
+
} catch (error) {
|
|
21210
|
+
console.error("Error in fetchPendlePrices:", error);
|
|
21211
|
+
return {};
|
|
21212
|
+
}
|
|
21213
|
+
}
|
|
21214
|
+
async function fetchPendleYields(lists = {}) {
|
|
21215
|
+
try {
|
|
21216
|
+
const marketsResponse = await fetchPendleMarkets();
|
|
21217
|
+
if (!Object.keys(marketsResponse).length) {
|
|
21218
|
+
return {};
|
|
21219
|
+
}
|
|
21220
|
+
const prices = await fetchPendlePricesRaw();
|
|
21221
|
+
let yields = {};
|
|
21222
|
+
const now = /* @__PURE__ */ new Date();
|
|
21223
|
+
Object.entries(marketsResponse).forEach(([chain, dataArr]) => {
|
|
21224
|
+
dataArr.forEach((market) => {
|
|
21225
|
+
const ptPrice = prices[market.pt];
|
|
21226
|
+
const ytPrice = prices[market.yt];
|
|
21227
|
+
if (ytPrice && ytPrice > 0) {
|
|
21228
|
+
const yearFraction = yearFractionToExpiry(market.expiry, now);
|
|
21229
|
+
const apr = ytPrice / ptPrice * 100 / yearFraction;
|
|
21230
|
+
const [chainId, address] = market.pt.split("-");
|
|
21231
|
+
const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? market.pt;
|
|
21232
|
+
yields[assetKey] = apr;
|
|
20703
21233
|
}
|
|
20704
|
-
})
|
|
20705
|
-
})
|
|
20706
|
-
|
|
20707
|
-
|
|
20708
|
-
|
|
20709
|
-
|
|
20710
|
-
|
|
20711
|
-
|
|
21234
|
+
});
|
|
21235
|
+
});
|
|
21236
|
+
return yields;
|
|
21237
|
+
} catch (error) {
|
|
21238
|
+
console.error("Error in fetchPendlePrices:", error);
|
|
21239
|
+
return {};
|
|
21240
|
+
}
|
|
21241
|
+
}
|
|
21242
|
+
function yearFractionToExpiry(expiryISO, now = /* @__PURE__ */ new Date()) {
|
|
21243
|
+
const expiry = new Date(expiryISO);
|
|
21244
|
+
const diffMs = expiry.getTime() - now.getTime();
|
|
21245
|
+
const yearFraction = diffMs / (1e3 * 60 * 60 * 24 * 365.25);
|
|
21246
|
+
return yearFraction;
|
|
21247
|
+
}
|
|
21248
|
+
|
|
21249
|
+
// src/yields/fetchers/pendle.ts
|
|
21250
|
+
var pendleFetcher = {
|
|
21251
|
+
label: "PENDLE",
|
|
21252
|
+
fetch: async () => {
|
|
21253
|
+
const lists = await getListsMulti([
|
|
21254
|
+
Chain.PLASMA_MAINNET,
|
|
21255
|
+
Chain.ETHEREUM_MAINNET,
|
|
21256
|
+
Chain.BERACHAIN,
|
|
21257
|
+
Chain.MANTLE,
|
|
21258
|
+
Chain.BASE,
|
|
21259
|
+
Chain.OP_MAINNET,
|
|
21260
|
+
Chain.ARBITRUM_ONE,
|
|
21261
|
+
Chain.SONIC_MAINNET,
|
|
21262
|
+
Chain.HYPEREVM,
|
|
21263
|
+
Chain.BNB_SMART_CHAIN_MAINNET
|
|
21264
|
+
]);
|
|
21265
|
+
return fetchPendleYields(lists);
|
|
21266
|
+
}
|
|
21267
|
+
};
|
|
21268
|
+
|
|
21269
|
+
// src/yields/fetchers/usdai.ts
|
|
21270
|
+
var USDAI_APY_URL = "https://api.usd.ai/usdai/dashboard/current-apy";
|
|
21271
|
+
var usdai = "sUSDai::SUSDAI";
|
|
21272
|
+
var usdaiFetcher = {
|
|
21273
|
+
label: "USDai",
|
|
21274
|
+
fetch: async () => {
|
|
21275
|
+
const res = await fetch(USDAI_APY_URL, {
|
|
20712
21276
|
headers: {
|
|
20713
|
-
|
|
20714
|
-
|
|
20715
|
-
|
|
20716
|
-
},
|
|
20717
|
-
body: JSON.stringify({
|
|
20718
|
-
type: "vaultDetails",
|
|
20719
|
-
vaultAddress: "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"
|
|
20720
|
-
})
|
|
21277
|
+
origin: "https://app.usd.ai",
|
|
21278
|
+
referer: "https://app.usd.ai/"
|
|
21279
|
+
}
|
|
20721
21280
|
}).then((r) => r.json());
|
|
20722
|
-
|
|
20723
|
-
|
|
20724
|
-
|
|
20725
|
-
|
|
20726
|
-
|
|
20727
|
-
|
|
20728
|
-
|
|
20729
|
-
|
|
20730
|
-
|
|
20731
|
-
|
|
20732
|
-
|
|
20733
|
-
|
|
20734
|
-
|
|
20735
|
-
|
|
20736
|
-
|
|
20737
|
-
|
|
20738
|
-
|
|
20739
|
-
|
|
20740
|
-
|
|
20741
|
-
|
|
20742
|
-
|
|
20743
|
-
|
|
20744
|
-
|
|
20745
|
-
|
|
20746
|
-
|
|
20747
|
-
|
|
20748
|
-
|
|
20749
|
-
|
|
20750
|
-
|
|
20751
|
-
|
|
20752
|
-
|
|
20753
|
-
|
|
20754
|
-
|
|
20755
|
-
|
|
20756
|
-
|
|
20757
|
-
|
|
20758
|
-
|
|
20759
|
-
|
|
20760
|
-
|
|
20761
|
-
|
|
20762
|
-
|
|
20763
|
-
|
|
20764
|
-
|
|
20765
|
-
|
|
20766
|
-
|
|
20767
|
-
|
|
20768
|
-
|
|
20769
|
-
|
|
20770
|
-
|
|
20771
|
-
|
|
20772
|
-
|
|
20773
|
-
|
|
20774
|
-
}).then((r) => r.json());
|
|
20775
|
-
return apyToAprPercent(res.apy) * 100;
|
|
20776
|
-
} catch (e) {
|
|
20777
|
-
console.log("CBETH failed", e);
|
|
20778
|
-
return 0;
|
|
20779
|
-
}
|
|
20780
|
-
});
|
|
20781
|
-
const pendlePromise = getListsMulti([
|
|
20782
|
-
Chain.PLASMA_MAINNET,
|
|
20783
|
-
Chain.ETHEREUM_MAINNET,
|
|
20784
|
-
Chain.BERACHAIN,
|
|
20785
|
-
Chain.MANTLE,
|
|
20786
|
-
Chain.BASE,
|
|
20787
|
-
Chain.OP_MAINNET,
|
|
20788
|
-
Chain.ARBITRUM_ONE,
|
|
20789
|
-
Chain.SONIC_MAINNET,
|
|
20790
|
-
Chain.HYPEREVM,
|
|
20791
|
-
Chain.BNB_SMART_CHAIN_MAINNET
|
|
20792
|
-
]).then((x) => fetchPendleYields(x));
|
|
20793
|
-
const [
|
|
20794
|
-
wstethData,
|
|
20795
|
-
ezethData,
|
|
20796
|
-
rethData,
|
|
20797
|
-
weethData,
|
|
20798
|
-
stmaticData,
|
|
20799
|
-
methData,
|
|
20800
|
-
maticXdata,
|
|
20801
|
-
susdeData,
|
|
20802
|
-
// meridianData,
|
|
20803
|
-
savaxData,
|
|
20804
|
-
cbethData,
|
|
20805
|
-
rsethData,
|
|
20806
|
-
trumaticData,
|
|
20807
|
-
rtokensData,
|
|
20808
|
-
hypeData,
|
|
20809
|
-
osEthData,
|
|
20810
|
-
ethXData,
|
|
20811
|
-
pufEthData,
|
|
20812
|
-
angleData,
|
|
20813
|
-
susdsData,
|
|
20814
|
-
srUsdData,
|
|
20815
|
-
yusdData,
|
|
20816
|
-
rlpData,
|
|
20817
|
-
wstusrData,
|
|
20818
|
-
csusdlData,
|
|
20819
|
-
// sdeusdData,
|
|
20820
|
-
rswethData,
|
|
20821
|
-
ynethxData,
|
|
20822
|
-
ethZeroData,
|
|
20823
|
-
usdZeroPlusData,
|
|
20824
|
-
jitoSolData,
|
|
20825
|
-
thBillData,
|
|
20826
|
-
yearnKatanaData,
|
|
20827
|
-
ssuperusdData,
|
|
20828
|
-
hbhypeData,
|
|
20829
|
-
pendleData,
|
|
20830
|
-
hlpData,
|
|
20831
|
-
yoData,
|
|
20832
|
-
hwhlpData,
|
|
20833
|
-
gmxData,
|
|
20834
|
-
weethsData,
|
|
20835
|
-
hbuhypeData,
|
|
20836
|
-
susdxData
|
|
20837
|
-
] = await Promise.all([
|
|
21281
|
+
return { [usdai]: apyToAprPercent(Number(res.result)) };
|
|
21282
|
+
}
|
|
21283
|
+
};
|
|
21284
|
+
|
|
21285
|
+
// src/yields/fetchGeneralYields.ts
|
|
21286
|
+
var fetchGeneralYields = async () => {
|
|
21287
|
+
const wstethPromise = safeFetch(wstethFetcher.label, wstethFetcher.fetch);
|
|
21288
|
+
const weethFetcher = createWeethFetcher(wstethPromise);
|
|
21289
|
+
const fetchers = [
|
|
21290
|
+
weethFetcher,
|
|
21291
|
+
stmaticFetcher,
|
|
21292
|
+
ezethFetcher,
|
|
21293
|
+
rethFetcher,
|
|
21294
|
+
methFetcher,
|
|
21295
|
+
susdeFetcher,
|
|
21296
|
+
maticxFetcher,
|
|
21297
|
+
ethxFetcher,
|
|
21298
|
+
savaxFetcher,
|
|
21299
|
+
cbethFetcher,
|
|
21300
|
+
rsethFetcher,
|
|
21301
|
+
trumaticFetcher,
|
|
21302
|
+
osethFetcher,
|
|
21303
|
+
ynethxFetcher,
|
|
21304
|
+
pufethFetcher,
|
|
21305
|
+
susdsFetcher,
|
|
21306
|
+
srusdFetcher,
|
|
21307
|
+
yusdFetcher,
|
|
21308
|
+
rlpFetcher,
|
|
21309
|
+
wstusrFetcher,
|
|
21310
|
+
csusdlFetcher,
|
|
21311
|
+
rswethFetcher,
|
|
21312
|
+
usdZeroPlusFetcher,
|
|
21313
|
+
ethZeroFetcher,
|
|
21314
|
+
jitoSolFetcher,
|
|
21315
|
+
thbillFetcher,
|
|
21316
|
+
ssuperusdFetcher,
|
|
21317
|
+
hbhypeFetcher,
|
|
21318
|
+
hbuhypeFetcher,
|
|
21319
|
+
hlpFetcher,
|
|
21320
|
+
hwhlpFetcher,
|
|
21321
|
+
weethsFetcher,
|
|
21322
|
+
susdxFetcher,
|
|
21323
|
+
rtokensFetcher,
|
|
21324
|
+
hypeFetcher,
|
|
21325
|
+
angleFetcher,
|
|
21326
|
+
yearnKatanaFetcher,
|
|
21327
|
+
yoFetcher,
|
|
21328
|
+
gmxFetcher,
|
|
21329
|
+
pendleFetcher,
|
|
21330
|
+
usdaiFetcher
|
|
21331
|
+
];
|
|
21332
|
+
const [wstethData, ...results] = await Promise.all([
|
|
20838
21333
|
wstethPromise,
|
|
20839
|
-
|
|
20840
|
-
rethPromise,
|
|
20841
|
-
weethPromise,
|
|
20842
|
-
stmaticPromise,
|
|
20843
|
-
methPromise,
|
|
20844
|
-
maticxPromise,
|
|
20845
|
-
susdePromise,
|
|
20846
|
-
// meridianPromise,
|
|
20847
|
-
savaxPromise,
|
|
20848
|
-
cbethPromise,
|
|
20849
|
-
rsethPromise,
|
|
20850
|
-
trumaticPromise,
|
|
20851
|
-
rtokensPromise,
|
|
20852
|
-
hypePromise,
|
|
20853
|
-
osEthPromise,
|
|
20854
|
-
ethxPromise,
|
|
20855
|
-
pufEthPromise,
|
|
20856
|
-
anglePromise,
|
|
20857
|
-
susdsPromise,
|
|
20858
|
-
srusdPromise,
|
|
20859
|
-
yusdPromise,
|
|
20860
|
-
rlpPromise,
|
|
20861
|
-
wstusrPromise,
|
|
20862
|
-
csusdlPromise,
|
|
20863
|
-
// sdeusdPromise,
|
|
20864
|
-
rswethPromise,
|
|
20865
|
-
ynethxPromise,
|
|
20866
|
-
ethZeroPromise,
|
|
20867
|
-
usdZeroPlusPromise,
|
|
20868
|
-
jitoSolPromise,
|
|
20869
|
-
thbillPromise,
|
|
20870
|
-
yearnKatanaPromise,
|
|
20871
|
-
ssuperusdPromise,
|
|
20872
|
-
hbhypePromise,
|
|
20873
|
-
pendlePromise,
|
|
20874
|
-
hlpPromise,
|
|
20875
|
-
yoPromise,
|
|
20876
|
-
hwhlpPromise,
|
|
20877
|
-
gmxPromise,
|
|
20878
|
-
weethsPromise,
|
|
20879
|
-
hbuhypePromise,
|
|
20880
|
-
susdxPromise
|
|
21334
|
+
...fetchers.map((f) => safeFetch(f.label, f.fetch))
|
|
20881
21335
|
]);
|
|
20882
|
-
const
|
|
20883
|
-
|
|
20884
|
-
|
|
20885
|
-
|
|
20886
|
-
|
|
20887
|
-
|
|
20888
|
-
|
|
20889
|
-
|
|
20890
|
-
|
|
20891
|
-
|
|
20892
|
-
USDY: 4.35,
|
|
20893
|
-
SUSDE: susdeData,
|
|
20894
|
-
SAVAX: savaxData,
|
|
20895
|
-
CBETH: cbethData,
|
|
20896
|
-
RSETH: rsethData,
|
|
20897
|
-
TRUMATIC: trumaticData,
|
|
20898
|
-
[sUsds]: susdsData,
|
|
20899
|
-
[ethZero]: ethZeroData,
|
|
20900
|
-
[usdZeroPlus]: usdZeroPlusData,
|
|
20901
|
-
[csusdl]: csusdlData,
|
|
20902
|
-
[srUsd]: srUsdData,
|
|
20903
|
-
[wsrusd]: srUsdData,
|
|
20904
|
-
// [sdeusd]: sdeusdData,
|
|
20905
|
-
[wstusr]: wstusrData,
|
|
20906
|
-
[yusd]: yusdData,
|
|
20907
|
-
[rlp]: rlpData,
|
|
20908
|
-
[rsweth]: rswethData,
|
|
20909
|
-
[osETH]: osEthData,
|
|
20910
|
-
[ethX]: ethXData,
|
|
20911
|
-
[ynethx]: ynethxData,
|
|
20912
|
-
[tETH]: wstethData,
|
|
20913
|
-
[pufEth]: pufEthData,
|
|
20914
|
-
[jitoSol]: jitoSolData,
|
|
20915
|
-
[thBill]: thBillData,
|
|
20916
|
-
[ssuperusd]: ssuperusdData,
|
|
20917
|
-
[hbhype]: hbhypeData,
|
|
20918
|
-
[hlp]: hlpData,
|
|
20919
|
-
[hwhlp]: hwhlpData,
|
|
20920
|
-
[weeths]: weethsData,
|
|
20921
|
-
[hbuhype]: hbuhypeData,
|
|
20922
|
-
[susdx]: susdxData,
|
|
20923
|
-
...rtokensData,
|
|
20924
|
-
...hypeData,
|
|
20925
|
-
...angleData,
|
|
20926
|
-
...yearnKatanaData,
|
|
20927
|
-
...pendleData,
|
|
20928
|
-
...yoData,
|
|
20929
|
-
...gmxData
|
|
20930
|
-
},
|
|
20931
|
-
lenderRewards: {
|
|
20932
|
-
// '167000': {
|
|
20933
|
-
// MERIDIAN: meridianData,
|
|
20934
|
-
// },
|
|
20935
|
-
}
|
|
21336
|
+
const intrinsicYields = {
|
|
21337
|
+
USDY: 4.35
|
|
21338
|
+
};
|
|
21339
|
+
if (wstethData) Object.assign(intrinsicYields, wstethData);
|
|
21340
|
+
for (const result of results) {
|
|
21341
|
+
if (result) Object.assign(intrinsicYields, result);
|
|
21342
|
+
}
|
|
21343
|
+
return {
|
|
21344
|
+
intrinsicYields,
|
|
21345
|
+
lenderRewards: {}
|
|
20936
21346
|
};
|
|
20937
|
-
return data;
|
|
20938
21347
|
};
|
|
20939
21348
|
|
|
20940
21349
|
// src/prices/defillama/index.ts
|
|
@@ -23695,14 +24104,20 @@ var AAVE_LENDER_OVERRIDES = {
|
|
|
23695
24104
|
// BASE_CURRENCY_UNIT call reverts, oracle returns 18 decimals (USD denominated)
|
|
23696
24105
|
baseCurrencyUnit: 1000000000000000000n
|
|
23697
24106
|
}
|
|
24107
|
+
},
|
|
24108
|
+
[Lender.MOLEND]: {
|
|
24109
|
+
[Chain.MODE]: {
|
|
24110
|
+
// BASE_CURRENCY_UNIT call reverts, oracle returns 18 decimals (USD denominated)
|
|
24111
|
+
baseCurrencyUnit: 100000000n
|
|
24112
|
+
}
|
|
23698
24113
|
}
|
|
23699
24114
|
};
|
|
23700
24115
|
function getAaveLendersForChain(chainId) {
|
|
23701
24116
|
const oracles = aaveOracles() ?? {};
|
|
23702
24117
|
const reserves = aaveReserves() ?? {};
|
|
23703
24118
|
const lenders = [];
|
|
23704
|
-
for (const [lender,
|
|
23705
|
-
if (
|
|
24119
|
+
for (const [lender, chains] of Object.entries(oracles)) {
|
|
24120
|
+
if (chains[chainId] && reserves[lender]?.[chainId]?.length > 0) {
|
|
23706
24121
|
lenders.push(lender);
|
|
23707
24122
|
}
|
|
23708
24123
|
}
|
|
@@ -23752,13 +24167,9 @@ function parseAaveResults2(data, meta, context) {
|
|
|
23752
24167
|
const { chainId, usdPrices, tokenList } = context;
|
|
23753
24168
|
const entries = [];
|
|
23754
24169
|
if (data.length === 0) return entries;
|
|
23755
|
-
let baseCurrencyUnitValue = data[meta.baseCurrencyUnitIndex];
|
|
24170
|
+
let baseCurrencyUnitValue = meta.baseCurrencyUnitOverride ?? data[meta.baseCurrencyUnitIndex];
|
|
23756
24171
|
if (!baseCurrencyUnitValue || baseCurrencyUnitValue === "0x") {
|
|
23757
|
-
|
|
23758
|
-
baseCurrencyUnitValue = meta.baseCurrencyUnitOverride;
|
|
23759
|
-
} else {
|
|
23760
|
-
return entries;
|
|
23761
|
-
}
|
|
24172
|
+
return entries;
|
|
23762
24173
|
}
|
|
23763
24174
|
let decimals;
|
|
23764
24175
|
try {
|
|
@@ -23788,7 +24199,8 @@ function parseAaveResults2(data, meta, context) {
|
|
|
23788
24199
|
asset: asset.toLowerCase(),
|
|
23789
24200
|
price: rawPriceNum,
|
|
23790
24201
|
// Raw price (in base asset terms)
|
|
23791
|
-
priceUSD
|
|
24202
|
+
priceUSD,
|
|
24203
|
+
marketUid: createMarketUid(chainId, meta.fork, asset)
|
|
23792
24204
|
});
|
|
23793
24205
|
} catch {
|
|
23794
24206
|
continue;
|
|
@@ -23804,59 +24216,45 @@ var aaveFetcher = {
|
|
|
23804
24216
|
parse: parseAaveResults2,
|
|
23805
24217
|
getAbi: getAaveAbi
|
|
23806
24218
|
};
|
|
23807
|
-
function generateMarketId(oracle) {
|
|
23808
|
-
return oracle
|
|
24219
|
+
function generateMarketId(oracle, loanAsset, collateralAsset) {
|
|
24220
|
+
return `${oracle}${loanAsset}${collateralAsset}`.replace(/0x/gi, "").toUpperCase();
|
|
23809
24221
|
}
|
|
23810
24222
|
function generateMorphoLenderKey(marketId) {
|
|
23811
24223
|
return `${Lender.MORPHO_BLUE}_${marketId}`;
|
|
23812
24224
|
}
|
|
23813
24225
|
function getMorphoMarketsForChain(chainId, marketOverrides) {
|
|
23814
|
-
const oracles = morphoTypeOracles() ?? {};
|
|
23815
|
-
const chainOracles = oracles[chainId] ?? {};
|
|
23816
|
-
const queries = [];
|
|
23817
|
-
for (const [fork, markets] of Object.entries(chainOracles)) {
|
|
23818
|
-
if (fork !== Lender.MORPHO_BLUE) continue;
|
|
23819
|
-
for (const market of markets) {
|
|
23820
|
-
const marketId = generateMarketId(market.oracle);
|
|
23821
|
-
queries.push({
|
|
23822
|
-
oracle: market.oracle,
|
|
23823
|
-
loanAsset: market.loanAsset,
|
|
23824
|
-
collateralAsset: market.collateralAsset,
|
|
23825
|
-
loanAssetDecimals: market.loanAssetDecimals,
|
|
23826
|
-
collateralAssetDecimals: market.collateralAssetDecimals,
|
|
23827
|
-
fork,
|
|
23828
|
-
marketId
|
|
23829
|
-
});
|
|
23830
|
-
}
|
|
23831
|
-
}
|
|
23832
24226
|
const chainOverrides = marketOverrides?.[chainId] ?? [];
|
|
23833
|
-
|
|
23834
|
-
|
|
23835
|
-
|
|
23836
|
-
|
|
23837
|
-
|
|
23838
|
-
|
|
23839
|
-
|
|
23840
|
-
|
|
23841
|
-
|
|
23842
|
-
marketId
|
|
23843
|
-
});
|
|
23844
|
-
}
|
|
23845
|
-
return queries;
|
|
24227
|
+
return chainOverrides.map((override) => ({
|
|
24228
|
+
oracle: override.oracle,
|
|
24229
|
+
loanAsset: override.loanAsset,
|
|
24230
|
+
collateralAsset: override.collateralAsset,
|
|
24231
|
+
loanAssetDecimals: override.loanAssetDecimals,
|
|
24232
|
+
collateralAssetDecimals: override.collateralAssetDecimals,
|
|
24233
|
+
fork: Lender.MORPHO_BLUE,
|
|
24234
|
+
marketId: override.marketId ?? generateMarketId(override.oracle, override.loanAsset, override.collateralAsset)
|
|
24235
|
+
}));
|
|
23846
24236
|
}
|
|
23847
24237
|
function getMorphoCalls2(chainId, context) {
|
|
23848
24238
|
const queries = getMorphoMarketsForChain(chainId, context?.marketOverrides);
|
|
23849
24239
|
if (queries.length === 0) return [];
|
|
23850
|
-
|
|
24240
|
+
const oracleGroups = /* @__PURE__ */ new Map();
|
|
24241
|
+
for (const query2 of queries) {
|
|
24242
|
+
const oracleLc = query2.oracle.toLowerCase();
|
|
24243
|
+
if (!oracleGroups.has(oracleLc)) {
|
|
24244
|
+
oracleGroups.set(oracleLc, []);
|
|
24245
|
+
}
|
|
24246
|
+
oracleGroups.get(oracleLc).push(query2);
|
|
24247
|
+
}
|
|
24248
|
+
return Array.from(oracleGroups.values()).map((markets) => {
|
|
23851
24249
|
const call = {
|
|
23852
|
-
address:
|
|
24250
|
+
address: markets[0].oracle,
|
|
23853
24251
|
name: "price",
|
|
23854
24252
|
params: []
|
|
23855
24253
|
};
|
|
23856
24254
|
return {
|
|
23857
24255
|
calls: [call],
|
|
23858
|
-
meta:
|
|
23859
|
-
lender: generateMorphoLenderKey(
|
|
24256
|
+
meta: { markets },
|
|
24257
|
+
lender: generateMorphoLenderKey(markets[0].marketId)
|
|
23860
24258
|
};
|
|
23861
24259
|
});
|
|
23862
24260
|
}
|
|
@@ -23865,37 +24263,44 @@ function parseMorphoResults2(data, meta, context) {
|
|
|
23865
24263
|
const entries = [];
|
|
23866
24264
|
const rawPrice = data[0];
|
|
23867
24265
|
if (!rawPrice || rawPrice === void 0 || rawPrice === "0x") return entries;
|
|
23868
|
-
const
|
|
23869
|
-
|
|
23870
|
-
|
|
23871
|
-
|
|
23872
|
-
|
|
23873
|
-
|
|
23874
|
-
|
|
23875
|
-
|
|
23876
|
-
|
|
23877
|
-
|
|
23878
|
-
|
|
23879
|
-
|
|
23880
|
-
|
|
23881
|
-
|
|
23882
|
-
|
|
23883
|
-
const
|
|
23884
|
-
|
|
23885
|
-
|
|
23886
|
-
|
|
23887
|
-
|
|
23888
|
-
|
|
23889
|
-
|
|
23890
|
-
|
|
23891
|
-
|
|
23892
|
-
|
|
23893
|
-
|
|
23894
|
-
|
|
23895
|
-
|
|
23896
|
-
|
|
23897
|
-
|
|
23898
|
-
|
|
24266
|
+
for (const market of meta.markets) {
|
|
24267
|
+
const loanAsset = market.loanAsset.toLowerCase();
|
|
24268
|
+
const collateralAsset = market.collateralAsset.toLowerCase();
|
|
24269
|
+
const loanAssetDecimals = market.loanAssetDecimals ?? tokenList?.[loanAsset]?.decimals ?? 18;
|
|
24270
|
+
const collateralAssetDecimals = market.collateralAssetDecimals ?? tokenList?.[collateralAsset]?.decimals ?? 18;
|
|
24271
|
+
const priceDebtToCollateral = formatMorphoPrice(
|
|
24272
|
+
rawPrice.toString(),
|
|
24273
|
+
loanAssetDecimals,
|
|
24274
|
+
collateralAssetDecimals
|
|
24275
|
+
);
|
|
24276
|
+
if (isNaN(priceDebtToCollateral) || priceDebtToCollateral === 0) continue;
|
|
24277
|
+
const loanOracleKey = tokenList?.[loanAsset]?.assetGroup ?? `${chainId}-${loanAsset}`;
|
|
24278
|
+
const collateralOracleKey = tokenList?.[collateralAsset]?.assetGroup ?? `${chainId}-${collateralAsset}`;
|
|
24279
|
+
const loanAssetUSD = usdPrices[loanOracleKey] ?? usdPrices[loanAsset];
|
|
24280
|
+
const collateralAssetUSD = usdPrices[collateralOracleKey] ?? usdPrices[collateralAsset];
|
|
24281
|
+
const lenderKey = generateMorphoLenderKey(market.marketId);
|
|
24282
|
+
if (loanAssetUSD) {
|
|
24283
|
+
const collateralPriceUSD = priceDebtToCollateral * loanAssetUSD;
|
|
24284
|
+
entries.push({
|
|
24285
|
+
asset: collateralAsset,
|
|
24286
|
+
price: priceDebtToCollateral,
|
|
24287
|
+
// Raw: collateral price in loan asset terms
|
|
24288
|
+
priceUSD: collateralPriceUSD,
|
|
24289
|
+
marketUid: createMarketUid(chainId, lenderKey, collateralAsset),
|
|
24290
|
+
targetLender: lenderKey
|
|
24291
|
+
});
|
|
24292
|
+
}
|
|
24293
|
+
if (collateralAssetUSD) {
|
|
24294
|
+
const loanPriceUSD = collateralAssetUSD / priceDebtToCollateral;
|
|
24295
|
+
entries.push({
|
|
24296
|
+
asset: loanAsset,
|
|
24297
|
+
price: 1 / priceDebtToCollateral,
|
|
24298
|
+
// Raw: loan price in collateral terms
|
|
24299
|
+
priceUSD: loanPriceUSD,
|
|
24300
|
+
marketUid: createMarketUid(chainId, lenderKey, loanAsset),
|
|
24301
|
+
targetLender: lenderKey
|
|
24302
|
+
});
|
|
24303
|
+
}
|
|
23899
24304
|
}
|
|
23900
24305
|
return entries;
|
|
23901
24306
|
}
|
|
@@ -23907,8 +24312,9 @@ var morphoFetcher = {
|
|
|
23907
24312
|
parse: parseMorphoResults2,
|
|
23908
24313
|
getAbi: getMorphoAbi
|
|
23909
24314
|
};
|
|
23910
|
-
|
|
23911
|
-
|
|
24315
|
+
var SCALING_DECIMALS_OVERRIDES = {
|
|
24316
|
+
[Lender.SUMER]: 18
|
|
24317
|
+
};
|
|
23912
24318
|
var CompoundV2OracleAbi = [
|
|
23913
24319
|
{
|
|
23914
24320
|
inputs: [{ internalType: "address", name: "cToken", type: "address" }],
|
|
@@ -23959,14 +24365,15 @@ function parseCompoundV2Results2(data, meta, context) {
|
|
|
23959
24365
|
try {
|
|
23960
24366
|
const underlyingLc = queryMeta.underlying.toLowerCase();
|
|
23961
24367
|
const underlyingDecimals = tokenList?.[underlyingLc]?.decimals ?? 18;
|
|
23962
|
-
const scalingDecimals = 36 - underlyingDecimals;
|
|
24368
|
+
const scalingDecimals = SCALING_DECIMALS_OVERRIDES[queryMeta.lender] ?? 36 - underlyingDecimals;
|
|
23963
24369
|
const priceUSD = Number(formatUnits(BigInt(rawResult.toString()), scalingDecimals));
|
|
23964
24370
|
if (isNaN(priceUSD) || priceUSD === 0) return;
|
|
23965
24371
|
entries.push({
|
|
23966
24372
|
asset: underlyingLc,
|
|
23967
24373
|
price: priceUSD,
|
|
23968
24374
|
// For Compound V2, raw price is already USD denominated
|
|
23969
|
-
priceUSD
|
|
24375
|
+
priceUSD,
|
|
24376
|
+
marketUid: createMarketUid(context.chainId, queryMeta.lender, queryMeta.cToken)
|
|
23970
24377
|
});
|
|
23971
24378
|
} catch {
|
|
23972
24379
|
}
|
|
@@ -23981,8 +24388,6 @@ var compoundV2Fetcher = {
|
|
|
23981
24388
|
parse: parseCompoundV2Results2,
|
|
23982
24389
|
getAbi: getCompoundV2Abi
|
|
23983
24390
|
};
|
|
23984
|
-
|
|
23985
|
-
// src/prices/oracle-prices/fetchers/compoundV3.ts
|
|
23986
24391
|
var ChainlinkAggregatorAbi = [
|
|
23987
24392
|
{
|
|
23988
24393
|
inputs: [],
|
|
@@ -24000,6 +24405,12 @@ var ChainlinkAggregatorAbi = [
|
|
|
24000
24405
|
];
|
|
24001
24406
|
var ANSWER_INDEX = 1;
|
|
24002
24407
|
var CHAINLINK_DECIMALS = 8;
|
|
24408
|
+
var USD_PRICED_OVERRIDES = {
|
|
24409
|
+
[Lender.COMPOUND_V3_AERO]: /* @__PURE__ */ new Set(["8453"]),
|
|
24410
|
+
// BASE - prices already in USD
|
|
24411
|
+
[Lender.COMPOUND_V3_USDBC]: /* @__PURE__ */ new Set(["8453"])
|
|
24412
|
+
// BASE - prices already in USD
|
|
24413
|
+
};
|
|
24003
24414
|
function getCompoundV3Calls(chainId) {
|
|
24004
24415
|
const oracles = compoundV3Oracles() ?? {};
|
|
24005
24416
|
const baseData = compoundV3BaseData() ?? {};
|
|
@@ -24007,7 +24418,8 @@ function getCompoundV3Calls(chainId) {
|
|
|
24007
24418
|
for (const [lender, chainOracles] of Object.entries(oracles)) {
|
|
24008
24419
|
const assetOracles = chainOracles[chainId];
|
|
24009
24420
|
if (!assetOracles) continue;
|
|
24010
|
-
const
|
|
24421
|
+
const skipBaseScaling = USD_PRICED_OVERRIDES[lender]?.has(chainId);
|
|
24422
|
+
const baseAsset = skipBaseScaling ? void 0 : baseData[lender]?.[chainId]?.baseAsset?.toLowerCase();
|
|
24011
24423
|
const calls = [];
|
|
24012
24424
|
const meta = [];
|
|
24013
24425
|
for (const [asset, oracleAddress] of Object.entries(assetOracles)) {
|
|
@@ -24019,7 +24431,8 @@ function getCompoundV3Calls(chainId) {
|
|
|
24019
24431
|
meta.push({
|
|
24020
24432
|
asset,
|
|
24021
24433
|
oracle: oracleAddress,
|
|
24022
|
-
baseAsset
|
|
24434
|
+
baseAsset,
|
|
24435
|
+
lender
|
|
24023
24436
|
});
|
|
24024
24437
|
}
|
|
24025
24438
|
if (calls.length > 0) {
|
|
@@ -24041,7 +24454,9 @@ function parseCompoundV3Results(data, meta, context) {
|
|
|
24041
24454
|
try {
|
|
24042
24455
|
const answer = Array.isArray(rawResult) ? rawResult[ANSWER_INDEX] : rawResult;
|
|
24043
24456
|
if (!answer) return;
|
|
24044
|
-
const rawPrice = Number(
|
|
24457
|
+
const rawPrice = Number(
|
|
24458
|
+
formatUnits(BigInt(answer.toString()), CHAINLINK_DECIMALS)
|
|
24459
|
+
);
|
|
24045
24460
|
if (isNaN(rawPrice) || rawPrice === 0) return;
|
|
24046
24461
|
const assetLc = queryMeta.asset.toLowerCase();
|
|
24047
24462
|
let priceUSD = rawPrice;
|
|
@@ -24057,7 +24472,8 @@ function parseCompoundV3Results(data, meta, context) {
|
|
|
24057
24472
|
asset: assetLc,
|
|
24058
24473
|
price: rawPrice,
|
|
24059
24474
|
// Raw price (in base asset terms if applicable)
|
|
24060
|
-
priceUSD
|
|
24475
|
+
priceUSD,
|
|
24476
|
+
marketUid: createMarketUid(chainId, queryMeta.lender, queryMeta.asset)
|
|
24061
24477
|
});
|
|
24062
24478
|
} catch {
|
|
24063
24479
|
}
|
|
@@ -24073,103 +24489,84 @@ var compoundV3Fetcher = {
|
|
|
24073
24489
|
getAbi: getCompoundV3Abi
|
|
24074
24490
|
};
|
|
24075
24491
|
var LISTA_DECIMALS = 8;
|
|
24076
|
-
function generateMarketId2(oracle) {
|
|
24077
|
-
return oracle
|
|
24492
|
+
function generateMarketId2(oracle, loanAsset, collateralAsset) {
|
|
24493
|
+
return `${oracle}${loanAsset}${collateralAsset}`.replace(/0x/gi, "").toUpperCase();
|
|
24078
24494
|
}
|
|
24079
24495
|
function generateListaLenderKey(marketId) {
|
|
24080
24496
|
return `${Lender.LISTA_DAO}_${marketId}`;
|
|
24081
24497
|
}
|
|
24082
24498
|
function getListaMarketsForChain(chainId, marketOverrides) {
|
|
24083
|
-
const oracles = morphoTypeOracles() ?? {};
|
|
24084
|
-
const chainOracles = oracles[chainId] ?? {};
|
|
24085
|
-
const markets = [];
|
|
24086
|
-
const processedMarketIds = /* @__PURE__ */ new Set();
|
|
24087
|
-
for (const [fork, marketList] of Object.entries(chainOracles)) {
|
|
24088
|
-
if (fork !== Lender.LISTA_DAO) continue;
|
|
24089
|
-
for (const market of marketList) {
|
|
24090
|
-
const marketId = generateMarketId2(market.oracle);
|
|
24091
|
-
if (processedMarketIds.has(marketId)) continue;
|
|
24092
|
-
processedMarketIds.add(marketId);
|
|
24093
|
-
markets.push({
|
|
24094
|
-
oracle: market.oracle,
|
|
24095
|
-
collateralAsset: market.collateralAsset,
|
|
24096
|
-
loanAsset: market.loanAsset,
|
|
24097
|
-
marketId
|
|
24098
|
-
});
|
|
24099
|
-
}
|
|
24100
|
-
}
|
|
24101
24499
|
const chainOverrides = marketOverrides?.[chainId] ?? [];
|
|
24102
|
-
|
|
24103
|
-
|
|
24104
|
-
|
|
24105
|
-
|
|
24106
|
-
|
|
24107
|
-
|
|
24108
|
-
collateralAsset: override.collateralAsset,
|
|
24109
|
-
loanAsset: override.loanAsset,
|
|
24110
|
-
marketId
|
|
24111
|
-
});
|
|
24112
|
-
}
|
|
24113
|
-
return markets;
|
|
24500
|
+
return chainOverrides.map((override) => ({
|
|
24501
|
+
oracle: override.oracle,
|
|
24502
|
+
collateralAsset: override.collateralAsset,
|
|
24503
|
+
loanAsset: override.loanAsset,
|
|
24504
|
+
marketId: override.marketId ?? generateMarketId2(override.oracle, override.loanAsset, override.collateralAsset)
|
|
24505
|
+
}));
|
|
24114
24506
|
}
|
|
24115
24507
|
function getListaCalls(chainId, context) {
|
|
24116
24508
|
const markets = getListaMarketsForChain(chainId, context?.marketOverrides);
|
|
24117
24509
|
if (markets.length === 0) return [];
|
|
24118
|
-
|
|
24119
|
-
|
|
24120
|
-
|
|
24121
|
-
|
|
24510
|
+
const calls = [];
|
|
24511
|
+
const callIndexMap = {};
|
|
24512
|
+
for (const market of markets) {
|
|
24513
|
+
const oracleLc = market.oracle.toLowerCase();
|
|
24514
|
+
const collateralKey = `${oracleLc}:${market.collateralAsset.toLowerCase()}`;
|
|
24515
|
+
if (!(collateralKey in callIndexMap)) {
|
|
24516
|
+
callIndexMap[collateralKey] = calls.length;
|
|
24517
|
+
calls.push({
|
|
24122
24518
|
address: market.oracle,
|
|
24123
24519
|
name: "peek",
|
|
24124
24520
|
params: [market.collateralAsset]
|
|
24125
|
-
}
|
|
24126
|
-
|
|
24127
|
-
|
|
24521
|
+
});
|
|
24522
|
+
}
|
|
24523
|
+
const loanKey = `${oracleLc}:${market.loanAsset.toLowerCase()}`;
|
|
24524
|
+
if (!(loanKey in callIndexMap)) {
|
|
24525
|
+
callIndexMap[loanKey] = calls.length;
|
|
24526
|
+
calls.push({
|
|
24128
24527
|
address: market.oracle,
|
|
24129
24528
|
name: "peek",
|
|
24130
24529
|
params: [market.loanAsset]
|
|
24131
|
-
}
|
|
24132
|
-
|
|
24133
|
-
|
|
24134
|
-
|
|
24135
|
-
|
|
24136
|
-
|
|
24137
|
-
|
|
24138
|
-
|
|
24139
|
-
{
|
|
24140
|
-
oracle: market.oracle,
|
|
24141
|
-
asset: market.loanAsset,
|
|
24142
|
-
marketId: market.marketId
|
|
24143
|
-
}
|
|
24144
|
-
];
|
|
24145
|
-
return {
|
|
24146
|
-
calls,
|
|
24147
|
-
meta,
|
|
24148
|
-
lender: generateListaLenderKey(market.marketId)
|
|
24149
|
-
};
|
|
24150
|
-
});
|
|
24530
|
+
});
|
|
24531
|
+
}
|
|
24532
|
+
}
|
|
24533
|
+
return [{
|
|
24534
|
+
calls,
|
|
24535
|
+
meta: { callIndexMap, markets },
|
|
24536
|
+
lender: generateListaLenderKey(markets[0].marketId)
|
|
24537
|
+
}];
|
|
24151
24538
|
}
|
|
24152
|
-
function parseListaResults2(data, meta,
|
|
24539
|
+
function parseListaResults2(data, meta, context) {
|
|
24153
24540
|
const entries = [];
|
|
24154
|
-
const
|
|
24155
|
-
|
|
24156
|
-
const
|
|
24157
|
-
|
|
24158
|
-
const
|
|
24159
|
-
|
|
24160
|
-
|
|
24161
|
-
|
|
24162
|
-
|
|
24163
|
-
|
|
24164
|
-
|
|
24165
|
-
|
|
24166
|
-
|
|
24167
|
-
|
|
24168
|
-
|
|
24169
|
-
|
|
24170
|
-
|
|
24541
|
+
for (const market of meta.markets) {
|
|
24542
|
+
const oracleLc = market.oracle.toLowerCase();
|
|
24543
|
+
const lenderKey = generateListaLenderKey(market.marketId);
|
|
24544
|
+
const processedAssets = /* @__PURE__ */ new Set();
|
|
24545
|
+
const assets = [market.collateralAsset, market.loanAsset];
|
|
24546
|
+
for (const assetRaw of assets) {
|
|
24547
|
+
const asset = assetRaw.toLowerCase();
|
|
24548
|
+
if (processedAssets.has(asset)) continue;
|
|
24549
|
+
const callKey = `${oracleLc}:${asset}`;
|
|
24550
|
+
const callIndex = meta.callIndexMap[callKey];
|
|
24551
|
+
if (callIndex === void 0) continue;
|
|
24552
|
+
const rawPrice = data[callIndex];
|
|
24553
|
+
if (rawPrice === void 0 || rawPrice === "0x") continue;
|
|
24554
|
+
try {
|
|
24555
|
+
const priceUSD = Number(formatUnits(BigInt(rawPrice.toString()), LISTA_DECIMALS));
|
|
24556
|
+
if (isNaN(priceUSD) || priceUSD === 0) continue;
|
|
24557
|
+
entries.push({
|
|
24558
|
+
asset,
|
|
24559
|
+
price: priceUSD,
|
|
24560
|
+
// Raw price is already in USD
|
|
24561
|
+
priceUSD,
|
|
24562
|
+
marketUid: createMarketUid(context.chainId, lenderKey, asset),
|
|
24563
|
+
targetLender: lenderKey
|
|
24564
|
+
});
|
|
24565
|
+
processedAssets.add(asset);
|
|
24566
|
+
} catch {
|
|
24567
|
+
}
|
|
24171
24568
|
}
|
|
24172
|
-
}
|
|
24569
|
+
}
|
|
24173
24570
|
return entries;
|
|
24174
24571
|
}
|
|
24175
24572
|
function getListaAbi() {
|
|
@@ -24268,7 +24665,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
24268
24665
|
rpcOverrides
|
|
24269
24666
|
);
|
|
24270
24667
|
const usdPrices = { ...basePrices };
|
|
24271
|
-
const parseTracker = (tracker) => {
|
|
24668
|
+
const parseTracker = (tracker, updatePrices = true) => {
|
|
24272
24669
|
const dataSlice = multicallResult.slice(
|
|
24273
24670
|
tracker.offset,
|
|
24274
24671
|
tracker.offset + tracker.count
|
|
@@ -24279,14 +24676,17 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
24279
24676
|
tokenList
|
|
24280
24677
|
};
|
|
24281
24678
|
const entries = tracker.parse(dataSlice, tracker.meta, context);
|
|
24282
|
-
if (!chainResult[tracker.lender]) {
|
|
24283
|
-
chainResult[tracker.lender] = [];
|
|
24284
|
-
}
|
|
24285
|
-
chainResult[tracker.lender].push(...entries);
|
|
24286
24679
|
for (const entry of entries) {
|
|
24287
|
-
const
|
|
24288
|
-
|
|
24289
|
-
|
|
24680
|
+
const lender = entry.targetLender ?? tracker.lender;
|
|
24681
|
+
if (!chainResult[lender]) {
|
|
24682
|
+
chainResult[lender] = [];
|
|
24683
|
+
}
|
|
24684
|
+
chainResult[lender].push(entry);
|
|
24685
|
+
if (updatePrices) {
|
|
24686
|
+
const oracleKey = tokenList[entry.asset]?.assetGroup ?? `${chainId}-${entry.asset}`;
|
|
24687
|
+
usdPrices[oracleKey] = entry.priceUSD;
|
|
24688
|
+
usdPrices[entry.asset] = entry.priceUSD;
|
|
24689
|
+
}
|
|
24290
24690
|
}
|
|
24291
24691
|
};
|
|
24292
24692
|
const nonMorphoTrackers = fetcherTracker.filter(
|
|
@@ -24314,7 +24714,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
|
|
|
24314
24714
|
(t) => t.parse === morphoFetcher.parse
|
|
24315
24715
|
);
|
|
24316
24716
|
for (const tracker of morphoTrackers) {
|
|
24317
|
-
parseTracker(tracker);
|
|
24717
|
+
parseTracker(tracker, false);
|
|
24318
24718
|
}
|
|
24319
24719
|
return { chainId, data: chainResult };
|
|
24320
24720
|
});
|
|
@@ -24834,7 +25234,237 @@ function parseMulticallRpcResponses(responses, batches, allowFailure = true) {
|
|
|
24834
25234
|
});
|
|
24835
25235
|
return allResults;
|
|
24836
25236
|
}
|
|
25237
|
+
var ERC20MetadataAbi = [
|
|
25238
|
+
{
|
|
25239
|
+
inputs: [],
|
|
25240
|
+
name: "name",
|
|
25241
|
+
outputs: [{ internalType: "string", name: "", type: "string" }],
|
|
25242
|
+
stateMutability: "view",
|
|
25243
|
+
type: "function"
|
|
25244
|
+
},
|
|
25245
|
+
{
|
|
25246
|
+
inputs: [],
|
|
25247
|
+
name: "symbol",
|
|
25248
|
+
outputs: [{ internalType: "string", name: "", type: "string" }],
|
|
25249
|
+
stateMutability: "view",
|
|
25250
|
+
type: "function"
|
|
25251
|
+
},
|
|
25252
|
+
{
|
|
25253
|
+
inputs: [],
|
|
25254
|
+
name: "decimals",
|
|
25255
|
+
outputs: [{ internalType: "uint8", name: "", type: "uint8" }],
|
|
25256
|
+
stateMutability: "view",
|
|
25257
|
+
type: "function"
|
|
25258
|
+
}
|
|
25259
|
+
];
|
|
25260
|
+
async function fetchTokenMetadata(chain, addrs) {
|
|
25261
|
+
const tokens = {};
|
|
25262
|
+
const client = getEvmClient(chain);
|
|
25263
|
+
const results = await client.multicall({
|
|
25264
|
+
allowFailure: false,
|
|
25265
|
+
batchSize: 300,
|
|
25266
|
+
contracts: addrs.map((addr) => [
|
|
25267
|
+
{
|
|
25268
|
+
abi: ERC20MetadataAbi,
|
|
25269
|
+
functionName: "name",
|
|
25270
|
+
address: addr,
|
|
25271
|
+
args: []
|
|
25272
|
+
},
|
|
25273
|
+
{
|
|
25274
|
+
abi: ERC20MetadataAbi,
|
|
25275
|
+
functionName: "symbol",
|
|
25276
|
+
address: addr,
|
|
25277
|
+
args: []
|
|
25278
|
+
},
|
|
25279
|
+
{
|
|
25280
|
+
abi: ERC20MetadataAbi,
|
|
25281
|
+
functionName: "decimals",
|
|
25282
|
+
address: addr,
|
|
25283
|
+
args: []
|
|
25284
|
+
}
|
|
25285
|
+
]).flat()
|
|
25286
|
+
});
|
|
25287
|
+
addrs.forEach((addr, i) => {
|
|
25288
|
+
const name = results[i * 3];
|
|
25289
|
+
const symbol = results[i * 3 + 1];
|
|
25290
|
+
const decimals = results[i * 3 + 2];
|
|
25291
|
+
const address = addr.toLowerCase();
|
|
25292
|
+
tokens[address] = {
|
|
25293
|
+
chainId: String(chain),
|
|
25294
|
+
decimals,
|
|
25295
|
+
name,
|
|
25296
|
+
address,
|
|
25297
|
+
symbol,
|
|
25298
|
+
assetGroup: `${symbol}::${name}`,
|
|
25299
|
+
currencyId: `${symbol}::${name}`
|
|
25300
|
+
};
|
|
25301
|
+
});
|
|
25302
|
+
return tokens;
|
|
25303
|
+
}
|
|
25304
|
+
var BALANCE_FETCHER = "0x60134ad7491101c7fcb343ed8c7599e449430766";
|
|
25305
|
+
var BALANCE_FETCHER_SELECTOR = "0x30fb0985";
|
|
25306
|
+
function encodeBalanceFetcherCalldata(accounts, tokens) {
|
|
25307
|
+
if (accounts.length < 1 || tokens.length < 1) {
|
|
25308
|
+
return "0x";
|
|
25309
|
+
}
|
|
25310
|
+
const normalizedAccounts = accounts.map((a) => a.toLowerCase());
|
|
25311
|
+
const normalizedTokens = tokens.map((t) => t.toLowerCase());
|
|
25312
|
+
const header = encodePacked(
|
|
25313
|
+
["uint16", "uint16"],
|
|
25314
|
+
[normalizedTokens.length, normalizedAccounts.length]
|
|
25315
|
+
);
|
|
25316
|
+
const accountsEncoded = encodePacked(
|
|
25317
|
+
normalizedAccounts.map(() => "address"),
|
|
25318
|
+
normalizedAccounts
|
|
25319
|
+
).slice(2);
|
|
25320
|
+
const tokensEncoded = encodePacked(
|
|
25321
|
+
normalizedTokens.map(() => "address"),
|
|
25322
|
+
normalizedTokens
|
|
25323
|
+
).slice(2);
|
|
25324
|
+
return header + accountsEncoded + tokensEncoded;
|
|
25325
|
+
}
|
|
25326
|
+
function decodeAbiEncodedBytes(hexData) {
|
|
25327
|
+
const data = hexData.startsWith("0x") ? hexData.slice(2) : hexData;
|
|
25328
|
+
const lengthHex = data.slice(64, 128);
|
|
25329
|
+
const length = parseInt(lengthHex, 16);
|
|
25330
|
+
const actualData = data.slice(128, 128 + length * 2);
|
|
25331
|
+
return actualData;
|
|
25332
|
+
}
|
|
25333
|
+
function parseBalanceFetcherResult(hexData, users, tokens) {
|
|
25334
|
+
let data = hexData.startsWith("0x") ? hexData.slice(2) : hexData;
|
|
25335
|
+
if (data.length > 128 && data.slice(0, 64) === "0000000000000000000000000000000000000000000000000000000000000020") {
|
|
25336
|
+
data = decodeAbiEncodedBytes(data);
|
|
25337
|
+
}
|
|
25338
|
+
let offset = 0;
|
|
25339
|
+
const blockNumberHex = data.slice(offset, offset + 16);
|
|
25340
|
+
const blockNumber = BigInt("0x" + blockNumberHex);
|
|
25341
|
+
offset += 16;
|
|
25342
|
+
const results = [];
|
|
25343
|
+
while (offset < data.length) {
|
|
25344
|
+
if (offset + 8 > data.length) break;
|
|
25345
|
+
const userIndexHex = data.slice(offset, offset + 4);
|
|
25346
|
+
const userIndex = parseInt(userIndexHex, 16);
|
|
25347
|
+
offset += 4;
|
|
25348
|
+
const countHex = data.slice(offset, offset + 4);
|
|
25349
|
+
const count = parseInt(countHex, 16);
|
|
25350
|
+
offset += 4;
|
|
25351
|
+
const balances = {};
|
|
25352
|
+
for (let i = 0; i < count; i++) {
|
|
25353
|
+
if (offset + 32 > data.length) break;
|
|
25354
|
+
const tokenIndexHex = data.slice(offset, offset + 4);
|
|
25355
|
+
const tokenIndex = parseInt(tokenIndexHex, 16);
|
|
25356
|
+
offset += 4;
|
|
25357
|
+
const balanceHex = data.slice(offset, offset + 28);
|
|
25358
|
+
const balance = balanceHex ? BigInt("0x" + balanceHex) : 0n;
|
|
25359
|
+
offset += 28;
|
|
25360
|
+
const tokenAddress = tokens[tokenIndex];
|
|
25361
|
+
if (tokenAddress) {
|
|
25362
|
+
balances[tokenAddress] = {
|
|
25363
|
+
tokenIndex,
|
|
25364
|
+
tokenAddress,
|
|
25365
|
+
balance
|
|
25366
|
+
};
|
|
25367
|
+
}
|
|
25368
|
+
}
|
|
25369
|
+
results.push({
|
|
25370
|
+
userIndex,
|
|
25371
|
+
userAddress: users[userIndex],
|
|
25372
|
+
balances
|
|
25373
|
+
});
|
|
25374
|
+
}
|
|
25375
|
+
return {
|
|
25376
|
+
balances: results,
|
|
25377
|
+
blockNumber
|
|
25378
|
+
};
|
|
25379
|
+
}
|
|
25380
|
+
function prepareTokenBalanceRpcCalls(chainId, account, tokens, blockTag = "latest") {
|
|
25381
|
+
const normalizedAccount = account.toLowerCase();
|
|
25382
|
+
const normalizedTokens = tokens.map((t) => t.toLowerCase());
|
|
25383
|
+
const tokensWithNative = [zeroAddress, ...normalizedTokens];
|
|
25384
|
+
const encodedCalldata = encodeBalanceFetcherCalldata([normalizedAccount], tokensWithNative);
|
|
25385
|
+
const dataLength = (encodedCalldata.length - 2) / 2;
|
|
25386
|
+
const paddedLength = Math.ceil(dataLength / 32) * 32;
|
|
25387
|
+
const offsetHex = "0000000000000000000000000000000000000000000000000000000000000020";
|
|
25388
|
+
const lengthHex = dataLength.toString(16).padStart(64, "0");
|
|
25389
|
+
const dataHex = encodedCalldata.slice(2).padEnd(paddedLength * 2, "0");
|
|
25390
|
+
const fullCalldata = BALANCE_FETCHER_SELECTOR + offsetHex + lengthHex + dataHex;
|
|
25391
|
+
const call = {
|
|
25392
|
+
jsonrpc: "2.0",
|
|
25393
|
+
id: 1,
|
|
25394
|
+
method: "eth_call",
|
|
25395
|
+
params: [
|
|
25396
|
+
{
|
|
25397
|
+
to: BALANCE_FETCHER,
|
|
25398
|
+
data: fullCalldata
|
|
25399
|
+
},
|
|
25400
|
+
blockTag
|
|
25401
|
+
]
|
|
25402
|
+
};
|
|
25403
|
+
return {
|
|
25404
|
+
call,
|
|
25405
|
+
query: {
|
|
25406
|
+
chainId,
|
|
25407
|
+
account: normalizedAccount,
|
|
25408
|
+
tokens: tokensWithNative
|
|
25409
|
+
},
|
|
25410
|
+
encodedCalldata
|
|
25411
|
+
};
|
|
25412
|
+
}
|
|
25413
|
+
function parseTokenBalanceResult(rawResult, query2) {
|
|
25414
|
+
if (!rawResult || rawResult === "0x") {
|
|
25415
|
+
return {};
|
|
25416
|
+
}
|
|
25417
|
+
const parsed = parseBalanceFetcherResult(
|
|
25418
|
+
rawResult,
|
|
25419
|
+
[query2.account],
|
|
25420
|
+
query2.tokens
|
|
25421
|
+
);
|
|
25422
|
+
if (parsed.balances.length === 0) {
|
|
25423
|
+
return {};
|
|
25424
|
+
}
|
|
25425
|
+
const result = {};
|
|
25426
|
+
const userBalances = parsed.balances[0].balances;
|
|
25427
|
+
for (const token of query2.tokens) {
|
|
25428
|
+
const balanceEntry = userBalances[token];
|
|
25429
|
+
if (balanceEntry) {
|
|
25430
|
+
result[token] = {
|
|
25431
|
+
balanceRaw: balanceEntry.balance.toString(),
|
|
25432
|
+
balance: balanceEntry.balance
|
|
25433
|
+
};
|
|
25434
|
+
} else {
|
|
25435
|
+
result[token] = {
|
|
25436
|
+
balanceRaw: "0",
|
|
25437
|
+
balance: 0n
|
|
25438
|
+
};
|
|
25439
|
+
}
|
|
25440
|
+
}
|
|
25441
|
+
return result;
|
|
25442
|
+
}
|
|
25443
|
+
async function fetchTokenBalances(chainId, account, tokens, options = {}) {
|
|
25444
|
+
const { blockTag = "latest", rpcUrl } = options;
|
|
25445
|
+
const prepared = prepareTokenBalanceRpcCalls(chainId, account, tokens, blockTag);
|
|
25446
|
+
const chain = getEvmChain(chainId);
|
|
25447
|
+
const url = rpcUrl || chain.rpcUrls?.default?.http?.[0];
|
|
25448
|
+
if (!url) {
|
|
25449
|
+
throw new Error(`No RPC URL available for chain ${chainId}`);
|
|
25450
|
+
}
|
|
25451
|
+
const response = await fetch(url, {
|
|
25452
|
+
method: "POST",
|
|
25453
|
+
headers: {
|
|
25454
|
+
"Content-Type": "application/json"
|
|
25455
|
+
},
|
|
25456
|
+
body: JSON.stringify(prepared.call)
|
|
25457
|
+
});
|
|
25458
|
+
if (!response.ok) {
|
|
25459
|
+
throw new Error(`RPC request failed: ${response.status} ${response.statusText}`);
|
|
25460
|
+
}
|
|
25461
|
+
const result = await response.json();
|
|
25462
|
+
if (result.error) {
|
|
25463
|
+
throw new Error(`RPC error: ${JSON.stringify(result.error)}`);
|
|
25464
|
+
}
|
|
25465
|
+
return parseTokenBalanceResult(result.result || "0x", prepared.query);
|
|
25466
|
+
}
|
|
24837
25467
|
|
|
24838
|
-
export { MORPHO_LENS, MorphoLensAbi, attachPricesToFlashLiquidity, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, fetchDefillamaData, fetchDefillamaHistData, fetchFlashLiquidityForChain, fetchGeneralYields,
|
|
25468
|
+
export { MORPHO_LENS, MorphoLensAbi, attachPricesToFlashLiquidity, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSummaries, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, encodeBalanceFetcherCalldata, fetchDefillamaData, fetchDefillamaHistData, fetchFlashLiquidityForChain, fetchGeneralYields, fetchMainPrices, fetchOraclePrices, fetchPendlePrices, fetchTokenBalances, fetchTokenMetadata, filterActiveLenders, filterLendersByProtocol, flattenToUSDPriceMap, fuseLenderData, generateLendingPairs, generateLendingPools, getAavesForChain, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getMorphoTypeMarketConverter, getTopPairs, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR, multicall3Abi, normalizeToBytes, parseBalanceFetcherResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, prepareLenderUserDataRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, unflattenLenderData };
|
|
24839
25469
|
//# sourceMappingURL=index.js.map
|
|
24840
25470
|
//# sourceMappingURL=index.js.map
|