From eba3ba7a2d5c2419a979bfdf27c2976e6005d53e Mon Sep 17 00:00:00 2001 From: antoncoding Date: Wed, 29 Oct 2025 18:40:02 +0800 Subject: [PATCH 1/3] fix: autovault entry page --- app/autovault/components/VaultListV2.tsx | 34 +++-- src/data-sources/morpho-api/v2-vaults.ts | 87 +++++++++++- src/data-sources/subgraph/v2-vaults.ts | 153 ++++++---------------- src/graphql/morpho-api-queries.ts | 4 +- src/graphql/morpho-v2-subgraph-queries.ts | 10 +- src/hooks/useUserVaultsV2.ts | 29 +++- 6 files changed, 182 insertions(+), 135 deletions(-) diff --git a/app/autovault/components/VaultListV2.tsx b/app/autovault/components/VaultListV2.tsx index 1b084603..9f5411b1 100644 --- a/app/autovault/components/VaultListV2.tsx +++ b/app/autovault/components/VaultListV2.tsx @@ -8,6 +8,7 @@ import { TokenIcon } from '@/components/TokenIcon'; import { UserVaultV2 } from '@/data-sources/subgraph/v2-vaults'; import { formatReadable } from '@/utils/balance'; import { SupportedNetworks, getNetworkImg } from '@/utils/networks'; +import { parseCapIdParams } from '@/utils/morpho'; type VaultListV2Props = { vaults: UserVaultV2[]; @@ -53,7 +54,6 @@ export function VaultListV2({ vaults, loading }: VaultListV2Props) { ID Asset APY - Agents Collaterals Action @@ -63,13 +63,17 @@ export function VaultListV2({ vaults, loading }: VaultListV2Props) { const token = findToken(vault.asset, vault.networkId); const networkImg = getNetworkImg(vault.networkId); + const collaterals = vault.caps + .map(cap => parseCapIdParams(cap.idParams).collateralToken) + .filter(collat => collat !== undefined) + return ( - + {/* ID */}
{networkImg && icon} - {vault.newVaultV2.slice(2, 8)} + {vault.address.slice(2, 8)}
@@ -93,23 +97,31 @@ export function VaultListV2({ vaults, loading }: VaultListV2Props) { {/* APY */} - -- - - - {/* Agents */} - - -- + + {vault.avgApy && (vault.avgApy * 100).toFixed(2) + '%'} + {/* Collaterals */} - -- + { + collaterals.map((tokenAddress) => ( +
+ +
+ )) + }
{/* Action */}
- + diff --git a/src/data-sources/morpho-api/v2-vaults.ts b/src/data-sources/morpho-api/v2-vaults.ts index d3649ac4..0600505b 100644 --- a/src/data-sources/morpho-api/v2-vaults.ts +++ b/src/data-sources/morpho-api/v2-vaults.ts @@ -15,6 +15,7 @@ export type VaultV2Cap = { export type VaultV2Details = { id: string; + address: string; asset: string; symbol: string; name: string; @@ -93,6 +94,7 @@ function transformCap(apiCap: ApiVaultV2Cap): VaultV2Cap { function transformVault(apiVault: ApiVaultV2): VaultV2Details { return { id: apiVault.id, + address: apiVault.address, asset: apiVault.asset.address, symbol: apiVault.symbol, name: apiVault.name, @@ -120,7 +122,7 @@ export const fetchVaultV2Details = async ( ): Promise => { try { const variables = { - address: vaultAddress.toLowerCase(), + addresses: [vaultAddress.toLowerCase()], chainId: network, }; @@ -148,3 +150,86 @@ export const fetchVaultV2Details = async ( return null; } }; + +/** + * Fetches multiple VaultV2 details from Morpho API for a single network + * + * @param vaultAddresses - Array of vault addresses + * @param network - The network/chain ID + * @returns Array of VaultV2Details + */ +export const fetchMultipleVaultV2Details = async ( + vaultAddresses: string[], + network: SupportedNetworks, +): Promise => { + if (vaultAddresses.length === 0) { + return []; + } + + try { + const variables = { + addresses: vaultAddresses, + chainId: network, + }; + + const response = await morphoGraphqlFetcher(vaultV2Query, variables); + + if (response.errors && response.errors.length > 0) { + console.error('GraphQL errors:', response.errors); + return []; + } + + const vaults = response.data?.vaultV2s?.items; + if (!vaults || vaults.length === 0) { + console.log(`No V2 vaults found for addresses on network ${network}`); + return []; + } + + return vaults.map(transformVault); + } catch (error) { + console.error( + `Error fetching V2 vault details for multiple addresses on network ${network}:`, + error, + ); + return []; + } +}; + +/** + * Fetches multiple VaultV2 details from Morpho API across multiple networks + * Groups addresses by network and fetches them efficiently + * + * @param vaultAddressesWithNetwork - Array of vault addresses with their network IDs + * @returns Array of VaultV2Details with networkId + */ +export const fetchMultipleVaultV2DetailsAcrossNetworks = async ( + vaultAddressesWithNetwork: Array<{ address: string; networkId: SupportedNetworks }>, +): Promise> => { + + if (vaultAddressesWithNetwork.length === 0) { + return []; + } + + // Group addresses by network + const addressesByNetwork = vaultAddressesWithNetwork.reduce((acc, item) => { + if (!acc[item.networkId]) { + acc[item.networkId] = []; + } + acc[item.networkId].push(item.address); + return acc; + }, {} as Record); + + // Fetch details for each network in parallel + const promises = Object.entries(addressesByNetwork).map(async ([networkIdStr, addresses]) => { + const networkId = Number(networkIdStr) as SupportedNetworks; + const details = await fetchMultipleVaultV2Details(addresses, networkId); + // Add network ID to each vault detail + return details.map(detail => ({ + ...detail, + networkId, + })); + }); + + const results = await Promise.all(promises); + return results.flat(); +}; diff --git a/src/data-sources/subgraph/v2-vaults.ts b/src/data-sources/subgraph/v2-vaults.ts index 125c60d4..84698196 100644 --- a/src/data-sources/subgraph/v2-vaults.ts +++ b/src/data-sources/subgraph/v2-vaults.ts @@ -1,27 +1,24 @@ -import { userVaultsV2Query, vaultV2Query } from '@/graphql/morpho-v2-subgraph-queries'; +import { userVaultsV2AddressesQuery } from '@/graphql/morpho-v2-subgraph-queries'; import { SupportedNetworks, getAgentConfig, networks, isAgentAvailable } from '@/utils/networks'; import { subgraphGraphqlFetcher } from './fetchers'; -// Define the expected structure of V2 vault creation events -export type SubgraphVaultV2 = { - id: string; // Transaction hash + log index - owner: string; // Vault owner address - asset: string; // Asset address - newVaultV2: string; // Deployed vault address +// Simplified subgraph response for vault addresses +type SubgraphVaultV2Address = { + id: string; // Vault address }; -// Response structure for user vaults query +// Response structure for user vaults query (only addresses) type SubgraphUserVaultsV2Response = { data: { - createVaultV2S: SubgraphVaultV2[]; + vaultV2S: SubgraphVaultV2Address[]; }; errors?: any[]; }; -// Enhanced vault type with network information -export type UserVaultV2 = SubgraphVaultV2 & { +// Vault address with network information +export type UserVaultV2Address = { + address: string; networkId: SupportedNetworks; - balance?: bigint; // vault total assets }; // Vault V2 details from subgraph @@ -33,7 +30,7 @@ export type VaultV2Cap = { }; export type VaultV2Details = { - id: string; + address: string; asset: string; symbol: string; name: string; @@ -44,40 +41,32 @@ export type VaultV2Details = { caps: VaultV2Cap[]; totalSupply: string; adapters: string[]; + avgApy?: number; }; -type SubgraphVaultV2Response = { - data: { - vaultV2: { - id: string; - asset: string; - symbol: string; - name: string; - curator: string; - owner: string; - allocators: { account: string }[]; - sentinels: { account: string }[]; - caps: VaultV2Cap[]; - totalSupply: string; - adapters: { address: string }[]; - } | null; - }; - errors?: any[]; +// User vault with full details and network info +// This is used by the autovault page to display user's vaults +export type UserVaultV2 = VaultV2Details & { + networkId: SupportedNetworks; + balance?: bigint; }; -export const fetchUserVaultsV2 = async ( +/** + * Fetches only vault addresses owned by a user from the subgraph + * This is the first step - get addresses, then fetch details from Morpho API + */ +export const fetchUserVaultV2Addresses = async ( owner: string, network: SupportedNetworks, -): Promise => { +): Promise => { const agentConfig = getAgentConfig(network); - if (!agentConfig?.vaultsSubgraphEndpoint) { + if (!agentConfig?.adapterSubgraphEndpoint) { console.log(`No subgraph endpoint configured for network ${network}`); return []; } - const subgraphUrl = agentConfig.vaultsSubgraphEndpoint; - const userVaults: UserVaultV2[] = []; + const subgraphUrl = agentConfig.adapterSubgraphEndpoint; try { const variables = { @@ -86,7 +75,7 @@ export const fetchUserVaultsV2 = async ( const response = await subgraphGraphqlFetcher( subgraphUrl, - userVaultsV2Query, + userVaultsV2AddressesQuery, variables, ); @@ -95,99 +84,43 @@ export const fetchUserVaultsV2 = async ( return []; } - const vaults = response.data?.createVaultV2S; - if (!vaults) { + const vaults = response.data?.vaultV2S; + if (!vaults || vaults.length === 0) { console.log(`No V2 vaults found for owner ${owner} on network ${network}`); return []; } - // Add network information to each vault - vaults.forEach((vault) => { - userVaults.push({ - ...vault, - networkId: network, - }); - }); + // Convert to UserVaultV2Address with network information + const vaultAddresses = vaults.map((vault) => ({ + address: vault.id, + networkId: network, + })); - console.log(`Fetched ${userVaults.length} V2 vaults for owner ${owner} on network ${network}`); + console.log(`Fetched ${vaultAddresses.length} V2 vault addresses for owner ${owner} on network ${network}`); + return vaultAddresses; } catch (error) { console.error( - `Error fetching V2 vaults for owner ${owner} on network ${network}:`, + `Error fetching V2 vault addresses for owner ${owner} on network ${network}:`, error, ); + return []; } - - return userVaults; }; -// Fetch vaults from all networks that support V2 vaults -export const fetchUserVaultsV2AllNetworks = async (owner: string): Promise => { +/** + * Fetches vault addresses from all networks that support V2 vaults + */ +export const fetchUserVaultV2AddressesAllNetworks = async ( + owner: string, +): Promise => { const supportedNetworks = networks .filter(network => isAgentAvailable(network.network)) .map(network => network.network); const promises = supportedNetworks.map(async (network) => { - return fetchUserVaultsV2(owner, network); + return fetchUserVaultV2Addresses(owner, network); }); const results = await Promise.all(promises); return results.flat(); -}; - -export const fetchVaultV2Details = async ( - vaultAddress: string, - network: SupportedNetworks, -): Promise => { - const agentConfig = getAgentConfig(network); - - // fetch from the adapter - if (!agentConfig?.adapterSubgraphEndpoint) { - console.log(`No subgraph endpoint configured for network ${network}`); - return null; - } - - const subgraphUrl = agentConfig.adapterSubgraphEndpoint; - - try { - const variables = { - id: vaultAddress.toLowerCase(), - }; - - const response = await subgraphGraphqlFetcher( - subgraphUrl, - vaultV2Query, - variables, - ); - - if (response.errors) { - console.error('GraphQL errors:', response.errors); - return null; - } - - const vault = response.data?.vaultV2; - if (!vault) { - console.log(`No V2 vault found for address ${vaultAddress} on network ${network}`); - return null; - } - - return { - id: vault.id, - asset: vault.asset, - symbol: vault.symbol, - name: vault.name, - curator: vault.curator, - owner: vault.owner, - allocators: vault.allocators.map((a) => a.account), - sentinels: vault.sentinels.map((s) => s.account), - caps: vault.caps, - totalSupply: vault.totalSupply, - adapters: vault.adapters.map((a) => a.address), - }; - } catch (error) { - console.error( - `Error fetching V2 vault details for ${vaultAddress} on network ${network}:`, - error, - ); - return null; - } }; \ No newline at end of file diff --git a/src/graphql/morpho-api-queries.ts b/src/graphql/morpho-api-queries.ts index 05eb91a8..eea9f7b9 100644 --- a/src/graphql/morpho-api-queries.ts +++ b/src/graphql/morpho-api-queries.ts @@ -496,10 +496,10 @@ export const marketBorrowsQuery = ` // Query for VaultV2 details from Morpho API export const vaultV2Query = ` - query VaultV2Query($address: String!, $chainId: Int!) { + query VaultV2Query($addresses: [String!], $chainId: Int!) { vaultV2s(where: { chainId_in: [$chainId], - address_in: [$address] + address_in: $addresses }) { items { id diff --git a/src/graphql/morpho-v2-subgraph-queries.ts b/src/graphql/morpho-v2-subgraph-queries.ts index 5e388b23..a7aeb2b2 100644 --- a/src/graphql/morpho-v2-subgraph-queries.ts +++ b/src/graphql/morpho-v2-subgraph-queries.ts @@ -1,14 +1,12 @@ // GraphQL queries for V2 Vault Factory subgraph -export const userVaultsV2Query = ` - query UserVaultsV2($owner: String!) { - createVaultV2S(where: { +// Query to fetch only vault addresses by owner +export const userVaultsV2AddressesQuery = ` + query UserVaultsV2Addresses($owner: String!) { + vaultV2S(where: { owner: $owner }) { id - owner - asset - newVaultV2 } } `; diff --git a/src/hooks/useUserVaultsV2.ts b/src/hooks/useUserVaultsV2.ts index 71c49f90..49115221 100644 --- a/src/hooks/useUserVaultsV2.ts +++ b/src/hooks/useUserVaultsV2.ts @@ -1,7 +1,11 @@ import { useState, useEffect, useCallback } from 'react'; import { Address } from 'viem'; import { useAccount } from 'wagmi'; -import { fetchUserVaultsV2AllNetworks, UserVaultV2 } from '@/data-sources/subgraph/v2-vaults'; +import { + fetchUserVaultV2AddressesAllNetworks, + UserVaultV2 +} from '@/data-sources/subgraph/v2-vaults'; +import { fetchMultipleVaultV2DetailsAcrossNetworks } from '@/data-sources/morpho-api/v2-vaults'; import { readTotalAsset } from '@/utils/vaultAllocation'; type UseUserVaultsV2Return = { @@ -15,7 +19,7 @@ function filterValidVaults(vaults: UserVaultV2[]): UserVaultV2[] { return vaults.filter(vault => vault.owner && vault.asset && - vault.newVaultV2 + vault.address ); } @@ -23,7 +27,7 @@ async function fetchVaultBalances(vaults: UserVaultV2[]): Promise return Promise.all( vaults.map(async (vault) => { const balance = await readTotalAsset( - vault.newVaultV2 as Address, + vault.address as Address, vault.networkId ); @@ -36,9 +40,24 @@ async function fetchVaultBalances(vaults: UserVaultV2[]): Promise } async function fetchAndProcessVaults(address: Address): Promise { - const userVaults = await fetchUserVaultsV2AllNetworks(address); - const validVaults = filterValidVaults(userVaults); + // Step 1: Fetch vault addresses from subgraph across all networks + const vaultAddresses = await fetchUserVaultV2AddressesAllNetworks(address); + + console.log('vaultAddresses', vaultAddresses) + + if (vaultAddresses.length === 0) { + return []; + } + + // Step 2: Fetch full vault details from Morpho API + const vaultDetails = await fetchMultipleVaultV2DetailsAcrossNetworks(vaultAddresses); + + // Step 3: Filter valid vaults + const validVaults = filterValidVaults(vaultDetails as UserVaultV2[]); + + // Step 4: Fetch balances for each vault const vaultsWithBalances = await fetchVaultBalances(validVaults); + return vaultsWithBalances; } From 2b9f151c1058a1fce7942ead9163eeca3a039efa Mon Sep 17 00:00:00 2001 From: antoncoding Date: Wed, 29 Oct 2025 20:58:49 +0800 Subject: [PATCH 2/3] chore: cleanup --- app/autovault/components/VaultListV2.tsx | 2 +- src/data-sources/morpho-api/v2-vaults.ts | 80 ++++++++++------------- src/data-sources/subgraph/v2-vaults.ts | 24 +------ src/graphql/morpho-v2-subgraph-queries.ts | 28 -------- 4 files changed, 36 insertions(+), 98 deletions(-) diff --git a/app/autovault/components/VaultListV2.tsx b/app/autovault/components/VaultListV2.tsx index 9f5411b1..6dfcad5e 100644 --- a/app/autovault/components/VaultListV2.tsx +++ b/app/autovault/components/VaultListV2.tsx @@ -45,7 +45,7 @@ export function VaultListV2({ vaults, loading }: VaultListV2Props) { return (
-

Your Vaults

+

Your Vaults

diff --git a/src/data-sources/morpho-api/v2-vaults.ts b/src/data-sources/morpho-api/v2-vaults.ts index 0600505b..b353678d 100644 --- a/src/data-sources/morpho-api/v2-vaults.ts +++ b/src/data-sources/morpho-api/v2-vaults.ts @@ -110,55 +110,14 @@ function transformVault(apiVault: ApiVaultV2): VaultV2Details { } /** - * Fetches VaultV2 details from Morpho API - * - * @param vaultAddress - The vault address - * @param network - The network/chain ID - * @returns VaultV2Details or null if not found - */ -export const fetchVaultV2Details = async ( - vaultAddress: string, - network: SupportedNetworks, -): Promise => { - try { - const variables = { - addresses: [vaultAddress.toLowerCase()], - chainId: network, - }; - - const response = await morphoGraphqlFetcher(vaultV2Query, variables); - - if (response.errors && response.errors.length > 0) { - console.error('GraphQL errors:', response.errors); - return null; - } - - const vaults = response.data?.vaultV2s?.items; - if (!vaults || vaults.length === 0) { - console.log(`No V2 vault found for address ${vaultAddress} on network ${network}`); - return null; - } - - // Since we're querying by specific address, we should only get one result - const vault = vaults[0]; - return transformVault(vault); - } catch (error) { - console.error( - `Error fetching V2 vault details for ${vaultAddress} on network ${network}:`, - error, - ); - return null; - } -}; - -/** - * Fetches multiple VaultV2 details from Morpho API for a single network + * Core function to fetch VaultV2 details from Morpho API + * Handles both single and multiple vault addresses * * @param vaultAddresses - Array of vault addresses * @param network - The network/chain ID * @returns Array of VaultV2Details */ -export const fetchMultipleVaultV2Details = async ( +const fetchVaultV2DetailsCore = async ( vaultAddresses: string[], network: SupportedNetworks, ): Promise => { @@ -168,7 +127,7 @@ export const fetchMultipleVaultV2Details = async ( try { const variables = { - addresses: vaultAddresses, + addresses: vaultAddresses.map(addr => addr.toLowerCase()), chainId: network, }; @@ -188,13 +147,42 @@ export const fetchMultipleVaultV2Details = async ( return vaults.map(transformVault); } catch (error) { console.error( - `Error fetching V2 vault details for multiple addresses on network ${network}:`, + `Error fetching V2 vault details on network ${network}:`, error, ); return []; } }; +/** + * Fetches a single VaultV2 details from Morpho API + * + * @param vaultAddress - The vault address + * @param network - The network/chain ID + * @returns VaultV2Details or null if not found + */ +export const fetchVaultV2Details = async ( + vaultAddress: string, + network: SupportedNetworks, +): Promise => { + const results = await fetchVaultV2DetailsCore([vaultAddress], network); + return results.length > 0 ? results[0] : null; +}; + +/** + * Fetches multiple VaultV2 details from Morpho API for a single network + * + * @param vaultAddresses - Array of vault addresses + * @param network - The network/chain ID + * @returns Array of VaultV2Details + */ +export const fetchMultipleVaultV2Details = async ( + vaultAddresses: string[], + network: SupportedNetworks, +): Promise => { + return fetchVaultV2DetailsCore(vaultAddresses, network); +}; + /** * Fetches multiple VaultV2 details from Morpho API across multiple networks * Groups addresses by network and fetches them efficiently diff --git a/src/data-sources/subgraph/v2-vaults.ts b/src/data-sources/subgraph/v2-vaults.ts index 84698196..e4bed156 100644 --- a/src/data-sources/subgraph/v2-vaults.ts +++ b/src/data-sources/subgraph/v2-vaults.ts @@ -1,6 +1,7 @@ import { userVaultsV2AddressesQuery } from '@/graphql/morpho-v2-subgraph-queries'; import { SupportedNetworks, getAgentConfig, networks, isAgentAvailable } from '@/utils/networks'; import { subgraphGraphqlFetcher } from './fetchers'; +import type { VaultV2Details } from '@/data-sources/morpho-api/v2-vaults'; // Simplified subgraph response for vault addresses type SubgraphVaultV2Address = { @@ -21,29 +22,6 @@ export type UserVaultV2Address = { networkId: SupportedNetworks; }; -// Vault V2 details from subgraph -export type VaultV2Cap = { - relativeCap: string; - absoluteCap: string; - capId: string; - idParams: string; -}; - -export type VaultV2Details = { - address: string; - asset: string; - symbol: string; - name: string; - curator: string; - owner: string; - allocators: string[]; - sentinels: string[]; - caps: VaultV2Cap[]; - totalSupply: string; - adapters: string[]; - avgApy?: number; -}; - // User vault with full details and network info // This is used by the autovault page to display user's vaults export type UserVaultV2 = VaultV2Details & { diff --git a/src/graphql/morpho-v2-subgraph-queries.ts b/src/graphql/morpho-v2-subgraph-queries.ts index a7aeb2b2..4bdb473d 100644 --- a/src/graphql/morpho-v2-subgraph-queries.ts +++ b/src/graphql/morpho-v2-subgraph-queries.ts @@ -9,32 +9,4 @@ export const userVaultsV2AddressesQuery = ` id } } -`; - -export const vaultV2Query = ` - query VaultV2($id: String!) { - vaultV2(id: $id) { - id - asset - symbol - name - curator - owner - allocators(where: {isAllocator: true}) { - account - } - sentinels(where: {isSentinel: true}) { - account - } - caps { - relativeCap - absoluteCap - marketId - } - totalSupply - adapters(where: {isAdapter: true}) { - address - } - } - } `; \ No newline at end of file From 43145fb791a40c6a236d837cc6a948e72e3e523e Mon Sep 17 00:00:00 2001 From: antoncoding Date: Wed, 29 Oct 2025 22:12:37 +0800 Subject: [PATCH 3/3] chore: lint --- app/autovault/components/VaultListV2.tsx | 2 +- src/data-sources/morpho-api/v2-vaults.ts | 4 ++-- src/data-sources/subgraph/v2-vaults.ts | 2 +- src/hooks/useUserVaultsV2.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/autovault/components/VaultListV2.tsx b/app/autovault/components/VaultListV2.tsx index 6dfcad5e..ad18065a 100644 --- a/app/autovault/components/VaultListV2.tsx +++ b/app/autovault/components/VaultListV2.tsx @@ -7,8 +7,8 @@ import { useTokens } from '@/components/providers/TokenProvider'; import { TokenIcon } from '@/components/TokenIcon'; import { UserVaultV2 } from '@/data-sources/subgraph/v2-vaults'; import { formatReadable } from '@/utils/balance'; -import { SupportedNetworks, getNetworkImg } from '@/utils/networks'; import { parseCapIdParams } from '@/utils/morpho'; +import { SupportedNetworks, getNetworkImg } from '@/utils/networks'; type VaultListV2Props = { vaults: UserVaultV2[]; diff --git a/src/data-sources/morpho-api/v2-vaults.ts b/src/data-sources/morpho-api/v2-vaults.ts index b353678d..c0e287d0 100644 --- a/src/data-sources/morpho-api/v2-vaults.ts +++ b/src/data-sources/morpho-api/v2-vaults.ts @@ -191,8 +191,8 @@ export const fetchMultipleVaultV2Details = async ( * @returns Array of VaultV2Details with networkId */ export const fetchMultipleVaultV2DetailsAcrossNetworks = async ( - vaultAddressesWithNetwork: Array<{ address: string; networkId: SupportedNetworks }>, -): Promise> => { + vaultAddressesWithNetwork: { address: string; networkId: SupportedNetworks }[], +): Promise<(VaultV2Details & { networkId: SupportedNetworks })[]> => { if (vaultAddressesWithNetwork.length === 0) { return []; diff --git a/src/data-sources/subgraph/v2-vaults.ts b/src/data-sources/subgraph/v2-vaults.ts index e4bed156..7fede761 100644 --- a/src/data-sources/subgraph/v2-vaults.ts +++ b/src/data-sources/subgraph/v2-vaults.ts @@ -1,7 +1,7 @@ +import type { VaultV2Details } from '@/data-sources/morpho-api/v2-vaults'; import { userVaultsV2AddressesQuery } from '@/graphql/morpho-v2-subgraph-queries'; import { SupportedNetworks, getAgentConfig, networks, isAgentAvailable } from '@/utils/networks'; import { subgraphGraphqlFetcher } from './fetchers'; -import type { VaultV2Details } from '@/data-sources/morpho-api/v2-vaults'; // Simplified subgraph response for vault addresses type SubgraphVaultV2Address = { diff --git a/src/hooks/useUserVaultsV2.ts b/src/hooks/useUserVaultsV2.ts index 49115221..8f0651fd 100644 --- a/src/hooks/useUserVaultsV2.ts +++ b/src/hooks/useUserVaultsV2.ts @@ -1,11 +1,11 @@ import { useState, useEffect, useCallback } from 'react'; import { Address } from 'viem'; import { useAccount } from 'wagmi'; +import { fetchMultipleVaultV2DetailsAcrossNetworks } from '@/data-sources/morpho-api/v2-vaults'; import { fetchUserVaultV2AddressesAllNetworks, UserVaultV2 } from '@/data-sources/subgraph/v2-vaults'; -import { fetchMultipleVaultV2DetailsAcrossNetworks } from '@/data-sources/morpho-api/v2-vaults'; import { readTotalAsset } from '@/utils/vaultAllocation'; type UseUserVaultsV2Return = {