diff --git a/packages/apps-routing/src/assets.ts b/packages/apps-routing/src/assets.ts index c85868ca09..a80edd7a15 100644 --- a/packages/apps-routing/src/assets.ts +++ b/packages/apps-routing/src/assets.ts @@ -11,7 +11,8 @@ export default function create (t: TFunction): Route { Component, display: { needsApi: [ - 'tx.assets.setMetadata' + 'tx.assets.setMetadata', + 'tx.assets.transferKeepAlive' ] }, group: 'network', diff --git a/packages/page-democracy/src/Overview/External.tsx b/packages/page-democracy/src/Overview/External.tsx index ab349d5e16..a08a8efdb4 100644 --- a/packages/page-democracy/src/Overview/External.tsx +++ b/packages/page-democracy/src/Overview/External.tsx @@ -6,6 +6,7 @@ import type { DeriveProposalExternal } from '@polkadot/api-derive/types'; import React from 'react'; import { AddressMini, Button } from '@polkadot/react-components'; +import { useMembers } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; import Fasttrack from './Fasttrack'; @@ -18,6 +19,8 @@ interface Props { } function External ({ className = '', value: { image, imageHash, threshold } }: Props): React.ReactElement | null { + const { isMember, members } = useMembers('technicalCommittee'); + return ( )} - {threshold && ( + {threshold && isMember && ( )} diff --git a/packages/page-democracy/src/Overview/Fasttrack.tsx b/packages/page-democracy/src/Overview/Fasttrack.tsx index 410af74c8b..63ff2f5b7a 100644 --- a/packages/page-democracy/src/Overview/Fasttrack.tsx +++ b/packages/page-democracy/src/Overview/Fasttrack.tsx @@ -8,12 +8,13 @@ import BN from 'bn.js'; import React, { useEffect, useMemo, useState } from 'react'; import { Button, Input, InputAddress, InputNumber, Modal, TxButton } from '@polkadot/react-components'; -import { useApi, useMembers, useToggle } from '@polkadot/react-hooks'; +import { useApi, useToggle } from '@polkadot/react-hooks'; import { useTranslation } from '../translate'; interface Props { imageHash: Hash; + members: string[]; threshold: VoteThreshold; } @@ -26,32 +27,34 @@ const ONE_MIN = (1 * 60) / 6; const DEF_DELAY = new BN(ONE_MIN); const DEF_VOTING = new BN(ONE_MIN * 60 * 3); -function Fasttrack ({ imageHash, threshold }: Props): React.ReactElement | null { +function Fasttrack ({ imageHash, members, threshold }: Props): React.ReactElement | null { const { t } = useTranslation(); const { api } = useApi(); - const { isMember, members } = useMembers('technicalCommittee'); const [isFasttrackOpen, toggleFasttrack] = useToggle(); - const [allowFast, setAllowFast] = useState(false); const [accountId, setAcountId] = useState(null); const [delayBlocks, setDelayBlocks] = useState(DEF_DELAY); - const [votingBlocks, setVotingBlocks] = useState(DEF_VOTING); - const [{ proposal, proposalLength }, setProposal] = useState({ proposalLength: 0 }); + const [votingBlocks, setVotingBlocks] = useState(api.consts.democracy.fastTrackVotingPeriod || DEF_VOTING); + const [{ proposal, proposalLength }, setProposal] = useState(() => ({ proposalLength: 0 })); + const memberThreshold = useMemo( - () => Math.ceil(members.length * 0.66), - [members] + () => new BN( + !votingBlocks || api.consts.democracy.fastTrackVotingPeriod.lte(votingBlocks) + ? Math.ceil(members.length * 0.66) + : members.length + ), + [api, members, votingBlocks] ); useEffect((): void => { - setAllowFast(isMember && threshold.isSimplemajority); - }, [isMember, threshold]); - - useEffect((): void => { - const proposal = delayBlocks && delayBlocks.gtn(0) && votingBlocks && votingBlocks.gtn(0) + const proposal = delayBlocks && !delayBlocks.isZero() && votingBlocks && !votingBlocks.isZero() ? api.tx.democracy.fastTrack(imageHash, votingBlocks, delayBlocks) : null; - setProposal({ proposal, proposalLength: proposal?.length || 0 }); - }, [api, delayBlocks, imageHash, votingBlocks]); + setProposal({ + proposal, + proposalLength: proposal?.length || 0 + }); + }, [api, delayBlocks, imageHash, members, votingBlocks]); return ( <> @@ -78,22 +81,29 @@ function Fasttrack ({ imageHash, threshold }: Props): React.ReactElement ('The voting period to apply in blocks')} + isZeroable={false} label={t('voting period')} onChange={setVotingBlocks} value={votingBlocks} /> ('The delay period to apply in blocks')} + isZeroable={false} label={t('delay')} onChange={setDelayBlocks} value={delayBlocks} /> + ('threshold')} + /> ('Fast track')} onStart={toggleFasttrack} params={ @@ -108,7 +118,7 @@ function Fasttrack ({ imageHash, threshold }: Props): React.ReactElement )}