From 3519f22d3709f1b443b73f34203e6dca2dcaa249 Mon Sep 17 00:00:00 2001 From: Jaco Date: Thu, 17 Mar 2022 13:05:55 +0100 Subject: [PATCH] Minor parachain option renames (& opts) (#7177) --- .../src/Overview/LeaseBlocks.tsx | 16 ++++--- .../src/Overview/ParachainInfo.tsx | 15 ++----- .../page-parachains/src/Overview/Periods.tsx | 42 ++++++++++--------- .../src/Overview/useChainDetails.ts | 27 ++++++++++++ .../src/Overview/useParaInfo.ts | 4 +- .../src/Parathreads/Actions.tsx | 4 +- .../src/Parathreads/useThreadInfo.ts | 4 +- .../page-parachains/src/useActionsQueue.ts | 4 +- .../page-parachains/src/useAuctionInfo.tsx | 4 +- packages/page-parachains/src/useFunds.ts | 8 ++-- packages/page-parachains/src/useOwnedIds.ts | 8 ++-- packages/page-parachains/src/useProposals.ts | 12 +++--- .../page-parachains/src/useUpcomingIds.ts | 4 +- 13 files changed, 90 insertions(+), 62 deletions(-) create mode 100644 packages/page-parachains/src/Overview/useChainDetails.ts diff --git a/packages/page-parachains/src/Overview/LeaseBlocks.tsx b/packages/page-parachains/src/Overview/LeaseBlocks.tsx index 99318a5dea..5a83572710 100644 --- a/packages/page-parachains/src/Overview/LeaseBlocks.tsx +++ b/packages/page-parachains/src/Overview/LeaseBlocks.tsx @@ -16,17 +16,21 @@ interface Props { value?: number | BN | null; } +function calcBlocks (leasePeriod?: LeasePeriod | null, value?: number | BN | null): BN | null | undefined | 0 { + return leasePeriod && value && + bnToBn(value) + .sub(BN_ONE) + .imul(leasePeriod.length) + .iadd(leasePeriod.remainder); +} + function LeaseBlocks ({ children, className, leasePeriod, value }: Props): React.ReactElement | null { const blocks = useMemo( - () => leasePeriod && value && - bnToBn(value) - .sub(BN_ONE) - .imul(leasePeriod.length) - .iadd(leasePeriod.remainder), + () => calcBlocks(leasePeriod, value), [leasePeriod, value] ); - if (!leasePeriod || !blocks) { + if (!blocks) { return null; } diff --git a/packages/page-parachains/src/Overview/ParachainInfo.tsx b/packages/page-parachains/src/Overview/ParachainInfo.tsx index 9b6ffcac9b..67ebd6826e 100644 --- a/packages/page-parachains/src/Overview/ParachainInfo.tsx +++ b/packages/page-parachains/src/Overview/ParachainInfo.tsx @@ -1,29 +1,22 @@ // Copyright 2017-2022 @polkadot/app-parachains authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { BlockNumber, Header, ParaId, RuntimeVersion } from '@polkadot/types/interfaces'; +import type { ParaId } from '@polkadot/types/interfaces'; import React from 'react'; import styled from 'styled-components'; -import { useCall, useParaApi } from '@polkadot/react-hooks'; import { formatNumber } from '@polkadot/util'; +import useChainDetails from './useChainDetails'; + interface Props { className?: string; id: ParaId; } -const transformHeader = { - transform: (header: Header) => header.number.unwrap() -}; - function ParachainInfo ({ className, id }: Props): React.ReactElement { - const { api } = useParaApi(id); - - // We are not using the derive here, we keep this queries to the point to not overload - const bestNumber = useCall(api?.rpc.chain.subscribeNewHeads, undefined, transformHeader); - const runtimeVersion = useCall(api?.rpc.state.subscribeRuntimeVersion); + const { bestNumber, runtimeVersion } = useChainDetails(id); return (
diff --git a/packages/page-parachains/src/Overview/Periods.tsx b/packages/page-parachains/src/Overview/Periods.tsx index e3270d0060..097a38bc78 100644 --- a/packages/page-parachains/src/Overview/Periods.tsx +++ b/packages/page-parachains/src/Overview/Periods.tsx @@ -17,27 +17,31 @@ interface Props { periods: number[]; } +function getMapped (periods: number[], currentPeriod?: BN): string | undefined { + return currentPeriod && periods && + periods + .reduce((all: [BN, BN][], period): [BN, BN][] => { + const bnp = currentPeriod.addn(period); + + if (!all.length || all[all.length - 1][1].add(BN_ONE).lt(bnp)) { + all.push([bnp, bnp]); + } else { + all[all.length - 1][1] = bnp; + } + + return all; + }, []) + .map(([a, b]) => + a.eq(b) + ? formatNumber(a) + : `${formatNumber(a)} - ${formatNumber(b)}` + ) + .join(', '); +} + function Periods ({ className, fromFirst, leasePeriod, periods }: Props): React.ReactElement { const mapped = useMemo( - () => leasePeriod?.currentPeriod && periods && - periods - .reduce((all: [BN, BN][], period): [BN, BN][] => { - const bnp = leasePeriod.currentPeriod.addn(period); - - if (!all.length || all[all.length - 1][1].add(BN_ONE).lt(bnp)) { - all.push([bnp, bnp]); - } else { - all[all.length - 1][1] = bnp; - } - - return all; - }, []) - .map(([a, b]) => - a.eq(b) - ? formatNumber(a) - : `${formatNumber(a)} - ${formatNumber(b)}` - ) - .join(', '), + () => getMapped(periods, leasePeriod?.currentPeriod), [leasePeriod?.currentPeriod, periods] ); diff --git a/packages/page-parachains/src/Overview/useChainDetails.ts b/packages/page-parachains/src/Overview/useChainDetails.ts new file mode 100644 index 0000000000..ee93c44bfe --- /dev/null +++ b/packages/page-parachains/src/Overview/useChainDetails.ts @@ -0,0 +1,27 @@ +// Copyright 2017-2022 @polkadot/app-parachains authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { BlockNumber, Header, ParaId, RuntimeVersion } from '@polkadot/types/interfaces'; + +import { createNamedHook, useCall, useParaApi } from '@polkadot/react-hooks'; + +interface Result { + bestNumber?: BlockNumber; + runtimeVersion?: RuntimeVersion; +} + +const HDR_OPTS = { + transform: (header: Header) => header.number.unwrap() +}; + +function useChainDetailsImpl (id: ParaId): Result { + const { api } = useParaApi(id); + + // We are not using the derive here, we keep this queries to the point to not overload + return { + bestNumber: useCall(api?.rpc.chain.subscribeNewHeads, undefined, HDR_OPTS), + runtimeVersion: useCall(api?.rpc.state.subscribeRuntimeVersion) + }; +} + +export default createNamedHook('useChainDetails', useChainDetailsImpl); diff --git a/packages/page-parachains/src/Overview/useParaInfo.ts b/packages/page-parachains/src/Overview/useParaInfo.ts index 4e243f3d5b..640ebe5b74 100644 --- a/packages/page-parachains/src/Overview/useParaInfo.ts +++ b/packages/page-parachains/src/Overview/useParaInfo.ts @@ -26,7 +26,7 @@ interface Result { watermark: BlockNumber | null; } -const optionsMulti = { +const MULTI_OPTS = { defaultValue: { headHex: null, leases: [], @@ -74,7 +74,7 @@ function useParaInfoImpl (id: ParaId): Result { [(api.query.parasInclusion || api.query.paraInclusion || api.query.inclusion)?.pendingAvailability, id], [api.query.registrar.paras, id], [api.query.slots.leases, id] - ], optionsMulti); + ], MULTI_OPTS); } export default createNamedHook('useParaInfo', useParaInfoImpl); diff --git a/packages/page-parachains/src/Parathreads/Actions.tsx b/packages/page-parachains/src/Parathreads/Actions.tsx index 867d75be7e..f9de1ce982 100644 --- a/packages/page-parachains/src/Parathreads/Actions.tsx +++ b/packages/page-parachains/src/Parathreads/Actions.tsx @@ -20,7 +20,7 @@ interface Props { ownedIds: OwnedId[]; } -const transformId = { +const OPT_NEXT = { transform: (nextId: ParaId) => nextId.isZero() ? LOWEST_PUBLIC_ID @@ -32,7 +32,7 @@ function Actions ({ className, ownedIds }: Props): React.ReactElement { const { api } = useApi(); const [isRegisterOpen, toggleRegisterOpen] = useToggle(); const [isReserveOpen, toggleReserveOpen] = useToggle(); - const nextParaId = useCall(api.query.registrar.nextFreeParaId, [], transformId); + const nextParaId = useCall(api.query.registrar.nextFreeParaId, [], OPT_NEXT); return ( diff --git a/packages/page-parachains/src/Parathreads/useThreadInfo.ts b/packages/page-parachains/src/Parathreads/useThreadInfo.ts index b7956b0b62..66ca559f1b 100644 --- a/packages/page-parachains/src/Parathreads/useThreadInfo.ts +++ b/packages/page-parachains/src/Parathreads/useThreadInfo.ts @@ -15,7 +15,7 @@ interface Result { manager: AccountId | null; } -const optMulti = { +const OPT_MULTI = { defaultValue: { headHex: null, lifecycle: null, @@ -42,7 +42,7 @@ function useThreadInfoImpl (id: ParaId): Result { [api.query.paras.upcomingParasGenesis, id], [api.query.paras.paraLifecycles, id], [api.query.registrar.paras, id] - ], optMulti); + ], OPT_MULTI); } export default createNamedHook('useThreadInfo', useThreadInfoImpl); diff --git a/packages/page-parachains/src/useActionsQueue.ts b/packages/page-parachains/src/useActionsQueue.ts index 22654bf289..3a090e3aa5 100644 --- a/packages/page-parachains/src/useActionsQueue.ts +++ b/packages/page-parachains/src/useActionsQueue.ts @@ -12,7 +12,7 @@ import { BN_EIGHT, BN_FIVE, BN_FOUR, BN_NINE, BN_ONE, BN_SEVEN, BN_SIX, BN_TEN, const INC = [BN_ONE, BN_TWO, BN_THREE, BN_FOUR, BN_FIVE, BN_SIX, BN_SEVEN, BN_EIGHT, BN_NINE, BN_TEN]; -const callOpts = { +const OPT_NEXT = { withParams: true }; @@ -20,7 +20,7 @@ function useActionsQueueImpl (): QueuedAction[] { const { api } = useApi(); const currentIndex = useCall(api.query.session.currentIndex); const queryIndexes = useMemo(() => currentIndex && INC.map((i) => currentIndex.add(i)), [currentIndex]); - const nextActions = useCall<[[BN[]], ParaId[][]]>(queryIndexes && api.query.paras.actionsQueue.multi, [queryIndexes], callOpts); + const nextActions = useCall<[[BN[]], ParaId[][]]>(queryIndexes && api.query.paras.actionsQueue.multi, [queryIndexes], OPT_NEXT); return useMemo( (): QueuedAction[] => diff --git a/packages/page-parachains/src/useAuctionInfo.tsx b/packages/page-parachains/src/useAuctionInfo.tsx index db4eac9793..ae788a6590 100644 --- a/packages/page-parachains/src/useAuctionInfo.tsx +++ b/packages/page-parachains/src/useAuctionInfo.tsx @@ -8,7 +8,7 @@ import type { AuctionInfo } from './types'; import { createNamedHook, useApi, useCallMulti } from '@polkadot/react-hooks'; -const optionsMulti = { +const OPT_MULTI = { transform: ([numAuctions, optInfo]: [AuctionIndex, Option>]): AuctionInfo => { const [leasePeriod, endBlock] = optInfo.unwrapOr([null, null]); @@ -26,7 +26,7 @@ function useAuctionInfoImpl (): AuctionInfo | undefined { return useCallMulti([ api.query.auctions?.auctionCounter, api.query.auctions?.auctionInfo - ], optionsMulti); + ], OPT_MULTI); } export default createNamedHook('useAuctionInfo', useAuctionInfoImpl); diff --git a/packages/page-parachains/src/useFunds.ts b/packages/page-parachains/src/useFunds.ts index f1e2b032c7..3b8fbf3795 100644 --- a/packages/page-parachains/src/useFunds.ts +++ b/packages/page-parachains/src/useFunds.ts @@ -111,7 +111,7 @@ function createResult (bestNumber: BlockNumber, minContribution: BN, funds: Camp }; } -const optFundMulti = { +const OPT_FUND = { transform: ([[paraIds], optFunds]: [[ParaId[]], Option[]]): Campaign[] => paraIds .map((paraId, i): [ParaId, PolkadotRuntimeCommonCrowdloanFundInfo | null] => [paraId, optFunds[i].unwrapOr(null)]) @@ -135,7 +135,7 @@ const optFundMulti = { withParamsTransform: true }; -const optLeaseMulti = { +const OPT_LEASE = { transform: ([[paraIds], leases]: [[ParaId[]], Option>[][]]): ParaId[] => paraIds.filter((paraId, i) => leases[i] @@ -158,8 +158,8 @@ function useFundsImpl (): Campaigns { const mountedRef = useIsMountedRef(); const trigger = useEventTrigger([api.events.crowdloan?.Created]); const paraIds = useMapKeys(api.query.crowdloan?.funds, fundOpts, trigger.blockHash); - const campaigns = useCall(api.query.crowdloan?.funds.multi, [paraIds], optFundMulti); - const leases = useCall(api.query.slots.leases.multi, [paraIds], optLeaseMulti); + const campaigns = useCall(api.query.crowdloan?.funds.multi, [paraIds], OPT_FUND); + const leases = useCall(api.query.slots.leases.multi, [paraIds], OPT_LEASE); const [result, setResult] = useState(EMPTY); // here we manually add the actual ending status and calculate the totals diff --git a/packages/page-parachains/src/useOwnedIds.ts b/packages/page-parachains/src/useOwnedIds.ts index 82aefdd446..477315f2ae 100644 --- a/packages/page-parachains/src/useOwnedIds.ts +++ b/packages/page-parachains/src/useOwnedIds.ts @@ -20,7 +20,7 @@ interface Owned { owned: OwnedIdPartial[]; } -const entriesOptions = { +const OPT_ENTRIES = { transform: (entries: [StorageKey<[ParaId]>, Option][]): Owned => { const owned = entries .map(([{ args: [paraId] }, optInfo]): OwnedIdPartial | null => { @@ -45,7 +45,7 @@ const entriesOptions = { } }; -const hashesOption = { +const OPT_HASHES = { transform: ([[paraIds], optHashes]: [[ParaId[]], Option[]]) => paraIds.map((paraId, index): CodeHash => ({ hash: optHashes[index].unwrapOr(null), @@ -61,8 +61,8 @@ function useOwnedIdsImpl (): OwnedId[] { api.events.registrar.Registered, api.events.registrar.Reserved ]); - const unfiltered = useMapEntries(api.query.registrar.paras, entriesOptions, trigger.blockHash); - const hashes = useCall(api.query.paras.currentCodeHash.multi, [unfiltered ? unfiltered.ids : []], hashesOption); + const unfiltered = useMapEntries(api.query.registrar.paras, OPT_ENTRIES, trigger.blockHash); + const hashes = useCall(api.query.paras.currentCodeHash.multi, [unfiltered ? unfiltered.ids : []], OPT_HASHES); return useMemo( () => unfiltered && hashes diff --git a/packages/page-parachains/src/useProposals.ts b/packages/page-parachains/src/useProposals.ts index ae5feb9db7..6c71dbc340 100644 --- a/packages/page-parachains/src/useProposals.ts +++ b/packages/page-parachains/src/useProposals.ts @@ -16,16 +16,16 @@ interface Scheduled { sessionIndex: SessionIndex; } -const optionsMulti = { +const OPT_MULTI = { defaultValue: [undefined, undefined] as MultiQuery }; -const proposalOpts = { +const OPT_IDS = { transform: (keys: StorageKey<[ParaId]>[]): ParaId[] => keys.map(({ args: [id] }) => id) }; -const scheduledOpts = { +const OPT_SCHED = { transform: (entries: [StorageKey<[SessionIndex]>, ParaId[]][]): Scheduled[] => entries.map(([{ args: [sessionIndex] }, scheduledIds]) => ({ scheduledIds, @@ -37,12 +37,12 @@ function useProposalsImpl (): Proposals | undefined { const { api } = useApi(); const mountedRef = useIsMountedRef(); const trigger = useEventTrigger([api.events.proposeParachain?.ProposeParachain]); - const proposalIds = useMapKeys(api.query.proposeParachain?.proposals, proposalOpts, trigger.blockHash); - const scheduled = useMapEntries(api.query.proposeParachain?.scheduledProposals, scheduledOpts, trigger.blockHash); + const proposalIds = useMapKeys(api.query.proposeParachain?.proposals, OPT_IDS, trigger.blockHash); + const scheduled = useMapEntries(api.query.proposeParachain?.scheduledProposals, OPT_SCHED, trigger.blockHash); const [sessionIndex, approvedIds] = useCallMulti([ api.query.session.currentIndex, api.query.proposeParachain?.approvedProposals - ], optionsMulti); + ], OPT_MULTI); return useMemo( () => approvedIds && sessionIndex && proposalIds && scheduled && mountedRef.current diff --git a/packages/page-parachains/src/useUpcomingIds.ts b/packages/page-parachains/src/useUpcomingIds.ts index b36f7947c6..7d499531ab 100644 --- a/packages/page-parachains/src/useUpcomingIds.ts +++ b/packages/page-parachains/src/useUpcomingIds.ts @@ -7,7 +7,7 @@ import type { PolkadotRuntimeParachainsParasParaLifecycle } from '@polkadot/type import { createNamedHook, useApi, useEventTrigger, useMapEntries } from '@polkadot/react-hooks'; -const options = { +const OPT_ENTRIES = { transform: (entries: [StorageKey<[ParaId]>, Option][]): ParaId[] => entries .map(([{ args: [paraId] }, optValue]): ParaId | null => { @@ -33,7 +33,7 @@ function useUpomingIdsImpl (): ParaId[] | undefined { api.events.registrar.Registered ]); - return useMapEntries(api.query.paras.paraLifecycles, options, trigger.blockHash); + return useMapEntries(api.query.paras.paraLifecycles, OPT_ENTRIES, trigger.blockHash); } export default createNamedHook('useUpomingIds', useUpomingIdsImpl);