From a6e50f822191f06563620c4cba4a7148a97b8a2a Mon Sep 17 00:00:00 2001 From: rohannero Date: Fri, 3 Oct 2025 19:18:39 -0400 Subject: [PATCH 1/4] Track Ipor PlasmaVault fees --- fees/ipor-protocol/index.ts | 89 +++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 fees/ipor-protocol/index.ts diff --git a/fees/ipor-protocol/index.ts b/fees/ipor-protocol/index.ts new file mode 100644 index 0000000000..a763e32c6f --- /dev/null +++ b/fees/ipor-protocol/index.ts @@ -0,0 +1,89 @@ +import { FetchOptions, SimpleAdapter } from "../../adapters/types"; +import { CHAIN } from "../../helpers/chains"; +import ADDRESSES from "../../helpers/coreAssets.json"; + +// Vaults & token mappings per chain +const vaultsPerChain: Record = { + [CHAIN.ETHEREUM]: [ + { vault: "0x20e934c725b6703f0aC696F1689008057dB9Ac44", token: ADDRESSES.ethereum.DAI }, // IPOR DAI Ethereum + { vault: "0x43Ee0243eA8CF02f7087d8B16C8D2007CC9c7cA2", token: ADDRESSES.ethereum.USDC }, // IPOR USDC Ethereum + { vault: "0xAbAb980f0eCB232D52f422C6B68D25C3d0c18E3e", token: ADDRESSES.ethereum.USDT }, // IPOR USDT Ethereum + { vault: "0xf6cD9E8415162C8fb3C52676c7cA68812A34f76E", token: ADDRESSES.ethereum.WETH }, // Resevoir ETH Yield + { vault: "0xe9385eFf3F937FcB0f0085Da9A3F53D6C2B4fB5F", token: "0x09D4214C03D01F49544C0448DBE3A27f768F2b34" }, // Resevoir srUSD Looping Ethereum + { vault: "0xa435F140114910C96343574DD67883F7538ba736", token: ADDRESSES.ethereum.USDC }, // yUSD Loooper + { vault: "0xE47358eae04719f3CF7025E95d0AD202e68BD9b2", token: ADDRESSES.ethereum.WBTC }, // Resevoir BTC Yield + { vault: "0xB0f56BB0bf13ee05FeF8cD2d8DF5FfdFcAC7a74f", token: ADDRESSES.ethereum.USDC }, // TAU InfiniFI Pointsmax + { vault: "0x6f66b845604dad6E80b2A1472e6cAcbbE66A8C40", token: ADDRESSES.ethereum.USDC }, // TAU Resevoir Pointsmax + { vault: "0x43a32D4f6c582f281c52393f8F9E5AcE1D4A1E68", token: ADDRESSES.ethereum.USDC }, // TAU Yield Bond ETF + { vault: "0xD731F94c778f7C1090e2E0D797150A647De5188A", token: ADDRESSES.ethereum.USDe }, // Strata-Money PTs Looping Ethereum + ], + [CHAIN.ARBITRUM]: [ + { vault: "0xa91267A25939b2B0f046013fbF9597008F7F014b", token: ADDRESSES.arbitrum.USDC }, // IporPlasmaVaultUsdc + { vault: "0xcafC0A559a9Bf2fc77a7ECFaF04BD929a7D9c5Cf", token: ADDRESSES.arbitrum.USDC }, // Singularity Vault - USDC + { vault: "0x407D3d942d0911a2fEA7E22417f81E27c02D6c6F", token: ADDRESSES.arbitrum.USDC }, // Autopilot USDC Drip + { vault: "0x4c4f752fa54dafB6d51B4A39018271c90bA1156F", token: "0x498Bf2B1e120FeD3ad3D42EA2165E9b73f99C1e5" }, // LlamaRisk crvUSD Optimizer + ], + [CHAIN.UNICHAIN]: [ + { vault: "0x2aF2146E6722B80A0A455F405eDFF3993715E417", token: ADDRESSES.unichain.WETH }, // K3 Capital ETH Maxi + ], + [CHAIN.TAC]: [ + { vault: "0x754bed7C83FB9bc172df86e606be7baC8bD69357", token: ADDRESSES.tac.WTAC }, // gForce Vault + ], + [CHAIN.BASE]: [ + { vault: "0x45aa96f0b3188D47a1DaFdbefCE1db6B37f58216", token: ADDRESSES.base.USDC }, // IPOR USDC Base + { vault: "0xC4C00d8b323f37527eEda27c87412378be9F68Ec", token: ADDRESSES.base.wstETH }, // IPOR wstETH Base + { vault: "0xEbc6C7883CA32EF9484740BA32A816F5F88B7A41", token: ADDRESSES.base.WETH }, // Tanken WETH Base + { vault: "0xf2F8386B88CB15c5CeaDE069c44f57fd2fD35E95", token: ADDRESSES.base.USDC }, // Clearstar Core USDC + { vault: "0xfd843a3D9329C91CA22c5daA994BeA762541F954", token: ADDRESSES.base.WETH }, // yoETH Loooper + { vault: "0x1166250D1d6B5a1DBb73526257f6bb2Bbe235295", token: ADDRESSES.base.USDC }, // yoUSDC Loooper + { vault: "0x31A421271414641cb5063B71594b642D2666dB6B", token: ADDRESSES.base.cbBTC }, // Autopilot cbBTC Base + { vault: "0x0d877Dc7C8Fa3aD980DfDb18B48eC9F8768359C4", token: ADDRESSES.base.USDC }, // Autopilot USDC Base + { vault: "0x7872893e528Fe2c0829e405960db5B742112aa97", token: ADDRESSES.base.WETH }, // Autopilot WETH Base + ], +} + +const eventAbis = { + managementFee: "event ManagementFeeRealized(uint256 unrealizedFeeInUnderlying, uint256 unrealizedFeeInShares)", +} + +const methodology = { + Fees: 'Management fees collected by the protocol are included in event logs emitted by each vault contract.', + Revenue: 'Total fees collected by the protocol.', +} + +const fetch = (vaultData: { vault: string, token: string }[]) => { + return async (options: FetchOptions) => { + const dailyFees = options.createBalances() + const dailyRevenue = options.createBalances() + + const logs = await options.api.getLogs({ + targets: vaultData.map(v => v.vault), + eventAbi: eventAbis.managementFee, + fromBlock: await options.getFromBlock(), + toBlock: await options.getToBlock(), + }) + + logs.forEach((log: any) => { + const vaultInfo = vaultData.find(v => v.vault.toLowerCase() === log.address.toLowerCase()) + if (vaultInfo) { + dailyFees.add(vaultInfo.token, log.args[0]) + dailyRevenue.add(vaultInfo.token, log.args[0]) + } + }) + + return { dailyFees, dailyRevenue } + } +} + +const adapter: SimpleAdapter = { + version: 2, + adapter: Object.fromEntries( + Object.entries(vaultsPerChain).map(([chain, vaultData]) => [ + chain, + { fetch: fetch(vaultData), start: 1704067200 } + ]) + ), + methodology +} + +export default adapter; \ No newline at end of file From 6038772d2a0be1fcbdc6ebb63b192031422244f9 Mon Sep 17 00:00:00 2001 From: rohannero Date: Fri, 3 Oct 2025 19:27:16 -0400 Subject: [PATCH 2/4] removed start timestamp from fetch --- fees/ipor-protocol/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fees/ipor-protocol/index.ts b/fees/ipor-protocol/index.ts index a763e32c6f..a1d1436f9a 100644 --- a/fees/ipor-protocol/index.ts +++ b/fees/ipor-protocol/index.ts @@ -80,7 +80,7 @@ const adapter: SimpleAdapter = { adapter: Object.fromEntries( Object.entries(vaultsPerChain).map(([chain, vaultData]) => [ chain, - { fetch: fetch(vaultData), start: 1704067200 } + { fetch: fetch(vaultData) } ]) ), methodology From 3b2d4051575fddb5dabcc599343d43b9debd2421 Mon Sep 17 00:00:00 2001 From: rohannero Date: Sat, 4 Oct 2025 18:51:30 -0400 Subject: [PATCH 3/4] Remove hard-coded token list --- fees/ipor-protocol/index.ts | 110 ++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/fees/ipor-protocol/index.ts b/fees/ipor-protocol/index.ts index a1d1436f9a..6269a3a301 100644 --- a/fees/ipor-protocol/index.ts +++ b/fees/ipor-protocol/index.ts @@ -1,44 +1,42 @@ import { FetchOptions, SimpleAdapter } from "../../adapters/types"; import { CHAIN } from "../../helpers/chains"; -import ADDRESSES from "../../helpers/coreAssets.json"; -// Vaults & token mappings per chain -const vaultsPerChain: Record = { +const vaultsPerChain: Record = { [CHAIN.ETHEREUM]: [ - { vault: "0x20e934c725b6703f0aC696F1689008057dB9Ac44", token: ADDRESSES.ethereum.DAI }, // IPOR DAI Ethereum - { vault: "0x43Ee0243eA8CF02f7087d8B16C8D2007CC9c7cA2", token: ADDRESSES.ethereum.USDC }, // IPOR USDC Ethereum - { vault: "0xAbAb980f0eCB232D52f422C6B68D25C3d0c18E3e", token: ADDRESSES.ethereum.USDT }, // IPOR USDT Ethereum - { vault: "0xf6cD9E8415162C8fb3C52676c7cA68812A34f76E", token: ADDRESSES.ethereum.WETH }, // Resevoir ETH Yield - { vault: "0xe9385eFf3F937FcB0f0085Da9A3F53D6C2B4fB5F", token: "0x09D4214C03D01F49544C0448DBE3A27f768F2b34" }, // Resevoir srUSD Looping Ethereum - { vault: "0xa435F140114910C96343574DD67883F7538ba736", token: ADDRESSES.ethereum.USDC }, // yUSD Loooper - { vault: "0xE47358eae04719f3CF7025E95d0AD202e68BD9b2", token: ADDRESSES.ethereum.WBTC }, // Resevoir BTC Yield - { vault: "0xB0f56BB0bf13ee05FeF8cD2d8DF5FfdFcAC7a74f", token: ADDRESSES.ethereum.USDC }, // TAU InfiniFI Pointsmax - { vault: "0x6f66b845604dad6E80b2A1472e6cAcbbE66A8C40", token: ADDRESSES.ethereum.USDC }, // TAU Resevoir Pointsmax - { vault: "0x43a32D4f6c582f281c52393f8F9E5AcE1D4A1E68", token: ADDRESSES.ethereum.USDC }, // TAU Yield Bond ETF - { vault: "0xD731F94c778f7C1090e2E0D797150A647De5188A", token: ADDRESSES.ethereum.USDe }, // Strata-Money PTs Looping Ethereum + "0x20e934c725b6703f0aC696F1689008057dB9Ac44", // IPOR DAI Ethereum + "0x43Ee0243eA8CF02f7087d8B16C8D2007CC9c7cA2", // IPOR USDC Ethereum + "0xAbAb980f0eCB232D52f422C6B68D25C3d0c18E3e", // IPOR USDT Ethereum + "0xf6cD9E8415162C8fb3C52676c7cA68812A34f76E", // Resevoir ETH Yield + "0xe9385eFf3F937FcB0f0085Da9A3F53D6C2B4fB5F", // Resevoir srUSD Looping Ethereum + "0xa435F140114910C96343574DD67883F7538ba736", // yUSD Loooper + "0xE47358eae04719f3CF7025E95d0AD202e68BD9b2", // Resevoir BTC Yield + "0xB0f56BB0bf13ee05FeF8cD2d8DF5FfdFcAC7a74f", // TAU InfiniFI Pointsmax + "0x6f66b845604dad6E80b2A1472e6cAcbbE66A8C40", // TAU Resevoir Pointsmax + "0x43a32D4f6c582f281c52393f8F9E5AcE1D4A1E68", // TAU Yield Bond ETF + "0xD731F94c778f7C1090e2E0D797150A647De5188A", // Strata-Money PTs Looping Ethereum ], [CHAIN.ARBITRUM]: [ - { vault: "0xa91267A25939b2B0f046013fbF9597008F7F014b", token: ADDRESSES.arbitrum.USDC }, // IporPlasmaVaultUsdc - { vault: "0xcafC0A559a9Bf2fc77a7ECFaF04BD929a7D9c5Cf", token: ADDRESSES.arbitrum.USDC }, // Singularity Vault - USDC - { vault: "0x407D3d942d0911a2fEA7E22417f81E27c02D6c6F", token: ADDRESSES.arbitrum.USDC }, // Autopilot USDC Drip - { vault: "0x4c4f752fa54dafB6d51B4A39018271c90bA1156F", token: "0x498Bf2B1e120FeD3ad3D42EA2165E9b73f99C1e5" }, // LlamaRisk crvUSD Optimizer + "0xa91267A25939b2B0f046013fbF9597008F7F014b", // IporPlasmaVaultUsdc + "0xcafC0A559a9Bf2fc77a7ECFaF04BD929a7D9c5Cf", // Singularity Vault - USDC + "0x407D3d942d0911a2fEA7E22417f81E27c02D6c6F", // Autopilot USDC Drip + "0x4c4f752fa54dafB6d51B4A39018271c90bA1156F", // LlamaRisk crvUSD Optimizer ], [CHAIN.UNICHAIN]: [ - { vault: "0x2aF2146E6722B80A0A455F405eDFF3993715E417", token: ADDRESSES.unichain.WETH }, // K3 Capital ETH Maxi + "0x2aF2146E6722B80A0A455F405eDFF3993715E417", // K3 Capital ETH Maxi ], [CHAIN.TAC]: [ - { vault: "0x754bed7C83FB9bc172df86e606be7baC8bD69357", token: ADDRESSES.tac.WTAC }, // gForce Vault + "0x754bed7C83FB9bc172df86e606be7baC8bD69357", // gForce Vault ], [CHAIN.BASE]: [ - { vault: "0x45aa96f0b3188D47a1DaFdbefCE1db6B37f58216", token: ADDRESSES.base.USDC }, // IPOR USDC Base - { vault: "0xC4C00d8b323f37527eEda27c87412378be9F68Ec", token: ADDRESSES.base.wstETH }, // IPOR wstETH Base - { vault: "0xEbc6C7883CA32EF9484740BA32A816F5F88B7A41", token: ADDRESSES.base.WETH }, // Tanken WETH Base - { vault: "0xf2F8386B88CB15c5CeaDE069c44f57fd2fD35E95", token: ADDRESSES.base.USDC }, // Clearstar Core USDC - { vault: "0xfd843a3D9329C91CA22c5daA994BeA762541F954", token: ADDRESSES.base.WETH }, // yoETH Loooper - { vault: "0x1166250D1d6B5a1DBb73526257f6bb2Bbe235295", token: ADDRESSES.base.USDC }, // yoUSDC Loooper - { vault: "0x31A421271414641cb5063B71594b642D2666dB6B", token: ADDRESSES.base.cbBTC }, // Autopilot cbBTC Base - { vault: "0x0d877Dc7C8Fa3aD980DfDb18B48eC9F8768359C4", token: ADDRESSES.base.USDC }, // Autopilot USDC Base - { vault: "0x7872893e528Fe2c0829e405960db5B742112aa97", token: ADDRESSES.base.WETH }, // Autopilot WETH Base + "0x45aa96f0b3188D47a1DaFdbefCE1db6B37f58216", // IPOR USDC Base + "0xC4C00d8b323f37527eEda27c87412378be9F68Ec", // IPOR wstETH Base + "0xEbc6C7883CA32EF9484740BA32A816F5F88B7A41", // Tanken WETH Base + "0xf2F8386B88CB15c5CeaDE069c44f57fd2fD35E95", // Clearstar Core USDC + "0xfd843a3D9329C91CA22c5daA994BeA762541F954", // yoETH Loooper + "0x1166250D1d6B5a1DBb73526257f6bb2Bbe235295", // yoUSDC Loooper + "0x31A421271414641cb5063B71594b642D2666dB6B", // Autopilot cbBTC Base + "0x0d877Dc7C8Fa3aD980DfDb18B48eC9F8768359C4", // Autopilot USDC Base + "0x7872893e528Fe2c0829e405960db5B742112aa97", // Autopilot WETH Base ], } @@ -51,23 +49,37 @@ const methodology = { Revenue: 'Total fees collected by the protocol.', } -const fetch = (vaultData: { vault: string, token: string }[]) => { +const fetch = (vaults: string[]) => { return async (options: FetchOptions) => { const dailyFees = options.createBalances() const dailyRevenue = options.createBalances() const logs = await options.api.getLogs({ - targets: vaultData.map(v => v.vault), + targets: vaults, eventAbi: eventAbis.managementFee, fromBlock: await options.getFromBlock(), toBlock: await options.getToBlock(), }) + // Call asset() for each vault to get underlying tokens + const assetCalls = await options.api.multiCall({ + abi: 'function asset() view returns (address)', + calls: vaults.map(v => ({ target: v })), + permitFailure: true, + }) + + const vaultToToken: Record = {} + vaults.forEach((v, i) => { + if (assetCalls[i]) { + vaultToToken[v.toLowerCase()] = assetCalls[i] + } + }) + logs.forEach((log: any) => { - const vaultInfo = vaultData.find(v => v.vault.toLowerCase() === log.address.toLowerCase()) - if (vaultInfo) { - dailyFees.add(vaultInfo.token, log.args[0]) - dailyRevenue.add(vaultInfo.token, log.args[0]) + const token = vaultToToken[log.address.toLowerCase()] + if (token) { + dailyFees.add(token, log.args[0]) + dailyRevenue.add(token, log.args[0]) } }) @@ -77,12 +89,28 @@ const fetch = (vaultData: { vault: string, token: string }[]) => { const adapter: SimpleAdapter = { version: 2, - adapter: Object.fromEntries( - Object.entries(vaultsPerChain).map(([chain, vaultData]) => [ - chain, - { fetch: fetch(vaultData) } - ]) - ), + adapter: { + [CHAIN.ETHEREUM]: { + fetch: fetch(vaultsPerChain[CHAIN.ETHEREUM]), + start: "9-29-2024", + }, + [CHAIN.ARBITRUM]: { + fetch: fetch(vaultsPerChain[CHAIN.ARBITRUM]), + start: "9-3-2024", + }, + [CHAIN.BASE]: { + fetch: fetch(vaultsPerChain[CHAIN.BASE]), + start: "11-8-2024", + }, + [CHAIN.UNICHAIN]: { + fetch: fetch(vaultsPerChain[CHAIN.UNICHAIN]), + start: "6-18-2025", + }, + [CHAIN.TAC]: { + fetch: fetch(vaultsPerChain[CHAIN.TAC]), + start: "7-11-2025", + }, + }, methodology } From d9c1b8e8b8edbdfc1b3805b0b8e7d0d5c68d20ea Mon Sep 17 00:00:00 2001 From: rohannero Date: Tue, 7 Oct 2025 09:53:54 -0400 Subject: [PATCH 4/4] remove hard-coded vaults --- fees/ipor-protocol/index.ts | 64 +++++++++++-------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/fees/ipor-protocol/index.ts b/fees/ipor-protocol/index.ts index 6269a3a301..d55baaed6f 100644 --- a/fees/ipor-protocol/index.ts +++ b/fees/ipor-protocol/index.ts @@ -1,44 +1,8 @@ import { FetchOptions, SimpleAdapter } from "../../adapters/types"; +import { getConfig } from "../../helpers/cache"; import { CHAIN } from "../../helpers/chains"; -const vaultsPerChain: Record = { - [CHAIN.ETHEREUM]: [ - "0x20e934c725b6703f0aC696F1689008057dB9Ac44", // IPOR DAI Ethereum - "0x43Ee0243eA8CF02f7087d8B16C8D2007CC9c7cA2", // IPOR USDC Ethereum - "0xAbAb980f0eCB232D52f422C6B68D25C3d0c18E3e", // IPOR USDT Ethereum - "0xf6cD9E8415162C8fb3C52676c7cA68812A34f76E", // Resevoir ETH Yield - "0xe9385eFf3F937FcB0f0085Da9A3F53D6C2B4fB5F", // Resevoir srUSD Looping Ethereum - "0xa435F140114910C96343574DD67883F7538ba736", // yUSD Loooper - "0xE47358eae04719f3CF7025E95d0AD202e68BD9b2", // Resevoir BTC Yield - "0xB0f56BB0bf13ee05FeF8cD2d8DF5FfdFcAC7a74f", // TAU InfiniFI Pointsmax - "0x6f66b845604dad6E80b2A1472e6cAcbbE66A8C40", // TAU Resevoir Pointsmax - "0x43a32D4f6c582f281c52393f8F9E5AcE1D4A1E68", // TAU Yield Bond ETF - "0xD731F94c778f7C1090e2E0D797150A647De5188A", // Strata-Money PTs Looping Ethereum - ], - [CHAIN.ARBITRUM]: [ - "0xa91267A25939b2B0f046013fbF9597008F7F014b", // IporPlasmaVaultUsdc - "0xcafC0A559a9Bf2fc77a7ECFaF04BD929a7D9c5Cf", // Singularity Vault - USDC - "0x407D3d942d0911a2fEA7E22417f81E27c02D6c6F", // Autopilot USDC Drip - "0x4c4f752fa54dafB6d51B4A39018271c90bA1156F", // LlamaRisk crvUSD Optimizer - ], - [CHAIN.UNICHAIN]: [ - "0x2aF2146E6722B80A0A455F405eDFF3993715E417", // K3 Capital ETH Maxi - ], - [CHAIN.TAC]: [ - "0x754bed7C83FB9bc172df86e606be7baC8bD69357", // gForce Vault - ], - [CHAIN.BASE]: [ - "0x45aa96f0b3188D47a1DaFdbefCE1db6B37f58216", // IPOR USDC Base - "0xC4C00d8b323f37527eEda27c87412378be9F68Ec", // IPOR wstETH Base - "0xEbc6C7883CA32EF9484740BA32A816F5F88B7A41", // Tanken WETH Base - "0xf2F8386B88CB15c5CeaDE069c44f57fd2fD35E95", // Clearstar Core USDC - "0xfd843a3D9329C91CA22c5daA994BeA762541F954", // yoETH Loooper - "0x1166250D1d6B5a1DBb73526257f6bb2Bbe235295", // yoUSDC Loooper - "0x31A421271414641cb5063B71594b642D2666dB6B", // Autopilot cbBTC Base - "0x0d877Dc7C8Fa3aD980DfDb18B48eC9F8768359C4", // Autopilot USDC Base - "0x7872893e528Fe2c0829e405960db5B742112aa97", // Autopilot WETH Base - ], -} +const IPOR_GITHUB_ADDRESSES_URL = "https://raw.githubusercontent.com/IPOR-Labs/ipor-abi/refs/heads/main/mainnet/addresses.json"; const eventAbis = { managementFee: "event ManagementFeeRealized(uint256 unrealizedFeeInUnderlying, uint256 unrealizedFeeInShares)", @@ -49,11 +13,19 @@ const methodology = { Revenue: 'Total fees collected by the protocol.', } -const fetch = (vaults: string[]) => { +const fetch = () => { return async (options: FetchOptions) => { const dailyFees = options.createBalances() const dailyRevenue = options.createBalances() + const config = await getConfig('ipor/assets', IPOR_GITHUB_ADDRESSES_URL); + const chainConfig = config[options.chain]; + if (!chainConfig || !chainConfig.vaults) { + return { dailyFees, dailyRevenue }; + } + + const vaults = chainConfig.vaults.map((vault: any) => vault.PlasmaVault); + const logs = await options.api.getLogs({ targets: vaults, eventAbi: eventAbis.managementFee, @@ -64,12 +36,12 @@ const fetch = (vaults: string[]) => { // Call asset() for each vault to get underlying tokens const assetCalls = await options.api.multiCall({ abi: 'function asset() view returns (address)', - calls: vaults.map(v => ({ target: v })), + calls: vaults.map((v: string) => ({ target: v })), permitFailure: true, }) const vaultToToken: Record = {} - vaults.forEach((v, i) => { + vaults.forEach((v: string, i: number) => { if (assetCalls[i]) { vaultToToken[v.toLowerCase()] = assetCalls[i] } @@ -91,23 +63,23 @@ const adapter: SimpleAdapter = { version: 2, adapter: { [CHAIN.ETHEREUM]: { - fetch: fetch(vaultsPerChain[CHAIN.ETHEREUM]), + fetch: fetch(), start: "9-29-2024", }, [CHAIN.ARBITRUM]: { - fetch: fetch(vaultsPerChain[CHAIN.ARBITRUM]), + fetch: fetch(), start: "9-3-2024", }, [CHAIN.BASE]: { - fetch: fetch(vaultsPerChain[CHAIN.BASE]), + fetch: fetch(), start: "11-8-2024", }, [CHAIN.UNICHAIN]: { - fetch: fetch(vaultsPerChain[CHAIN.UNICHAIN]), + fetch: fetch(), start: "6-18-2025", }, [CHAIN.TAC]: { - fetch: fetch(vaultsPerChain[CHAIN.TAC]), + fetch: fetch(), start: "7-11-2025", }, },