From ce2a1469e0d3e47c5948a6093c633ff8f94a6d18 Mon Sep 17 00:00:00 2001 From: Dmitriy Evtifeev Date: Fri, 23 Oct 2026 16:06:27 +0300 Subject: [PATCH] fix: fix pagination for my vaults page fallback mode --- features/home/use-vault-list-params.ts | 9 ++++++++- modules/vaults/api/fetch-vaults.ts | 13 ++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/features/home/use-vault-list-params.ts b/features/home/use-vault-list-params.ts index 47785e3a..22755d94 100644 --- a/features/home/use-vault-list-params.ts +++ b/features/home/use-vault-list-params.ts @@ -10,11 +10,18 @@ const DEFAULT_PARAMS: FetchVaultsParams = { perPage: VAULTS_PER_PAGE, }; +// only positive integers: `?page=-1` or `?page=1.5` would yield a negative or +// fractional offset, which breaks `BigInt` and slices from the end of the list +const parsePage = (value: string | string[] | undefined): number => { + const page = Number(value); + return Number.isInteger(page) && page >= 1 ? page : DEFAULT_PARAMS.page; +}; + const queryToParams = ( query: Record, ): FetchVaultsParams => { return { - page: Number(query.page) || DEFAULT_PARAMS.page, + page: parsePage(query.page), sortBy: (query.sortBy as FetchVaultsParams['sortBy']) || DEFAULT_PARAMS.sortBy, sortDir: diff --git a/modules/vaults/api/fetch-vaults.ts b/modules/vaults/api/fetch-vaults.ts index f527377f..9567cf2c 100644 --- a/modules/vaults/api/fetch-vaults.ts +++ b/modules/vaults/api/fetch-vaults.ts @@ -245,6 +245,8 @@ const LIMIT_BY_ADDRESS = 200n; const fetchVaultsDataByAddressRPC = async ( ctx: FetchVaultsContext, address: Address, + offset: bigint, + limit: bigint, ): Promise<{ vaults: VaultEntryRaw[]; total: number }> => { const { vaultModule } = ctx; const vaultViewer = await vaultModule.contracts.getContractVaultViewer(); @@ -260,8 +262,13 @@ const fetchVaultsDataByAddressRPC = async ( vaultAddresses.push(...vaults); } + const pageAddresses = vaultAddresses.slice( + Number(offset), + Number(offset + limit), + ); + const vaults = await Promise.all( - vaultAddresses.map((vaultAddress) => + pageAddresses.map((vaultAddress) => fetchVaultRPC(ctx, vaultAddress).catch((e) => { console.warn( `[fetchConnectedVaultsRPC] Failed to fetch vault data for ${vaultAddress}:`, @@ -274,7 +281,7 @@ const fetchVaultsDataByAddressRPC = async ( ), ); - return { vaults, total: vaults.length }; + return { vaults, total: vaultAddresses.length }; }; const fetchConnectedVaultsRPC = async ( @@ -285,7 +292,7 @@ const fetchConnectedVaultsRPC = async ( const limit = BigInt(params.perPage); const { vaults, total } = await (params.address - ? fetchVaultsDataByAddressRPC(ctx, params.address) + ? fetchVaultsDataByAddressRPC(ctx, params.address, offset, limit) : fetchVaultsDataBatchRPC(ctx, offset, limit)); return {