From 39759950ce453b75475a289f64fd55a70c1410a3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 23 Mar 2020 19:55:17 +0100 Subject: [PATCH] Referendum passing status (#2447) * Referendum passing status * WarmUp totalIssuance * Optional balances --- packages/apps/src/WarmUp.tsx | 3 +- .../src/Overview/Referendum.tsx | 23 ++++++- .../src/Overview/useIsPassing.ts | 65 +++++++++++++++++++ 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 packages/page-democracy/src/Overview/useIsPassing.ts diff --git a/packages/apps/src/WarmUp.tsx b/packages/apps/src/WarmUp.tsx index c48a4a4db2..745e15a581 100644 --- a/packages/apps/src/WarmUp.tsx +++ b/packages/apps/src/WarmUp.tsx @@ -11,10 +11,11 @@ function WarmUp (): React.ReactElement { const indexes = useCall(isApiReady && api.derive.accounts?.indexes, []); const registrars = useCall(isApiReady && api.query.identity?.registrars, []); const staking = null; // useCall(isApiReady && api.derive.staking?.overview, []); + const issuance = useCall(isApiReady && api.query.balances?.totalIssuance, []); const [hasValues, setHasValues] = useState(false); useEffect((): void => { - setHasValues(!!fees || !!indexes || !!registrars || !!staking); + setHasValues(!!fees || !!indexes || !!issuance || !!registrars || !!staking); }, []); return ( diff --git a/packages/page-democracy/src/Overview/Referendum.tsx b/packages/page-democracy/src/Overview/Referendum.tsx index e420d152b2..6ccdda20b9 100644 --- a/packages/page-democracy/src/Overview/Referendum.tsx +++ b/packages/page-democracy/src/Overview/Referendum.tsx @@ -5,17 +5,18 @@ import { DerivedReferendum } from '@polkadot/api-derive/types'; import { BlockNumber } from '@polkadot/types/interfaces'; -import React from 'react'; +import React, { useMemo } from 'react'; import styled from 'styled-components'; -import { AddressMini, Button, Expander, LinkExternal } from '@polkadot/react-components'; +import { AddressMini, Badge, Button, Expander, Icon, LinkExternal } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { FormatBalance, BlockToTime } from '@polkadot/react-query'; -import { formatNumber } from '@polkadot/util'; +import { formatNumber, isBoolean } from '@polkadot/util'; import { useTranslation } from '../translate'; import PreImageButton from './PreImageButton'; import ProposalCell from './ProposalCell'; import Voting from './Voting'; +import useIsPassing from './useIsPassing'; import useVotes from './useVotes'; interface Props { @@ -27,7 +28,12 @@ function Referendum ({ className, value }: Props): React.ReactElement | n const { t } = useTranslation(); const { api } = useApi(); const bestNumber = useCall(api.derive.chain.bestNumber, []); + const isPassing = useIsPassing(value); const { allAye, allNay, voteCountAye, voteCountNay, votedAye, votedNay } = useVotes(value); + const threshold = useMemo( + () => value.status.threshold.type.toString().replace('majority', ' majority '), + [value] + ); if (!bestNumber || value.status.end.sub(bestNumber).lten(0)) { return null; @@ -76,6 +82,17 @@ function Referendum ({ className, value }: Props): React.ReactElement | n )} + + {isBoolean(isPassing) && ( + } + isInline + isTooltip + type={isPassing ? 'green' : 'brown'} + /> + )} + (api.query.balances.totalIssuance, []); + const [isPassing, setIsPassing] = useState(undefined); + + useEffect((): void => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const { tally, threshold } = (referendum.status as ReferendumStatus); + + if (totalIssuance && tally) { + const sqrtVoters = tally.turnout.toRed(BN.red('k256')).redSqrt().fromRed(); + const sqrtElectorate = totalIssuance.toRed(BN.red('k256')).redSqrt().fromRed(); + + setIsPassing( + sqrtVoters.isZero() + ? false + : threshold.isSimplemajority + ? tally.ayes.gt(tally.nays) + : threshold.isSupermajorityapproval + ? compareRationals(tally.nays, sqrtVoters, tally.ayes, sqrtElectorate) + : compareRationals(tally.nays, sqrtElectorate, tally.ayes, sqrtVoters) + ); + } + }, [referendum, totalIssuance]); + + return isPassing; +}