upshift-finance 1.0.0
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/LICENSE +21 -0
- package/README.md +349 -0
- package/lib/abis/AddressResolver.d.ts +28 -0
- package/lib/abis/AddressResolver.js +23 -0
- package/lib/abis/ChainlinkV3.d.ts +87 -0
- package/lib/abis/ChainlinkV3.js +117 -0
- package/lib/abis/ERC20.d.ts +168 -0
- package/lib/abis/ERC20.js +226 -0
- package/lib/abis/ERC20_Bytes32.d.ts +139 -0
- package/lib/abis/ERC20_Bytes32.js +196 -0
- package/lib/abis/ERC4626.d.ts +364 -0
- package/lib/abis/ERC4626.js +507 -0
- package/lib/abis/ERC721.d.ts +231 -0
- package/lib/abis/ERC721.js +321 -0
- package/lib/abis/FeeOracle.d.ts +120 -0
- package/lib/abis/FeeOracle.js +162 -0
- package/lib/abis/LendingPool.d.ts +1393 -0
- package/lib/abis/LendingPool.js +1807 -0
- package/lib/abis/LendingPoolV2.d.ts +1413 -0
- package/lib/abis/LendingPoolV2.js +1833 -0
- package/lib/abis/LendingPoolV3.d.ts +1677 -0
- package/lib/abis/LendingPoolV3.js +1160 -0
- package/lib/abis/Loan.d.ts +837 -0
- package/lib/abis/Loan.js +1080 -0
- package/lib/abis/MultiAssetNativeDepositWrapper.d.ts +137 -0
- package/lib/abis/MultiAssetNativeDepositWrapper.js +125 -0
- package/lib/abis/Multicall3.d.ts +30 -0
- package/lib/abis/Multicall3.js +97 -0
- package/lib/abis/OFT.d.ts +116 -0
- package/lib/abis/OFT.js +85 -0
- package/lib/abis/PoolAdapter.d.ts +36 -0
- package/lib/abis/PoolAdapter.js +51 -0
- package/lib/abis/RewardDistributor.d.ts +267 -0
- package/lib/abis/RewardDistributor.js +352 -0
- package/lib/abis/RwaRedeemSubaccount.d.ts +747 -0
- package/lib/abis/RwaRedeemSubaccount.js +548 -0
- package/lib/abis/SmartAccount.d.ts +17 -0
- package/lib/abis/SmartAccount.js +19 -0
- package/lib/abis/SwapRouter.d.ts +1043 -0
- package/lib/abis/SwapRouter.js +740 -0
- package/lib/abis/TextResolver.d.ts +16 -0
- package/lib/abis/TextResolver.js +16 -0
- package/lib/abis/TokenizedVaultV2.d.ts +1364 -0
- package/lib/abis/TokenizedVaultV2.js +1041 -0
- package/lib/abis/TokenizedVaultV2DepositWithPermit.d.ts +1456 -0
- package/lib/abis/TokenizedVaultV2DepositWithPermit.js +1878 -0
- package/lib/abis/TokenizedVaultV2Receipt.d.ts +1568 -0
- package/lib/abis/TokenizedVaultV2Receipt.js +1061 -0
- package/lib/abis/TokenizedVaultV2SenderAllocationWhitelist.d.ts +454 -0
- package/lib/abis/TokenizedVaultV2SenderAllocationWhitelist.js +327 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAllocation.d.ts +1466 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAllocation.js +1092 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.d.ts +274 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.js +167 -0
- package/lib/abis/UniversalResolverResolve.d.ts +69 -0
- package/lib/abis/UniversalResolverResolve.js +35 -0
- package/lib/abis/UniversalSignatureValidator.d.ts +17 -0
- package/lib/abis/UniversalSignatureValidator.js +30 -0
- package/lib/abis/WrapperAdapter.d.ts +71 -0
- package/lib/abis/WrapperAdapter.js +77 -0
- package/lib/abis/index.d.ts +34 -0
- package/lib/abis/index.js +51 -0
- package/lib/adapters/evm/getters.d.ts +19 -0
- package/lib/adapters/evm/getters.js +209 -0
- package/lib/adapters/evm/index.d.ts +353 -0
- package/lib/adapters/evm/index.js +434 -0
- package/lib/adapters/evm/utils.d.ts +8 -0
- package/lib/adapters/evm/utils.js +51 -0
- package/lib/adapters/solana/constants.d.ts +33 -0
- package/lib/adapters/solana/constants.js +52 -0
- package/lib/adapters/solana/getters.d.ts +11 -0
- package/lib/adapters/solana/getters.js +165 -0
- package/lib/adapters/solana/idl/vault-idl.d.ts +272 -0
- package/lib/adapters/solana/idl/vault-idl.js +1084 -0
- package/lib/adapters/solana/index.d.ts +233 -0
- package/lib/adapters/solana/index.js +291 -0
- package/lib/adapters/solana/types.d.ts +67 -0
- package/lib/adapters/solana/types.js +3 -0
- package/lib/adapters/solana/utils.d.ts +141 -0
- package/lib/adapters/solana/utils.js +595 -0
- package/lib/adapters/solana/vault.actions.d.ts +57 -0
- package/lib/adapters/solana/vault.actions.js +379 -0
- package/lib/adapters/stellar/actions.d.ts +28 -0
- package/lib/adapters/stellar/actions.js +77 -0
- package/lib/adapters/stellar/constants.d.ts +43 -0
- package/lib/adapters/stellar/constants.js +53 -0
- package/lib/adapters/stellar/getters.d.ts +68 -0
- package/lib/adapters/stellar/getters.js +290 -0
- package/lib/adapters/stellar/index.d.ts +114 -0
- package/lib/adapters/stellar/index.js +175 -0
- package/lib/adapters/stellar/soroban.d.ts +123 -0
- package/lib/adapters/stellar/soroban.js +613 -0
- package/lib/adapters/stellar/submit.d.ts +34 -0
- package/lib/adapters/stellar/submit.js +149 -0
- package/lib/adapters/stellar/types.d.ts +58 -0
- package/lib/adapters/stellar/types.js +6 -0
- package/lib/adapters/stellar/utils.d.ts +24 -0
- package/lib/adapters/stellar/utils.js +34 -0
- package/lib/adapters/sui/constants.d.ts +14 -0
- package/lib/adapters/sui/constants.js +29 -0
- package/lib/adapters/sui/getters.d.ts +9 -0
- package/lib/adapters/sui/getters.js +60 -0
- package/lib/adapters/sui/index.d.ts +45 -0
- package/lib/adapters/sui/index.js +101 -0
- package/lib/adapters/sui/transformer.d.ts +10 -0
- package/lib/adapters/sui/transformer.js +107 -0
- package/lib/adapters/sui/types.d.ts +66 -0
- package/lib/adapters/sui/types.js +3 -0
- package/lib/adapters/sui/utils.d.ts +10 -0
- package/lib/adapters/sui/utils.js +29 -0
- package/lib/core/analytics/chain-name.d.ts +9 -0
- package/lib/core/analytics/chain-name.js +34 -0
- package/lib/core/analytics/constants.d.ts +5 -0
- package/lib/core/analytics/constants.js +9 -0
- package/lib/core/analytics/env.d.ts +29 -0
- package/lib/core/analytics/env.js +59 -0
- package/lib/core/analytics/index.d.ts +36 -0
- package/lib/core/analytics/index.js +79 -0
- package/lib/core/analytics/instrumentation.d.ts +29 -0
- package/lib/core/analytics/instrumentation.js +277 -0
- package/lib/core/analytics/method-taxonomy.d.ts +19 -0
- package/lib/core/analytics/method-taxonomy.js +128 -0
- package/lib/core/analytics/metrics.d.ts +33 -0
- package/lib/core/analytics/metrics.js +116 -0
- package/lib/core/analytics/sanitize.d.ts +44 -0
- package/lib/core/analytics/sanitize.js +260 -0
- package/lib/core/analytics/sentry-runtime.d.ts +15 -0
- package/lib/core/analytics/sentry-runtime.js +97 -0
- package/lib/core/analytics/sentry.d.ts +67 -0
- package/lib/core/analytics/sentry.js +613 -0
- package/lib/core/analytics/types.d.ts +48 -0
- package/lib/core/analytics/types.js +3 -0
- package/lib/core/analytics/user-identity.d.ts +41 -0
- package/lib/core/analytics/user-identity.js +141 -0
- package/lib/core/analytics/version.d.ts +6 -0
- package/lib/core/analytics/version.js +10 -0
- package/lib/core/attribution.d.ts +111 -0
- package/lib/core/attribution.js +142 -0
- package/lib/core/auth/index.d.ts +1 -0
- package/lib/core/auth/index.js +18 -0
- package/lib/core/auth/verify.d.ts +2 -0
- package/lib/core/auth/verify.js +31 -0
- package/lib/core/base.class.d.ts +152 -0
- package/lib/core/base.class.js +172 -0
- package/lib/core/cache.d.ts +9 -0
- package/lib/core/cache.js +31 -0
- package/lib/core/constants/adapters.d.ts +103 -0
- package/lib/core/constants/adapters.js +180 -0
- package/lib/core/constants/core.d.ts +133 -0
- package/lib/core/constants/core.js +209 -0
- package/lib/core/constants/swap-router.d.ts +150 -0
- package/lib/core/constants/swap-router.js +169 -0
- package/lib/core/constants/vaults.d.ts +93 -0
- package/lib/core/constants/vaults.js +273 -0
- package/lib/core/constants/web3.d.ts +91 -0
- package/lib/core/constants/web3.js +229 -0
- package/lib/core/errors/index.d.ts +114 -0
- package/lib/core/errors/index.js +183 -0
- package/lib/core/fetcher.d.ts +198 -0
- package/lib/core/fetcher.js +903 -0
- package/lib/core/helpers/adapters.d.ts +13 -0
- package/lib/core/helpers/adapters.js +39 -0
- package/lib/core/helpers/chain-address.d.ts +13 -0
- package/lib/core/helpers/chain-address.js +47 -0
- package/lib/core/helpers/chain-error.d.ts +207 -0
- package/lib/core/helpers/chain-error.js +682 -0
- package/lib/core/helpers/chain-support.d.ts +80 -0
- package/lib/core/helpers/chain-support.js +115 -0
- package/lib/core/helpers/core.d.ts +68 -0
- package/lib/core/helpers/core.js +285 -0
- package/lib/core/helpers/explorer-link.d.ts +16 -0
- package/lib/core/helpers/explorer-link.js +26 -0
- package/lib/core/helpers/multicall.d.ts +68 -0
- package/lib/core/helpers/multicall.js +103 -0
- package/lib/core/helpers/revert-decode.d.ts +248 -0
- package/lib/core/helpers/revert-decode.js +515 -0
- package/lib/core/helpers/signer.d.ts +52 -0
- package/lib/core/helpers/signer.js +145 -0
- package/lib/core/helpers/swap-router.d.ts +211 -0
- package/lib/core/helpers/swap-router.js +480 -0
- package/lib/core/helpers/vault-version.d.ts +23 -0
- package/lib/core/helpers/vault-version.js +75 -0
- package/lib/core/helpers/vaults.d.ts +89 -0
- package/lib/core/helpers/vaults.js +235 -0
- package/lib/core/helpers/web3.d.ts +353 -0
- package/lib/core/helpers/web3.js +992 -0
- package/lib/core/index.d.ts +23 -0
- package/lib/core/index.js +40 -0
- package/lib/core/logger/index.d.ts +98 -0
- package/lib/core/logger/index.js +144 -0
- package/lib/core/logger/slack.d.ts +16 -0
- package/lib/core/logger/slack.js +57 -0
- package/lib/core/vault-metadata.d.ts +12 -0
- package/lib/core/vault-metadata.js +42 -0
- package/lib/core/version-check.d.ts +58 -0
- package/lib/core/version-check.js +182 -0
- package/lib/evm/index.d.ts +2 -0
- package/lib/evm/index.js +19 -0
- package/lib/evm/methods/crossChainVault.d.ts +128 -0
- package/lib/evm/methods/crossChainVault.js +853 -0
- package/lib/evm/methods/crossChainVaultRegistry.d.ts +93 -0
- package/lib/evm/methods/crossChainVaultRegistry.js +240 -0
- package/lib/evm/methods/index.d.ts +2 -0
- package/lib/evm/methods/index.js +19 -0
- package/lib/evm/types/crossChain.d.ts +363 -0
- package/lib/evm/types/crossChain.js +20 -0
- package/lib/evm/types/index.d.ts +1 -0
- package/lib/evm/types/index.js +18 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +52 -0
- package/lib/main.d.ts +527 -0
- package/lib/main.js +601 -0
- package/lib/modules/api/fetcher.d.ts +82 -0
- package/lib/modules/api/fetcher.js +150 -0
- package/lib/modules/api/index.d.ts +1 -0
- package/lib/modules/api/index.js +6 -0
- package/lib/modules/api/main.d.ts +313 -0
- package/lib/modules/api/main.js +479 -0
- package/lib/modules/sub-accounts/fetcher.d.ts +53 -0
- package/lib/modules/sub-accounts/fetcher.js +120 -0
- package/lib/modules/sub-accounts/index.d.ts +2 -0
- package/lib/modules/sub-accounts/index.js +19 -0
- package/lib/modules/sub-accounts/main.d.ts +243 -0
- package/lib/modules/sub-accounts/main.js +205 -0
- package/lib/modules/sub-accounts/utils.d.ts +106 -0
- package/lib/modules/sub-accounts/utils.js +112 -0
- package/lib/modules/vaults/adapter.helpers.d.ts +64 -0
- package/lib/modules/vaults/adapter.helpers.js +184 -0
- package/lib/modules/vaults/fetcher.d.ts +147 -0
- package/lib/modules/vaults/fetcher.js +368 -0
- package/lib/modules/vaults/getters.d.ts +570 -0
- package/lib/modules/vaults/getters.js +3051 -0
- package/lib/modules/vaults/index.d.ts +20 -0
- package/lib/modules/vaults/index.js +44 -0
- package/lib/modules/vaults/main.d.ts +601 -0
- package/lib/modules/vaults/main.js +1623 -0
- package/lib/modules/vaults/prefetch.d.ts +65 -0
- package/lib/modules/vaults/prefetch.js +120 -0
- package/lib/modules/vaults/read.actions.d.ts +225 -0
- package/lib/modules/vaults/read.actions.js +596 -0
- package/lib/modules/vaults/types.d.ts +71 -0
- package/lib/modules/vaults/types.js +3 -0
- package/lib/modules/vaults/utils/call-data-decoder.d.ts +61 -0
- package/lib/modules/vaults/utils/call-data-decoder.js +194 -0
- package/lib/modules/vaults/utils/date-utils.d.ts +50 -0
- package/lib/modules/vaults/utils/date-utils.js +84 -0
- package/lib/modules/vaults/utils.d.ts +140 -0
- package/lib/modules/vaults/utils.js +799 -0
- package/lib/modules/vaults/write.actions.d.ts +529 -0
- package/lib/modules/vaults/write.actions.js +1749 -0
- package/lib/polyfills.d.ts +1 -0
- package/lib/polyfills.js +12 -0
- package/lib/sdk.d.ts +26721 -0
- package/lib/services/coingecko/fetcher.d.ts +15 -0
- package/lib/services/coingecko/fetcher.js +67 -0
- package/lib/services/coingecko/index.d.ts +2 -0
- package/lib/services/coingecko/index.js +19 -0
- package/lib/services/coingecko/utils.d.ts +1 -0
- package/lib/services/coingecko/utils.js +24 -0
- package/lib/services/debank/fetcher.d.ts +126 -0
- package/lib/services/debank/fetcher.js +47 -0
- package/lib/services/debank/index.d.ts +2 -0
- package/lib/services/debank/index.js +19 -0
- package/lib/services/debank/utils.d.ts +38 -0
- package/lib/services/debank/utils.js +297 -0
- package/lib/services/layerzero/deposits.d.ts +49 -0
- package/lib/services/layerzero/deposits.js +166 -0
- package/lib/services/layerzero/redeems.d.ts +20 -0
- package/lib/services/layerzero/redeems.js +92 -0
- package/lib/services/layerzero/utils.d.ts +9 -0
- package/lib/services/layerzero/utils.js +22 -0
- package/lib/services/octavfi/fetcher.d.ts +9 -0
- package/lib/services/octavfi/fetcher.js +103 -0
- package/lib/services/octavfi/index.d.ts +3 -0
- package/lib/services/octavfi/index.js +20 -0
- package/lib/services/octavfi/types.d.ts +34 -0
- package/lib/services/octavfi/types.js +3 -0
- package/lib/services/octavfi/utils.d.ts +16 -0
- package/lib/services/octavfi/utils.js +212 -0
- package/lib/services/subgraph/fetcher.d.ts +2 -0
- package/lib/services/subgraph/fetcher.js +61 -0
- package/lib/services/subgraph/index.d.ts +2 -0
- package/lib/services/subgraph/index.js +19 -0
- package/lib/services/subgraph/schema.d.ts +45 -0
- package/lib/services/subgraph/schema.js +75 -0
- package/lib/services/subgraph/vaults.d.ts +25 -0
- package/lib/services/subgraph/vaults.js +1106 -0
- package/lib/services/swap-quotes/index.d.ts +105 -0
- package/lib/services/swap-quotes/index.js +77 -0
- package/lib/services/swap-quotes/paraswap.d.ts +51 -0
- package/lib/services/swap-quotes/paraswap.js +138 -0
- package/lib/types/api.d.ts +280 -0
- package/lib/types/api.js +3 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +28 -0
- package/lib/types/points.d.ts +28 -0
- package/lib/types/points.js +3 -0
- package/lib/types/pools.d.ts +144 -0
- package/lib/types/pools.js +3 -0
- package/lib/types/staking.d.ts +28 -0
- package/lib/types/staking.js +3 -0
- package/lib/types/sub-accounts.d.ts +140 -0
- package/lib/types/sub-accounts.js +3 -0
- package/lib/types/subgraph.d.ts +74 -0
- package/lib/types/subgraph.js +3 -0
- package/lib/types/typed-contract.d.ts +102 -0
- package/lib/types/typed-contract.js +3 -0
- package/lib/types/user.d.ts +1 -0
- package/lib/types/user.js +3 -0
- package/lib/types/vaults.d.ts +714 -0
- package/lib/types/vaults.js +24 -0
- package/lib/types/web3.d.ts +51 -0
- package/lib/types/web3.js +14 -0
- package/lib/types/webserver.d.ts +698 -0
- package/lib/types/webserver.js +3 -0
- package/package.json +78 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchVaultMetadata = void 0;
|
|
4
|
+
exports.fetchArchivedVaults = fetchArchivedVaults;
|
|
5
|
+
exports.isArchivedVault = isArchivedVault;
|
|
6
|
+
exports.fetchVaultWithFallback = fetchVaultWithFallback;
|
|
7
|
+
exports.fetchVaultsBatch = fetchVaultsBatch;
|
|
8
|
+
exports.fetchVaultsComprehensive = fetchVaultsComprehensive;
|
|
9
|
+
exports.filterVaultsIntelligently = filterVaultsIntelligently;
|
|
10
|
+
const core_1 = require("../../core");
|
|
11
|
+
const ARCHIVED_VAULTS_CACHE_KEY = 'archived_vaults';
|
|
12
|
+
const ARCHIVED_VAULTS_TTL_MS = 10 * 60 * 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Fetch the set of vaults whose deposit/withdraw history is served from the
|
|
15
|
+
* backend Mongo snapshot (`/upshift/vault_history`) rather than their (retired)
|
|
16
|
+
* Goldsky subgraph.
|
|
17
|
+
*
|
|
18
|
+
* This is the routing source of truth: a vault appears here only once its
|
|
19
|
+
* history has been backfilled, so the SDK can never reroute a vault to empty
|
|
20
|
+
* snapshot data ahead of its backfill. Result is cached for 10 minutes.
|
|
21
|
+
*
|
|
22
|
+
* Side effects: one HTTP GET to the public API (cached).
|
|
23
|
+
*
|
|
24
|
+
* @returns A set of lowercased vault addresses. Empty on any error — callers
|
|
25
|
+
* then fall back to the subgraph path, which is the safe default while
|
|
26
|
+
* subgraphs still exist.
|
|
27
|
+
*/
|
|
28
|
+
async function fetchArchivedVaults() {
|
|
29
|
+
const cached = core_1.CACHE.get(ARCHIVED_VAULTS_CACHE_KEY);
|
|
30
|
+
if (cached)
|
|
31
|
+
return cached;
|
|
32
|
+
try {
|
|
33
|
+
const response = await (0, core_1.fetchAugustPublic)(core_1.WEBSERVER_ENDPOINTS.public.tokenizedVault.archivedVaults);
|
|
34
|
+
if (response.status !== 200) {
|
|
35
|
+
core_1.Logger.log.error('fetchArchivedVaults', `non-200 from archived endpoint: ${response.status}`);
|
|
36
|
+
return new Set();
|
|
37
|
+
}
|
|
38
|
+
const addresses = (await response.json());
|
|
39
|
+
const set = new Set(addresses.map((a) => a.toLowerCase()));
|
|
40
|
+
core_1.CACHE.set(ARCHIVED_VAULTS_CACHE_KEY, set, { ttl: ARCHIVED_VAULTS_TTL_MS });
|
|
41
|
+
return set;
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
core_1.Logger.log.error('fetchArchivedVaults', e);
|
|
45
|
+
return new Set();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether a vault's history should be served from the backend snapshot rather
|
|
50
|
+
* than its subgraph. Backed by {@link fetchArchivedVaults} (cached).
|
|
51
|
+
*
|
|
52
|
+
* @param vaultAddress - The vault contract address (any casing).
|
|
53
|
+
* @returns `true` if the vault has a backfilled history snapshot.
|
|
54
|
+
*/
|
|
55
|
+
async function isArchivedVault(vaultAddress) {
|
|
56
|
+
const archived = await fetchArchivedVaults();
|
|
57
|
+
return archived.has(vaultAddress.toLowerCase());
|
|
58
|
+
}
|
|
59
|
+
/** @internal */
|
|
60
|
+
async function runWithConcurrency(tasks, limit) {
|
|
61
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
62
|
+
throw new Error(`runWithConcurrency: limit must be a positive finite number, got ${limit}`);
|
|
63
|
+
}
|
|
64
|
+
const results = new Array(tasks.length);
|
|
65
|
+
let nextIndex = 0;
|
|
66
|
+
const workerCount = Math.min(Math.floor(limit), tasks.length);
|
|
67
|
+
// `nextIndex++` is safe across workers — JS is single-threaded and the
|
|
68
|
+
// increment runs to completion before any worker yields at `await`.
|
|
69
|
+
const workers = Array.from({ length: workerCount }, async () => {
|
|
70
|
+
while (true) {
|
|
71
|
+
const i = nextIndex++;
|
|
72
|
+
if (i >= tasks.length)
|
|
73
|
+
return;
|
|
74
|
+
results[i] = await tasks[i]();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
await Promise.all(workers);
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Specialized vault fetching with enhanced retry logic and fallback strategies
|
|
82
|
+
* This function attempts to fetch vault data with multiple fallback approaches
|
|
83
|
+
*
|
|
84
|
+
* The return shape is "success flag wins": when `success === true`, `data` is
|
|
85
|
+
* the resolved value (which may legitimately be falsy — `0`, `''`, `0n`,
|
|
86
|
+
* `null`); when `success === false`, `error` is populated. Callers must branch
|
|
87
|
+
* on `success`, not on the truthiness of `data`.
|
|
88
|
+
*/
|
|
89
|
+
async function fetchVaultWithFallback(vaultAddress, fetchFn, options = {}) {
|
|
90
|
+
const { maxRetries = 3, baseDelay = 1000 } = options;
|
|
91
|
+
try {
|
|
92
|
+
const data = await (0, core_1.withRetry)(fetchFn, maxRetries * 2, baseDelay * 2);
|
|
93
|
+
return { success: true, data, strategy: 'extended-retry' };
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
core_1.Logger.log.warn('fetchVaultWithFallback:extended_retry_failed', {
|
|
97
|
+
vault: vaultAddress,
|
|
98
|
+
error,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: new Error(`All strategies failed for vault ${vaultAddress}`),
|
|
104
|
+
strategy: 'all-failed',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Batch vault fetching with intelligent retry and fallback
|
|
109
|
+
* Ensures maximum vault coverage by trying multiple strategies
|
|
110
|
+
*/
|
|
111
|
+
async function fetchVaultsBatch(vaults, options = {}) {
|
|
112
|
+
const { maxRetries = 3, baseDelay = 1000, batchSize = 10, parallelLimit = batchSize, } = options;
|
|
113
|
+
const successful = [];
|
|
114
|
+
const failed = [];
|
|
115
|
+
let totalAttempted = 0;
|
|
116
|
+
for (let i = 0; i < vaults.length; i += batchSize) {
|
|
117
|
+
const batch = vaults.slice(i, i + batchSize);
|
|
118
|
+
const batchTasks = batch.map((vault, batchIndex) => async () => {
|
|
119
|
+
const globalIndex = i + batchIndex;
|
|
120
|
+
totalAttempted++;
|
|
121
|
+
try {
|
|
122
|
+
const result = await fetchVaultWithFallback(vault.address, vault.fetchFn, {
|
|
123
|
+
maxRetries,
|
|
124
|
+
baseDelay,
|
|
125
|
+
});
|
|
126
|
+
// Branch on `result.success` only — not on truthiness of `result.data`.
|
|
127
|
+
// A successful fetch can legitimately resolve to a falsy value
|
|
128
|
+
// (`0`, `''`, `0n`, `null`); the cast respects the function's
|
|
129
|
+
// documented contract that `data` is present on the success branch.
|
|
130
|
+
if (result.success) {
|
|
131
|
+
successful.push({
|
|
132
|
+
index: globalIndex,
|
|
133
|
+
data: result.data,
|
|
134
|
+
strategy: result.strategy,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
failed.push({
|
|
139
|
+
index: globalIndex,
|
|
140
|
+
error: result.error ?? new Error('Unknown failure'),
|
|
141
|
+
address: vault.address,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
failed.push({
|
|
147
|
+
index: globalIndex,
|
|
148
|
+
error: error,
|
|
149
|
+
address: vault.address,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
await runWithConcurrency(batchTasks, parallelLimit);
|
|
154
|
+
// Small delay between batches to be respectful to RPC endpoints
|
|
155
|
+
if (i + batchSize < vaults.length) {
|
|
156
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const successRate = totalAttempted > 0 ? (successful.length / totalAttempted) * 100 : 0;
|
|
160
|
+
return {
|
|
161
|
+
successful,
|
|
162
|
+
failed,
|
|
163
|
+
totalAttempted,
|
|
164
|
+
successRate,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Comprehensive vault fetching that handles all failure points
|
|
169
|
+
* This function ensures maximum vault coverage by implementing multiple strategies
|
|
170
|
+
*/
|
|
171
|
+
async function fetchVaultsComprehensive(vaults, fetchFn, options = {}) {
|
|
172
|
+
const { maxRetries = 5, baseDelay = 2000, batchSize = 10, parallelLimit = batchSize, includeClosed: _includeClosed = false, // Reserved for future filtering
|
|
173
|
+
includeInvisible: _includeInvisible = false, // Reserved for future filtering
|
|
174
|
+
fallbackRpcUrls = {}, timeout = 60000, } = options;
|
|
175
|
+
const successful = [];
|
|
176
|
+
const failed = [];
|
|
177
|
+
const rpcFailures = {};
|
|
178
|
+
let totalAttempted = 0;
|
|
179
|
+
for (let i = 0; i < vaults.length; i += batchSize) {
|
|
180
|
+
const batch = vaults.slice(i, i + batchSize);
|
|
181
|
+
const batchTasks = batch.map((vault, batchIndex) => async () => {
|
|
182
|
+
const globalIndex = i + batchIndex;
|
|
183
|
+
totalAttempted++;
|
|
184
|
+
let attempts = 0;
|
|
185
|
+
let lastError;
|
|
186
|
+
// Strategy 1: Primary fetch with retry
|
|
187
|
+
for (attempts = 1; attempts <= maxRetries; attempts++) {
|
|
188
|
+
try {
|
|
189
|
+
const data = await Promise.race([
|
|
190
|
+
fetchFn(vault),
|
|
191
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Primary fetch timeout')), timeout)),
|
|
192
|
+
]);
|
|
193
|
+
successful.push({
|
|
194
|
+
index: globalIndex,
|
|
195
|
+
data,
|
|
196
|
+
strategy: 'primary-retry',
|
|
197
|
+
attempts,
|
|
198
|
+
});
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
lastError = error;
|
|
203
|
+
if (attempts < maxRetries) {
|
|
204
|
+
const delay = baseDelay * 2 ** (attempts - 1);
|
|
205
|
+
core_1.Logger.log.warn('fetchVaultsComprehensive', `Vault ${vault.address} attempt ${attempts} failed, retrying in ${delay}ms: ${error.message}`);
|
|
206
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Strategy 2: Try with fallback RPC endpoints
|
|
211
|
+
if (fallbackRpcUrls[vault.chain] &&
|
|
212
|
+
fallbackRpcUrls[vault.chain].length > 0) {
|
|
213
|
+
for (const fallbackRpc of fallbackRpcUrls[vault.chain]) {
|
|
214
|
+
try {
|
|
215
|
+
const data = await Promise.race([
|
|
216
|
+
fetchFn({ ...vault, fallbackRpc }),
|
|
217
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Fallback RPC timeout')), timeout)),
|
|
218
|
+
]);
|
|
219
|
+
successful.push({
|
|
220
|
+
index: globalIndex,
|
|
221
|
+
data,
|
|
222
|
+
strategy: 'fallback-rpc',
|
|
223
|
+
attempts: attempts + 1,
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
core_1.Logger.log.warn('fetchVault:fallback_rpc_failed', {
|
|
229
|
+
vault: vault.address,
|
|
230
|
+
fallbackRpc,
|
|
231
|
+
error: error instanceof Error ? error.message : String(error),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Strategy 3: Try with minimal data fetching (if fetchFn supports it)
|
|
237
|
+
try {
|
|
238
|
+
const data = await Promise.race([
|
|
239
|
+
fetchFn({ ...vault, minimal: true }),
|
|
240
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Minimal fetch timeout')), timeout)),
|
|
241
|
+
]);
|
|
242
|
+
successful.push({
|
|
243
|
+
index: globalIndex,
|
|
244
|
+
data,
|
|
245
|
+
strategy: 'minimal-data',
|
|
246
|
+
attempts: attempts + 1,
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
core_1.Logger.log.warn('fetchVault:minimal_data_failed', {
|
|
252
|
+
vault: vault.address,
|
|
253
|
+
error: error instanceof Error ? error.message : String(error),
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Strategy 4: Extended retry with longer delays
|
|
257
|
+
try {
|
|
258
|
+
const extendedDelay = baseDelay * 3;
|
|
259
|
+
await new Promise((resolve) => setTimeout(resolve, extendedDelay));
|
|
260
|
+
const data = await Promise.race([
|
|
261
|
+
fetchFn(vault),
|
|
262
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Extended retry timeout')), timeout)),
|
|
263
|
+
]);
|
|
264
|
+
successful.push({
|
|
265
|
+
index: globalIndex,
|
|
266
|
+
data,
|
|
267
|
+
strategy: 'extended-retry',
|
|
268
|
+
attempts: attempts + 2,
|
|
269
|
+
});
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
core_1.Logger.log.warn('fetchVault:extended_retry_failed', {
|
|
274
|
+
vault: vault.address,
|
|
275
|
+
error: error instanceof Error ? error.message : String(error),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// All strategies failed
|
|
279
|
+
failed.push({
|
|
280
|
+
index: globalIndex,
|
|
281
|
+
error: lastError || new Error('All strategies failed'),
|
|
282
|
+
address: vault.address,
|
|
283
|
+
chain: vault.chain,
|
|
284
|
+
attempts: attempts + 2,
|
|
285
|
+
});
|
|
286
|
+
// Track RPC failures by chain
|
|
287
|
+
rpcFailures[vault.chain] = (rpcFailures[vault.chain] || 0) + 1;
|
|
288
|
+
});
|
|
289
|
+
await runWithConcurrency(batchTasks, parallelLimit);
|
|
290
|
+
// Small delay between batches to be respectful to RPC endpoints
|
|
291
|
+
if (i + batchSize < vaults.length) {
|
|
292
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const successRate = totalAttempted > 0 ? (successful.length / totalAttempted) * 100 : 0;
|
|
296
|
+
return {
|
|
297
|
+
successful,
|
|
298
|
+
failed,
|
|
299
|
+
totalAttempted,
|
|
300
|
+
successRate,
|
|
301
|
+
coverageReport: {
|
|
302
|
+
totalVaults: vaults.length,
|
|
303
|
+
successfulVaults: successful.length,
|
|
304
|
+
failedVaults: failed.length,
|
|
305
|
+
closedVaults: 0, // Will be calculated by the calling code
|
|
306
|
+
invisibleVaults: 0, // Will be calculated by the calling code
|
|
307
|
+
rpcFailures,
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Enhanced vault filtering that preserves more vaults while maintaining quality
|
|
313
|
+
*/
|
|
314
|
+
function filterVaultsIntelligently(vaults, options = {}) {
|
|
315
|
+
const { includeClosed = true, includeInvisible = true, includeNull = false, minStatus = ['active', 'closed'], } = options;
|
|
316
|
+
const active = [];
|
|
317
|
+
const closed = [];
|
|
318
|
+
const invisible = [];
|
|
319
|
+
const failed = [];
|
|
320
|
+
vaults.forEach((vault, index) => {
|
|
321
|
+
if (!vault) {
|
|
322
|
+
if (includeNull) {
|
|
323
|
+
failed.push({ index, reason: 'null_response' });
|
|
324
|
+
}
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const status = vault.status || 'unknown';
|
|
328
|
+
const isVisible = vault.isVisible ?? vault.is_visible ?? true;
|
|
329
|
+
if (status === 'active' && isVisible) {
|
|
330
|
+
active.push(vault);
|
|
331
|
+
}
|
|
332
|
+
else if (status === 'closed' && includeClosed) {
|
|
333
|
+
closed.push(vault);
|
|
334
|
+
}
|
|
335
|
+
else if (!isVisible && includeInvisible) {
|
|
336
|
+
invisible.push(vault);
|
|
337
|
+
}
|
|
338
|
+
else if (minStatus.includes(status)) {
|
|
339
|
+
active.push(vault);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
failed.push({
|
|
343
|
+
index,
|
|
344
|
+
reason: `status_${status}_invisible_${!isVisible}`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
const total = vaults.length;
|
|
349
|
+
const successCount = active.length + closed.length + invisible.length;
|
|
350
|
+
const successRate = total > 0 ? (successCount / total) * 100 : 0;
|
|
351
|
+
return {
|
|
352
|
+
active,
|
|
353
|
+
closed,
|
|
354
|
+
invisible,
|
|
355
|
+
failed,
|
|
356
|
+
summary: {
|
|
357
|
+
total,
|
|
358
|
+
active: active.length,
|
|
359
|
+
closed: closed.length,
|
|
360
|
+
invisible: invisible.length,
|
|
361
|
+
failed: failed.length,
|
|
362
|
+
successRate,
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
var vault_metadata_1 = require("../../core/vault-metadata");
|
|
367
|
+
Object.defineProperty(exports, "fetchVaultMetadata", { enumerable: true, get: function () { return vault_metadata_1.fetchVaultMetadata; } });
|
|
368
|
+
//# sourceMappingURL=fetcher.js.map
|