diff --git a/packages/page-accounts/src/modals/Transfer.tsx b/packages/page-accounts/src/modals/Transfer.tsx index 697d64e76d..c94ddf4576 100644 --- a/packages/page-accounts/src/modals/Transfer.tsx +++ b/packages/page-accounts/src/modals/Transfer.tsx @@ -12,7 +12,7 @@ import { checkAddress } from '@polkadot/phishing'; import { InputAddress, InputBalance, MarkError, MarkWarning, Modal, Toggle, TxButton } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { Available } from '@polkadot/react-query'; -import { BN_ZERO, isFunction } from '@polkadot/util'; +import { BN_HUNDRED, BN_ZERO, isFunction } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -65,7 +65,7 @@ function Transfer ({ className = '', onClose, recipientId: propRecipientId, send .transfer(toId, balances.availableBalance) .paymentInfo(fromId) .then(({ partialFee }): void => { - const adjFee = partialFee.muln(110).divn(100); + const adjFee = partialFee.muln(110).div(BN_HUNDRED); const maxTransfer = balances.availableBalance.sub(adjFee); setMaxTransfer( diff --git a/packages/page-bounties/src/BountyInfos.tsx b/packages/page-bounties/src/BountyInfos.tsx index f4686835f5..56b7664784 100644 --- a/packages/page-bounties/src/BountyInfos.tsx +++ b/packages/page-bounties/src/BountyInfos.tsx @@ -8,6 +8,7 @@ import BN from 'bn.js'; import React from 'react'; import { AddressSmall } from '@polkadot/react-components'; +import { BN_HUNDRED } from '@polkadot/util'; import VotingSummary from './Voting/VotingSummary'; import BountyInfo from './BountyInfo'; @@ -30,7 +31,7 @@ function BountyInfos ({ beneficiary, blocksUntilUpdate, proposals, status }: Pro const { bountyUpdatePeriod } = useBounties(); - const blocksPercentageLeftToShowWarning = bountyUpdatePeriod?.muln(BLOCKS_PERCENTAGE_LEFT_TO_SHOW_WARNING).divn(100); + const blocksPercentageLeftToShowWarning = bountyUpdatePeriod?.muln(BLOCKS_PERCENTAGE_LEFT_TO_SHOW_WARNING).div(BN_HUNDRED); const blocksToShowWarning = blocksPercentageLeftToShowWarning ?? BLOCKS_LEFT_TO_SHOW_WARNING; return ( diff --git a/packages/page-bounties/src/helpers/permillOf.ts b/packages/page-bounties/src/helpers/permillOf.ts index 8e5e276be2..ff1db95bf3 100644 --- a/packages/page-bounties/src/helpers/permillOf.ts +++ b/packages/page-bounties/src/helpers/permillOf.ts @@ -3,6 +3,8 @@ import BN from 'bn.js'; +import { BN_MILLION } from '@polkadot/util'; + export function permillOf (value: BN, perMill: BN): BN { - return value.mul(perMill).div(new BN(1_000_000)); + return value.mul(perMill).div(BN_MILLION); } diff --git a/packages/page-calendar/src/useScheduled.ts b/packages/page-calendar/src/useScheduled.ts index eccb8c13bb..b90d7a9d9c 100644 --- a/packages/page-calendar/src/useScheduled.ts +++ b/packages/page-calendar/src/useScheduled.ts @@ -81,7 +81,7 @@ function createDispatches (bestNumber: BlockNumber, blockTime: number, dispatche function createReferendums (bestNumber: BlockNumber, blockTime: number, referendums: DeriveReferendumExt[]): [EntryType, EntryInfo[]][] { return referendums.reduce((result: [EntryType, EntryInfo[]][], { index, status }): [EntryType, EntryInfo[]][] => { const enactBlocks = status.end.add(status.delay).sub(bestNumber); - const voteBlocks = status.end.sub(bestNumber).subn(1); + const voteBlocks = status.end.sub(bestNumber).isub(BN_ONE); result.push(['referendumVote', [{ ...newDate(voteBlocks, blockTime), @@ -110,7 +110,7 @@ function createStakingInfo (bestNumber: BlockNumber, blockTime: number, sessionI .filter(([, values]) => values.length) .map(([key]): EntryInfo => { const eraIndex = key.args[0]; - const blockProgress = sessionInfo.activeEra.sub(eraIndex).subn(1).mul(sessionInfo.eraLength).add(sessionInfo.eraProgress); + const blockProgress = sessionInfo.activeEra.sub(eraIndex).isub(BN_ONE).imul(sessionInfo.eraLength).iadd(sessionInfo.eraProgress); const blocks = slashDuration.sub(blockProgress); return { diff --git a/packages/page-contracts/src/Contracts/Call.tsx b/packages/page-contracts/src/Contracts/Call.tsx index 02644f4bb4..e6a5ec36ca 100644 --- a/packages/page-contracts/src/Contracts/Call.tsx +++ b/packages/page-contracts/src/Contracts/Call.tsx @@ -13,7 +13,7 @@ import { ContractPromise } from '@polkadot/api-contract'; import { Button, Dropdown, Expander, InputAddress, InputBalance, Modal, Toggle, TxButton } from '@polkadot/react-components'; import { useAccountId, useDebounce, useFormField, useToggle } from '@polkadot/react-hooks'; import { Available } from '@polkadot/react-query'; -import { BN_ZERO } from '@polkadot/util'; +import { BN_ONE, BN_ZERO } from '@polkadot/util'; import { InputMegaGas, Params } from '../shared'; import { useTranslation } from '../translate'; @@ -30,7 +30,7 @@ interface Props { onClose: () => void; } -const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).subn(1); +const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).isub(BN_ONE); function Call ({ className = '', contract, messageIndex, onCallResult, onChangeMessage, onClose }: Props): React.ReactElement | null { const { t } = useTranslation(); diff --git a/packages/page-contracts/src/shared/InputMegaGas.tsx b/packages/page-contracts/src/shared/InputMegaGas.tsx index 318d916cd0..a5059c2c86 100644 --- a/packages/page-contracts/src/shared/InputMegaGas.tsx +++ b/packages/page-contracts/src/shared/InputMegaGas.tsx @@ -8,7 +8,7 @@ import React, { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { InputNumber, Toggle } from '@polkadot/react-components'; -import { BN_ZERO } from '@polkadot/util'; +import { BN_MILLION, BN_ONE, BN_ZERO } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -20,15 +20,13 @@ interface Props { weight: UseWeight; } -const MEGA = new BN(1_000_000); - function InputMegaGas ({ className, estimatedWeight, help, isCall, weight: { executionTime, isValid, megaGas, percentage, setIsEmpty, setMegaGas } }: Props): React.ReactElement { const { t } = useTranslation(); const [withEstimate, setWithEstimate] = useState(true); const estimatedMg = useMemo( () => estimatedWeight - ? estimatedWeight.div(MEGA).iaddn(1) + ? estimatedWeight.div(BN_MILLION).iadd(BN_ONE) : null, [estimatedWeight] ); diff --git a/packages/page-contracts/src/useWeight.ts b/packages/page-contracts/src/useWeight.ts index b07a62a93f..e4637f4895 100644 --- a/packages/page-contracts/src/useWeight.ts +++ b/packages/page-contracts/src/useWeight.ts @@ -8,9 +8,7 @@ import BN from 'bn.js'; import { useCallback, useMemo, useState } from 'react'; import { useApi, useBlockTime } from '@polkadot/react-hooks'; -import { BN_TEN, BN_ZERO } from '@polkadot/util'; - -const BN_MILLION = new BN(1_000_000); +import { BN_MILLION, BN_TEN, BN_ZERO } from '@polkadot/util'; export default function useWeight (): UseWeight { const { api } = useApi(); diff --git a/packages/page-democracy/src/Overview/Referendum.tsx b/packages/page-democracy/src/Overview/Referendum.tsx index e04e57ed17..a173560d0c 100644 --- a/packages/page-democracy/src/Overview/Referendum.tsx +++ b/packages/page-democracy/src/Overview/Referendum.tsx @@ -11,7 +11,7 @@ import styled from 'styled-components'; import { Badge, Button, Icon, LinkExternal } from '@polkadot/react-components'; import { useAccounts, useApi, useCall } from '@polkadot/react-hooks'; import { BlockToTime } from '@polkadot/react-query'; -import { formatNumber, isBoolean } from '@polkadot/util'; +import { BN_ONE, formatNumber, isBoolean } from '@polkadot/util'; import { useTranslation } from '../translate'; import useChangeCalc from '../useChangeCalc'; @@ -82,7 +82,7 @@ function Referendum ({ className = '', value: { allAye, allNay, image, imageHash } const enactBlock = status.end.add(status.delay); - const remainBlock = status.end.sub(bestNumber).subn(1); + const remainBlock = status.end.sub(bestNumber).isub(BN_ONE); return ( diff --git a/packages/page-democracy/src/Overview/ReferendumVotes.tsx b/packages/page-democracy/src/Overview/ReferendumVotes.tsx index 86ff555159..17f24133a1 100644 --- a/packages/page-democracy/src/Overview/ReferendumVotes.tsx +++ b/packages/page-democracy/src/Overview/ReferendumVotes.tsx @@ -8,7 +8,7 @@ import React, { useMemo } from 'react'; import { Expander } from '@polkadot/react-components'; import { FormatBalance } from '@polkadot/react-query'; -import { formatNumber } from '@polkadot/util'; +import { BN_TEN, formatNumber } from '@polkadot/util'; import { useTranslation } from '../translate'; import ReferendumVote from './ReferendumVote'; @@ -30,8 +30,8 @@ function ReferendumVotes ({ change, className, count, isAye, isWinning, total, v const sorted = useMemo( () => votes.sort((a, b) => { - const ta = a.balance.muln(LOCKS[a.vote.conviction.toNumber()]).divn(10); - const tb = b.balance.muln(LOCKS[b.vote.conviction.toNumber()]).divn(10); + const ta = a.balance.muln(LOCKS[a.vote.conviction.toNumber()]).div(BN_TEN); + const tb = b.balance.muln(LOCKS[b.vote.conviction.toNumber()]).div(BN_TEN); return tb.cmp(ta); }), diff --git a/packages/page-democracy/src/Overview/Summary.tsx b/packages/page-democracy/src/Overview/Summary.tsx index 7458eb1334..7ddab1eaac 100644 --- a/packages/page-democracy/src/Overview/Summary.tsx +++ b/packages/page-democracy/src/Overview/Summary.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { CardSummary, SummaryBox } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; -import { formatNumber } from '@polkadot/util'; +import { BN_ONE, formatNumber } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -46,7 +46,7 @@ function Summary ({ referendumCount }: Props): React.ReactElement { label={t('launch period')} progress={{ total: api.consts.democracy.launchPeriod, - value: bestNumber.mod(api.consts.democracy.launchPeriod).addn(1), + value: bestNumber.mod(api.consts.democracy.launchPeriod).iadd(BN_ONE), withTime: true }} /> diff --git a/packages/page-explorer/src/SummarySession.tsx b/packages/page-explorer/src/SummarySession.tsx index 83b5cbd14d..a753e8ad1e 100644 --- a/packages/page-explorer/src/SummarySession.tsx +++ b/packages/page-explorer/src/SummarySession.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { CardSummary } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { Elapsed } from '@polkadot/react-query'; -import { formatNumber } from '@polkadot/util'; +import { BN_ONE, formatNumber } from '@polkadot/util'; import { useTranslation } from './translate'; @@ -36,7 +36,7 @@ function SummarySession ({ className, withEra = true, withSession = true }: Prop {sessionInfo && ( <> {withSession && ( - sessionInfo.sessionLength.gtn(1) + sessionInfo.sessionLength.gt(BN_ONE) ? ( bestNumber && ( lastRelayNumber - ? bestNumber.sub(lastRelayNumber).subn(1) + ? bestNumber.sub(lastRelayNumber).isub(BN_ONE) : paraInfo.watermark ? bestNumber.sub(paraInfo.watermark) : undefined diff --git a/packages/page-parachains/src/modals/Propose.tsx b/packages/page-parachains/src/modals/Propose.tsx index c2868aadb6..749caa1bc2 100644 --- a/packages/page-parachains/src/modals/Propose.tsx +++ b/packages/page-parachains/src/modals/Propose.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useState } from 'react'; import { Button, Input, InputAddress, InputBalance, InputFile, InputNumber, InputWasm, MarkWarning, Modal, TxButton } from '@polkadot/react-components'; import { useApi } from '@polkadot/react-hooks'; -import { BN_TEN, compactAddLength } from '@polkadot/util'; +import { BN_TEN, BN_THOUSAND, compactAddLength } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -50,7 +50,7 @@ function Propose ({ className, onClose }: Props): React.ReactElement { const [accountId, setAccountId] = useState(null); const [name, setName] = useState(''); const [paraId, setParaId] = useState(() => new BN(Date.now() % 131072)); - const [balance, setBalance] = useState(() => new BN(1000).mul(BN_TEN.pow(new BN(api.registry.chainDecimals[0])))); + const [balance, setBalance] = useState(() => BN_THOUSAND.mul(BN_TEN.pow(new BN(api.registry.chainDecimals[0])))); const [validators, setValidators] = useState(['']); const [{ isWasmValid, wasm }, setWasm] = useState({ isWasmValid: false, wasm: null }); const [genesisState, setGenesisState] = useState(null); diff --git a/packages/page-poll/src/index.tsx b/packages/page-poll/src/index.tsx index 3932bb2c5d..d43bb2e26a 100644 --- a/packages/page-poll/src/index.tsx +++ b/packages/page-poll/src/index.tsx @@ -13,7 +13,7 @@ import styled from 'styled-components'; import { Button, Columar, InputAddress, Progress, Spinner, Tabs, Toggle, TxButton } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { BlockToTime, FormatBalance } from '@polkadot/react-query'; -import { BN_ONE, BN_ZERO, bnMax, formatBalance, formatNumber } from '@polkadot/util'; +import { BN_MILLION, BN_ONE, BN_ZERO, bnMax, formatBalance, formatNumber } from '@polkadot/util'; import { useTranslation } from './translate'; @@ -27,8 +27,6 @@ interface Turnout { voted: BN; } -const DIV = new BN(1_000_000); - function PollApp ({ basePath, className }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); @@ -53,7 +51,7 @@ function PollApp ({ basePath, className }: Props): React.ReactElement { if (totalIssuance && totals) { const max = bnMax(BN_ONE, ...totals); - setProgress(totals.map((total) => total.mul(DIV).div(max))); + setProgress(totals.map((total) => total.mul(BN_MILLION).div(max))); api.query.poll.voteOf .entries>() diff --git a/packages/page-staking/src/Actions/Account/InputValidationUnstakeThreshold.tsx b/packages/page-staking/src/Actions/Account/InputValidationUnstakeThreshold.tsx index 34f4fa5a23..50aa1509f0 100644 --- a/packages/page-staking/src/Actions/Account/InputValidationUnstakeThreshold.tsx +++ b/packages/page-staking/src/Actions/Account/InputValidationUnstakeThreshold.tsx @@ -5,6 +5,7 @@ import BN from 'bn.js'; import React, { useEffect, useState } from 'react'; import { MarkWarning } from '@polkadot/react-components'; +import { BN_TEN } from '@polkadot/util'; import { useTranslation } from '../../translate'; @@ -23,7 +24,7 @@ function InputValidationUnstakeThreshold ({ onError, unstakeThreshold }: Props): if (unstakeThreshold.ltn(0)) { newError = t('The Threshold must be a positive number'); - } else if (unstakeThreshold.gtn(10)) { + } else if (unstakeThreshold.gt(BN_TEN)) { newError = t('The Threshold must lower than 11'); } diff --git a/packages/page-staking/src/Payouts/useStakerPayouts.ts b/packages/page-staking/src/Payouts/useStakerPayouts.ts index 25ca435e0d..b8bed6187a 100644 --- a/packages/page-staking/src/Payouts/useStakerPayouts.ts +++ b/packages/page-staking/src/Payouts/useStakerPayouts.ts @@ -8,7 +8,7 @@ import BN from 'bn.js'; import { useMemo } from 'react'; import { useApi, useCall } from '@polkadot/react-hooks'; -import { isFunction } from '@polkadot/util'; +import { BN_BILLION, BN_ZERO, isFunction } from '@polkadot/util'; export default function useStakerPayouts (): BN { const { api } = useApi(); @@ -17,8 +17,8 @@ export default function useStakerPayouts (): BN { return useMemo( () => (migrateEraOpt && migrateEraOpt.isSome && migrateEraOpt.unwrap()) || ( isFunction(api.tx.staking.payoutStakers) - ? new BN(0) - : new BN(1_000_000_000) + ? BN_ZERO + : BN_BILLION ), [api, migrateEraOpt] ); diff --git a/packages/page-staking/src/Payouts/util.tsx b/packages/page-staking/src/Payouts/util.tsx index df41060ad4..57555a8768 100644 --- a/packages/page-staking/src/Payouts/util.tsx +++ b/packages/page-staking/src/Payouts/util.tsx @@ -4,7 +4,7 @@ import BN from 'bn.js'; import React from 'react'; -import { formatNumber } from '@polkadot/util'; +import { BN_ONE, formatNumber } from '@polkadot/util'; function isSingle (entry: BN | [BN, BN]): entry is BN { return !Array.isArray(entry); @@ -24,13 +24,13 @@ export function createErasString (eras: BN[]): React.ReactNode { const last = result[result.length - 1]; if (isSingle(last)) { - if (last.addn(1).eq(era)) { + if (last.add(BN_ONE).eq(era)) { result[result.length - 1] = [last, era]; } else { result.push(era); } } else { - if (last[1].addn(1).eq(era)) { + if (last[1].add(BN_ONE).eq(era)) { last[1] = era; } else { result.push(era); diff --git a/packages/page-staking/src/Query/ChartPrefs.tsx b/packages/page-staking/src/Query/ChartPrefs.tsx index 41a2fd8c80..e9e8dbf63b 100644 --- a/packages/page-staking/src/Query/ChartPrefs.tsx +++ b/packages/page-staking/src/Query/ChartPrefs.tsx @@ -9,11 +9,11 @@ import React, { useMemo, useRef } from 'react'; import { Chart, Spinner } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; +import { BN_BILLION } from '@polkadot/util'; import { useTranslation } from '../translate'; const MULT = new BN(100 * 100); -const BILLION = new BN(1_000_000_000); const COLORS_POINTS = [undefined, '#acacac']; function extractPrefs (prefs: DeriveStakerPrefs[] = []): ChartInfo { @@ -24,7 +24,7 @@ function extractPrefs (prefs: DeriveStakerPrefs[] = []): ChartInfo { let total = 0; prefs.forEach(({ era, validatorPrefs }): void => { - const comm = validatorPrefs.commission.unwrap().mul(MULT).div(BILLION).toNumber() / 100; + const comm = validatorPrefs.commission.unwrap().mul(MULT).div(BN_BILLION).toNumber() / 100; total += comm; labels.push(era.toHuman()); diff --git a/packages/page-staking/src/Query/useBlockCounts.tsx b/packages/page-staking/src/Query/useBlockCounts.tsx index 8bd5688cda..ce8de7e528 100644 --- a/packages/page-staking/src/Query/useBlockCounts.tsx +++ b/packages/page-staking/src/Query/useBlockCounts.tsx @@ -8,7 +8,7 @@ import type { SessionRewards } from '../types'; import { useEffect, useState } from 'react'; import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; -import { isFunction } from '@polkadot/util'; +import { BN_ONE, BN_ZERO, isFunction } from '@polkadot/util'; export default function useBlockCounts (accountId: string, sessionRewards: SessionRewards[]): u32[] { const { api } = useApi(); @@ -20,12 +20,12 @@ export default function useBlockCounts (accountId: string, sessionRewards: Sessi useEffect((): void => { if (isFunction(api.query.imOnline?.authoredBlocks) && sessionRewards && sessionRewards.length) { - const filtered = sessionRewards.filter(({ sessionIndex }): boolean => sessionIndex.gtn(0)); + const filtered = sessionRewards.filter(({ sessionIndex }): boolean => sessionIndex.gt(BN_ZERO)); if (filtered.length) { Promise .all(filtered.map(({ parentHash, sessionIndex }): Promise => - api.query.imOnline.authoredBlocks.at(parentHash, sessionIndex.subn(1), accountId) + api.query.imOnline.authoredBlocks.at(parentHash, sessionIndex.sub(BN_ONE), accountId) )) .then((historic): void => { mountedRef.current && setHistoric(historic); diff --git a/packages/page-staking/src/Query/util.ts b/packages/page-staking/src/Query/util.ts index 9a2aeb00cd..8d81d40b33 100644 --- a/packages/page-staking/src/Query/util.ts +++ b/packages/page-staking/src/Query/util.ts @@ -3,7 +3,7 @@ import BN from 'bn.js'; -import { BN_ZERO, isBn, isFunction } from '@polkadot/util'; +import { BN_THOUSAND, BN_ZERO, isBn, isFunction } from '@polkadot/util'; interface ToBN { toBn: () => BN; @@ -16,5 +16,5 @@ export function balanceToNumber (amount: BN | ToBN = BN_ZERO, divisor: BN): numb ? amount.toBn() : BN_ZERO; - return value.muln(1000).div(divisor).toNumber() / 1000; + return value.mul(BN_THOUSAND).div(divisor).toNumber() / 1000; } diff --git a/packages/page-staking/src/Slashes/Summary.tsx b/packages/page-staking/src/Slashes/Summary.tsx index fe5b9b53e3..fbb44c1e86 100644 --- a/packages/page-staking/src/Slashes/Summary.tsx +++ b/packages/page-staking/src/Slashes/Summary.tsx @@ -10,7 +10,7 @@ import React, { useMemo } from 'react'; import { CardSummary, SummaryBox } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; -import { formatNumber } from '@polkadot/util'; +import { BN_ONE, formatNumber } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -26,7 +26,7 @@ function Header ({ slash: { era, nominators, reporters, total, validators } }: P const [blockProgress, blockEnd] = useMemo( () => sessionInfo ? [ - sessionInfo.activeEra.sub(era).subn(1).mul(sessionInfo.eraLength).add(sessionInfo.eraProgress), + sessionInfo.activeEra.sub(era).isub(BN_ONE).imul(sessionInfo.eraLength).iadd(sessionInfo.eraProgress), api.consts.staking.slashDeferDuration.mul(sessionInfo.eraLength) ] : [new BN(0), new BN(0)], diff --git a/packages/page-staking/src/Targets/Summary.tsx b/packages/page-staking/src/Targets/Summary.tsx index e283287f9c..b237c8d959 100644 --- a/packages/page-staking/src/Targets/Summary.tsx +++ b/packages/page-staking/src/Targets/Summary.tsx @@ -11,6 +11,7 @@ import React, { useMemo } from 'react'; import { CardSummary, SummaryBox } from '@polkadot/react-components'; import { useApi, useCall } from '@polkadot/react-hooks'; import { FormatBalance } from '@polkadot/react-query'; +import { BN_ONE, BN_ZERO } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -29,7 +30,7 @@ const transformReward = { }; const transformEra = { - transform: ({ activeEra }: DeriveSessionIndexes) => activeEra.gtn(0) ? activeEra.subn(1) : undefined + transform: ({ activeEra }: DeriveSessionIndexes) => activeEra.gt(BN_ZERO) ? activeEra.sub(BN_ONE) : undefined }; function Summary ({ avgStaked, lowStaked, numNominators, numValidators, stakedReturn, totalIssuance, totalStaked }: Props): React.ReactElement { diff --git a/packages/page-staking/src/Targets/index.tsx b/packages/page-staking/src/Targets/index.tsx index 0832815a25..f8f0b2e439 100644 --- a/packages/page-staking/src/Targets/index.tsx +++ b/packages/page-staking/src/Targets/index.tsx @@ -11,6 +11,7 @@ import styled from 'styled-components'; import { Button, Icon, Table, Toggle } from '@polkadot/react-components'; import { useApi, useAvailableSlashes, useBlocksPerDays, useSavedFlags } from '@polkadot/react-hooks'; +import { BN_HUNDRED } from '@polkadot/util'; import { MAX_NOMINATIONS } from '../constants'; import ElectionBanner from '../ElectionBanner'; @@ -95,7 +96,7 @@ function applyFilter (validators: ValidatorInfo[], medianComm: number, allIdenti ? (commissionPer < MAX_COMM_PERCENT) : (!medianComm || (commissionPer <= medianComm))) ) && - (!withoutOver || !maxPaid || maxPaid.muln(MAX_CAP_PERCENT).divn(100).gten(nomCount)) + (!withoutOver || !maxPaid || maxPaid.muln(MAX_CAP_PERCENT).div(BN_HUNDRED).gten(nomCount)) ) { if (!withGroup) { return true; diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index e73a644737..fa440f03bd 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -9,7 +9,7 @@ import BN from 'bn.js'; import { useMemo } from 'react'; import { calcInflation, useAccounts, useApi, useCall } from '@polkadot/react-hooks'; -import { arrayFlatten, BN_ONE, BN_ZERO } from '@polkadot/util'; +import { arrayFlatten, BN_MILLION, BN_ONE, BN_ZERO } from '@polkadot/util'; interface LastEra { activeEra: BN; @@ -82,7 +82,7 @@ function sortValidators (list: ValidatorInfo[]): ValidatorInfo[] { function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], { activeEra, eraLength, lastEra, sessionLength }: LastEra, historyDepth?: BN): [ValidatorInfo[], string[]] { const nominators: Record = {}; const emptyExposure = api.createType('Exposure'); - const earliestEra = historyDepth && lastEra.sub(historyDepth).addn(1); + const earliestEra = historyDepth && lastEra.sub(historyDepth).iadd(BN_ONE); const list = derive.info.map(({ accountId, exposure = emptyExposure, stakingLedger, validatorPrefs }): ValidatorInfo => { // some overrides (e.g. Darwinia Crab) does not have the own/total field in Exposure let [bondOwn, bondTotal] = exposure.total @@ -172,7 +172,7 @@ function extractInfo (api: ApiPromise, allAccounts: string[], electedDerive: Der // add the explicit stakedReturn !avgStaked.isZero() && elected.forEach((e): void => { if (!e.skipRewards) { - e.stakedReturn = inflation.stakedReturn * avgStaked.muln(1_000_000).div(e.bondTotal).toNumber() / 1_000_000; + e.stakedReturn = inflation.stakedReturn * avgStaked.mul(BN_MILLION).div(e.bondTotal).toNumber() / BN_MILLION.toNumber(); e.stakedReturnCmp = e.stakedReturn * (100 - e.commissionPer) / 100; } }); diff --git a/packages/page-treasury/src/Overview/ProposalCreate.tsx b/packages/page-treasury/src/Overview/ProposalCreate.tsx index 6f12b7d708..4a1b398d3a 100644 --- a/packages/page-treasury/src/Overview/ProposalCreate.tsx +++ b/packages/page-treasury/src/Overview/ProposalCreate.tsx @@ -6,6 +6,7 @@ import React, { useMemo, useState } from 'react'; import { Button, InputAddress, InputBalance, MarkWarning, Modal, Static, TxButton } from '@polkadot/react-components'; import { useApi, useToggle } from '@polkadot/react-hooks'; +import { BN_HUNDRED, BN_MILLION } from '@polkadot/util'; import { useTranslation } from '../translate'; @@ -23,7 +24,7 @@ function Propose ({ className }: Props): React.ReactElement | null { const hasValue = value?.gtn(0); const bondPercentage = useMemo( - () => `${api.consts.treasury.proposalBond.muln(100).divn(1_000_000).toNumber().toFixed(2)}%`, + () => `${api.consts.treasury.proposalBond.mul(BN_HUNDRED).div(BN_MILLION).toNumber().toFixed(2)}%`, [api] ); diff --git a/packages/react-components/src/CardSummary.tsx b/packages/react-components/src/CardSummary.tsx index 2b7bde00b9..a6e99bff60 100644 --- a/packages/react-components/src/CardSummary.tsx +++ b/packages/react-components/src/CardSummary.tsx @@ -9,7 +9,7 @@ import React from 'react'; import styled from 'styled-components'; import { BlockToTime } from '@polkadot/react-query'; -import { formatNumber, isUndefined } from '@polkadot/util'; +import { BN_HUNDRED, formatNumber, isUndefined } from '@polkadot/util'; import Labelled from './Labelled'; import Progress from './Progress'; @@ -43,7 +43,7 @@ function CardSummary ({ children, className = '', help, label, progress }: Props }` : ( progress.isPercent - ? value.muln(100).div(total).toString() + ? value.mul(BN_HUNDRED).div(total).toString() : formatNumber(value) ) ) diff --git a/packages/react-components/src/ConvictionDropdown.tsx b/packages/react-components/src/ConvictionDropdown.tsx index fbabfba51a..3f317c3277 100644 --- a/packages/react-components/src/ConvictionDropdown.tsx +++ b/packages/react-components/src/ConvictionDropdown.tsx @@ -8,6 +8,7 @@ import React, { useRef } from 'react'; import { ApiPromise } from '@polkadot/api'; import { useApi, useBlockTime } from '@polkadot/react-hooks'; +import { BN_THOUSAND } from '@polkadot/util'; import Dropdown from './Dropdown'; import { useTranslation } from './translate'; @@ -30,7 +31,7 @@ function createOptions (api: ApiPromise, t: TFunction, blockTime: number): { tex text: t('{{value}}x voting balance, locked for {{lock}}x enactment ({{period}} days)', { replace: { lock, - period: (bnLock.mul(api.consts.democracy.enactmentPeriod.muln(blockTime).divn(1000)).toNumber() / SEC_DAY).toFixed(2), + period: (bnLock.mul(api.consts.democracy.enactmentPeriod.muln(blockTime).div(BN_THOUSAND)).toNumber() / SEC_DAY).toFixed(2), value } }), diff --git a/packages/react-components/src/InputNumber.tsx b/packages/react-components/src/InputNumber.tsx index 8c07ddd0c1..8b8d4ddb9b 100644 --- a/packages/react-components/src/InputNumber.tsx +++ b/packages/react-components/src/InputNumber.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import styled from 'styled-components'; import { useApi } from '@polkadot/react-hooks'; -import { BN_TEN, BN_ZERO, formatBalance, isBn } from '@polkadot/util'; +import { BN_ONE, BN_TEN, BN_TWO, BN_ZERO, formatBalance, isBn } from '@polkadot/util'; import { BitLengthOption } from './constants'; import Dropdown from './Dropdown'; @@ -56,7 +56,7 @@ export class TokenUnit { } function getGlobalMaxValue (bitLength?: number): BN { - return new BN(2).pow(new BN(bitLength || DEFAULT_BITLENGTH)).subn(1); + return BN_TWO.pow(new BN(bitLength || DEFAULT_BITLENGTH)).isub(BN_ONE); } function getRegex (isDecimal: boolean): RegExp { diff --git a/packages/react-hooks/src/useAvailableSlashes.ts b/packages/react-hooks/src/useAvailableSlashes.ts index d4000cd065..e95b7cee09 100644 --- a/packages/react-hooks/src/useAvailableSlashes.ts +++ b/packages/react-hooks/src/useAvailableSlashes.ts @@ -9,6 +9,7 @@ import BN from 'bn.js'; import { useEffect, useState } from 'react'; import { useApi, useCall, useIsMountedRef } from '@polkadot/react-hooks'; +import { BN_ONE } from '@polkadot/util'; type Unsub = () => void; @@ -30,7 +31,7 @@ export function useAvailableSlashes (): [BN, UnappliedSlash[]][] { // any <= activeEra (we include activeEra since slashes are immediately reflected) while (start.lte(indexes.activeEra)) { range.push(start); - start = start.addn(1); + start = start.iadd(BN_ONE); } if (range.length) { diff --git a/packages/react-hooks/src/useInflation.ts b/packages/react-hooks/src/useInflation.ts index 0a1092c260..adeeb90220 100644 --- a/packages/react-hooks/src/useInflation.ts +++ b/packages/react-hooks/src/useInflation.ts @@ -8,13 +8,14 @@ import BN from 'bn.js'; import { useEffect, useState } from 'react'; import { getInflationParams } from '@polkadot/apps-config'; +import { BN_MILLION } from '@polkadot/util'; import { useApi } from './useApi'; import { useCall } from './useCall'; export function calcInflation (api: ApiPromise, totalStaked: BN, totalIssuance: BN): Inflation { const { falloff, idealStake, maxInflation, minInflation } = getInflationParams(api); - const stakedFraction = totalStaked.muln(1_000_000).div(totalIssuance).toNumber() / 1_000_000; + const stakedFraction = totalStaked.mul(BN_MILLION).div(totalIssuance).toNumber() / BN_MILLION.toNumber(); const idealInterest = maxInflation / idealStake; const inflation = 100 * (minInflation + ( stakedFraction <= idealStake diff --git a/packages/react-hooks/src/useTreasury.ts b/packages/react-hooks/src/useTreasury.ts index 644853b203..7e33ffa9ca 100644 --- a/packages/react-hooks/src/useTreasury.ts +++ b/packages/react-hooks/src/useTreasury.ts @@ -9,9 +9,8 @@ import { useEffect, useState } from 'react'; import { DeriveBalancesAccount } from '@polkadot/api-derive/types'; import { useApi } from '@polkadot/react-hooks/useApi'; import { useCall } from '@polkadot/react-hooks/useCall'; -import { BN_ZERO, stringToU8a } from '@polkadot/util'; +import { BN_MILLION, BN_ZERO, stringToU8a } from '@polkadot/util'; -const PM_DIV = new BN(1000000); const TREASURY_ACCOUNT = stringToU8a('modlpy/trsry'.padEnd(32, '\0')); interface Treasury { @@ -38,7 +37,7 @@ export function useTreasury (): Treasury { ? treasuryBalance.freeBalance : undefined); setBurn(treasuryBalance?.freeBalance.gtn(0) && !api.consts.treasury.burn.isZero() - ? api.consts.treasury.burn.mul(treasuryBalance?.freeBalance).div(PM_DIV) + ? api.consts.treasury.burn.mul(treasuryBalance.freeBalance).div(BN_MILLION) : BN_ZERO); }, [api, treasuryBalance, spendPeriod]);