diff --git a/CHANGELOG.md b/CHANGELOG.md index 868a18f7c..b02bc7455 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ changes. ### Added - Add metadata url and hash to drep details [Issue 2911](https://github.com/IntersectMBO/govtool/issues/2911) +- Add CC votes percentages, not voted and Ratification threshold ### Fixed diff --git a/govtool/backend/sql/get-network-metrics.sql b/govtool/backend/sql/get-network-metrics.sql index ba668900f..06c3c013c 100644 --- a/govtool/backend/sql/get-network-metrics.sql +++ b/govtool/backend/sql/get-network-metrics.sql @@ -186,6 +186,24 @@ AlwaysNoConfidenceVotingPower AS ( ), TotalDRepDistr AS ( SELECT SUM(COALESCE(amount, 0))::bigint total_drep_distr FROM drep_distr where epoch_no = (SELECT no from CurrentEpoch) +), +CommitteeMembersCount AS ( + SELECT COUNT(*) AS no_of_committee_members FROM committee_member +), +LatestGovAction AS ( + SELECT gap.id, gap.enacted_epoch + FROM gov_action_proposal gap + JOIN CurrentEpoch ce ON gap.enacted_epoch < ce.no + ORDER BY gap.id DESC + LIMIT 1 +), +CommitteeThreshold AS ( + SELECT + c.* + FROM committee c + LEFT JOIN LatestGovAction lga ON c.gov_action_proposal_id = lga.id + WHERE (c.gov_action_proposal_id IS NOT NULL AND lga.id IS NOT NULL) + OR (c.gov_action_proposal_id IS NULL) ) SELECT CurrentEpoch.no AS epoch_no, @@ -204,7 +222,10 @@ SELECT TotalRegisteredDirectVoters.unique_direct_voters AS total_registered_direct_voters, AlwaysAbstainVotingPower.amount AS always_abstain_voting_power, AlwaysNoConfidenceVotingPower.amount AS always_no_confidence_voting_power, - meta.network_name + meta.network_name, + CommitteeMembersCount.no_of_committee_members, + CommitteeThreshold.quorum_numerator, + CommitteeThreshold.quorum_denominator FROM CurrentEpoch CROSS JOIN CurrentBlock CROSS JOIN UniqueDelegators @@ -221,4 +242,6 @@ CROSS JOIN TotalActiveCIP119CompliantDReps CROSS JOIN TotalRegisteredDirectVoters CROSS JOIN AlwaysAbstainVotingPower CROSS JOIN AlwaysNoConfidenceVotingPower +CROSS JOIN CommitteeMembersCount +CROSS JOIN CommitteeThreshold CROSS JOIN meta; diff --git a/govtool/backend/src/VVA/API.hs b/govtool/backend/src/VVA/API.hs index 5424b32e7..0e553cfaf 100644 --- a/govtool/backend/src/VVA/API.hs +++ b/govtool/backend/src/VVA/API.hs @@ -451,4 +451,7 @@ getNetworkMetrics = do , getNetworkMetricsResponseAlwaysAbstainVotingPower = networkMetricsAlwaysAbstainVotingPower , getNetworkMetricsResponseAlwaysNoConfidenceVotingPower = networkMetricsAlwaysNoConfidenceVotingPower , getNetworkMetricsResponseNetworkName = networkMetricsNetworkName + , getNetworkMetricsResponseNoOfCommitteeMembers = networkMetricsNoOfCommitteeMembers + , getNetworkMetricsResponseQuorumNumerator = networkMetricsQuorumNumerator + , getNetworkMetricsResponseQuorumDenominator = networkMetricsQuorumDenominator } diff --git a/govtool/backend/src/VVA/API/Types.hs b/govtool/backend/src/VVA/API/Types.hs index 947c7ac53..461ca5dfe 100644 --- a/govtool/backend/src/VVA/API/Types.hs +++ b/govtool/backend/src/VVA/API/Types.hs @@ -894,6 +894,9 @@ data GetNetworkMetricsResponse , getNetworkMetricsResponseAlwaysAbstainVotingPower :: Integer , getNetworkMetricsResponseAlwaysNoConfidenceVotingPower :: Integer , getNetworkMetricsResponseNetworkName :: Text + , getNetworkMetricsResponseNoOfCommitteeMembers :: Integer + , getNetworkMetricsResponseQuorumNumerator :: Integer + , getNetworkMetricsResponseQuorumDenominator :: Integer } deriveJSON (jsonOptions "getNetworkMetricsResponse") ''GetNetworkMetricsResponse @@ -917,7 +920,10 @@ exampleGetNetworkMetricsResponse = <> "\"totalRegisteredDirectVoters\": 0," <> "\"alwaysAbstainVotingPower\": 0," <> "\"alwaysNoConfidenceVotingPower\": 0," - <> "\"networkName\": \"Mainnet\"}" + <> "\"networkName\": \"Mainnet\"," + <> "\"noOfCommitteeMembers\": 7," + <> "\"quorumNumerator\": 2," + <> "\"quorumDenominator\": 3}" instance ToSchema GetNetworkMetricsResponse where declareNamedSchema _ = pure $ NamedSchema (Just "GetNetworkMetricsResponse") $ mempty diff --git a/govtool/backend/src/VVA/Network.hs b/govtool/backend/src/VVA/Network.hs index 7187bb9b5..550c354c2 100644 --- a/govtool/backend/src/VVA/Network.hs +++ b/govtool/backend/src/VVA/Network.hs @@ -52,6 +52,9 @@ networkMetrics = withPool $ \conn -> do , always_abstain_voting_power , always_no_confidence_voting_power , network_name + , no_of_committee_members + , quorum_numerator + , quorum_denominator )] -> return $ NetworkMetrics current_time epoch_no @@ -71,4 +74,7 @@ networkMetrics = withPool $ \conn -> do always_abstain_voting_power always_no_confidence_voting_power network_name + no_of_committee_members + quorum_numerator + quorum_denominator _ -> throwError $ CriticalError "Could not query the network metrics. This should never happen." diff --git a/govtool/backend/src/VVA/Types.hs b/govtool/backend/src/VVA/Types.hs index b07d87fcb..0e69988d6 100644 --- a/govtool/backend/src/VVA/Types.hs +++ b/govtool/backend/src/VVA/Types.hs @@ -235,6 +235,9 @@ data NetworkMetrics , networkMetricsAlwaysAbstainVotingPower :: Integer , networkMetricsAlwaysNoConfidenceVotingPower :: Integer , networkMetricsNetworkName :: Text + , networkMetricsNoOfCommitteeMembers :: Integer + , networkMetricsQuorumNumerator :: Integer + , networkMetricsQuorumDenominator :: Integer } data Delegation diff --git a/govtool/frontend/src/components/atoms/VotePill.tsx b/govtool/frontend/src/components/atoms/VotePill.tsx index 44159ca9b..f2076f6e9 100644 --- a/govtool/frontend/src/components/atoms/VotePill.tsx +++ b/govtool/frontend/src/components/atoms/VotePill.tsx @@ -28,7 +28,7 @@ const ccVoteLabelKey: Record = { yes: "votes.constitutional", no: "votes.unconstitutional", abstain: "votes.abstain", - notvoted: "", + notvoted: "votes.notVoted", }; type VoteExtended = Vote | "notVoted"; diff --git a/govtool/frontend/src/components/molecules/VotesSubmitted.tsx b/govtool/frontend/src/components/molecules/VotesSubmitted.tsx index b4c1afe53..15819d217 100644 --- a/govtool/frontend/src/components/molecules/VotesSubmitted.tsx +++ b/govtool/frontend/src/components/molecules/VotesSubmitted.tsx @@ -50,6 +50,13 @@ export const VotesSubmitted = ({ const { t } = useTranslation(); const { epochParams, networkMetrics } = useAppContext(); + const noOfCommitteeMembers = networkMetrics?.noOfCommitteeMembers ?? 0; + const ccThreshold = ( + networkMetrics?.quorumDenominator + ? networkMetrics.quorumNumerator / networkMetrics.quorumDenominator + : 0 + ).toPrecision(2); + // Coming from be // Equal to: total active drep stake + auto no-confidence stake const totalStakeControlledByDReps = @@ -96,15 +103,16 @@ export const VotesSubmitted = ({ ? 100 : undefined; - const ccYesVotesPercentage = - ccYesVotes + ccNoVotes - ? (ccYesVotes / (ccYesVotes + ccNoVotes)) * 100 - : undefined; - const ccNoVotesPercentage = ccYesVotesPercentage - ? 100 - ccYesVotesPercentage - : ccNoVotes - ? 100 + const ccYesVotesPercentage = noOfCommitteeMembers + ? (ccYesVotes / noOfCommitteeMembers) * 100 + : undefined; + const ccNoVotesPercentage = noOfCommitteeMembers + ? (ccNoVotes / noOfCommitteeMembers) * 100 : undefined; + const ccNotVotedVotes = + noOfCommitteeMembers - ccYesVotes - ccNoVotes - ccAbstainVotes; + const ccNotVotedVotesPercentage = + 100 - (ccYesVotesPercentage ?? 0) - (ccNoVotesPercentage ?? 0); return ( )} diff --git a/govtool/frontend/src/models/api.ts b/govtool/frontend/src/models/api.ts index bfa233d1e..603cdd47d 100644 --- a/govtool/frontend/src/models/api.ts +++ b/govtool/frontend/src/models/api.ts @@ -97,6 +97,9 @@ export type NetworkMetrics = { alwaysAbstainVotingPower: number; alwaysNoConfidenceVotingPower: number; networkName: string; + noOfCommitteeMembers: number; + quorumNumerator: number; + quorumDenominator: number; }; export type VoterInfo = { diff --git a/govtool/frontend/src/stories/GovernanceActionDetailsCard.stories.ts b/govtool/frontend/src/stories/GovernanceActionDetailsCard.stories.ts index c2dfda35d..9d62c35f9 100644 --- a/govtool/frontend/src/stories/GovernanceActionDetailsCard.stories.ts +++ b/govtool/frontend/src/stories/GovernanceActionDetailsCard.stories.ts @@ -148,7 +148,9 @@ export const GovernanceActionDetailsCardComponent: Story = { await expect(canvas.getAllByText(/yes/i)).toHaveLength(2); await expect(canvas.getAllByText(/abstain/i)).toHaveLength(3); - await expect(canvas.getAllByText(/no/i)).toHaveLength(2); + await expect(canvas.getAllByText(/no/i)).toHaveLength(4); + await expect(canvas.getAllByText(/constitutional/i)).toHaveLength(3); + await expect(canvas.getAllByText(/not voted/i)).toHaveLength(2); }, };