From 2ea8d9e75f256248f0f74b9eef6ffad60f72b3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Zi=C3=B3=C5=82ek?= Date: Thu, 28 Mar 2024 13:34:33 +0100 Subject: [PATCH 1/7] fix: do not fetch project donors outside aw --- .../src/hooks/queries/donors/useProjectDonors.ts | 16 ++++++---------- .../hooks/queries/donors/useProjectsDonors.ts | 16 ++++++---------- .../hooks/queries/useProjectsIpfsWithRewards.ts | 11 ++++++++--- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/client/src/hooks/queries/donors/useProjectDonors.ts b/client/src/hooks/queries/donors/useProjectDonors.ts index e12432d481..c3d01d80f1 100644 --- a/client/src/hooks/queries/donors/useProjectDonors.ts +++ b/client/src/hooks/queries/donors/useProjectDonors.ts @@ -10,6 +10,9 @@ import { WebsocketListenEvent } from 'types/websocketEvents'; import { ProjectDonor } from './types'; import { mapDataToProjectDonors } from './utils'; +export const isEnabled = (isDecisionWindowOpen?: boolean, epoch?: number): boolean => + isDecisionWindowOpen === true || epoch !== undefined; + export default function useProjectDonors( projectAddress: string, epoch?: number, @@ -39,16 +42,9 @@ export default function useProjectDonors( }); return useQuery({ - enabled: !!projectAddress && (epoch !== undefined || !!(currentEpoch && currentEpoch > 1)), - queryFn: () => - apiGetProjectDonors( - projectAddress, - epoch || (isDecisionWindowOpen ? currentEpoch! - 1 : currentEpoch!), - ), - queryKey: QUERY_KEYS.projectDonors( - projectAddress, - epoch || (isDecisionWindowOpen ? currentEpoch! - 1 : currentEpoch!), - ), + enabled: !!projectAddress && isEnabled(isDecisionWindowOpen, epoch), + queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), + queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), staleTime: Infinity, ...options, diff --git a/client/src/hooks/queries/donors/useProjectsDonors.ts b/client/src/hooks/queries/donors/useProjectsDonors.ts index 6a547cbb31..887c8e61ef 100644 --- a/client/src/hooks/queries/donors/useProjectsDonors.ts +++ b/client/src/hooks/queries/donors/useProjectsDonors.ts @@ -9,6 +9,9 @@ import useProjectsContract from 'hooks/queries/useProjectsContract'; import { ProjectDonor } from './types'; import { mapDataToProjectDonors } from './utils'; +export const isEnabled = (isDecisionWindowOpen?: boolean, epoch?: number): boolean => + isDecisionWindowOpen === true || epoch !== undefined; + export default function useProjectsDonors(epoch?: number): { data: { [key: string]: ProjectDonor[] }; isFetching: boolean; @@ -21,16 +24,9 @@ export default function useProjectsDonors(epoch?: number): { const projectsDonorsResults: UseQueryResult[] = useQueries({ queries: (projectsAddresses || []).map(projectAddress => ({ - enabled: !!projectsAddresses && isDecisionWindowOpen !== undefined, - queryFn: () => - apiGetProjectDonors( - projectAddress, - epoch || (isDecisionWindowOpen ? currentEpoch! - 1 : currentEpoch!), - ), - queryKey: QUERY_KEYS.projectDonors( - projectAddress, - epoch || (isDecisionWindowOpen ? currentEpoch! - 1 : currentEpoch!), - ), + enabled: !!projectsAddresses && isEnabled(isDecisionWindowOpen, epoch), + queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), + queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), })), }); diff --git a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts index 75d4246cb9..9d64b8fc31 100644 --- a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts +++ b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts @@ -1,7 +1,9 @@ +import env from 'env'; import { ExtendedProject } from 'types/extended-project'; import getSortedElementsByTotalValueOfAllocationsAndAlphabetical from 'utils/getSortedElementsByTotalValueOfAllocationsAndAlphabetical'; -import useProjectsDonors from './donors/useProjectsDonors'; +import useProjectsDonors, { isEnabled } from './donors/useProjectsDonors'; +import useIsDecisionWindowOpen from './useIsDecisionWindowOpen'; import useMatchedProjectRewards from './useMatchedProjectRewards'; import useProjectsContract from './useProjectsContract'; import useProjectsIpfs from './useProjectsIpfs'; @@ -18,8 +20,9 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { isFetching: boolean; } { // TODO OCT-1270 TODO OCT-1312 Remove this override. - const epochOverrideForDataFetch = epoch === 2 ? 3 : epoch; + const epochOverrideForDataFetch = env.network === 'Mainnet' && epoch === 2 ? 3 : epoch; + const { data: isDecisionWindowOpen } = useIsDecisionWindowOpen(); const { data: projectsAddresses, isFetching: isFetchingProjectsContract } = useProjectsContract(epochOverrideForDataFetch); const { data: projectsIpfs, isFetching: isFetchingProjectsIpfs } = useProjectsIpfs( @@ -31,13 +34,15 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { isFetching: isFetchingMatchedProjectRewards, isRefetching: isRefetchingMatchedProjectRewards, } = useMatchedProjectRewards(epoch); + + const shouldFetchProjectDonors = isEnabled(isDecisionWindowOpen, epoch); const { data: projectsDonors, isFetching: isFetchingProjectsDonors } = useProjectsDonors(epoch); const isFetching = isFetchingProjectsContract || isFetchingProjectsIpfs || (isFetchingMatchedProjectRewards && !isRefetchingMatchedProjectRewards) || - isFetchingProjectsDonors; + (shouldFetchProjectDonors && isFetchingProjectsDonors); if (isFetching) { return { data: [], From a193a6c80cbc2edf361dee040d8edaee8e6beeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kluczek?= Date: Thu, 28 Mar 2024 13:52:24 +0100 Subject: [PATCH 2/7] ci trigger From 4701140f5cada50894308103638a3f54c6daad7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kluczek?= Date: Thu, 28 Mar 2024 14:08:57 +0100 Subject: [PATCH 3/7] ci trigger From 4c82f95bdebc9eb04d2a3ea7e4d5a3838eadd377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Zi=C3=B3=C5=82ek?= Date: Thu, 28 Mar 2024 14:20:57 +0100 Subject: [PATCH 4/7] style: simplification --- client/src/hooks/queries/donors/useProjectDonors.ts | 5 +---- client/src/hooks/queries/donors/useProjectsDonors.ts | 5 +---- client/src/hooks/queries/useProjectsIpfsWithRewards.ts | 7 ++----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/client/src/hooks/queries/donors/useProjectDonors.ts b/client/src/hooks/queries/donors/useProjectDonors.ts index c3d01d80f1..77ac93ae93 100644 --- a/client/src/hooks/queries/donors/useProjectDonors.ts +++ b/client/src/hooks/queries/donors/useProjectDonors.ts @@ -10,9 +10,6 @@ import { WebsocketListenEvent } from 'types/websocketEvents'; import { ProjectDonor } from './types'; import { mapDataToProjectDonors } from './utils'; -export const isEnabled = (isDecisionWindowOpen?: boolean, epoch?: number): boolean => - isDecisionWindowOpen === true || epoch !== undefined; - export default function useProjectDonors( projectAddress: string, epoch?: number, @@ -42,7 +39,7 @@ export default function useProjectDonors( }); return useQuery({ - enabled: !!projectAddress && isEnabled(isDecisionWindowOpen, epoch), + enabled: !!projectAddress && (isDecisionWindowOpen === true || epoch !== undefined), queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), diff --git a/client/src/hooks/queries/donors/useProjectsDonors.ts b/client/src/hooks/queries/donors/useProjectsDonors.ts index 887c8e61ef..06e1889307 100644 --- a/client/src/hooks/queries/donors/useProjectsDonors.ts +++ b/client/src/hooks/queries/donors/useProjectsDonors.ts @@ -9,9 +9,6 @@ import useProjectsContract from 'hooks/queries/useProjectsContract'; import { ProjectDonor } from './types'; import { mapDataToProjectDonors } from './utils'; -export const isEnabled = (isDecisionWindowOpen?: boolean, epoch?: number): boolean => - isDecisionWindowOpen === true || epoch !== undefined; - export default function useProjectsDonors(epoch?: number): { data: { [key: string]: ProjectDonor[] }; isFetching: boolean; @@ -24,7 +21,7 @@ export default function useProjectsDonors(epoch?: number): { const projectsDonorsResults: UseQueryResult[] = useQueries({ queries: (projectsAddresses || []).map(projectAddress => ({ - enabled: !!projectsAddresses && isEnabled(isDecisionWindowOpen, epoch), + enabled: !!projectsAddresses && (isDecisionWindowOpen === true || epoch !== undefined), queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), diff --git a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts index 9d64b8fc31..030fee3c87 100644 --- a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts +++ b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts @@ -2,8 +2,7 @@ import env from 'env'; import { ExtendedProject } from 'types/extended-project'; import getSortedElementsByTotalValueOfAllocationsAndAlphabetical from 'utils/getSortedElementsByTotalValueOfAllocationsAndAlphabetical'; -import useProjectsDonors, { isEnabled } from './donors/useProjectsDonors'; -import useIsDecisionWindowOpen from './useIsDecisionWindowOpen'; +import useProjectsDonors from './donors/useProjectsDonors'; import useMatchedProjectRewards from './useMatchedProjectRewards'; import useProjectsContract from './useProjectsContract'; import useProjectsIpfs from './useProjectsIpfs'; @@ -22,7 +21,6 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { // TODO OCT-1270 TODO OCT-1312 Remove this override. const epochOverrideForDataFetch = env.network === 'Mainnet' && epoch === 2 ? 3 : epoch; - const { data: isDecisionWindowOpen } = useIsDecisionWindowOpen(); const { data: projectsAddresses, isFetching: isFetchingProjectsContract } = useProjectsContract(epochOverrideForDataFetch); const { data: projectsIpfs, isFetching: isFetchingProjectsIpfs } = useProjectsIpfs( @@ -35,14 +33,13 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { isRefetching: isRefetchingMatchedProjectRewards, } = useMatchedProjectRewards(epoch); - const shouldFetchProjectDonors = isEnabled(isDecisionWindowOpen, epoch); const { data: projectsDonors, isFetching: isFetchingProjectsDonors } = useProjectsDonors(epoch); const isFetching = isFetchingProjectsContract || isFetchingProjectsIpfs || (isFetchingMatchedProjectRewards && !isRefetchingMatchedProjectRewards) || - (shouldFetchProjectDonors && isFetchingProjectsDonors); + isFetchingProjectsDonors; if (isFetching) { return { data: [], From 7e50d1fb02c3a2cbd8837a963c244dd79de83799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Zi=C3=B3=C5=82ek?= Date: Thu, 28 Mar 2024 14:25:53 +0100 Subject: [PATCH 5/7] fix: currentEpoch > 1 --- client/src/hooks/queries/donors/useProjectDonors.ts | 2 +- client/src/hooks/queries/donors/useProjectsDonors.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/hooks/queries/donors/useProjectDonors.ts b/client/src/hooks/queries/donors/useProjectDonors.ts index 77ac93ae93..7aa43bbf66 100644 --- a/client/src/hooks/queries/donors/useProjectDonors.ts +++ b/client/src/hooks/queries/donors/useProjectDonors.ts @@ -39,7 +39,7 @@ export default function useProjectDonors( }); return useQuery({ - enabled: !!projectAddress && (isDecisionWindowOpen === true || epoch !== undefined), + enabled: !!projectAddress && (!!currentEpoch && currentEpoch > 1) && (isDecisionWindowOpen === true || epoch !== undefined), queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), diff --git a/client/src/hooks/queries/donors/useProjectsDonors.ts b/client/src/hooks/queries/donors/useProjectsDonors.ts index 06e1889307..3dc58d78e1 100644 --- a/client/src/hooks/queries/donors/useProjectsDonors.ts +++ b/client/src/hooks/queries/donors/useProjectsDonors.ts @@ -21,7 +21,7 @@ export default function useProjectsDonors(epoch?: number): { const projectsDonorsResults: UseQueryResult[] = useQueries({ queries: (projectsAddresses || []).map(projectAddress => ({ - enabled: !!projectsAddresses && (isDecisionWindowOpen === true || epoch !== undefined), + enabled: !!projectsAddresses && (!!currentEpoch && currentEpoch > 1) && (isDecisionWindowOpen === true || epoch !== undefined), queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), From c3ccfdac8e2a6b55f9cb08c69b42cb993e3532b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kluczek?= Date: Thu, 28 Mar 2024 14:52:53 +0100 Subject: [PATCH 6/7] ci trigger From 3777b6b7916f2e19ec9a2fb38276e0ec77fd00cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Zi=C3=B3=C5=82ek?= Date: Fri, 29 Mar 2024 00:54:26 +0100 Subject: [PATCH 7/7] fix: ensure data is set --- .../src/hooks/queries/donors/useProjectsDonors.ts | 10 +++++++++- .../src/hooks/queries/useProjectsIpfsWithRewards.ts | 13 +++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/src/hooks/queries/donors/useProjectsDonors.ts b/client/src/hooks/queries/donors/useProjectsDonors.ts index 3dc58d78e1..b9cb37edab 100644 --- a/client/src/hooks/queries/donors/useProjectsDonors.ts +++ b/client/src/hooks/queries/donors/useProjectsDonors.ts @@ -12,6 +12,7 @@ import { mapDataToProjectDonors } from './utils'; export default function useProjectsDonors(epoch?: number): { data: { [key: string]: ProjectDonor[] }; isFetching: boolean; + isSuccess: boolean; } { const { data: currentEpoch } = useCurrentEpoch(); const { data: projectsAddresses } = useProjectsContract(epoch); @@ -21,7 +22,11 @@ export default function useProjectsDonors(epoch?: number): { const projectsDonorsResults: UseQueryResult[] = useQueries({ queries: (projectsAddresses || []).map(projectAddress => ({ - enabled: !!projectsAddresses && (!!currentEpoch && currentEpoch > 1) && (isDecisionWindowOpen === true || epoch !== undefined), + enabled: + !!projectsAddresses && + !!currentEpoch && + currentEpoch > 1 && + (isDecisionWindowOpen === true || epoch !== undefined), queryFn: () => apiGetProjectDonors(projectAddress, epoch || currentEpoch! - 1), queryKey: QUERY_KEYS.projectDonors(projectAddress, epoch || currentEpoch! - 1), select: response => mapDataToProjectDonors(response), @@ -39,6 +44,7 @@ export default function useProjectsDonors(epoch?: number): { return { data: {}, isFetching, + isSuccess: false, }; } @@ -50,5 +56,7 @@ export default function useProjectsDonors(epoch?: number): { }; }, {}), isFetching: false, + // Ensures projectsDonorsResults is actually fetched with data, and not just an object with undefined values. + isSuccess: !projectsDonorsResults.some(element => !element.isSuccess), }; } diff --git a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts index 030fee3c87..ab9133c045 100644 --- a/client/src/hooks/queries/useProjectsIpfsWithRewards.ts +++ b/client/src/hooks/queries/useProjectsIpfsWithRewards.ts @@ -33,7 +33,11 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { isRefetching: isRefetchingMatchedProjectRewards, } = useMatchedProjectRewards(epoch); - const { data: projectsDonors, isFetching: isFetchingProjectsDonors } = useProjectsDonors(epoch); + const { + data: projectsDonors, + isFetching: isFetchingProjectsDonors, + isSuccess: isSuccessProjectsDonors, + } = useProjectsDonors(epoch); const isFetching = isFetchingProjectsContract || @@ -56,10 +60,11 @@ export default function useProjectsIpfsWithRewards(epoch?: number): { * passed threshold. For those that did not, we reduce on their donors and get the value. */ const totalValueOfAllocations = - projectMatchedProjectRewards?.sum || - projectsDonors[project.address].reduce((acc, curr) => acc + curr.amount, BigInt(0)); + projectMatchedProjectRewards?.sum || isSuccessProjectsDonors + ? projectsDonors[project.address].reduce((acc, curr) => acc + curr.amount, BigInt(0)) + : BigInt(0); return { - numberOfDonors: projectsDonors[project.address].length, + numberOfDonors: isSuccessProjectsDonors ? projectsDonors[project.address].length : 0, percentage: projectMatchedProjectRewards?.percentage, totalValueOfAllocations, ...project,