diff --git a/packages/ui/src/council/hooks/usePastCouncil.ts b/packages/ui/src/council/hooks/usePastCouncil.ts index b8e55bee91..bc1b6e0b2d 100644 --- a/packages/ui/src/council/hooks/usePastCouncil.ts +++ b/packages/ui/src/council/hooks/usePastCouncil.ts @@ -1,5 +1,5 @@ import { useCouncilBlockRange } from '@/council/hooks/useCouncilBlockRange' -import { useGetPastCouncilQuery } from '@/council/queries' +import { useGetPastCouncilQuery, useGetPastCouncilWorkingGroupsQuery } from '@/council/queries' import { asPastCouncilWithDetails } from '@/council/types/PastCouncil' export const usePastCouncil = (id: string) => { @@ -7,16 +7,29 @@ export const usePastCouncil = (id: string) => { const { loading: loadingData, data: councilData } = useGetPastCouncilQuery({ variables: { id, fromBlock, toBlock } }) + const { loading: loadingWorkingGroup, data: workingGroupData } = useGetPastCouncilWorkingGroupsQuery({ + variables: { + fromBlock: fromBlock, + toBlock: toBlock, + }, + }) + return { - isLoading: loadingRange || loadingData, + isLoading: loadingRange || loadingData || loadingWorkingGroup, council: councilData?.electedCouncilByUniqueInput && councilData?.budgetSpendingEvents && councilData?.fundingRequestsApproved && + workingGroupData?.rewardPaidEvents && + workingGroupData?.budgetUpdatedEvents && + workingGroupData?.channelPaymentMadeEvents && asPastCouncilWithDetails( + workingGroupData.rewardPaidEvents, + workingGroupData.budgetUpdatedEvents, councilData.electedCouncilByUniqueInput, councilData.budgetSpendingEvents, - councilData.fundingRequestsApproved + councilData.fundingRequestsApproved, + workingGroupData.channelPaymentMadeEvents ), } } diff --git a/packages/ui/src/council/hooks/usePastCouncilStats.ts b/packages/ui/src/council/hooks/usePastCouncilStats.ts index 4fb8275d2c..6b28b7af51 100644 --- a/packages/ui/src/council/hooks/usePastCouncilStats.ts +++ b/packages/ui/src/council/hooks/usePastCouncilStats.ts @@ -1,5 +1,6 @@ +import { usePastCouncil } from '@/council/hooks/usePastCouncil' import { useGetCouncilBlockRangeQuery, useGetPastCouncilStatsQuery } from '@/council/queries' -import { getSpentOnProposals, getTotalSpent } from '@/council/types/PastCouncil' +import { getSpentOnProposals } from '@/council/types/PastCouncil' export const usePastCouncilStats = (id: string) => { const { loading: loadingRange, data: rangeData } = useGetCouncilBlockRangeQuery({ @@ -19,11 +20,13 @@ export const usePastCouncilStats = (id: string) => { }, }) + const { isLoading: loadingCouncil, council: pastCouncil } = usePastCouncil(id) + return { - isLoading: loadingRange || loadingData, + isLoading: loadingRange || loadingData || loadingCouncil, proposalsApproved: data?.proposalsApproved?.totalCount ?? 0, proposalsRejected: (data?.proposalsRejected?.totalCount || 0) + (data?.proposalsSlashed?.totalCount || 0), - totalSpent: data && getTotalSpent(data.budgetSpendingEvents), + totalSpent: data && pastCouncil && pastCouncil.totalSpent, spentOnProposals: data && getSpentOnProposals(data.fundingRequestsApproved), } } diff --git a/packages/ui/src/council/queries/__generated__/council.generated.tsx b/packages/ui/src/council/queries/__generated__/council.generated.tsx index 8186b0f3e5..0271230d59 100644 --- a/packages/ui/src/council/queries/__generated__/council.generated.tsx +++ b/packages/ui/src/council/queries/__generated__/council.generated.tsx @@ -161,6 +161,13 @@ export type PastCouncilBudgetUpdatedEventFieldsFragment = { budgetChangeAmount: string } +export type PastCouncilChannelPaymentMadeEventFieldsFragment = { + __typename: 'ChannelPaymentMadeEvent' + id: string + amount: string + payer: { __typename: 'Membership'; handle: string } +} + export type ElectedCouncilFieldsFragment = { __typename: 'ElectedCouncil' id: string @@ -581,39 +588,36 @@ export type CouncilSpendingEventFieldsFragment = { } export type FundingRequestApprovedFragment = { - __typename: 'ProposalExecutedEvent' - proposal: { - __typename: 'Proposal' - details: - | { __typename: 'AmendConstitutionProposalDetails' } - | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } - | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } - | { - __typename: 'FundingRequestProposalDetails' - destinationsList?: { - __typename: 'FundingRequestDestinationsList' - destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> - } | null - } - | { __typename: 'RuntimeUpgradeProposalDetails' } - | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } - | { __typename: 'SetCouncilorRewardProposalDetails' } - | { __typename: 'SetInitialInvitationBalanceProposalDetails' } - | { __typename: 'SetInitialInvitationCountProposalDetails' } - | { __typename: 'SetMaxValidatorCountProposalDetails' } - | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } - | { __typename: 'SetMembershipPriceProposalDetails' } - | { __typename: 'SetReferralCutProposalDetails' } - | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } - | { __typename: 'SignalProposalDetails' } - | { __typename: 'SlashWorkingGroupLeadProposalDetails' } - | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } - | { __typename: 'UpdateChannelPayoutsProposalDetails' } - | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } - | { __typename: 'VetoProposalDetails' } - } + __typename: 'Proposal' + details: + | { __typename: 'AmendConstitutionProposalDetails' } + | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } + | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } + | { + __typename: 'FundingRequestProposalDetails' + destinationsList?: { + __typename: 'FundingRequestDestinationsList' + destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> + } | null + } + | { __typename: 'RuntimeUpgradeProposalDetails' } + | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } + | { __typename: 'SetCouncilorRewardProposalDetails' } + | { __typename: 'SetInitialInvitationBalanceProposalDetails' } + | { __typename: 'SetInitialInvitationCountProposalDetails' } + | { __typename: 'SetMaxValidatorCountProposalDetails' } + | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } + | { __typename: 'SetMembershipPriceProposalDetails' } + | { __typename: 'SetReferralCutProposalDetails' } + | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } + | { __typename: 'SignalProposalDetails' } + | { __typename: 'SlashWorkingGroupLeadProposalDetails' } + | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } + | { __typename: 'UpdateChannelPayoutsProposalDetails' } + | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } + | { __typename: 'VetoProposalDetails' } } export type GetElectedCouncilQueryVariables = Types.Exact<{ [key: string]: never }> @@ -729,39 +733,36 @@ export type GetPastCouncilQuery = { type?: Types.EventTypeOptions | null }> fundingRequestsApproved: Array<{ - __typename: 'ProposalExecutedEvent' - proposal: { - __typename: 'Proposal' - details: - | { __typename: 'AmendConstitutionProposalDetails' } - | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } - | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } - | { - __typename: 'FundingRequestProposalDetails' - destinationsList?: { - __typename: 'FundingRequestDestinationsList' - destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> - } | null - } - | { __typename: 'RuntimeUpgradeProposalDetails' } - | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } - | { __typename: 'SetCouncilorRewardProposalDetails' } - | { __typename: 'SetInitialInvitationBalanceProposalDetails' } - | { __typename: 'SetInitialInvitationCountProposalDetails' } - | { __typename: 'SetMaxValidatorCountProposalDetails' } - | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } - | { __typename: 'SetMembershipPriceProposalDetails' } - | { __typename: 'SetReferralCutProposalDetails' } - | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } - | { __typename: 'SignalProposalDetails' } - | { __typename: 'SlashWorkingGroupLeadProposalDetails' } - | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } - | { __typename: 'UpdateChannelPayoutsProposalDetails' } - | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } - | { __typename: 'VetoProposalDetails' } - } + __typename: 'Proposal' + details: + | { __typename: 'AmendConstitutionProposalDetails' } + | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } + | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } + | { + __typename: 'FundingRequestProposalDetails' + destinationsList?: { + __typename: 'FundingRequestDestinationsList' + destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> + } | null + } + | { __typename: 'RuntimeUpgradeProposalDetails' } + | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } + | { __typename: 'SetCouncilorRewardProposalDetails' } + | { __typename: 'SetInitialInvitationBalanceProposalDetails' } + | { __typename: 'SetInitialInvitationCountProposalDetails' } + | { __typename: 'SetMaxValidatorCountProposalDetails' } + | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } + | { __typename: 'SetMembershipPriceProposalDetails' } + | { __typename: 'SetReferralCutProposalDetails' } + | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } + | { __typename: 'SignalProposalDetails' } + | { __typename: 'SlashWorkingGroupLeadProposalDetails' } + | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } + | { __typename: 'UpdateChannelPayoutsProposalDetails' } + | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } + | { __typename: 'VetoProposalDetails' } }> } @@ -995,6 +996,12 @@ export type GetPastCouncilWorkingGroupsQuery = { newMissedRewardAmount: string }> budgetUpdatedEvents: Array<{ __typename: 'BudgetUpdatedEvent'; groupId: string; budgetChangeAmount: string }> + channelPaymentMadeEvents: Array<{ + __typename: 'ChannelPaymentMadeEvent' + id: string + amount: string + payer: { __typename: 'Membership'; handle: string } + }> } export type GetCurrentElectionQueryVariables = Types.Exact<{ [key: string]: never }> @@ -1435,39 +1442,36 @@ export type GetPastCouncilStatsQuery = { __typename: 'Query' proposalsApproved: { __typename: 'ProposalExecutedEventConnection'; totalCount: number } fundingRequestsApproved: Array<{ - __typename: 'ProposalExecutedEvent' - proposal: { - __typename: 'Proposal' - details: - | { __typename: 'AmendConstitutionProposalDetails' } - | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } - | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } - | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } - | { - __typename: 'FundingRequestProposalDetails' - destinationsList?: { - __typename: 'FundingRequestDestinationsList' - destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> - } | null - } - | { __typename: 'RuntimeUpgradeProposalDetails' } - | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } - | { __typename: 'SetCouncilorRewardProposalDetails' } - | { __typename: 'SetInitialInvitationBalanceProposalDetails' } - | { __typename: 'SetInitialInvitationCountProposalDetails' } - | { __typename: 'SetMaxValidatorCountProposalDetails' } - | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } - | { __typename: 'SetMembershipPriceProposalDetails' } - | { __typename: 'SetReferralCutProposalDetails' } - | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } - | { __typename: 'SignalProposalDetails' } - | { __typename: 'SlashWorkingGroupLeadProposalDetails' } - | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } - | { __typename: 'UpdateChannelPayoutsProposalDetails' } - | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } - | { __typename: 'VetoProposalDetails' } - } + __typename: 'Proposal' + details: + | { __typename: 'AmendConstitutionProposalDetails' } + | { __typename: 'CancelWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'CreateWorkingGroupLeadOpeningProposalDetails' } + | { __typename: 'DecreaseWorkingGroupLeadStakeProposalDetails' } + | { __typename: 'FillWorkingGroupLeadOpeningProposalDetails' } + | { + __typename: 'FundingRequestProposalDetails' + destinationsList?: { + __typename: 'FundingRequestDestinationsList' + destinations: Array<{ __typename: 'FundingRequestDestination'; amount: string; account: string }> + } | null + } + | { __typename: 'RuntimeUpgradeProposalDetails' } + | { __typename: 'SetCouncilBudgetIncrementProposalDetails' } + | { __typename: 'SetCouncilorRewardProposalDetails' } + | { __typename: 'SetInitialInvitationBalanceProposalDetails' } + | { __typename: 'SetInitialInvitationCountProposalDetails' } + | { __typename: 'SetMaxValidatorCountProposalDetails' } + | { __typename: 'SetMembershipLeadInvitationQuotaProposalDetails' } + | { __typename: 'SetMembershipPriceProposalDetails' } + | { __typename: 'SetReferralCutProposalDetails' } + | { __typename: 'SetWorkingGroupLeadRewardProposalDetails' } + | { __typename: 'SignalProposalDetails' } + | { __typename: 'SlashWorkingGroupLeadProposalDetails' } + | { __typename: 'TerminateWorkingGroupLeadProposalDetails' } + | { __typename: 'UpdateChannelPayoutsProposalDetails' } + | { __typename: 'UpdateWorkingGroupBudgetProposalDetails' } + | { __typename: 'VetoProposalDetails' } }> proposalsRejected: { __typename: 'ProposalDecisionMadeEventConnection'; totalCount: number } proposalsSlashed: { __typename: 'ProposalDecisionMadeEventConnection'; totalCount: number } @@ -1538,6 +1542,15 @@ export const PastCouncilBudgetUpdatedEventFieldsFragmentDoc = gql` budgetChangeAmount } ` +export const PastCouncilChannelPaymentMadeEventFieldsFragmentDoc = gql` + fragment PastCouncilChannelPaymentMadeEventFields on ChannelPaymentMadeEvent { + id + amount + payer { + handle + } + } +` export const CouncilMemberFieldsFragmentDoc = gql` fragment CouncilMemberFields on CouncilMember { id @@ -1696,16 +1709,13 @@ export const CouncilSpendingEventFieldsFragmentDoc = gql` } ` export const FundingRequestApprovedFragmentDoc = gql` - fragment FundingRequestApproved on ProposalExecutedEvent { - proposal { - details { - __typename - ... on FundingRequestProposalDetails { - destinationsList { - destinations { - amount - account - } + fragment FundingRequestApproved on Proposal { + details { + ... on FundingRequestProposalDetails { + destinationsList { + destinations { + amount + account } } } @@ -1902,11 +1912,11 @@ export const GetPastCouncilDocument = gql` budgetSpendingEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { ...CouncilSpendingEventFields } - fundingRequestsApproved: proposalExecutedEvents( + fundingRequestsApproved: proposals( where: { - inBlock_gt: $fromBlock - inBlock_lt: $toBlock - proposal: { details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } + statusSetAtBlock_gt: $fromBlock + statusSetAtBlock_lt: $toBlock + details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } ) { ...FundingRequestApproved @@ -2074,11 +2084,15 @@ export const GetPastCouncilWorkingGroupsDocument = gql` budgetUpdatedEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { ...PastCouncilBudgetUpdatedEventFields } + channelPaymentMadeEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { + ...PastCouncilChannelPaymentMadeEventFields + } } ${PastCouncilWorkingGroupFieldsFragmentDoc} ${PastCouncilRewardPaidEventFieldsFragmentDoc} ${PastCouncilNewMissedRewardLevelReachedEventFieldsFragmentDoc} ${PastCouncilBudgetUpdatedEventFieldsFragmentDoc} + ${PastCouncilChannelPaymentMadeEventFieldsFragmentDoc} ` /** @@ -2784,11 +2798,11 @@ export const GetPastCouncilStatsDocument = gql` proposalsApproved: proposalExecutedEventsConnection(where: { inBlock_gt: $startBlock, inBlock_lt: $endBlock }) { totalCount } - fundingRequestsApproved: proposalExecutedEvents( + fundingRequestsApproved: proposals( where: { - inBlock_gt: $startBlock - inBlock_lt: $endBlock - proposal: { details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } + statusSetAtBlock_gt: $startBlock + statusSetAtBlock_lt: $endBlock + details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } ) { ...FundingRequestApproved diff --git a/packages/ui/src/council/queries/council.graphql b/packages/ui/src/council/queries/council.graphql index 641c6aed20..a537c27716 100644 --- a/packages/ui/src/council/queries/council.graphql +++ b/packages/ui/src/council/queries/council.graphql @@ -45,6 +45,14 @@ fragment PastCouncilBudgetUpdatedEventFields on BudgetUpdatedEvent { budgetChangeAmount } +fragment PastCouncilChannelPaymentMadeEventFields on ChannelPaymentMadeEvent { + id + amount + payer { + handle + } +} + fragment ElectedCouncilFields on ElectedCouncil { id electedAtBlock @@ -168,16 +176,13 @@ fragment CouncilSpendingEventFields on BudgetSpendingEvent { type } -fragment FundingRequestApproved on ProposalExecutedEvent { - proposal { - details { - __typename - ... on FundingRequestProposalDetails { - destinationsList { - destinations { - amount - account - } +fragment FundingRequestApproved on Proposal { + details { + ... on FundingRequestProposalDetails { + destinationsList { + destinations { + amount + account } } } @@ -218,11 +223,11 @@ query GetPastCouncil($id: ID!, $fromBlock: Int!, $toBlock: Int!) { budgetSpendingEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { ...CouncilSpendingEventFields } - fundingRequestsApproved: proposalExecutedEvents( + fundingRequestsApproved: proposals( where: { - inBlock_gt: $fromBlock - inBlock_lt: $toBlock - proposal: { details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } + statusSetAtBlock_gt: $fromBlock + statusSetAtBlock_lt: $toBlock + details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } ) { ...FundingRequestApproved @@ -259,6 +264,9 @@ query GetPastCouncilWorkingGroups($fromBlock: Int!, $toBlock: Int!) { budgetUpdatedEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { ...PastCouncilBudgetUpdatedEventFields } + channelPaymentMadeEvents(where: { inBlock_gte: $fromBlock, inBlock_lte: $toBlock }) { + ...PastCouncilChannelPaymentMadeEventFields + } } query GetCurrentElection { @@ -371,11 +379,11 @@ query GetPastCouncilStats($startBlock: Int!, $endBlock: Int!) { proposalsApproved: proposalExecutedEventsConnection(where: { inBlock_gt: $startBlock, inBlock_lt: $endBlock }) { totalCount } - fundingRequestsApproved: proposalExecutedEvents( + fundingRequestsApproved: proposals( where: { - inBlock_gt: $startBlock - inBlock_lt: $endBlock - proposal: { details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } + statusSetAtBlock_gt: $startBlock + statusSetAtBlock_lt: $endBlock + details_json: { isTypeOf_eq: "FundingRequestProposalDetails" } } ) { ...FundingRequestApproved diff --git a/packages/ui/src/council/types/PastCouncil.ts b/packages/ui/src/council/types/PastCouncil.ts index bb92d4af5d..4162787d05 100644 --- a/packages/ui/src/council/types/PastCouncil.ts +++ b/packages/ui/src/council/types/PastCouncil.ts @@ -6,8 +6,11 @@ import { asBlock, Block } from '@/common/types' import { CouncilSpendingEventFieldsFragment, FundingRequestApprovedFragment, + PastCouncilBudgetUpdatedEventFieldsFragment, + PastCouncilChannelPaymentMadeEventFieldsFragment, PastCouncilDetailedFieldsFragment, PastCouncilFieldsFragment, + PastCouncilRewardPaidEventFieldsFragment, } from '@/council/queries' import { asProposalDetails, DetailsFragment, FundingRequestDetails } from '@/proposals/types' @@ -32,12 +35,33 @@ export const asPastCouncil = (fields: PastCouncilFieldsFragment): PastCouncil => }), }) -export const getTotalSpent = (spendingEvents: CouncilSpendingEventFieldsFragment[]) => - spendingEvents.reduce((a, b) => a.add(new BN(b.amount)), BN_ZERO) +const getTotalSpent = ( + councilFields: PastCouncilDetailedFieldsFragment, + workingGroupBudgets: PastCouncilBudgetUpdatedEventFieldsFragment[], + workingGroupRewardPaidEvents: PastCouncilRewardPaidEventFieldsFragment[], + fundingRequestsApproved: FundingRequestApprovedFragment[], + channelPaymentMadeEvents: PastCouncilChannelPaymentMadeEventFieldsFragment[] +) => { + const totalAccumulatedReward = councilFields.councilMembers.reduce( + (a, b) => a.add(new BN(b.accumulatedReward)), + BN_ZERO + ) + const totalBudgetChange = workingGroupBudgets.reduce((a, b) => a.add(new BN(b.budgetChangeAmount)), BN_ZERO) + const totalRewardPaid = workingGroupRewardPaidEvents.reduce((a, b) => a.add(new BN(b.amount)), BN_ZERO) + const spentOnProposal = getSpentOnProposals(fundingRequestsApproved) + const totalChannelPaymentMade = channelPaymentMadeEvents + .filter((a) => a.payer.handle !== 'jsg_ypp_rewards') + .reduce((a, b) => a.add(new BN(b.amount)), BN_ZERO) + return totalAccumulatedReward + .add(totalBudgetChange) + .add(totalRewardPaid) + .add(spentOnProposal) + .add(totalChannelPaymentMade) +} export const getSpentOnProposals = (fundingRequests: FundingRequestApprovedFragment[]) => { return fundingRequests.reduce((sum, fundingRequest) => { - const details = asProposalDetails(fundingRequest.proposal.details as DetailsFragment) as FundingRequestDetails + const details = asProposalDetails(fundingRequest.details as DetailsFragment) as FundingRequestDetails const amount = details.destinations?.reduce((a, b) => a.add(b.amount), BN_ZERO) || BN_ZERO return sum.add(amount) @@ -45,13 +69,22 @@ export const getSpentOnProposals = (fundingRequests: FundingRequestApprovedFragm } export const asPastCouncilWithDetails = ( + workingGroupRewardPaidEvents: PastCouncilRewardPaidEventFieldsFragment[], + workingGroupBudgets: PastCouncilBudgetUpdatedEventFieldsFragment[], councilFields: PastCouncilDetailedFieldsFragment, spendingEvents: CouncilSpendingEventFieldsFragment[], - fundingRequestsApproved: FundingRequestApprovedFragment[] + fundingRequestsApproved: FundingRequestApprovedFragment[], + channelPaymentMadeEvents: PastCouncilChannelPaymentMadeEventFieldsFragment[] ): PastCouncilWithDetails => { return { ...asPastCouncil(councilFields), - totalSpent: getTotalSpent(spendingEvents), + totalSpent: getTotalSpent( + councilFields, + workingGroupBudgets, + workingGroupRewardPaidEvents, + fundingRequestsApproved, + channelPaymentMadeEvents + ), totalMissedRewards: councilFields.councilMembers.reduce((a, b) => a.add(new BN(b.unpaidReward)), BN_ZERO).neg(), totalPaidRewards: councilFields.councilMembers.reduce((a, b) => a.add(new BN(b.accumulatedReward)), BN_ZERO), totalSpentOnProposals: getSpentOnProposals(fundingRequestsApproved), diff --git a/packages/ui/test/council/pages/PastCouncil.test.tsx b/packages/ui/test/council/pages/PastCouncil.test.tsx index ad486e5c0f..d124a85ddc 100644 --- a/packages/ui/test/council/pages/PastCouncil.test.tsx +++ b/packages/ui/test/council/pages/PastCouncil.test.tsx @@ -119,7 +119,7 @@ describe('UI: Past Council page', () => { it('Total spent', async () => { const { getByText } = await renderComponent() - expect(getByText(/^Total spent$/i).parentElement?.nextSibling?.textContent).toBe('300') + expect(getByText(/^Total spent$/i).parentElement?.nextSibling?.textContent).toBe('5,055') }) it('Total missed rewards', async () => { @@ -420,7 +420,7 @@ describe('UI: Past Council page', () => { component.getByText(tabName).click() - await waitForElementToBeRemoved(() => loaderSelector()) + if (loaderSelector()) await waitForElementToBeRemoved(() => loaderSelector()) return component }