From d463aa4bb361e3cdfed435a12ad8713b9a9d04ec Mon Sep 17 00:00:00 2001 From: Joel Kenny <36333783+joeljkrb@users.noreply.github.com> Date: Thu, 20 Feb 2025 09:02:49 -0500 Subject: [PATCH 01/18] feat: implement rewards calculator and merge payout history (#2482) Co-authored-by: Ross Bulat Co-authored-by: Ting A Lin --- packages/app/src/config/pages.ts | 10 +- .../src/contexts/TransferOptions/defaults.ts | 1 + .../src/contexts/TransferOptions/index.tsx | 30 +++ .../app/src/contexts/TransferOptions/types.ts | 1 + packages/app/src/library/FiatValue/index.tsx | 32 +++ packages/app/src/library/StatCards/Button.tsx | 22 ++ packages/app/src/library/StatCards/Text.tsx | 13 +- packages/app/src/library/StatCards/Ticker.tsx | 63 +++++ packages/app/src/library/StatCards/types.ts | 25 +- packages/app/src/overlay/index.tsx | 2 + .../overlay/modals/RewardCalculator/index.tsx | 180 +++++++++++++ .../Overview/AccountBalance/BalanceChart.tsx | 7 +- .../Overview/NetworkSats/Announcements.tsx | 25 +- .../app/src/pages/Payouts/ActiveGraph.tsx | 83 ------ packages/app/src/pages/Payouts/index.tsx | 147 ----------- packages/app/src/pages/Payouts/types.ts | 13 - .../Overview/RecentPayouts/ActiveGraph.tsx | 43 +++ .../Overview/RecentPayouts}/InactiveGraph.tsx | 0 .../Rewards/Overview/RecentPayouts/index.tsx | 119 +++++++++ .../app/src/pages/Rewards/Overview/index.tsx | 246 ++++++++++++++++++ .../RecentPayouts/PayoutList.tsx} | 16 +- .../src/pages/Rewards/RecentPayouts/index.tsx | 26 ++ .../Stats/LastEraPayout.tsx | 0 .../pages/Rewards/Stats/RewardCalculator.tsx | 26 ++ .../src/pages/Rewards/Stats/RewardTrend.tsx | 86 ++++++ .../pages/{Payouts => Rewards}/Wrappers.ts | 8 +- packages/app/src/pages/Rewards/index.tsx | 131 ++++++++++ packages/app/src/pages/Rewards/types.ts | 44 ++++ packages/locales/src/resources/cn/base.json | 1 + packages/locales/src/resources/cn/pages.json | 22 ++ packages/locales/src/resources/en/base.json | 1 + packages/locales/src/resources/en/pages.json | 22 ++ packages/locales/src/resources/es/base.json | 1 + packages/locales/src/resources/es/pages.json | 22 ++ packages/plugin-staking-api/src/index.tsx | 2 + .../src/queries/nominatorRewardTrend.tsx | 50 ++++ .../src/queries/poolRewardTrend.tsx | 50 ++++ .../src/queries/poolRewards.tsx | 17 ++ .../src/queries/rewards.tsx | 17 ++ packages/plugin-staking-api/src/types.ts | 15 ++ packages/styles/theme/index.scss | 4 + packages/styles/theme/theme.scss | 2 +- packages/ui-core/package.json | 1 + .../src/base/CardHeader/index.module.scss | 2 + .../base/RewardGrid/Cell/index.module.scss | 21 ++ .../src/base/RewardGrid/Cell/index.tsx | 11 + .../src/base/RewardGrid/Cells/index.tsx | 12 + .../base/RewardGrid/Head/index.module.scss | 12 + .../src/base/RewardGrid/Head/index.tsx | 17 ++ .../base/RewardGrid/Label/index.module.scss | 6 + .../src/base/RewardGrid/Label/index.tsx | 11 + .../base/RewardGrid/Root/index.module.scss | 7 + .../src/base/RewardGrid/Root/index.tsx | 11 + .../src/base/RewardGrid/Row/index.module.scss | 14 + .../ui-core/src/base/RewardGrid/Row/index.tsx | 17 ++ .../src/base/RewardGrid/common.module.scss | 6 + .../ui-core/src/base/RewardGrid/index.tsx | 20 ++ .../src/base/Separator/index.module.scss | 8 + packages/ui-core/src/base/Separator/index.tsx | 22 +- .../src/base/Stat/Card/index.module.scss | 21 +- packages/ui-core/src/base/Stat/Card/index.tsx | 17 +- .../src/base/Stat/Graphic/index.module.scss | 10 +- .../src/base/Stat/Subtitle/index.module.scss | 7 + .../ui-core/src/base/Stat/Subtitle/index.tsx | 23 +- .../src/base/Stat/Title/index.module.scss | 27 ++ .../ui-core/src/base/Stat/Title/index.tsx | 3 + packages/ui-core/src/base/Stat/index.tsx | 3 +- .../src/base/TokenFiat/index.module.scss | 29 +++ packages/ui-core/src/base/TokenFiat/index.tsx | 19 ++ packages/ui-core/src/base/index.tsx | 2 + .../src/input/TokenInput/index.module.scss | 34 +++ .../ui-core/src/input/TokenInput/index.tsx | 31 +++ packages/ui-core/src/input/index.tsx | 4 + packages/ui-core/src/input/types.ts | 13 + .../src/modal/Scroll/index.module.scss | 3 + packages/ui-core/src/modal/Scroll/index.tsx | 1 + packages/ui-overlay/src/Provider/types.ts | 2 +- 77 files changed, 1776 insertions(+), 296 deletions(-) create mode 100644 packages/app/src/library/FiatValue/index.tsx create mode 100644 packages/app/src/library/StatCards/Button.tsx create mode 100644 packages/app/src/library/StatCards/Ticker.tsx create mode 100644 packages/app/src/overlay/modals/RewardCalculator/index.tsx delete mode 100644 packages/app/src/pages/Payouts/ActiveGraph.tsx delete mode 100644 packages/app/src/pages/Payouts/index.tsx delete mode 100644 packages/app/src/pages/Payouts/types.ts create mode 100644 packages/app/src/pages/Rewards/Overview/RecentPayouts/ActiveGraph.tsx rename packages/app/src/pages/{Payouts => Rewards/Overview/RecentPayouts}/InactiveGraph.tsx (100%) create mode 100644 packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx create mode 100644 packages/app/src/pages/Rewards/Overview/index.tsx rename packages/app/src/pages/{Payouts/PayoutList/index.tsx => Rewards/RecentPayouts/PayoutList.tsx} (97%) create mode 100644 packages/app/src/pages/Rewards/RecentPayouts/index.tsx rename packages/app/src/pages/{Payouts => Rewards}/Stats/LastEraPayout.tsx (100%) create mode 100644 packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx create mode 100644 packages/app/src/pages/Rewards/Stats/RewardTrend.tsx rename packages/app/src/pages/{Payouts => Rewards}/Wrappers.ts (94%) create mode 100644 packages/app/src/pages/Rewards/index.tsx create mode 100644 packages/app/src/pages/Rewards/types.ts create mode 100644 packages/plugin-staking-api/src/queries/nominatorRewardTrend.tsx create mode 100644 packages/plugin-staking-api/src/queries/poolRewardTrend.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Cell/index.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/Cell/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Cells/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Head/index.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/Head/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Label/index.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/Label/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Root/index.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/Root/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/Row/index.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/Row/index.tsx create mode 100644 packages/ui-core/src/base/RewardGrid/common.module.scss create mode 100644 packages/ui-core/src/base/RewardGrid/index.tsx create mode 100644 packages/ui-core/src/base/TokenFiat/index.module.scss create mode 100644 packages/ui-core/src/base/TokenFiat/index.tsx create mode 100644 packages/ui-core/src/input/TokenInput/index.module.scss create mode 100644 packages/ui-core/src/input/TokenInput/index.tsx create mode 100644 packages/ui-core/src/input/index.tsx create mode 100644 packages/ui-core/src/input/types.ts diff --git a/packages/app/src/config/pages.ts b/packages/app/src/config/pages.ts index d2123fd87f..b401f2772e 100644 --- a/packages/app/src/config/pages.ts +++ b/packages/app/src/config/pages.ts @@ -5,8 +5,8 @@ import type { PageCategoryItems, PagesConfigItems } from 'common-types' import { Community } from 'pages/Community' import { Nominate } from 'pages/Nominate' import { Overview } from 'pages/Overview' -import { Payouts } from 'pages/Payouts' import { Pools } from 'pages/Pools' +import { Rewards } from 'pages/Rewards' import { Validators } from 'pages/Validators' const BASE_URL = import.meta.env.BASE_URL @@ -52,10 +52,10 @@ export const PagesConfig: PagesConfigItems = [ }, { category: 2, - key: 'payouts', - uri: `${BASE_URL}payouts`, - hash: '/payouts', - Entry: Payouts, + key: 'rewards', + uri: `${BASE_URL}rewards`, + hash: '/rewards', + Entry: Rewards, lottie: 'analytics', }, { diff --git a/packages/app/src/contexts/TransferOptions/defaults.ts b/packages/app/src/contexts/TransferOptions/defaults.ts index 0edcaaed0a..1d126d16d1 100644 --- a/packages/app/src/contexts/TransferOptions/defaults.ts +++ b/packages/app/src/contexts/TransferOptions/defaults.ts @@ -7,6 +7,7 @@ import type { TransferOptions, TransferOptionsContextInterface } from './types' export const defaultTransferOptionsContext: TransferOptionsContextInterface = { getTransferOptions: (a) => defaultTransferOptions, + getStakedBalance: (a) => new BigNumber(0), setFeeReserveBalance: (r) => {}, feeReserve: new BigNumber(0), getFeeReserve: (address) => new BigNumber(0), diff --git a/packages/app/src/contexts/TransferOptions/index.tsx b/packages/app/src/contexts/TransferOptions/index.tsx index f2a6585276..a1bf83ef12 100644 --- a/packages/app/src/contexts/TransferOptions/index.tsx +++ b/packages/app/src/contexts/TransferOptions/index.tsx @@ -11,6 +11,7 @@ import { useNetwork } from 'contexts/Network' import type { ReactNode } from 'react' import { createContext, useContext, useState } from 'react' import type { MaybeAddress } from 'types' +import { planckToUnitBn } from 'utils' import { defaultTransferOptionsContext } from './defaults' import type { TransferOptions, TransferOptionsContextInterface } from './types' import { getLocalFeeReserve, setLocalFeeReserve } from './Utils' @@ -122,6 +123,34 @@ export const TransferOptionsProvider = ({ setFeeReserve(amount) } + // Gets staked balance, whether nominating or in pool, for an account + const getStakedBalance = (address: MaybeAddress): BigNumber => { + const allTransferOptions = getTransferOptions(address) + + // Total funds nominating + const nominating = planckToUnitBn( + allTransferOptions.nominate.active + .plus(allTransferOptions.nominate.totalUnlocking) + .plus(allTransferOptions.nominate.totalUnlocked), + units + ) + + // Total funds in pool + const inPool = planckToUnitBn( + allTransferOptions.pool.active + .plus(allTransferOptions.pool.totalUnlocking) + .plus(allTransferOptions.pool.totalUnlocked), + units + ) + + // Determine the actual staked balance + return !nominating.isZero() + ? nominating + : !inPool.isZero() + ? inPool + : new BigNumber(0) + } + // Gets a feeReserve from local storage for an account, or the default value otherwise const getFeeReserve = (address: MaybeAddress): BigNumber => getLocalFeeReserve(address, defaultFeeReserve, { network, units }) @@ -137,6 +166,7 @@ export const TransferOptionsProvider = ({ TransferOptions + getStakedBalance: (a: MaybeAddress) => BigNumber setFeeReserveBalance: (r: BigNumber) => void feeReserve: BigNumber getFeeReserve: (address: MaybeAddress) => BigNumber diff --git a/packages/app/src/library/FiatValue/index.tsx b/packages/app/src/library/FiatValue/index.tsx new file mode 100644 index 0000000000..decae201f4 --- /dev/null +++ b/packages/app/src/library/FiatValue/index.tsx @@ -0,0 +1,32 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import BigNumber from 'bignumber.js' +import { useNetwork } from 'contexts/Network' +import { useTokenPrices } from 'contexts/TokenPrice' + +export const FiatValue = ({ + tokenBalance, + currency, +}: { + tokenBalance: number + currency: string +}) => { + const { network } = useNetwork() + const { price } = useTokenPrices() + + // Convert balance to fiat value + const freeFiat = new BigNumber(tokenBalance * price).decimalPlaces(2) + + // Formatter for price feed + const formatter = new Intl.NumberFormat('en-US', { + style: 'currency', + currency, + }) + + if (network === 'westend') { + return null + } + + return <>{formatter.format(freeFiat.toNumber())} +} diff --git a/packages/app/src/library/StatCards/Button.tsx b/packages/app/src/library/StatCards/Button.tsx new file mode 100644 index 0000000000..b058b58b56 --- /dev/null +++ b/packages/app/src/library/StatCards/Button.tsx @@ -0,0 +1,22 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { faChevronRight } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { Stat } from 'ui-core/base' +import type { ButtonProps } from './types' + +export const Button = ({ Icon, label, title, onClick }: ButtonProps) => ( + + + +) diff --git a/packages/app/src/library/StatCards/Text.tsx b/packages/app/src/library/StatCards/Text.tsx index 1b6e7247ce..935d5ada43 100644 --- a/packages/app/src/library/StatCards/Text.tsx +++ b/packages/app/src/library/StatCards/Text.tsx @@ -6,23 +6,14 @@ import { ButtonHelp } from 'ui-buttons' import { Stat } from 'ui-core/base' import type { TextProps } from './types' -export const Text = ({ - label, - value, - secondaryValue, - helpKey, - primary, -}: TextProps) => { +export const Text = ({ label, value, helpKey, primary }: TextProps) => { const { openHelp } = useHelp() return (
- - {value} - {secondaryValue ? {secondaryValue} : null} - + {value} {label} {helpKey !== undefined ? ( diff --git a/packages/app/src/library/StatCards/Ticker.tsx b/packages/app/src/library/StatCards/Ticker.tsx new file mode 100644 index 0000000000..ec634cce99 --- /dev/null +++ b/packages/app/src/library/StatCards/Ticker.tsx @@ -0,0 +1,63 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { faArrowUpRightDots } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { Odometer } from '@w3ux/react-odometer' +import { useHelp } from 'contexts/Help' +import { ButtonHelp } from 'ui-buttons' +import { Stat } from 'ui-core/base' +import type { TickerProps } from './types' + +export const Ticker = ({ + label, + value, + helpKey, + direction, + primary, + unit, + changePercent, +}: TickerProps) => { + const { openHelp } = useHelp() + + const tickerColor = + direction === 'up' + ? 'var(--status-success-color)' + : direction === 'down' + ? 'var(--status-danger-color)' + : 'var(--text-color-secondary)' + + return ( + +
+ + + + + + + {unit} + + + + {label} + {helpKey !== undefined ? ( + openHelp(helpKey)} /> + ) : null} + + +
+
+ ) +} diff --git a/packages/app/src/library/StatCards/types.ts b/packages/app/src/library/StatCards/types.ts index 69982aa3df..342c3fe6aa 100644 --- a/packages/app/src/library/StatCards/types.ts +++ b/packages/app/src/library/StatCards/types.ts @@ -2,13 +2,14 @@ // SPDX-License-Identifier: GPL-3.0-only import type { TimeLeftFormatted } from '@w3ux/types' +import type { ReactNode } from 'react' export interface NumberProps { label: string value: number decimals?: number unit: string - helpKey: string + helpKey?: string } export interface PieProps { @@ -20,15 +21,24 @@ export interface PieProps { } pieValue: number tooltip?: string - helpKey: string + helpKey?: string } export interface TextProps { primary?: boolean label: string value: string - secondaryValue?: string - helpKey: string + helpKey?: string +} + +export interface TickerProps { + primary?: boolean + label: string + value: string + helpKey?: string + direction?: 'up' | 'down' + unit: string + changePercent: string } export interface TimeleftProps { @@ -41,3 +51,10 @@ export interface TimeleftProps { tooltip?: string helpKey?: string } + +export interface ButtonProps { + Icon: ReactNode + label: string + title: string + onClick: () => void +} diff --git a/packages/app/src/overlay/index.tsx b/packages/app/src/overlay/index.tsx index caf7a81575..ec5b96fb7e 100644 --- a/packages/app/src/overlay/index.tsx +++ b/packages/app/src/overlay/index.tsx @@ -27,6 +27,7 @@ import { MailSupport } from './modals/MailSupport' import { ManageFastUnstake } from './modals/ManageFastUnstake' import { ManagePool } from './modals/ManagePool' import { Networks } from './modals/Networks' +import { RewardCalculator } from './modals/RewardCalculator' import { Settings } from './modals/Settings' import { StopNominations } from './modals/StopNominations' import { Unbond } from './modals/Unbond' @@ -61,6 +62,7 @@ export const Overlays = () => { ManagePool, ManageFastUnstake, Networks, + RewardCalculator, Settings, ValidatorGeo, UnlockChunks, diff --git a/packages/app/src/overlay/modals/RewardCalculator/index.tsx b/packages/app/src/overlay/modals/RewardCalculator/index.tsx new file mode 100644 index 0000000000..846aa02760 --- /dev/null +++ b/packages/app/src/overlay/modals/RewardCalculator/index.tsx @@ -0,0 +1,180 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { faToggleOff, faToggleOn } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { Odometer } from '@w3ux/react-odometer' +import { minDecimalPlaces } from '@w3ux/utils' +import BigNumber from 'bignumber.js' +import { useNetwork } from 'contexts/Network' +import { useValidators } from 'contexts/Validators/ValidatorEntries' +import { useAverageRewardRate } from 'hooks/useAverageRewardRate' +import { FiatValue } from 'library/FiatValue' +import { Title } from 'library/Modal/Title' +import type { ChangeEvent } from 'react' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { CardHeader, Separator, TokenFiat } from 'ui-core/base' +import { TokenInput } from 'ui-core/input' +import { Padding } from 'ui-core/modal' +import { useOverlay } from 'ui-overlay' +import { ContentWrapper } from '../Networks/Wrapper' + +const DEFAULT_TOKEN_INPUT = 1000 + +export const RewardCalculator = () => { + const { t } = useTranslation() + const { + networkData: { + unit, + units, + brand: { token: Token }, + }, + } = useNetwork() + const { config } = useOverlay().modal + const { avgCommission } = useValidators() + const { getAverageRewardRate } = useAverageRewardRate() + + const { currency } = config.options + const { avgRateBeforeCommission } = getAverageRewardRate(false) + const rewardRate = avgRateBeforeCommission.toNumber() + + // Store token amount to stake + const [stakeAmount, setStakeAmount] = useState(DEFAULT_TOKEN_INPUT) + + // Whether to show base or commission-adjusted rewards + const [showAdjusted, setShowCommissionAdjusted] = useState(false) + + const annualRewardBase = stakeAmount * (rewardRate / 100) || 0 + + const annualRewardAfterCommission = + annualRewardBase * (1 - avgCommission / 100) + const monthlyRewardAfterCommission = annualRewardAfterCommission / 12 + const dailyRewardAfterCommission = annualRewardAfterCommission / 365 + + const annualReward = showAdjusted + ? annualRewardAfterCommission + : annualRewardBase + + const monthlyReward = showAdjusted + ? monthlyRewardAfterCommission + : annualRewardBase / 12 + const dailyReward = showAdjusted + ? dailyRewardAfterCommission + : annualRewardBase / 365 + + const onChange = (e: ChangeEvent) => { + const isNumber = !isNaN(Number(e.target.value)) + if (!isNumber) { + return + } + setStakeAmount(Number(e.target.value)) + } + + return ( +
+ + <Padding horizontalOnly> + <ContentWrapper> + <h4>{t('rewards.rewardCalcSubtitle', { ns: 'pages', unit })}</h4> + <TokenInput + id="reward-calc-token-input" + label={`${t('rewards.unitAmount', { ns: 'pages', unit })}`} + onChange={onChange} + placeholder={t('rewards.stakePlaceholder', { ns: 'pages' })} + value={String(stakeAmount || 0)} + marginY + />{' '} + <h3 style={{ padding: '0 0.5rem' }}> + <button + type="button" + onClick={() => setShowCommissionAdjusted(!showAdjusted)} + > + <FontAwesomeIcon + icon={showAdjusted ? faToggleOn : faToggleOff} + style={{ + color: showAdjusted + ? 'var(--accent-color-primary)' + : 'var(--text-color-tertiary)', + marginRight: '0.8rem', + }} + transform={'grow-6'} + /> + {t('rewards.deductAvgCommissionOf', { + ns: 'pages', + commission: avgCommission, + })} + </button> + </h3> + <Separator lg /> + <CardHeader> + <h4> + {t('rewards.daily', { ns: 'pages' })}{' '} + {t('rewards', { ns: 'modals' })} + </h4> + <TokenFiat Token={<Token />}> + <h1> + <Odometer + value={minDecimalPlaces( + new BigNumber(dailyReward).toFormat(units), + 2 + )} + zeroDecimals={2} + /> + </h1> + <h3> + <FiatValue tokenBalance={dailyReward} currency={currency} /> + </h3> + </TokenFiat> + </CardHeader> + <Separator lg /> + <CardHeader> + <h4> + {t('rewards.monthly', { ns: 'pages' })}{' '} + {t('rewards', { ns: 'modals' })} + </h4> + <TokenFiat Token={<Token />}> + <h1> + <Odometer + value={minDecimalPlaces( + new BigNumber(monthlyReward).toFormat(units), + 2 + )} + zeroDecimals={2} + /> + </h1> + <h3> + <FiatValue tokenBalance={monthlyReward} currency={currency} /> + </h3> + </TokenFiat> + </CardHeader> + <Separator lg /> + <CardHeader> + <h4> + {t('rewards.annual', { ns: 'pages' })}{' '} + {t('rewards', { ns: 'modals' })} + </h4> + <TokenFiat Token={<Token />}> + <h1> + <Odometer + value={minDecimalPlaces( + new BigNumber(annualReward).toFormat(units), + 2 + )} + zeroDecimals={2} + /> + </h1> + <h3> + <FiatValue tokenBalance={annualReward} currency={currency} /> + </h3> + </TokenFiat> + </CardHeader> + <Separator transparent style={{ marginTop: '2.5rem' }} /> + </ContentWrapper> + </Padding> + </div> + ) +} diff --git a/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx b/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx index 6ea948f8c5..2d1b351841 100644 --- a/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx +++ b/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx @@ -15,12 +15,12 @@ import { useSyncing } from 'hooks/useSyncing' import { BarSegment } from 'library/BarChart/BarSegment' import { LegendItem } from 'library/BarChart/LegendItem' import { Bar, BarChartWrapper, Legend } from 'library/BarChart/Wrappers' +import { FiatValue } from 'library/FiatValue' import { useTranslation } from 'react-i18next' import { ButtonTertiary } from 'ui-buttons' import { CardHeader, CardLabel } from 'ui-core/base' import { useOverlay } from 'ui-overlay' import { planckToUnitBn } from 'utils' -import { Value } from './Value' export const BalanceChart = () => { const { t } = useTranslation('pages') @@ -144,7 +144,10 @@ export const BalanceChart = () => { /> <CardLabel> {plugins.includes('staking_api') && network !== 'westend' ? ( - <Value totalBalance={totalBalance} /> + <FiatValue + tokenBalance={totalBalance.toNumber()} + currency="USD" + /> ) : null} </CardLabel> </h2> diff --git a/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx b/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx index 9aa59954e8..72f5d3757b 100644 --- a/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx +++ b/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx @@ -24,9 +24,11 @@ export const Announcements = () => { const { bondedPools } = useBondedPools() const { poolsConfig: { counterForPoolMembers }, - stakingMetrics: { totalStaked }, + stakingMetrics: { totalStaked, lastReward }, } = useApi() + const lastRewardUnit = planckToUnitBn(lastReward, units) + let totalPoolPoints = new BigNumber(0) bondedPools.forEach((b: BondedPool) => { totalPoolPoints = totalPoolPoints.plus(rmCommas(b.points)) @@ -54,9 +56,7 @@ export const Announcements = () => { const announcements = [] - const networkUnit = unit - - // total staked on the network + // Total staked on the network if (!totalStaked.isZero()) { announcements.push({ class: 'neutral', @@ -73,21 +73,21 @@ export const Announcements = () => { announcements.push(null) } - // total locked in pools + // Total locked in pools if (bondedPools.length) { announcements.push({ class: 'neutral', title: `${totalPoolPointsUnit.integerValue().toFormat()} ${unit} ${t( 'overview.inPools' )}`, - subtitle: `${t('overview.bondedInPools', { networkUnit })}`, + subtitle: `${t('overview.bondedInPools', { networkUnit: unit })}`, }) } else { announcements.push(null) } + // Total locked in pools if (counterForPoolMembers.isGreaterThan(0)) { - // total locked in pools announcements.push({ class: 'neutral', title: `${counterForPoolMembers.toFormat()} ${t( @@ -99,6 +99,17 @@ export const Announcements = () => { announcements.push(null) } + // Last era payout + if (lastRewardUnit.isGreaterThan(0)) { + announcements.push({ + class: 'neutral', + title: `${lastRewardUnit.integerValue().toFormat()} ${unit} ${t('overview.paidOutLastEraTitle')}`, + subtitle: `${t('overview.paidOutLastEraSubtitle')}`, + }) + } else { + announcements.push(null) + } + announcements.sort(sortWithNull(true)) return ( diff --git a/packages/app/src/pages/Payouts/ActiveGraph.tsx b/packages/app/src/pages/Payouts/ActiveGraph.tsx deleted file mode 100644 index 145f5f2953..0000000000 --- a/packages/app/src/pages/Payouts/ActiveGraph.tsx +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors -// SPDX-License-Identifier: GPL-3.0-only - -import type { AnyApi } from 'common-types' -import { MaxPayoutDays } from 'consts' -import { useActiveAccounts } from 'contexts/ActiveAccounts' -import { useApi } from 'contexts/Api' -import { useNetwork } from 'contexts/Network' -import { getUnixTime } from 'date-fns' -import { AveragePayoutLine } from 'library/Graphs/AveragePayoutLine' -import { PayoutBar } from 'library/Graphs/PayoutBar' -import { removeNonZeroAmountAndSort } from 'library/Graphs/Utils' -import { usePoolRewards, useRewards } from 'plugin-staking-api' -import type { NominatorReward, RewardResults } from 'plugin-staking-api/types' -import { useEffect } from 'react' - -interface Props { - nominating: boolean - inPool: boolean - setPayoutLists: (payouts: AnyApi[]) => void -} - -export const ActiveGraph = ({ nominating, inPool, setPayoutLists }: Props) => { - const { activeEra } = useApi() - const { network } = useNetwork() - const { activeAccount } = useActiveAccounts() - - const { data: nominatorRewardsData, loading: rewardsLoading } = useRewards({ - network, - who: activeAccount || '', - fromEra: Math.max(activeEra.index.minus(1).toNumber(), 0), - }) - - const fromDate = new Date() - fromDate.setDate(fromDate.getDate() - MaxPayoutDays) - fromDate.setHours(0, 0, 0, 0) - - const { data: poolRewardsData, loading: poolRewardsLoading } = usePoolRewards( - { - network, - who: activeAccount || '', - from: getUnixTime(fromDate), - } - ) - - const allRewards = nominatorRewardsData?.allRewards ?? [] - const payouts = - allRewards.filter((reward: NominatorReward) => reward.claimed === true) ?? - [] - const unclaimedPayouts = - allRewards.filter((reward: NominatorReward) => reward.claimed === false) ?? - [] - const poolClaims = poolRewardsData?.poolRewards ?? [] - - useEffect(() => { - // filter zero rewards and order via timestamp, most recent first - const payoutsList = (allRewards as RewardResults).concat( - poolClaims - ) as RewardResults - setPayoutLists(removeNonZeroAmountAndSort(payoutsList)) - }, [JSON.stringify(payouts), JSON.stringify(poolClaims)]) - - return ( - <> - <PayoutBar - days={MaxPayoutDays} - height="165px" - data={{ payouts, unclaimedPayouts, poolClaims }} - nominating={nominating} - inPool={inPool} - syncing={rewardsLoading || poolRewardsLoading} - /> - <AveragePayoutLine - days={MaxPayoutDays} - average={10} - height="65px" - data={{ payouts, unclaimedPayouts, poolClaims }} - nominating={nominating} - inPool={inPool} - /> - </> - ) -} diff --git a/packages/app/src/pages/Payouts/index.tsx b/packages/app/src/pages/Payouts/index.tsx deleted file mode 100644 index 5a3493148c..0000000000 --- a/packages/app/src/pages/Payouts/index.tsx +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors -// SPDX-License-Identifier: GPL-3.0-only - -import { useSize } from '@w3ux/hooks' -import type { PageProps } from 'common-types' -import { useHelp } from 'contexts/Help' -import { usePlugins } from 'contexts/Plugins' -import { useActivePool } from 'contexts/Pools/ActivePool' -import { useStaking } from 'contexts/Staking' -import { useUi } from 'contexts/UI' -import { useSyncing } from 'hooks/useSyncing' -import { CardWrapper } from 'library/Card/Wrappers' -import { - formatSize, - getPayoutsFromDate, - getPayoutsToDate, -} from 'library/Graphs/Utils' -import { GraphWrapper } from 'library/Graphs/Wrapper' -import { StatusLabel } from 'library/StatusLabel' -import { DefaultLocale, locales } from 'locales' -import type { RewardResults } from 'plugin-staking-api/types' -import { useEffect, useRef, useState } from 'react' -import { useTranslation } from 'react-i18next' -import { ButtonHelp } from 'ui-buttons' -import { CardHeader, Page, Stat } from 'ui-core/base' -import { ActiveGraph } from './ActiveGraph' -import { InactiveGraph } from './InactiveGraph' -import { PayoutList } from './PayoutList' -import { LastEraPayout } from './Stats/LastEraPayout' - -export const Payouts = ({ page: { key } }: PageProps) => { - const { i18n, t } = useTranslation() - const { openHelp } = useHelp() - const { inSetup } = useStaking() - const { syncing } = useSyncing() - const { containerRefs } = useUi() - const { inPool } = useActivePool() - const { pluginEnabled } = usePlugins() - - const nominating = !inSetup() - const staking = nominating || inPool - const notStaking = !syncing && !staking - - const [payoutsList, setPayoutLists] = useState<RewardResults>([]) - - const ref = useRef<HTMLDivElement>(null) - const size = useSize(ref, { - outerElement: containerRefs?.mainInterface, - }) - const { width, height, minHeight } = formatSize(size, 280) - - const payoutsFromDate = getPayoutsFromDate( - payoutsList, - locales[i18n.resolvedLanguage ?? DefaultLocale].dateFormat - ) - const payoutsToDate = getPayoutsToDate( - payoutsList, - locales[i18n.resolvedLanguage ?? DefaultLocale].dateFormat - ) - - useEffect(() => { - if (!pluginEnabled('staking_api')) { - setPayoutLists([]) - } - }, [pluginEnabled('staking_api')]) - - return ( - <> - <Page.Title title={t(key, { ns: 'base' })} /> - <Stat.Row> - <LastEraPayout /> - </Stat.Row> - <Page.Row> - <CardWrapper> - <CardHeader> - <h4> - {t('payouts.payoutHistory', { ns: 'pages' })} - <ButtonHelp - marginLeft - onClick={() => openHelp('Payout History')} - /> - </h4> - <h2> - {payoutsFromDate && payoutsToDate ? ( - <> - {payoutsFromDate} - {payoutsToDate !== payoutsFromDate && ( - <> - {payoutsToDate}</> - )} - </> - ) : ( - t('payouts.none', { ns: 'pages' }) - )} - </h2> - </CardHeader> - <div ref={ref} className="inner" style={{ minHeight }}> - {!pluginEnabled('staking_api') ? ( - <StatusLabel - status="active_service" - statusFor="staking_api" - title={t('common.stakingApiDisabled', { ns: 'pages' })} - topOffset="30%" - /> - ) : ( - <StatusLabel - status="sync_or_setup" - title={t('payouts.notStaking', { ns: 'pages' })} - topOffset="30%" - /> - )} - <GraphWrapper - style={{ - height: `${height}px`, - width: `${width}px`, - position: 'absolute', - opacity: notStaking ? 0.75 : 1, - transition: 'opacity 0.5s', - }} - > - {staking && pluginEnabled('staking_api') ? ( - <ActiveGraph - nominating={nominating} - inPool={inPool()} - setPayoutLists={setPayoutLists} - /> - ) : ( - <InactiveGraph /> - )} - </GraphWrapper> - </div> - </CardWrapper> - </Page.Row> - {!!payoutsList?.length && ( - <Page.Row> - <CardWrapper> - <PayoutList - title={t('payouts.recentPayouts', { ns: 'pages' })} - payouts={payoutsList} - pagination - itemsPerPage={50} - /> - </CardWrapper> - </Page.Row> - )} - </> - ) -} diff --git a/packages/app/src/pages/Payouts/types.ts b/packages/app/src/pages/Payouts/types.ts deleted file mode 100644 index 6569b1c3fd..0000000000 --- a/packages/app/src/pages/Payouts/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors -// SPDX-License-Identifier: GPL-3.0-only - -import type { AnyApi } from 'common-types' - -export interface PayoutListProps { - allowMoreCols?: boolean - pagination?: boolean - title?: string | null - itemsPerPage: number - payoutsList?: AnyApi - payouts?: AnyApi -} diff --git a/packages/app/src/pages/Rewards/Overview/RecentPayouts/ActiveGraph.tsx b/packages/app/src/pages/Rewards/Overview/RecentPayouts/ActiveGraph.tsx new file mode 100644 index 0000000000..ec1132fbf8 --- /dev/null +++ b/packages/app/src/pages/Rewards/Overview/RecentPayouts/ActiveGraph.tsx @@ -0,0 +1,43 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { MaxPayoutDays } from 'consts' +import { AveragePayoutLine } from 'library/Graphs/AveragePayoutLine' +import { PayoutBar } from 'library/Graphs/PayoutBar' +import type { PayoutHistoryProps } from 'pages/Rewards/types' + +type Props = Omit< + PayoutHistoryProps & { + nominating: boolean + inPool: boolean + }, + 'payoutsList' | 'setPayoutsList' +> + +export const ActiveGraph = ({ + nominating, + inPool, + payoutGraphData: { payouts, unclaimedPayouts, poolClaims }, + loading, +}: Props) => ( + <> + <PayoutBar + days={MaxPayoutDays} + height="165px" + data={{ payouts, unclaimedPayouts, poolClaims }} + nominating={nominating} + inPool={inPool} + syncing={loading} + /> + <div style={{ marginTop: '1rem' }}> + <AveragePayoutLine + days={MaxPayoutDays} + average={10} + height="65px" + data={{ payouts, unclaimedPayouts, poolClaims }} + nominating={nominating} + inPool={inPool} + /> + </div> + </> +) diff --git a/packages/app/src/pages/Payouts/InactiveGraph.tsx b/packages/app/src/pages/Rewards/Overview/RecentPayouts/InactiveGraph.tsx similarity index 100% rename from packages/app/src/pages/Payouts/InactiveGraph.tsx rename to packages/app/src/pages/Rewards/Overview/RecentPayouts/InactiveGraph.tsx diff --git a/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx b/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx new file mode 100644 index 0000000000..b0ea138bbd --- /dev/null +++ b/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx @@ -0,0 +1,119 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { useSize } from '@w3ux/hooks' +import { usePlugins } from 'contexts/Plugins' +import { useActivePool } from 'contexts/Pools/ActivePool' +import { useStaking } from 'contexts/Staking' +import { useUi } from 'contexts/UI' +import { useSyncing } from 'hooks/useSyncing' +import { + formatSize, + getPayoutsFromDate, + getPayoutsToDate, +} from 'library/Graphs/Utils' +import { GraphWrapper } from 'library/Graphs/Wrapper' +import { StatusLabel } from 'library/StatusLabel' +import { DefaultLocale, locales } from 'locales' +import type { PayoutHistoryProps } from 'pages/Rewards/types' +import { useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import { CardHeader } from 'ui-core/base' +import { ActiveGraph } from './ActiveGraph' +import { InactiveGraph } from './InactiveGraph' + +export const RecentPayouts = ({ + payoutsList, + setPayoutsList, + payoutGraphData, + loading, +}: PayoutHistoryProps) => { + const { i18n, t } = useTranslation('pages') + const { inSetup } = useStaking() + const { syncing } = useSyncing() + const { containerRefs } = useUi() + const { inPool } = useActivePool() + const { pluginEnabled } = usePlugins() + + const payoutsFromDate = getPayoutsFromDate( + payoutsList, + locales[i18n.resolvedLanguage ?? DefaultLocale].dateFormat + ) + const payoutsToDate = getPayoutsToDate( + payoutsList, + locales[i18n.resolvedLanguage ?? DefaultLocale].dateFormat + ) + const nominating = !inSetup() + const staking = nominating || inPool + const notStaking = !syncing && !staking + + const ref = useRef<HTMLDivElement>(null) + const size = useSize(ref, { + outerElement: containerRefs?.mainInterface, + }) + const { width, height, minHeight } = formatSize(size, 280) + + useEffect(() => { + if (!pluginEnabled('staking_api')) { + setPayoutsList([]) + } + }, [pluginEnabled('staking_api')]) + + return ( + <> + <CardHeader> + <h4>{t('overview.recentPayouts')}</h4> + <h2> + {payoutsFromDate && payoutsToDate ? ( + <> + {payoutsFromDate} + {payoutsToDate !== payoutsFromDate && ( + <> - {payoutsToDate}</> + )} + </> + ) : ( + t('payouts.none') + )} + </h2> + </CardHeader> + <div ref={ref} className="inner" style={{ minHeight }}> + {!pluginEnabled('staking_api') ? ( + <StatusLabel + status="active_service" + statusFor="staking_api" + title={t('common.stakingApiDisabled')} + topOffset="30%" + /> + ) : ( + notStaking && ( + <StatusLabel + status="sync_or_setup" + title={t('payouts.notStaking')} + topOffset="30%" + /> + ) + )} + <GraphWrapper + style={{ + height: `${height}px`, + width: `${width}px`, + position: 'absolute', + opacity: notStaking ? 0.75 : 1, + transition: 'opacity 0.5s', + }} + > + {staking && pluginEnabled('staking_api') ? ( + <ActiveGraph + nominating={nominating} + inPool={inPool()} + payoutGraphData={payoutGraphData} + loading={loading} + /> + ) : ( + <InactiveGraph /> + )} + </GraphWrapper> + </div> + </> + ) +} diff --git a/packages/app/src/pages/Rewards/Overview/index.tsx b/packages/app/src/pages/Rewards/Overview/index.tsx new file mode 100644 index 0000000000..e62f44b4e4 --- /dev/null +++ b/packages/app/src/pages/Rewards/Overview/index.tsx @@ -0,0 +1,246 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { + faCaretUp, + faToggleOff, + faToggleOn, +} from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { Odometer } from '@w3ux/react-odometer' +import { minDecimalPlaces } from '@w3ux/utils' +import BigNumber from 'bignumber.js' +import { useActiveAccounts } from 'contexts/ActiveAccounts' +import { useNetwork } from 'contexts/Network' +import { usePlugins } from 'contexts/Plugins' +import { useTokenPrices } from 'contexts/TokenPrice' +import { useTransferOptions } from 'contexts/TransferOptions' +import { useValidators } from 'contexts/Validators/ValidatorEntries' +import { useAverageRewardRate } from 'hooks/useAverageRewardRate' +import { CardWrapper } from 'library/Card/Wrappers' +import { FiatValue } from 'library/FiatValue' +import { AverageRewardRate } from 'pages/Overview/Stats/AveragelRewardRate' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { + CardHeader, + CardLabel, + Page, + RewardGrid, + Separator, + Stat, +} from 'ui-core/base' +import { useOverlay } from 'ui-overlay' +import { RewardCalculator } from '../Stats/RewardCalculator' +import { RewardTrend } from '../Stats/RewardTrend' +import type { PayoutHistoryProps } from '../types' +import { RecentPayouts } from './RecentPayouts' + +export const Overview = (props: PayoutHistoryProps) => { + const { t } = useTranslation('pages') + const { + networkData: { + unit, + brand: { token: Token }, + }, + } = useNetwork() + const { pluginEnabled } = usePlugins() + const { openModal } = useOverlay().modal + const { avgCommission } = useValidators() + const { activeAccount } = useActiveAccounts() + const { price: tokenPrice } = useTokenPrices() + const { getStakedBalance } = useTransferOptions() + const { getAverageRewardRate } = useAverageRewardRate() + const { avgRateBeforeCommission } = getAverageRewardRate(false) + const rewardRate = avgRateBeforeCommission.toNumber() + + // Whether to show base or commission-adjusted rewards + const [showAdjusted, setShowCommissionAdjusted] = useState<boolean>(false) + + const currentStake = getStakedBalance(activeAccount).toNumber() + const annualRewardBase = currentStake * (rewardRate / 100) || 0 + + const annualRewardAfterCommission = + annualRewardBase * (1 - avgCommission / 100) + const monthlyRewardAfterCommission = annualRewardAfterCommission / 12 + const dailyRewardAfterCommission = annualRewardAfterCommission / 365 + + const annualReward = showAdjusted + ? annualRewardAfterCommission + : annualRewardBase + + const monthlyReward = showAdjusted + ? monthlyRewardAfterCommission + : annualRewardBase / 12 + const dailyReward = showAdjusted + ? dailyRewardAfterCommission + : annualRewardBase / 365 + + const currency = 'USD' + const symbol = '$' + + return ( + <> + <Stat.Row> + <AverageRewardRate /> + {pluginEnabled('staking_api') && <RewardTrend />} + <RewardCalculator + onClick={() => { + openModal({ + key: 'RewardCalculator', + size: 'xs', + options: { + currency, + symbol, + }, + }) + }} + /> + </Stat.Row> + <Page.Row> + <CardWrapper> + <RecentPayouts {...props} /> + </CardWrapper> + </Page.Row> + {pluginEnabled('staking_api') && ( + <Page.Row> + <CardWrapper> + <CardHeader> + <h3>{t('rewards.projectedRewards')}</h3> + </CardHeader> + <Separator style={{ margin: '0 0 1.5rem 0', border: 0 }} /> + <CardHeader> + <h4>{t('rewards.stakedBalance')}</h4> + <h2> + <Token /> + <Odometer + value={minDecimalPlaces( + new BigNumber(currentStake).toFormat(), + 2 + )} + zeroDecimals={2} + /> + <CardLabel> + <FiatValue tokenBalance={currentStake} currency={currency} /> + </CardLabel> + </h2> + </CardHeader> + <Separator /> + <div style={{ padding: '0.5rem' }}> + <h3> + <button + type="button" + onClick={() => setShowCommissionAdjusted(!showAdjusted)} + > + <FontAwesomeIcon + icon={showAdjusted ? faToggleOn : faToggleOff} + style={{ + color: showAdjusted + ? 'var(--accent-color-primary)' + : 'var(--text-color-tertiary)', + marginRight: '0.8rem', + }} + transform={'grow-6'} + /> + {t('rewards.deductAvgCommissionOf', { + commission: avgCommission, + })} + </button> + </h3> + </div> + <RewardGrid.Root> + <RewardGrid.Head> + <RewardGrid.Cells + items={[ + <h4>{t('rewards.period')}</h4>, + <h4> + <Token /> + {unit} + </h4>, + <h4>{currency}</h4>, + ]} + /> + </RewardGrid.Head> + <RewardGrid.Row> + <RewardGrid.Cell> + <RewardGrid.Label>{t('rewards.daily')}</RewardGrid.Label> + </RewardGrid.Cell> + <RewardGrid.Cell> + <h3> + {dailyReward > 0 && <FontAwesomeIcon icon={faCaretUp} />} + {dailyReward.toLocaleString('en-US', { + minimumFractionDigits: 3, + maximumFractionDigits: 3, + })} + </h3> + </RewardGrid.Cell> + <RewardGrid.Cell> + <h3> + {dailyReward > 0 && tokenPrice > 0 && ( + <FontAwesomeIcon icon={faCaretUp} /> + )} + {symbol} + {(dailyReward * tokenPrice).toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + </h3> + </RewardGrid.Cell> + </RewardGrid.Row> + <RewardGrid.Row> + <RewardGrid.Cells + items={[ + <RewardGrid.Label>{t('rewards.monthly')}</RewardGrid.Label>, + <h3> + {monthlyReward > 0 && ( + <FontAwesomeIcon icon={faCaretUp} /> + )} + {monthlyReward.toLocaleString('en-US', { + minimumFractionDigits: 3, + maximumFractionDigits: 3, + })} + </h3>, + <h3> + {monthlyReward > 0 && tokenPrice > 0 && ( + <FontAwesomeIcon icon={faCaretUp} /> + )} + {symbol} + {(monthlyReward * tokenPrice).toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + </h3>, + ]} + /> + </RewardGrid.Row> + <RewardGrid.Row> + <RewardGrid.Cells + items={[ + <RewardGrid.Label>{t('rewards.annual')}</RewardGrid.Label>, + <h3> + {annualReward > 0 && <FontAwesomeIcon icon={faCaretUp} />} + {annualReward.toLocaleString('en-US', { + minimumFractionDigits: 3, + maximumFractionDigits: 3, + })} + </h3>, + <h3> + {annualReward > 0 && tokenPrice > 0 && ( + <FontAwesomeIcon icon={faCaretUp} /> + )} + {symbol} + {(annualReward * tokenPrice).toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + </h3>, + ]} + /> + </RewardGrid.Row> + </RewardGrid.Root> + </CardWrapper> + </Page.Row> + )} + </> + ) +} diff --git a/packages/app/src/pages/Payouts/PayoutList/index.tsx b/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx similarity index 97% rename from packages/app/src/pages/Payouts/PayoutList/index.tsx rename to packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx index 9b0c9eadb1..2e38805c99 100644 --- a/packages/app/src/pages/Payouts/PayoutList/index.tsx +++ b/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx @@ -47,9 +47,11 @@ export const PayoutListInner = ({ const { bondedPools } = useBondedPools() const { getValidators } = useValidators() const { getThemeValue } = useThemeValues() - const { listFormat, setListFormat } = useList() - - const [page, setPage] = useState<number>(1) + const { + listFormat, + setListFormat, + pagination: { page, setPage }, + } = useList() // Manipulated list (ordering, filtering) of payouts const [payouts, setPayouts] = useState<RewardResults>(initialPayouts) @@ -76,7 +78,13 @@ export const PayoutListInner = ({ const listPayouts = payouts.slice(pageStart).slice(0, itemsPerPage) if (!listPayouts.length) { - return null + return ( + <ListWrapper> + <div> + <h3>{t('payouts.noRecentPayouts')}.</h3> + </div> + </ListWrapper> + ) } return ( diff --git a/packages/app/src/pages/Rewards/RecentPayouts/index.tsx b/packages/app/src/pages/Rewards/RecentPayouts/index.tsx new file mode 100644 index 0000000000..b8f50ec211 --- /dev/null +++ b/packages/app/src/pages/Rewards/RecentPayouts/index.tsx @@ -0,0 +1,26 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { CardWrapper } from 'library/Card/Wrappers' +import { useTranslation } from 'react-i18next' +import { Page } from 'ui-core/base' +import type { PageProps } from '../types' +import { PayoutList } from './PayoutList' + +export const RecentPayouts = (props: PageProps) => { + const { payoutsList } = props + const { t } = useTranslation('pages') + + return ( + <Page.Row> + <CardWrapper> + <PayoutList + title={t('payouts.recentPayouts')} + payouts={payoutsList} + pagination + itemsPerPage={50} + /> + </CardWrapper> + </Page.Row> + ) +} diff --git a/packages/app/src/pages/Payouts/Stats/LastEraPayout.tsx b/packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx similarity index 100% rename from packages/app/src/pages/Payouts/Stats/LastEraPayout.tsx rename to packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx diff --git a/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx b/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx new file mode 100644 index 0000000000..5b00e7c2da --- /dev/null +++ b/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx @@ -0,0 +1,26 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { faCalculator } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { Button } from 'library/StatCards/Button' +import { useTranslation } from 'react-i18next' + +export const RewardCalculator = ({ onClick }: { onClick: () => void }) => { + const { t } = useTranslation('pages') + + const params = { + Icon: ( + <FontAwesomeIcon + icon={faCalculator} + color="var(--accent-color-primary" + style={{ marginLeft: '0.25rem', height: '2.1rem' }} + /> + ), + label: t('rewards.useCustomAmount'), + title: t('rewards.rewardsCalculator'), + onClick, + } + + return <Button {...params} /> +} diff --git a/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx b/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx new file mode 100644 index 0000000000..a0c660aa4a --- /dev/null +++ b/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx @@ -0,0 +1,86 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { planckToUnit } from '@w3ux/utils' +import BigNumber from 'bignumber.js' +import { useActiveAccounts } from 'contexts/ActiveAccounts' +import { useApi } from 'contexts/Api' +import { useBalances } from 'contexts/Balances' +import { useNetwork } from 'contexts/Network' +import { useStaking } from 'contexts/Staking' +import { useErasPerDay } from 'hooks/useErasPerDay' +import { Ticker } from 'library/StatCards/Ticker' +import { + fetchNominatorRewardTrend, + fetchPoolRewardTrend, +} from 'plugin-staking-api' +import type { RewardTrend as IRewardTrend } from 'plugin-staking-api/types' +import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' + +export const RewardTrend = () => { + const { t } = useTranslation('pages') + const { + network, + networkData: { unit, units }, + } = useNetwork() + const { activeEra } = useApi() + const { inSetup } = useStaking() + const { erasPerDay } = useErasPerDay() + const { getPoolMembership } = useBalances() + const { activeAccount } = useActiveAccounts() + + const membership = getPoolMembership(activeAccount) + const eras = erasPerDay.multipliedBy(30).toNumber() + // NOTE: 30 day duration in seconds + const duration = 2592000 + + // Store the reward trend result + const [rewardTrend, setRewardTrend] = useState<IRewardTrend | null>(null) + + // Fetch the reward trend on account, network changes. Ensure the active era is greater than 0 + const getRewardTrend = async () => { + if (activeAccount && activeEra.index.isGreaterThan(0)) { + const result = membership + ? await fetchPoolRewardTrend(network, activeAccount, duration) + : await fetchNominatorRewardTrend(network, activeAccount, eras) + setRewardTrend(result) + } + } + + useEffect(() => { + setRewardTrend(null) + if (!inSetup() || membership) { + getRewardTrend() + } + }, [ + activeAccount, + network, + activeEra.index.toString(), + membership, + inSetup(), + ]) + + // Format the reward trend data + let value = '0' + let direction: 'up' | 'down' | undefined = undefined + let changePercent = '0' + if (rewardTrend) { + const { reward, change } = rewardTrend + value = reward + direction = Number(change.percent) > 0 ? 'up' : 'down' + changePercent = new BigNumber(change.percent).toFormat(2) + } + + const params = { + label: t('rewards.last30DayReward'), + value: new BigNumber(planckToUnit(value, units)) + .decimalPlaces(3) + .toFormat(), + decimals: 3, + unit, + direction, + changePercent, + } + return <Ticker {...params} /> +} diff --git a/packages/app/src/pages/Payouts/Wrappers.ts b/packages/app/src/pages/Rewards/Wrappers.ts similarity index 94% rename from packages/app/src/pages/Payouts/Wrappers.ts rename to packages/app/src/pages/Rewards/Wrappers.ts index 9969f0c413..cd711370e1 100644 --- a/packages/app/src/pages/Payouts/Wrappers.ts +++ b/packages/app/src/pages/Rewards/Wrappers.ts @@ -1,10 +1,14 @@ // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors // SPDX-License-Identifier: GPL-3.0-only -import { motion } from 'framer-motion' import styled from 'styled-components' -export const ItemWrapper = styled(motion.div)` +export const Wrapper = styled.div` + display: flex; + flex-flow: column wrap; +` + +export const ItemWrapper = styled.div` padding: 0.5rem; width: 100%; diff --git a/packages/app/src/pages/Rewards/index.tsx b/packages/app/src/pages/Rewards/index.tsx new file mode 100644 index 0000000000..e90535cff7 --- /dev/null +++ b/packages/app/src/pages/Rewards/index.tsx @@ -0,0 +1,131 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { MaxPayoutDays } from 'consts' +import { useActiveAccounts } from 'contexts/ActiveAccounts' +import { useApi } from 'contexts/Api' +import { useNetwork } from 'contexts/Network' +import { usePlugins } from 'contexts/Plugins' +import { getUnixTime } from 'date-fns' +import { removeNonZeroAmountAndSort } from 'library/Graphs/Utils' +import { fetchPoolRewards, fetchRewards } from 'plugin-staking-api' +import type { NominatorReward, RewardResults } from 'plugin-staking-api/types' +import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Page } from 'ui-core/base' +import { Overview } from './Overview' +import { RecentPayouts } from './RecentPayouts' +import { Wrapper } from './Wrappers' +import type { PayoutGraphData } from './types' + +export const Rewards = () => { + const { t } = useTranslation() + const { activeEra } = useApi() + const { network } = useNetwork() + const { pluginEnabled } = usePlugins() + const { activeAccount } = useActiveAccounts() + + // Store page active tab + const [activeTab, setActiveTab] = useState<number>(0) + + // Store payouts list in state, fetched by Staking API + const [payoutsList, setPayoutsList] = useState<RewardResults>([]) + + // Store whether data is being fetched + const [loading, setLoading] = useState<boolean>(false) + + // Store payout graph data. + const [payoutGraphData, setPayoutGraphData] = useState<PayoutGraphData>({ + payouts: [], + unclaimedPayouts: [], + poolClaims: [], + }) + + // Payouts list props to pass to each tab + const pageProps = { + payoutsList, + setPayoutsList, + } + + // Get payout data on account or staking api toggle + const getPayoutData = async () => { + const fromDate = new Date() + fromDate.setDate(fromDate.getDate() - MaxPayoutDays) + fromDate.setHours(0, 0, 0, 0) + + const [allRewards, poolRewards] = await Promise.all([ + fetchRewards( + network, + activeAccount || '', + Math.max(activeEra.index.minus(1).toNumber(), 0) + ), + fetchPoolRewards(network, activeAccount || '', getUnixTime(fromDate)), + ]) + + const payouts = + allRewards.filter((reward: NominatorReward) => reward.claimed === true) ?? + [] + const unclaimedPayouts = + allRewards.filter( + (reward: NominatorReward) => reward.claimed === false + ) ?? [] + const poolClaims = poolRewards ?? [] + + // Filter zero rewards and order via timestamp, most recent first + setPayoutsList( + removeNonZeroAmountAndSort( + (allRewards as RewardResults).concat(poolClaims) as RewardResults + ) + ) + setPayoutGraphData({ payouts, unclaimedPayouts, poolClaims }) + setLoading(false) + } + + // Fetch payout data on account or staking api toggle + useEffect(() => { + if (!pluginEnabled('staking_api')) { + setPayoutsList([]) + setPayoutGraphData({ + payouts: [], + unclaimedPayouts: [], + poolClaims: [], + }) + } else if (activeAccount && activeEra.index.isGreaterThan(0)) { + setLoading(true) + getPayoutData() + } + }, [network, activeAccount, pluginEnabled('staking_api'), activeEra.index]) + + // Reset payout list state on account change + useEffect(() => { + setPayoutsList([]) + }, [activeAccount]) + + return ( + <Wrapper> + <Page.Title + title={t('rewards', { ns: 'modals' })} + tabs={[ + { + title: t('overview', { ns: 'base' }), + active: activeTab === 0, + onClick: () => setActiveTab(0), + }, + { + title: t('payouts.recentPayouts', { ns: 'pages' }), + active: activeTab === 1, + onClick: () => setActiveTab(1), + }, + ]} + /> + {activeTab === 0 && ( + <Overview + {...pageProps} + payoutGraphData={payoutGraphData} + loading={loading} + /> + )} + {activeTab === 1 && <RecentPayouts {...pageProps} />} + </Wrapper> + ) +} diff --git a/packages/app/src/pages/Rewards/types.ts b/packages/app/src/pages/Rewards/types.ts new file mode 100644 index 0000000000..45f641aa52 --- /dev/null +++ b/packages/app/src/pages/Rewards/types.ts @@ -0,0 +1,44 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { AnyApi } from 'common-types' +import type { + NominatorReward, + PoolReward, + RewardResults, +} from 'plugin-staking-api/types' +import type { Dispatch, SetStateAction } from 'react' + +export type PayoutHistoryProps = PageProps & { + loading: boolean + payoutGraphData: PayoutGraphData +} + +export interface PayoutGraphData { + payouts: NominatorReward[] + unclaimedPayouts: NominatorReward[] + poolClaims: PoolReward[] +} +export interface PageProps { + payoutsList: RewardResults + setPayoutsList: Dispatch<SetStateAction<RewardResults>> +} + +export interface PayoutListProps { + allowMoreCols?: boolean + pagination?: boolean + title?: string | null + itemsPerPage: number + payoutsList?: AnyApi + payouts?: AnyApi +} + +export interface CalculatorMetrics { + currentStake: number + averageRewardRate: number + isInPool: boolean + historicalRewards: { + total: number + totalUsdt: number + } +} diff --git a/packages/locales/src/resources/cn/base.json b/packages/locales/src/resources/cn/base.json index 98309c05a6..8db06f604e 100644 --- a/packages/locales/src/resources/cn/base.json +++ b/packages/locales/src/resources/cn/base.json @@ -40,6 +40,7 @@ }, "pools": "提名池", "resources": "信息", + "rewards": "奖励", "stake": "抵押", "support": "支持", "time": { diff --git a/packages/locales/src/resources/cn/pages.json b/packages/locales/src/resources/cn/pages.json index f22cfadcac..289a77e12b 100644 --- a/packages/locales/src/resources/cn/pages.json +++ b/packages/locales/src/resources/cn/pages.json @@ -105,6 +105,8 @@ "nominating": "提名中", "notStaking": "无抵押", "overview": "概述", + "paidOutLastEraSubtitle": "上一个Era支付给质押者的总奖励金额.", + "paidOutLastEraTitle": "已在上个Era支付.", "pool": "提名池", "poolMembersBonding": "名成员正在提名池活跃质押中", "proxy": "代理账户", @@ -127,6 +129,7 @@ "deductedFromBond": "从质押里扣除", "fromPool": "从提名池", "lastEraPayout": "上Era收益", + "noRecentPayouts": "最近无收益", "none": "无", "notStaking": "无抵押", "payout": "收益", @@ -227,6 +230,25 @@ "withdrawFunds": "取款", "withdrawUnlock": "请取出己解锁金额以继续关闭池" }, + "rewards": { + "adjustStake": "调整质押", + "annual": "每年", + "averageRewardRate": "平均奖励率", + "calculator": "计算器", + "daily": "每日", + "deductAvgCommissionOf": "扣除平均佣金{{commission}}", + "last30DayReward": "过去30天的奖励", + "monthly": "每月", + "period": "期间", + "projectedRewards": "预计奖励", + "rewardCalcSubtitle": "输入 {{unit}} 的质押金额并计算潜在奖励.", + "rewardCalculator": "奖励计算器", + "rewardsCalculator": "奖励计算器", + "stakePlaceholder": "例如 100", + "stakedBalance": "质押余额", + "unitAmount": "{{unit}}数量:", + "useCustomAmount": "自定义金额" + }, "validators": { "activeValidators": "活跃验证人", "allValidators": "所有验证人", diff --git a/packages/locales/src/resources/en/base.json b/packages/locales/src/resources/en/base.json index 2fb1c84aff..d168243f43 100644 --- a/packages/locales/src/resources/en/base.json +++ b/packages/locales/src/resources/en/base.json @@ -40,6 +40,7 @@ }, "pools": "Pools", "resources": "Resources", + "rewards": "Rewards", "stake": "Stake", "support": "Support", "time": { diff --git a/packages/locales/src/resources/en/pages.json b/packages/locales/src/resources/en/pages.json index 15394aafd7..8849c1578e 100644 --- a/packages/locales/src/resources/en/pages.json +++ b/packages/locales/src/resources/en/pages.json @@ -107,6 +107,8 @@ "nominating": "Nominating", "notStaking": "Not Staking", "overview": "Overview", + "paidOutLastEraSubtitle": "Total amount paid out as rewards in the last era to stakers.", + "paidOutLastEraTitle": "was paid out in the last era.", "pool": "Pool", "poolMembersBonding": "pool members are actively bonding in pools.", "proxy": "Proxy", @@ -129,6 +131,7 @@ "deductedFromBond": "Deducted from bond", "fromPool": "From Pool", "lastEraPayout": "Last Era Payout", + "noRecentPayouts": "No Recent Payouts", "none": "None", "notStaking": "Not Staking", "payout": "Payout", @@ -230,6 +233,25 @@ "withdrawFunds": "Withdraw Funds", "withdrawUnlock": "Withdraw your unlock chunk to proceed with pool closure." }, + "rewards": { + "adjustStake": "Adjust Your Stake", + "annual": "Annual", + "averageRewardRate": "Average Reward Rate", + "calculator": "Calculator", + "daily": "Daily", + "deductAvgCommissionOf": "Deduct average commission of {{commission}}%", + "last30DayReward": "Last 30 Days Reward", + "monthly": "Monthly", + "period": "Period", + "projectedRewards": "Projected Rewards", + "rewardCalcSubtitle": "Enter a {{unit}} amount to stake and calculate the potential rewards.", + "rewardCalculator": "Reward Calculator", + "rewardsCalculator": "Rewards Calculator", + "stakePlaceholder": "e.g. 100", + "stakedBalance": "Staked Balance", + "unitAmount": "{{unit}} Amount", + "useCustomAmount": "Use Custom Amount" + }, "validators": { "activeValidators": "Active Validators", "allValidators": "All Validators", diff --git a/packages/locales/src/resources/es/base.json b/packages/locales/src/resources/es/base.json index e9a25d5994..85a3af36b0 100644 --- a/packages/locales/src/resources/es/base.json +++ b/packages/locales/src/resources/es/base.json @@ -40,6 +40,7 @@ }, "pools": "Pools", "resources": "Recursos", + "rewards": "Recompensas", "stake": "Stakear", "support": "Soporte", "time": { diff --git a/packages/locales/src/resources/es/pages.json b/packages/locales/src/resources/es/pages.json index 436e2602e0..9594d30d0a 100644 --- a/packages/locales/src/resources/es/pages.json +++ b/packages/locales/src/resources/es/pages.json @@ -107,6 +107,8 @@ "nominating": "Nominando", "notStaking": "Sin Hacer Staking", "overview": "Resumen", + "paidOutLastEraSubtitle": "Importe total pagado como recompensa en la última era a los stakers.", + "paidOutLastEraTitle": "se pagó en la última era.", "pool": "Pool", "poolMembersBonding": "miembros de Pools están vinculando activamente en Pools.", "proxy": "Proxy", @@ -129,6 +131,7 @@ "deductedFromBond": "Deducido de la Vinculación", "fromPool": "Del Pool", "lastEraPayout": "Último Pago de Era", + "noRecentPayouts": "Sin Pagos Recientes", "none": "Ninguno", "notStaking": "Sin Hacer Staking", "payout": "Pago", @@ -230,6 +233,25 @@ "withdrawFunds": "Retirar fondos", "withdrawUnlock": "Retira tu fragmento de desvinculación para proceder con el cierre del Pool." }, + "rewards": { + "adjustStake": "Ajustar tu Stake", + "annual": "Anual", + "averageRewardRate": "Tasa de Recompensa", + "calculator": "Calculadora", + "daily": "Diario", + "deductAvgCommissionOf": "Deducir la comisión promedio de {{commission}}%", + "last30DayReward": "Recompensa de los últimos 30 días", + "monthly": "Mensual", + "period": "Período", + "projectedRewards": "Recompensas Proyectadas", + "rewardCalcSubtitle": "Ingrese una cantidad de {{unit}} para apostar y calcule las recompensas potenciales.", + "rewardCalculator": "Calculadora de Recompensas", + "rewardsCalculator": "Calculadora de Recompensas", + "stakePlaceholder": "ej. 100", + "stakedBalance": "Balance en Staking", + "unitAmount": "{{unit}} Cantidad", + "useCustomAmount": "Usar Cantidad Personalizada" + }, "validators": { "activeValidators": "Validadores Activos", "allValidators": "Todos los Validadores", diff --git a/packages/plugin-staking-api/src/index.tsx b/packages/plugin-staking-api/src/index.tsx index 174b01ff52..809f14b2d5 100644 --- a/packages/plugin-staking-api/src/index.tsx +++ b/packages/plugin-staking-api/src/index.tsx @@ -6,9 +6,11 @@ import { ApolloProvider } from '@apollo/client' export * from './Client' export * from './queries/activeValidatorRanks' export * from './queries/canFastUnstake' +export * from './queries/nominatorRewardTrend' export * from './queries/poolCandidates' export * from './queries/poolEraPoints' export * from './queries/poolRewards' +export * from './queries/poolRewardTrend' export * from './queries/rewards' export * from './queries/tokenPrice' export * from './queries/unclaimedRewards' diff --git a/packages/plugin-staking-api/src/queries/nominatorRewardTrend.tsx b/packages/plugin-staking-api/src/queries/nominatorRewardTrend.tsx new file mode 100644 index 0000000000..9f78d33580 --- /dev/null +++ b/packages/plugin-staking-api/src/queries/nominatorRewardTrend.tsx @@ -0,0 +1,50 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { gql, useQuery } from '@apollo/client' +import { client } from '../Client' +import type { RewardTrendResult } from '../types' + +const QUERY = gql` + query NominatorRewardTrend($network: String!, $who: String!, $eras: Int!) { + nominatorRewardTrend(network: $network, who: $who, eras: $eras) { + reward + previous + change { + percent + value + } + } + } +` + +export const useNominatorRewardTrend = ({ + network, + who, + eras, +}: { + network: string + who: string + eras: number +}): RewardTrendResult => { + const { loading, error, data, refetch } = useQuery(QUERY, { + variables: { network, who, eras }, + }) + return { loading, error, data, refetch } +} + +export const fetchNominatorRewardTrend = async ( + network: string, + who: string, + eras: number +) => { + try { + const result = await client.query({ + query: QUERY, + variables: { network, who, eras }, + }) + return result.data.nominatorRewardTrend + } catch (error) { + return null + } +} diff --git a/packages/plugin-staking-api/src/queries/poolRewardTrend.tsx b/packages/plugin-staking-api/src/queries/poolRewardTrend.tsx new file mode 100644 index 0000000000..f38ecd73ad --- /dev/null +++ b/packages/plugin-staking-api/src/queries/poolRewardTrend.tsx @@ -0,0 +1,50 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { gql, useQuery } from '@apollo/client' +import { client } from '../Client' +import type { RewardTrendResult } from '../types' + +const QUERY = gql` + query PoolRewardTrend($network: String!, $who: String!, $duration: Int!) { + poolRewardTrend(network: $network, who: $who, duration: $duration) { + reward + previous + change { + percent + value + } + } + } +` + +export const usePoolRewardTrend = ({ + network, + who, + duration, +}: { + network: string + who: string + duration: number +}): RewardTrendResult => { + const { loading, error, data, refetch } = useQuery(QUERY, { + variables: { network, who, duration }, + }) + return { loading, error, data, refetch } +} + +export const fetchPoolRewardTrend = async ( + network: string, + who: string, + duration: number +) => { + try { + const result = await client.query({ + query: QUERY, + variables: { network, who, duration }, + }) + return result.data.poolRewardTrend + } catch (error) { + return null + } +} diff --git a/packages/plugin-staking-api/src/queries/poolRewards.tsx b/packages/plugin-staking-api/src/queries/poolRewards.tsx index 342665e710..0261e6ed32 100644 --- a/packages/plugin-staking-api/src/queries/poolRewards.tsx +++ b/packages/plugin-staking-api/src/queries/poolRewards.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { gql, useQuery } from '@apollo/client' +import { client } from '../Client' import type { PoolRewardResults } from '../types' const QUERY = gql` @@ -29,3 +30,19 @@ export const usePoolRewards = ({ }) return { loading, error, data, refetch } } + +export const fetchPoolRewards = async ( + network: string, + who: string, + from: number +) => { + try { + const result = await client.query({ + query: QUERY, + variables: { network, who, from }, + }) + return result.data.poolRewards + } catch (error) { + return null + } +} diff --git a/packages/plugin-staking-api/src/queries/rewards.tsx b/packages/plugin-staking-api/src/queries/rewards.tsx index 27eb88575d..cdbd09008d 100644 --- a/packages/plugin-staking-api/src/queries/rewards.tsx +++ b/packages/plugin-staking-api/src/queries/rewards.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { gql, useQuery } from '@apollo/client' +import { client } from '../Client' import type { AllRewardsResult } from '../types' const QUERY = gql` @@ -31,3 +32,19 @@ export const useRewards = ({ }) return { loading, error, data, refetch } } + +export const fetchRewards = async ( + network: string, + who: string, + fromEra: number +) => { + try { + const result = await client.query({ + query: QUERY, + variables: { network, who, fromEra }, + }) + return result.data.allRewards + } catch (error) { + return null + } +} diff --git a/packages/plugin-staking-api/src/types.ts b/packages/plugin-staking-api/src/types.ts index 5483bb24ca..f713ea6af8 100644 --- a/packages/plugin-staking-api/src/types.ts +++ b/packages/plugin-staking-api/src/types.ts @@ -84,6 +84,21 @@ export type CanFastUnstakeResult = Query & { } } +export type RewardTrendResult = Query & { + data: { + rewardTrend: RewardTrend + } +} + +export interface RewardTrend { + reward: string + previous: string + change: { + percent: string + value: string + } +} + export type ActiveValidatorRanksResult = Query & { data: { activeValidatorRanks: ActiveValidatorRank[] diff --git a/packages/styles/theme/index.scss b/packages/styles/theme/index.scss index aa594c7c39..6a8f29f1f4 100644 --- a/packages/styles/theme/index.scss +++ b/packages/styles/theme/index.scss @@ -125,6 +125,10 @@ ellipse.accent { fill: var(--accent-color-primary); } +label { + color: var(--text-color-primary); +} + .page-padding { padding-left: 1.25rem; padding-right: 1.25rem; diff --git a/packages/styles/theme/theme.scss b/packages/styles/theme/theme.scss index ca95891f58..48b0d58c70 100644 --- a/packages/styles/theme/theme.scss +++ b/packages/styles/theme/theme.scss @@ -37,7 +37,7 @@ SPDX-License-Identifier: GPL-3.0-only */ --background-status-overlay: rgb(255 255 255 / 85%); --background-menu: #eaeaea; --background-input: #fdfdfd; - --border-primary-color: #e4e4e4; + --border-primary-color: #e2e2e2; --border-secondary-color: #cfcccc; --button-primary-background: #efeeee; --button-secondary-background: #e7e5e5; diff --git a/packages/ui-core/package.json b/packages/ui-core/package.json index 947dc89e93..dbb36a090c 100644 --- a/packages/ui-core/package.json +++ b/packages/ui-core/package.json @@ -10,6 +10,7 @@ "exports": { "./base": "./src/base/index.tsx", "./canvas": "./src/canvas/index.tsx", + "./input": "./src/input/index.tsx", "./list": "./src/list/index.tsx", "./modal": "./src/modal/index.tsx", "./overlay": "./src/overlay/index.tsx", diff --git a/packages/ui-core/src/base/CardHeader/index.module.scss b/packages/ui-core/src/base/CardHeader/index.module.scss index 3e6f80e724..b530967d96 100644 --- a/packages/ui-core/src/base/CardHeader/index.module.scss +++ b/packages/ui-core/src/base/CardHeader/index.module.scss @@ -9,11 +9,13 @@ justify-content: center; padding: 0rem 0.25rem; width: 100%; + &.action { flex-direction: row; align-items: center; justify-content: none; } + &.margin { margin-bottom: 1rem; } diff --git a/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss b/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss new file mode 100644 index 0000000000..042c1a78b3 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss @@ -0,0 +1,21 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.cell { + > h3, + h4 { + display: flex; + align-items: center; + } + > h4 > svg { + margin-right: 0.5rem; + width: 1.5rem; + } + > h3 { + font-family: Inter, sans-serif; + svg { + color: var(--status-success-color); + margin-right: 0.6rem; + } + } +} \ No newline at end of file diff --git a/packages/ui-core/src/base/RewardGrid/Cell/index.tsx b/packages/ui-core/src/base/RewardGrid/Cell/index.tsx new file mode 100644 index 0000000000..72064c2c36 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Cell/index.tsx @@ -0,0 +1,11 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import classes from './index.module.scss' + +export const Cell = ({ children, style }: ComponentBase) => ( + <div className={classes.cell} style={style}> + {children} + </div> +) diff --git a/packages/ui-core/src/base/RewardGrid/Cells/index.tsx b/packages/ui-core/src/base/RewardGrid/Cells/index.tsx new file mode 100644 index 0000000000..c06f40a3ed --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Cells/index.tsx @@ -0,0 +1,12 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import type { ReactNode } from 'react' +import { Cell } from '../Cell' + +export const Cells = ({ + items, +}: ComponentBase & { + items: React.ReactNode[] +}): ReactNode => items.map((item, i) => <Cell key={`cell_${i}`}>{item}</Cell>) diff --git a/packages/ui-core/src/base/RewardGrid/Head/index.module.scss b/packages/ui-core/src/base/RewardGrid/Head/index.module.scss new file mode 100644 index 0000000000..30fef97a1b --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Head/index.module.scss @@ -0,0 +1,12 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.head { + border-bottom: 1px solid var(--border-primary-color); + grid-template-columns: repeat(3, 1fr); + display: grid; + > div > h4 { + color: var(--text-color-tertiary); + font-family: InterSemiBold, sans-serif; + } +} \ No newline at end of file diff --git a/packages/ui-core/src/base/RewardGrid/Head/index.tsx b/packages/ui-core/src/base/RewardGrid/Head/index.tsx new file mode 100644 index 0000000000..c03a7799cd --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Head/index.tsx @@ -0,0 +1,17 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import classNames from 'classnames' +import commonClasses from '../common.module.scss' +import classes from './index.module.scss' + +export const Head = ({ children, style }: ComponentBase) => { + const allClasses = classNames(commonClasses.row, classes.head) + + return ( + <div className={allClasses} style={style}> + {children} + </div> + ) +} diff --git a/packages/ui-core/src/base/RewardGrid/Label/index.module.scss b/packages/ui-core/src/base/RewardGrid/Label/index.module.scss new file mode 100644 index 0000000000..ebb406eb1d --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Label/index.module.scss @@ -0,0 +1,6 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.label { + color: var(--text-color-secondary); +} diff --git a/packages/ui-core/src/base/RewardGrid/Label/index.tsx b/packages/ui-core/src/base/RewardGrid/Label/index.tsx new file mode 100644 index 0000000000..e4c827f687 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Label/index.tsx @@ -0,0 +1,11 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import classes from './index.module.scss' + +export const Label = ({ children, style }: ComponentBase) => ( + <h3 className={classes.label} style={style}> + {children} + </h3> +) diff --git a/packages/ui-core/src/base/RewardGrid/Root/index.module.scss b/packages/ui-core/src/base/RewardGrid/Root/index.module.scss new file mode 100644 index 0000000000..20acf0c855 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Root/index.module.scss @@ -0,0 +1,7 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.root { + margin-top: 0.5rem; + padding: 0 0.5rem; +} \ No newline at end of file diff --git a/packages/ui-core/src/base/RewardGrid/Root/index.tsx b/packages/ui-core/src/base/RewardGrid/Root/index.tsx new file mode 100644 index 0000000000..479f76b2d9 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Root/index.tsx @@ -0,0 +1,11 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import classes from './index.module.scss' + +export const Root = ({ children, style }: ComponentBase) => ( + <div className={classes.root} style={style}> + {children} + </div> +) diff --git a/packages/ui-core/src/base/RewardGrid/Row/index.module.scss b/packages/ui-core/src/base/RewardGrid/Row/index.module.scss new file mode 100644 index 0000000000..90384892f5 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Row/index.module.scss @@ -0,0 +1,14 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.body { + border-bottom: 1px solid var(--border-primary-color); + display: grid; + grid-template-columns: repeat(3, 1fr); + padding: 1.05rem 0; + + &:last-child { + border-bottom: none; + padding-bottom: 0.5rem; + } +} \ No newline at end of file diff --git a/packages/ui-core/src/base/RewardGrid/Row/index.tsx b/packages/ui-core/src/base/RewardGrid/Row/index.tsx new file mode 100644 index 0000000000..bff66e4b6e --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/Row/index.tsx @@ -0,0 +1,17 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import classNames from 'classnames' +import commonClasses from '../common.module.scss' +import classes from './index.module.scss' + +export const Row = ({ children, style }: ComponentBase) => { + const allClasses = classNames(commonClasses.row, classes.body) + + return ( + <div className={allClasses} style={style}> + {children} + </div> + ) +} diff --git a/packages/ui-core/src/base/RewardGrid/common.module.scss b/packages/ui-core/src/base/RewardGrid/common.module.scss new file mode 100644 index 0000000000..671f67d195 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/common.module.scss @@ -0,0 +1,6 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.row { + padding: 0.6rem 0; +} \ No newline at end of file diff --git a/packages/ui-core/src/base/RewardGrid/index.tsx b/packages/ui-core/src/base/RewardGrid/index.tsx new file mode 100644 index 0000000000..c841314c27 --- /dev/null +++ b/packages/ui-core/src/base/RewardGrid/index.tsx @@ -0,0 +1,20 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { Cell } from './Cell' +import { Cells } from './Cells' +import { Head } from './Head' +import { Label } from './Label' +import { Root } from './Root' +import { Row } from './Row' + +export const RewardGrid = { + Root, + Head, + Row, + Cell, + Cells, + Label, +} + +export default RewardGrid diff --git a/packages/ui-core/src/base/Separator/index.module.scss b/packages/ui-core/src/base/Separator/index.module.scss index 57676e1d69..35326f71b2 100644 --- a/packages/ui-core/src/base/Separator/index.module.scss +++ b/packages/ui-core/src/base/Separator/index.module.scss @@ -5,4 +5,12 @@ border-bottom: 1px solid var(--border-primary-color); margin: 0.67rem 0; width: 100%; + + &.lg { + margin: 1.2rem 0; + } + + &.transparent { + border: none; + } } diff --git a/packages/ui-core/src/base/Separator/index.tsx b/packages/ui-core/src/base/Separator/index.tsx index ada22f819b..9916f06cf9 100644 --- a/packages/ui-core/src/base/Separator/index.tsx +++ b/packages/ui-core/src/base/Separator/index.tsx @@ -2,14 +2,26 @@ // SPDX-License-Identifier: GPL-3.0-only import type { ComponentBase } from '@w3ux/types' +import classNames from 'classnames' import classes from './index.module.scss' /** * @name Separator * @summary A horizontal spacer with a bottom border. General spacer for separating content by row. */ -export const Separator = ({ children, style }: ComponentBase) => ( - <div className={classes.separator} style={style}> - {children} - </div> -) +export const Separator = ({ + children, + style, + transparent, + lg, +}: ComponentBase & { transparent?: boolean; lg?: boolean }) => { + const allClasses = classNames(classes.separator, { + [classes.transparent]: !!transparent, + [classes.lg]: !!lg, + }) + return ( + <div className={allClasses} style={style}> + {children} + </div> + ) +} diff --git a/packages/ui-core/src/base/Stat/Card/index.module.scss b/packages/ui-core/src/base/Stat/Card/index.module.scss index 8da78e66aa..0533d5e564 100644 --- a/packages/ui-core/src/base/Stat/Card/index.module.scss +++ b/packages/ui-core/src/base/Stat/Card/index.module.scss @@ -8,7 +8,9 @@ flex: 1; flex-basis: 100%; margin-bottom: 1rem; + position: relative; transition: transform var(--transition-duration); + &:hover { transform: scale(1.02); } @@ -22,13 +24,14 @@ max-width: 300px; } - > div { + > div, > button { background: var(--background-primary); box-shadow: var(--card-shadow-secondary); + border: 1px solid transparent; display: flex; border-radius: 1rem; margin-right: 1.25rem; - padding: 0.9rem 0rem; + padding: 0.75rem 0rem; max-height: 5.25rem; flex-flow: row wrap; @@ -65,4 +68,18 @@ padding: 0.9rem 0; } } + + &.button { + &:hover { + transform: none; + } + } + + > button { + border: 1px solid var(--accent-color-pending); + transition: border 0.1s; + &:hover { + border: 1px solid var(--accent-color-primary); + } + } } diff --git a/packages/ui-core/src/base/Stat/Card/index.tsx b/packages/ui-core/src/base/Stat/Card/index.tsx index 465d171296..41fc87f219 100644 --- a/packages/ui-core/src/base/Stat/Card/index.tsx +++ b/packages/ui-core/src/base/Stat/Card/index.tsx @@ -2,14 +2,29 @@ // SPDX-License-Identifier: GPL-3.0-only import type { ComponentBase } from '@w3ux/types' +import classNames from 'classnames' import classes from './index.module.scss' /** * @name Card - * @summary Used to house a Stat item within a `StatRow`. + * @summary Used to house a Stat item within a `Stat.Row`. */ export const Card = ({ children, style }: ComponentBase) => ( <div className={classes.card} style={style}> {children} </div> ) + +/** + * @name Button + * @summary Used to house a Stat item as a button within a `Stat.Row`. + */ +export const Button = ({ children, style }: ComponentBase) => { + const allClasses = classNames(classes.card, classes.button) + + return ( + <div className={allClasses} style={style}> + {children} + </div> + ) +} diff --git a/packages/ui-core/src/base/Stat/Graphic/index.module.scss b/packages/ui-core/src/base/Stat/Graphic/index.module.scss index 39ed6dfd92..aaf1ea87c7 100644 --- a/packages/ui-core/src/base/Stat/Graphic/index.module.scss +++ b/packages/ui-core/src/base/Stat/Graphic/index.module.scss @@ -2,5 +2,11 @@ // SPDX-License-Identifier: GPL-3.0-only .graphic { - padding-left: 0.9rem; -} + margin-left: 1rem; + display: flex; + align-items: center; + justify-content: center; + width: fit-content; + min-width: 1.75rem; + height: 100%; +} \ No newline at end of file diff --git a/packages/ui-core/src/base/Stat/Subtitle/index.module.scss b/packages/ui-core/src/base/Stat/Subtitle/index.module.scss index b1561ec4cf..fc9203d083 100644 --- a/packages/ui-core/src/base/Stat/Subtitle/index.module.scss +++ b/packages/ui-core/src/base/Stat/Subtitle/index.module.scss @@ -8,4 +8,11 @@ display: flex; flex-flow: row wrap; align-items: center; + + &.primary { + color: var(--accent-color-primary); + > svg { + margin-left: 0.5rem; + } + } } diff --git a/packages/ui-core/src/base/Stat/Subtitle/index.tsx b/packages/ui-core/src/base/Stat/Subtitle/index.tsx index 3f8a0eb2d0..008090f244 100644 --- a/packages/ui-core/src/base/Stat/Subtitle/index.tsx +++ b/packages/ui-core/src/base/Stat/Subtitle/index.tsx @@ -2,14 +2,27 @@ // SPDX-License-Identifier: GPL-3.0-only import type { ComponentBase } from '@w3ux/types' +import classNames from 'classnames' import classes from './index.module.scss' /** * @name Subtitle * @summary Used to house a subtitle for `StatCard` */ -export const Subtitle = ({ children, style }: ComponentBase) => ( - <h4 className={classes.subtitle} style={style}> - {children} - </h4> -) +export const Subtitle = ({ + children, + style, + primary, +}: ComponentBase & { + primary?: boolean +}) => { + const allClasses = classNames(classes.subtitle, { + [classes.primary]: !!primary, + }) + + return ( + <h4 className={allClasses} style={style}> + {children} + </h4> + ) +} diff --git a/packages/ui-core/src/base/Stat/Title/index.module.scss b/packages/ui-core/src/base/Stat/Title/index.module.scss index 0bba72c65b..1d0f6d097a 100644 --- a/packages/ui-core/src/base/Stat/Title/index.module.scss +++ b/packages/ui-core/src/base/Stat/Title/index.module.scss @@ -6,8 +6,16 @@ font-size: 1.2rem; display: flex; flex-flow: row wrap; + align-items: center; margin-top: 0.1rem; margin-bottom: 0.1rem; + + > svg { + margin-right: 0.5rem; + } + &.semibold { + font-family: InterSemiBold, sans-serif; + } &.primary { color: var(--accent-color-primary); } @@ -19,4 +27,23 @@ @media (min-width: 950px) { font-size: 1.25rem; } + + > label { + font-family: Inter, sans-serif; + margin-left: 0.5rem; + font-size: 1rem; + + &.success { + color: var(--status-success-color); + } + &.warning { + color: var(--status-warning-color); + } + &.error { + color: var(--status-error-color); + } + &.danger { + color: var(--status-danger-color); + } + } } diff --git a/packages/ui-core/src/base/Stat/Title/index.tsx b/packages/ui-core/src/base/Stat/Title/index.tsx index 0ee98d427f..41265b6d2c 100644 --- a/packages/ui-core/src/base/Stat/Title/index.tsx +++ b/packages/ui-core/src/base/Stat/Title/index.tsx @@ -14,11 +14,14 @@ export const Title = ({ style, primary, text, + semibold, }: ComponentBase & { primary?: boolean text?: boolean + semibold?: boolean }) => { const allClasses = classNames(classes.title, { + [classes.semibold]: !!semibold, [classes.primary]: !!primary, [classes.text]: !!text, }) diff --git a/packages/ui-core/src/base/Stat/index.tsx b/packages/ui-core/src/base/Stat/index.tsx index 6928cf54e0..1a4f9902f9 100644 --- a/packages/ui-core/src/base/Stat/index.tsx +++ b/packages/ui-core/src/base/Stat/index.tsx @@ -1,7 +1,7 @@ // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors // SPDX-License-Identifier: GPL-3.0-only -import { Card } from './Card' +import { Button, Card } from './Card' import { Content } from './Content' import { Graphic } from './Graphic' import { Row } from './Row' @@ -10,6 +10,7 @@ import { Title } from './Title' import { Total } from './Total' export const Stat = { + Button, Card, Content, Graphic, diff --git a/packages/ui-core/src/base/TokenFiat/index.module.scss b/packages/ui-core/src/base/TokenFiat/index.module.scss new file mode 100644 index 0000000000..d8ef527748 --- /dev/null +++ b/packages/ui-core/src/base/TokenFiat/index.module.scss @@ -0,0 +1,29 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.tokenFiat { + display: flex; + align-items: center; + color: var(--text-color-secondary); + font-family: InterSemiBold, sans-serif; + margin-top: 0.35rem; + margin-left: 0.4rem; + font-size: 1.1rem; + + > div { + &:first-child { + width: 3rem; + max-width: 3rem; + } + &:last-child { + padding-left: 0.8rem; + flex: 1; + > h1 { + margin-bottom: 0.5rem; + } + > h3 { + color: var(--text-color-tertiary); + } + } + } +} diff --git a/packages/ui-core/src/base/TokenFiat/index.tsx b/packages/ui-core/src/base/TokenFiat/index.tsx new file mode 100644 index 0000000000..af82ab2f29 --- /dev/null +++ b/packages/ui-core/src/base/TokenFiat/index.tsx @@ -0,0 +1,19 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ComponentBase } from '@w3ux/types' +import type { ReactNode } from 'react' +import classes from './index.module.scss' + +export const TokenFiat = ({ + children, + style, + Token, +}: ComponentBase & { + Token: ReactNode +}) => ( + <div className={classes.tokenFiat} style={style}> + <div>{Token}</div> + <div>{children}</div> + </div> +) diff --git a/packages/ui-core/src/base/index.tsx b/packages/ui-core/src/base/index.tsx index 1154d8675e..b059779b24 100644 --- a/packages/ui-core/src/base/index.tsx +++ b/packages/ui-core/src/base/index.tsx @@ -8,8 +8,10 @@ export * from './Countdown' export * from './Identity' export * from './Offline' export * from './Page' +export * from './RewardGrid' export * from './Separator' export * from './Spinner' export * from './Stat' +export * from './TokenFiat' export * from './Tooltip' export * from './TooltipArea' diff --git a/packages/ui-core/src/input/TokenInput/index.module.scss b/packages/ui-core/src/input/TokenInput/index.module.scss new file mode 100644 index 0000000000..1752990cbf --- /dev/null +++ b/packages/ui-core/src/input/TokenInput/index.module.scss @@ -0,0 +1,34 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +.tokenInput { + &.marginY { + margin: 1rem 0 1.25rem 0; + } + + &:focus-within label { + color: var(--accent-color-primary); + } + + > label { + color: var(--text-color-secondary); + font-family: InterSemiBold, sans-serif; + &:focus { + color: var(--accent-color-primary); + } + } + > input { + border: 1px solid var(--border-primary-color); + background: var(--background-default); + color: var(--text-color-primary); + border-radius: 1.5rem; + padding: 1rem 1.25rem; + width: 100%; + font-size: 1.3rem; + margin-top: 0.5rem; + + &:focus { + border-color: var(--accent-color-pending); + } + } +} \ No newline at end of file diff --git a/packages/ui-core/src/input/TokenInput/index.tsx b/packages/ui-core/src/input/TokenInput/index.tsx new file mode 100644 index 0000000000..af671dec7b --- /dev/null +++ b/packages/ui-core/src/input/TokenInput/index.tsx @@ -0,0 +1,31 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import classNames from 'classnames' +import type { TokenInputProps } from '../types' +import classes from './index.module.scss' + +export const TokenInput = ({ + onChange, + placeholder, + value, + marginY, + id, + label, +}: TokenInputProps) => { + const allClasses = classNames(classes.tokenInput, { + [classes.marginY]: !!marginY, + }) + + return ( + <div className={allClasses}> + <label htmlFor={id}>{label}</label> + <input + id={id} + value={value} + onChange={(e) => onChange(e)} + placeholder={placeholder} + /> + </div> + ) +} diff --git a/packages/ui-core/src/input/index.tsx b/packages/ui-core/src/input/index.tsx new file mode 100644 index 0000000000..ed4a03536a --- /dev/null +++ b/packages/ui-core/src/input/index.tsx @@ -0,0 +1,4 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +export * from './TokenInput' diff --git a/packages/ui-core/src/input/types.ts b/packages/ui-core/src/input/types.ts new file mode 100644 index 0000000000..f17622106d --- /dev/null +++ b/packages/ui-core/src/input/types.ts @@ -0,0 +1,13 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { ChangeEvent } from 'react' + +export interface TokenInputProps { + onChange: (e: ChangeEvent<HTMLInputElement>) => void + placeholder: string + value: string + marginY?: boolean + id: string + label: string +} diff --git a/packages/ui-core/src/modal/Scroll/index.module.scss b/packages/ui-core/src/modal/Scroll/index.module.scss index 7e1cd13f91..3452bfe3d1 100644 --- a/packages/ui-core/src/modal/Scroll/index.module.scss +++ b/packages/ui-core/src/modal/Scroll/index.module.scss @@ -8,6 +8,9 @@ max-height: 100%; width: 100%; max-width: 600px; + &.xs { + max-width: 425px; + } &.lg { max-width: 800px; } diff --git a/packages/ui-core/src/modal/Scroll/index.tsx b/packages/ui-core/src/modal/Scroll/index.tsx index 106dc3ca9f..00c24eb240 100644 --- a/packages/ui-core/src/modal/Scroll/index.tsx +++ b/packages/ui-core/src/modal/Scroll/index.tsx @@ -14,6 +14,7 @@ export const Scroll = forwardRef( ref?: ForwardedRef<HTMLDivElement> ) => { const allClasses = classNames(classes.scroll, commonClasses.scrollBar, { + [classes.xs]: size === 'xs', [classes.lg]: size === 'lg', [classes.xl]: size === 'xl', }) diff --git a/packages/ui-overlay/src/Provider/types.ts b/packages/ui-overlay/src/Provider/types.ts index b5175a2aef..a5eab8366d 100644 --- a/packages/ui-overlay/src/Provider/types.ts +++ b/packages/ui-overlay/src/Provider/types.ts @@ -66,7 +66,7 @@ export type ModalStatus = export type ConfigOptions = Record<string, AnyJson> -export type ModalSize = 'sm' | 'lg' | 'xl' +export type ModalSize = 'xs' | 'sm' | 'lg' | 'xl' export interface ModalConfig { key: string From db77b58f77871e5d53175bb1a750dc41d0dffa76 Mon Sep 17 00:00:00 2001 From: Ross Bulat <ross@jkrb.io> Date: Fri, 21 Feb 2025 20:33:49 +0700 Subject: [PATCH 02/18] feat(refactor): Flatten locale files, combine base & library into app (#2543) --- packages/app/package.json | 2 +- packages/app/src/Offline.tsx | 2 +- .../app/src/hooks/useAccountFromUrl/index.tsx | 2 +- .../src/hooks/useNominationStatus/index.tsx | 12 +- .../app/src/hooks/usePayeeConfig/index.tsx | 2 +- .../app/src/hooks/usePoolFilters/index.tsx | 2 +- .../src/hooks/useSubmitExtrinsic/index.tsx | 2 +- packages/app/src/hooks/useUnstaking/index.tsx | 2 +- .../src/hooks/useValidatorFilters/index.tsx | 2 +- .../src/library/Account/DefaultAccount.tsx | 2 +- .../app/src/library/Account/PoolAccount.tsx | 2 +- .../app/src/library/AccountInput/index.tsx | 2 +- .../app/src/library/BarChart/BondedChart.tsx | 2 +- packages/app/src/library/ButtonCopy/index.tsx | 2 +- packages/app/src/library/Countdown/index.tsx | 2 +- .../app/src/library/ErrorBoundary/index.tsx | 6 +- .../app/src/library/EstimatedTxFee/index.tsx | 2 +- .../src/library/Form/Bond/BondFeedback.tsx | 2 +- .../app/src/library/Form/Bond/BondInput.tsx | 2 +- .../Form/ClaimPermissionInput/index.tsx | 2 +- .../Form/CreatePoolStatusBar/index.tsx | 2 +- .../library/Form/NominateStatusBar/index.tsx | 2 +- .../library/Form/Unbond/UnbondFeedback.tsx | 2 +- .../src/library/Form/Unbond/UnbondInput.tsx | 2 +- .../src/library/GenerateNominations/index.tsx | 2 +- .../src/library/Graphs/AveragePayoutLine.tsx | 2 +- .../app/src/library/Graphs/EraPointsLine.tsx | 8 +- packages/app/src/library/Graphs/PayoutBar.tsx | 2 +- .../app/src/library/Graphs/PayoutLine.tsx | 4 +- packages/app/src/library/Headers/Connect.tsx | 2 +- .../app/src/library/Headers/Connected.tsx | 2 +- packages/app/src/library/Import/Heading.tsx | 2 +- .../List/EraPointsGraph/CurrentEraPoints.tsx | 2 +- .../EraPointsGraph/HistoricalEraPoints.tsx | 2 +- packages/app/src/library/List/Pagination.tsx | 2 +- packages/app/src/library/List/Selectable.tsx | 2 +- .../src/library/ListItem/Labels/Blocked.tsx | 2 +- .../library/ListItem/Labels/Commission.tsx | 2 +- .../src/library/ListItem/Labels/EraStatus.tsx | 2 +- .../library/ListItem/Labels/FavoritePool.tsx | 2 +- .../ListItem/Labels/FavoriteValidator.tsx | 2 +- .../src/library/ListItem/Labels/Members.tsx | 2 +- .../src/library/ListItem/Labels/Metrics.tsx | 2 +- .../ListItem/Labels/NominationStatus.tsx | 2 +- .../library/ListItem/Labels/ParaValidator.tsx | 2 +- .../library/ListItem/Labels/PoolBonded.tsx | 2 +- .../ListItem/Labels/PoolCommission.tsx | 2 +- .../src/library/ListItem/Labels/PoolId.tsx | 2 +- .../ListItem/Labels/PoolMemberBonded.tsx | 2 +- .../ListItem/Labels/PoolNominateStatus.tsx | 2 +- .../src/library/ListItem/Labels/Quartile.tsx | 4 +- .../library/ListItem/Labels/RewardShare.tsx | 2 +- .../app/src/library/MainFooter/Status.tsx | 2 +- packages/app/src/library/MainFooter/index.tsx | 2 +- .../app/src/library/NominationList/index.tsx | 2 +- .../app/src/library/Nominations/index.tsx | 14 +- .../app/src/library/PageWithTitle/index.tsx | 4 +- packages/app/src/library/PayeeInput/index.tsx | 2 +- packages/app/src/library/Pool/Rewards.tsx | 2 +- packages/app/src/library/PoolList/index.tsx | 2 +- packages/app/src/library/Prompt/Title.tsx | 2 +- .../src/library/SetupSteps/Footer/index.tsx | 2 +- .../src/library/SetupSteps/Header/index.tsx | 2 +- .../app/src/library/SetupSteps/Nominate.tsx | 2 +- packages/app/src/library/SideMenu/Main.tsx | 2 +- packages/app/src/library/SideMenu/index.tsx | 4 +- .../SubmitTx/ManualSign/Ledger/Submit.tsx | 2 +- .../SubmitTx/ManualSign/Ledger/index.tsx | 2 +- .../SubmitTx/ManualSign/Vault/SignPrompt.tsx | 2 +- .../SubmitTx/ManualSign/Vault/index.tsx | 2 +- .../ManualSign/WalletConnect/index.tsx | 2 +- packages/app/src/library/SubmitTx/index.tsx | 8 +- packages/app/src/library/Tips/Tip.tsx | 4 +- .../ValidatorList/Filters/FilterBadges.tsx | 2 +- .../ValidatorList/Filters/FilterHeaders.tsx | 2 +- .../app/src/library/ValidatorList/Item.tsx | 2 +- .../Prompts/FilterValidators.tsx | 2 +- .../ValidatorList/Prompts/OrderValidators.tsx | 2 +- .../app/src/library/ValidatorList/index.tsx | 8 +- .../overlay/canvas/CreatePool/Bond/index.tsx | 2 +- .../canvas/CreatePool/PoolName/Input.tsx | 4 +- .../canvas/CreatePool/PoolName/index.tsx | 2 +- .../canvas/CreatePool/PoolRoles/index.tsx | 6 +- .../canvas/CreatePool/Summary/index.tsx | 20 +- .../src/overlay/canvas/CreatePool/index.tsx | 2 +- .../canvas/ManageNominations/index.tsx | 6 +- .../canvas/NominatorSetup/Bond/index.tsx | 2 +- .../canvas/NominatorSetup/Payee/index.tsx | 4 +- .../canvas/NominatorSetup/Summary/index.tsx | 14 +- .../overlay/canvas/NominatorSetup/index.tsx | 2 +- .../app/src/overlay/canvas/Pool/Header.tsx | 12 +- .../overlay/canvas/Pool/Nominations/index.tsx | 4 +- .../canvas/Pool/Overview/Addresses.tsx | 2 +- .../overlay/canvas/Pool/Overview/JoinForm.tsx | 8 +- .../Pool/Overview/Performance/index.tsx | 4 +- .../overlay/canvas/Pool/Overview/Roles.tsx | 10 +- .../overlay/canvas/Pool/Overview/Stats.tsx | 2 +- .../app/src/overlay/canvas/Pool/Preloader.tsx | 8 +- .../canvas/PoolMembers/Lists/FetchPage.tsx | 2 +- .../canvas/PoolMembers/Lists/Member.tsx | 4 +- .../overlay/canvas/PoolMembers/Members.tsx | 12 +- .../src/overlay/canvas/PoolMembers/index.tsx | 2 +- .../overlay/canvas/ValidatorMetrics/index.tsx | 8 +- .../overlay/modals/ImportLedger/Manage.tsx | 4 +- .../src/overlay/modals/ImportVault/index.tsx | 4 +- .../modals/ImportWalletConnect/index.tsx | 6 +- .../overlay/modals/RewardCalculator/index.tsx | 19 +- .../app/src/overlay/modals/Settings/index.tsx | 2 +- packages/app/src/pages/Community/Entity.tsx | 8 +- packages/app/src/pages/Community/Item.tsx | 8 +- packages/app/src/pages/Community/index.tsx | 2 +- .../Nominate/Active/CommissionPrompt.tsx | 6 +- .../src/pages/Nominate/Active/ManageBond.tsx | 4 +- .../Active/Stats/ActiveNominators.tsx | 2 +- .../Active/Stats/MinimumActiveStake.tsx | 2 +- .../Active/Stats/MinimumNominatorBond.tsx | 2 +- .../Nominate/Active/Status/NewNominator.tsx | 4 +- .../Active/Status/NominationStatus.tsx | 4 +- .../Active/Status/PayoutDestinationStatus.tsx | 8 +- .../Active/Status/UnclaimedPayoutsStatus.tsx | 2 +- .../pages/Nominate/Active/UnstakePrompts.tsx | 12 +- .../app/src/pages/Nominate/Active/index.tsx | 6 +- .../NominationGeo/Stats/AnalyzedDays.tsx | 2 +- .../NominationGeo/Stats/AnalyzedEras.tsx | 2 +- .../NominationGeo/Stats/AnalyzedPayouts.tsx | 2 +- .../pages/Nominate/NominationGeo/index.tsx | 16 +- packages/app/src/pages/Nominate/index.tsx | 6 +- .../Overview/AccountBalance/BalanceChart.tsx | 17 +- .../Overview/AccountBalance/BalanceLinks.tsx | 2 +- .../pages/Overview/AccountControls/Item.tsx | 4 +- .../Overview/NetworkSats/Announcements.tsx | 18 +- .../src/pages/Overview/NetworkSats/index.tsx | 10 +- .../app/src/pages/Overview/Payouts/index.tsx | 6 +- .../Overview/Stats/AveragelRewardRate.tsx | 2 +- .../src/pages/Overview/Stats/NextRewards.tsx | 2 +- .../src/pages/Overview/Stats/SupplyStaked.tsx | 2 +- packages/app/src/pages/Overview/index.tsx | 2 +- .../app/src/pages/Pools/ClosurePrompts.tsx | 16 +- .../app/src/pages/Pools/Favorites/index.tsx | 6 +- packages/app/src/pages/Pools/ManageBond.tsx | 4 +- .../app/src/pages/Pools/ManagePool/index.tsx | 6 +- .../app/src/pages/Pools/PoolAccount/index.tsx | 2 +- .../pages/Pools/PoolStats/Announcements.tsx | 8 +- .../app/src/pages/Pools/PoolStats/index.tsx | 18 +- .../pages/Pools/Roles/RoleEditInput/index.tsx | 6 +- packages/app/src/pages/Pools/Roles/index.tsx | 14 +- .../src/pages/Pools/Stats/ActivePoolCount.tsx | 2 +- .../src/pages/Pools/Stats/MinCreateBond.tsx | 2 +- .../app/src/pages/Pools/Stats/MinJoinBond.tsx | 2 +- .../pages/Pools/Status/MembershipStatus.tsx | 8 +- .../app/src/pages/Pools/Status/NewMember.tsx | 6 +- .../app/src/pages/Pools/Status/PoolStatus.tsx | 18 +- .../src/pages/Pools/Status/RewardsStatus.tsx | 6 +- .../pages/Pools/Status/useStatusButtons.tsx | 8 +- packages/app/src/pages/Pools/index.tsx | 8 +- .../Rewards/Overview/RecentPayouts/index.tsx | 8 +- .../app/src/pages/Rewards/Overview/index.tsx | 14 +- .../Rewards/RecentPayouts/PayoutList.tsx | 12 +- .../src/pages/Rewards/RecentPayouts/index.tsx | 2 +- .../src/pages/Rewards/Stats/LastEraPayout.tsx | 2 +- .../pages/Rewards/Stats/RewardCalculator.tsx | 4 +- .../src/pages/Rewards/Stats/RewardTrend.tsx | 2 +- packages/app/src/pages/Rewards/index.tsx | 4 +- .../src/pages/Validators/AllValidators.tsx | 6 +- .../app/src/pages/Validators/Favorites.tsx | 6 +- .../Validators/Stats/ActiveValidators.tsx | 2 +- .../Validators/Stats/AverageCommission.tsx | 2 +- .../Validators/Stats/TotalValidators.tsx | 2 +- packages/app/src/pages/Validators/index.tsx | 6 +- packages/locales/src/index.ts | 9 +- .../resources/cn/{library.json => app.json} | 58 ++- packages/locales/src/resources/cn/base.json | 57 --- packages/locales/src/resources/cn/pages.json | 477 ++++++++--------- .../resources/en/{library.json => app.json} | 58 ++- packages/locales/src/resources/en/base.json | 63 --- packages/locales/src/resources/en/pages.json | 482 ++++++++---------- .../resources/es/{library.json => app.json} | 58 ++- packages/locales/src/resources/es/base.json | 63 --- packages/locales/src/resources/es/pages.json | 482 ++++++++---------- packages/locales/src/util.ts | 2 +- packages/styles/theme/index.scss | 2 +- .../src/ButtonCopy/index.module.scss | 14 +- .../src/ButtonText/index.module.scss | 2 +- .../src/base/CardHeader/index.module.scss | 2 +- .../src/base/Identity/index.module.scss | 2 +- .../base/Page/RowSection/index.module.scss | 2 +- .../base/RewardGrid/Cell/index.module.scss | 2 +- .../base/RewardGrid/Head/index.module.scss | 2 +- .../base/RewardGrid/Root/index.module.scss | 2 +- .../src/base/RewardGrid/Row/index.module.scss | 2 +- .../src/base/RewardGrid/common.module.scss | 2 +- .../src/base/Stat/Card/index.module.scss | 5 +- .../src/base/Stat/Graphic/index.module.scss | 2 +- .../src/base/Tooltip/index.module.scss | 44 +- .../src/canvas/AccountTitle/index.module.scss | 6 +- .../src/input/TokenInput/index.module.scss | 6 +- .../src/list/Identity/index.module.scss | 2 +- packages/utils/src/index.ts | 14 +- 198 files changed, 1247 insertions(+), 1439 deletions(-) rename packages/locales/src/resources/cn/{library.json => app.json} (85%) delete mode 100644 packages/locales/src/resources/cn/base.json rename packages/locales/src/resources/en/{library.json => app.json} (85%) delete mode 100644 packages/locales/src/resources/en/base.json rename packages/locales/src/resources/es/{library.json => app.json} (86%) delete mode 100644 packages/locales/src/resources/es/base.json diff --git a/packages/app/package.json b/packages/app/package.json index c5d735868b..d6432129e3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "1.8.0", + "version": "1.8.1", "type": "module", "license": "GPL-3.0-only", "scripts": { diff --git a/packages/app/src/Offline.tsx b/packages/app/src/Offline.tsx index 0a1ec7c0f6..359f6c1bc8 100644 --- a/packages/app/src/Offline.tsx +++ b/packages/app/src/Offline.tsx @@ -11,7 +11,7 @@ import { Offline as Wrapper } from 'ui-core/base' import { useEventListener } from 'usehooks-ts' export const Offline = () => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const [offline, setOffline] = useState<boolean>(false) const handleOnlineStatus = (e: Event): void => { diff --git a/packages/app/src/hooks/useAccountFromUrl/index.tsx b/packages/app/src/hooks/useAccountFromUrl/index.tsx index c90f4f0271..4d68358f8f 100644 --- a/packages/app/src/hooks/useAccountFromUrl/index.tsx +++ b/packages/app/src/hooks/useAccountFromUrl/index.tsx @@ -10,7 +10,7 @@ import { useEffect } from 'react' import { useTranslation } from 'react-i18next' export const useAccountFromUrl = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { accounts } = useImportedAccounts() const { accountsInitialised } = useOtherAccounts() const { activeAccount, setActiveAccount } = useActiveAccounts() diff --git a/packages/app/src/hooks/useNominationStatus/index.tsx b/packages/app/src/hooks/useNominationStatus/index.tsx index 2d138b26e6..05825d926e 100644 --- a/packages/app/src/hooks/useNominationStatus/index.tsx +++ b/packages/app/src/hooks/useNominationStatus/index.tsx @@ -69,18 +69,18 @@ export const useNominationStatus = () => { // Determine the localised message to display based on the nomination status. let str if (inSetup() || syncing) { - str = t('nominate.notNominating', { ns: 'pages' }) + str = t('notNominating', { ns: 'pages' }) } else if (!nominees.length) { - str = t('nominate.noNominationsSet', { ns: 'pages' }) + str = t('noNominationsSet', { ns: 'pages' }) } else if (activeNominees.length) { - str = t('nominate.nominatingAnd', { ns: 'pages' }) + str = t('nominatingAnd', { ns: 'pages' }) if (earningRewards) { - str += ` ${t('nominate.earningRewards', { ns: 'pages' })}` + str += ` ${t('earningRewards', { ns: 'pages' })}` } else { - str += ` ${t('nominate.notEarningRewards', { ns: 'pages' })}` + str += ` ${t('notEarningRewards', { ns: 'pages' })}` } } else { - str = t('nominate.waitingForActiveNominations', { ns: 'pages' }) + str = t('waitingForActiveNominations', { ns: 'pages' }) } return { diff --git a/packages/app/src/hooks/usePayeeConfig/index.tsx b/packages/app/src/hooks/usePayeeConfig/index.tsx index 4192e5b25e..5ffe346dbe 100644 --- a/packages/app/src/hooks/usePayeeConfig/index.tsx +++ b/packages/app/src/hooks/usePayeeConfig/index.tsx @@ -20,7 +20,7 @@ export interface PayeeItem { } export const usePayeeConfig = () => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const getPayeeItems = (extended?: boolean): PayeeItem[] => { let items: PayeeItem[] = [ { diff --git a/packages/app/src/hooks/usePoolFilters/index.tsx b/packages/app/src/hooks/usePoolFilters/index.tsx index 350d0ae092..aef1ac62be 100644 --- a/packages/app/src/hooks/usePoolFilters/index.tsx +++ b/packages/app/src/hooks/usePoolFilters/index.tsx @@ -9,7 +9,7 @@ import { useTranslation } from 'react-i18next' import type { BondedPool } from 'types' export const usePoolFilters = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { poolsNominations } = useBondedPools() const { getNominationsStatusFromTargets } = useStaking() const { getPoolNominationStatusCode } = useBondedPools() diff --git a/packages/app/src/hooks/useSubmitExtrinsic/index.tsx b/packages/app/src/hooks/useSubmitExtrinsic/index.tsx index 735ed65d09..b333488e74 100644 --- a/packages/app/src/hooks/useSubmitExtrinsic/index.tsx +++ b/packages/app/src/hooks/useSubmitExtrinsic/index.tsx @@ -41,7 +41,7 @@ export const useSubmitExtrinsic = ({ callbackSubmit, callbackInBlock, }: UseSubmitExtrinsicProps): UseSubmitExtrinsic => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { network, networkData: { units, unit }, diff --git a/packages/app/src/hooks/useUnstaking/index.tsx b/packages/app/src/hooks/useUnstaking/index.tsx index 8988fa5d55..cceadea806 100644 --- a/packages/app/src/hooks/useUnstaking/index.tsx +++ b/packages/app/src/hooks/useUnstaking/index.tsx @@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next' import { useNominationStatus } from '../useNominationStatus' export const useUnstaking = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { inSetup } = useStaking() const { activeAccount } = useActiveAccounts() const { getTransferOptions } = useTransferOptions() diff --git a/packages/app/src/hooks/useValidatorFilters/index.tsx b/packages/app/src/hooks/useValidatorFilters/index.tsx index b163c139bd..3ef69cad26 100644 --- a/packages/app/src/hooks/useValidatorFilters/index.tsx +++ b/packages/app/src/hooks/useValidatorFilters/index.tsx @@ -8,7 +8,7 @@ import type { AnyFilter } from 'library/Filter/types' import { useTranslation } from 'react-i18next' export const useValidatorFilters = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { validatorSupers, getValidatorRank, diff --git a/packages/app/src/library/Account/DefaultAccount.tsx b/packages/app/src/library/Account/DefaultAccount.tsx index 5e960e4f0b..1c65c971c1 100644 --- a/packages/app/src/library/Account/DefaultAccount.tsx +++ b/packages/app/src/library/Account/DefaultAccount.tsx @@ -12,7 +12,7 @@ import { Wrapper } from './Wrapper' import type { AccountProps } from './types' const DefaultAccount = ({ value, label, readOnly }: AccountProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getAccount } = useImportedAccounts() // Determine account display text. Title takes precedence over value. diff --git a/packages/app/src/library/Account/PoolAccount.tsx b/packages/app/src/library/Account/PoolAccount.tsx index 5859a5c0ed..443e29147f 100644 --- a/packages/app/src/library/Account/PoolAccount.tsx +++ b/packages/app/src/library/Account/PoolAccount.tsx @@ -11,7 +11,7 @@ import { Wrapper } from './Wrapper' import type { PoolAccountProps } from './types' const PoolAccount = ({ label, pool, syncing }: PoolAccountProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { poolsMetaData } = useBondedPools() // Default display text value. diff --git a/packages/app/src/library/AccountInput/index.tsx b/packages/app/src/library/AccountInput/index.tsx index 4820efa934..45cdff37e5 100644 --- a/packages/app/src/library/AccountInput/index.tsx +++ b/packages/app/src/library/AccountInput/index.tsx @@ -27,7 +27,7 @@ export const AccountInput = ({ initialValue = null, border = true, }: AccountInputProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { ss58 }, diff --git a/packages/app/src/library/BarChart/BondedChart.tsx b/packages/app/src/library/BarChart/BondedChart.tsx index e301f5666d..1af510d017 100644 --- a/packages/app/src/library/BarChart/BondedChart.tsx +++ b/packages/app/src/library/BarChart/BondedChart.tsx @@ -16,7 +16,7 @@ export const BondedChart = ({ unlocked, inactive, }: BondedChartProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { unit }, } = useNetwork() diff --git a/packages/app/src/library/ButtonCopy/index.tsx b/packages/app/src/library/ButtonCopy/index.tsx index 6a94e4dc36..cf67e9d729 100644 --- a/packages/app/src/library/ButtonCopy/index.tsx +++ b/packages/app/src/library/ButtonCopy/index.tsx @@ -9,7 +9,7 @@ import type { ButtonCopyProps } from 'ui-buttons/src/types' export const ButtonCopy = ( props: Omit<ButtonCopyProps, 'tooltipText' | 'tooltipPortalContainer'> ) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { themeElementRef } = useTheme() return ( diff --git a/packages/app/src/library/Countdown/index.tsx b/packages/app/src/library/Countdown/index.tsx index 2663920475..0e2d69ab5c 100644 --- a/packages/app/src/library/Countdown/index.tsx +++ b/packages/app/src/library/Countdown/index.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import type { CountdownProps } from './types' export const Countdown = ({ timeleft, markup = true }: CountdownProps) => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const { days, hours, minutes, seconds } = timeleft const secondsNumber = seconds ? seconds[0] : 0 diff --git a/packages/app/src/library/ErrorBoundary/index.tsx b/packages/app/src/library/ErrorBoundary/index.tsx index 581c6c9825..0e0d2aaba9 100644 --- a/packages/app/src/library/ErrorBoundary/index.tsx +++ b/packages/app/src/library/ErrorBoundary/index.tsx @@ -12,7 +12,7 @@ export const ErrorFallbackApp = ({ }: { resetErrorBoundary: () => void }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') return ( <Wrapper className="app"> @@ -37,7 +37,7 @@ export const ErrorFallbackRoutes = ({ }: { resetErrorBoundary: () => void }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') return ( <Wrapper> @@ -62,7 +62,7 @@ interface ErrorFallbackProps { } export const ErrorFallbackModal: FC = (props: ErrorFallbackProps) => { const { resetErrorBoundary } = props - const { t } = useTranslation('library') + const { t } = useTranslation('app') return ( <Wrapper className="modal"> diff --git a/packages/app/src/library/EstimatedTxFee/index.tsx b/packages/app/src/library/EstimatedTxFee/index.tsx index d8ce2d665a..4d8a2f6494 100644 --- a/packages/app/src/library/EstimatedTxFee/index.tsx +++ b/packages/app/src/library/EstimatedTxFee/index.tsx @@ -10,7 +10,7 @@ import { Wrapper } from './Wrapper' import type { EstimatedTxFeeProps } from './types' export const EstimatedTxFee = ({ uid, format }: EstimatedTxFeeProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getTxSubmission } = useTxMeta() const { unit, units } = useNetwork().networkData diff --git a/packages/app/src/library/Form/Bond/BondFeedback.tsx b/packages/app/src/library/Form/Bond/BondFeedback.tsx index fb6db23364..abc4b42502 100644 --- a/packages/app/src/library/Form/Bond/BondFeedback.tsx +++ b/packages/app/src/library/Form/Bond/BondFeedback.tsx @@ -30,7 +30,7 @@ export const BondFeedback = ({ syncing = false, displayFirstWarningOnly = true, }: BondFeedbackProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { units, unit }, } = useNetwork() diff --git a/packages/app/src/library/Form/Bond/BondInput.tsx b/packages/app/src/library/Form/Bond/BondInput.tsx index 8d6d3e7192..20f2cdfce1 100644 --- a/packages/app/src/library/Form/Bond/BondInput.tsx +++ b/packages/app/src/library/Form/Bond/BondInput.tsx @@ -20,7 +20,7 @@ export const BondInput = ({ value = '0', syncing = false, }: BondInputProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { unit }, } = useNetwork() diff --git a/packages/app/src/library/Form/ClaimPermissionInput/index.tsx b/packages/app/src/library/Form/ClaimPermissionInput/index.tsx index bf785dbf8a..c38ad6bbe7 100644 --- a/packages/app/src/library/Form/ClaimPermissionInput/index.tsx +++ b/packages/app/src/library/Form/ClaimPermissionInput/index.tsx @@ -13,7 +13,7 @@ export const ClaimPermissionInput = ({ onChange, disabled = false, }: ClaimPermissionInputProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const claimPermissionConfig: ClaimPermissionConfig[] = [ { diff --git a/packages/app/src/library/Form/CreatePoolStatusBar/index.tsx b/packages/app/src/library/Form/CreatePoolStatusBar/index.tsx index c00a9d9a60..f70f14d7ba 100644 --- a/packages/app/src/library/Form/CreatePoolStatusBar/index.tsx +++ b/packages/app/src/library/Form/CreatePoolStatusBar/index.tsx @@ -12,7 +12,7 @@ import type { NominateStatusBarProps } from '../types' import { Wrapper } from './Wrapper' export const CreatePoolStatusBar = ({ value }: NominateStatusBarProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { minCreateBond } = useApi().poolsConfig const { unit, units } = useNetwork().networkData const { syncing } = useSyncing(['initialization']) diff --git a/packages/app/src/library/Form/NominateStatusBar/index.tsx b/packages/app/src/library/Form/NominateStatusBar/index.tsx index ca408543a8..946712e1ff 100644 --- a/packages/app/src/library/Form/NominateStatusBar/index.tsx +++ b/packages/app/src/library/Form/NominateStatusBar/index.tsx @@ -14,7 +14,7 @@ import type { NominateStatusBarProps } from '../types' import { Wrapper } from './Wrapper' export const NominateStatusBar = ({ value }: NominateStatusBarProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { openHelp } = useHelp() const { networkMetrics: { minimumActiveStake }, diff --git a/packages/app/src/library/Form/Unbond/UnbondFeedback.tsx b/packages/app/src/library/Form/Unbond/UnbondFeedback.tsx index d1096707b5..317b78f383 100644 --- a/packages/app/src/library/Form/Unbond/UnbondFeedback.tsx +++ b/packages/app/src/library/Form/Unbond/UnbondFeedback.tsx @@ -27,7 +27,7 @@ export const UnbondFeedback = ({ txFees, displayFirstWarningOnly = true, }: UnbondFeedbackProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { units, unit }, } = useNetwork() diff --git a/packages/app/src/library/Form/Unbond/UnbondInput.tsx b/packages/app/src/library/Form/Unbond/UnbondInput.tsx index 2f60162c23..2e3285d09c 100644 --- a/packages/app/src/library/Form/Unbond/UnbondInput.tsx +++ b/packages/app/src/library/Form/Unbond/UnbondInput.tsx @@ -20,7 +20,7 @@ export const UnbondInput = ({ value = '0', active, }: UnbondInputProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData } = useNetwork() const { activeAccount } = useActiveAccounts() diff --git a/packages/app/src/library/GenerateNominations/index.tsx b/packages/app/src/library/GenerateNominations/index.tsx index d7c6a780b0..2c058fe655 100644 --- a/packages/app/src/library/GenerateNominations/index.tsx +++ b/packages/app/src/library/GenerateNominations/index.tsx @@ -37,7 +37,7 @@ export const GenerateNominations = ({ nominations: defaultNominations, displayFor = 'default', }: GenerateNominationsProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { isReady, consts } = useApi() const { isFastUnstaking } = useUnstaking() const { stakers } = useStaking().eraStakers diff --git a/packages/app/src/library/Graphs/AveragePayoutLine.tsx b/packages/app/src/library/Graphs/AveragePayoutLine.tsx index 175b6de32b..8938ca617e 100644 --- a/packages/app/src/library/Graphs/AveragePayoutLine.tsx +++ b/packages/app/src/library/Graphs/AveragePayoutLine.tsx @@ -43,7 +43,7 @@ export const AveragePayoutLine = ({ nominating, inPool, }: AveragePayoutLineProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getThemeValue } = useThemeValues() const { unit, units } = useNetwork().networkData diff --git a/packages/app/src/library/Graphs/EraPointsLine.tsx b/packages/app/src/library/Graphs/EraPointsLine.tsx index f8d66a67c1..4305a35809 100644 --- a/packages/app/src/library/Graphs/EraPointsLine.tsx +++ b/packages/app/src/library/Graphs/EraPointsLine.tsx @@ -88,7 +88,7 @@ export const EraPointsLine = ({ }, title: { ...titleStyle, - text: `${t('date', { ns: 'base' })}`, + text: `${t('date', { ns: 'app' })}`, }, }, y: { @@ -108,7 +108,7 @@ export const EraPointsLine = ({ }, title: { ...titleStyle, - text: `${t('eraPoints', { ns: 'library' })}`, + text: `${t('eraPoints', { ns: 'app' })}`, }, }, }, @@ -130,7 +130,7 @@ export const EraPointsLine = ({ callbacks: { title: () => [], label: (context: AnyJson) => - `${new BigNumber(context.parsed.y).decimalPlaces(0).toFormat()} ${t('eraPoints', { ns: 'library' })}`, + `${new BigNumber(context.parsed.y).decimalPlaces(0).toFormat()} ${t('eraPoints', { ns: 'app' })}`, }, intersect: false, interaction: { @@ -149,7 +149,7 @@ export const EraPointsLine = ({ }), datasets: [ { - label: t('era', { ns: 'library' }), + label: t('era', { ns: 'app' }), data: dataset, borderColor: color, backgroundColor: color, diff --git a/packages/app/src/library/Graphs/PayoutBar.tsx b/packages/app/src/library/Graphs/PayoutBar.tsx index f0826732e3..74c5f12cac 100644 --- a/packages/app/src/library/Graphs/PayoutBar.tsx +++ b/packages/app/src/library/Graphs/PayoutBar.tsx @@ -43,7 +43,7 @@ export const PayoutBar = ({ inPool, syncing, }: PayoutBarProps) => { - const { i18n, t } = useTranslation('library') + const { i18n, t } = useTranslation('app') const { getThemeValue } = useThemeValues() const { unit, units } = useNetwork().networkData const staking = nominating || inPool diff --git a/packages/app/src/library/Graphs/PayoutLine.tsx b/packages/app/src/library/Graphs/PayoutLine.tsx index d0911885ed..1589f1a4b1 100644 --- a/packages/app/src/library/Graphs/PayoutLine.tsx +++ b/packages/app/src/library/Graphs/PayoutLine.tsx @@ -90,7 +90,7 @@ export const PayoutLine = ({ }, title: { ...titleStyle, - text: `${t('date', { ns: 'base' })}`, + text: `${t('date', { ns: 'app' })}`, }, }, y: { @@ -151,7 +151,7 @@ export const PayoutLine = ({ }), datasets: [ { - label: t('era', { ns: 'library' }), + label: t('era', { ns: 'app' }), data: dataset, borderColor: color, backgroundColor: color, diff --git a/packages/app/src/library/Headers/Connect.tsx b/packages/app/src/library/Headers/Connect.tsx index 1af70ae417..ccf42d1d79 100644 --- a/packages/app/src/library/Headers/Connect.tsx +++ b/packages/app/src/library/Headers/Connect.tsx @@ -9,7 +9,7 @@ import { ButtonRow } from 'ui-core/base' import { useOverlay } from 'ui-overlay' export const Connect = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { openModal } = useOverlay().modal const { accounts } = useImportedAccounts() diff --git a/packages/app/src/library/Headers/Connected.tsx b/packages/app/src/library/Headers/Connected.tsx index b2d033384a..8d527f9e0e 100644 --- a/packages/app/src/library/Headers/Connected.tsx +++ b/packages/app/src/library/Headers/Connected.tsx @@ -13,7 +13,7 @@ import DefaultAccount from '../Account/DefaultAccount' import PoolAccount from '../Account/PoolAccount' export const Connected = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { isNominating } = useStaking() const { activePool } = useActivePool() const { poolsMetaData } = useBondedPools() diff --git a/packages/app/src/library/Import/Heading.tsx b/packages/app/src/library/Import/Heading.tsx index b648d0366a..3344404955 100644 --- a/packages/app/src/library/Import/Heading.tsx +++ b/packages/app/src/library/Import/Heading.tsx @@ -18,7 +18,7 @@ export const Heading = ({ disabled, handleReset, }: HeadingProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') return ( <HeadingWrapper> diff --git a/packages/app/src/library/List/EraPointsGraph/CurrentEraPoints.tsx b/packages/app/src/library/List/EraPointsGraph/CurrentEraPoints.tsx index 774db3a0b5..b7d0165dc9 100644 --- a/packages/app/src/library/List/EraPointsGraph/CurrentEraPoints.tsx +++ b/packages/app/src/library/List/EraPointsGraph/CurrentEraPoints.tsx @@ -52,7 +52,7 @@ export const CurrentEraPoints = ({ const normalisedPoint = Object.values(normalisedPoints)[0] const syncing = !isReady || !validatorsFetched || eraHigh <= 1 const tooltipText = t('eraRewardPoints', { - ns: 'library', + ns: 'app', points: eraPoints.toFormat(), }) diff --git a/packages/app/src/library/List/EraPointsGraph/HistoricalEraPoints.tsx b/packages/app/src/library/List/EraPointsGraph/HistoricalEraPoints.tsx index 40d234a77a..04de29146a 100644 --- a/packages/app/src/library/List/EraPointsGraph/HistoricalEraPoints.tsx +++ b/packages/app/src/library/List/EraPointsGraph/HistoricalEraPoints.tsx @@ -17,7 +17,7 @@ export const HistoricalEraPoints = ({ displayFor, eraPoints, }: EraPointsHistoricalProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { isReady } = useApi() const { erasPerDay } = useErasPerDay() const { validatorsFetched } = useValidators() diff --git a/packages/app/src/library/List/Pagination.tsx b/packages/app/src/library/List/Pagination.tsx index 6381ac04c0..3335813c1a 100644 --- a/packages/app/src/library/List/Pagination.tsx +++ b/packages/app/src/library/List/Pagination.tsx @@ -12,7 +12,7 @@ export const Pagination = ({ setter, disabled = false, }: PaginationProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const [next, setNext] = useState<number>(page + 1 > total ? total : page + 1) const [prev, setPrev] = useState<number>(page - 1 < 1 ? 1 : page - 1) diff --git a/packages/app/src/library/List/Selectable.tsx b/packages/app/src/library/List/Selectable.tsx index 629f998777..09723703ac 100644 --- a/packages/app/src/library/List/Selectable.tsx +++ b/packages/app/src/library/List/Selectable.tsx @@ -14,7 +14,7 @@ export const Selectable = ({ canSelect, displayFor, }: SelectableProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const provider = useList() const { isFastUnstaking } = useUnstaking() diff --git a/packages/app/src/library/ListItem/Labels/Blocked.tsx b/packages/app/src/library/ListItem/Labels/Blocked.tsx index d54096dc19..4de2a8ef08 100644 --- a/packages/app/src/library/ListItem/Labels/Blocked.tsx +++ b/packages/app/src/library/ListItem/Labels/Blocked.tsx @@ -10,7 +10,7 @@ import { Label } from 'ui-core/list' import type { BlockedProps } from '../types' export const Blocked = ({ prefs }: BlockedProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const blocked = prefs?.blocked ?? null const { setTooltipTextAndOpen } = useTooltip() diff --git a/packages/app/src/library/ListItem/Labels/Commission.tsx b/packages/app/src/library/ListItem/Labels/Commission.tsx index 4d4d3d5282..e636b7da17 100644 --- a/packages/app/src/library/ListItem/Labels/Commission.tsx +++ b/packages/app/src/library/ListItem/Labels/Commission.tsx @@ -7,7 +7,7 @@ import { TooltipArea } from 'ui-core/base' import { Label } from 'ui-core/list' export const Commission = ({ commission }: { commission: number }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const tooltipText = t('validatorCommission') diff --git a/packages/app/src/library/ListItem/Labels/EraStatus.tsx b/packages/app/src/library/ListItem/Labels/EraStatus.tsx index fac8404fd5..a7c4bc5a19 100644 --- a/packages/app/src/library/ListItem/Labels/EraStatus.tsx +++ b/packages/app/src/library/ListItem/Labels/EraStatus.tsx @@ -12,7 +12,7 @@ import { planckToUnitBn } from 'utils' import type { EraStatusProps } from '../types' export const EraStatus = ({ address, noMargin, status }: EraStatusProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { syncing } = useSyncing() const { unit, units } = useNetwork().networkData const { getValidatorTotalStake } = useValidators() diff --git a/packages/app/src/library/ListItem/Labels/FavoritePool.tsx b/packages/app/src/library/ListItem/Labels/FavoritePool.tsx index 410c945724..f87e9e1f37 100644 --- a/packages/app/src/library/ListItem/Labels/FavoritePool.tsx +++ b/packages/app/src/library/ListItem/Labels/FavoritePool.tsx @@ -13,7 +13,7 @@ import { HeaderButton } from 'ui-core/list' import type { FavoriteProps } from '../types' export const FavoritePool = ({ address, outline }: FavoriteProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const { favorites, addFavorite, removeFavorite } = useFavoritePools() diff --git a/packages/app/src/library/ListItem/Labels/FavoriteValidator.tsx b/packages/app/src/library/ListItem/Labels/FavoriteValidator.tsx index aca396b966..117b882409 100644 --- a/packages/app/src/library/ListItem/Labels/FavoriteValidator.tsx +++ b/packages/app/src/library/ListItem/Labels/FavoriteValidator.tsx @@ -13,7 +13,7 @@ import { HeaderButton } from 'ui-core/list' import type { FavoriteProps } from '../types' export const FavoriteValidator = ({ address, outline }: FavoriteProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const { favorites, addFavorite, removeFavorite } = useFavoriteValidators() diff --git a/packages/app/src/library/ListItem/Labels/Members.tsx b/packages/app/src/library/ListItem/Labels/Members.tsx index 5f2eb54ce9..c2680401fb 100644 --- a/packages/app/src/library/ListItem/Labels/Members.tsx +++ b/packages/app/src/library/ListItem/Labels/Members.tsx @@ -9,7 +9,7 @@ import { TooltipArea } from 'ui-core/base' import { Label } from 'ui-core/list' export const Members = ({ members }: { members: string }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const tooltipText = t('poolMembers') diff --git a/packages/app/src/library/ListItem/Labels/Metrics.tsx b/packages/app/src/library/ListItem/Labels/Metrics.tsx index 0f4ec510d2..a7cd4daee1 100644 --- a/packages/app/src/library/ListItem/Labels/Metrics.tsx +++ b/packages/app/src/library/ListItem/Labels/Metrics.tsx @@ -25,7 +25,7 @@ export const Metrics = ({ display, address, outline }: MetricsProps) => { }) } > - {t('metrics', { ns: 'library' })} + {t('metrics', { ns: 'app' })} </button> </HeaderButton> ) diff --git a/packages/app/src/library/ListItem/Labels/NominationStatus.tsx b/packages/app/src/library/ListItem/Labels/NominationStatus.tsx index 948dc57339..65ad1ec496 100644 --- a/packages/app/src/library/ListItem/Labels/NominationStatus.tsx +++ b/packages/app/src/library/ListItem/Labels/NominationStatus.tsx @@ -17,7 +17,7 @@ export const NominationStatus = ({ noMargin = false, status, }: NominationStatusProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { unit, units }, } = useNetwork() diff --git a/packages/app/src/library/ListItem/Labels/ParaValidator.tsx b/packages/app/src/library/ListItem/Labels/ParaValidator.tsx index cd90ad7bf3..a59ebee7f6 100644 --- a/packages/app/src/library/ListItem/Labels/ParaValidator.tsx +++ b/packages/app/src/library/ListItem/Labels/ParaValidator.tsx @@ -11,7 +11,7 @@ import { Label } from 'ui-core/list' import type { ParaValidatorProps } from '../types' export const ParaValidator = ({ address }: ParaValidatorProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { sessionParaValidators } = useValidators() const { setTooltipTextAndOpen } = useTooltip() diff --git a/packages/app/src/library/ListItem/Labels/PoolBonded.tsx b/packages/app/src/library/ListItem/Labels/PoolBonded.tsx index b2727ffe07..c925dc8ea5 100644 --- a/packages/app/src/library/ListItem/Labels/PoolBonded.tsx +++ b/packages/app/src/library/ListItem/Labels/PoolBonded.tsx @@ -12,7 +12,7 @@ import { Label } from 'ui-core/list' import { planckToUnitBn } from 'utils' export const PoolBonded = ({ pool }: { pool: Pool }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { networkData: { units, diff --git a/packages/app/src/library/ListItem/Labels/PoolCommission.tsx b/packages/app/src/library/ListItem/Labels/PoolCommission.tsx index 8402ef20b9..8776086e7f 100644 --- a/packages/app/src/library/ListItem/Labels/PoolCommission.tsx +++ b/packages/app/src/library/ListItem/Labels/PoolCommission.tsx @@ -7,7 +7,7 @@ import { TooltipArea } from 'ui-core/base' import { Label } from 'ui-core/list' export const PoolCommission = ({ commission }: { commission: string }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const tooltipText = t('poolCommission') diff --git a/packages/app/src/library/ListItem/Labels/PoolId.tsx b/packages/app/src/library/ListItem/Labels/PoolId.tsx index 7c5dbdc340..13a754aebe 100644 --- a/packages/app/src/library/ListItem/Labels/PoolId.tsx +++ b/packages/app/src/library/ListItem/Labels/PoolId.tsx @@ -9,7 +9,7 @@ import { TooltipArea } from 'ui-core/base' import { Label } from 'ui-core/list' export const PoolId = ({ id }: { id: number }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setTooltipTextAndOpen } = useTooltip() const tooltipText = t('poolId') diff --git a/packages/app/src/library/ListItem/Labels/PoolMemberBonded.tsx b/packages/app/src/library/ListItem/Labels/PoolMemberBonded.tsx index f2b25eb9cc..7f3902690b 100644 --- a/packages/app/src/library/ListItem/Labels/PoolMemberBonded.tsx +++ b/packages/app/src/library/ListItem/Labels/PoolMemberBonded.tsx @@ -18,7 +18,7 @@ export const PoolMemberBonded = ({ batchKey: string batchIndex: number }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { units, unit } = useNetwork().networkData const poolMembers = meta[batchKey]?.poolMembers ?? [] diff --git a/packages/app/src/library/ListItem/Labels/PoolNominateStatus.tsx b/packages/app/src/library/ListItem/Labels/PoolNominateStatus.tsx index 480c05b3aa..06c5fc832c 100644 --- a/packages/app/src/library/ListItem/Labels/PoolNominateStatus.tsx +++ b/packages/app/src/library/ListItem/Labels/PoolNominateStatus.tsx @@ -10,7 +10,7 @@ import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' export const PoolNominateStatus = ({ pool }: { pool: Pool }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getPoolNominationStatusCode, poolsNominations } = useBondedPools() const { eraStakers, getNominationsStatusFromTargets } = useStaking() const { addresses } = pool diff --git a/packages/app/src/library/ListItem/Labels/Quartile.tsx b/packages/app/src/library/ListItem/Labels/Quartile.tsx index 2ed84146b6..d3655fd8f5 100644 --- a/packages/app/src/library/ListItem/Labels/Quartile.tsx +++ b/packages/app/src/library/ListItem/Labels/Quartile.tsx @@ -15,7 +15,7 @@ export const Quartile = ({ address }: { address: string }) => { const quartile = getValidatorRankSegment(address) const tooltipText = `${t('dayPerformanceStanding', { count: 30, - ns: 'library', + ns: 'app', })}` return ( @@ -26,7 +26,7 @@ export const Quartile = ({ address }: { address: string }) => { style={{ cursor: 'default' }} /> {![100, undefined].includes(quartile) - ? `${t('top', { ns: 'library' })} ${quartile}%` + ? `${t('top', { ns: 'app' })} ${quartile}%` : ``} </Label> ) diff --git a/packages/app/src/library/ListItem/Labels/RewardShare.tsx b/packages/app/src/library/ListItem/Labels/RewardShare.tsx index 90e39be584..11c3ecc56f 100644 --- a/packages/app/src/library/ListItem/Labels/RewardShare.tsx +++ b/packages/app/src/library/ListItem/Labels/RewardShare.tsx @@ -12,7 +12,7 @@ export const RewardShare = ({ share }: { share: number }) => { const { t } = useTranslation('pages') const { setTooltipTextAndOpen } = useTooltip() - const tooltipText = t('decentralization.nominationShareInRewards') + const tooltipText = t('nominationShareInRewards') return ( <Label> diff --git a/packages/app/src/library/MainFooter/Status.tsx b/packages/app/src/library/MainFooter/Status.tsx index b22182996f..a48183cc34 100644 --- a/packages/app/src/library/MainFooter/Status.tsx +++ b/packages/app/src/library/MainFooter/Status.tsx @@ -6,7 +6,7 @@ import { motion } from 'framer-motion' import { useTranslation } from 'react-i18next' export const Status = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { apiStatus } = useApi() return ( diff --git a/packages/app/src/library/MainFooter/index.tsx b/packages/app/src/library/MainFooter/index.tsx index c706c895e1..bf49c7592f 100644 --- a/packages/app/src/library/MainFooter/index.tsx +++ b/packages/app/src/library/MainFooter/index.tsx @@ -20,7 +20,7 @@ import { TokenPrice } from './TokenPrice' import { Summary, Wrapper } from './Wrappers' export const MainFooter = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { plugins } = usePlugins() const { network } = useNetwork() const PRIVACY_URL = import.meta.env.VITE_PRIVACY_URL diff --git a/packages/app/src/library/NominationList/index.tsx b/packages/app/src/library/NominationList/index.tsx index 6d95c7629c..732be0b57c 100644 --- a/packages/app/src/library/NominationList/index.tsx +++ b/packages/app/src/library/NominationList/index.tsx @@ -31,7 +31,7 @@ export const NominationList = ({ toggleFavorites, displayFor = 'default', }: NominationListProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { syncing } = useSyncing() const { network } = useNetwork() const { pluginEnabled } = usePlugins() diff --git a/packages/app/src/library/Nominations/index.tsx b/packages/app/src/library/Nominations/index.tsx index 6cd0ccb413..a02cd54b55 100644 --- a/packages/app/src/library/Nominations/index.tsx +++ b/packages/app/src/library/Nominations/index.tsx @@ -85,13 +85,13 @@ export const Nominations = ({ <Wrapper> <CardHeader action margin> <h3> - {isPool ? t('nominate.poolNominations') : t('nominate.nominations')} + {isPool ? t('poolNominations') : t('nominations')} <ButtonHelp marginLeft onClick={() => openHelp('Nominations')} /> </h3> {displayBtns && ( <ButtonRow> <ButtonPrimary - text={t('nominate.stop')} + text={t('stop')} size="md" iconLeft={faStopCircle} iconTransform="grow-1" @@ -108,7 +108,7 @@ export const Nominations = ({ } /> <ButtonPrimary - text={t('nominate.manage')} + text={t('manage')} size="md" iconLeft={faCog} iconTransform="grow-1" @@ -131,9 +131,9 @@ export const Nominations = ({ )} </CardHeader> {!isPool && syncing ? ( - <ListStatusHeader>{`${t('nominate.syncing')}...`}</ListStatusHeader> + <ListStatusHeader>{`${t('syncing')}...`}</ListStatusHeader> ) : !nominator ? ( - <ListStatusHeader>{t('nominate.notNominating')}.</ListStatusHeader> + <ListStatusHeader>{t('notNominating')}.</ListStatusHeader> ) : (nominated?.length || 0) > 0 ? ( <NominationList bondFor={bondFor} @@ -141,9 +141,9 @@ export const Nominations = ({ nominator={nominator} /> ) : poolDestroying ? ( - <ListStatusHeader>{t('nominate.poolDestroy')}</ListStatusHeader> + <ListStatusHeader>{t('poolDestroy')}</ListStatusHeader> ) : ( - <ListStatusHeader>{t('nominate.notNominating')}.</ListStatusHeader> + <ListStatusHeader>{t('notNominating')}.</ListStatusHeader> )} </Wrapper> ) diff --git a/packages/app/src/library/PageWithTitle/index.tsx b/packages/app/src/library/PageWithTitle/index.tsx index 2e9bf3852d..a950ae563a 100644 --- a/packages/app/src/library/PageWithTitle/index.tsx +++ b/packages/app/src/library/PageWithTitle/index.tsx @@ -14,8 +14,8 @@ export const PageWithTitle = ({ page }: { page: PageItem }) => { <Page.Container> <Helmet> <title>{`${t('title', { - ns: 'base', - })} : ${t(key, { ns: 'base' })}`} + ns: 'app', + })} : ${t(key, { ns: 'app' })}`} diff --git a/packages/app/src/library/PayeeInput/index.tsx b/packages/app/src/library/PayeeInput/index.tsx index 4a48e5affe..f4070424c2 100644 --- a/packages/app/src/library/PayeeInput/index.tsx +++ b/packages/app/src/library/PayeeInput/index.tsx @@ -21,7 +21,7 @@ export const PayeeInput = ({ setAccount, handleChange, }: PayeeInputProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getBondedAccount } = useBonded() const { accounts } = useImportedAccounts() const { diff --git a/packages/app/src/library/Pool/Rewards.tsx b/packages/app/src/library/Pool/Rewards.tsx index 053e230399..d204656559 100644 --- a/packages/app/src/library/Pool/Rewards.tsx +++ b/packages/app/src/library/Pool/Rewards.tsx @@ -12,7 +12,7 @@ import { Graph } from 'ui-core/list' import type { RewardProps, RewardsGraphProps } from './types' export const Rewards = ({ displayFor = 'default' }: RewardProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { isReady } = useApi() const { erasPerDay } = useErasPerDay() const { setTooltipTextAndOpen } = useTooltip() diff --git a/packages/app/src/library/PoolList/index.tsx b/packages/app/src/library/PoolList/index.tsx index 3017609109..4288b0da93 100644 --- a/packages/app/src/library/PoolList/index.tsx +++ b/packages/app/src/library/PoolList/index.tsx @@ -37,7 +37,7 @@ export const PoolList = ({ allowListFormat = true, itemsPerPage, }: PoolListProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { activeEra } = useApi() const { syncing } = useSyncing() const { network } = useNetwork() diff --git a/packages/app/src/library/Prompt/Title.tsx b/packages/app/src/library/Prompt/Title.tsx index 18518ae48c..307a2e3854 100644 --- a/packages/app/src/library/Prompt/Title.tsx +++ b/packages/app/src/library/Prompt/Title.tsx @@ -27,7 +27,7 @@ export const Title = ({ hideDone, closeText, }: TitleProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { closePrompt } = usePrompt() const { openHelp } = useHelp() diff --git a/packages/app/src/library/SetupSteps/Footer/index.tsx b/packages/app/src/library/SetupSteps/Footer/index.tsx index 74286e8389..a4b05d39d3 100644 --- a/packages/app/src/library/SetupSteps/Footer/index.tsx +++ b/packages/app/src/library/SetupSteps/Footer/index.tsx @@ -9,7 +9,7 @@ import type { FooterProps } from '../types' import { Wrapper } from './Wrapper' export const Footer = ({ complete, bondFor }: FooterProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { activeAccount } = useActiveAccounts() const { getPoolSetup, getNominatorSetup, setActiveAccountSetupSection } = useSetup() diff --git a/packages/app/src/library/SetupSteps/Header/index.tsx b/packages/app/src/library/SetupSteps/Header/index.tsx index d0c8fc06e7..751594e9e9 100644 --- a/packages/app/src/library/SetupSteps/Header/index.tsx +++ b/packages/app/src/library/SetupSteps/Header/index.tsx @@ -16,7 +16,7 @@ export const Header = ({ thisSection, bondFor, }: HeaderProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { openHelp } = useHelp() const { activeAccount } = useActiveAccounts() const { getPoolSetup, getNominatorSetup, setActiveAccountSetupSection } = diff --git a/packages/app/src/library/SetupSteps/Nominate.tsx b/packages/app/src/library/SetupSteps/Nominate.tsx index 2d8a907c3d..099f8f5124 100644 --- a/packages/app/src/library/SetupSteps/Nominate.tsx +++ b/packages/app/src/library/SetupSteps/Nominate.tsx @@ -14,7 +14,7 @@ import { GenerateNominations } from '../GenerateNominations' import type { NominationsProps } from './types' export const Nominate = ({ bondFor, section }: NominationsProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { consts } = useApi() const { activeAccount } = useActiveAccounts() const { getNominatorSetup, getPoolSetup, setActiveAccountSetup } = useSetup() diff --git a/packages/app/src/library/SideMenu/Main.tsx b/packages/app/src/library/SideMenu/Main.tsx index 2f0f137eae..85504ef179 100644 --- a/packages/app/src/library/SideMenu/Main.tsx +++ b/packages/app/src/library/SideMenu/Main.tsx @@ -19,7 +19,7 @@ import { Heading } from './Heading/Heading' import { Primary } from './Primary' export const Main = () => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const { syncing } = useSyncing() const { pathname } = useLocation() const { inPool } = useActivePool() diff --git a/packages/app/src/library/SideMenu/index.tsx b/packages/app/src/library/SideMenu/index.tsx index eeb4d42505..e37f46967f 100644 --- a/packages/app/src/library/SideMenu/index.tsx +++ b/packages/app/src/library/SideMenu/index.tsx @@ -35,7 +35,7 @@ import { Secondary } from './Secondary' import { LogoWrapper, Separator, Wrapper } from './Wrapper' export const SideMenu = () => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const { openHelp } = useHelp() const { apiStatus } = useApi() const { @@ -143,7 +143,7 @@ export const SideMenu = () => { /> openModal({ key: 'MailSupport', size: 'sm' })} - name={t('email', { ns: 'base' })} + name={t('email', { ns: 'app' })} minimised={sideMenuMinimised} icon={{ Svg: EnvelopeSVG, diff --git a/packages/app/src/library/SubmitTx/ManualSign/Ledger/Submit.tsx b/packages/app/src/library/SubmitTx/ManualSign/Ledger/Submit.tsx index de7b1004ea..0ae01b8fad 100644 --- a/packages/app/src/library/SubmitTx/ManualSign/Ledger/Submit.tsx +++ b/packages/app/src/library/SubmitTx/ManualSign/Ledger/Submit.tsx @@ -18,7 +18,7 @@ export const Submit = ({ onSubmit, disabled, }: LedgerSubmitProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { network } = useNetwork() const { txMetadataChainId } = getLedgerApp(network) const { getIsExecuting, integrityChecked, checkRuntimeVersion } = diff --git a/packages/app/src/library/SubmitTx/ManualSign/Ledger/index.tsx b/packages/app/src/library/SubmitTx/ManualSign/Ledger/index.tsx index 41c3034def..60f9d1c7f6 100644 --- a/packages/app/src/library/SubmitTx/ManualSign/Ledger/index.tsx +++ b/packages/app/src/library/SubmitTx/ManualSign/Ledger/index.tsx @@ -33,7 +33,7 @@ export const Ledger = ({ notEnoughFunds: boolean submitted: boolean }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { setFeedback, getFeedback, diff --git a/packages/app/src/library/SubmitTx/ManualSign/Vault/SignPrompt.tsx b/packages/app/src/library/SubmitTx/ManualSign/Vault/SignPrompt.tsx index 3e638bef4c..f9628c251c 100644 --- a/packages/app/src/library/SubmitTx/ManualSign/Vault/SignPrompt.tsx +++ b/packages/app/src/library/SubmitTx/ManualSign/Vault/SignPrompt.tsx @@ -24,7 +24,7 @@ export const SignPrompt = ({ const { chainSpecs: { genesisHash }, } = useApi() - const { t } = useTranslation('library') + const { t } = useTranslation('app') // Whether user is on sign or submit stage. const [stage, setStage] = useState(1) diff --git a/packages/app/src/library/SubmitTx/ManualSign/Vault/index.tsx b/packages/app/src/library/SubmitTx/ManualSign/Vault/index.tsx index d6839c6731..475b8e8373 100644 --- a/packages/app/src/library/SubmitTx/ManualSign/Vault/index.tsx +++ b/packages/app/src/library/SubmitTx/ManualSign/Vault/index.tsx @@ -27,7 +27,7 @@ export const Vault = ({ notEnoughFunds: boolean submitted: boolean }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { status: promptStatus } = usePrompt() const { accountHasSigner } = useImportedAccounts() diff --git a/packages/app/src/library/SubmitTx/ManualSign/WalletConnect/index.tsx b/packages/app/src/library/SubmitTx/ManualSign/WalletConnect/index.tsx index 23116f8cfe..9348826f71 100644 --- a/packages/app/src/library/SubmitTx/ManualSign/WalletConnect/index.tsx +++ b/packages/app/src/library/SubmitTx/ManualSign/WalletConnect/index.tsx @@ -28,7 +28,7 @@ export const WalletConnect = ({ notEnoughFunds: boolean submitted: boolean }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getTxSubmission } = useTxMeta() const { accountHasSigner } = useImportedAccounts() const { wcSessionActive, connectProvider, fetchAddresses } = diff --git a/packages/app/src/library/SubmitTx/index.tsx b/packages/app/src/library/SubmitTx/index.tsx index 1a5d386203..a197416661 100644 --- a/packages/app/src/library/SubmitTx/index.tsx +++ b/packages/app/src/library/SubmitTx/index.tsx @@ -55,18 +55,18 @@ export const SubmitTx = ({ // Default to active account let signingOpts = { - label: t('signer', { ns: 'library' }), + label: t('signer', { ns: 'app' }), who: getAccount(activeAccount), } if (activeProxy && proxySupported) { signingOpts = { - label: t('signedByProxy', { ns: 'library' }), + label: t('signedByProxy', { ns: 'app' }), who: getAccount(activeProxy), } } else if (!(activeProxy && proxySupported) && fromController) { signingOpts = { - label: t('signedByController', { ns: 'library' }), + label: t('signedByController', { ns: 'app' }), who: getAccount(controller), } } @@ -94,7 +94,7 @@ export const SubmitTx = ({ label={signingOpts.label} name={signingOpts.who?.name || ''} notEnoughFunds={notEnoughFunds} - dangerMessage={`${t('notEnough', { ns: 'library' })} ${unit}`} + dangerMessage={`${t('notEnough', { ns: 'app' })} ${unit}`} SignerComponent={ requiresManualSign(from) ? ( { {!!page && ( { closePrompt() diff --git a/packages/app/src/library/ValidatorList/Filters/FilterBadges.tsx b/packages/app/src/library/ValidatorList/Filters/FilterBadges.tsx index 8b6013acf7..ff5054c1ab 100644 --- a/packages/app/src/library/ValidatorList/Filters/FilterBadges.tsx +++ b/packages/app/src/library/ValidatorList/Filters/FilterBadges.tsx @@ -10,7 +10,7 @@ import { useEffect } from 'react' import { useTranslation } from 'react-i18next' export const FilterBadges = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getFilters, getOrder, toggleFilter } = useFilters() const { includesToLabels, excludesToLabels, ordersToLabels } = useValidatorFilters() diff --git a/packages/app/src/library/ValidatorList/Filters/FilterHeaders.tsx b/packages/app/src/library/ValidatorList/Filters/FilterHeaders.tsx index eac106b004..671e1fce6a 100644 --- a/packages/app/src/library/ValidatorList/Filters/FilterHeaders.tsx +++ b/packages/app/src/library/ValidatorList/Filters/FilterHeaders.tsx @@ -13,7 +13,7 @@ import { FilterValidators } from '../Prompts/FilterValidators' import { OrderValidators } from '../Prompts/OrderValidators' export const FilterHeaders = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { openPromptWith } = usePrompt() const { resetFilters, getFilters } = useFilters() diff --git a/packages/app/src/library/ValidatorList/Item.tsx b/packages/app/src/library/ValidatorList/Item.tsx index 3c33e7bea7..b0cf4068e8 100644 --- a/packages/app/src/library/ValidatorList/Item.tsx +++ b/packages/app/src/library/ValidatorList/Item.tsx @@ -39,7 +39,7 @@ export const Item = ({ displayFor, eraPoints, }: ItemProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { selectActive } = useList() const { openMenu, open } = useMenu() const { pluginEnabled } = usePlugins() diff --git a/packages/app/src/library/ValidatorList/Prompts/FilterValidators.tsx b/packages/app/src/library/ValidatorList/Prompts/FilterValidators.tsx index 921016fbae..17da80774f 100644 --- a/packages/app/src/library/ValidatorList/Prompts/FilterValidators.tsx +++ b/packages/app/src/library/ValidatorList/Prompts/FilterValidators.tsx @@ -10,7 +10,7 @@ import { FilterListButton, FilterListWrapper } from 'library/Prompt/Wrappers' import { useTranslation } from 'react-i18next' export const FilterValidators = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getFilters, toggleFilter } = useFilters() const { excludesToLabels, includesToLabels } = useValidatorFilters() diff --git a/packages/app/src/library/ValidatorList/Prompts/OrderValidators.tsx b/packages/app/src/library/ValidatorList/Prompts/OrderValidators.tsx index 48855e949f..54b505d479 100644 --- a/packages/app/src/library/ValidatorList/Prompts/OrderValidators.tsx +++ b/packages/app/src/library/ValidatorList/Prompts/OrderValidators.tsx @@ -10,7 +10,7 @@ import { FilterListButton, FilterListWrapper } from 'library/Prompt/Wrappers' import { useTranslation } from 'react-i18next' export const OrderValidators = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { getOrder, setOrder } = useFilters() const { ordersToLabels } = useValidatorFilters() diff --git a/packages/app/src/library/ValidatorList/index.tsx b/packages/app/src/library/ValidatorList/index.tsx index cf05863ee9..12a2a0e48e 100644 --- a/packages/app/src/library/ValidatorList/index.tsx +++ b/packages/app/src/library/ValidatorList/index.tsx @@ -291,7 +291,7 @@ export const ValidatorListInner = ({ if (!bootstrapped) { return (
-

{t('validators.fetchingValidators', { ns: 'pages' })}...

+

{t('fetchingValidators', { ns: 'pages' })}...

) } @@ -303,7 +303,7 @@ export const ValidatorListInner = ({ )} @@ -386,8 +386,8 @@ export const ValidatorListInner = ({ ) : (

{isSearching - ? t('noValidatorsMatch', { ns: 'library' }) - : t('noValidators', { ns: 'library' })} + ? t('noValidatorsMatch', { ns: 'app' }) + : t('noValidators', { ns: 'app' })}

)} diff --git a/packages/app/src/overlay/canvas/CreatePool/Bond/index.tsx b/packages/app/src/overlay/canvas/CreatePool/Bond/index.tsx index afe6beaaee..8d226d44c2 100644 --- a/packages/app/src/overlay/canvas/CreatePool/Bond/index.tsx +++ b/packages/app/src/overlay/canvas/CreatePool/Bond/index.tsx @@ -73,7 +73,7 @@ export const Bond = ({ section }: SetupStepProps) => {
diff --git a/packages/app/src/overlay/canvas/CreatePool/PoolName/Input.tsx b/packages/app/src/overlay/canvas/CreatePool/PoolName/Input.tsx index 52eba419ce..4618b00ed0 100644 --- a/packages/app/src/overlay/canvas/CreatePool/PoolName/Input.tsx +++ b/packages/app/src/overlay/canvas/CreatePool/PoolName/Input.tsx @@ -45,13 +45,13 @@ export const Input = ({ ) => handleChange(e)} value={metadata ?? ''} />
-

{t('pools.poolNameSupport')}

+

{t('poolNameSupport')}

) } diff --git a/packages/app/src/overlay/canvas/CreatePool/PoolName/index.tsx b/packages/app/src/overlay/canvas/CreatePool/PoolName/index.tsx index 1326ada684..8c18eba77e 100644 --- a/packages/app/src/overlay/canvas/CreatePool/PoolName/index.tsx +++ b/packages/app/src/overlay/canvas/CreatePool/PoolName/index.tsx @@ -57,7 +57,7 @@ export const PoolName = ({ section }: SetupStepProps) => {
diff --git a/packages/app/src/overlay/canvas/CreatePool/PoolRoles/index.tsx b/packages/app/src/overlay/canvas/CreatePool/PoolRoles/index.tsx index ed6552fe7e..c6be688304 100644 --- a/packages/app/src/overlay/canvas/CreatePool/PoolRoles/index.tsx +++ b/packages/app/src/overlay/canvas/CreatePool/PoolRoles/index.tsx @@ -65,17 +65,17 @@ export const PoolRoles = ({ section }: SetupStepProps) => {

- }} /> + }} />

}} />

diff --git a/packages/app/src/overlay/canvas/CreatePool/Summary/index.tsx b/packages/app/src/overlay/canvas/CreatePool/Summary/index.tsx index c6a26ef0a0..f59da87083 100644 --- a/packages/app/src/overlay/canvas/CreatePool/Summary/index.tsx +++ b/packages/app/src/overlay/canvas/CreatePool/Summary/index.tsx @@ -88,25 +88,25 @@ export const Summary = ({ section }: SetupStepProps) => {
{!( accountHasSigner(activeAccount) || accountHasSigner(activeProxy) - ) && } + ) && }
 {' '} - {t('pools.poolName')}: + {t('poolName')}:
-
{metadata ?? `${t('pools.notSet')}`}
+
{metadata ?? `${t('notSet')}`}
 {' '} - {t('pools.bondAmount')}: + {t('bondAmount')}:
{new BigNumber(bond).toFormat()} {unit} @@ -115,16 +115,16 @@ export const Summary = ({ section }: SetupStepProps) => {
  - {t('pools.nominating')}: + {t('nominating')}:
-
{t('nominate.validator', { count: nominations.length })}
+
{t('validatorCount', { count: nominations.length })}
 {' '} - {t('pools.roles')}: + {t('roles')}:
-
{t('pools.assigned')}
+
{t('assigned')}
{ }} > { /> - <h1>{t('pools.createAPool', { ns: 'pages' })}</h1> + <h1>{t('createAPool', { ns: 'pages' })}</h1> diff --git a/packages/app/src/overlay/canvas/ManageNominations/index.tsx b/packages/app/src/overlay/canvas/ManageNominations/index.tsx index d4237edd02..788e4c50da 100644 --- a/packages/app/src/overlay/canvas/ManageNominations/index.tsx +++ b/packages/app/src/overlay/canvas/ManageNominations/index.tsx @@ -28,7 +28,7 @@ import { useOverlay } from 'ui-overlay' import { RevertPrompt } from './Prompts/RevertPrompt' export const ManageNominations = () => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { closeCanvas, setCanvasStatus, @@ -159,7 +159,7 @@ export const ManageNominations = () => { } /> closeCanvas()} iconLeft={faTimes} @@ -170,7 +170,7 @@ export const ManageNominations = () => {

{t('manageNominations', { ns: 'modals' })}

{t('chooseValidators', { - ns: 'library', + ns: 'app', maxNominations: maxNominations.toString(), })} {
diff --git a/packages/app/src/overlay/canvas/NominatorSetup/Payee/index.tsx b/packages/app/src/overlay/canvas/NominatorSetup/Payee/index.tsx index bc8408484b..1dcd165a55 100644 --- a/packages/app/src/overlay/canvas/NominatorSetup/Payee/index.tsx +++ b/packages/app/src/overlay/canvas/NominatorSetup/Payee/index.tsx @@ -70,13 +70,13 @@ export const Payee = ({ section }: SetupStepProps) => {
-

{t('nominate.payoutDestinationSubtitle')}

+

{t('payoutDestinationSubtitle')}

diff --git a/packages/app/src/overlay/canvas/NominatorSetup/Summary/index.tsx b/packages/app/src/overlay/canvas/NominatorSetup/Summary/index.tsx index 0924002022..40a81a3c53 100644 --- a/packages/app/src/overlay/canvas/NominatorSetup/Summary/index.tsx +++ b/packages/app/src/overlay/canvas/NominatorSetup/Summary/index.tsx @@ -96,18 +96,18 @@ export const Summary = ({ section }: SetupStepProps) => {
{!( accountHasSigner(activeAccount) || accountHasSigner(activeProxy) - ) && } + ) && }
 {' '} - {t('nominate.payoutDestination')}: + {t('payoutDestination')}:
{payee.destination === 'Account' @@ -118,14 +118,14 @@ export const Summary = ({ section }: SetupStepProps) => {
 {' '} - {t('nominate.nominating')}: + {t('nominating')}:
-
{t('nominate.validator', { count: nominations.length })}
+
{t('validatorCount', { count: nominations.length })}
 {' '} - {t('nominate.bondAmount')}: + {t('bondAmount')}:
{new BigNumber(bond || 0).toFormat()} {unit} @@ -141,7 +141,7 @@ export const Summary = ({ section }: SetupStepProps) => { }} > { /> - <h1>{t('nominate.startNominating')}</h1> + <h1>{t('startNominating')}</h1> diff --git a/packages/app/src/overlay/canvas/Pool/Header.tsx b/packages/app/src/overlay/canvas/Pool/Header.tsx index 97990b09cb..e3178810f9 100644 --- a/packages/app/src/overlay/canvas/Pool/Header.tsx +++ b/packages/app/src/overlay/canvas/Pool/Header.tsx @@ -53,7 +53,7 @@ export const Header = ({ {providedPoolId === null && ( handleChooseNewPool()} lg @@ -86,10 +86,10 @@ export const Header = ({

- {t('pool', { ns: 'library' })} {bondedPool.id} + {t('pool', { ns: 'app' })} {bondedPool.id} {['Blocked', 'Destroying'].includes(bondedPool.state) && ( - {t(bondedPool.state.toLowerCase(), { ns: 'library' })} + {t(bondedPool.state.toLowerCase(), { ns: 'app' })} )}

@@ -102,7 +102,7 @@ export const Header = ({ )} {autoSelected && (

- {t('autoSelected', { ns: 'library' })} + {t('autoSelected', { ns: 'app' })}

)}
@@ -113,12 +113,12 @@ export const Header = ({ sticky={false} tabs={[ { - title: t('pools.overview', { ns: 'pages' }), + title: t('overview', { ns: 'pages' }), active: activeTab === 0, onClick: () => setActiveTab(0), }, { - title: t('nominate.nominations', { ns: 'pages' }), + title: t('nominations', { ns: 'pages' }), active: activeTab === 1, onClick: () => setActiveTab(1), }, diff --git a/packages/app/src/overlay/canvas/Pool/Nominations/index.tsx b/packages/app/src/overlay/canvas/Pool/Nominations/index.tsx index 1564b35ee5..0dc35b64e7 100644 --- a/packages/app/src/overlay/canvas/Pool/Nominations/index.tsx +++ b/packages/app/src/overlay/canvas/Pool/Nominations/index.tsx @@ -25,8 +25,8 @@ export const Nominations = ({ stash, poolId }: NominationsProps) => {

{!targets.length - ? t('nominate.noNominationsSet', { ns: 'pages' }) - : `${targets.length} ${t('nominations', { ns: 'library', count: targets.length })}`} + ? t('noNominationsSet', { ns: 'pages' }) + : `${targets.length} ${t('nominations', { ns: 'app', count: targets.length })}`}

diff --git a/packages/app/src/overlay/canvas/Pool/Overview/Addresses.tsx b/packages/app/src/overlay/canvas/Pool/Overview/Addresses.tsx index 6103ec6fd9..d56503fe65 100644 --- a/packages/app/src/overlay/canvas/Pool/Overview/Addresses.tsx +++ b/packages/app/src/overlay/canvas/Pool/Overview/Addresses.tsx @@ -12,7 +12,7 @@ import { AddressesWrapper } from '../Wrappers' export const Addresses = ({ bondedPool: { addresses }, }: OverviewSectionProps) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') return ( diff --git a/packages/app/src/overlay/canvas/Pool/Overview/JoinForm.tsx b/packages/app/src/overlay/canvas/Pool/Overview/JoinForm.tsx index 12610ca9e2..cce49d0207 100644 --- a/packages/app/src/overlay/canvas/Pool/Overview/JoinForm.tsx +++ b/packages/app/src/overlay/canvas/Pool/Overview/JoinForm.tsx @@ -117,9 +117,9 @@ export const JoinForm = ({ bondedPool }: OverviewSectionProps) => { return ( -

{t('pools.joinPool', { ns: 'pages' })}

+

{t('joinPool', { ns: 'pages' })}

- {t('bond', { ns: 'library' })} {unit} + {t('bond', { ns: 'app' })} {unit}

@@ -139,7 +139,7 @@ export const JoinForm = ({ bondedPool }: OverviewSectionProps) => { />
-

{t('claimSetting', { ns: 'library' })}

+

{t('claimSetting', { ns: 'app' })}

{ @@ -149,7 +149,7 @@ export const JoinForm = ({ bondedPool }: OverviewSectionProps) => {
{

- {t('rewardHistory', { ns: 'library' })} + {t('rewardHistory', { ns: 'app' })} { diff --git a/packages/app/src/overlay/canvas/Pool/Overview/Roles.tsx b/packages/app/src/overlay/canvas/Pool/Overview/Roles.tsx index 735dfde68f..d09124fba2 100644 --- a/packages/app/src/overlay/canvas/Pool/Overview/Roles.tsx +++ b/packages/app/src/overlay/canvas/Pool/Overview/Roles.tsx @@ -46,7 +46,7 @@ export const Roles = ({

- {t('pools.roles')} + {t('roles')} openHelp('Pool Roles')} />

@@ -54,7 +54,7 @@ export const Roles = ({ {bondedPool.roles.root && (
} @@ -65,7 +65,7 @@ export const Roles = ({ {bondedPool.roles.nominator && (
} @@ -76,7 +76,7 @@ export const Roles = ({ {bondedPool.roles.bouncer && (
} @@ -87,7 +87,7 @@ export const Roles = ({ {bondedPool.roles.depositor && (
} diff --git a/packages/app/src/overlay/canvas/Pool/Overview/Stats.tsx b/packages/app/src/overlay/canvas/Pool/Overview/Stats.tsx index 0fe1a1bc92..81cd7824ab 100644 --- a/packages/app/src/overlay/canvas/Pool/Overview/Stats.tsx +++ b/packages/app/src/overlay/canvas/Pool/Overview/Stats.tsx @@ -18,7 +18,7 @@ export const Stats = ({ }: OverviewSectionProps & { graphSyncing?: boolean }) => { - const { t } = useTranslation('library') + const { t } = useTranslation('app') const { network, networkData: { diff --git a/packages/app/src/overlay/canvas/Pool/Preloader.tsx b/packages/app/src/overlay/canvas/Pool/Preloader.tsx index cf4ec79bd2..c3d3caff28 100644 --- a/packages/app/src/overlay/canvas/Pool/Preloader.tsx +++ b/packages/app/src/overlay/canvas/Pool/Preloader.tsx @@ -44,9 +44,9 @@ export const Preloader = () => { /> - <h1>{t('pools.pools')}</h1> + <h1>{t('pools')}</h1> <h3> - {t('pools.joinPoolHeading', { + {t('joinPoolHeading', { totalMembers: new BigNumber(counterForPoolMembers).toFormat(), totalPoolPoints: totalPoolPointsUnit, unit, @@ -54,9 +54,7 @@ export const Preloader = () => { })} </h3> - + ) } diff --git a/packages/app/src/overlay/canvas/PoolMembers/Lists/FetchPage.tsx b/packages/app/src/overlay/canvas/PoolMembers/Lists/FetchPage.tsx index 95f684aaf3..f706df87f6 100644 --- a/packages/app/src/overlay/canvas/PoolMembers/Lists/FetchPage.tsx +++ b/packages/app/src/overlay/canvas/PoolMembers/Lists/FetchPage.tsx @@ -104,7 +104,7 @@ export const MembersListInner = ({ )} {fetchedPoolMembersApi !== 'synced' ? ( - {t('pools.fetchingMemberList')}.... + {t('fetchingMemberList')}.... ) : ( diff --git a/packages/app/src/overlay/canvas/PoolMembers/Lists/Member.tsx b/packages/app/src/overlay/canvas/PoolMembers/Lists/Member.tsx index a748fcf5bd..a9161f8e18 100644 --- a/packages/app/src/overlay/canvas/PoolMembers/Lists/Member.tsx +++ b/packages/app/src/overlay/canvas/PoolMembers/Lists/Member.tsx @@ -64,7 +64,7 @@ export const Member = ({ menuItems.push({ icon: , wrap: null, - title: `${t('pools.unbondFunds', { ns: 'pages' })}`, + title: `${t('unbondFunds', { ns: 'pages' })}`, cb: () => { openPromptWith() }, @@ -83,7 +83,7 @@ export const Member = ({ menuItems.push({ icon: , wrap: null, - title: `${t('pools.withdrawFunds', { ns: 'pages' })}`, + title: `${t('withdrawFunds', { ns: 'pages' })}`, cb: () => { openPromptWith( diff --git a/packages/app/src/overlay/canvas/PoolMembers/Members.tsx b/packages/app/src/overlay/canvas/PoolMembers/Members.tsx index 24205fc3fa..132156b0bc 100644 --- a/packages/app/src/overlay/canvas/PoolMembers/Members.tsx +++ b/packages/app/src/overlay/canvas/PoolMembers/Members.tsx @@ -40,11 +40,11 @@ export const Members = () => { }} >
-

{t('pools.poolCurrentlyLocked')}

+

{t('poolCurrentlyLocked')}

- {t('pools.permissionToUnbond')}({' '} + {t('permissionToUnbond')}({' '} ){' '} - {t('pools.managementOptions')} + {t('managementOptions')}

@@ -60,11 +60,11 @@ export const Members = () => { }} >
-

{t('pools.poolInDestroyingState')}

+

{t('poolInDestroyingState')}

- {t('pools.permissionToUnbond')} ({' '} + {t('permissionToUnbond')} ({' '} ){' '} - {t('pools.managementOptions')} + {t('managementOptions')}

diff --git a/packages/app/src/overlay/canvas/PoolMembers/index.tsx b/packages/app/src/overlay/canvas/PoolMembers/index.tsx index 3b580b50ed..a8104644fe 100644 --- a/packages/app/src/overlay/canvas/PoolMembers/index.tsx +++ b/packages/app/src/overlay/canvas/PoolMembers/index.tsx @@ -16,7 +16,7 @@ export const PoolMembers = () => {
closeCanvas()} iconLeft={faTimes} diff --git a/packages/app/src/overlay/canvas/ValidatorMetrics/index.tsx b/packages/app/src/overlay/canvas/ValidatorMetrics/index.tsx index c48d6bf41d..7a6966933e 100644 --- a/packages/app/src/overlay/canvas/ValidatorMetrics/index.tsx +++ b/packages/app/src/overlay/canvas/ValidatorMetrics/index.tsx @@ -147,7 +147,7 @@ export const ValidatorMetrics = () => {

- {t('recentPerformance', { ns: 'library' })} + {t('recentPerformance', { ns: 'app' })} { {

- {t('rewardHistory', { ns: 'library' })} + {t('rewardHistory', { ns: 'app' })} { diff --git a/packages/app/src/overlay/modals/ImportVault/index.tsx b/packages/app/src/overlay/modals/ImportVault/index.tsx index e4e1092eec..b110b1d0be 100644 --- a/packages/app/src/overlay/modals/ImportVault/index.tsx +++ b/packages/app/src/overlay/modals/ImportVault/index.tsx @@ -132,8 +132,8 @@ export const ImportVault = () => { replaceModal({ key: 'Connect', options: { disableScroll: true } }) } t={{ - tDone: t('done', { ns: 'library' }), - tCancel: t('cancel', { ns: 'library' }), + tDone: t('done', { ns: 'app' }), + tCancel: t('cancel', { ns: 'app' }), }} /> diff --git a/packages/app/src/overlay/modals/ImportWalletConnect/index.tsx b/packages/app/src/overlay/modals/ImportWalletConnect/index.tsx index 9179c6b43c..4d29984c1a 100644 --- a/packages/app/src/overlay/modals/ImportWalletConnect/index.tsx +++ b/packages/app/src/overlay/modals/ImportWalletConnect/index.tsx @@ -117,14 +117,14 @@ export const ImportWalletConnect = () => { replaceModal({ key: 'Connect', options: { disableScroll: true } }) } t={{ - tDone: t('done', { ns: 'library' }), - tCancel: t('cancel', { ns: 'library' }), + tDone: t('done', { ns: 'app' }), + tCancel: t('cancel', { ns: 'app' }), }} /> diff --git a/packages/app/src/overlay/modals/RewardCalculator/index.tsx b/packages/app/src/overlay/modals/RewardCalculator/index.tsx index 846aa02760..3c7ca72765 100644 --- a/packages/app/src/overlay/modals/RewardCalculator/index.tsx +++ b/packages/app/src/overlay/modals/RewardCalculator/index.tsx @@ -74,17 +74,17 @@ export const RewardCalculator = () => { return (
<Padding horizontalOnly> <ContentWrapper> - <h4>{t('rewards.rewardCalcSubtitle', { ns: 'pages', unit })}</h4> + <h4>{t('rewardCalcSubtitle', { ns: 'pages', unit })}</h4> <TokenInput id="reward-calc-token-input" - label={`${t('rewards.unitAmount', { ns: 'pages', unit })}`} + label={`${t('unitAmount', { ns: 'pages', unit })}`} onChange={onChange} - placeholder={t('rewards.stakePlaceholder', { ns: 'pages' })} + placeholder={t('stakePlaceholder', { ns: 'pages' })} value={String(stakeAmount || 0)} marginY />{' '} @@ -103,7 +103,7 @@ export const RewardCalculator = () => { }} transform={'grow-6'} /> - {t('rewards.deductAvgCommissionOf', { + {t('deductAvgCommissionOf', { ns: 'pages', commission: avgCommission, })} @@ -112,8 +112,7 @@ export const RewardCalculator = () => { <Separator lg /> <CardHeader> <h4> - {t('rewards.daily', { ns: 'pages' })}{' '} - {t('rewards', { ns: 'modals' })} + {t('daily', { ns: 'pages' })} {t('rewards', { ns: 'modals' })} </h4> <TokenFiat Token={<Token />}> <h1> @@ -133,8 +132,7 @@ export const RewardCalculator = () => { <Separator lg /> <CardHeader> <h4> - {t('rewards.monthly', { ns: 'pages' })}{' '} - {t('rewards', { ns: 'modals' })} + {t('monthly', { ns: 'pages' })} {t('rewards', { ns: 'modals' })} </h4> <TokenFiat Token={<Token />}> <h1> @@ -154,8 +152,7 @@ export const RewardCalculator = () => { <Separator lg /> <CardHeader> <h4> - {t('rewards.annual', { ns: 'pages' })}{' '} - {t('rewards', { ns: 'modals' })} + {t('annual', { ns: 'pages' })} {t('rewards', { ns: 'modals' })} </h4> <TokenFiat Token={<Token />}> <h1> diff --git a/packages/app/src/overlay/modals/Settings/index.tsx b/packages/app/src/overlay/modals/Settings/index.tsx index 5658e57018..99376f1bb1 100644 --- a/packages/app/src/overlay/modals/Settings/index.tsx +++ b/packages/app/src/overlay/modals/Settings/index.tsx @@ -30,7 +30,7 @@ export const Settings = () => { <StatusButton key={plugin} checked={plugins.includes(plugin)} - label={t(`plugin.${plugin}`, { ns: 'base' })} + label={t(`plugin.${plugin}`, { ns: 'app' })} onClick={() => togglePlugin(plugin)} /> ) diff --git a/packages/app/src/pages/Community/Entity.tsx b/packages/app/src/pages/Community/Entity.tsx index f69fea9727..9309195756 100644 --- a/packages/app/src/pages/Community/Entity.tsx +++ b/packages/app/src/pages/Community/Entity.tsx @@ -57,7 +57,7 @@ export const Entity = () => { <Page.Row> <Page.Heading> <ButtonSecondary - text={t('community.goBack')} + text={t('goBack')} iconLeft={faChevronLeft} iconTransform="shrink-3" onClick={() => setActiveSection(0)} @@ -69,7 +69,7 @@ export const Entity = () => { <CardWrapper> {!isReady ? ( <div className="item"> - <h3>{t('community.connecting')}...</h3> + <h3>{t('connecting')}...</h3> </div> ) : ( <> @@ -77,8 +77,8 @@ export const Entity = () => { <div className="item"> <h3> {validators.length - ? `${t('community.fetchingValidators')}...` - : t('community.noValidators')} + ? `${t('fetchingValidators')}...` + : t('noValidators')} </h3> </div> )} diff --git a/packages/app/src/pages/Community/Item.tsx b/packages/app/src/pages/Community/Item.tsx index d886e6d1ca..841da5688a 100644 --- a/packages/app/src/pages/Community/Item.tsx +++ b/packages/app/src/pages/Community/Item.tsx @@ -79,7 +79,7 @@ export const Item = ({ item, actionable }: ItemProps) => { onClick={() => openModal({ key: 'Bio', options: { name, bio } })} className="active" > - <span>{t('community.bio')}</span> + <span>{t('bio')}</span> </button> </h3> @@ -102,7 +102,7 @@ export const Item = ({ item, actionable }: ItemProps) => { transform="shrink-1" /> <h4> - {t('community.validator', { + {t('validator', { count: validatorCount, })} </h4> @@ -120,7 +120,7 @@ export const Item = ({ item, actionable }: ItemProps) => { transform="shrink-1" className="icon-left" /> - <h4>{t('community.email')}</h4> + <h4>{t('email')}</h4> <FontAwesomeIcon icon={faExternalLink} className="icon-right" @@ -153,7 +153,7 @@ export const Item = ({ item, actionable }: ItemProps) => { window.open(website, '_blank') }} > - <h4>{t('community.website')}</h4> + <h4>{t('website')}</h4> <FontAwesomeIcon icon={faExternalLink} className="icon-right" diff --git a/packages/app/src/pages/Community/index.tsx b/packages/app/src/pages/Community/index.tsx index 7bf2ca94b5..59baba031d 100644 --- a/packages/app/src/pages/Community/index.tsx +++ b/packages/app/src/pages/Community/index.tsx @@ -10,7 +10,7 @@ import { Wrapper } from './Wrappers' import { CommunitySectionsProvider, useCommunitySections } from './context' export const CommunityInner = ({ page }: PageProps) => { - const { t } = useTranslation('base') + const { t } = useTranslation('app') const { activeSection } = useCommunitySections() const { key } = page diff --git a/packages/app/src/pages/Nominate/Active/CommissionPrompt.tsx b/packages/app/src/pages/Nominate/Active/CommissionPrompt.tsx index 65b56a4695..8ab8af6b4a 100644 --- a/packages/app/src/pages/Nominate/Active/CommissionPrompt.tsx +++ b/packages/app/src/pages/Nominate/Active/CommissionPrompt.tsx @@ -45,14 +45,14 @@ export const CommissionPrompt = () => { <div className="content"> <h3> <FontAwesomeIcon icon={faWarning} />{' '} - {t('nominate.fullCommissionValidatorTitle')} + {t('fullCommissionValidatorTitle')} </h3> - <h4>{t('nominate.fullCommissionValidatorSubtitle')}</h4> + <h4>{t('fullCommissionValidatorSubtitle')}</h4> <ButtonRow yMargin> <ButtonPrimary iconLeft={faChevronCircleRight} iconTransform="grow-1" - text={`${t('nominate.manage', { ns: 'pages' })}`} + text={`${t('manage', { ns: 'pages' })}`} onClick={() => openCanvas({ key: 'ManageNominations', diff --git a/packages/app/src/pages/Nominate/Active/ManageBond.tsx b/packages/app/src/pages/Nominate/Active/ManageBond.tsx index a4627a76f1..1344072abb 100644 --- a/packages/app/src/pages/Nominate/Active/ManageBond.tsx +++ b/packages/app/src/pages/Nominate/Active/ManageBond.tsx @@ -83,7 +83,7 @@ export const ManageBond = () => { ) : ( <ButtonPrimary size="md" - text={t('nominate.unstake')} + text={t('unstake')} iconLeft={faSignOutAlt} disabled={!isReady || isReadOnlyAccount(controller) || !activeAccount} onClick={() => openModal({ key: 'Unstake', size: 'sm' })} @@ -99,7 +99,7 @@ export const ManageBond = () => { <> <CardHeader> <h4> - {t('nominate.bondedFunds')} + {t('bondedFunds')} <ButtonHelp marginLeft onClick={() => openHelp('Bonding')} /> </h4> <h2> diff --git a/packages/app/src/pages/Nominate/Active/Stats/ActiveNominators.tsx b/packages/app/src/pages/Nominate/Active/Stats/ActiveNominators.tsx index 18f83c7df0..e59185f162 100644 --- a/packages/app/src/pages/Nominate/Active/Stats/ActiveNominators.tsx +++ b/packages/app/src/pages/Nominate/Active/Stats/ActiveNominators.tsx @@ -23,7 +23,7 @@ export const ActiveNominators = () => { } const params = { - label: t('overview.activeNominators'), + label: t('activeNominators'), stat: { value: totalActiveNominators, total: counterForNominators.toNumber(), diff --git a/packages/app/src/pages/Nominate/Active/Stats/MinimumActiveStake.tsx b/packages/app/src/pages/Nominate/Active/Stats/MinimumActiveStake.tsx index ab8b524be8..1f90f4eeef 100644 --- a/packages/app/src/pages/Nominate/Active/Stats/MinimumActiveStake.tsx +++ b/packages/app/src/pages/Nominate/Active/Stats/MinimumActiveStake.tsx @@ -15,7 +15,7 @@ export const MinimumActiveStake = () => { const { minimumActiveStake } = useApi().networkMetrics const params = { - label: t('nominate.minimumToEarnRewards'), + label: t('minimumToEarnRewards'), value: planckToUnitBn(minimumActiveStake, units).toNumber(), decimals: 3, unit: `${unit}`, diff --git a/packages/app/src/pages/Nominate/Active/Stats/MinimumNominatorBond.tsx b/packages/app/src/pages/Nominate/Active/Stats/MinimumNominatorBond.tsx index 758ff1e32e..3aa4ce9ad6 100644 --- a/packages/app/src/pages/Nominate/Active/Stats/MinimumNominatorBond.tsx +++ b/packages/app/src/pages/Nominate/Active/Stats/MinimumNominatorBond.tsx @@ -13,7 +13,7 @@ export const MinimumNominatorBond = () => { const { minNominatorBond } = useApi().stakingMetrics const params = { - label: t('nominate.minimumToNominate'), + label: t('minimumToNominate'), value: planckToUnitBn(minNominatorBond, units).toNumber(), decimals: 3, unit: `${unit}`, diff --git a/packages/app/src/pages/Nominate/Active/Status/NewNominator.tsx b/packages/app/src/pages/Nominate/Active/Status/NewNominator.tsx index 04ee0dd600..3cff254f23 100644 --- a/packages/app/src/pages/Nominate/Active/Status/NewNominator.tsx +++ b/packages/app/src/pages/Nominate/Active/Status/NewNominator.tsx @@ -48,7 +48,7 @@ export const NewNominator = ({ syncing }: NewNominatorProps) => { } disabled={nominateButtonDisabled} > - {t('nominate.startNominating', { ns: 'pages' })} + {t('startNominating', { ns: 'pages' })} </button> </div> </div> @@ -57,7 +57,7 @@ export const NewNominator = ({ syncing }: NewNominatorProps) => { <div className="buttons"> <div className={`button secondary standalone`}> <button onClick={() => navigate('/validators')}> - {t('browseValidators', { ns: 'library' })} + {t('browseValidators', { ns: 'app' })} <FontAwesomeIcon icon={faChevronRight} transform="shrink-4" diff --git a/packages/app/src/pages/Nominate/Active/Status/NominationStatus.tsx b/packages/app/src/pages/Nominate/Active/Status/NominationStatus.tsx index e596c740c0..f6eb0a17fc 100644 --- a/packages/app/src/pages/Nominate/Active/Status/NominationStatus.tsx +++ b/packages/app/src/pages/Nominate/Active/Status/NominationStatus.tsx @@ -18,9 +18,9 @@ export const NominationStatus = () => { return ( <Stat - label={t('nominate.status')} + label={t('status')} helpKey="Nomination Status" - stat={inPool() ? t('nominate.alreadyInPool') : nominationStatus.message} + stat={inPool() ? t('alreadyInPool') : nominationStatus.message} /> ) } diff --git a/packages/app/src/pages/Nominate/Active/Status/PayoutDestinationStatus.tsx b/packages/app/src/pages/Nominate/Active/Status/PayoutDestinationStatus.tsx index 4ea95e7c27..a2a5329f48 100644 --- a/packages/app/src/pages/Nominate/Active/Status/PayoutDestinationStatus.tsx +++ b/packages/app/src/pages/Nominate/Active/Status/PayoutDestinationStatus.tsx @@ -29,7 +29,7 @@ export const PayoutDestinationStatus = () => { // Get payee status text to display. const getPayeeStatus = () => { if (inSetup()) { - return t('nominate.notAssigned') + return t('notAssigned') } const status = getPayeeItems(true).find( ({ value }) => value === payee.destination @@ -38,7 +38,7 @@ export const PayoutDestinationStatus = () => { if (status) { return status } - return t('nominate.notAssigned') + return t('notAssigned') } // Get the payee destination icon to display, falling back to wallet icon. @@ -49,7 +49,7 @@ export const PayoutDestinationStatus = () => { return ( <Stat - label={t('nominate.payoutDestination')} + label={t('payoutDestination')} helpKey="Payout Destination" icon={payeeIcon} stat={getPayeeStatus()} @@ -57,7 +57,7 @@ export const PayoutDestinationStatus = () => { !inSetup() ? [ { - title: t('nominate.update'), + title: t('update'), icon: faGear, small: true, disabled: diff --git a/packages/app/src/pages/Nominate/Active/Status/UnclaimedPayoutsStatus.tsx b/packages/app/src/pages/Nominate/Active/Status/UnclaimedPayoutsStatus.tsx index 381a432b8e..04a272ea48 100644 --- a/packages/app/src/pages/Nominate/Active/Status/UnclaimedPayoutsStatus.tsx +++ b/packages/app/src/pages/Nominate/Active/Status/UnclaimedPayoutsStatus.tsx @@ -29,7 +29,7 @@ export const UnclaimedPayoutsStatus = ({ dimmed }: { dimmed: boolean }) => { return ( <Stat - label={t('nominate.pendingPayouts', { ns: 'pages' })} + label={t('pendingPayouts', { ns: 'pages' })} helpKey="Payout" type="odometer" stat={{ diff --git a/packages/app/src/pages/Nominate/Active/UnstakePrompts.tsx b/packages/app/src/pages/Nominate/Active/UnstakePrompts.tsx index 580b550028..6b2a799aa0 100644 --- a/packages/app/src/pages/Nominate/Active/UnstakePrompts.tsx +++ b/packages/app/src/pages/Nominate/Active/UnstakePrompts.tsx @@ -48,17 +48,17 @@ export const UnstakePrompts = () => { > <div className="content"> <h3> - {t('nominate.unstakePromptInProgress', { + {t('unstakePromptInProgress', { context: isFastUnstaking ? 'fast' : 'regular', })} </h3> <h4> {isFastUnstaking - ? t('nominate.unstakePromptInQueue') + ? t('unstakePromptInQueue') : !canWithdrawUnlocks - ? t('nominate.unstakePromptWaitingForUnlocks') - : `${t('nominate.unstakePromptReadyToWithdraw')} ${t( - 'nominate.unstakePromptRevert', + ? t('unstakePromptWaitingForUnlocks') + : `${t('unstakePromptReadyToWithdraw')} ${t( + 'unstakePromptRevert', { unit } )}`} </h4> @@ -77,7 +77,7 @@ export const UnstakePrompts = () => { iconLeft={faLockOpen} text={ canWithdrawUnlocks - ? t('nominate.unlocked') + ? t('unlocked') : String(totalUnlockChunks ?? 0) } disabled={false} diff --git a/packages/app/src/pages/Nominate/Active/index.tsx b/packages/app/src/pages/Nominate/Active/index.tsx index d8484921c4..8d6204dca9 100644 --- a/packages/app/src/pages/Nominate/Active/index.tsx +++ b/packages/app/src/pages/Nominate/Active/index.tsx @@ -69,7 +69,7 @@ export const Active = () => { <> <CardHeader action margin> <h3> - {t('nominate.nominate', { ns: 'pages' })} + {t('nominate', { ns: 'pages' })} <ButtonHelp marginLeft onClick={() => openHelp('Nominations')} @@ -80,7 +80,7 @@ export const Active = () => { size="md" iconLeft={faChevronCircleRight} iconTransform="grow-1" - text={`${t('nominate.nominate', { ns: 'pages' })}`} + text={`${t('nominate', { ns: 'pages' })}`} disabled={inSetup() || syncing || isFastUnstaking} onClick={() => openCanvas({ @@ -98,7 +98,7 @@ export const Active = () => { </div> </CardHeader> <ListStatusHeader> - {t('notNominating', { ns: 'library' })}. + {t('notNominating', { ns: 'app' })}. </ListStatusHeader> </> )} diff --git a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedDays.tsx b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedDays.tsx index 844bc0e18c..96dfacd24a 100644 --- a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedDays.tsx +++ b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedDays.tsx @@ -9,7 +9,7 @@ import { useTranslation } from 'react-i18next' export const AnalyzedDays = () => { const { t } = useTranslation('pages') const params = { - label: t('decentralization.maxDaysAnalyzed'), + label: t('maxDaysAnalyzed'), value: 30, unit: 'Days', helpKey: 'Decentralization Analytics Period', diff --git a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedEras.tsx b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedEras.tsx index 98517e96e9..28b9e62d0f 100644 --- a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedEras.tsx +++ b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedEras.tsx @@ -12,7 +12,7 @@ export const AnalyzedEras = ({ meta }: AnalyzedErasProps) => { const { t } = useTranslation('pages') const params = { - label: t('decentralization.maxErasAnalyzed'), + label: t('maxErasAnalyzed'), value: meta?.ErasPerMonth || 0, unit: 'Eras', helpKey: 'Decentralization Analytics Period', diff --git a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedPayouts.tsx b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedPayouts.tsx index 8d24551a4e..b5816e9b3d 100644 --- a/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedPayouts.tsx +++ b/packages/app/src/pages/Nominate/NominationGeo/Stats/AnalyzedPayouts.tsx @@ -14,7 +14,7 @@ export const AnalyzedPayouts = ({ data }: AnalyzedPayoutsProps) => { const { unit } = useNetwork().networkData const params = { - label: t('decentralization.totalPayoutsAnalysed'), + label: t('totalPayoutsAnalysed'), value: data?.nodeDistributionDetail?.reduce( (acc, node) => acc + node.TokenRewards, diff --git a/packages/app/src/pages/Nominate/NominationGeo/index.tsx b/packages/app/src/pages/Nominate/NominationGeo/index.tsx index 3b07125eaa..7eaa2ebb37 100644 --- a/packages/app/src/pages/Nominate/NominationGeo/index.tsx +++ b/packages/app/src/pages/Nominate/NominationGeo/index.tsx @@ -123,22 +123,20 @@ export const NominationGeo = () => { <PluginLabel plugin="polkawatch" /> <CardHeader> <h4> - {t('decentralization.payoutDistribution', { ns: 'pages' })} + {t('payoutDistribution', { ns: 'pages' })} <ButtonHelp marginLeft onClick={() => openHelp('Nomination Payout Distribution')} /> </h4> - <h2> - {t('decentralization.byRegionCountryNetwork', { ns: 'pages' })} - </h2> + <h2>{t('byRegionCountryNetwork', { ns: 'pages' })}</h2> </CardHeader> <GraphsWrapper style={{ minHeight: graphContainerMinHeight }}> {showDisabledLabel && ( <StatusLabel status="active_service" statusFor="polkawatch" - title={t('decentralization.polkawatchDisabled', { + title={t('polkawatchDisabled', { ns: 'pages', })} /> @@ -147,7 +145,7 @@ export const NominationGeo = () => { <StatusLabel status="no_data" title={t('notNominating', { - ns: 'library', + ns: 'app', })} /> )} @@ -156,10 +154,10 @@ export const NominationGeo = () => { status="no_analytic_data" title={ networkSupported - ? t('decentralization.analyticsNotAvailable', { + ? t('analyticsNotAvailable', { ns: 'pages', }) - : t('decentralization.analyticsNotSupported', { + : t('analyticsNotSupported', { ns: 'pages', }) } @@ -206,7 +204,7 @@ export const NominationGeo = () => { <Page.Row> <CardWrapper> <NominationGeoList - title={t('decentralization.decentralizationPerNomination', { + title={t('decentralizationPerNomination', { ns: 'pages', })} data={nominationDetail} diff --git a/packages/app/src/pages/Nominate/index.tsx b/packages/app/src/pages/Nominate/index.tsx index 117b698ab2..c059b2a082 100644 --- a/packages/app/src/pages/Nominate/index.tsx +++ b/packages/app/src/pages/Nominate/index.tsx @@ -25,17 +25,17 @@ export const Nominate = () => { return ( <Wrapper> <Page.Title - title={t('nominate.nominate', { ns: 'pages' })} + title={t('nominate', { ns: 'pages' })} tabs={ pluginEnabled('polkawatch') ? [ { - title: t('overview', { ns: 'base' }), + title: t('overview', { ns: 'app' }), active: activeTab === 0, onClick: () => setActiveTab(0), }, { - title: t('decentralization', { ns: 'base' }), + title: t('decentralization', { ns: 'app' }), active: activeTab === 1, onClick: () => setActiveTab(1), }, diff --git a/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx b/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx index 2d1b351841..836c5da6e4 100644 --- a/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx +++ b/packages/app/src/pages/Overview/AccountBalance/BalanceChart.tsx @@ -135,7 +135,7 @@ export const BalanceChart = () => { return ( <> <CardHeader> - <h4>{t('overview.balance')}</h4> + <h4>{t('balance')}</h4> <h2> <Token /> <Odometer @@ -155,12 +155,12 @@ export const BalanceChart = () => { <BarChartWrapper> <Legend> {isNominating ? ( - <LegendItem dataClass="d1" label={t('overview.nominating')} /> + <LegendItem dataClass="d1" label={t('nominating')} /> ) : null} {inPool.isGreaterThan(0) ? ( - <LegendItem dataClass="d2" label={t('overview.inPool')} /> + <LegendItem dataClass="d2" label={t('inPool')} /> ) : null} - <LegendItem dataClass="d4" label={t('overview.notStaking')} /> + <LegendItem dataClass="d4" label={t('notStaking')} /> </Legend> <Bar> <BarSegment @@ -196,7 +196,7 @@ export const BalanceChart = () => { }} > <Legend> - <LegendItem label={t('overview.free')} helpKey="Your Balance" /> + <LegendItem label={t('free')} helpKey="Your Balance" /> </Legend> <Bar> <BarSegment @@ -216,10 +216,7 @@ export const BalanceChart = () => { }} > <Legend> - <LegendItem - label={t('overview.locked')} - helpKey="Reserve Balance" - /> + <LegendItem label={t('locked')} helpKey="Reserve Balance" /> </Legend> <Bar> <BarSegment @@ -244,7 +241,7 @@ export const BalanceChart = () => { label="" button={ <ButtonTertiary - text={t('overview.reserveBalance')} + text={t('reserveBalance')} onClick={() => openModal({ key: 'UpdateReserve', size: 'sm' }) } diff --git a/packages/app/src/pages/Overview/AccountBalance/BalanceLinks.tsx b/packages/app/src/pages/Overview/AccountBalance/BalanceLinks.tsx index 74252becef..9e61f55a24 100644 --- a/packages/app/src/pages/Overview/AccountBalance/BalanceLinks.tsx +++ b/packages/app/src/pages/Overview/AccountBalance/BalanceLinks.tsx @@ -19,7 +19,7 @@ export const BalanceLinks = () => { return ( <MoreWrapper> <Separator /> - <h4>{t('overview.moreResources')}</h4> + <h4>{t('moreResources')}</h4> <section> <ButtonPrimaryInvert lg diff --git a/packages/app/src/pages/Overview/AccountControls/Item.tsx b/packages/app/src/pages/Overview/AccountControls/Item.tsx index 33856a3640..594186317c 100644 --- a/packages/app/src/pages/Overview/AccountControls/Item.tsx +++ b/packages/app/src/pages/Overview/AccountControls/Item.tsx @@ -41,7 +41,7 @@ export const Item = ({ address, delegate = null }: ActiveAccountProps) => { </div> {delegatorAddress && ( <span> - {proxyDelegate?.proxyType} {t('overview.proxy')} + {proxyDelegate?.proxyType} {t('proxy')} <FontAwesomeIcon icon={faArrowLeft} transform="shrink-2" /> </span> )} @@ -60,7 +60,7 @@ export const Item = ({ address, delegate = null }: ActiveAccountProps) => { </> )} - {!accountData ? t('overview.noActiveAccount') : null} + {!accountData ? t('noActiveAccount') : null} </h4> </div> </ItemWrapper> diff --git a/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx b/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx index 72f5d3757b..981e6f5f23 100644 --- a/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx +++ b/packages/app/src/pages/Overview/NetworkSats/Announcements.tsx @@ -60,12 +60,12 @@ export const Announcements = () => { if (!totalStaked.isZero()) { announcements.push({ class: 'neutral', - title: t('overview.networkCurrentlyStaked', { + title: t('networkCurrentlyStaked', { total: planckToUnitBn(totalStaked, units).integerValue().toFormat(), unit, network: capitalizeFirstLetter(network), }), - subtitle: t('overview.networkCurrentlyStakedSubtitle', { + subtitle: t('networkCurrentlyStakedSubtitle', { unit, }), }) @@ -78,9 +78,9 @@ export const Announcements = () => { announcements.push({ class: 'neutral', title: `${totalPoolPointsUnit.integerValue().toFormat()} ${unit} ${t( - 'overview.inPools' + 'inPools' )}`, - subtitle: `${t('overview.bondedInPools', { networkUnit: unit })}`, + subtitle: `${t('bondedInPools', { networkUnit: unit })}`, }) } else { announcements.push(null) @@ -90,10 +90,8 @@ export const Announcements = () => { if (counterForPoolMembers.isGreaterThan(0)) { announcements.push({ class: 'neutral', - title: `${counterForPoolMembers.toFormat()} ${t( - 'overview.poolMembersBonding' - )}`, - subtitle: `${t('overview.totalNumAccounts')}`, + title: `${counterForPoolMembers.toFormat()} ${t('poolMembersBonding')}`, + subtitle: `${t('totalNumAccounts')}`, }) } else { announcements.push(null) @@ -103,8 +101,8 @@ export const Announcements = () => { if (lastRewardUnit.isGreaterThan(0)) { announcements.push({ class: 'neutral', - title: `${lastRewardUnit.integerValue().toFormat()} ${unit} ${t('overview.paidOutLastEraTitle')}`, - subtitle: `${t('overview.paidOutLastEraSubtitle')}`, + title: `${lastRewardUnit.integerValue().toFormat()} ${unit} ${t('paidOutLastEraTitle')}`, + subtitle: `${t('paidOutLastEraSubtitle')}`, }) } else { announcements.push(null) diff --git a/packages/app/src/pages/Overview/NetworkSats/index.tsx b/packages/app/src/pages/Overview/NetworkSats/index.tsx index 0427569c88..f32eca9dc2 100644 --- a/packages/app/src/pages/Overview/NetworkSats/index.tsx +++ b/packages/app/src/pages/Overview/NetworkSats/index.tsx @@ -22,22 +22,22 @@ export const NetworkStats = () => { const items = [ { - label: t('overview.totalValidators'), + label: t('totalValidators'), value: totalValidators.toFormat(0), helpKey: 'Validator', }, { - label: t('overview.totalNominators'), + label: t('totalNominators'), value: counterForNominators.toFormat(0), helpKey: 'Total Nominators', }, { - label: t('overview.activePools'), + label: t('activePools'), value: new BigNumber(bondedPools.length).toFormat(), helpKey: 'Active Pools', }, { - label: t('overview.latestInflationRate'), + label: t('latestInflationRate'), value: `${ inflationToStakers.toString() === '0' ? '0' @@ -50,7 +50,7 @@ export const NetworkStats = () => { return ( <CardWrapper style={{ boxShadow: 'var(--card-shadow-secondary)' }}> <CardHeader margin> - <h3>{t('overview.networkStats')}</h3> + <h3>{t('networkStats')}</h3> </CardHeader> <Wrapper> <Header items={items} /> diff --git a/packages/app/src/pages/Overview/Payouts/index.tsx b/packages/app/src/pages/Overview/Payouts/index.tsx index db4b57fc8f..c2315adb4e 100644 --- a/packages/app/src/pages/Overview/Payouts/index.tsx +++ b/packages/app/src/pages/Overview/Payouts/index.tsx @@ -66,7 +66,7 @@ export const Payouts = () => { return ( <> <CardHeader> - <h4>{t('overview.recentPayouts')}</h4> + <h4>{t('recentPayouts')}</h4> <h2> <Token /> <Odometer @@ -94,13 +94,13 @@ export const Payouts = () => { <StatusLabel status="active_service" statusFor="staking_api" - title={t('common.stakingApiDisabled')} + title={t('stakingApiDisabled')} topOffset="37%" /> ) : ( <StatusLabel status="sync_or_setup" - title={t('overview.notStaking')} + title={t('notStaking')} topOffset="37%" /> )} diff --git a/packages/app/src/pages/Overview/Stats/AveragelRewardRate.tsx b/packages/app/src/pages/Overview/Stats/AveragelRewardRate.tsx index 67e188f166..09d3fcc09e 100644 --- a/packages/app/src/pages/Overview/Stats/AveragelRewardRate.tsx +++ b/packages/app/src/pages/Overview/Stats/AveragelRewardRate.tsx @@ -12,7 +12,7 @@ export const AverageRewardRate = () => { const { avgRateBeforeCommission } = getAverageRewardRate(false) const params = { - label: `${t('overview.averageRewardRate')}`, + label: `${t('averageRewardRate')}`, value: `${avgRateBeforeCommission.decimalPlaces(2).toFormat()}%`, helpKey: 'Average Reward Rate', diff --git a/packages/app/src/pages/Overview/Stats/NextRewards.tsx b/packages/app/src/pages/Overview/Stats/NextRewards.tsx index 812b5c5029..97c44d2328 100644 --- a/packages/app/src/pages/Overview/Stats/NextRewards.tsx +++ b/packages/app/src/pages/Overview/Stats/NextRewards.tsx @@ -33,7 +33,7 @@ export const NextRewards = () => { }, [activeEra, getUnixTime(dateTo)]) const params = { - label: t('overview.nextRewardDistribution'), + label: t('nextRewardDistribution'), timeleft: formatted, graph: { value1: activeEra.index.isZero() diff --git a/packages/app/src/pages/Overview/Stats/SupplyStaked.tsx b/packages/app/src/pages/Overview/Stats/SupplyStaked.tsx index 8598357438..b865becefc 100644 --- a/packages/app/src/pages/Overview/Stats/SupplyStaked.tsx +++ b/packages/app/src/pages/Overview/Stats/SupplyStaked.tsx @@ -27,7 +27,7 @@ export const SupplyStaked = () => { : lastTotalStakeUnit.dividedBy(totalIssuanceUnit.multipliedBy(0.01)) const params = { - label: t('overview.unitSupplyStaked', { unit }), + label: t('unitSupplyStaked', { unit }), stat: { value: `${supplyAsPercent.decimalPlaces(2).toFormat()}`, unit: '%', diff --git a/packages/app/src/pages/Overview/index.tsx b/packages/app/src/pages/Overview/index.tsx index 79ce532bdf..c8e983f097 100644 --- a/packages/app/src/pages/Overview/index.tsx +++ b/packages/app/src/pages/Overview/index.tsx @@ -20,7 +20,7 @@ export const Overview = () => { return ( <> - <Page.Title title={t('overview.overview')} /> + <Page.Title title={t('overview')} /> <Page.Row> <Page.Heading> <AccountControls /> diff --git a/packages/app/src/pages/Pools/ClosurePrompts.tsx b/packages/app/src/pages/Pools/ClosurePrompts.tsx index ab852b7fec..24b42842cb 100644 --- a/packages/app/src/pages/Pools/ClosurePrompts.tsx +++ b/packages/app/src/pages/Pools/ClosurePrompts.tsx @@ -48,21 +48,21 @@ export const ClosurePrompts = () => { }} > <div className="content"> - <h3>{t('pools.destroyPool')}</h3> + <h3>{t('destroyPool')}</h3> <h4> - {t('pools.leftThePool')}.{' '} + {t('leftThePool')}.{' '} {targets.length > 0 - ? t('pools.stopNominating') + ? t('stopNominating') : depositorCanWithdraw - ? t('pools.closePool') + ? t('closePool') : depositorCanUnbond - ? t('pools.unbondYourFunds') - : t('pools.withdrawUnlock')} + ? t('unbondYourFunds') + : t('withdrawUnlock')} </h4> <ButtonRow yMargin> <ButtonPrimary marginRight - text={t('pools.unbond')} + text={t('unbond')} disabled={ syncing || (!depositorCanWithdraw && !depositorCanUnbond) } @@ -78,7 +78,7 @@ export const ClosurePrompts = () => { iconLeft={faLockOpen} text={ depositorCanWithdraw - ? t('pools.unlocked') + ? t('unlocked') : String(totalUnlockChunks ?? 0) } disabled={syncing || !isBonding()} diff --git a/packages/app/src/pages/Pools/Favorites/index.tsx b/packages/app/src/pages/Pools/Favorites/index.tsx index 2a6c4f12e6..9563a37c25 100644 --- a/packages/app/src/pages/Pools/Favorites/index.tsx +++ b/packages/app/src/pages/Pools/Favorites/index.tsx @@ -44,9 +44,7 @@ export const PoolFavorites = () => { <Page.Row> <CardWrapper> {favoritesList === null || syncing ? ( - <ListStatusHeader> - {t('pools.fetchingFavoritePools')}... - </ListStatusHeader> + <ListStatusHeader>{t('fetchingFavoritePools')}...</ListStatusHeader> ) : ( isReady && (favoritesList.length > 0 ? ( @@ -54,7 +52,7 @@ export const PoolFavorites = () => { <PoolList pools={favoritesList} allowMoreCols itemsPerPage={30} /> </ListProvider> ) : ( - <ListStatusHeader>{t('pools.noFavorites')}</ListStatusHeader> + <ListStatusHeader>{t('noFavorites')}</ListStatusHeader> )) )} </CardWrapper> diff --git a/packages/app/src/pages/Pools/ManageBond.tsx b/packages/app/src/pages/Pools/ManageBond.tsx index 47a8a75942..84d0cc5d04 100644 --- a/packages/app/src/pages/Pools/ManageBond.tsx +++ b/packages/app/src/pages/Pools/ManageBond.tsx @@ -54,7 +54,7 @@ export const ManageBond = () => { <> <CardHeader> <h4> - {t('pools.bondedFunds')} + {t('bondedFunds')} <ButtonHelp marginLeft onClick={() => openHelp('Bonded in Pool')} /> </h4> <h2> @@ -101,7 +101,7 @@ export const ManageBond = () => { {canLeavePool && ( <ButtonPrimary size="md" - text={t('nominate.unstake')} + text={t('unstake')} iconLeft={faSignOut} onClick={() => openModal({ key: 'LeavePool', size: 'sm' })} /> diff --git a/packages/app/src/pages/Pools/ManagePool/index.tsx b/packages/app/src/pages/Pools/ManagePool/index.tsx index 4382d2e5f1..f9db85a43b 100644 --- a/packages/app/src/pages/Pools/ManagePool/index.tsx +++ b/packages/app/src/pages/Pools/ManagePool/index.tsx @@ -37,7 +37,7 @@ export const ManagePool = () => { <> <CardHeader action margin> <h3> - {t('nominate.nominations', { ns: 'pages' })} + {t('nominations', { ns: 'pages' })} <ButtonHelp marginLeft onClick={() => openHelp('Nominations')} @@ -48,7 +48,7 @@ export const ManagePool = () => { size="md" iconLeft={faChevronCircleRight} iconTransform="grow-1" - text={t('pools.nominate', { ns: 'pages' })} + text={t('nominate', { ns: 'pages' })} disabled={!canNominate} onClick={() => openCanvas({ @@ -65,7 +65,7 @@ export const ManagePool = () => { /> </ButtonRow> </CardHeader> - <h4>{t('notNominating', { ns: 'library' })}.</h4> + <h4>{t('notNominating', { ns: 'app' })}.</h4> </> ) : ( <Nominations bondFor="pool" nominator={nominator} /> diff --git a/packages/app/src/pages/Pools/PoolAccount/index.tsx b/packages/app/src/pages/Pools/PoolAccount/index.tsx index 43dd1d1354..cdda5f53eb 100644 --- a/packages/app/src/pages/Pools/PoolAccount/index.tsx +++ b/packages/app/src/pages/Pools/PoolAccount/index.tsx @@ -31,7 +31,7 @@ export const PoolAccount = ({ address, pool }: PoolAccountProps) => { transition={{ duration: 0.3 }} > {address === null ? ( - <h4>{t('pools.notSet')}</h4> + <h4>{t('notSet')}</h4> ) : synced && display !== null ? ( <> <div className="icon"> diff --git a/packages/app/src/pages/Pools/PoolStats/Announcements.tsx b/packages/app/src/pages/Pools/PoolStats/Announcements.tsx index ffb23d1022..f7e9b8acb8 100644 --- a/packages/app/src/pages/Pools/PoolStats/Announcements.tsx +++ b/packages/app/src/pages/Pools/PoolStats/Announcements.tsx @@ -66,17 +66,17 @@ export const Announcements = () => { announcements.push({ class: 'neutral', title: `${rewardsClaimed.decimalPlaces(3).toFormat()} ${unit} ${t( - 'pools.beenClaimed' + 'beenClaimed' )}`, - subtitle: `${t('pools.beenClaimedBy', { unit })}`, + subtitle: `${t('beenClaimedBy', { unit })}`, }) announcements.push({ class: 'neutral', title: `${rewardBalance.decimalPlaces(3).toFormat()} ${unit} ${t( - 'pools.outstandingReward' + 'outstandingReward' )}`, - subtitle: `${t('pools.availableToClaim', { unit })}`, + subtitle: `${t('availableToClaim', { unit })}`, }) return ( diff --git a/packages/app/src/pages/Pools/PoolStats/index.tsx b/packages/app/src/pages/Pools/PoolStats/index.tsx index df190851e1..e3500cf705 100644 --- a/packages/app/src/pages/Pools/PoolStats/index.tsx +++ b/packages/app/src/pages/Pools/PoolStats/index.tsx @@ -42,37 +42,37 @@ export const PoolStats = () => { let stateDisplay switch (state) { case 'Blocked': - stateDisplay = t('pools.locked') + stateDisplay = t('locked') break case 'Destroying': - stateDisplay = t('pools.destroying') + stateDisplay = t('destroying') break default: - stateDisplay = t('pools.open') + stateDisplay = t('open') break } const items: PoolStatLabel[] = [ { - label: t('pools.poolState'), + label: t('poolState'), value: stateDisplay, }, ] if (currentCommission) { items.push({ - label: t('pools.poolCommission'), + label: t('poolCommission'), value: `${currentCommission}%`, }) } items.push( { - label: t('pools.poolMembers'), + label: t('poolMembers'), value: `${memberCounter}`, button: pluginEnabled('subscan') ? { - text: t('pools.browseMembers'), + text: t('browseMembers'), onClick: () => { openCanvas({ key: 'PoolMembers', size: 'xl' }) }, @@ -81,7 +81,7 @@ export const PoolStats = () => { : undefined, }, { - label: t('pools.totalBonded'), + label: t('totalBonded'), value: `${bonded} ${unit}`, } ) @@ -89,7 +89,7 @@ export const PoolStats = () => { return ( <CardWrapper style={{ boxShadow: 'var(--card-shadow-secondary)' }}> <CardHeader margin> - <h3>{t('pools.poolStats')}</h3> + <h3>{t('poolStats')}</h3> </CardHeader> <Wrapper> <Header items={items} /> diff --git a/packages/app/src/pages/Pools/Roles/RoleEditInput/index.tsx b/packages/app/src/pages/Pools/Roles/RoleEditInput/index.tsx index b1620bf9ae..a350d35e34 100644 --- a/packages/app/src/pages/Pools/Roles/RoleEditInput/index.tsx +++ b/packages/app/src/pages/Pools/Roles/RoleEditInput/index.tsx @@ -49,10 +49,10 @@ export const RoleEditInput = ({ let label let labelClass if (!roleEdit?.valid) { - label = t('pools.addressInvalid') + label = t('addressInvalid') labelClass = 'danger' } else if (roleEdit?.reformatted) { - label = t('pools.reformatted') + label = t('reformatted') labelClass = 'neutral' } @@ -61,7 +61,7 @@ export const RoleEditInput = ({ <div className="input"> <section> <input - placeholder={t('pools.address')} + placeholder={t('address')} type="text" onChange={(e: FormEvent<HTMLInputElement>) => handleChange(e)} value={roleEdit?.newAddress ?? ''} diff --git a/packages/app/src/pages/Pools/Roles/index.tsx b/packages/app/src/pages/Pools/Roles/index.tsx index be5170e434..fe819d2637 100644 --- a/packages/app/src/pages/Pools/Roles/index.tsx +++ b/packages/app/src/pages/Pools/Roles/index.tsx @@ -146,7 +146,7 @@ export const Roles = ({ <CardHeader action margin> {!inline && ( <h3> - {t('pools.roles')} + {t('roles')} <ButtonHelp marginLeft onClick={() => openHelp('Pool Roles')} /> </h3> )} @@ -157,7 +157,7 @@ export const Roles = ({ <ButtonType iconLeft={faTimesCircle} iconTransform="grow-1" - text={t('pools.cancel')} + text={t('cancel')} disabled={syncing || isReadOnlyAccount(activeAccount)} onClick={() => cancelHandler()} /> @@ -166,7 +166,7 @@ export const Roles = ({ <ButtonType iconLeft={isEditing ? faCheckCircle : faEdit} iconTransform="grow-1" - text={isEditing ? t('pools.save') : t('pools.edit')} + text={isEditing ? t('save') : t('edit')} disabled={ syncing || isReadOnlyAccount(activeAccount) || @@ -180,13 +180,13 @@ export const Roles = ({ <RolesWrapper> <section> <div className="inner"> - <h4>{t('pools.depositor')}</h4> + <h4>{t('depositor')}</h4> <PoolAccount address={roles.depositor ?? null} pool={activePool} /> </div> </section> <section> <div className="inner"> - <h4>{t('pools.root')}</h4> + <h4>{t('root')}</h4> {isEditing ? ( <RoleEditInput roleKey="root" @@ -200,7 +200,7 @@ export const Roles = ({ </section> <section> <div className="inner"> - <h4>{t('pools.nominator')}</h4> + <h4>{t('nominator')}</h4> {isEditing ? ( <RoleEditInput roleKey="nominator" @@ -217,7 +217,7 @@ export const Roles = ({ </section> <section> <div className="inner"> - <h4>{t('pools.bouncer')}</h4> + <h4>{t('bouncer')}</h4> {isEditing ? ( <RoleEditInput roleKey="bouncer" diff --git a/packages/app/src/pages/Pools/Stats/ActivePoolCount.tsx b/packages/app/src/pages/Pools/Stats/ActivePoolCount.tsx index eb4bd966e5..8c33dca469 100644 --- a/packages/app/src/pages/Pools/Stats/ActivePoolCount.tsx +++ b/packages/app/src/pages/Pools/Stats/ActivePoolCount.tsx @@ -10,7 +10,7 @@ export const ActivePoolCount = () => { const { counterForBondedPools } = useApi().poolsConfig const params = { - label: t('pools.activePools'), + label: t('activePools'), value: counterForBondedPools.toNumber(), unit: '', helpKey: 'Active Pools', diff --git a/packages/app/src/pages/Pools/Stats/MinCreateBond.tsx b/packages/app/src/pages/Pools/Stats/MinCreateBond.tsx index fef5d8b8a9..159bad844b 100644 --- a/packages/app/src/pages/Pools/Stats/MinCreateBond.tsx +++ b/packages/app/src/pages/Pools/Stats/MinCreateBond.tsx @@ -15,7 +15,7 @@ export const MinCreateBond = () => { const { minCreateBond } = useApi().poolsConfig const params = { - label: t('pools.minimumToCreatePool'), + label: t('minimumToCreatePool'), value: planckToUnitBn(minCreateBond, units).toNumber(), decimals: 3, unit, diff --git a/packages/app/src/pages/Pools/Stats/MinJoinBond.tsx b/packages/app/src/pages/Pools/Stats/MinJoinBond.tsx index 50e5ab1945..31c0644fa3 100644 --- a/packages/app/src/pages/Pools/Stats/MinJoinBond.tsx +++ b/packages/app/src/pages/Pools/Stats/MinJoinBond.tsx @@ -15,7 +15,7 @@ export const MinJoinBond = () => { const { minJoinBond } = useApi().poolsConfig const params = { - label: t('pools.minimumToJoinPool'), + label: t('minimumToJoinPool'), value: planckToUnitBn(minJoinBond, units).toNumber(), decimals: 3, unit: ` ${unit}`, diff --git a/packages/app/src/pages/Pools/Status/MembershipStatus.tsx b/packages/app/src/pages/Pools/Status/MembershipStatus.tsx index d445a1f3d8..5b6da5dced 100644 --- a/packages/app/src/pages/Pools/Status/MembershipStatus.tsx +++ b/packages/app/src/pages/Pools/Status/MembershipStatus.tsx @@ -35,7 +35,7 @@ export const MembershipStatus = ({ const poolState = activePool?.bondedPool?.state ?? null const membershipButtons = [] - let membershipDisplay = t('pools.notInPool') + let membershipDisplay = t('notInPool') if (activePool) { // Determine pool membership display. @@ -53,7 +53,7 @@ export const MembershipStatus = ({ // Display manage button if active account is not a read-only account. if (!isReadOnlyAccount(activeAccount)) { membershipButtons.push({ - title: t('pools.manage'), + title: t('manage'), icon: faCog, disabled: !isReady, small: true, @@ -81,9 +81,9 @@ export const MembershipStatus = ({ /> ) : ( <Stat - label={t('pools.poolMembership')} + label={t('poolMembership')} helpKey="Pool Membership" - stat={!inSetup() ? t('pools.alreadyNominating') : t('pools.notInPool')} + stat={!inSetup() ? t('alreadyNominating') : t('notInPool')} buttonType={buttonType} /> ) diff --git a/packages/app/src/pages/Pools/Status/NewMember.tsx b/packages/app/src/pages/Pools/Status/NewMember.tsx index 757e6ec4ed..75df0c15fd 100644 --- a/packages/app/src/pages/Pools/Status/NewMember.tsx +++ b/packages/app/src/pages/Pools/Status/NewMember.tsx @@ -47,7 +47,7 @@ export const NewMember = ({ syncing }: NewMemberProps) => { }} disabled={joinButtonDisabled} > - {t('pools.joinPool', { ns: 'pages' })} + {t('joinPool', { ns: 'pages' })} <FontAwesomeIcon icon={faUserPlus} /> </button> </div> @@ -68,12 +68,12 @@ export const NewMember = ({ syncing }: NewMemberProps) => { } disabled={createDisabled} > - {t('pools.createPool', { ns: 'pages' })} + {t('createPool', { ns: 'pages' })} </button> </div> <div className={`button standalone secondary`}> <button onClick={() => setActiveTab(1)}> - {t('pools.browsePools', { ns: 'pages' })} + {t('browsePools', { ns: 'pages' })} </button> </div> </div> diff --git a/packages/app/src/pages/Pools/Status/PoolStatus.tsx b/packages/app/src/pages/Pools/Status/PoolStatus.tsx index 4ff4c0f099..c04c9da150 100644 --- a/packages/app/src/pages/Pools/Status/PoolStatus.tsx +++ b/packages/app/src/pages/Pools/Status/PoolStatus.tsx @@ -38,28 +38,26 @@ export const PoolStatus = () => { // Determine pool status - left side. const poolStatusLeft = poolState === 'Blocked' - ? `${t('pools.locked')} / ` + ? `${t('locked')} / ` : poolState === 'Destroying' - ? `${t('pools.destroying')} / ` + ? `${t('destroying')} / ` : '' // Determine pool status - right side. const poolStatusRight = syncing - ? t('pools.inactivePoolNotNominating') + ? t('inactivePoolNotNominating') : !poolNominating - ? t('pools.inactivePoolNotNominating') + ? t('inactivePoolNotNominating') : nominees.active.length - ? `${t('pools.nominatingAnd')} ${ - earningRewards - ? t('pools.earningRewards') - : t('pools.notEarningRewards') + ? `${t('poolsNominatingAnd')} ${ + earningRewards ? t('earningRewards') : t('notEarningRewards') }` - : t('pools.waitingForActiveNominations') + : t('waitingForActiveNominations') return ( <Stat icon={syncing ? undefined : poolStateIcon} - label={t('pools.poolStatus')} + label={t('poolStatus')} helpKey="Nomination Status" stat={`${poolStatusLeft}${poolStatusRight}`} /> diff --git a/packages/app/src/pages/Pools/Status/RewardsStatus.tsx b/packages/app/src/pages/Pools/Status/RewardsStatus.tsx index b62106a863..92141e3bdc 100644 --- a/packages/app/src/pages/Pools/Status/RewardsStatus.tsx +++ b/packages/app/src/pages/Pools/Status/RewardsStatus.tsx @@ -39,7 +39,7 @@ export const RewardsStatus = ({ dimmed }: { dimmed: boolean }) => { : pendingRewards > minUnclaimedDisplay ? [ { - title: t('pools.withdraw'), + title: t('withdraw'), icon: faCircleDown, disabled: !isReady, small: true, @@ -51,7 +51,7 @@ export const RewardsStatus = ({ dimmed }: { dimmed: boolean }) => { }), }, { - title: t('pools.compound'), + title: t('compound'), icon: faPlus, disabled: !isReady || activePool?.bondedPool?.state === 'Destroying', @@ -68,7 +68,7 @@ export const RewardsStatus = ({ dimmed }: { dimmed: boolean }) => { return ( <Stat - label={t('pools.unclaimedRewards')} + label={t('unclaimedRewards')} helpKey="Pool Rewards" type="odometer" stat={{ value: labelRewards }} diff --git a/packages/app/src/pages/Pools/Status/useStatusButtons.tsx b/packages/app/src/pages/Pools/Status/useStatusButtons.tsx index 897f9f3e17..5d91efaf8b 100644 --- a/packages/app/src/pages/Pools/Status/useStatusButtons.tsx +++ b/packages/app/src/pages/Pools/Status/useStatusButtons.tsx @@ -48,13 +48,13 @@ export const useStatusButtons = () => { !bondedPools.length if (!membership) { - label = t('pools.poolMembership') + label = t('poolMembership') } else if (isOwner()) { - label = `${t('pools.ownerOfPool')} ${membership.poolId}` + label = `${t('ownerOfPool')} ${membership.poolId}` } else if (active?.isGreaterThan(0)) { - label = `${t('pools.memberOfPool')} ${membership.poolId}` + label = `${t('memberOfPool')} ${membership.poolId}` } else { - label = `${t('pools.leavingPool')} ${membership.poolId}` + label = `${t('leavingPool')} ${membership.poolId}` } return { label, getJoinDisabled, getCreateDisabled } } diff --git a/packages/app/src/pages/Pools/index.tsx b/packages/app/src/pages/Pools/index.tsx index 0f1a8e507e..91b48b07cf 100644 --- a/packages/app/src/pages/Pools/index.tsx +++ b/packages/app/src/pages/Pools/index.tsx @@ -42,20 +42,20 @@ export const PoolsInner = () => { return ( <> <Page.Title - title={t('pools.pools')} + title={t('pools')} tabs={[ { - title: t('pools.overview'), + title: t('overview'), active: activeTab === 0, onClick: () => setActiveTab(0), }, { - title: t('pools.allPools'), + title: t('allPools'), active: activeTab === 1, onClick: () => setActiveTab(1), }, { - title: t('pools.favorites'), + title: t('favorites'), active: activeTab === 2, onClick: () => setActiveTab(2), badge: String(favorites.length), diff --git a/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx b/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx index b0ea138bbd..d4cbedbb22 100644 --- a/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx +++ b/packages/app/src/pages/Rewards/Overview/RecentPayouts/index.tsx @@ -62,7 +62,7 @@ export const RecentPayouts = ({ return ( <> <CardHeader> - <h4>{t('overview.recentPayouts')}</h4> + <h4>{t('recentPayouts')}</h4> <h2> {payoutsFromDate && payoutsToDate ? ( <> @@ -72,7 +72,7 @@ export const RecentPayouts = ({ )} </> ) : ( - t('payouts.none') + t('none') )} </h2> </CardHeader> @@ -81,14 +81,14 @@ export const RecentPayouts = ({ <StatusLabel status="active_service" statusFor="staking_api" - title={t('common.stakingApiDisabled')} + title={t('stakingApiDisabled')} topOffset="30%" /> ) : ( notStaking && ( <StatusLabel status="sync_or_setup" - title={t('payouts.notStaking')} + title={t('notStaking')} topOffset="30%" /> ) diff --git a/packages/app/src/pages/Rewards/Overview/index.tsx b/packages/app/src/pages/Rewards/Overview/index.tsx index e62f44b4e4..863e507496 100644 --- a/packages/app/src/pages/Rewards/Overview/index.tsx +++ b/packages/app/src/pages/Rewards/Overview/index.tsx @@ -106,11 +106,11 @@ export const Overview = (props: PayoutHistoryProps) => { <Page.Row> <CardWrapper> <CardHeader> - <h3>{t('rewards.projectedRewards')}</h3> + <h3>{t('projectedRewards')}</h3> </CardHeader> <Separator style={{ margin: '0 0 1.5rem 0', border: 0 }} /> <CardHeader> - <h4>{t('rewards.stakedBalance')}</h4> + <h4>{t('stakedBalance')}</h4> <h2> <Token /> <Odometer @@ -142,7 +142,7 @@ export const Overview = (props: PayoutHistoryProps) => { }} transform={'grow-6'} /> - {t('rewards.deductAvgCommissionOf', { + {t('deductAvgCommissionOf', { commission: avgCommission, })} </button> @@ -152,7 +152,7 @@ export const Overview = (props: PayoutHistoryProps) => { <RewardGrid.Head> <RewardGrid.Cells items={[ - <h4>{t('rewards.period')}</h4>, + <h4>{t('period')}</h4>, <h4> <Token /> {unit} @@ -163,7 +163,7 @@ export const Overview = (props: PayoutHistoryProps) => { </RewardGrid.Head> <RewardGrid.Row> <RewardGrid.Cell> - <RewardGrid.Label>{t('rewards.daily')}</RewardGrid.Label> + <RewardGrid.Label>{t('daily')}</RewardGrid.Label> </RewardGrid.Cell> <RewardGrid.Cell> <h3> @@ -190,7 +190,7 @@ export const Overview = (props: PayoutHistoryProps) => { <RewardGrid.Row> <RewardGrid.Cells items={[ - <RewardGrid.Label>{t('rewards.monthly')}</RewardGrid.Label>, + <RewardGrid.Label>{t('monthly')}</RewardGrid.Label>, <h3> {monthlyReward > 0 && ( <FontAwesomeIcon icon={faCaretUp} /> @@ -216,7 +216,7 @@ export const Overview = (props: PayoutHistoryProps) => { <RewardGrid.Row> <RewardGrid.Cells items={[ - <RewardGrid.Label>{t('rewards.annual')}</RewardGrid.Label>, + <RewardGrid.Label>{t('annual')}</RewardGrid.Label>, <h3> {annualReward > 0 && <FontAwesomeIcon icon={faCaretUp} />} {annualReward.toLocaleString('en-US', { diff --git a/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx b/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx index 2e38805c99..dfbda0c5bf 100644 --- a/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx +++ b/packages/app/src/pages/Rewards/RecentPayouts/PayoutList.tsx @@ -81,7 +81,7 @@ export const PayoutListInner = ({ return ( <ListWrapper> <div> - <h3>{t('payouts.noRecentPayouts')}.</h3> + <h3>{t('noRecentPayouts')}.</h3> </div> </ListWrapper> ) @@ -127,9 +127,7 @@ export const PayoutListInner = ({ ? (p as PoolReward) : (p as NominatorReward) - const label = poolReward - ? t('payouts.poolClaim') - : t('payouts.payout') + const label = poolReward ? t('poolClaim') : t('payout') const labelClass = poolReward ? 'claim' : 'reward' @@ -197,8 +195,8 @@ export const PayoutListInner = ({ poolId={(record as PoolReward).poolId} /> )} - {label === t('payouts.slashed') && ( - <h4>{t('payouts.deductedFromBond')}</h4> + {label === t('slashed') && ( + <h4>{t('deductedFromBond')}</h4> )} </div> <div> @@ -260,7 +258,7 @@ export const PoolClaim = ({ <PoolIdentity pool={pool} /> ) : ( <h4> - {t('payouts.fromPool')} {poolId} + {t('fromPool')} {poolId} </h4> ) } diff --git a/packages/app/src/pages/Rewards/RecentPayouts/index.tsx b/packages/app/src/pages/Rewards/RecentPayouts/index.tsx index b8f50ec211..5bc692e4d0 100644 --- a/packages/app/src/pages/Rewards/RecentPayouts/index.tsx +++ b/packages/app/src/pages/Rewards/RecentPayouts/index.tsx @@ -15,7 +15,7 @@ export const RecentPayouts = (props: PageProps) => { <Page.Row> <CardWrapper> <PayoutList - title={t('payouts.recentPayouts')} + title={t('recentPayouts')} payouts={payoutsList} pagination itemsPerPage={50} diff --git a/packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx b/packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx index 4104d4f420..02022f76c9 100644 --- a/packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx +++ b/packages/app/src/pages/Rewards/Stats/LastEraPayout.tsx @@ -15,7 +15,7 @@ export const LastEraPayout = () => { const lastRewardUnit = planckToUnitBn(lastReward, units).toNumber() const params = { - label: t('payouts.lastEraPayout'), + label: t('lastEraPayout'), value: lastRewardUnit, decimals: 3, unit, diff --git a/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx b/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx index 5b00e7c2da..34a3777979 100644 --- a/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx +++ b/packages/app/src/pages/Rewards/Stats/RewardCalculator.tsx @@ -17,8 +17,8 @@ export const RewardCalculator = ({ onClick }: { onClick: () => void }) => { style={{ marginLeft: '0.25rem', height: '2.1rem' }} /> ), - label: t('rewards.useCustomAmount'), - title: t('rewards.rewardsCalculator'), + label: t('useCustomAmount'), + title: t('rewardsCalculator'), onClick, } diff --git a/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx b/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx index a0c660aa4a..696cc97988 100644 --- a/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx +++ b/packages/app/src/pages/Rewards/Stats/RewardTrend.tsx @@ -73,7 +73,7 @@ export const RewardTrend = () => { } const params = { - label: t('rewards.last30DayReward'), + label: t('last30DayReward'), value: new BigNumber(planckToUnit(value, units)) .decimalPlaces(3) .toFormat(), diff --git a/packages/app/src/pages/Rewards/index.tsx b/packages/app/src/pages/Rewards/index.tsx index e90535cff7..d69de1d354 100644 --- a/packages/app/src/pages/Rewards/index.tsx +++ b/packages/app/src/pages/Rewards/index.tsx @@ -107,12 +107,12 @@ export const Rewards = () => { title={t('rewards', { ns: 'modals' })} tabs={[ { - title: t('overview', { ns: 'base' }), + title: t('overview', { ns: 'app' }), active: activeTab === 0, onClick: () => setActiveTab(0), }, { - title: t('payouts.recentPayouts', { ns: 'pages' }), + title: t('recentPayouts', { ns: 'pages' }), active: activeTab === 1, onClick: () => setActiveTab(1), }, diff --git a/packages/app/src/pages/Validators/AllValidators.tsx b/packages/app/src/pages/Validators/AllValidators.tsx index f2f581354d..65795141ce 100644 --- a/packages/app/src/pages/Validators/AllValidators.tsx +++ b/packages/app/src/pages/Validators/AllValidators.tsx @@ -28,20 +28,20 @@ export const AllValidators = () => { <CardWrapper> {!isReady ? ( <div className="item"> - <h3>{t('validators.connecting')}...</h3> + <h3>{t('connecting')}...</h3> </div> ) : ( <> {validators.length === 0 && ( <div className="item"> - <h3>{t('validators.fetchingValidators')}...</h3> + <h3>{t('fetchingValidators')}...</h3> </div> )} {validators.length > 0 && ( <ValidatorList bondFor="nominator" validators={validators} - title={t('validators.networkValidators')} + title={t('networkValidators')} selectable={false} defaultFilters={{ includes: ['active'], diff --git a/packages/app/src/pages/Validators/Favorites.tsx b/packages/app/src/pages/Validators/Favorites.tsx index 75904cfe90..75b99e6226 100644 --- a/packages/app/src/pages/Validators/Favorites.tsx +++ b/packages/app/src/pages/Validators/Favorites.tsx @@ -19,7 +19,7 @@ export const ValidatorFavorites = () => { <CardWrapper> {favoritesList === null ? ( <ListStatusHeader> - {t('validators.fetchingFavoriteValidators')}... + {t('fetchingFavoriteValidators')}... </ListStatusHeader> ) : ( isReady && @@ -27,7 +27,7 @@ export const ValidatorFavorites = () => { <ValidatorList bondFor="nominator" validators={favoritesList} - title={t('validators.favoriteValidators')} + title={t('favoriteValidators')} selectable={false} allowListFormat={false} allowFilters @@ -35,7 +35,7 @@ export const ValidatorFavorites = () => { toggleFavorites /> ) : ( - <ListStatusHeader>{t('validators.noFavorites')}</ListStatusHeader> + <ListStatusHeader>{t('noFavorites')}</ListStatusHeader> )) )} </CardWrapper> diff --git a/packages/app/src/pages/Validators/Stats/ActiveValidators.tsx b/packages/app/src/pages/Validators/Stats/ActiveValidators.tsx index 6420400809..530b3dc48f 100644 --- a/packages/app/src/pages/Validators/Stats/ActiveValidators.tsx +++ b/packages/app/src/pages/Validators/Stats/ActiveValidators.tsx @@ -24,7 +24,7 @@ export const ActiveValidators = () => { } const params = { - label: t('validators.activeValidators'), + label: t('activeValidators'), stat: { value: activeValidators, total: validatorCount.toNumber(), diff --git a/packages/app/src/pages/Validators/Stats/AverageCommission.tsx b/packages/app/src/pages/Validators/Stats/AverageCommission.tsx index 4a7e82d45d..7a5c0a5a1a 100644 --- a/packages/app/src/pages/Validators/Stats/AverageCommission.tsx +++ b/packages/app/src/pages/Validators/Stats/AverageCommission.tsx @@ -10,7 +10,7 @@ export const AverageCommission = () => { const { avgCommission } = useValidators() const params = { - label: t('validators.averageCommission'), + label: t('averageCommission'), value: `${String(avgCommission)}%`, helpKey: 'Average Commission', } diff --git a/packages/app/src/pages/Validators/Stats/TotalValidators.tsx b/packages/app/src/pages/Validators/Stats/TotalValidators.tsx index 7cf1027ba3..fe00a0708e 100644 --- a/packages/app/src/pages/Validators/Stats/TotalValidators.tsx +++ b/packages/app/src/pages/Validators/Stats/TotalValidators.tsx @@ -22,7 +22,7 @@ export const TotalValidators = () => { } const params = { - label: t('validators.totalValidators'), + label: t('totalValidators'), stat: { value: totalValidators.toNumber(), total: maxValidatorsCount.toNumber(), diff --git a/packages/app/src/pages/Validators/index.tsx b/packages/app/src/pages/Validators/index.tsx index 5883e9c397..a24a9bbdbc 100644 --- a/packages/app/src/pages/Validators/index.tsx +++ b/packages/app/src/pages/Validators/index.tsx @@ -24,15 +24,15 @@ export const ValidatorsInner = () => { return ( <> <Page.Title - title={t('validators.validators')} + title={t('validators')} tabs={[ { - title: t('validators.allValidators'), + title: t('allValidators'), active: activeTab === 0, onClick: () => setActiveTab(0), }, { - title: t('validators.favorites'), + title: t('favorites'), active: activeTab === 1, onClick: () => setActiveTab(1), badge: String(favorites.length), diff --git a/packages/locales/src/index.ts b/packages/locales/src/index.ts index 3b41497f4d..e2b9190052 100644 --- a/packages/locales/src/index.ts +++ b/packages/locales/src/index.ts @@ -4,9 +4,8 @@ import { enGB, es, zhCN } from 'date-fns/locale' import i18next from 'i18next' import { initReactI18next } from 'react-i18next' -import baseEn from './resources/en/base.json' +import appEn from './resources/en/app.json' import helpEn from './resources/en/help.json' -import libEn from './resources/en/library.json' import modalsEn from './resources/en/modals.json' import pagesEn from './resources/en/pages.json' import tipsEn from './resources/en/tips.json' @@ -25,9 +24,8 @@ export const locales: Record<string, LocaleEntry> = { // Supported namespaces. export const lngNamespaces: string[] = [ - 'base', + 'app', 'help', - 'library', 'modals', 'pages', 'tips', @@ -35,9 +33,8 @@ export const lngNamespaces: string[] = [ // Default structure of language resources. export const fallbackResources = { - ...baseEn, + ...appEn, ...helpEn, - ...libEn, ...modalsEn, ...pagesEn, ...tipsEn, diff --git a/packages/locales/src/resources/cn/library.json b/packages/locales/src/resources/cn/app.json similarity index 85% rename from packages/locales/src/resources/cn/library.json rename to packages/locales/src/resources/cn/app.json index f3402f647c..54321c2e1d 100644 --- a/packages/locales/src/resources/cn/library.json +++ b/packages/locales/src/resources/cn/app.json @@ -1,9 +1,9 @@ { - "library": { + "app": { "100Commission": "100% 佣金", "accountConnected": "帐户已连接", "accounts": "账户", - "active": "活跃", + "active": "激活", "activeLowCommission": "活跃低佣金", "activeLowCommissionSubtitle": "选择低佣金且高效表现的验证人", "activePools": "活跃提名池", @@ -49,6 +49,7 @@ "clear": "清除", "clearSelection": "清除选择", "clickToReload": "重新加载", + "community": "社区", "complete": "完成", "confirm": "确认", "confirmReformat": "地址已重新格式化。请确认", @@ -63,10 +64,12 @@ "copyAddress": "复制地址", "copyPoolAddress": "复制池{{type}}地址", "createPool": "创建提名池", + "date": "日期", "dayAverage": "日平均值", "dayPerformance": "天内表现", "dayPerformanceStanding": "{{count}}天活跃验证人内表现排名", "dayPoolPerformance": "天内提名池表现", + "decentralization": "去中心化", "destroying": "销毁中", "destroyingPools": "正在销毁提名池", "deviceVerified": "设备已验证", @@ -74,6 +77,7 @@ "disconnected": "已断开", "displayingValidators": "正在显示 {{count}} 个验证人", "done": "完成", + "email": "电子邮件", "enablePermissionlessClaiming": "启用己许可申领", "era": "Era", "eraPoints": "Era 点数", @@ -96,7 +100,9 @@ "free": "己解锁", "fromFavorites": "来自收藏夹", "fromFavoritesSubtitle": "获取一组您喜欢的验证人", + "goTo": "查看", "graphInactive": "不活跃", + "help": "帮助", "highCommission": "高佣金", "highPerformanceValidator": "高效表现的验证人", "iHaveScanned": "己扫描", @@ -104,7 +110,7 @@ "importing": "导入中", "inBlock": "己在区块中", "inQueue": "在队列中", - "inactive": "非活跃", + "inactive": "未激活", "include": "包含", "insertPayoutAddress": "输入收益到账地址", "invalid": "地址无效", @@ -124,6 +130,7 @@ "minimumBond": "最低质押为 {{minBondUnit}} {{unit}}", "missingIdentity": "无ID", "moreThanBalance": "质押金额超过余额", + "network": "网络", "next": "下一页", "noFilters": "无筛选", "noFree": "您没有可用的 {{unit}} 可质押", @@ -131,7 +138,7 @@ "noPayoutAddress": "无收益到账地址", "noValidators": "没有验证人", "noValidatorsMatch": "没有符合此条件的验证人", - "nominate": "提名", + "nominate": "抵押", "nominateActive": "激活", "nominateInactive": "未激活", "nominations": "提名", @@ -146,25 +153,54 @@ "notNominating": "非提名状态中", "notStaking": "无抵押", "notValidAddress": "无效地址", + "offline": "连接似乎处于离线状态", "optimalSelection": "最佳选择", "optimalSelectionSubtitle": "选择表现最佳且定期活跃的验证人", "order": "顺序", "orderValidators": "验证人排序", + "overview": "总览", "page": "{{page}} / {{total}}", + "payee": { + "account": { + "subtitle": "收益作为自由余额发到其他帐户", + "title": "转到其他帐户" + }, + "none": { + "subtitle": "未设置收益到账地址'", + "title_active": "未分配", + "title_default": "无" + }, + "staked": { + "subtitle": "自动将收益添加到现有的抵押余额中", + "title_active": "复利中", + "title_default": "复利" + }, + "stash": { + "subtitle": "收益作为自由余额发回账户", + "title": "转到您的帐户" + } + }, "payout": "收益", "payoutAccount": "收益到账账户", "payoutAddress": "收益到账地址", + "payouts": "收益", "pending": "待定中", "performance": "表现", "permissioned": "已获许可", "permissionedSubtitle": "仅本人可申领奖励", "permissionlessClaimingTurnedOff": "己许可申领己关闭", + "plugin": { + "polkawatch": "Polkawatch", + "staking_api": "Staking API", + "subscan": "Subscan" + }, "points": "点数", "pool": "提名池", "poolClaim": "提名池申领", "poolCommission": "提名池佣金", "poolId": "提名池ID", "poolMembers": "提名池成员", + "pools": "提名池", "prev": "上一页", "privacy": "隐私", "proxy": "代理账户", @@ -175,8 +211,10 @@ "remove": "删除", "removeSelected": "移除选定项", "reset": "重设", + "resources": "信息", "revertedToActiveSelection": "提名已恢复为您原来的选择", "rewardHistory": "历史收益", + "rewards": "奖励", "scanPolkadotVault": "请在Polkadot Vault上扫描", "search": "搜索池ID、名称或地址", "searchAddress": "搜索地址或身份", @@ -187,10 +225,21 @@ "signedByProxy": "代理账户己签名", "signer": "签名账户", "signing": "签署中", + "stake": "抵押", "submitTransaction": "准备提交交易", + "support": "支持", "syncing": "正在同步", "syncingPoolData": "查找提名池中", "syncingPoolList": "同步提名池列表", + "time": { + "day": "天", + "hour": "小时", + "hr": "小时", + "min": "分钟", + "minute": "分钟", + "second": "秒" + }, + "title": "Polkadot抵押平台", "tooSmall": "质押金额太少", "top": "首", "transactionCancelled": "交易已取消", @@ -209,6 +258,7 @@ "validatingParachainBlocks": "验证平行链区块", "validatorCommission": "验证人佣金", "validatorPerformance": "{{count}}天内验证人表现", + "validators": "验证人", "valueTooSmall": "值太小", "viewDecentralization": "分布式指标", "viewPoolNominations": "查看池提名", diff --git a/packages/locales/src/resources/cn/base.json b/packages/locales/src/resources/cn/base.json deleted file mode 100644 index 8db06f604e..0000000000 --- a/packages/locales/src/resources/cn/base.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "base": { - "active": "激活", - "community": "社区", - "date": "日期", - "decentralization": "去中心化", - "email": "电子邮件", - "goTo": "查看", - "help": "帮助", - "inactive": "未激活", - "network": "网络", - "nominate": "抵押", - "offline": "连接似乎处于离线状态", - "overview": "总览", - "payee": { - "account": { - "subtitle": "收益作为自由余额发到其他帐户", - "title": "转到其他帐户" - }, - "none": { - "subtitle": "未设置收益到账地址'", - "title_active": "未分配", - "title_default": "无" - }, - "staked": { - "subtitle": "自动将收益添加到现有的抵押余额中", - "title_active": "复利中", - "title_default": "复利" - }, - "stash": { - "subtitle": "收益作为自由余额发回账户", - "title": "转到您的帐户" - } - }, - "payouts": "收益", - "plugin": { - "polkawatch": "Polkawatch", - "staking_api": "Staking API", - "subscan": "Subscan" - }, - "pools": "提名池", - "resources": "信息", - "rewards": "奖励", - "stake": "抵押", - "support": "支持", - "time": { - "day": "天", - "hour": "小时", - "hr": "小时", - "min": "分钟", - "minute": "分钟", - "second": "秒" - }, - "title": "Polkadot抵押平台", - "validators": "验证人" - } -} diff --git a/packages/locales/src/resources/cn/pages.json b/packages/locales/src/resources/cn/pages.json index 289a77e12b..7afa06d0fc 100644 --- a/packages/locales/src/resources/cn/pages.json +++ b/packages/locales/src/resources/cn/pages.json @@ -1,267 +1,218 @@ { "pages": { - "common": { "stakingApiDisabled": "Staking API己断开" }, - "community": { - "bio": "简介", - "connecting": "连接中", - "email": "邮箱", - "fetchingValidators": "正在获取验证人信息", - "goBack": "返回", - "noValidators": "不包含验证人", - "validator": "{{count}} 个验证人", - "website": "个人网站" - }, - "decentralization": { - "analyticsNotAvailable": "无法使用该分布式分析器", - "analyticsNotSupported": "此网络不支持该分布式分析器", - "byRegionCountryNetwork": "按地区、国家和网络", - "decentralizationPerNomination": "每个提名的地理位置", - "howDecentralizedIsYourNomination": "您的提名去中心化程度如何?", - "maxDaysAnalyzed": "分析的最大天数", - "maxErasAnalyzed": "最大分析Era数", - "nominationShareInRewards": "奖励份额", - "payoutDistribution": "收益分布", - "polkawatchDisabled": "Polkawatch己断开", - "totalPayoutsAnalysed": "总收益分析" - }, - "nominate": { - "activeNominations": "活跃提名人", - "addressCopied": "地址已复制到剪贴板", - "alreadyInPool": "无需提名:已在提名池中", - "automaticallyBonded": "将自动质押收益到现有的质押余额中", - "back": "返回", - "bond": "质押", - "bondAmount": "质押金额", - "bondedFunds": "己质押金额", - "cancel": "取消", - "change": "更改", - "controllerAccount": "Controller 账户", - "controllerNotImported": "尚未导入Controller帐户。如果无法访问该帐户,请立即设置新帐户。否则,请将该账户导入扩展之一", - "earningRewards": "挣取收益中", - "fullCommissionValidatorSubtitle": "您将不会从收取 100% 佣金的验证者那里获得质押奖励。请考虑更新您的提名。", - "fullCommissionValidatorTitle": "您有一个 100% 佣金的提名", - "inactiveNominations": "非活跃提名人", - "manage": "管理", - "minimumToEarnRewards": "最低收益抵押额", - "minimumToNominate": "最低提名质押额", - "noNominationsSet": "非活跃:未设置提名", - "nominate": "提名", - "nominating": "提名中", - "nominatingAnd": "提名并", - "nominations": "提名", - "none": "无", - "notAssigned": "未分配", - "notEarningRewards": "非挣取收益状态", - "notNominating": "未提名", - "payoutDestination": "收益到账地址", - "payoutDestinationSubtitle": "选择如何接收收益。收益可以是复合式增长,也可以作为自由余额发回账户", - "pendingPayouts": "待付", - "poolDestroy": "提名池正在被摧毁,不能做提名操作", - "poolNominations": "池的提名", - "readOnly": "只读帐户无法签署交易", - "setNewController": "设置新Controller帐户", - "startNominating": "开始提名", - "status": "提名人状态", - "stop": "停止", - "summary": "总结", - "syncing": "正在同步", - "totalSupplyStaked": "所有抵押比例", - "unlocked": "已解锁", - "unstake": "解除抵押", - "unstakePromptInProgress_fast": "快速解除抵押正在进行中", - "unstakePromptInProgress_regular": "解除抵押正在进行中", - "unstakePromptInQueue": "您正在快速解除抵押队列中。当注册快速解除抵押时,您将无法执行任何提名人任务", - "unstakePromptReadyToWithdraw": "您的质押资金现已解锁并可提取", - "unstakePromptRevert": "如果您需要取消解除抵押, 请重新质押您的{{unit}}并再次开始提名", - "unstakePromptWaitingForUnlocks": "等待己解锁变为可提取", - "update": "更改", - "validator": "{{count}} 提名人", - "waitingForActiveNominations": "等待有效提名" - }, - "overview": { - "activeEra": "活跃 Era", - "activeNominators": "活跃提名人", - "activePools": "活跃提名池", - "addressCopied": "地址已复制到剪贴板", - "afterCommission": "除去佣金后", - "available": "可用", - "averageRewardRate": "平均奖励率", - "balance": "余额", - "bondedInPools": "提名池中当前质押的{{networkUnit}}总数", - "connect": "连接", - "free": "可用余额", - "inPool": "提名池中", - "inPools": "当前质押在提名池中", - "latestInflationRate": "质押者的通货膨胀率", - "locked": "己锁", - "manage": "管理", - "memberOf": "提名池", - "moreResources": "更多资讯", - "networkCurrentlyStaked": "{{total}} {{unit}} 目前正在{{network}}进行抵押", - "networkCurrentlyStakedSubtitle": "当前共有{{unit}} 在所有验证人和提名人之间做抵押", - "networkStats": "网络信息", - "nextRewardDistribution": "下次奖励分配", - "noActiveAccount": "无活跃帐户", - "nominating": "提名中", - "notStaking": "无抵押", - "overview": "概述", - "paidOutLastEraSubtitle": "上一个Era支付给质押者的总奖励金额.", - "paidOutLastEraTitle": "已在上个Era支付.", - "pool": "提名池", - "poolMembersBonding": "名成员正在提名池活跃质押中", - "proxy": "代理账户", - "recentPayouts": "最近收益", - "reserve": "储备", - "reserveBalance": "预存金额", - "reserved": "己储备", - "start": "开始", - "subscanDisabled": "Subscan己断开", - "supplyStaked": "抵押比例", - "syncingStatus": "正在同步状态", - "totalNominators": "提名人总数", - "totalNumAccounts": "已加入提名池的帐户总数", - "totalValidators": "所有验证人", - "unitSupplyStaked": "{{unit}} 抵押比例", - "unlocking": "正在解锁", - "updateReserve": "更新预存" - }, - "payouts": { - "deductedFromBond": "从质押里扣除", - "fromPool": "从提名池", - "lastEraPayout": "上Era收益", - "noRecentPayouts": "最近无收益", - "none": "无", - "notStaking": "无抵押", - "payout": "收益", - "payoutHistory": "收益记录", - "poolClaim": "提名池收益", - "recentPayouts": "最近收益", - "slashed": "除名", - "subscanDisabled": "Subscan己断开" - }, - "pools": { - "activePools": "活跃提名池", - "address": "地址", - "addressCopied": "地址已复制到剪贴板", - "addressInvalid": "地址无效", - "allPools": "所有提名池", - "alreadyNominating": "无法加入池:已提名", - "assigned": "己分配", - "assignedToAnyAccount": " 您的<b>主理人</b>、<b>提名人</b>和<b>守护人</b>角色可以分配给任何帐户。", - "availableToClaim": "成员可申领的奖励{{unit}}金额", - "back": "返回", - "beenClaimed": "已被申领。", - "beenClaimedBy": "成员已申领奖励{{unit}}总数", - "bond": "质押", - "bondAmount": "质押金额", - "bondedFunds": "己质押金额", - "bouncer": "守护人", - "browseMembers": "浏览成员", - "browsePools": "浏览提名池", - "cancel": "取消", - "closePool": "可提取己解锁金额并关闭池", - "compound": "复利", - "createAPool": "创建提名池", - "createPool": "创建提名池", - "depositor": "存款人", - "destroyPool": "销毁提名池", - "destroying": "销毁中", - "earningRewards": "挣取收益中", - "edit": "编辑", - "favorites": "收藏夹", - "fetchingFavoritePools": "正在获取收藏表中的提名池", - "fetchingMemberList": "正在获取会员列表", - "generateNominations": "生成提名", - "inPool": "提名池中", - "inactivePoolNotNominating": "非活跃:提名池未提名任何验证人", - "joinPool": "加入提名池", - "joinPoolHeading": " {{totalMembers}} 个提名池成员在{{network}}上抵押共{{totalPoolPoints}} 个{{unit}} ", - "leave": "离开", - "leavingPool": "离开提名池中", - "leftThePool": "所有成员已离开", - "locked": "己锁", - "manage": "管理", - "managementOptions": "选择管理选项", - "memberOfPool": "提名池成员", - "members": "成员", - "minimumToCreatePool": "最低建提名池质押金", - "minimumToJoinPool": "最低入提名池质押金", - "noFavorites": "无收藏夹", - "nominate": "提名", - "nominating": "提名中", - "nominatingAnd": "提名中和", - "nominator": "提名人", - "notEarningRewards": "非挣取收益状态", - "notInPool": "不在提名池中", - "notSet": "未设置", - "open": "打开", - "outstandingReward": "未申领奖励", - "overview": "概述", - "ownerOfPool": "提名池所有者", - "permissionToUnbond": "您有权解除和取出提名池里任何成员的资金。使用成员菜单", - "poolCommission": "提名池佣金", - "poolCreator": " 作为提名池创建者,您可使用提名池的<b>存款人</b>角色", - "poolCurrentlyLocked": "该提名池当前正处于锁定状态", - "poolInDestroyingState": "该提名池正处于销毁状态", - "poolMembers": "成员", - "poolMembership": "提名池成员名单", - "poolName": "提名池名称", - "poolNameSupport": "提名池名称支持字符、符号和表情-发挥你的创意吧!", - "poolState": "提名池状态", - "poolStats": "提名池信息", - "poolStatus": "提名池状态", - "pools": "提名池", - "readOnly": "只读帐户无法签署交易", - "reformatted": "地址已重新格式化", - "roles": "角色", - "root": "主理人", - "save": "保存", - "stopNominating": "如需继续销毁池,请先停止提名", - "summary": "总结", - "totalBonded": "总绑定金额", - "unbond": "解除质押", - "unbondFunds": "解除质押资金", - "unbondYourFunds": "可解锁资金质押", - "unclaimedRewards": "待申领奖励", - "unlocked": "已解锁", - "validator": "{{count}} 提名人", - "waitingForActiveNominations": "等待有效提名", - "withdraw": "提取", - "withdrawFunds": "取款", - "withdrawUnlock": "请取出己解锁金额以继续关闭池" - }, - "rewards": { - "adjustStake": "调整质押", - "annual": "每年", - "averageRewardRate": "平均奖励率", - "calculator": "计算器", - "daily": "每日", - "deductAvgCommissionOf": "扣除平均佣金{{commission}}", - "last30DayReward": "过去30天的奖励", - "monthly": "每月", - "period": "期间", - "projectedRewards": "预计奖励", - "rewardCalcSubtitle": "输入 {{unit}} 的质押金额并计算潜在奖励.", - "rewardCalculator": "奖励计算器", - "rewardsCalculator": "奖励计算器", - "stakePlaceholder": "例如 100", - "stakedBalance": "质押余额", - "unitAmount": "{{unit}}数量:", - "useCustomAmount": "自定义金额" - }, - "validators": { - "activeValidators": "活跃验证人", - "allValidators": "所有验证人", - "averageCommission": "平均佣金", - "connecting": "连接中", - "favoriteValidators": "收藏夹中的验证人", - "favorites": "收藏夹", - "fetchingFavoriteValidators": "正在获取收藏夹的验证人", - "fetchingValidators": "正在获取验证人信息", - "networkValidators": "验证人列表", - "noFavorites": "无收藏夹", - "totalValidators": "所有验证人", - "validators": "验证人" - } + "activeEra": "活跃 Era", + "activeNominations": "活跃提名人", + "activeNominators": "活跃提名人", + "activePools": "活跃提名池", + "activeValidators": "活跃验证人", + "address": "地址", + "addressCopied": "地址已复制到剪贴板", + "addressInvalid": "地址无效", + "adjustStake": "调整质押", + "afterCommission": "除去佣金后", + "allPools": "所有提名池", + "allValidators": "所有验证人", + "alreadyInPool": "无需提名:已在提名池中", + "alreadyNominating": "无法加入池:已提名", + "analyticsNotAvailable": "无法使用该分布式分析器", + "analyticsNotSupported": "此网络不支持该分布式分析器", + "annual": "每年", + "assigned": "己分配", + "assignedToAnyAccount": " 您的<b>主理人</b>、<b>提名人</b>和<b>守护人</b>角色可以分配给任何帐户。", + "automaticallyBonded": "将自动质押收益到现有的质押余额中", + "available": "可用", + "availableToClaim": "成员可申领的奖励{{unit}}金额", + "averageCommission": "平均佣金", + "averageRewardRate": "平均奖励率", + "back": "返回", + "balance": "余额", + "beenClaimed": "已被申领。", + "beenClaimedBy": "成员已申领奖励{{unit}}总数", + "bio": "简介", + "bond": "质押", + "bondAmount": "质押金额", + "bondedFunds": "己质押金额", + "bondedInPools": "提名池中当前质押的{{networkUnit}}总数", + "bouncer": "守护人", + "browseMembers": "浏览成员", + "browsePools": "浏览提名池", + "byRegionCountryNetwork": "按地区、国家和网络", + "calculator": "计算器", + "cancel": "取消", + "change": "更改", + "closePool": "可提取己解锁金额并关闭池", + "compound": "复利", + "connect": "连接", + "connecting": "连接中", + "controllerAccount": "Controller 账户", + "controllerNotImported": "尚未导入Controller帐户。如果无法访问该帐户,请立即设置新帐户。否则,请将该账户导入扩展之一", + "createAPool": "创建提名池", + "createPool": "创建提名池", + "daily": "每日", + "decentralizationPerNomination": "每个提名的地理位置", + "deductAvgCommissionOf": "扣除平均佣金{{commission}}", + "deductedFromBond": "从质押里扣除", + "depositor": "存款人", + "destroyPool": "销毁提名池", + "destroying": "销毁中", + "earningRewards": "挣取收益中", + "edit": "编辑", + "email": "邮箱", + "favoriteValidators": "收藏夹中的验证人", + "favorites": "收藏夹", + "fetchingFavoritePools": "正在获取收藏表中的提名池", + "fetchingFavoriteValidators": "正在获取收藏夹的验证人", + "fetchingMemberList": "正在获取会员列表", + "fetchingValidators": "正在获取验证人信息", + "free": "可用余额", + "fromPool": "从提名池", + "fullCommissionValidatorSubtitle": "您将不会从收取 100% 佣金的验证者那里获得质押奖励。请考虑更新您的提名。", + "fullCommissionValidatorTitle": "您有一个 100% 佣金的提名", + "generateNominations": "生成提名", + "goBack": "返回", + "howDecentralizedIsYourNomination": "您的提名去中心化程度如何?", + "inPool": "提名池中", + "inPools": "当前质押在提名池中", + "inactiveNominations": "非活跃提名人", + "inactivePoolNotNominating": "非活跃:提名池未提名任何验证人", + "joinPool": "加入提名池", + "joinPoolHeading": " {{totalMembers}} 个提名池成员在{{network}}上抵押共{{totalPoolPoints}} 个{{unit}} ", + "last30DayReward": "过去30天的奖励", + "lastEraPayout": "上Era收益", + "latestInflationRate": "质押者的通货膨胀率", + "leave": "离开", + "leavingPool": "离开提名池中", + "leftThePool": "所有成员已离开", + "locked": "己锁", + "manage": "管理", + "managementOptions": "选择管理选项", + "maxDaysAnalyzed": "分析的最大天数", + "maxErasAnalyzed": "最大分析Era数", + "memberOf": "提名池", + "memberOfPool": "提名池成员", + "members": "成员", + "minimumToCreatePool": "最低建提名池质押金", + "minimumToEarnRewards": "最低收益抵押额", + "minimumToJoinPool": "最低入提名池质押金", + "minimumToNominate": "最低提名质押额", + "monthly": "每月", + "moreResources": "更多资讯", + "networkCurrentlyStaked": "{{total}} {{unit}} 目前正在{{network}}进行抵押", + "networkCurrentlyStakedSubtitle": "当前共有{{unit}} 在所有验证人和提名人之间做抵押", + "networkStats": "网络信息", + "networkValidators": "验证人列表", + "nextRewardDistribution": "下次奖励分配", + "noActiveAccount": "无活跃帐户", + "noFavorites": "无收藏夹", + "noNominationsSet": "非活跃:未设置提名", + "noRecentPayouts": "最近无收益", + "noValidators": "不包含验证人", + "nominate": "提名", + "nominating": "提名中", + "nominatingAnd": "提名并", + "nominationShareInRewards": "奖励份额", + "nominations": "提名", + "nominator": "提名人", + "none": "无", + "notAssigned": "未分配", + "notEarningRewards": "非挣取收益状态", + "notInPool": "不在提名池中", + "notNominating": "未提名", + "notSet": "未设置", + "notStaking": "无抵押", + "open": "打开", + "outstandingReward": "未申领奖励", + "overview": "概述", + "ownerOfPool": "提名池所有者", + "paidOutLastEraSubtitle": "上一个Era支付给质押者的总奖励金额.", + "paidOutLastEraTitle": "已在上个Era支付.", + "payout": "收益", + "payoutDestination": "收益到账地址", + "payoutDestinationSubtitle": "选择如何接收收益。收益可以是复合式增长,也可以作为自由余额发回账户", + "payoutDistribution": "收益分布", + "payoutHistory": "收益记录", + "pendingPayouts": "待付", + "period": "期间", + "permissionToUnbond": "您有权解除和取出提名池里任何成员的资金。使用成员菜单", + "polkawatchDisabled": "Polkawatch己断开", + "pool": "提名池", + "poolClaim": "提名池收益", + "poolCommission": "提名池佣金", + "poolCreator": " 作为提名池创建者,您可使用提名池的<b>存款人</b>角色", + "poolCurrentlyLocked": "该提名池当前正处于锁定状态", + "poolDestroy": "提名池正在被摧毁,不能做提名操作", + "poolInDestroyingState": "该提名池正处于销毁状态", + "poolMembers": "成员", + "poolMembersBonding": "名成员正在提名池活跃质押中", + "poolMembership": "提名池成员名单", + "poolName": "提名池名称", + "poolNameSupport": "提名池名称支持字符、符号和表情-发挥你的创意吧!", + "poolNominations": "池的提名", + "poolState": "提名池状态", + "poolStats": "提名池信息", + "poolStatus": "提名池状态", + "pools": "提名池", + "poolsNominatingAnd": "提名中和", + "projectedRewards": "预计奖励", + "proxy": "代理账户", + "readOnly": "只读帐户无法签署交易", + "recentPayouts": "最近收益", + "reformatted": "地址已重新格式化", + "reserve": "储备", + "reserveBalance": "预存金额", + "reserved": "己储备", + "rewardCalcSubtitle": "输入 {{unit}} 的质押金额并计算潜在奖励.", + "rewardCalculator": "奖励计算器", + "rewardsCalculator": "奖励计算器", + "roles": "角色", + "root": "主理人", + "save": "保存", + "setNewController": "设置新Controller帐户", + "slashed": "除名", + "stakePlaceholder": "例如 100", + "stakedBalance": "质押余额", + "stakingApiDisabled": "Staking API己断开", + "start": "开始", + "startNominating": "开始提名", + "status": "提名人状态", + "stop": "停止", + "stopNominating": "如需继续销毁池,请先停止提名", + "subscanDisabled": "Subscan己断开", + "summary": "总结", + "supplyStaked": "抵押比例", + "syncing": "正在同步", + "syncingStatus": "正在同步状态", + "totalBonded": "总绑定金额", + "totalNominators": "提名人总数", + "totalNumAccounts": "已加入提名池的帐户总数", + "totalPayoutsAnalysed": "总收益分析", + "totalSupplyStaked": "所有抵押比例", + "totalValidators": "所有验证人", + "unbond": "解除质押", + "unbondFunds": "解除质押资金", + "unbondYourFunds": "可解锁资金质押", + "unclaimedRewards": "待申领奖励", + "unitAmount": "{{unit}}数量:", + "unitSupplyStaked": "{{unit}} 抵押比例", + "unlocked": "已解锁", + "unlocking": "正在解锁", + "unstake": "解除抵押", + "unstakePromptInProgress_fast": "快速解除抵押正在进行中", + "unstakePromptInProgress_regular": "解除抵押正在进行中", + "unstakePromptInQueue": "您正在快速解除抵押队列中。当注册快速解除抵押时,您将无法执行任何提名人任务", + "unstakePromptReadyToWithdraw": "您的质押资金现已解锁并可提取", + "unstakePromptRevert": "如果您需要取消解除抵押, 请重新质押您的{{unit}}并再次开始提名", + "unstakePromptWaitingForUnlocks": "等待己解锁变为可提取", + "update": "更改", + "updateReserve": "更新预存", + "useCustomAmount": "自定义金额", + "validator": "{{count}} 个验证人", + "validatorCount": "{{count}} 提名人", + "validators": "验证人", + "waitingForActiveNominations": "等待有效提名", + "website": "个人网站", + "withdraw": "提取", + "withdrawFunds": "取款", + "withdrawUnlock": "请取出己解锁金额以继续关闭池" } } diff --git a/packages/locales/src/resources/en/library.json b/packages/locales/src/resources/en/app.json similarity index 85% rename from packages/locales/src/resources/en/library.json rename to packages/locales/src/resources/en/app.json index bc7ac38c73..5a9d6ad6dd 100644 --- a/packages/locales/src/resources/en/library.json +++ b/packages/locales/src/resources/en/app.json @@ -1,5 +1,5 @@ { - "library": { + "app": { "100Commission": "100% commission", "accountConnected": "Account Connected", "accounts": "Accounts", @@ -49,6 +49,7 @@ "clear": "Clear", "clearSelection": "clear selection", "clickToReload": "Click to reload", + "community": "Community", "complete": "Complete", "confirm": "Confirm", "confirmReformat": "Address was reformatted. Please confirm.", @@ -63,10 +64,12 @@ "copyAddress": "Copy Address", "copyPoolAddress": "Copy Pool {{type}} Address", "createPool": "Create Pool", + "date": "Date", "dayAverage": "Day Average", "dayPerformance": "Day Performance", "dayPerformanceStanding": "{{count}} Day Active Validators Performance Standing", "dayPoolPerformance": "Day Pool Performance", + "decentralization": "Decentralization", "destroying": "Destroying", "destroyingPools": "Destroying Pools", "deviceVerified": "Device verified", @@ -75,6 +78,7 @@ "displayingValidators_one": "Displaying {{count}} Validator", "displayingValidators_other": "Displaying {{count}} Validators", "done": "Done", + "email": "Email", "enablePermissionlessClaiming": "Enable Permissionless Claiming", "era": "Era", "eraPoints": "Era Points", @@ -98,7 +102,9 @@ "free": "Free", "fromFavorites": "From Favorites", "fromFavoritesSubtitle": "Gets a set of your favorite validators.", + "goTo": "Go To", "graphInactive": "Inactive", + "help": "Help", "highCommission": "High Commission", "highPerformanceValidator": "High Performance Validator", "iHaveScanned": "I Have Scanned", @@ -126,6 +132,7 @@ "minimumBond": "A minimum bond of {{minBondUnit}} {{unit}} is required", "missingIdentity": "Missing Identity", "moreThanBalance": "Bond amount is more than your free balance.", + "network": "Network", "next": "Next", "noFilters": "No filters", "noFree": "You have no free {{unit}} to bond.", @@ -149,25 +156,54 @@ "notNominating": "Not Nominating", "notStaking": "Not Staking", "notValidAddress": "Not a valid address", + "offline": "Connection appears to be offline", "optimalSelection": "Optimal Selection", "optimalSelectionSubtitle": "Selects top performing and regularly active validators.", "order": "Order", "orderValidators": "Order Validators", + "overview": "Overview", "page": "Page {{page}} of {{total}}", + "payee": { + "account": { + "subtitle": "Send payouts to another account as free balance.", + "title": "To Another Account" + }, + "none": { + "subtitle": "Have no payout destination set.", + "title_active": "Not Assigned", + "title_default": "None" + }, + "staked": { + "subtitle": "Add payouts to your existing staked balance automatically.", + "title_active": "Compounding", + "title_default": "Compound" + }, + "stash": { + "subtitle": "Payouts are sent to your account as free balance.", + "title": "To Your Account" + } + }, "payout": "Payout", "payoutAccount": "Payout Account", "payoutAddress": "Payout Address", + "payouts": "Payouts", "pending": "Pending", "performance": "Performance", "permissioned": "Permissioned", "permissionedSubtitle": "Only you can claim rewards.", "permissionlessClaimingTurnedOff": "Permissionless claiming is turned off.", + "plugin": { + "polkawatch": "Polkawatch", + "staking_api": "Staking API", + "subscan": "Subscan" + }, "points": "Points", "pool": "Pool", "poolClaim": "Pool Claim", "poolCommission": "Pool Commission", "poolId": "Pool ID", "poolMembers": "Pool Members", + "pools": "Pools", "prev": "Prev", "privacy": "Privacy", "proxy": "Proxy", @@ -178,8 +214,10 @@ "remove": "Remove", "removeSelected": "Remove Selected", "reset": "Reset", + "resources": "Resources", "revertedToActiveSelection": "Nominations have been reverted to your active selection.", "rewardHistory": "Reward History", + "rewards": "Rewards", "scanPolkadotVault": "Scan on Polkadot Vault", "search": "Search Pool ID, Name or Address", "searchAddress": "Search Address or Identity", @@ -190,10 +228,27 @@ "signedByProxy": "Signed by Proxy", "signer": "Signer", "signing": "Signing", + "stake": "Stake", "submitTransaction": "Ready to submit transaction.", + "support": "Support", "syncing": "Syncing", "syncingPoolData": "Finding Pools to Join", "syncingPoolList": "Syncing Pool list", + "time": { + "day_one": "day", + "day_other": "days", + "hour_one": "hour", + "hour_other": "hours", + "hr_one": "hr", + "hr_other": "hrs", + "min_one": "min", + "min_other": "mins", + "minute_one": "minute", + "minute_other": "minutes", + "second_one": "second", + "second_other": "seconds" + }, + "title": "Polkadot Staking Dashboard", "tooSmall": "Bond amount is too small.", "top": "Top", "transactionCancelled": "Transaction was cancelled", @@ -212,6 +267,7 @@ "validatingParachainBlocks": "Validating Parachain Blocks", "validatorCommission": "Validator Commission", "validatorPerformance": "{{count}} Day Validator Performance", + "validators": "Validators", "valueTooSmall": "Value is too small", "viewDecentralization": "View Decentralization", "viewPoolNominations": "View Pool Nominations", diff --git a/packages/locales/src/resources/en/base.json b/packages/locales/src/resources/en/base.json deleted file mode 100644 index d168243f43..0000000000 --- a/packages/locales/src/resources/en/base.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "base": { - "active": "Active", - "community": "Community", - "date": "Date", - "decentralization": "Decentralization", - "email": "Email", - "goTo": "Go To", - "help": "Help", - "inactive": "Inactive", - "network": "Network", - "nominate": "Nominate", - "offline": "Connection appears to be offline", - "overview": "Overview", - "payee": { - "account": { - "subtitle": "Send payouts to another account as free balance.", - "title": "To Another Account" - }, - "none": { - "subtitle": "Have no payout destination set.", - "title_active": "Not Assigned", - "title_default": "None" - }, - "staked": { - "subtitle": "Add payouts to your existing staked balance automatically.", - "title_active": "Compounding", - "title_default": "Compound" - }, - "stash": { - "subtitle": "Payouts are sent to your account as free balance.", - "title": "To Your Account" - } - }, - "payouts": "Payouts", - "plugin": { - "polkawatch": "Polkawatch", - "staking_api": "Staking API", - "subscan": "Subscan" - }, - "pools": "Pools", - "resources": "Resources", - "rewards": "Rewards", - "stake": "Stake", - "support": "Support", - "time": { - "day_one": "day", - "day_other": "days", - "hour_one": "hour", - "hour_other": "hours", - "hr_one": "hr", - "hr_other": "hrs", - "min_one": "min", - "min_other": "mins", - "minute_one": "minute", - "minute_other": "minutes", - "second_one": "second", - "second_other": "seconds" - }, - "title": "Polkadot Staking Dashboard", - "validators": "Validators" - } -} diff --git a/packages/locales/src/resources/en/pages.json b/packages/locales/src/resources/en/pages.json index 8849c1578e..7af5aac24a 100644 --- a/packages/locales/src/resources/en/pages.json +++ b/packages/locales/src/resources/en/pages.json @@ -1,270 +1,220 @@ { "pages": { - "common": { "stakingApiDisabled": "Staking API Disabled" }, - "community": { - "bio": "Bio", - "connecting": "Connecting", - "email": "Email", - "fetchingValidators": "Fetching validators", - "goBack": "Go Back", - "noValidators": "This entity contains no validators.", - "validator_one": "{{count}} Validator", - "validator_other": "{{count}} Validators", - "website": "Website" - }, - "decentralization": { - "analyticsNotAvailable": "Analytics Not Available", - "analyticsNotSupported": "Analytics Not Supported", - "byRegionCountryNetwork": "by Region, Country and Network", - "decentralizationPerNomination": "Geolocation Per Nomination", - "howDecentralizedIsYourNomination": "How decentralized is your Nomination?", - "maxDaysAnalyzed": "Max Days Analysed", - "maxErasAnalyzed": "Max Eras Analysed", - "nominationShareInRewards": "Share of rewards", - "payoutDistribution": "Payout Distribution", - "polkawatchDisabled": "Polkawatch Disabled", - "totalPayoutsAnalysed": "Total Payouts Analysed" - }, - "nominate": { - "activeNominations": "Active Nominations", - "addressCopied": "Address Copied to Clipboard", - "alreadyInPool": "Cannot Nominate: Already in Pool", - "automaticallyBonded": "Automatically bond payouts to your existing staked balance.", - "back": "Back", - "bond": "Bond", - "bondAmount": "Bond Amount", - "bondedFunds": "Bonded Funds", - "cancel": "Cancel", - "change": "Change", - "controllerAccount": "Controller Account", - "controllerNotImported": "You have not imported your controller account. If you have lost access to your controller account, set a new one now. Otherwise, import the controller into one of your active extensions.", - "earningRewards": "Earning Rewards", - "fullCommissionValidatorSubtitle": "You will not receive staking rewards from validators who charge 100% commission. Consider updating your nominations.", - "fullCommissionValidatorTitle": "You Have a Nomination with 100% Commission", - "inactiveNominations": "Inactive Nominations", - "manage": "Manage", - "minimumToEarnRewards": "Minimum To Earn Rewards", - "minimumToNominate": "Minimum To Nominate", - "noNominationsSet": "Inactive: No Nominations Set", - "nominate": "Nominate", - "nominating": "Nominating", - "nominatingAnd": "Nominating and", - "nominations": "Nominations", - "none": "None", - "notAssigned": "Not Assigned", - "notEarningRewards": "Not Earning Rewards", - "notNominating": "Not Nominating", - "payoutDestination": "Payout Destination", - "payoutDestinationSubtitle": "Choose how payouts will be received. Payouts can either be compounded or sent to an account as free balance.", - "pendingPayouts": "Pending Payouts", - "poolDestroy": "Pool is being destroyed and nominating is no longer possible.", - "poolNominations": "Pool Nominations", - "readOnly": "Your account is read only, and cannot sign transactions.", - "setNewController": "Set New Controller", - "startNominating": "Start Nominating", - "status": "Nominator Status", - "stop": "Stop", - "summary": "Summary", - "syncing": "Syncing", - "totalSupplyStaked": "Total Supply Staked", - "unlocked": "Unlocked", - "unstake": "Unstake", - "unstakePromptInProgress_fast": "Fast Unstake in Progress", - "unstakePromptInProgress_regular": "Unstake in Progress", - "unstakePromptInQueue": "You are in the fast unstake queue. You will not be able to carry out any nominator tasks while you are registered for fast unstake.", - "unstakePromptReadyToWithdraw": "Your bonded funds are now unlocked and ready to withdraw.", - "unstakePromptRevert": "If you no longer wish to unstake, rebond your {{unit}} and start nominating again.", - "unstakePromptWaitingForUnlocks": "Waiting for unlocks to become available to withdraw.", - "update": "Update", - "validator_one": "{{count}} Validator", - "validator_other": "{{count}} Validators", - "waitingForActiveNominations": "Waiting for Active Nominations" - }, - "overview": { - "activeEra": "Active Era", - "activeNominators": "Active Nominators", - "activePools": "Active Pools", - "addressCopied": "Address Copied to Clipboard", - "afterCommission": "after commission", - "available": "Available", - "averageRewardRate": "Average Reward Rate", - "balance": "Balance", - "bondedInPools": "The total {{networkUnit}} currently bonded in nomination pools.", - "connect": "Connect", - "free": "Free", - "inPool": "In a Pool", - "inPools": "is currently bonded in pools.", - "latestInflationRate": "Inflation Rate to Stakers", - "locked": "Locked", - "manage": "Manage", - "memberOf": "Member of", - "moreResources": "More Resources", - "networkCurrentlyStaked": "{{total}} {{unit}} is currently being staked on {{network}}.", - "networkCurrentlyStakedSubtitle": "The total {{unit}} currently being staked amongst all validators and nominators.", - "networkStats": "Network Stats", - "nextRewardDistribution": "Next Reward Distribution", - "noActiveAccount": "No Active Account", - "nominating": "Nominating", - "notStaking": "Not Staking", - "overview": "Overview", - "paidOutLastEraSubtitle": "Total amount paid out as rewards in the last era to stakers.", - "paidOutLastEraTitle": "was paid out in the last era.", - "pool": "Pool", - "poolMembersBonding": "pool members are actively bonding in pools.", - "proxy": "Proxy", - "recentPayouts": "Recent Payouts", - "reserve": "Reserve", - "reserveBalance": "Reserve Balance", - "reserved": "Reserved", - "start": "Start", - "subscanDisabled": "Subscan Disabled", - "supplyStaked": "Supply Staked", - "syncingStatus": "Syncing Status", - "totalNominators": "Total Nominators", - "totalNumAccounts": "The total number of accounts that have joined a pool.", - "totalValidators": "Total Validators", - "unitSupplyStaked": "{{unit}} Supply Staked", - "unlocking": "Unlocking", - "updateReserve": "Update Reserve" - }, - "payouts": { - "deductedFromBond": "Deducted from bond", - "fromPool": "From Pool", - "lastEraPayout": "Last Era Payout", - "noRecentPayouts": "No Recent Payouts", - "none": "None", - "notStaking": "Not Staking", - "payout": "Payout", - "payoutHistory": "Payout History", - "poolClaim": "Pool Claim", - "recentPayouts": "Recent Payouts", - "slashed": "Slashed", - "subscanDisabled": "Subscan Disabled" - }, - "pools": { - "activePools": "Active Pools", - "address": "Address", - "addressCopied": "Address Copied to Clipboard", - "addressInvalid": "Address Invalid", - "allPools": "All Pools", - "alreadyNominating": "Cannot Join Pool: Already Nominating", - "assigned": "Assigned", - "assignedToAnyAccount": " Your <b>Root</b>, <b>Nominator</b> and <b>Bouncer</b> roles can be assigned to any account.", - "availableToClaim": "The outstanding amount of {{unit}} available to claim by pool members.", - "back": "Back", - "beenClaimed": "in rewards have been claimed.", - "beenClaimedBy": "The total amount of {{unit}} that has been claimed by pool members.", - "bond": "Bond", - "bondAmount": "Bond Amount", - "bondedFunds": "Bonded Funds", - "bouncer": "Bouncer", - "browseMembers": "Browse Members", - "browsePools": "Browse Pools", - "cancel": "Cancel", - "closePool": "You can now withdraw and close the pool.", - "compound": "Compound", - "createAPool": "Create a Pool", - "createPool": "Create Pool", - "depositor": "Depositor", - "destroyPool": "Destroy Pool", - "destroying": "Destroying", - "earningRewards": "Earning Rewards", - "edit": "Edit", - "favorites": "Favorites", - "fetchingFavoritePools": "Fetching favorite pools", - "fetchingMemberList": "Fetching Member List", - "generateNominations": "Generate Nominations", - "inPool": "In Pool", - "inactivePoolNotNominating": "Inactive: Pool Not Nominating", - "joinPool": "Join Pool", - "joinPoolHeading": "Join {{totalMembers}} pool members staking a total of {{totalPoolPoints}} {{unit}} on {{network}}.", - "leave": "Leave", - "leavingPool": "Leaving Pool", - "leftThePool": "All members have now left the pool", - "locked": "Locked", - "manage": "Manage", - "managementOptions": "to select management options.", - "memberOfPool": "Member of Pool", - "members": "Members", - "minimumToCreatePool": "Minimum To Create Pool", - "minimumToJoinPool": "Minimum To Join Pool", - "noFavorites": "No Favorites.", - "nominate": "Nominate", - "nominating": "Nominating", - "nominatingAnd": "Nominating and", - "nominator": "Nominator", - "notEarningRewards": "Not Earning Rewards", - "notInPool": "Not in Pool", - "notSet": "Not Set", - "open": "Open", - "outstandingReward": "outstanding reward balance.", - "overview": "Overview", - "ownerOfPool": "Owner of Pool", - "permissionToUnbond": "You have permission to unbond and withdraw funds of any pool member. Use a member's menu", - "poolCommission": "Pool Commission", - "poolCreator": "As the pool creator, you will consume your pool's <b>Depositor</b> role.", - "poolCurrentlyLocked": "Pool Currently Locked", - "poolInDestroyingState": "Pool in Destroying State", - "poolMembers": "Pool Members", - "poolMembership": "Pool Membership", - "poolName": "Pool Name", - "poolNameSupport": "Pool names support characters, symbols and emojis - be creative!", - "poolState": "Pool State", - "poolStats": "Pool Stats", - "poolStatus": "Pool Status", - "pools": "Pools", - "readOnly": "Your account is read only, and cannot sign transactions.", - "reformatted": "Address was reformatted", - "roles": "Roles", - "root": "Root", - "save": "Save", - "stopNominating": "To continue with pool closure, stop nominating.", - "summary": "Summary", - "totalBonded": "Total Bonded", - "unbond": "Unbond", - "unbondFunds": "Unbond Funds", - "unbondYourFunds": "You can now unbond your funds.", - "unclaimedRewards": "Unclaimed Rewards", - "unlocked": "Unlocked", - "validator_one": "{{count}} Validator", - "validator_other": "{{count}} Validators", - "waitingForActiveNominations": "Waiting for Active Nominations", - "withdraw": "Withdraw", - "withdrawFunds": "Withdraw Funds", - "withdrawUnlock": "Withdraw your unlock chunk to proceed with pool closure." - }, - "rewards": { - "adjustStake": "Adjust Your Stake", - "annual": "Annual", - "averageRewardRate": "Average Reward Rate", - "calculator": "Calculator", - "daily": "Daily", - "deductAvgCommissionOf": "Deduct average commission of {{commission}}%", - "last30DayReward": "Last 30 Days Reward", - "monthly": "Monthly", - "period": "Period", - "projectedRewards": "Projected Rewards", - "rewardCalcSubtitle": "Enter a {{unit}} amount to stake and calculate the potential rewards.", - "rewardCalculator": "Reward Calculator", - "rewardsCalculator": "Rewards Calculator", - "stakePlaceholder": "e.g. 100", - "stakedBalance": "Staked Balance", - "unitAmount": "{{unit}} Amount", - "useCustomAmount": "Use Custom Amount" - }, - "validators": { - "activeValidators": "Active Validators", - "allValidators": "All Validators", - "averageCommission": "Average Commission", - "connecting": "Connecting", - "favoriteValidators": "Favorite Validators", - "favorites": "Favorites", - "fetchingFavoriteValidators": "Fetching favorite validators", - "fetchingValidators": "Fetching validators", - "networkValidators": "Network Validators", - "noFavorites": "No Favorites.", - "totalValidators": "Total Validators", - "validators": "Validators" - } + "activeEra": "Active Era", + "activeNominations": "Active Nominations", + "activeNominators": "Active Nominators", + "activePools": "Active Pools", + "activeValidators": "Active Validators", + "address": "Address", + "addressCopied": "Address Copied to Clipboard", + "addressInvalid": "Address Invalid", + "adjustStake": "Adjust Your Stake", + "afterCommission": "after commission", + "allPools": "All Pools", + "allValidators": "All Validators", + "alreadyInPool": "Cannot Nominate: Already in Pool", + "alreadyNominating": "Cannot Join Pool: Already Nominating", + "analyticsNotAvailable": "Analytics Not Available", + "analyticsNotSupported": "Analytics Not Supported", + "annual": "Annual", + "assigned": "Assigned", + "assignedToAnyAccount": " Your <b>Root</b>, <b>Nominator</b> and <b>Bouncer</b> roles can be assigned to any account.", + "automaticallyBonded": "Automatically bond payouts to your existing staked balance.", + "available": "Available", + "availableToClaim": "The outstanding amount of {{unit}} available to claim by pool members.", + "averageCommission": "Average Commission", + "averageRewardRate": "Average Reward Rate", + "back": "Back", + "balance": "Balance", + "beenClaimed": "in rewards have been claimed.", + "beenClaimedBy": "The total amount of {{unit}} that has been claimed by pool members.", + "bio": "Bio", + "bond": "Bond", + "bondAmount": "Bond Amount", + "bondedFunds": "Bonded Funds", + "bondedInPools": "The total {{networkUnit}} currently bonded in nomination pools.", + "bouncer": "Bouncer", + "browseMembers": "Browse Members", + "browsePools": "Browse Pools", + "byRegionCountryNetwork": "by Region, Country and Network", + "calculator": "Calculator", + "cancel": "Cancel", + "change": "Change", + "closePool": "You can now withdraw and close the pool.", + "compound": "Compound", + "connect": "Connect", + "connecting": "Connecting", + "controllerAccount": "Controller Account", + "controllerNotImported": "You have not imported your controller account. If you have lost access to your controller account, set a new one now. Otherwise, import the controller into one of your active extensions.", + "createAPool": "Create a Pool", + "createPool": "Create Pool", + "daily": "Daily", + "decentralizationPerNomination": "Geolocation Per Nomination", + "deductAvgCommissionOf": "Deduct average commission of {{commission}}%", + "deductedFromBond": "Deducted from bond", + "depositor": "Depositor", + "destroyPool": "Destroy Pool", + "destroying": "Destroying", + "earningRewards": "Earning Rewards", + "edit": "Edit", + "email": "Email", + "favoriteValidators": "Favorite Validators", + "favorites": "Favorites", + "fetchingFavoritePools": "Fetching favorite pools", + "fetchingFavoriteValidators": "Fetching favorite validators", + "fetchingMemberList": "Fetching Member List", + "fetchingValidators": "Fetching validators", + "free": "Free", + "fromPool": "From Pool", + "fullCommissionValidatorSubtitle": "You will not receive staking rewards from validators who charge 100% commission. Consider updating your nominations.", + "fullCommissionValidatorTitle": "You Have a Nomination with 100% Commission", + "generateNominations": "Generate Nominations", + "goBack": "Go Back", + "howDecentralizedIsYourNomination": "How decentralized is your Nomination?", + "inPool": "In a Pool", + "inPools": "is currently bonded in pools.", + "inactiveNominations": "Inactive Nominations", + "inactivePoolNotNominating": "Inactive: Pool Not Nominating", + "joinPool": "Join Pool", + "joinPoolHeading": "Join {{totalMembers}} pool members staking a total of {{totalPoolPoints}} {{unit}} on {{network}}.", + "last30DayReward": "Last 30 Days Reward", + "lastEraPayout": "Last Era Payout", + "latestInflationRate": "Inflation Rate to Stakers", + "leave": "Leave", + "leavingPool": "Leaving Pool", + "leftThePool": "All members have now left the pool", + "locked": "Locked", + "manage": "Manage", + "managementOptions": "to select management options.", + "maxDaysAnalyzed": "Max Days Analysed", + "maxErasAnalyzed": "Max Eras Analysed", + "memberOf": "Member of", + "memberOfPool": "Member of Pool", + "members": "Members", + "minimumToCreatePool": "Minimum To Create Pool", + "minimumToEarnRewards": "Minimum To Earn Rewards", + "minimumToJoinPool": "Minimum To Join Pool", + "minimumToNominate": "Minimum To Nominate", + "monthly": "Monthly", + "moreResources": "More Resources", + "networkCurrentlyStaked": "{{total}} {{unit}} is currently being staked on {{network}}.", + "networkCurrentlyStakedSubtitle": "The total {{unit}} currently being staked amongst all validators and nominators.", + "networkStats": "Network Stats", + "networkValidators": "Network Validators", + "nextRewardDistribution": "Next Reward Distribution", + "noActiveAccount": "No Active Account", + "noFavorites": "No Favorites.", + "noNominationsSet": "Inactive: No Nominations Set", + "noRecentPayouts": "No Recent Payouts", + "noValidators": "This entity contains no validators.", + "nominate": "Nominate", + "nominating": "Nominating", + "nominatingAnd": "Nominating and", + "nominationShareInRewards": "Share of rewards", + "nominations": "Nominations", + "nominator": "Nominator", + "none": "None", + "notAssigned": "Not Assigned", + "notEarningRewards": "Not Earning Rewards", + "notInPool": "Not in Pool", + "notNominating": "Not Nominating", + "notSet": "Not Set", + "notStaking": "Not Staking", + "open": "Open", + "outstandingReward": "outstanding reward balance.", + "overview": "Overview", + "ownerOfPool": "Owner of Pool", + "paidOutLastEraSubtitle": "Total amount paid out as rewards in the last era to stakers.", + "paidOutLastEraTitle": "was paid out in the last era.", + "payout": "Payout", + "payoutDestination": "Payout Destination", + "payoutDestinationSubtitle": "Choose how payouts will be received. Payouts can either be compounded or sent to an account as free balance.", + "payoutDistribution": "Payout Distribution", + "payoutHistory": "Payout History", + "pendingPayouts": "Pending Payouts", + "period": "Period", + "permissionToUnbond": "You have permission to unbond and withdraw funds of any pool member. Use a member's menu", + "polkawatchDisabled": "Polkawatch Disabled", + "pool": "Pool", + "poolClaim": "Pool Claim", + "poolCommission": "Pool Commission", + "poolCreator": "As the pool creator, you will consume your pool's <b>Depositor</b> role.", + "poolCurrentlyLocked": "Pool Currently Locked", + "poolDestroy": "Pool is being destroyed and nominating is no longer possible.", + "poolInDestroyingState": "Pool in Destroying State", + "poolMembers": "Pool Members", + "poolMembersBonding": "pool members are actively bonding in pools.", + "poolMembership": "Pool Membership", + "poolName": "Pool Name", + "poolNameSupport": "Pool names support characters, symbols and emojis - be creative!", + "poolNominations": "Pool Nominations", + "poolState": "Pool State", + "poolStats": "Pool Stats", + "poolStatus": "Pool Status", + "pools": "Pools", + "poolsNominatingAnd": "Nominating and", + "projectedRewards": "Projected Rewards", + "proxy": "Proxy", + "readOnly": "Your account is read only, and cannot sign transactions.", + "recentPayouts": "Recent Payouts", + "reformatted": "Address was reformatted", + "reserve": "Reserve", + "reserveBalance": "Reserve Balance", + "reserved": "Reserved", + "rewardCalcSubtitle": "Enter a {{unit}} amount to stake and calculate the potential rewards.", + "rewardCalculator": "Reward Calculator", + "rewardsCalculator": "Rewards Calculator", + "roles": "Roles", + "root": "Root", + "save": "Save", + "setNewController": "Set New Controller", + "slashed": "Slashed", + "stakePlaceholder": "e.g. 100", + "stakedBalance": "Staked Balance", + "stakingApiDisabled": "Staking API Disabled", + "start": "Start", + "startNominating": "Start Nominating", + "status": "Nominator Status", + "stop": "Stop", + "stopNominating": "To continue with pool closure, stop nominating.", + "subscanDisabled": "Subscan Disabled", + "summary": "Summary", + "supplyStaked": "Supply Staked", + "syncing": "Syncing", + "syncingStatus": "Syncing Status", + "totalBonded": "Total Bonded", + "totalNominators": "Total Nominators", + "totalNumAccounts": "The total number of accounts that have joined a pool.", + "totalPayoutsAnalysed": "Total Payouts Analysed", + "totalSupplyStaked": "Total Supply Staked", + "totalValidators": "Total Validators", + "unbond": "Unbond", + "unbondFunds": "Unbond Funds", + "unbondYourFunds": "You can now unbond your funds.", + "unclaimedRewards": "Unclaimed Rewards", + "unitAmount": "{{unit}} Amount", + "unitSupplyStaked": "{{unit}} Supply Staked", + "unlocked": "Unlocked", + "unlocking": "Unlocking", + "unstake": "Unstake", + "unstakePromptInProgress_fast": "Fast Unstake in Progress", + "unstakePromptInProgress_regular": "Unstake in Progress", + "unstakePromptInQueue": "You are in the fast unstake queue. You will not be able to carry out any nominator tasks while you are registered for fast unstake.", + "unstakePromptReadyToWithdraw": "Your bonded funds are now unlocked and ready to withdraw.", + "unstakePromptRevert": "If you no longer wish to unstake, rebond your {{unit}} and start nominating again.", + "unstakePromptWaitingForUnlocks": "Waiting for unlocks to become available to withdraw.", + "update": "Update", + "updateReserve": "Update Reserve", + "useCustomAmount": "Use Custom Amount", + "validatorCount_one": "{{count}} Validator", + "validatorCount_other": "{{count}} Validators", + "validator_one": "{{count}} Validator", + "validator_other": "{{count}} Validators", + "validators": "Validators", + "waitingForActiveNominations": "Waiting for Active Nominations", + "website": "Website", + "withdraw": "Withdraw", + "withdrawFunds": "Withdraw Funds", + "withdrawUnlock": "Withdraw your unlock chunk to proceed with pool closure." } } diff --git a/packages/locales/src/resources/es/library.json b/packages/locales/src/resources/es/app.json similarity index 86% rename from packages/locales/src/resources/es/library.json rename to packages/locales/src/resources/es/app.json index a66352edd2..c2e549a235 100644 --- a/packages/locales/src/resources/es/library.json +++ b/packages/locales/src/resources/es/app.json @@ -1,5 +1,5 @@ { - "library": { + "app": { "100Commission": "100% de comisión", "accountConnected": "Cuenta Conectada", "accounts": "Cuentas", @@ -49,6 +49,7 @@ "clear": "Limpiar", "clearSelection": "limpiar selección", "clickToReload": "Haz clic para recargar", + "community": "Comunidad", "complete": "Completar", "confirm": "Confirmar", "confirmReformat": "La dirección fue reformateada. Por favor confirma", @@ -63,10 +64,12 @@ "copyAddress": "Copiar Dirección", "copyPoolAddress": "Copiar la dirección del pool {{type}}", "createPool": "Crear Pool", + "date": "Fecha", "dayAverage": "Promedio Diario", "dayPerformance": "Rendimiento Diario", "dayPerformanceStanding": "Rendimiento de validadores activos de {{count}} días", "dayPoolPerformance": "Rendimiento Diario del Pool", + "decentralization": "Descentralización", "destroying": "Destruyendo", "destroyingPools": "Destruyendo Pools", "deviceVerified": "Dispositivo verificad", @@ -75,6 +78,7 @@ "displayingValidators_one": "Mostrando {{count}} Validador", "displayingValidators_other": "Mostrando {{count}} Validadores", "done": "Hecho", + "email": "Correo", "enablePermissionlessClaiming": "Habilitar reclamación sin permisos", "era": "Era", "eraPoints": "Puntos de la Era", @@ -98,7 +102,9 @@ "free": "Libre", "fromFavorites": "Desde Favoritos", "fromFavoritesSubtitle": "Obtén un conjunto de tus validadores favoritos.", + "goTo": "Ir a", "graphInactive": "Inactivo", + "help": "Ayuda", "highCommission": "Alta Comisión", "highPerformanceValidator": "Validador de Alto Rendimiento", "iHaveScanned": "He escaneado", @@ -126,6 +132,7 @@ "minimumBond": "Se requiere un vínculo mínimo de {{minBondUnit}} {{unit}}", "missingIdentity": "Identidad faltante", "moreThanBalance": "El monto vinculado supera tu saldo libre.", + "network": "Red", "next": "Siguiente", "noFilters": "Sin filtros", "noFree": "No tienes {{unit}} libre para vincular", @@ -149,25 +156,54 @@ "notNominating": "Sin Nominar", "notStaking": "Sin Staking", "notValidAddress": "Dirección no válida", + "offline": "La conexión parece estar desconectada", "optimalSelection": "Selección Óptima", "optimalSelectionSubtitle": "Selecciona validadores de alto rendimiento y regularmente activos.", "order": "Ordenar", "orderValidators": "Ordenar Validadores", + "overview": "Resumen", "page": "Página {{page}} de {{total}}", + "payee": { + "account": { + "subtitle": "Enviar pagos a otra cuenta como saldo disponible.", + "title": "A Otra Cuenta" + }, + "none": { + "subtitle": "No tiene configurado ningún destino de pago.", + "title_active": "No Asignado", + "title_default": "Ninguno" + }, + "staked": { + "subtitle": "Agregar pagos automáticamente a su saldo apostado existente.", + "title_active": "Capitalización", + "title_default": "Capitalizar" + }, + "stash": { + "subtitle": "Los pagos se envían a su cuenta como saldo disponible.", + "title": "A Su Cuenta" + } + }, "payout": "Pago", "payoutAccount": "Cuenta de Pago", "payoutAddress": "Dirección de Pago", + "payouts": "Pagos", "pending": "Pendiente", "performance": "Rendimiento", "permissioned": "Con permiso", "permissionedSubtitle": "Solo tú puedes reclamar recompensas.", "permissionlessClaimingTurnedOff": "La reclamación sin permisos está desactivada.", + "plugin": { + "polkawatch": "Polkawatch", + "staking_api": "Staking API", + "subscan": "Subscan" + }, "points": "Puntos", "pool": "Pool", "poolClaim": "Reclamación del Pool", "poolCommission": "Comisión del Pool", "poolId": "ID del Pool", "poolMembers": "Miembros del Pool", + "pools": "Pools", "prev": "Anterior", "privacy": "Privacidad", "proxy": "Proxy", @@ -178,8 +214,10 @@ "remove": "Eliminar", "removeSelected": "Eliminar Seleccionados", "reset": "Reiniciar", + "resources": "Recursos", "revertedToActiveSelection": "Las nominaciones se han revertido a tu selección activa.", "rewardHistory": "Historial de Recompensas", + "rewards": "Recompensas", "scanPolkadotVault": "Escanear en Polkadot Vault", "search": "Buscar ID del Pool, Nombre o Dirección", "searchAddress": "Buscar Dirección o Identidad", @@ -190,10 +228,27 @@ "signedByProxy": "Firmado por Proxy", "signer": "Firmante", "signing": "Firmando", + "stake": "Stakear", "submitTransaction": "Listo para enviar la Transacción.", + "support": "Soporte", "syncing": "Sincronizando", "syncingPoolData": "Encontrando Pools para Unirse", "syncingPoolList": "Sincronizando lista de Pools", + "time": { + "day_one": "día", + "day_other": "días", + "hour_one": "hora", + "hour_other": "horas", + "hr_one": "hr", + "hr_other": "hrs", + "min_one": "min", + "min_other": "mins", + "minute_one": "minuto", + "minute_other": "minutos", + "second_one": "segundo", + "second_other": "segundos" + }, + "title": "Polkadot Staking Dashboard", "tooSmall": "El monto vinculado es demasiado pequeño.", "top": "Top", "transactionCancelled": "La transacción fue cancelada", @@ -212,6 +267,7 @@ "validatingParachainBlocks": "Validando Bloques de Parachain", "validatorCommission": "Comisión del validador", "validatorPerformance": "{{count}} Días de Rendimiento del Validador", + "validators": "Validadores", "valueTooSmall": "El valor es demasiado pequeño", "viewDecentralization": "Ver Descentralización", "viewPoolNominations": "Ver Nominaciones del Pool", diff --git a/packages/locales/src/resources/es/base.json b/packages/locales/src/resources/es/base.json deleted file mode 100644 index 85a3af36b0..0000000000 --- a/packages/locales/src/resources/es/base.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "base": { - "active": "Activo", - "community": "Comunidad", - "date": "Fecha", - "decentralization": "Descentralización", - "email": "Correo", - "goTo": "Ir a", - "help": "Ayuda", - "inactive": "Inactivo", - "network": "Red", - "nominate": "Nominar", - "offline": "La conexión parece estar desconectada", - "overview": "Resumen", - "payee": { - "account": { - "subtitle": "Enviar pagos a otra cuenta como saldo disponible.", - "title": "A Otra Cuenta" - }, - "none": { - "subtitle": "No tiene configurado ningún destino de pago.", - "title_active": "No Asignado", - "title_default": "Ninguno" - }, - "staked": { - "subtitle": "Agregar pagos automáticamente a su saldo apostado existente.", - "title_active": "Capitalización", - "title_default": "Capitalizar" - }, - "stash": { - "subtitle": "Los pagos se envían a su cuenta como saldo disponible.", - "title": "A Su Cuenta" - } - }, - "payouts": "Pagos", - "plugin": { - "polkawatch": "Polkawatch", - "staking_api": "Staking API", - "subscan": "Subscan" - }, - "pools": "Pools", - "resources": "Recursos", - "rewards": "Recompensas", - "stake": "Stakear", - "support": "Soporte", - "time": { - "day_one": "día", - "day_other": "días", - "hour_one": "hora", - "hour_other": "horas", - "hr_one": "hr", - "hr_other": "hrs", - "min_one": "min", - "min_other": "mins", - "minute_one": "minuto", - "minute_other": "minutos", - "second_one": "segundo", - "second_other": "segundos" - }, - "title": "Polkadot Staking Dashboard", - "validators": "Validadores" - } -} diff --git a/packages/locales/src/resources/es/pages.json b/packages/locales/src/resources/es/pages.json index 9594d30d0a..a004a68a86 100644 --- a/packages/locales/src/resources/es/pages.json +++ b/packages/locales/src/resources/es/pages.json @@ -1,270 +1,220 @@ { "pages": { - "common": { "stakingApiDisabled": "API de Staking Desactivada" }, - "community": { - "bio": "Bio", - "connecting": "Conectando", - "email": "Correo electrónico", - "fetchingValidators": "Obteniendo validadores", - "goBack": "Volver", - "noValidators": "Esta entidad no contiene validadores.", - "validator_one": "{{count}} Validador", - "validator_other": "{{count}} Validadores", - "website": "Sitio Web" - }, - "decentralization": { - "analyticsNotAvailable": "Análisis no disponible", - "analyticsNotSupported": "Análisis no soportado", - "byRegionCountryNetwork": "por Región, País y Red", - "decentralizationPerNomination": "Geolocalización Por Nominación", - "howDecentralizedIsYourNomination": "¿Qué tan descentralizada está tu nominación?", - "maxDaysAnalyzed": "Máximo de días analizados", - "maxErasAnalyzed": "Máximo de eras analizadas", - "nominationShareInRewards": "Reparto de las recompensas", - "payoutDistribution": "Distribución de pagos", - "polkawatchDisabled": "Polkawatch desactivado", - "totalPayoutsAnalysed": "Total de Pagos Analizados" - }, - "nominate": { - "activeNominations": "Nominaciones Activas", - "addressCopied": "Dirección Copiada", - "alreadyInPool": "No se puede nominar: Ya estás en un Pool", - "automaticallyBonded": "Vincular automáticamente los pagos a tu saldo actual en staking.", - "back": "Atrás", - "bond": "Vincular", - "bondAmount": "Cantidad a vincular", - "bondedFunds": "Fondos Vinculados", - "cancel": "Cancelar", - "change": "Cambiar", - "controllerAccount": "Cuenta controladora", - "controllerNotImported": "No has importado tu cuenta controladora. Si has perdido acceso a tu cuenta controladora, establece una nueva ahora. De lo contrario, importa la controladora en una de tus extensiones activas.", - "earningRewards": "Ganando Recompensas", - "fullCommissionValidatorSubtitle": "No recibirás recompensas de staking de validadores que cobran 100% de comisión. Considera actualizar tus nominaciones.", - "fullCommissionValidatorTitle": "Tienes una nominación con 100% de comisión", - "inactiveNominations": "Nominaciones inactivas", - "manage": "Gestionar", - "minimumToEarnRewards": "Mínimo para ganar recompensas", - "minimumToNominate": "Mínimo para nominar", - "noNominationsSet": "Inactivo: Sin nominaciones establecidas", - "nominate": "Nominar", - "nominating": "Nominando", - "nominatingAnd": "Nominando y", - "nominations": "Nominaciones", - "none": "Ninguno", - "notAssigned": "No asignado", - "notEarningRewards": "No ganando recompensas", - "notNominating": "No nominando", - "payoutDestination": "Destino de Pago", - "payoutDestinationSubtitle": "Elige cómo se recibirán los pagos. Los pagos pueden ser compuestos o enviados a una cuenta como saldo libre.", - "pendingPayouts": "Pagos Pendientes", - "poolDestroy": "El Pool está siendo destruido y ya no es posible nominar.", - "poolNominations": "Nominaciones del Pool", - "readOnly": "Tu cuenta es de solo lectura y no puede firmar transacciones.", - "setNewController": "Establecer nueva controladora", - "startNominating": "Comenzar a nominar", - "status": "Estado del Nominador", - "stop": "Detener", - "summary": "Resumen", - "syncing": "Sincronizando", - "totalSupplyStaked": "Suministro total en staking", - "unlocked": "Descomprometido", - "unstake": "Hacer Unstake", - "unstakePromptInProgress_fast": "Desvinculación rápida en progreso", - "unstakePromptInProgress_regular": "Desvinculación en progreso", - "unstakePromptInQueue": "Estás en la fila de desvinculación rápida. No podrás realizar ninguna tarea de nominador mientras estés registrado para desvinculación rápida.", - "unstakePromptReadyToWithdraw": "Tus fondos vinculados ahora están descomprometidos y listos para retirar", - "unstakePromptRevert": "Si ya no deseas desvincular, vuelve a vincular tu {{unit}} y comienza a nominar de nuevo.", - "unstakePromptWaitingForUnlocks": "Esperando que los descompromisos estén disponibles para retirar", - "update": "Actualizar", - "validator_one": "{{count}} Validador", - "validator_other": "{{count}} Validadores", - "waitingForActiveNominations": "Esperando nominaciones activas" - }, - "overview": { - "activeEra": "Era Activa", - "activeNominators": "Nominadores Activos", - "activePools": "Pools Activos", - "addressCopied": "Dirección Copiada", - "afterCommission": "después de comisión", - "available": "Disponible", - "averageRewardRate": "Tasa Promedio de Recompensa", - "balance": "Balance", - "bondedInPools": "El total de {{networkUnit}} actualmente vinculado en Pools de nominación.", - "connect": "Conectar", - "free": "Disponible", - "inPool": "En un Pool", - "inPools": "está actualmente vinculado en Pools.", - "latestInflationRate": "Tasa de inflación de Staker", - "locked": "Comprometido", - "manage": "Gestionar", - "memberOf": "Miembro de", - "moreResources": "Más Recursos", - "networkCurrentlyStaked": "{{total}} {{unit}} está actualmente en staking en {{network}}.", - "networkCurrentlyStakedSubtitle": "El total de {{unit}} actualmente en staking entre todos los validadores y nominadores.", - "networkStats": "Estadísticas de Red", - "nextRewardDistribution": "Siguiente Distribución de Recompensas", - "noActiveAccount": "Sin cuenta activa", - "nominating": "Nominando", - "notStaking": "Sin Hacer Staking", - "overview": "Resumen", - "paidOutLastEraSubtitle": "Importe total pagado como recompensa en la última era a los stakers.", - "paidOutLastEraTitle": "se pagó en la última era.", - "pool": "Pool", - "poolMembersBonding": "miembros de Pools están vinculando activamente en Pools.", - "proxy": "Proxy", - "recentPayouts": "Pagos Recientes", - "reserve": "Reserva", - "reserveBalance": "Saldo de Reserva", - "reserved": "Reservado", - "start": "Comenzar", - "subscanDisabled": "Subscan Desactivado", - "supplyStaked": "Suministro en Staking", - "syncingStatus": "Estado de Sincronización", - "totalNominators": "Total de Nominadores", - "totalNumAccounts": "El número total de cuentas que se han unido a un Pool.", - "totalValidators": "Total de Validadores", - "unitSupplyStaked": "{{unit}} en suministro staking", - "unlocking": "Desvinculando", - "updateReserve": "Actualizar Reserva" - }, - "payouts": { - "deductedFromBond": "Deducido de la Vinculación", - "fromPool": "Del Pool", - "lastEraPayout": "Último Pago de Era", - "noRecentPayouts": "Sin Pagos Recientes", - "none": "Ninguno", - "notStaking": "Sin Hacer Staking", - "payout": "Pago", - "payoutHistory": "Historial de Pagos", - "poolClaim": "Reclamo del Pool", - "recentPayouts": "Pagos Recientes", - "slashed": "Penalizado", - "subscanDisabled": "Subscan Desactivado" - }, - "pools": { - "activePools": "Pools Activos", - "address": "Dirección", - "addressCopied": "Dirección copiada", - "addressInvalid": "Dirección inválida", - "allPools": "Todos los Pools", - "alreadyNominating": "No se puede unir al Pool: Ya estás nominando", - "assigned": "Asignado", - "assignedToAnyAccount": "Tus roles de <b>Root</b>, <b>Nominator</b> y <b>Bouncer</b> pueden ser asignados a cualquier cuenta.", - "availableToClaim": "La cantidad pendiente de {{unit}} disponible para reclamar por miembros del Pool.", - "back": "Atrás", - "beenClaimed": "en recompensas han sido reclamados", - "beenClaimedBy": "La cantidad total de {{unit}} que ha sido reclamada por miembros del Pool.", - "bond": "Vincular", - "bondAmount": "Cantidad a vincular", - "bondedFunds": "Fondos Vinculados", - "bouncer": "Bouncer", - "browseMembers": "Explorar Miembros", - "browsePools": "Explorar Pools", - "cancel": "Cancelar", - "closePool": "Ahora puedes retirar y cerrar el Pool.", - "compound": "Componer", - "createAPool": "Crear un Pool", - "createPool": "Crear Pool", - "depositor": "Depositante", - "destroyPool": "Destruir Pool", - "destroying": "Destruyendo", - "earningRewards": "Ganando Recompensas", - "edit": "Editar", - "favorites": "Favoritos", - "fetchingFavoritePools": "Obteniendo Pools favoritos", - "fetchingMemberList": "Obteniendo lista de miembros", - "generateNominations": "Generar nominaciones", - "inPool": "En Pool", - "inactivePoolNotNominating": "Inactivo: Pool no está nominando", - "joinPool": "Unirse al Pool", - "joinPoolHeading": "Únete a {{totalMembers}} miembros del Pool haciendo staking de un total de {{totalPoolPoints}} {{unit}} en {{network}}.", - "leave": "Salir", - "leavingPool": "Saliendo del Pool", - "leftThePool": "Todos los miembros han abandonado el Pool", - "locked": "Comprometido", - "manage": "Gestionar", - "managementOptions": "para seleccionar opciones de gestión.", - "memberOfPool": "Miembro del Pool", - "members": "Miembros", - "minimumToCreatePool": "Mínimo para Crear Pool", - "minimumToJoinPool": "Mínimo para Unirse al Pool", - "noFavorites": "Sin favoritos.", - "nominate": "Nominar", - "nominating": "Nominando", - "nominatingAnd": "Nominando y", - "nominator": "Nominador", - "notEarningRewards": "Sin ganar recompensas", - "notInPool": "No en Pool", - "notSet": "No establecido", - "open": "Abierto", - "outstandingReward": "saldo de recompensa pendiente.", - "overview": "Resumen", - "ownerOfPool": "Propietario del Pool", - "permissionToUnbond": "Tienes permiso para desvincular y retirar fondos de cualquier miembro del Pool. Usa el menú de un miembro", - "poolCommission": "Comisión del Pool", - "poolCreator": "Como creador del Pool, consumirás el rol de <b>Depositor</b> de tu Pool.", - "poolCurrentlyLocked": "Pool actualmente comprometido", - "poolInDestroyingState": "Pool en estado de destrucción", - "poolMembers": "Miembros del Pool", - "poolMembership": "Membresía del Pool", - "poolName": "Nombre del Pool", - "poolNameSupport": "Los nombres de Pool admiten caracteres, símbolos y emojis - ¡Sé creativo!", - "poolState": "Estado del Pool", - "poolStats": "Estadísticas del Pool", - "poolStatus": "Estado del Pool", - "pools": "Pools", - "readOnly": "Tu cuenta es de solo lectura y no puede firmar transacciones.", - "reformatted": "La dirección fue reformateada", - "roles": "Roles", - "root": "Root", - "save": "Guardar", - "stopNominating": "Para continuar con el cierre del Pool, detén la nominación.", - "summary": "Resumen", - "totalBonded": "Total vinculado", - "unbond": "Desvincular", - "unbondFunds": "Desvincular fondos", - "unbondYourFunds": "Ahora puedes desvincular tus fondos", - "unclaimedRewards": "Recompensas sin Reclamar", - "unlocked": "Descomprometido", - "validator_one": "{{count}} Validador", - "validator_other": "{{count}} Validadores", - "waitingForActiveNominations": "Esperando nominaciones activas", - "withdraw": "Retirar", - "withdrawFunds": "Retirar fondos", - "withdrawUnlock": "Retira tu fragmento de desvinculación para proceder con el cierre del Pool." - }, - "rewards": { - "adjustStake": "Ajustar tu Stake", - "annual": "Anual", - "averageRewardRate": "Tasa de Recompensa", - "calculator": "Calculadora", - "daily": "Diario", - "deductAvgCommissionOf": "Deducir la comisión promedio de {{commission}}%", - "last30DayReward": "Recompensa de los últimos 30 días", - "monthly": "Mensual", - "period": "Período", - "projectedRewards": "Recompensas Proyectadas", - "rewardCalcSubtitle": "Ingrese una cantidad de {{unit}} para apostar y calcule las recompensas potenciales.", - "rewardCalculator": "Calculadora de Recompensas", - "rewardsCalculator": "Calculadora de Recompensas", - "stakePlaceholder": "ej. 100", - "stakedBalance": "Balance en Staking", - "unitAmount": "{{unit}} Cantidad", - "useCustomAmount": "Usar Cantidad Personalizada" - }, - "validators": { - "activeValidators": "Validadores Activos", - "allValidators": "Todos los Validadores", - "averageCommission": "Comisión Promedio", - "connecting": "Conectando", - "favoriteValidators": "Validadores Favoritos", - "favorites": "Favoritos", - "fetchingFavoriteValidators": "Obteniendo Validadores Favoritos", - "fetchingValidators": "Obteniendo Validadores", - "networkValidators": "Validadores de la Red", - "noFavorites": "Sin favoritos.", - "totalValidators": "Total de Validadores", - "validators": "Validadores" - } + "activeEra": "Era Activa", + "activeNominations": "Nominaciones Activas", + "activeNominators": "Nominadores Activos", + "activePools": "Pools Activos", + "activeValidators": "Validadores Activos", + "address": "Dirección", + "addressCopied": "Dirección Copiada", + "addressInvalid": "Dirección inválida", + "adjustStake": "Ajustar tu Stake", + "afterCommission": "después de comisión", + "allPools": "Todos los Pools", + "allValidators": "Todos los Validadores", + "alreadyInPool": "No se puede nominar: Ya estás en un Pool", + "alreadyNominating": "No se puede unir al Pool: Ya estás nominando", + "analyticsNotAvailable": "Análisis no disponible", + "analyticsNotSupported": "Análisis no soportado", + "annual": "Anual", + "assigned": "Asignado", + "assignedToAnyAccount": "Tus roles de <b>Root</b>, <b>Nominator</b> y <b>Bouncer</b> pueden ser asignados a cualquier cuenta.", + "automaticallyBonded": "Vincular automáticamente los pagos a tu saldo actual en staking.", + "available": "Disponible", + "availableToClaim": "La cantidad pendiente de {{unit}} disponible para reclamar por miembros del Pool.", + "averageCommission": "Comisión Promedio", + "averageRewardRate": "Tasa Promedio de Recompensa", + "back": "Atrás", + "balance": "Balance", + "beenClaimed": "en recompensas han sido reclamados", + "beenClaimedBy": "La cantidad total de {{unit}} que ha sido reclamada por miembros del Pool.", + "bio": "Bio", + "bond": "Vincular", + "bondAmount": "Cantidad a vincular", + "bondedFunds": "Fondos Vinculados", + "bondedInPools": "El total de {{networkUnit}} actualmente vinculado en Pools de nominación.", + "bouncer": "Bouncer", + "browseMembers": "Explorar Miembros", + "browsePools": "Explorar Pools", + "byRegionCountryNetwork": "por Región, País y Red", + "calculator": "Calculadora", + "cancel": "Cancelar", + "change": "Cambiar", + "closePool": "Ahora puedes retirar y cerrar el Pool.", + "compound": "Componer", + "connect": "Conectar", + "connecting": "Conectando", + "controllerAccount": "Cuenta controladora", + "controllerNotImported": "No has importado tu cuenta controladora. Si has perdido acceso a tu cuenta controladora, establece una nueva ahora. De lo contrario, importa la controladora en una de tus extensiones activas.", + "createAPool": "Crear un Pool", + "createPool": "Crear Pool", + "daily": "Diario", + "decentralizationPerNomination": "Geolocalización Por Nominación", + "deductAvgCommissionOf": "Deducir la comisión promedio de {{commission}}%", + "deductedFromBond": "Deducido de la Vinculación", + "depositor": "Depositante", + "destroyPool": "Destruir Pool", + "destroying": "Destruyendo", + "earningRewards": "Ganando Recompensas", + "edit": "Editar", + "email": "Correo electrónico", + "favoriteValidators": "Validadores Favoritos", + "favorites": "Favoritos", + "fetchingFavoritePools": "Obteniendo Pools favoritos", + "fetchingFavoriteValidators": "Obteniendo Validadores Favoritos", + "fetchingMemberList": "Obteniendo lista de miembros", + "fetchingValidators": "Obteniendo validadores", + "free": "Disponible", + "fromPool": "Del Pool", + "fullCommissionValidatorSubtitle": "No recibirás recompensas de staking de validadores que cobran 100% de comisión. Considera actualizar tus nominaciones.", + "fullCommissionValidatorTitle": "Tienes una nominación con 100% de comisión", + "generateNominations": "Generar nominaciones", + "goBack": "Volver", + "howDecentralizedIsYourNomination": "¿Qué tan descentralizada está tu nominación?", + "inPool": "En un Pool", + "inPools": "está actualmente vinculado en Pools.", + "inactiveNominations": "Nominaciones inactivas", + "inactivePoolNotNominating": "Inactivo: Pool no está nominando", + "joinPool": "Unirse al Pool", + "joinPoolHeading": "Únete a {{totalMembers}} miembros del Pool haciendo staking de un total de {{totalPoolPoints}} {{unit}} en {{network}}.", + "last30DayReward": "Recompensa de los últimos 30 días", + "lastEraPayout": "Último Pago de Era", + "latestInflationRate": "Tasa de inflación de Staker", + "leave": "Salir", + "leavingPool": "Saliendo del Pool", + "leftThePool": "Todos los miembros han abandonado el Pool", + "locked": "Comprometido", + "manage": "Gestionar", + "managementOptions": "para seleccionar opciones de gestión.", + "maxDaysAnalyzed": "Máximo de días analizados", + "maxErasAnalyzed": "Máximo de eras analizadas", + "memberOf": "Miembro de", + "memberOfPool": "Miembro del Pool", + "members": "Miembros", + "minimumToCreatePool": "Mínimo para Crear Pool", + "minimumToEarnRewards": "Mínimo para ganar recompensas", + "minimumToJoinPool": "Mínimo para Unirse al Pool", + "minimumToNominate": "Mínimo para nominar", + "monthly": "Mensual", + "moreResources": "Más Recursos", + "networkCurrentlyStaked": "{{total}} {{unit}} está actualmente en staking en {{network}}.", + "networkCurrentlyStakedSubtitle": "El total de {{unit}} actualmente en staking entre todos los validadores y nominadores.", + "networkStats": "Estadísticas de Red", + "networkValidators": "Validadores de la Red", + "nextRewardDistribution": "Siguiente Distribución de Recompensas", + "noActiveAccount": "Sin cuenta activa", + "noFavorites": "Sin favoritos.", + "noNominationsSet": "Inactivo: Sin nominaciones establecidas", + "noRecentPayouts": "Sin Pagos Recientes", + "noValidators": "Esta entidad no contiene validadores.", + "nominate": "Nominar", + "nominating": "Nominando", + "nominatingAnd": "Nominando y", + "nominationShareInRewards": "Reparto de las recompensas", + "nominations": "Nominaciones", + "nominator": "Nominador", + "none": "Ninguno", + "notAssigned": "No asignado", + "notEarningRewards": "No ganando recompensas", + "notInPool": "No en Pool", + "notNominating": "No nominando", + "notSet": "No establecido", + "notStaking": "Sin Hacer Staking", + "open": "Abierto", + "outstandingReward": "saldo de recompensa pendiente.", + "overview": "Resumen", + "ownerOfPool": "Propietario del Pool", + "paidOutLastEraSubtitle": "Importe total pagado como recompensa en la última era a los stakers.", + "paidOutLastEraTitle": "se pagó en la última era.", + "payout": "Pago", + "payoutDestination": "Destino de Pago", + "payoutDestinationSubtitle": "Elige cómo se recibirán los pagos. Los pagos pueden ser compuestos o enviados a una cuenta como saldo libre.", + "payoutDistribution": "Distribución de pagos", + "payoutHistory": "Historial de Pagos", + "pendingPayouts": "Pagos Pendientes", + "period": "Período", + "permissionToUnbond": "Tienes permiso para desvincular y retirar fondos de cualquier miembro del Pool. Usa el menú de un miembro", + "polkawatchDisabled": "Polkawatch desactivado", + "pool": "Pool", + "poolClaim": "Reclamo del Pool", + "poolCommission": "Comisión del Pool", + "poolCreator": "Como creador del Pool, consumirás el rol de <b>Depositor</b> de tu Pool.", + "poolCurrentlyLocked": "Pool actualmente comprometido", + "poolDestroy": "El Pool está siendo destruido y ya no es posible nominar.", + "poolInDestroyingState": "Pool en estado de destrucción", + "poolMembers": "Miembros del Pool", + "poolMembersBonding": "miembros de Pools están vinculando activamente en Pools.", + "poolMembership": "Membresía del Pool", + "poolName": "Nombre del Pool", + "poolNameSupport": "Los nombres de Pool admiten caracteres, símbolos y emojis - ¡Sé creativo!", + "poolNominations": "Nominaciones del Pool", + "poolState": "Estado del Pool", + "poolStats": "Estadísticas del Pool", + "poolStatus": "Estado del Pool", + "pools": "Pools", + "poolsNominatingAnd": "Nominando y", + "projectedRewards": "Recompensas Proyectadas", + "proxy": "Proxy", + "readOnly": "Tu cuenta es de solo lectura y no puede firmar transacciones.", + "recentPayouts": "Pagos Recientes", + "reformatted": "La dirección fue reformateada", + "reserve": "Reserva", + "reserveBalance": "Saldo de Reserva", + "reserved": "Reservado", + "rewardCalcSubtitle": "Ingrese una cantidad de {{unit}} para apostar y calcule las recompensas potenciales.", + "rewardCalculator": "Calculadora de Recompensas", + "rewardsCalculator": "Calculadora de Recompensas", + "roles": "Roles", + "root": "Root", + "save": "Guardar", + "setNewController": "Establecer nueva controladora", + "slashed": "Penalizado", + "stakePlaceholder": "ej. 100", + "stakedBalance": "Balance en Staking", + "stakingApiDisabled": "API de Staking Desactivada", + "start": "Comenzar", + "startNominating": "Comenzar a nominar", + "status": "Estado del Nominador", + "stop": "Detener", + "stopNominating": "Para continuar con el cierre del Pool, detén la nominación.", + "subscanDisabled": "Subscan Desactivado", + "summary": "Resumen", + "supplyStaked": "Suministro en Staking", + "syncing": "Sincronizando", + "syncingStatus": "Estado de Sincronización", + "totalBonded": "Total vinculado", + "totalNominators": "Total de Nominadores", + "totalNumAccounts": "El número total de cuentas que se han unido a un Pool.", + "totalPayoutsAnalysed": "Total de Pagos Analizados", + "totalSupplyStaked": "Suministro total en staking", + "totalValidators": "Total de Validadores", + "unbond": "Desvincular", + "unbondFunds": "Desvincular fondos", + "unbondYourFunds": "Ahora puedes desvincular tus fondos", + "unclaimedRewards": "Recompensas sin Reclamar", + "unitAmount": "{{unit}} Cantidad", + "unitSupplyStaked": "{{unit}} en suministro staking", + "unlocked": "Descomprometido", + "unlocking": "Desvinculando", + "unstake": "Hacer Unstake", + "unstakePromptInProgress_fast": "Desvinculación rápida en progreso", + "unstakePromptInProgress_regular": "Desvinculación en progreso", + "unstakePromptInQueue": "Estás en la fila de desvinculación rápida. No podrás realizar ninguna tarea de nominador mientras estés registrado para desvinculación rápida.", + "unstakePromptReadyToWithdraw": "Tus fondos vinculados ahora están descomprometidos y listos para retirar", + "unstakePromptRevert": "Si ya no deseas desvincular, vuelve a vincular tu {{unit}} y comienza a nominar de nuevo.", + "unstakePromptWaitingForUnlocks": "Esperando que los descompromisos estén disponibles para retirar", + "update": "Actualizar", + "updateReserve": "Actualizar Reserva", + "useCustomAmount": "Usar Cantidad Personalizada", + "validatorCount_one": "{{count}} Validador", + "validatorCount_other": "{{count}} Validadores", + "validator_one": "{{count}} Validador", + "validator_other": "{{count}} Validadores", + "validators": "Validadores", + "waitingForActiveNominations": "Esperando nominaciones activas", + "website": "Sitio Web", + "withdraw": "Retirar", + "withdrawFunds": "Retirar fondos", + "withdrawUnlock": "Retira tu fragmento de desvinculación para proceder con el cierre del Pool." } } diff --git a/packages/locales/src/util.ts b/packages/locales/src/util.ts index 9e22928c3d..dba5b0d7b4 100644 --- a/packages/locales/src/util.ts +++ b/packages/locales/src/util.ts @@ -58,7 +58,7 @@ export const getResources = (lng: string, i18n?: i18n) => { JSON.stringify({ l: lng, r: fallbackResources }) ) // Add language to i18n if it does not exist. - if (i18n && !i18n.hasResourceBundle(lng, 'base')) { + if (i18n && !i18n.hasResourceBundle(lng, 'app')) { addI18nresources(i18n, lng, fallbackResources) } } else { diff --git a/packages/styles/theme/index.scss b/packages/styles/theme/index.scss index 6a8f29f1f4..06a37639cb 100644 --- a/packages/styles/theme/index.scss +++ b/packages/styles/theme/index.scss @@ -143,7 +143,7 @@ label { .container-width { max-width: $max-page-width-sm; - @media(min-width: $row-section-thirds-threshold) { + @media (min-width: $row-section-thirds-threshold) { max-width: $max-page-width-lg; } } diff --git a/packages/ui-buttons/src/ButtonCopy/index.module.scss b/packages/ui-buttons/src/ButtonCopy/index.module.scss index 5ae7eef683..bd48c144cb 100644 --- a/packages/ui-buttons/src/ButtonCopy/index.module.scss +++ b/packages/ui-buttons/src/ButtonCopy/index.module.scss @@ -4,7 +4,7 @@ .btnCopy { position: relative; display: inline-block; - font-size: inherit; + font-size: inherit; width: inherit; height: inherit; @@ -12,8 +12,8 @@ margin-left: 0.4rem; margin-right: 0.4rem; } - - > .copyIcon { + + > .copyIcon { position: absolute; top: 0; right: 0; @@ -21,7 +21,7 @@ width: 100%; height: 100%; font-size: inherit; - + &.active { animation: fadeOutIn 2s ease-in-out 1; } @@ -42,7 +42,7 @@ right: 0; display: inline-block; width: 100%; - height: 100%;; + height: 100%; font-size: inherit; opacity: 0; @@ -55,7 +55,7 @@ right: 0; width: inherit; height: auto; - } + } } &.inheritSize { @@ -73,7 +73,6 @@ } } - /* Copy icon fade out followed by fade in */ @keyframes fadeOutIn { 0% { @@ -114,4 +113,3 @@ } } } - diff --git a/packages/ui-buttons/src/ButtonText/index.module.scss b/packages/ui-buttons/src/ButtonText/index.module.scss index b6e5f35830..543e1fc94a 100644 --- a/packages/ui-buttons/src/ButtonText/index.module.scss +++ b/packages/ui-buttons/src/ButtonText/index.module.scss @@ -9,6 +9,6 @@ font-size: var(--button-sm-font-size); padding: var(--button-sm-padding); padding-left: 0.45rem; - padding-right: 0.45rem; + padding-right: 0.45rem; } } diff --git a/packages/ui-core/src/base/CardHeader/index.module.scss b/packages/ui-core/src/base/CardHeader/index.module.scss index b530967d96..090441fd95 100644 --- a/packages/ui-core/src/base/CardHeader/index.module.scss +++ b/packages/ui-core/src/base/CardHeader/index.module.scss @@ -15,7 +15,7 @@ align-items: center; justify-content: none; } - + &.margin { margin-bottom: 1rem; } diff --git a/packages/ui-core/src/base/Identity/index.module.scss b/packages/ui-core/src/base/Identity/index.module.scss index c6c04951f8..3a2ce4b05a 100644 --- a/packages/ui-core/src/base/Identity/index.module.scss +++ b/packages/ui-core/src/base/Identity/index.module.scss @@ -13,7 +13,7 @@ margin-top: 0.4rem; display: flex; align-items: center; - + > span { color: var(--text-color-primary); margin-left: 0.4rem; diff --git a/packages/ui-core/src/base/Page/RowSection/index.module.scss b/packages/ui-core/src/base/Page/RowSection/index.module.scss index 2ad7dc909f..29f3ba24ef 100644 --- a/packages/ui-core/src/base/Page/RowSection/index.module.scss +++ b/packages/ui-core/src/base/Page/RowSection/index.module.scss @@ -74,4 +74,4 @@ .rowSectionVLast { order: 1; -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss b/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss index 042c1a78b3..a996ddea11 100644 --- a/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss +++ b/packages/ui-core/src/base/RewardGrid/Cell/index.module.scss @@ -18,4 +18,4 @@ margin-right: 0.6rem; } } -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/RewardGrid/Head/index.module.scss b/packages/ui-core/src/base/RewardGrid/Head/index.module.scss index 30fef97a1b..901dcb0fb9 100644 --- a/packages/ui-core/src/base/RewardGrid/Head/index.module.scss +++ b/packages/ui-core/src/base/RewardGrid/Head/index.module.scss @@ -9,4 +9,4 @@ color: var(--text-color-tertiary); font-family: InterSemiBold, sans-serif; } -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/RewardGrid/Root/index.module.scss b/packages/ui-core/src/base/RewardGrid/Root/index.module.scss index 20acf0c855..462c76b0cf 100644 --- a/packages/ui-core/src/base/RewardGrid/Root/index.module.scss +++ b/packages/ui-core/src/base/RewardGrid/Root/index.module.scss @@ -4,4 +4,4 @@ .root { margin-top: 0.5rem; padding: 0 0.5rem; -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/RewardGrid/Row/index.module.scss b/packages/ui-core/src/base/RewardGrid/Row/index.module.scss index 90384892f5..37d50c862a 100644 --- a/packages/ui-core/src/base/RewardGrid/Row/index.module.scss +++ b/packages/ui-core/src/base/RewardGrid/Row/index.module.scss @@ -11,4 +11,4 @@ border-bottom: none; padding-bottom: 0.5rem; } -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/RewardGrid/common.module.scss b/packages/ui-core/src/base/RewardGrid/common.module.scss index 671f67d195..8034353708 100644 --- a/packages/ui-core/src/base/RewardGrid/common.module.scss +++ b/packages/ui-core/src/base/RewardGrid/common.module.scss @@ -3,4 +3,4 @@ .row { padding: 0.6rem 0; -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/Stat/Card/index.module.scss b/packages/ui-core/src/base/Stat/Card/index.module.scss index 0533d5e564..08cbbb3c5b 100644 --- a/packages/ui-core/src/base/Stat/Card/index.module.scss +++ b/packages/ui-core/src/base/Stat/Card/index.module.scss @@ -10,7 +10,7 @@ margin-bottom: 1rem; position: relative; transition: transform var(--transition-duration); - + &:hover { transform: scale(1.02); } @@ -24,7 +24,8 @@ max-width: 300px; } - > div, > button { + > div, + > button { background: var(--background-primary); box-shadow: var(--card-shadow-secondary); border: 1px solid transparent; diff --git a/packages/ui-core/src/base/Stat/Graphic/index.module.scss b/packages/ui-core/src/base/Stat/Graphic/index.module.scss index aaf1ea87c7..e712b32dbd 100644 --- a/packages/ui-core/src/base/Stat/Graphic/index.module.scss +++ b/packages/ui-core/src/base/Stat/Graphic/index.module.scss @@ -9,4 +9,4 @@ width: fit-content; min-width: 1.75rem; height: 100%; -} \ No newline at end of file +} diff --git a/packages/ui-core/src/base/Tooltip/index.module.scss b/packages/ui-core/src/base/Tooltip/index.module.scss index 8e1ed27865..de895f8841 100644 --- a/packages/ui-core/src/base/Tooltip/index.module.scss +++ b/packages/ui-core/src/base/Tooltip/index.module.scss @@ -2,34 +2,34 @@ // SPDX-License-Identifier: GPL-3.0-only .Content { - color: var(--text-color-invert); + color: var(--text-color-invert); background: var(--background-invert); - box-shadow: var(--card-shadow); - border-radius: 0.5rem; - padding: 0.75rem 1rem; - font-size: 1.1rem; - line-height: 1; - user-select: none; - animation-duration: 400ms; - animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); - will-change: transform, opacity; - &[data-state="delayed-open"][data-side="top"] { - animation-name: slideDownAndFade; - } + box-shadow: var(--card-shadow); + border-radius: 0.5rem; + padding: 0.75rem 1rem; + font-size: 1.1rem; + line-height: 1; + user-select: none; + animation-duration: 400ms; + animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); + will-change: transform, opacity; + &[data-state='delayed-open'][data-side='top'] { + animation-name: slideDownAndFade; + } z-index: 9; } .Arrow { - fill: var(--background-invert); + fill: var(--background-invert); } @keyframes slideDownAndFade { - from { - opacity: 0; - transform: translateY(-2px); - } - to { - opacity: 1; - transform: translateY(0); - } + from { + opacity: 0; + transform: translateY(-2px); + } + to { + opacity: 1; + transform: translateY(0); + } } diff --git a/packages/ui-core/src/canvas/AccountTitle/index.module.scss b/packages/ui-core/src/canvas/AccountTitle/index.module.scss index 851267ea9a..af9a531e64 100644 --- a/packages/ui-core/src/canvas/AccountTitle/index.module.scss +++ b/packages/ui-core/src/canvas/AccountTitle/index.module.scss @@ -9,11 +9,11 @@ flex-direction: column; margin: 2rem 0 1rem 0; padding-bottom: 0.1rem; - + > div { display: flex; flex: 1; - + > div { display: flex; flex: 1; @@ -47,7 +47,7 @@ width: 100%; } } - + > div:last-child { margin-top: var(--account-title-height); } diff --git a/packages/ui-core/src/input/TokenInput/index.module.scss b/packages/ui-core/src/input/TokenInput/index.module.scss index 1752990cbf..5a60af7781 100644 --- a/packages/ui-core/src/input/TokenInput/index.module.scss +++ b/packages/ui-core/src/input/TokenInput/index.module.scss @@ -9,10 +9,10 @@ &:focus-within label { color: var(--accent-color-primary); } - + > label { color: var(--text-color-secondary); - font-family: InterSemiBold, sans-serif; + font-family: InterSemiBold, sans-serif; &:focus { color: var(--accent-color-primary); } @@ -31,4 +31,4 @@ border-color: var(--accent-color-pending); } } -} \ No newline at end of file +} diff --git a/packages/ui-core/src/list/Identity/index.module.scss b/packages/ui-core/src/list/Identity/index.module.scss index 25b2044430..e804ca21b3 100644 --- a/packages/ui-core/src/list/Identity/index.module.scss +++ b/packages/ui-core/src/list/Identity/index.module.scss @@ -10,7 +10,7 @@ flex: 1; position: relative; - > div { + > div { &:last-child { display: flex; flex-flow: row wrap; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index c200329d4a..272049d7f0 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -24,16 +24,16 @@ export const formatTimeleft = ( ): TimeLeftFormatted => { // Create a default object containing formatted time components for days, hours, and minutes const formatted: TimeLeftFormatted = { - days: [days, t('time.day', { count: days, ns: 'base' })], - hours: [hours, t('time.hr', { count: hours, ns: 'base' })], - minutes: [minutes, t('time.min', { count: minutes, ns: 'base' })], + days: [days, t('time.day', { count: days, ns: 'app' })], + hours: [hours, t('time.hr', { count: hours, ns: 'app' })], + minutes: [minutes, t('time.min', { count: minutes, ns: 'app' })], } // If there are no days or hours but there are seconds, override with a formatted seconds object if (!days && !hours && seconds) { formatted['seconds'] = [ seconds, - t('time.second', { count: seconds, ns: 'base' }), + t('time.second', { count: seconds, ns: 'app' }), ] return formatted } @@ -56,19 +56,19 @@ export const timeleftAsString = ( let str = '' if (days > 0) { - str += `${days} ${t('time.day', { count: days, ns: 'base' })}` + str += `${days} ${t('time.day', { count: days, ns: 'app' })}` } if (hours > 0) { if (str) { str += ', ' } - str += ` ${hours} ${t(tHour, { count: hours, ns: 'base' })}` + str += ` ${hours} ${t(tHour, { count: hours, ns: 'app' })}` } if (minutes > 0) { if (str) { str += ', ' } - str += ` ${minutes} ${t(tMinute, { count: minutes, ns: 'base' })}` + str += ` ${minutes} ${t(tMinute, { count: minutes, ns: 'app' })}` } if (!days && !hours) { if (str) { From d95963fdd632bd9cfa585974b50d62d0edde36ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:52:01 +0700 Subject: [PATCH 03/18] deps: bump @lottiefiles/dotlottie-react from 0.12.3 to 0.13.0 in the lottie group (#2509) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- packages/app/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index d6432129e3..b99cca6b19 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -18,7 +18,7 @@ "@fortawesome/free-regular-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", "@ledgerhq/hw-transport-webhid": "^6.30.0", - "@lottiefiles/dotlottie-react": "^0.12.3", + "@lottiefiles/dotlottie-react": "^0.13.0", "@polkadot-api/merkleize-metadata": "^1.1.12", "@polkadot-api/signers-common": "^0.1.5", "@polkadot-api/substrate-bindings": "^0.11.0", diff --git a/yarn.lock b/yarn.lock index 978e2af05a..dffb38893d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1106,14 +1106,14 @@ __metadata: languageName: node linkType: hard -"@lottiefiles/dotlottie-react@npm:^0.12.3": - version: 0.12.3 - resolution: "@lottiefiles/dotlottie-react@npm:0.12.3" +"@lottiefiles/dotlottie-react@npm:^0.13.0": + version: 0.13.0 + resolution: "@lottiefiles/dotlottie-react@npm:0.13.0" dependencies: "@lottiefiles/dotlottie-web": "npm:0.40.1" peerDependencies: react: ^17 || ^18 || ^19 - checksum: 10c0/2b92c1af4c0c1dcc1bbab5ad11904a5ec6e2d13c3b2b67c83f3b97669a565086ef06c5dd496365790b425d57898613b0d5b8daff57c09e864e2ccb414fc7f0f8 + checksum: 10c0/f89ad899ea5b5fa171b55d8b28daf91ab96f85b0e67cc0bd6ada3935152f5c445aaf89176b1047248ae0918f250ce6a14dab8657a6da52133ec8717b03ced6ef languageName: node linkType: hard @@ -5572,7 +5572,7 @@ __metadata: "@fortawesome/free-regular-svg-icons": "npm:^6.7.2" "@fortawesome/react-fontawesome": "npm:^0.2.2" "@ledgerhq/hw-transport-webhid": "npm:^6.30.0" - "@lottiefiles/dotlottie-react": "npm:^0.12.3" + "@lottiefiles/dotlottie-react": "npm:^0.13.0" "@polkadot-api/merkleize-metadata": "npm:^1.1.12" "@polkadot-api/signers-common": "npm:^0.1.5" "@polkadot-api/substrate-bindings": "npm:^0.11.0" From 0b5ba742f5cd35db7fa4e9c5e1fdaec56ad37fb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:57:21 +0700 Subject: [PATCH 04/18] deps: bump prettier from 3.4.2 to 3.5.1 in the prettier group (#2520) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2729dc4240..f35741d97d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-unused-imports": "^4.1.4", "globals": "^15.13.0", - "prettier": "^3.4.2", + "prettier": "^3.5.1", "prettier-plugin-organize-imports": "^4.1.0", "sass": "1.77.6", "typescript": "^5.7.2", diff --git a/yarn.lock b/yarn.lock index dffb38893d..9e95e68fbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10109,7 +10109,7 @@ __metadata: framer-motion: "npm:^12.0.11" globals: "npm:^15.13.0" i18next: "npm:^24.2.2" - prettier: "npm:^3.4.2" + prettier: "npm:^3.5.1" prettier-plugin-organize-imports: "npm:^4.1.0" radix-ui: "npm:^1.1.3" react: "npm:^18.3.1" @@ -10227,12 +10227,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.4.2": - version: 3.4.2 - resolution: "prettier@npm:3.4.2" +"prettier@npm:^3.5.1": + version: 3.5.1 + resolution: "prettier@npm:3.5.1" bin: prettier: bin/prettier.cjs - checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 + checksum: 10c0/9f6f810eae455d6e4213845151a484a2338f2e0d6a8b84ee8e13a83af8a2421ef6c1e31e61e4b135671fb57b9541f6624648880cc2061ac803e243ac898c0123 languageName: node linkType: hard From 8cbd79062ab605f2753dcfdd7c2ca9fe876230ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:27:51 +0700 Subject: [PATCH 05/18] deps: bump vite from 6.0.11 to 6.1.0 in the vite group (#2523) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 272 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 271 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f35741d97d..ff1632fe22 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "sass": "1.77.6", "typescript": "^5.7.2", "typescript-eslint": "^8.23.0", - "vite": "^6.0.11" + "vite": "^6.1.0" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.7.2", diff --git a/yarn.lock b/yarn.lock index 9e95e68fbb..766d9d7a34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3781,6 +3781,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-android-arm64@npm:4.34.2" @@ -3788,6 +3795,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm64@npm:4.34.8" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-darwin-arm64@npm:4.34.2" @@ -3795,6 +3809,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-darwin-x64@npm:4.34.2" @@ -3802,6 +3823,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-arm64@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.2" @@ -3809,6 +3837,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-x64@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-freebsd-x64@npm:4.34.2" @@ -3816,6 +3851,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.2" @@ -3823,6 +3865,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-musleabihf@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.2" @@ -3830,6 +3879,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.2" @@ -3837,6 +3893,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.2" @@ -3844,6 +3907,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.2" @@ -3851,6 +3921,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.2" @@ -3858,6 +3935,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.2" @@ -3865,6 +3949,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-s390x-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.2" @@ -3872,6 +3963,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.2" @@ -3879,6 +3977,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.2" @@ -3886,6 +3991,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.2" @@ -3893,6 +4005,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.2" @@ -3900,6 +4019,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.34.2": version: 4.34.2 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.2" @@ -3907,6 +4033,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -10119,7 +10252,7 @@ __metadata: styled-components: "npm:^6.1.13" typescript: "npm:^5.7.2" typescript-eslint: "npm:^8.23.0" - vite: "npm:^6.0.11" + vite: "npm:^6.1.0" vitest: "npm:^3.0.5" languageName: unknown linkType: soft @@ -10190,6 +10323,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.1": + version: 8.5.2 + resolution: "postcss@npm:8.5.2" + dependencies: + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/3044d49bc725029ab62292e8bf9849741251b95f3b754e191bf8b4025414d40ec3b4ac05c5a563d4b50060b5c8e96683eb4d783d8d8fa3867eb7b763cbe66127 + languageName: node + linkType: hard + "preact@npm:^10.16.0, preact@npm:^10.24.2": version: 10.25.4 resolution: "preact@npm:10.25.4" @@ -11013,6 +11157,78 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.30.1": + version: 4.34.8 + resolution: "rollup@npm:4.34.8" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.34.8" + "@rollup/rollup-android-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-x64": "npm:4.34.8" + "@rollup/rollup-freebsd-arm64": "npm:4.34.8" + "@rollup/rollup-freebsd-x64": "npm:4.34.8" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-arm64-musl": "npm:4.34.8" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.8" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-s390x-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-musl": "npm:4.34.8" + "@rollup/rollup-win32-arm64-msvc": "npm:4.34.8" + "@rollup/rollup-win32-ia32-msvc": "npm:4.34.8" + "@rollup/rollup-win32-x64-msvc": "npm:4.34.8" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/b9e711e33413112fbb761107c3fddc4561dfc74335c393542a829a85ccfb2763bfd17bf2422d84a2e9bee7646e5367018973e97005fdf64e49c2e209612f0eb6 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -12837,7 +13053,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0 || ^6.0.0, vite@npm:^6.0.11": +"vite@npm:^5.0.0 || ^6.0.0": version: 6.0.11 resolution: "vite@npm:6.0.11" dependencies: @@ -12889,6 +13105,58 @@ __metadata: languageName: node linkType: hard +"vite@npm:^6.1.0": + version: 6.1.0 + resolution: "vite@npm:6.1.0" + dependencies: + esbuild: "npm:^0.24.2" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.5.1" + rollup: "npm:^4.30.1" + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/e1cad1cfbd29923a37d2dbd60f7387901ed8356758073a0226cbe844fd032425ba3bf41651332cab4965d5c54d0b51d208889ff32ce81bd282d230c0c9f0f8f1 + languageName: node + linkType: hard + "vitest@npm:^3.0.5": version: 3.0.5 resolution: "vitest@npm:3.0.5" From fef2ac080e2ff22aceb2b826b208f97ea1e6120d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:32:10 +0700 Subject: [PATCH 06/18] deps: bump the wagmi group with 2 updates (#2525) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- packages/app/package.json | 4 +- yarn.lock | 97 ++++++++++++++++++++++++--------------- 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index b99cca6b19..fe6407b858 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -57,8 +57,8 @@ "ui-overlay": "workspace:*", "usehooks-ts": "^3.0.2", "utils": "workspace:*", - "viem": "^2.22.19", - "wagmi": "^2.14.8", + "viem": "^2.23.2", + "wagmi": "^2.14.11", "xxhash-wasm": "^1.0.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 766d9d7a34..32145015cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -235,15 +235,15 @@ __metadata: languageName: node linkType: hard -"@coinbase/wallet-sdk@npm:4.2.3": - version: 4.2.3 - resolution: "@coinbase/wallet-sdk@npm:4.2.3" +"@coinbase/wallet-sdk@npm:4.3.0": + version: 4.3.0 + resolution: "@coinbase/wallet-sdk@npm:4.3.0" dependencies: "@noble/hashes": "npm:^1.4.0" clsx: "npm:^1.2.1" eventemitter3: "npm:^5.0.1" preact: "npm:^10.24.2" - checksum: 10c0/ce27b5bfdcbc79e896cd262baf0483073ac854986b518e29a23af9c70b3bb6a75d6c15e5e34355095249d46fa8a8eda4682b63ec82812e92cbadba56b8706190 + checksum: 10c0/39e38ab6f84e34d8a61b9baf3fb69ad20b497d6844fe3f0cb1496e89bbb990066a6e8d68446f90054394eee840f3a452330ffbb015adabc34400f36a3ef03364 languageName: node linkType: hard @@ -1232,9 +1232,9 @@ __metadata: languageName: node linkType: hard -"@metamask/sdk-communication-layer@npm:0.31.0": - version: 0.31.0 - resolution: "@metamask/sdk-communication-layer@npm:0.31.0" +"@metamask/sdk-communication-layer@npm:0.32.0": + version: 0.32.0 + resolution: "@metamask/sdk-communication-layer@npm:0.32.0" dependencies: bufferutil: "npm:^4.0.8" date-fns: "npm:^2.29.3" @@ -1247,28 +1247,28 @@ __metadata: eventemitter2: ^6.4.9 readable-stream: ^3.6.2 socket.io-client: ^4.5.1 - checksum: 10c0/851d9fc6a57d7ee788f631a08805e37644ed7f30e2244e0ad97fa39b0fc6bc039e6c5a358745d2d5d8b488c872cf6b429b4ae0bf31d480255d5c506ed6ff3089 + checksum: 10c0/f13defc09ff46839e4d5429deb327306b5c0c49378fdb2ccb3acaa89a61cc44e7f7e49bbeb56be88dd25c529c902dac0860091829893e730335094194c906ce4 languageName: node linkType: hard -"@metamask/sdk-install-modal-web@npm:0.31.5": - version: 0.31.5 - resolution: "@metamask/sdk-install-modal-web@npm:0.31.5" +"@metamask/sdk-install-modal-web@npm:0.32.0": + version: 0.32.0 + resolution: "@metamask/sdk-install-modal-web@npm:0.32.0" dependencies: "@paulmillr/qr": "npm:^0.2.1" - checksum: 10c0/acdf5382371b1b50e576a8120ce056e83a9e4fb9ea14f9b9cc9442348796d0eb81ebf5675c5b46b004b849fd5db9a7442c0a8e55b26aef9d805cb7636e02bbc0 + checksum: 10c0/e28b12924bc26f15c62d7489e07a0201a02105b6d52babbca30d86c8488ec8e0e13fceb088aa76713eea4022957cf507053d06dea6cb35c091dcb3345e2fa435 languageName: node linkType: hard -"@metamask/sdk@npm:0.31.5": - version: 0.31.5 - resolution: "@metamask/sdk@npm:0.31.5" +"@metamask/sdk@npm:0.32.0": + version: 0.32.0 + resolution: "@metamask/sdk@npm:0.32.0" dependencies: "@babel/runtime": "npm:^7.26.0" "@metamask/onboarding": "npm:^1.0.1" "@metamask/providers": "npm:16.1.0" - "@metamask/sdk-communication-layer": "npm:0.31.0" - "@metamask/sdk-install-modal-web": "npm:0.31.5" + "@metamask/sdk-communication-layer": "npm:0.32.0" + "@metamask/sdk-install-modal-web": "npm:0.32.0" "@paulmillr/qr": "npm:^0.2.1" bowser: "npm:^2.9.0" cross-fetch: "npm:^4.0.0" @@ -1283,7 +1283,7 @@ __metadata: tslib: "npm:^2.6.0" util: "npm:^0.12.4" uuid: "npm:^8.3.2" - checksum: 10c0/96d4e57f78c55f9afb4a4ecc9864f3ad3734d33792153b6a7da58c1effe54203fde329440d119c6905f3be20aa0541e1e3067e2f11421805444b436706dfb237 + checksum: 10c0/7038015fd6b516d17325b383650ec97ffe2ade3d9959c8af8d568a8742ea55bbb8a54c0ae4cbe256074d4e791c60888100ce8173624b805febdf4a707db29204 languageName: node linkType: hard @@ -5158,30 +5158,30 @@ __metadata: languageName: node linkType: hard -"@wagmi/connectors@npm:5.7.5": - version: 5.7.5 - resolution: "@wagmi/connectors@npm:5.7.5" +"@wagmi/connectors@npm:5.7.7": + version: 5.7.7 + resolution: "@wagmi/connectors@npm:5.7.7" dependencies: - "@coinbase/wallet-sdk": "npm:4.2.3" - "@metamask/sdk": "npm:0.31.5" + "@coinbase/wallet-sdk": "npm:4.3.0" + "@metamask/sdk": "npm:0.32.0" "@safe-global/safe-apps-provider": "npm:0.18.5" "@safe-global/safe-apps-sdk": "npm:9.1.0" "@walletconnect/ethereum-provider": "npm:2.17.0" cbw-sdk: "npm:@coinbase/wallet-sdk@3.9.3" peerDependencies: - "@wagmi/core": 2.16.3 + "@wagmi/core": 2.16.4 typescript: ">=5.0.4" viem: 2.x peerDependenciesMeta: typescript: optional: true - checksum: 10c0/3db065d614eacc78013fde195ac3a6c72414289a35e59a2309a77a0045eb83716aef170e3f8fb5453d9e2bcbf0ed8ec0359bc4f09c02e6f8ffd5e45b60e30106 + checksum: 10c0/aab2381ea9bb17278e5c76d1ef5039a3f32eac5dfea46b71e217f8e4714624907bcc05c37c1e9327bc4602d4175bdf325e4246dc98bd0ea45ee68c2b67032c6e languageName: node linkType: hard -"@wagmi/core@npm:2.16.3": - version: 2.16.3 - resolution: "@wagmi/core@npm:2.16.3" +"@wagmi/core@npm:2.16.4": + version: 2.16.4 + resolution: "@wagmi/core@npm:2.16.4" dependencies: eventemitter3: "npm:5.0.1" mipd: "npm:0.0.7" @@ -5195,7 +5195,7 @@ __metadata: optional: true typescript: optional: true - checksum: 10c0/fc4dd55b41380acca2b00b256216fc269d9c371ea47f4257dfcc3e18843a187468785c9be02a128923b82188177915ae7e7d6b0d570b0f6e610f3ef566315d72 + checksum: 10c0/eac99dba4eae35c90b52a0757fb0dfc044f10441c18f880033d3bbb9a2ca25caeb90f8b633ea46983b1af7edbabeadf0110d7b33d03e94d23d7c4616c9c3cb32 languageName: node linkType: hard @@ -5744,14 +5744,14 @@ __metadata: ui-overlay: "workspace:*" usehooks-ts: "npm:^3.0.2" utils: "workspace:*" - viem: "npm:^2.22.19" + viem: "npm:^2.23.2" vite-bundle-visualizer: "npm:^1.2.1" vite-plugin-checker: "npm:^0.8.0" vite-plugin-eslint: "npm:^1.8.1" vite-plugin-svgr: "npm:^4.3.0" vite-tsconfig-paths: "npm:^5.1.4" vitest: "npm:^3.0.5" - wagmi: "npm:^2.14.8" + wagmi: "npm:^2.14.11" xxhash-wasm: "npm:^1.0.2" peerDependencies: "@fortawesome/fontawesome-svg-core": "*" @@ -12908,7 +12908,7 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.1.1, viem@npm:^2.22.19": +"viem@npm:^2.1.1": version: 2.22.21 resolution: "viem@npm:2.22.21" dependencies: @@ -12929,6 +12929,27 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.23.2": + version: 2.23.2 + resolution: "viem@npm:2.23.2" + dependencies: + "@noble/curves": "npm:1.8.1" + "@noble/hashes": "npm:1.7.1" + "@scure/bip32": "npm:1.6.2" + "@scure/bip39": "npm:1.5.4" + abitype: "npm:1.0.8" + isows: "npm:1.0.6" + ox: "npm:0.6.7" + ws: "npm:8.18.0" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/39332d008d2ab0700aa57f541bb199350daecdfb722ae1b262404b02944e11205368fcc696cc0ab8327b9f90bf7172014687ae3e5d9091978e9d174885ccff2d + languageName: node + linkType: hard + "vite-bundle-visualizer@npm:^1.2.1": version: 1.2.1 resolution: "vite-bundle-visualizer@npm:1.2.1" @@ -13277,12 +13298,12 @@ __metadata: languageName: node linkType: hard -"wagmi@npm:^2.14.8": - version: 2.14.9 - resolution: "wagmi@npm:2.14.9" +"wagmi@npm:^2.14.11": + version: 2.14.11 + resolution: "wagmi@npm:2.14.11" dependencies: - "@wagmi/connectors": "npm:5.7.5" - "@wagmi/core": "npm:2.16.3" + "@wagmi/connectors": "npm:5.7.7" + "@wagmi/core": "npm:2.16.4" use-sync-external-store: "npm:1.4.0" peerDependencies: "@tanstack/react-query": ">=5.0.0" @@ -13292,7 +13313,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/b1b453c39bccf64f4d204b11f35218f095bf3aa4c808a4c44295de257bd32f9f15fda37d5da6ef75c93e49a96e2273ab2271e8359e4c9c7b18d0836a66880972 + checksum: 10c0/aa4fc4a8a366c32d2605fcdadc61e52e379a9add52e655d6da5e506d2f8a2f89e268990d183a08f5b074f34d6994239aeded39e758e58f335cd68794e2cdb7af languageName: node linkType: hard From 419a0e4315730006779af247f4d36bed4cce908a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:38:18 +0700 Subject: [PATCH 07/18] deps: bump @tanstack/react-query from 5.66.0 to 5.66.5 (#2534) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index ff1632fe22..ee4dd3d1aa 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@polkadot-api/merkleize-metadata": "^1.1.13", - "@tanstack/react-query": "^5.66.0", + "@tanstack/react-query": "^5.66.5", "@w3ux/hooks": "^1.4.0", "@w3ux/react-polkicon": "^2.0.1-alpha.0", "@w3ux/utils": "^1.2.0", diff --git a/yarn.lock b/yarn.lock index 32145015cd..b6d71635ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4639,21 +4639,21 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.66.0": - version: 5.66.0 - resolution: "@tanstack/query-core@npm:5.66.0" - checksum: 10c0/a03afcb3a075f1923ce3d03dcb16662bb35159280bf87598b9d446366cfd47f5c736be41fb90938c4e6848633c036087d7019f0dbb95f2f2450a9fea4764adbb +"@tanstack/query-core@npm:5.66.4": + version: 5.66.4 + resolution: "@tanstack/query-core@npm:5.66.4" + checksum: 10c0/ef0ebf572e0109791e53e9a7c2790a93cbfe1c6f3fb462793c621c0f2d44c0b38f78f22a32526e124790f69a017ae3254877281f418ffef06d83f4edb82df51a languageName: node linkType: hard -"@tanstack/react-query@npm:^5.66.0": - version: 5.66.0 - resolution: "@tanstack/react-query@npm:5.66.0" +"@tanstack/react-query@npm:^5.66.5": + version: 5.66.5 + resolution: "@tanstack/react-query@npm:5.66.5" dependencies: - "@tanstack/query-core": "npm:5.66.0" + "@tanstack/query-core": "npm:5.66.4" peerDependencies: react: ^18 || ^19 - checksum: 10c0/60e1a3fd7f2f8b2038d70954b51eeb84c31273d09a68537babdc2ac3d8c200968a1f7865a8e189ffd63be0c30387985b4b4eaf1d9065990bd3699ac5872b7523 + checksum: 10c0/82a1f82bb0e327af8e4aa4d4464a00ca372eba193c21ab055a46a5a75ef0af695479b156deb7743acd9256a4a3d3abfb1adb9148dfad2252f1f9baacb9ea3f23 languageName: node linkType: hard @@ -10216,7 +10216,7 @@ __metadata: "@fortawesome/free-solid-svg-icons": "npm:^6.7.2" "@ledgerhq/logs": "npm:^6.12.0" "@polkadot-api/merkleize-metadata": "npm:^1.1.13" - "@tanstack/react-query": "npm:^5.66.0" + "@tanstack/react-query": "npm:^5.66.5" "@types/chroma-js": "npm:^3.1.1" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.2.25" From dc2cf25f27d7e6d9bb2e107e93ff067430e0b269 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:42:38 +0700 Subject: [PATCH 08/18] deps: bump @apollo/client from 3.12.9 to 3.13.1 (#2536) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- packages/plugin-staking-api/package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/plugin-staking-api/package.json b/packages/plugin-staking-api/package.json index 7b886bdfaf..525c7fcbf3 100644 --- a/packages/plugin-staking-api/package.json +++ b/packages/plugin-staking-api/package.json @@ -13,7 +13,7 @@ "./types": "./src/types.ts" }, "dependencies": { - "@apollo/client": "^3.12.9", + "@apollo/client": "^3.13.1", "graphql": "^16.10.0" } } diff --git a/yarn.lock b/yarn.lock index b6d71635ce..6400529246 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,9 +22,9 @@ __metadata: languageName: node linkType: hard -"@apollo/client@npm:^3.12.9": - version: 3.12.9 - resolution: "@apollo/client@npm:3.12.9" +"@apollo/client@npm:^3.13.1": + version: 3.13.1 + resolution: "@apollo/client@npm:3.13.1" dependencies: "@graphql-typed-document-node/core": "npm:^3.1.1" "@wry/caches": "npm:^1.0.0" @@ -41,7 +41,7 @@ __metadata: zen-observable-ts: "npm:^1.2.5" peerDependencies: graphql: ^15.0.0 || ^16.0.0 - graphql-ws: ^5.5.5 + graphql-ws: ^5.5.5 || ^6.0.3 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc subscriptions-transport-ws: ^0.9.0 || ^0.11.0 @@ -54,7 +54,7 @@ __metadata: optional: true subscriptions-transport-ws: optional: true - checksum: 10c0/b76a1cce25a08bd1835588420afb12a709194dc380d792f8bec5e4f7fad186af5cf13f5170e835c3d7d62b43ac8e94699621ea3afc6f20a0e30f164ffcc4c97a + checksum: 10c0/50e65f9b12e82159d50feb6ad356bbc9dc871f04d930954b3fa299d63d0d578f1be95377d2961572907e56aeaa2b7e36c1c8a6d1287ce1a85cf454ee528f1d00 languageName: node linkType: hard @@ -10163,7 +10163,7 @@ __metadata: version: 0.0.0-use.local resolution: "plugin-staking-api@workspace:packages/plugin-staking-api" dependencies: - "@apollo/client": "npm:^3.12.9" + "@apollo/client": "npm:^3.13.1" graphql: "npm:^16.10.0" languageName: unknown linkType: soft From fa0fd248f444e761a46a25578c85cc88f958defe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:49:29 +0700 Subject: [PATCH 09/18] deps: bump i18next-browser-languagedetector from 8.0.2 to 8.0.3 (#2538) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- packages/app/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index fe6407b858..ef5296ceda 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -37,7 +37,7 @@ "compare-versions": "^6.1.1", "consts": "workspace:*", "html5-qrcode": "^2.3.8", - "i18next-browser-languagedetector": "^8.0.2", + "i18next-browser-languagedetector": "^8.0.3", "locales": "workspace:*", "plugin-staking-api": "workspace:*", "polkadot-api": "^1.8.4", diff --git a/yarn.lock b/yarn.lock index 6400529246..045f9155b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5724,7 +5724,7 @@ __metadata: compare-versions: "npm:^6.1.1" consts: "workspace:*" html5-qrcode: "npm:^2.3.8" - i18next-browser-languagedetector: "npm:^8.0.2" + i18next-browser-languagedetector: "npm:^8.0.3" locales: "workspace:*" plugin-staking-api: "workspace:*" polkadot-api: "npm:^1.8.4" @@ -8339,12 +8339,12 @@ __metadata: languageName: node linkType: hard -"i18next-browser-languagedetector@npm:^8.0.2": - version: 8.0.2 - resolution: "i18next-browser-languagedetector@npm:8.0.2" +"i18next-browser-languagedetector@npm:^8.0.3": + version: 8.0.3 + resolution: "i18next-browser-languagedetector@npm:8.0.3" dependencies: "@babel/runtime": "npm:^7.23.2" - checksum: 10c0/b4ed7531ab503da12e043209c396b1aa9a0bdb2bbb397c0c85605bf16f08bf4cdacf9c1866cd32be1f19266488accb8d15dc8a76a6046e9ee359284199a8dcbc + checksum: 10c0/cb8af8ca13b02e6dcece6a85ad8a8191cb7e3d914c57651d5cecc3b5ad91720d823f97646c5acf136c9cb573f146311aa02c0f03b1053e4f0fd82bd43c121702 languageName: node linkType: hard From bd4ad9e31029826b0018754eedacd633d4aa882c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:07:36 +0700 Subject: [PATCH 10/18] deps: bump the eslint group across 1 directory with 5 updates (#2547) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 10 +-- yarn.lock | 180 ++++++++++++++++++++++++++++----------------------- 2 files changed, 104 insertions(+), 86 deletions(-) diff --git a/package.json b/package.json index ee4dd3d1aa..872c7c1a14 100644 --- a/package.json +++ b/package.json @@ -12,18 +12,18 @@ "test": "npm run test --workspaces --if-present" }, "devDependencies": { - "@eslint/js": "^9.19.0", + "@eslint/js": "^9.20.0", "@ledgerhq/logs": "^6.12.0", "@types/chroma-js": "^3.1.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.2.25", "@types/react-helmet": "^6.1.11", - "@typescript-eslint/parser": "^8.23.0", + "@typescript-eslint/parser": "^8.24.1", "@vitejs/plugin-react-swc": "^3.7.0", "@w3ux/types": "^1.0.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "eslint-config-prettier": "^10.0.1", - "eslint-import-resolver-typescript": "^3.7.0", + "eslint-import-resolver-typescript": "^3.8.3", "eslint-plugin-import": "^2.31.0", "eslint-plugin-prefer-arrow-functions": "^3.6.2", "eslint-plugin-prettier": "^5.2.3", @@ -35,7 +35,7 @@ "prettier-plugin-organize-imports": "^4.1.0", "sass": "1.77.6", "typescript": "^5.7.2", - "typescript-eslint": "^8.23.0", + "typescript-eslint": "^8.24.1", "vite": "^6.1.0" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 045f9155b7..a16109d8e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -546,6 +546,15 @@ __metadata: languageName: node linkType: hard +"@eslint/core@npm:^0.11.0": + version: 0.11.0 + resolution: "@eslint/core@npm:0.11.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/1e0671d035c908175f445864a7864cf6c6a8b67a5dfba8c47b2ac91e2d3ed36e8c1f2fd81d98a73264f8677055559699d4adb0f97d86588e616fc0dc9a4b86c9 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^3.2.0": version: 3.2.0 resolution: "@eslint/eslintrc@npm:3.2.0" @@ -563,10 +572,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.19.0, @eslint/js@npm:^9.19.0": - version: 9.19.0 - resolution: "@eslint/js@npm:9.19.0" - checksum: 10c0/45dc544c8803984f80a438b47a8e578fae4f6e15bc8478a703827aaf05e21380b42a43560374ce4dad0d5cb6349e17430fc9ce1686fed2efe5d1ff117939ff90 +"@eslint/js@npm:9.20.0, @eslint/js@npm:^9.20.0": + version: 9.20.0 + resolution: "@eslint/js@npm:9.20.0" + checksum: 10c0/10e7b5b9e628b5192e8fc6b0ecd27cf48322947e83e999ff60f9f9e44ac8d499138bcb9383cbfa6e51e780d53b4e76ccc2d1753b108b7173b8404fd484d37328 languageName: node linkType: hard @@ -4801,15 +4810,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.23.0" +"@typescript-eslint/eslint-plugin@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.24.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.23.0" - "@typescript-eslint/type-utils": "npm:8.23.0" - "@typescript-eslint/utils": "npm:8.23.0" - "@typescript-eslint/visitor-keys": "npm:8.23.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/type-utils": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -4818,23 +4827,23 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/6c760a5f90748774f79a1b701f85fe6d99e89f289bc33993009987b0ffe2d13b3960ce595d452a937f3413af3918c76830659317242c05e49db40ceaca593033 + checksum: 10c0/fe5f56f248370f40322a7cb2d96fbab724a7a8892895e3d41027c9a1df309916433633e04df84a1d3f9535d282953738b1ad627d8af37ab288a39a6e411afd76 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.23.0, @typescript-eslint/parser@npm:^8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/parser@npm:8.23.0" +"@typescript-eslint/parser@npm:8.24.1, @typescript-eslint/parser@npm:^8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/parser@npm:8.24.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.23.0" - "@typescript-eslint/types": "npm:8.23.0" - "@typescript-eslint/typescript-estree": "npm:8.23.0" - "@typescript-eslint/visitor-keys": "npm:8.23.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/f9e0f83a6dd97a9049d4ce23d660a1d4d5f3c57be8efc68e2258e6b2d5b823086d188b534f791a3412ef10d211fe4916b378254728150094c4f8b0ab44aae2a7 + checksum: 10c0/9de557698c8debf3de06b6adf6aa06a8345e0e38600e5ccbeda62270d1a4a757dfa191db89d4e86cf373103a11bef1965c9d9889f622c51f4f26d1bf12394ae3 languageName: node linkType: hard @@ -4848,28 +4857,28 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/scope-manager@npm:8.23.0" +"@typescript-eslint/scope-manager@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/scope-manager@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.23.0" - "@typescript-eslint/visitor-keys": "npm:8.23.0" - checksum: 10c0/625b524a4fc25667b20f3541da84674af9c2abfac6596e30f7a40085513172bf1aac125488b32885894e3ef6596a0d06dec9a65ed4562884e0bca87a758600fa + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + checksum: 10c0/779880743ed7ab67fe477f1ad5648bbd77ad69b4663b5a42024112004c8f231049b1e4eeb67e260005769c3bb005049e00a80b885e19d593ffb080bd39f4fa94 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/type-utils@npm:8.23.0" +"@typescript-eslint/type-utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/type-utils@npm:8.24.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.23.0" - "@typescript-eslint/utils": "npm:8.23.0" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.0.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/a98dc2f2f75ec2132176428011ba620ad5b641a04e9e18471a7b9f979f6966a76aeaf6e51072c5364de68f83832a3a77b04518ec65c3092dadbd033d03fb5e35 + checksum: 10c0/ba248bc12068383374d9d077f9cca1815f347ea008d04d08ad7a54dbef70189a0da7872246f8369e6d30938fa7e408dadcda0ae71041be68fc836c886dd9c3ab languageName: node linkType: hard @@ -4880,10 +4889,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/types@npm:8.23.0" - checksum: 10c0/78737a14e8469e33212d9bbc26d6880bca3f8e47764273eb4c662f5ed38d0b35c626d646d4a8e9a6ee64a0e352b18dd36422e59ce217362b5af473b79d058b35 +"@typescript-eslint/types@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/types@npm:8.24.1" + checksum: 10c0/ebb40ce16c746ef236dbcc25cb2e6950753ca6fb34d04ed7d477016370de1fdaf7402ed4569673c6ff14bf60af7124ff45c6ddd9328d2f8c94dc04178368e2a3 languageName: node linkType: hard @@ -4905,12 +4914,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.23.0" +"@typescript-eslint/typescript-estree@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.23.0" - "@typescript-eslint/visitor-keys": "npm:8.23.0" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -4919,7 +4928,7 @@ __metadata: ts-api-utils: "npm:^2.0.1" peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/2cc8defb3d9b25b899a62c6b6ca26c442433bf95f626f6275935e2754d9a74abb0015c737de27038b0f378273e67e61120d9cf2941c44848e4bffbbc297fdf74 + checksum: 10c0/8eeeae6e8de1cd83f2eddd52293e9c31a655e0974cc2d410f00ba2b6fd6bb9aec1c346192d5784d64d0d1b15a55e56e35550788c04dda87e0f1a99b21a3eb709 languageName: node linkType: hard @@ -4938,18 +4947,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/utils@npm:8.23.0" +"@typescript-eslint/utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/utils@npm:8.24.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.23.0" - "@typescript-eslint/types": "npm:8.23.0" - "@typescript-eslint/typescript-estree": "npm:8.23.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/8967cf6543b1df2fb8d29086a0d35f5f7623e935706ad7c5bfcc6123e6fb08a767be1770601d481d815022bec43422730c6c8035892f23cd11cdadb16176b418 + checksum: 10c0/b3300d5c7e18ec524a46bf683052539f24df0d8c709e39e3bde9dfc6c65180610c46b875f1f4eaad5e311193a56acdfd7111a73f1e8aec4108e9cd19561bf8b8 languageName: node linkType: hard @@ -4963,13 +4972,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.23.0": - version: 8.23.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.23.0" +"@typescript-eslint/visitor-keys@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.24.1" dependencies: - "@typescript-eslint/types": "npm:8.23.0" + "@typescript-eslint/types": "npm:8.24.1" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/a406f78aa18b4efb2adf26e3a6ca48c9a6f2cc9545e083b50efaaf90f0a80d2bea79ceda51da1f109706d4138756b0978a323b9176c9a6a519e87168851e7e16 + checksum: 10c0/ba09412fb4b1605aa73c890909c9a8dba2aa72e00ccd7d69baad17c564eedd77f489a06b1686985c7f0c49724787b82d76dcf4c146c4de44ef2c8776a9b6ad2b languageName: node linkType: hard @@ -7246,18 +7255,17 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^3.7.0": - version: 3.7.0 - resolution: "eslint-import-resolver-typescript@npm:3.7.0" +"eslint-import-resolver-typescript@npm:^3.8.3": + version: 3.8.3 + resolution: "eslint-import-resolver-typescript@npm:3.8.3" dependencies: "@nolyfill/is-core-module": "npm:1.0.39" debug: "npm:^4.3.7" enhanced-resolve: "npm:^5.15.0" - fast-glob: "npm:^3.3.2" - get-tsconfig: "npm:^4.7.5" + get-tsconfig: "npm:^4.10.0" is-bun-module: "npm:^1.0.2" - is-glob: "npm:^4.0.3" stable-hash: "npm:^0.0.4" + tinyglobby: "npm:^0.2.12" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -7267,7 +7275,7 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10c0/b1dec542a31486b3b5730f71f08a8ee2ac4915dbc4aa1493fd15bc8fcadcb029772ab39a425824c235045b3a7e629290a339d4a7e7f3dd32b24e715106352d40 + checksum: 10c0/886ceeab4cad14958d7c7d3432ead2486374616c8ada7925ab96e55f919f2dbbbdbe7c3081d7d238231e84699849e82930417a66e05638bcc8202e1263edddeb languageName: node linkType: hard @@ -7418,16 +7426,16 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.19.0": - version: 9.19.0 - resolution: "eslint@npm:9.19.0" +"eslint@npm:^9.20.1": + version: 9.20.1 + resolution: "eslint@npm:9.20.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" "@eslint/config-array": "npm:^0.19.0" - "@eslint/core": "npm:^0.10.0" + "@eslint/core": "npm:^0.11.0" "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:9.19.0" + "@eslint/js": "npm:9.20.0" "@eslint/plugin-kit": "npm:^0.2.5" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -7463,7 +7471,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/3b0dfaeff6a831de086884a3e2432f18468fe37c69f35e1a0a9a2833d9994a65b6dd2a524aaee28f361c849035ad9d15e3841029b67d261d0abd62c7de6d51f5 + checksum: 10c0/056789dd5a00897730376f8c0a191e22840e97b7276916068ec096341cb2ec3a918c8bd474bf94ccd7b457ad9fbc16e5c521a993c7cc6ebcf241933e2fd378b0 languageName: node linkType: hard @@ -7719,7 +7727,7 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.2": +"fdir@npm:^6.4.2, fdir@npm:^6.4.3": version: 6.4.3 resolution: "fdir@npm:6.4.3" peerDependencies: @@ -8041,7 +8049,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": +"get-tsconfig@npm:^4.10.0": version: 4.10.0 resolution: "get-tsconfig@npm:4.10.0" dependencies: @@ -10211,7 +10219,7 @@ __metadata: version: 0.0.0-use.local resolution: "polkadot-staking-dashboard@workspace:." dependencies: - "@eslint/js": "npm:^9.19.0" + "@eslint/js": "npm:^9.20.0" "@fortawesome/fontawesome-svg-core": "npm:^6.7.2" "@fortawesome/free-solid-svg-icons": "npm:^6.7.2" "@ledgerhq/logs": "npm:^6.12.0" @@ -10221,7 +10229,7 @@ __metadata: "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.2.25" "@types/react-helmet": "npm:^6.1.11" - "@typescript-eslint/parser": "npm:^8.23.0" + "@typescript-eslint/parser": "npm:^8.24.1" "@vitejs/plugin-react-swc": "npm:^3.7.0" "@w3ux/hooks": "npm:^1.4.0" "@w3ux/react-polkicon": "npm:^2.0.1-alpha.0" @@ -10230,9 +10238,9 @@ __metadata: bignumber.js: "npm:^9.1.2" classnames: "npm:^2.5.1" date-fns: "npm:^4.1.0" - eslint: "npm:^9.19.0" + eslint: "npm:^9.20.1" eslint-config-prettier: "npm:^10.0.1" - eslint-import-resolver-typescript: "npm:^3.7.0" + eslint-import-resolver-typescript: "npm:^3.8.3" eslint-plugin-import: "npm:^2.31.0" eslint-plugin-prefer-arrow-functions: "npm:^3.6.2" eslint-plugin-prettier: "npm:^5.2.3" @@ -10251,7 +10259,7 @@ __metadata: sass: "npm:1.77.6" styled-components: "npm:^6.1.13" typescript: "npm:^5.7.2" - typescript-eslint: "npm:^8.23.0" + typescript-eslint: "npm:^8.24.1" vite: "npm:^6.1.0" vitest: "npm:^3.0.5" languageName: unknown @@ -12186,6 +12194,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.9": version: 0.2.10 resolution: "tinyglobby@npm:0.2.10" @@ -12469,17 +12487,17 @@ __metadata: languageName: unknown linkType: soft -"typescript-eslint@npm:^8.23.0": - version: 8.23.0 - resolution: "typescript-eslint@npm:8.23.0" +"typescript-eslint@npm:^8.24.1": + version: 8.24.1 + resolution: "typescript-eslint@npm:8.24.1" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.23.0" - "@typescript-eslint/parser": "npm:8.23.0" - "@typescript-eslint/utils": "npm:8.23.0" + "@typescript-eslint/eslint-plugin": "npm:8.24.1" + "@typescript-eslint/parser": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/e8d8b1f4212fc300dd709c1809320945c05ea54b80d0f017cbb0c24f210c4a970a9aeefdf0dd1ba633d270c172193a17d27a675806ad3a299f17a88d2b3c3f8f + checksum: 10c0/5bcb6af12d04777ca04ca9300552e1c7410d640950945d854be41c264fdfe965ce40c0203336e073eb0697567d59043b3096dfed825e76fd7347081e9abf3b16 languageName: node linkType: hard From b51bfcf41dcc1bd04d771871dc3bea8c590f197d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:15:45 +0700 Subject: [PATCH 11/18] deps: bump framer-motion from 12.1.0 to 12.4.7 in the utils-and-qrcode group across 1 directory (#2546) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 872c7c1a14..b23d243fe0 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "bignumber.js": "^9.1.2", "classnames": "^2.5.1", "date-fns": "^4.1.0", - "framer-motion": "^12.0.11", + "framer-motion": "^12.4.7", "i18next": "^24.2.2", "radix-ui": "^1.1.3", "react": "^18.3.1", diff --git a/yarn.lock b/yarn.lock index a16109d8e4..f5a6fadac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7876,11 +7876,11 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^12.0.11": - version: 12.1.0 - resolution: "framer-motion@npm:12.1.0" +"framer-motion@npm:^12.4.7": + version: 12.4.7 + resolution: "framer-motion@npm:12.4.7" dependencies: - motion-dom: "npm:^12.0.0" + motion-dom: "npm:^12.4.5" motion-utils: "npm:^12.0.0" tslib: "npm:^2.4.0" peerDependencies: @@ -7894,7 +7894,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10c0/7b7fe45cf38f2a13236a19f95840ec42dd7de9f9692cb6fdce8c5f17c5101c0bcce43783968a0c6157a1f8b2bcd9cbb88eb9fd9c0e7212a357ec6010135e80d4 + checksum: 10c0/746b6a82f7c1a663341008241065a44370c02f563e57724ed7147f888c12b5df389e95ccda851195e2da24075daf5124ce00ee5e838b60bc9da56e1421cea86c languageName: node linkType: hard @@ -9465,12 +9465,12 @@ __metadata: languageName: node linkType: hard -"motion-dom@npm:^12.0.0": - version: 12.0.0 - resolution: "motion-dom@npm:12.0.0" +"motion-dom@npm:^12.4.5": + version: 12.4.5 + resolution: "motion-dom@npm:12.4.5" dependencies: motion-utils: "npm:^12.0.0" - checksum: 10c0/d67209bc217f16b9a0305afa4bfc366997d02df76eea9ab29062f98beeff5fdfc60ae1b422ab397f525ae775c640ac9ba061c9f45aacd6cd71a23dce06661384 + checksum: 10c0/2950f3023f09a31d6a86115476d6207f998a64545ea49ff0fddd772d1406b166efca895ab9db9dc87953b3a9154c56aa6df693b52c26ae083b3f665c152f8675 languageName: node linkType: hard @@ -10247,7 +10247,7 @@ __metadata: eslint-plugin-react: "npm:^7.37.4" eslint-plugin-react-hooks: "npm:^5.1.0" eslint-plugin-unused-imports: "npm:^4.1.4" - framer-motion: "npm:^12.0.11" + framer-motion: "npm:^12.4.7" globals: "npm:^15.13.0" i18next: "npm:^24.2.2" prettier: "npm:^3.5.1" From cbea14b501ab686e6b887bdf5ff5380a40fbac9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 23:25:40 +0700 Subject: [PATCH 12/18] deps: bump @tanstack/react-query from 5.66.5 to 5.66.9 (#2549) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b23d243fe0..bbd7d6e6f0 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@fortawesome/fontawesome-svg-core": "^6.7.2", "@fortawesome/free-solid-svg-icons": "^6.7.2", "@polkadot-api/merkleize-metadata": "^1.1.13", - "@tanstack/react-query": "^5.66.5", + "@tanstack/react-query": "^5.66.9", "@w3ux/hooks": "^1.4.0", "@w3ux/react-polkicon": "^2.0.1-alpha.0", "@w3ux/utils": "^1.2.0", diff --git a/yarn.lock b/yarn.lock index f5a6fadac2..1718a189e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4655,14 +4655,14 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-query@npm:^5.66.5": - version: 5.66.5 - resolution: "@tanstack/react-query@npm:5.66.5" +"@tanstack/react-query@npm:^5.66.9": + version: 5.66.9 + resolution: "@tanstack/react-query@npm:5.66.9" dependencies: "@tanstack/query-core": "npm:5.66.4" peerDependencies: react: ^18 || ^19 - checksum: 10c0/82a1f82bb0e327af8e4aa4d4464a00ca372eba193c21ab055a46a5a75ef0af695479b156deb7743acd9256a4a3d3abfb1adb9148dfad2252f1f9baacb9ea3f23 + checksum: 10c0/80565eb550e1fe3e90117c8dd4dd13c1ef27d1bf89689b09c6cdf6df084173582c3a20fbc709638b64502a10b1e10357b3172c38604739641dbdeb29715cae0d languageName: node linkType: hard @@ -10224,7 +10224,7 @@ __metadata: "@fortawesome/free-solid-svg-icons": "npm:^6.7.2" "@ledgerhq/logs": "npm:^6.12.0" "@polkadot-api/merkleize-metadata": "npm:^1.1.13" - "@tanstack/react-query": "npm:^5.66.5" + "@tanstack/react-query": "npm:^5.66.9" "@types/chroma-js": "npm:^3.1.1" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.2.25" From 4b6fd2b5fffa9a672747a0b72f2252d7974949de Mon Sep 17 00:00:00 2001 From: Joel Kenny <36333783+joeljkrb@users.noreply.github.com> Date: Sun, 23 Feb 2025 00:43:06 -0500 Subject: [PATCH 13/18] chore: rename 'Community' to 'Operators' across the application (#2548) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/app/src/Providers.tsx | 4 +-- packages/app/src/config/pages.ts | 10 +++---- .../app/src/contexts/Community/defaults.ts | 8 ----- packages/app/src/contexts/Community/index.tsx | 29 ------------------- .../app/src/contexts/Operators/defaults.ts | 8 +++++ packages/app/src/contexts/Operators/index.tsx | 29 +++++++++++++++++++ .../{Community => Operators}/types.ts | 4 +-- .../pages/{Community => Operators}/Entity.tsx | 4 +-- .../pages/{Community => Operators}/Item.tsx | 4 +-- .../pages/{Community => Operators}/List.tsx | 14 ++++----- .../{Community => Operators}/Wrappers.ts | 0 .../{Community => Operators}/context.tsx | 26 ++++++++--------- .../{Community => Operators}/defaults.ts | 8 ++--- .../pages/{Community => Operators}/index.tsx | 14 ++++----- .../pages/{Community => Operators}/types.ts | 2 +- packages/locales/src/resources/cn/app.json | 1 + packages/locales/src/resources/en/app.json | 1 + packages/locales/src/resources/es/app.json | 1 + 18 files changed, 85 insertions(+), 82 deletions(-) delete mode 100644 packages/app/src/contexts/Community/defaults.ts delete mode 100644 packages/app/src/contexts/Community/index.tsx create mode 100644 packages/app/src/contexts/Operators/defaults.ts create mode 100644 packages/app/src/contexts/Operators/index.tsx rename packages/app/src/contexts/{Community => Operators}/types.ts (69%) rename packages/app/src/pages/{Community => Operators}/Entity.tsx (96%) rename packages/app/src/pages/{Community => Operators}/Item.tsx (98%) rename packages/app/src/pages/{Community => Operators}/List.tsx (73%) rename packages/app/src/pages/{Community => Operators}/Wrappers.ts (100%) rename packages/app/src/pages/{Community => Operators}/context.tsx (62%) rename packages/app/src/pages/{Community => Operators}/defaults.ts (65%) rename packages/app/src/pages/{Community => Operators}/index.tsx (65%) rename packages/app/src/pages/{Community => Operators}/types.ts (93%) diff --git a/packages/app/src/Providers.tsx b/packages/app/src/Providers.tsx index e0b5194de7..ec4b32b1c8 100644 --- a/packages/app/src/Providers.tsx +++ b/packages/app/src/Providers.tsx @@ -14,7 +14,6 @@ import { useActiveAccounts } from 'contexts/ActiveAccounts' import { APIProvider } from 'contexts/Api' import { BalancesProvider } from 'contexts/Balances' import { BondedProvider } from 'contexts/Bonded' -import { CommunityProvider } from 'contexts/Community' import { ExternalAccountsProvider } from 'contexts/Connect/ExternalAccounts' import { ImportedAccountsProvider } from 'contexts/Connect/ImportedAccounts' import { OtherAccountsProvider } from 'contexts/Connect/OtherAccounts' @@ -25,6 +24,7 @@ import { LedgerHardwareProvider } from 'contexts/LedgerHardware' import { MenuProvider } from 'contexts/Menu' import { MigrateProvider } from 'contexts/Migrate' import { useNetwork } from 'contexts/Network' +import { OperatorsProvider } from 'contexts/Operators' import { PayoutsProvider } from 'contexts/Payouts' import { PluginsProvider } from 'contexts/Plugins' import { ActivePoolProvider } from 'contexts/Pools/ActivePool' @@ -99,7 +99,7 @@ export const Providers = () => { PromptProvider, MigrateProvider, FiltersProvider, - CommunityProvider, + OperatorsProvider, Tooltip.Provider, ], ThemedRouter diff --git a/packages/app/src/config/pages.ts b/packages/app/src/config/pages.ts index b401f2772e..6edfc860ae 100644 --- a/packages/app/src/config/pages.ts +++ b/packages/app/src/config/pages.ts @@ -2,8 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-only import type { PageCategoryItems, PagesConfigItems } from 'common-types' -import { Community } from 'pages/Community' import { Nominate } from 'pages/Nominate' +import { Operators } from 'pages/Operators' import { Overview } from 'pages/Overview' import { Pools } from 'pages/Pools' import { Rewards } from 'pages/Rewards' @@ -68,10 +68,10 @@ export const PagesConfig: PagesConfigItems = [ }, { category: 3, - key: 'community', - uri: `${BASE_URL}community`, - hash: '/community', - Entry: Community, + key: 'operators', + uri: `${BASE_URL}operators`, + hash: '/operators', + Entry: Operators, lottie: 'label', }, ] diff --git a/packages/app/src/contexts/Community/defaults.ts b/packages/app/src/contexts/Community/defaults.ts deleted file mode 100644 index 7bc2323197..0000000000 --- a/packages/app/src/contexts/Community/defaults.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors -// SPDX-License-Identifier: GPL-3.0-only - -import type { CommunityContextInterface } from './types' - -export const defaultCommunityContext: CommunityContextInterface = { - validatorCommunity: [], -} diff --git a/packages/app/src/contexts/Community/index.tsx b/packages/app/src/contexts/Community/index.tsx deleted file mode 100644 index e72b9cb727..0000000000 --- a/packages/app/src/contexts/Community/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors -// SPDX-License-Identifier: GPL-3.0-only - -import { shuffle } from '@w3ux/utils' -import type { ValidatorEntry } from '@w3ux/validator-assets' -import { ValidatorCommunity } from '@w3ux/validator-assets' -import type { ReactNode } from 'react' -import { createContext, useContext, useState } from 'react' -import { defaultCommunityContext } from './defaults' -import type { CommunityContextInterface } from './types' - -export const CommunityContext = createContext<CommunityContextInterface>( - defaultCommunityContext -) - -export const useCommunity = () => useContext(CommunityContext) - -export const CommunityProvider = ({ children }: { children: ReactNode }) => { - // Stores a randomised validator community dataset - const [validatorCommunity] = useState<ValidatorEntry[]>([ - ...shuffle(ValidatorCommunity), - ]) - - return ( - <CommunityContext.Provider value={{ validatorCommunity }}> - {children} - </CommunityContext.Provider> - ) -} diff --git a/packages/app/src/contexts/Operators/defaults.ts b/packages/app/src/contexts/Operators/defaults.ts new file mode 100644 index 0000000000..664a9651da --- /dev/null +++ b/packages/app/src/contexts/Operators/defaults.ts @@ -0,0 +1,8 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import type { OperatorsContextInterface } from './types' + +export const defaultOperatorsContext: OperatorsContextInterface = { + validatorOperators: [], +} diff --git a/packages/app/src/contexts/Operators/index.tsx b/packages/app/src/contexts/Operators/index.tsx new file mode 100644 index 0000000000..3c4ecbae2b --- /dev/null +++ b/packages/app/src/contexts/Operators/index.tsx @@ -0,0 +1,29 @@ +// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors +// SPDX-License-Identifier: GPL-3.0-only + +import { shuffle } from '@w3ux/utils' +import type { ValidatorEntry } from '@w3ux/validator-assets' +import { ValidatorCommunity } from '@w3ux/validator-assets' +import type { ReactNode } from 'react' +import { createContext, useContext, useState } from 'react' +import { defaultOperatorsContext } from './defaults' +import type { OperatorsContextInterface } from './types' + +export const OperatorsContext = createContext<OperatorsContextInterface>( + defaultOperatorsContext +) + +export const useOperators = () => useContext(OperatorsContext) + +export const OperatorsProvider = ({ children }: { children: ReactNode }) => { + // Stores a randomised validator operators dataset + const [validatorOperators] = useState<ValidatorEntry[]>([ + ...shuffle(ValidatorCommunity), + ]) + + return ( + <OperatorsContext.Provider value={{ validatorOperators }}> + {children} + </OperatorsContext.Provider> + ) +} diff --git a/packages/app/src/contexts/Community/types.ts b/packages/app/src/contexts/Operators/types.ts similarity index 69% rename from packages/app/src/contexts/Community/types.ts rename to packages/app/src/contexts/Operators/types.ts index 73eecdc5fc..fcacd9a3df 100644 --- a/packages/app/src/contexts/Community/types.ts +++ b/packages/app/src/contexts/Operators/types.ts @@ -3,6 +3,6 @@ import type { ValidatorEntry } from '@w3ux/validator-assets' -export interface CommunityContextInterface { - validatorCommunity: ValidatorEntry[] +export interface OperatorsContextInterface { + validatorOperators: ValidatorEntry[] } diff --git a/packages/app/src/pages/Community/Entity.tsx b/packages/app/src/pages/Operators/Entity.tsx similarity index 96% rename from packages/app/src/pages/Community/Entity.tsx rename to packages/app/src/pages/Operators/Entity.tsx index 9309195756..2c9bd860cd 100644 --- a/packages/app/src/pages/Community/Entity.tsx +++ b/packages/app/src/pages/Operators/Entity.tsx @@ -14,14 +14,14 @@ import { ButtonSecondary } from 'ui-buttons' import { Page } from 'ui-core/base' import { Item } from './Item' import { ItemsWrapper } from './Wrappers' -import { useCommunitySections } from './context' +import { useOperatorsSections } from './context' export const Entity = () => { const { t } = useTranslation('pages') const { isReady } = useApi() const { network } = useNetwork() const { getValidators } = useValidators() - const { setActiveSection, activeItem } = useCommunitySections() + const { setActiveSection, activeItem } = useOperatorsSections() const { name, validators: entityAllValidators } = activeItem const validators = entityAllValidators[network] ?? [] diff --git a/packages/app/src/pages/Community/Item.tsx b/packages/app/src/pages/Operators/Item.tsx similarity index 98% rename from packages/app/src/pages/Community/Item.tsx rename to packages/app/src/pages/Operators/Item.tsx index 841da5688a..ca24928dd9 100644 --- a/packages/app/src/pages/Community/Item.tsx +++ b/packages/app/src/pages/Operators/Item.tsx @@ -13,7 +13,7 @@ import { Suspense, lazy, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useOverlay } from 'ui-overlay' import { ItemWrapper } from './Wrappers' -import { useCommunitySections } from './context' +import { useOperatorsSections } from './context' import type { ItemProps } from './types' export const Item = ({ item, actionable }: ItemProps) => { @@ -33,7 +33,7 @@ export const Item = ({ item, actionable }: ItemProps) => { const validatorCount = entityAllValidators[network]?.length ?? 0 const { setActiveSection, setActiveItem, setScrollPos } = - useCommunitySections() + useOperatorsSections() const listItem = { hidden: { diff --git a/packages/app/src/pages/Community/List.tsx b/packages/app/src/pages/Operators/List.tsx similarity index 73% rename from packages/app/src/pages/Community/List.tsx rename to packages/app/src/pages/Operators/List.tsx index 654e17d464..8693cd356c 100644 --- a/packages/app/src/pages/Community/List.tsx +++ b/packages/app/src/pages/Operators/List.tsx @@ -2,26 +2,26 @@ // SPDX-License-Identifier: GPL-3.0-only import type { ValidatorEntry } from '@w3ux/validator-assets' -import { useCommunity } from 'contexts/Community' import { useNetwork } from 'contexts/Network' +import { useOperators } from 'contexts/Operators' import { useEffect, useState } from 'react' import { Page } from 'ui-core/base' import { Item } from './Item' import { ItemsWrapper } from './Wrappers' -import { useCommunitySections } from './context' +import { useOperatorsSections } from './context' export const List = () => { const { network } = useNetwork() - const { scrollPos } = useCommunitySections() - const { validatorCommunity } = useCommunity() + const { scrollPos } = useOperatorsSections() + const { validatorOperators } = useOperators() const [entityItems, setEntityItems] = useState<ValidatorEntry[]>( - validatorCommunity.filter((v) => v.validators[network] !== undefined) + validatorOperators.filter((v) => v.validators[network] !== undefined) ) useEffect(() => { setEntityItems( - validatorCommunity.filter((v) => v.validators[network] !== undefined) + validatorOperators.filter((v) => v.validators[network] !== undefined) ) }, [network]) @@ -44,7 +44,7 @@ export const List = () => { <Page.Row yMargin> <ItemsWrapper variants={container} initial="hidden" animate="show"> {entityItems.map((item, index: number) => ( - <Item key={`community_item_${index}`} item={item} actionable /> + <Item key={`operator_item_${index}`} item={item} actionable /> ))} </ItemsWrapper> </Page.Row> diff --git a/packages/app/src/pages/Community/Wrappers.ts b/packages/app/src/pages/Operators/Wrappers.ts similarity index 100% rename from packages/app/src/pages/Community/Wrappers.ts rename to packages/app/src/pages/Operators/Wrappers.ts diff --git a/packages/app/src/pages/Community/context.tsx b/packages/app/src/pages/Operators/context.tsx similarity index 62% rename from packages/app/src/pages/Community/context.tsx rename to packages/app/src/pages/Operators/context.tsx index 8de4b87f4b..2bcb4e0dd3 100644 --- a/packages/app/src/pages/Community/context.tsx +++ b/packages/app/src/pages/Operators/context.tsx @@ -4,35 +4,35 @@ import { useNetwork } from 'contexts/Network' import type { ReactNode } from 'react' import { createContext, useContext, useEffect, useState } from 'react' -import { communityItem, defaultContext } from './defaults' -import type { CommunitySectionsContextInterface, Item } from './types' +import { defaultContext, operatorItem } from './defaults' +import type { Item, OperatorsSectionsContextInterface } from './types' -export const CommunitySectionsContext = - createContext<CommunitySectionsContextInterface>(defaultContext) +export const OperatorsSectionsContext = + createContext<OperatorsSectionsContextInterface>(defaultContext) -export const useCommunitySections = () => useContext(CommunitySectionsContext) +export const useOperatorsSections = () => useContext(OperatorsSectionsContext) -export const CommunitySectionsProvider = ({ +export const OperatorsSectionsProvider = ({ children, }: { children: ReactNode }) => { const { network } = useNetwork() - // store the active section of the community page + // store the active section of the operators page const [activeSection, setActiveSectionState] = useState<number>(0) - // store the active entity item of the community page - const [activeItem, setActiveItem] = useState<Item>(communityItem) + // store the active entity item of the operators page + const [activeItem, setActiveItem] = useState<Item>(operatorItem) // store the Y scroll position when the last entity was visited - // used to automatically scroll back down upon returning to the entity lsit. + // used to automatically scroll back down upon returning to the entity list. const [scrollPos, setScrollPos] = useState<number>(0) // go back to first section and reset item when network switches useEffect(() => { setActiveSectionState(0) - setActiveItem(communityItem) + setActiveItem(operatorItem) }, [network]) const setActiveSection = (t: number) => { @@ -40,7 +40,7 @@ export const CommunitySectionsProvider = ({ } return ( - <CommunitySectionsContext.Provider + <OperatorsSectionsContext.Provider value={{ activeSection, setActiveSection, @@ -51,6 +51,6 @@ export const CommunitySectionsProvider = ({ }} > {children} - </CommunitySectionsContext.Provider> + </OperatorsSectionsContext.Provider> ) } diff --git a/packages/app/src/pages/Community/defaults.ts b/packages/app/src/pages/Operators/defaults.ts similarity index 65% rename from packages/app/src/pages/Community/defaults.ts rename to packages/app/src/pages/Operators/defaults.ts index 2c18de8e82..19831b3021 100644 --- a/packages/app/src/pages/Community/defaults.ts +++ b/packages/app/src/pages/Operators/defaults.ts @@ -2,18 +2,18 @@ // SPDX-License-Identifier: GPL-3.0-only /* eslint-disable @typescript-eslint/no-unused-vars */ -import type { CommunitySectionsContextInterface, Item } from './types' +import type { Item, OperatorsSectionsContextInterface } from './types' -export const communityItem: Item = { +export const operatorItem: Item = { name: '', icon: '', validators: {}, } -export const defaultContext: CommunitySectionsContextInterface = { +export const defaultContext: OperatorsSectionsContextInterface = { setActiveSection: (t) => {}, activeSection: 0, - activeItem: communityItem, + activeItem: operatorItem, setActiveItem: (item) => {}, scrollPos: 0, setScrollPos: (scrollPos) => {}, diff --git a/packages/app/src/pages/Community/index.tsx b/packages/app/src/pages/Operators/index.tsx similarity index 65% rename from packages/app/src/pages/Community/index.tsx rename to packages/app/src/pages/Operators/index.tsx index 59baba031d..9d1efbe838 100644 --- a/packages/app/src/pages/Community/index.tsx +++ b/packages/app/src/pages/Operators/index.tsx @@ -7,11 +7,11 @@ import { Page } from 'ui-core/base' import { Entity } from './Entity' import { List } from './List' import { Wrapper } from './Wrappers' -import { CommunitySectionsProvider, useCommunitySections } from './context' +import { OperatorsSectionsProvider, useOperatorsSections } from './context' -export const CommunityInner = ({ page }: PageProps) => { +export const OperatorsInner = ({ page }: PageProps) => { const { t } = useTranslation('app') - const { activeSection } = useCommunitySections() + const { activeSection } = useOperatorsSections() const { key } = page @@ -24,8 +24,8 @@ export const CommunityInner = ({ page }: PageProps) => { ) } -export const Community = (props: PageProps) => ( - <CommunitySectionsProvider> - <CommunityInner {...props} /> - </CommunitySectionsProvider> +export const Operators = (props: PageProps) => ( + <OperatorsSectionsProvider> + <OperatorsInner {...props} /> + </OperatorsSectionsProvider> ) diff --git a/packages/app/src/pages/Community/types.ts b/packages/app/src/pages/Operators/types.ts similarity index 93% rename from packages/app/src/pages/Community/types.ts rename to packages/app/src/pages/Operators/types.ts index 2fe113a490..f4b2097ca1 100644 --- a/packages/app/src/pages/Community/types.ts +++ b/packages/app/src/pages/Operators/types.ts @@ -21,7 +21,7 @@ export interface Item { }> } -export interface CommunitySectionsContextInterface { +export interface OperatorsSectionsContextInterface { setActiveSection: (t: number) => void activeSection: number activeItem: Item diff --git a/packages/locales/src/resources/cn/app.json b/packages/locales/src/resources/cn/app.json index 54321c2e1d..88edf14ef0 100644 --- a/packages/locales/src/resources/cn/app.json +++ b/packages/locales/src/resources/cn/app.json @@ -154,6 +154,7 @@ "notStaking": "无抵押", "notValidAddress": "无效地址", "offline": "连接似乎处于离线状态", + "operators": "验证人实体", "optimalSelection": "最佳选择", "optimalSelectionSubtitle": "选择表现最佳且定期活跃的验证人", "order": "顺序", diff --git a/packages/locales/src/resources/en/app.json b/packages/locales/src/resources/en/app.json index 5a9d6ad6dd..c2bc8dbae5 100644 --- a/packages/locales/src/resources/en/app.json +++ b/packages/locales/src/resources/en/app.json @@ -157,6 +157,7 @@ "notStaking": "Not Staking", "notValidAddress": "Not a valid address", "offline": "Connection appears to be offline", + "operators": "Operators", "optimalSelection": "Optimal Selection", "optimalSelectionSubtitle": "Selects top performing and regularly active validators.", "order": "Order", diff --git a/packages/locales/src/resources/es/app.json b/packages/locales/src/resources/es/app.json index c2e549a235..26a2cad5e3 100644 --- a/packages/locales/src/resources/es/app.json +++ b/packages/locales/src/resources/es/app.json @@ -157,6 +157,7 @@ "notStaking": "Sin Staking", "notValidAddress": "Dirección no válida", "offline": "La conexión parece estar desconectada", + "operators": "Operadores", "optimalSelection": "Selección Óptima", "optimalSelectionSubtitle": "Selecciona validadores de alto rendimiento y regularmente activos.", "order": "Ordenar", From b93b96be6423a1390f122c5ad79c6ee32cd93b2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Feb 2025 12:54:34 +0700 Subject: [PATCH 14/18] deps: bump globals from 15.14.0 to 16.0.0 (#2545) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ross Bulat <ross@jkrb.io> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bbd7d6e6f0..e29dd3783d 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "eslint-plugin-react": "^7.37.4", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-unused-imports": "^4.1.4", - "globals": "^15.13.0", + "globals": "^16.0.0", "prettier": "^3.5.1", "prettier-plugin-organize-imports": "^4.1.0", "sass": "1.77.6", diff --git a/yarn.lock b/yarn.lock index 1718a189e8..bdcc31ff62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8106,10 +8106,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^15.13.0": - version: 15.14.0 - resolution: "globals@npm:15.14.0" - checksum: 10c0/039deb8648bd373b7940c15df9f96ab7508fe92b31bbd39cbd1c1a740bd26db12457aa3e5d211553b234f30e9b1db2fee3683012f543a01a6942c9062857facb +"globals@npm:^16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10c0/8906d5f01838df64a81d6c2a7b7214312e2216cf65c5ed1546dc9a7d0febddf55ffa906cf04efd5b01eec2534d6f14859a89535d1a68241832810e41ef3fd5bb languageName: node linkType: hard @@ -10248,7 +10248,7 @@ __metadata: eslint-plugin-react-hooks: "npm:^5.1.0" eslint-plugin-unused-imports: "npm:^4.1.4" framer-motion: "npm:^12.4.7" - globals: "npm:^15.13.0" + globals: "npm:^16.0.0" i18next: "npm:^24.2.2" prettier: "npm:^3.5.1" prettier-plugin-organize-imports: "npm:^4.1.0" From 70feb0a2ca2a32d8a1e884626b352d7771401e8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Feb 2025 12:55:19 +0700 Subject: [PATCH 15/18] deps: bump the polkadot group across 1 directory with 2 updates (#2537) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/app/package.json | 4 +- yarn.lock | 141 +++++++++++++++++++++++++++----------- 2 files changed, 104 insertions(+), 41 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index ef5296ceda..5db53d41f9 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -22,7 +22,7 @@ "@polkadot-api/merkleize-metadata": "^1.1.12", "@polkadot-api/signers-common": "^0.1.5", "@polkadot-api/substrate-bindings": "^0.11.0", - "@polkadot/util": "^13.3.1", + "@polkadot/util": "^13.4.3", "@polkawatch/ddp-client": "^2.0.20", "@w3ux/extension-assets": "^1.0.0", "@w3ux/factories": "^1.0.0", @@ -40,7 +40,7 @@ "i18next-browser-languagedetector": "^8.0.3", "locales": "workspace:*", "plugin-staking-api": "workspace:*", - "polkadot-api": "^1.8.4", + "polkadot-api": "^1.9.1", "qrcode-generator": "1.4.4", "rc-slider": "^11.1.6", "react-chartjs-2": "^5.2.0", diff --git a/yarn.lock b/yarn.lock index bdcc31ff62..6f00eac710 100644 --- a/yarn.lock +++ b/yarn.lock @@ -247,7 +247,7 @@ __metadata: languageName: node linkType: hard -"@commander-js/extra-typings@npm:^13.0.0": +"@commander-js/extra-typings@npm:^13.1.0": version: 13.1.0 resolution: "@commander-js/extra-typings@npm:13.1.0" peerDependencies: @@ -1551,17 +1551,17 @@ __metadata: languageName: node linkType: hard -"@polkadot-api/cli@npm:0.10.3": - version: 0.10.3 - resolution: "@polkadot-api/cli@npm:0.10.3" +"@polkadot-api/cli@npm:0.11.0": + version: 0.11.0 + resolution: "@polkadot-api/cli@npm:0.11.0" dependencies: - "@commander-js/extra-typings": "npm:^13.0.0" - "@polkadot-api/codegen": "npm:0.12.13" + "@commander-js/extra-typings": "npm:^13.1.0" + "@polkadot-api/codegen": "npm:0.13.0" "@polkadot-api/ink-contracts": "npm:0.2.5" "@polkadot-api/json-rpc-provider": "npm:0.0.4" - "@polkadot-api/known-chains": "npm:0.6.1" + "@polkadot-api/known-chains": "npm:0.7.0" "@polkadot-api/metadata-compatibility": "npm:0.1.15" - "@polkadot-api/observable-client": "npm:0.7.2" + "@polkadot-api/observable-client": "npm:0.8.0" "@polkadot-api/polkadot-sdk-compat": "npm:2.3.1" "@polkadot-api/sm-provider": "npm:0.1.7" "@polkadot-api/smoldot": "npm:0.3.8" @@ -1570,34 +1570,34 @@ __metadata: "@polkadot-api/utils": "npm:0.1.2" "@polkadot-api/wasm-executor": "npm:^0.1.2" "@polkadot-api/ws-provider": "npm:0.3.6" - "@types/node": "npm:^22.10.5" - commander: "npm:^13.0.0" + "@types/node": "npm:^22.13.1" + commander: "npm:^13.1.0" execa: "npm:^9.5.2" fs.promises.exists: "npm:^1.1.4" - ora: "npm:^8.1.1" + ora: "npm:^8.2.0" read-pkg: "npm:^9.0.1" rxjs: "npm:^7.8.1" tsc-prog: "npm:^2.3.0" - tsup: "npm:^8.3.5" + tsup: "npm:^8.3.6" typescript: "npm:^5.7.3" write-package: "npm:^7.1.0" bin: papi: dist/main.js polkadot-api: dist/main.js - checksum: 10c0/ea8414b56f31ae8117d61e9f961e878f5a087435944463ab352bba5c787745325094088ceb89fddb625c579770250e107f57b6c9fbd48f3b76bc658f5480b832 + checksum: 10c0/e73b258f34f88b9aed44ad4884bef081f7aca81795e792f4033c469035e36c8265c47e7a3cc4cddd40659350de3924d97e5b00861f6d837bc576e2fa517ccb9a languageName: node linkType: hard -"@polkadot-api/codegen@npm:0.12.13": - version: 0.12.13 - resolution: "@polkadot-api/codegen@npm:0.12.13" +"@polkadot-api/codegen@npm:0.13.0": + version: 0.13.0 + resolution: "@polkadot-api/codegen@npm:0.13.0" dependencies: "@polkadot-api/ink-contracts": "npm:0.2.5" "@polkadot-api/metadata-builders": "npm:0.10.1" "@polkadot-api/metadata-compatibility": "npm:0.1.15" "@polkadot-api/substrate-bindings": "npm:0.11.0" "@polkadot-api/utils": "npm:0.1.2" - checksum: 10c0/1672284f8472d82c9c6b36024be9df0850baef036d075089631555e9d0526832b96a8f393974fb7b5138d9bdbf65c890b3cc7a75381cdeca5faf387f776d67c7 + checksum: 10c0/e812b574f8b0b365a29ce1e24e40acb2d9a75288ab475751507f74ebece0731537fea727d224cab5e60679be0a1b7f203e0ad42be82681cb85a114dbdc5c6e61 languageName: node linkType: hard @@ -1641,10 +1641,10 @@ __metadata: languageName: node linkType: hard -"@polkadot-api/known-chains@npm:0.6.1": - version: 0.6.1 - resolution: "@polkadot-api/known-chains@npm:0.6.1" - checksum: 10c0/a7cbe7726778ae2c1503b41d5a2fe6f496a961deb25df17b336633d65827eb046651fc829ea8d490f1c7a11cd65b87b1e23009a8b1e6522fe5e4a57e6239422b +"@polkadot-api/known-chains@npm:0.7.0": + version: 0.7.0 + resolution: "@polkadot-api/known-chains@npm:0.7.0" + checksum: 10c0/6eda01a4b0ce68dd6e7f6e0364b9da54dce062d8d7f154c3408a2c7b8a8215b0b2079891f5b5412f9ed352b549e797804f92aa42aea560870b18dd7fa3517c3c languageName: node linkType: hard @@ -1698,9 +1698,9 @@ __metadata: languageName: node linkType: hard -"@polkadot-api/observable-client@npm:0.7.2": - version: 0.7.2 - resolution: "@polkadot-api/observable-client@npm:0.7.2" +"@polkadot-api/observable-client@npm:0.8.0": + version: 0.8.0 + resolution: "@polkadot-api/observable-client@npm:0.8.0" dependencies: "@polkadot-api/metadata-builders": "npm:0.10.1" "@polkadot-api/substrate-bindings": "npm:0.11.0" @@ -1708,7 +1708,7 @@ __metadata: peerDependencies: "@polkadot-api/substrate-client": 0.3.0 rxjs: ">=7.8.0" - checksum: 10c0/165ee1349ad14cd67bfbf64014b3bb6596894bd54090696547f07530dbe3fd9a327aa2cf63abeef4ed32f7fee92d103b7371bf22509a85cabef68c3f76f3f7bf + checksum: 10c0/d586b6e4bdf2bb1b3f93e297ae0884666a8dadae66e43f8d859f1e209fa151c4c7c7cb2e046cc18e45776d9ff29aaca10b1e45fcfc2977e39b9a10ce119ff27a languageName: node linkType: hard @@ -2259,7 +2259,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/util@npm:13.3.1, @polkadot/util@npm:^13.0.2, @polkadot/util@npm:^13.3.1": +"@polkadot/util@npm:13.3.1, @polkadot/util@npm:^13.0.2": version: 13.3.1 resolution: "@polkadot/util@npm:13.3.1" dependencies: @@ -2274,6 +2274,21 @@ __metadata: languageName: node linkType: hard +"@polkadot/util@npm:^13.4.3": + version: 13.4.3 + resolution: "@polkadot/util@npm:13.4.3" + dependencies: + "@polkadot/x-bigint": "npm:13.4.3" + "@polkadot/x-global": "npm:13.4.3" + "@polkadot/x-textdecoder": "npm:13.4.3" + "@polkadot/x-textencoder": "npm:13.4.3" + "@types/bn.js": "npm:^5.1.6" + bn.js: "npm:^5.2.1" + tslib: "npm:^2.8.0" + checksum: 10c0/06798e9799926abcf3b40fff1e659099ca8f8be378a41bda30f12b2cd8f90ce18b8a3feeb735c0cab8c183231cebec5fbbeb26046fa48ca7e825bebed5f79ddc + languageName: node + linkType: hard + "@polkadot/wasm-bridge@npm:7.4.1": version: 7.4.1 resolution: "@polkadot/wasm-bridge@npm:7.4.1" @@ -2374,6 +2389,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-bigint@npm:13.4.3": + version: 13.4.3 + resolution: "@polkadot/x-bigint@npm:13.4.3" + dependencies: + "@polkadot/x-global": "npm:13.4.3" + tslib: "npm:^2.8.0" + checksum: 10c0/133bb54e6020dde4945ddaa685f0714f09930ef1518f8ab3e03a042ab6b892bb3ec882199966c290adbe5dc2b3c6d6312624a8671eb835346df8664c3d2f1773 + languageName: node + linkType: hard + "@polkadot/x-fetch@npm:^13.0.2": version: 13.3.1 resolution: "@polkadot/x-fetch@npm:13.3.1" @@ -2403,6 +2428,15 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-global@npm:13.4.3": + version: 13.4.3 + resolution: "@polkadot/x-global@npm:13.4.3" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10c0/704d0f1f221a7cd3fadc64502a9da133fd438d4931de8e6c0ada04545e25c90759c4a79dec1595623f28c8cc29a3123cbbc0d1932613c174da85d5f1de24dbbe + languageName: node + linkType: hard + "@polkadot/x-randomvalues@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-randomvalues@npm:12.6.2" @@ -2449,6 +2483,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textdecoder@npm:13.4.3": + version: 13.4.3 + resolution: "@polkadot/x-textdecoder@npm:13.4.3" + dependencies: + "@polkadot/x-global": "npm:13.4.3" + tslib: "npm:^2.8.0" + checksum: 10c0/187685b2d125bf22828bd39977941d77ba314af37691f1e86a123fa148a9cd7e0ef4470048d40454eeb8c1830e89d7258bd314b3ee47d6e6557de910d1871b3c + languageName: node + linkType: hard + "@polkadot/x-textencoder@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-textencoder@npm:12.6.2" @@ -2469,6 +2513,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textencoder@npm:13.4.3": + version: 13.4.3 + resolution: "@polkadot/x-textencoder@npm:13.4.3" + dependencies: + "@polkadot/x-global": "npm:13.4.3" + tslib: "npm:^2.8.0" + checksum: 10c0/8c9b2f53142abf3dafd35c6fadf719e84098466e4ac9f4b58f0c7f0cce6aaf4c7a69d6323a708223e10bc439e35b87cd5ed95f507be7745fb23a32a3f52257b2 + languageName: node + linkType: hard + "@polkadot/x-ws@npm:^13.0.2": version: 13.3.1 resolution: "@polkadot/x-ws@npm:13.3.1" @@ -4736,7 +4790,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^22.10.5, @types/node@npm:^22.9.0": +"@types/node@npm:*, @types/node@npm:^22.9.0": version: 22.13.1 resolution: "@types/node@npm:22.13.1" dependencies: @@ -4745,6 +4799,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.13.1": + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" + dependencies: + undici-types: "npm:~6.20.0" + checksum: 10c0/3a234fa7766a3efc382cf81f66f474c26cdab2f54f43f757634c81c0444eb2160c2dabbde9741e4983078a318a88515b65416b5f1ab5478548579d7b3ead1d95 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.3": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -5718,7 +5781,7 @@ __metadata: "@polkadot-api/merkleize-metadata": "npm:^1.1.12" "@polkadot-api/signers-common": "npm:^0.1.5" "@polkadot-api/substrate-bindings": "npm:^0.11.0" - "@polkadot/util": "npm:^13.3.1" + "@polkadot/util": "npm:^13.4.3" "@polkawatch/ddp-client": "npm:^2.0.20" "@w3ux/extension-assets": "npm:^1.0.0" "@w3ux/factories": "npm:^1.0.0" @@ -5736,7 +5799,7 @@ __metadata: i18next-browser-languagedetector: "npm:^8.0.3" locales: "workspace:*" plugin-staking-api: "workspace:*" - polkadot-api: "npm:^1.8.4" + polkadot-api: "npm:^1.9.1" qrcode-generator: "npm:1.4.4" rc-slider: "npm:^11.1.6" react-chartjs-2: "npm:^5.2.0" @@ -6409,7 +6472,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^13.0.0": +"commander@npm:^13.1.0": version: 13.1.0 resolution: "commander@npm:13.1.0" checksum: 10c0/7b8c5544bba704fbe84b7cab2e043df8586d5c114a4c5b607f83ae5060708940ed0b5bd5838cf8ce27539cde265c1cbd59ce3c8c6b017ed3eec8943e3a415164 @@ -9870,7 +9933,7 @@ __metadata: languageName: node linkType: hard -"ora@npm:^8.1.1": +"ora@npm:^8.2.0": version: 8.2.0 resolution: "ora@npm:8.2.0" dependencies: @@ -10183,18 +10246,18 @@ __metadata: languageName: node linkType: hard -"polkadot-api@npm:^1.8.4": - version: 1.8.4 - resolution: "polkadot-api@npm:1.8.4" +"polkadot-api@npm:^1.9.1": + version: 1.9.1 + resolution: "polkadot-api@npm:1.9.1" dependencies: - "@polkadot-api/cli": "npm:0.10.3" + "@polkadot-api/cli": "npm:0.11.0" "@polkadot-api/ink-contracts": "npm:0.2.5" "@polkadot-api/json-rpc-provider": "npm:0.0.4" - "@polkadot-api/known-chains": "npm:0.6.1" + "@polkadot-api/known-chains": "npm:0.7.0" "@polkadot-api/logs-provider": "npm:0.0.6" "@polkadot-api/metadata-builders": "npm:0.10.1" "@polkadot-api/metadata-compatibility": "npm:0.1.15" - "@polkadot-api/observable-client": "npm:0.7.2" + "@polkadot-api/observable-client": "npm:0.8.0" "@polkadot-api/pjs-signer": "npm:0.6.4" "@polkadot-api/polkadot-sdk-compat": "npm:2.3.1" "@polkadot-api/polkadot-signer": "npm:0.1.6" @@ -10211,7 +10274,7 @@ __metadata: bin: papi: bin/cli.mjs polkadot-api: bin/cli.mjs - checksum: 10c0/f9f8d8edd761cd986c1b431b523cd0f604d7cf84a0d3a48e2b91e6e4862f6ede5eef2fd8c89fa9d803d5d121ddbe4b98b9b57a05f07f28952373db34f1a57543 + checksum: 10c0/3d1a7c1b904e8f5760e44456cc035579790cbb088718f63ce995ff5de5722d1062e697c0346b0ee50cb15d73b75c90e35c507b6fb3f5833647a12811cee73592 languageName: node linkType: hard @@ -12357,7 +12420,7 @@ __metadata: languageName: node linkType: hard -"tsup@npm:^8.3.5": +"tsup@npm:^8.3.6": version: 8.3.6 resolution: "tsup@npm:8.3.6" dependencies: From 640cdd3ed37fd75ab5fce2ec471d4b46c4fe428f Mon Sep 17 00:00:00 2001 From: Ross Bulat <ross@jkrb.io> Date: Mon, 24 Feb 2025 13:33:54 +0700 Subject: [PATCH 16/18] chore: favicon update --- .../app/public/favicons/apple-touch-icon.png | Bin 3597 -> 1811 bytes .../app/public/favicons/favicon-96x96.png | Bin 2389 -> 1011 bytes packages/app/public/favicons/favicon.ico | Bin 15086 -> 15086 bytes packages/app/public/favicons/favicon.svg | 2 +- .../favicons/web-app-manifest-192x192.png | Bin 3911 -> 2267 bytes .../favicons/web-app-manifest-512x512.png | Bin 14719 -> 9470 bytes packages/app/public/site.webmanifest | 4 ++-- packages/app/src/library/SideMenu/Wrapper.ts | 2 +- packages/assets/src/svg/icons/cloud.svg | 2 +- 9 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/app/public/favicons/apple-touch-icon.png b/packages/app/public/favicons/apple-touch-icon.png index 1b7cc3c00790c199e07905e0b85d32d9af1e0e0e..110e8aaeb36ce15c05c0e68b7b7472a183a98e29 100644 GIT binary patch literal 1811 zcmdT_`#aMM9R7YcHkY{_Qj@vlkyAn<%iK1XBhl)Rx!-b{MVT3jim!y+ic>Tc^EjgB zQs<1FCUQzhE{l=7$0cSn<#7$=?EC@e59o*Y^26u->3yEhn{k%ttRSZ$2LOPA%SlIf ziL(EL3_`*--H2ln0qO3}_CRfq<^lj9x?LOz=dK2d$8DnbTPmkb<*7<{74|<@eGmg% zI2`8^_659-U@fvb401a&Le0E-@EHP_zPDPp9g3`xqhzA$C5}$(53<V=gJCZW-hYZ7 zUOoWkNf7~~K9^2!eSo5KQbJGS+)+$ZoqT{<G2&thwL#}#P(irCTR;QuE(`cReWV7b zpnjA?r1-k8b#3kR_$>dQ0sakH$U-<dz0@nbr+#H6l4iHN@npG<+L-<B>-IoU$-{0^ z60y!Cr?z3@F1UKTN#0vKGO-z-h<LOu*8w(LIpOE!Mo%Q7TDOg939;`wo79z=NEk-< z^L|~#R#i=<>@&10SCLoPdCFnp<<4LT90y;0!x>$gnzNWe&0t1^Kf?rCkF6ahj)bj$ z^VoaEHQ~PRxGqGz<a3%4deNw65F!FLyF2BEvHcIC3azLbenahu)jap`HceMldHbr+ zK0yjx1$iM(iVV*{FqXmc41#QV!;{*tI@SWw$C(>Zp8L$=@+%X{Wds;Z9Sy6u7Nnn9 z1vWVm<QblvRiFvv>UTYlsW1rwnh?I1oo9wr92X9%@FD`dnq{qT`CTYMth!eEX&$%8 zOWIsp%e}Udq|Gxiav!4-2P&VPf^$VU(!AGJeO({4#Jw}{bx(}gN~=4C9Ghsx;5W~F zu%?jacMZfv?TYa{QLjn+Wb17^xN@R)`QUu92X)hZB4}kuR~k2sdX)<D)n4O5o!6K( zNyu`$dkJ@{<L}g}vpJ<oRp}y{m#;`O07KEyMjqP;sPFkO03o7{Kd@)OM+IJejl+h- z%!pj<$F1XkZ|~9QO4)R?b*aIo)e<;6C&K=0Nmc?@q2z`w<~K-%Tq?&KR<SLGR6?0L zW@q4nE?{QL+RyZCZeb-DLx!fJ$aA2*ra%qqLH+)#o|z<!jQNEb+#^H%!vP#O^FF$P zikyA3dA=g7WlU=QKM#!S1(W8r%Fq}|orJ$|8#3JjWxN5RTljFFcQWVW=BwL=>qn3* zI#`C*_IaNfAZ5;?r&YgBPe_;8Nf~ug;n(GojjAk&Jl3K1X*TLEtKO2*reL6f<f5om zpv~D(KieDw{u~pHHD9<!xGYz+`;(I@y}A<~?!oKo9br1eRwR7~cw22<hDW}#Tp<f8 z=R2}M)5eXklA38d=N<CIQ-deoXI8`JAC{zztUNs4+EuqI9AIW~0ybc?1TzQG^f<{U zBc0*qMZt5Vapxj#&}9Vc*@dJ_HgSxbbH(-^uEw@q2^=`jc%=54${?M6h@wU8OKoHw z!*f2;7cwgd={?W;b;VaAXa!c7$9hQS=$lJTv0;iumRuWtpJ5Eepf`q{;+vR8UZf!D zRcu*aHb%@W_<sIEQ_f->JDH2-Rrg(n8eZz6GKxM&KRd+%U$pM{Ynrpz7Lg)a`3Xv# zHJjjPhZDlgxBH5!T&sH`@n#8vvW8}Kwyb*7A%Ci#(yoYUT#sw?DGN0u)FgBH!bL@M zY{puO@e5p|6vj9+pGzF7Fm04p5N_f9>~66Qb+OpgQRCcvuGWzL{M_1o{}jc&odqRS ze#nKAz<_Ek)wM6tN<|oDCAWs4l=Q;*mCmOiW?nc@isd9Wj&<b6w=Qlyjw+QWi=ub= zSNEGf4J^Z&*tP_Y^?K1Q>S(H86fH?X106KV09g~Q9*eiOERO9Ly$?BKJw5yzzAj9S zw6rN_cy-JOZR(ui;oNd>rLZ_4iyy2{_$)tlahXw+x41odn)oR^LXqu{JR~>`gAliV g<PZFRbFw2nqX0V^qI~eaWaR)CC!%AmeelhH0TwhJ&j0`b literal 3597 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 diff --git a/packages/app/public/favicons/favicon-96x96.png b/packages/app/public/favicons/favicon-96x96.png index 44f6a6febf5d1b3daec7835d2e3592906d31f5e7..583ff3c3fbf4832691c91bdcd3b0ddd41baa6ca4 100644 GIT binary patch delta 977 zcmV;?11|j467vU;Fn<HBNkl<ZcwX(DO_I|v5QQc7oC7wg$_<!YielJ6HVnn3FgHk5 zHgFF1c#tJ0wqr*vxuuqzm(|py-E!Wi?$)0Zt?&|6K#R7H#uWevcLD$a0AU4$n@0oy zfUp9>%_9N;Kv)6c<`Dq^Agq9J^N0WdNTa~-cOT!r|MTN-8h`J6UaOCQ^ZxT!D@Xf5 zDfQ%$rg65%-RZmgn@`LbPgMf2qLT#oY0@aAe<}5^kpfZ;07lW5pfpOg*(0M008acb zzV6KQepV1g1IR4=gr7d{PTyR8VM06Orbqzi{ii3T^v`r3o9wySon8)P>j=Z*0Lb?G zSp}1(q@n;6D1ZKdNSc&X41lu5?>V#w?%`??0O}CmLfD;NST$pH7Eyy#K?Rq3`>cgo z6hMXIJ4k%>Kp4QY8EX30Z>T*pvmFlvF#t8?{duw#1E@FkOi`?dAQA!Rea)$72%$m% z+v)v1h;<OMN5FP^f8hXZPdBeOlTl8aYgswlsA$dPjDIZx23v!h6WB*m48S9cK86xs z2cjYX!t)JBg8|e(f$}AksQ07ShsXdR{CzO7b$|o_;`^f_832gy7k|w@!QBYh-lT~p zW{eek1fb`KVPFLS@x#PtO+njREDIMi<_fk5K;Dm$KYp`*RD_Xw;>7>It;#bIJMW*{ z=v#Q~3xA_e&s`z_y`QBA1%ns>K<{TkV4aXbbO12&VU&L4%D+tQ0BmKGJe82E{N9a* z9sr8(Dvc=@&qsqs`k{!&WpjJFT4VIXB`(d+bjGYP^Q8&LXEjbm0KlhgfTt@200@wc z)3i@T1^`AtoXV1Y*(d-2vS93n-2xr}u<J^9Xn)cWY5-lY1eW>;010HJyX*jTU;XlM z2WsgeCADk-AgR7y=LSGAUyR|s+btSkHB^|Y1Asap#G%2Cn2_?WSqs3tup}WuVh8|f zC_jSsFgciog}J;CZU7((G6JxRanlAdGtPy;El1Bahk~3Q!ev8d9sp*?X%P&zB$paO zDt}6bV04n&^NbjZGCzj#*&y#@s)z(m1h=Q-ya4Ph88u-&hJ~YvRL2g2*|@3nOZKRr zG=<&rDQQv!3~vb_f&h7+69@)yUA#kqzK_EHY=F5w8o(7qS09j?E;MMu_vWhsETpIY z-w#kP^wECUxZj~+1+Wy7<|n0sGH1cY+)6)<l?6b-dWzo~00<)h000nHK)88C000Op zAly76004v)5N;k3006=Y2se)i003bHgqwc_`uKhQli_6(00000NkvXXu0mjfQp&Z; literal 2389 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 V9v7sskiUNtV0ppTwBfv0;=gq2NEZMA diff --git a/packages/app/public/favicons/favicon.ico b/packages/app/public/favicons/favicon.ico index 6a56b3768edf52cbb6cd40d0326eb0b3f42ae397..1737cf09bbe7caf5f259d68d98dfef43dc30e5f8 100644 GIT binary patch literal 15086 zcmeHNJ8s)R5FJ4QT*^1FngBr>Nlk!M@f~u3AXVCQmJ`6Ne1TjdI)!+G6p_;g$_-qq z2+X{<+JRRD|KgI|fCNUf+z;o?+b@R_naEU@OM#xt_m?7XL}Wg<_m?8Sk#`Br@=q^B z?or_t>Y#~yfG~f&Mg~R(Mg~G;V7>bBn(}4!@P55`_}YcgmP%93ZkD_2^>Vj`Bz?>6 zau-$gV@SBuyp{RE@^qV_-RJob0(Rw+W5gX#Az`;ZY+d~7S4dj>AVBWTdZ_atB+gS< zx1n;ceuR!6ehgxNRX*$J(7FFl@CP}5$UXP3P{+USy&>XP?&*U)EBAiBue$E&nL+ud z4x|rG&TB6Iq4$A{H7`BnKFGtI&aXNKyRMhUnRh?bag>KQE8qGss68zUXIb8m&K6}@ zi^{DZz4eE?R~6x`TE_9!<veK{zxvsg4{Fbc_PuBL;$FG%-3MyNr?&IE_46OO@rm1g zcH2Jq9ycy_O}FJkm%J->)%4*EKel~hS0AWr`Y{;Xt`C~l?@s#dNxum(U+au|WME`q zWFSNa5_5@E))BnC6M3SuS0V@M3z0|asmPvsA`-hA>4^8ZBJ*4G2hTGXo`0fYH(~~G z7!6!8@1gf8ZSW!gugy<XvjF)C3y_)6F{>xkkfV-dYVKpXFnTXDqYv`V=w!mWm3g$h z^M6`%$TejApB6|MuUZV;E_NR&>($S1Z3v%rv-q_t198SVwd%W4=DE=KJ7YRFNk3gK z(&b&;t9{?^`+2^QgRXf`VHv`A_TFN6ef7K32YvdUaO`!k-ej&zI{*8yueP1}pNY}w zr&h|-cGZ4Y92CVdx|j<^_Q{2B3}yC-fpvW0sA8WO^kRKGHd<LH^tpAl<>cHsu&ry? zt$*$usmr}<ThmQ3v|+m`hBj?020I=K$0WJ(VOud!^E|ERbUmw6yLHC&$UqST$GF1t zFTxcwgf6Br!UmKmzcHgHQ<TprF=T&iJ42}BDv2O5WREb$queD2gfN~io(<U);}n;W zIV6NQ#qHwZGxo;~<WGsP&Ia$!Z{eD`ny#O0*R(A#aNpuuRk&W+daUb1&a%&Sw4whe zdv1egoU~^rI%|I^pR{K>KIf;5>$3gBV#(~UGTSaBXH0KQ+8MKMy*|^&7%1YfSaqT- VAc)~ckQj2HAcp%iJH}br_8*1lJb(ZI literal 15086 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 Hl%oFtt>3pH diff --git a/packages/app/public/favicons/favicon.svg b/packages/app/public/favicons/favicon.svg index 8c6206cb38..0b3b1626aa 100644 --- a/packages/app/public/favicons/favicon.svg +++ b/packages/app/public/favicons/favicon.svg @@ -1,3 +1,3 @@ -<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="692" height="441" viewBox="0 0 692 441"><image width="692" height="441" xlink:href="data:image/png;base64,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"></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } } +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="378.347" height="277.511"><svg id="SvgjsSvg1016" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 378.347 277.511"><g id="SvgjsG1015"><path d="M101.823,277.427h193.175c.516.055,1.042.084,1.573.084,18.707,0,42.282-4.452,59.645-21.816,29.507-29.507,29.507-77.349-.001-106.856-9.721-9.721-21.451-16.245-33.849-19.561,2.595-25.294,2.868-56.004-15.812-82.754C271.536-3.619,201.93-14.768,151.271,20.61c-9.877,6.898-20.247,17.556-28.466,29.094-5.199,7.298-10.06,15.68-13.263,24.365-2.55-.191-5.124-.289-7.719-.289C45.588,73.78,0,119.368,0,175.603s45.588,101.824,101.823,101.824Z" style="fill:#d33079; fill-rule:evenodd;"></path></g></svg><style>@media (prefers-color-scheme: light) { :root { filter: none; } } @media (prefers-color-scheme: dark) { :root { filter: none; } } </style></svg> \ No newline at end of file diff --git a/packages/app/public/favicons/web-app-manifest-192x192.png b/packages/app/public/favicons/web-app-manifest-192x192.png index 1af1c8212192fdaf0ba1e14c155080f027057895..70cead6b36bfc97a7c613db0a25ceef3bb88ca39 100644 GIT binary patch literal 2267 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 VPs(gD<;#C7;9%!uTfBpr@ITh*)ztt1 literal 3911 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 UB-6cn<%|JMRb7<|Wt-6d14l10GXMYp diff --git a/packages/app/public/favicons/web-app-manifest-512x512.png b/packages/app/public/favicons/web-app-manifest-512x512.png index 4a4b49b3ce4c96de03d367c3e408b32c6851b1d5..f7fa03f81409dd4d7f01028458f4ca53ad423228 100644 GIT binary patch literal 9470 zcmeG?`6E>8-_JSDFpOmok#JN(39Tq`Dp9hPkV>Z8zTsB3!klSSH$@RDG55CUlI2Rc z5$Coj=~^lg$&j_|gu%?b&zbuE5AP4xFEi&kpMC#4<AS@Zqmsf51pt83`gQi306^ha z6fkAs$4Kb=3HX5=+vK<!WL3`W1^@@^?N@CM-O=0hm;W5ckYxfPFp_PlzG?MGay_ZG zs`xY`T=nwWb!0a67zh;<*YR8XXDRmRKH%Gvw?eh8eWGMro|Dm^YabN8zna{gWgC=U z`S3!iq|Vv9_E;sqIjc`w++F9#6@3@zBPhmX<L*uZH<bAE#5PmubEpvx_G3TZxD&v5 z%kd3!2@)VEO6uX#FAN4oo?2V5TMC1NuAgN717_p@S>wOh`2Ub8)msI9X^k<;VPg|x zlCdVY06kGa1-G#9vCV<y)BPexTY@T1nw8k}Mi}XSy2zY1jSUnuo36?~P_;^VpQt_& zB@s=0iJQFfB|o(4MeRO)#)Vy5td?%iOFF%at>r=ht;}CKHsFLH^b~jUSw_h1CPV9* zY@Z2H;6UrQ#6!w0E3tc!<UP}jwW?OW0&#g{o4TlbzU|B%;ls8}(-n+h`N}K94c9S@ zyq<nw0p`lSANrJg`Gwg($5x9cqfwNK_IxxKRlySC#EOl=jb~T(u?zRG4gHh#P?S&! z+ND<SLwQE75Paz)EvhTuUpdNT0_(3FP3#79X7)(Nr;316!DXv1@1!2e?Bj<W*oq+d zkps@r)B)6WBF(yYFumQ2cZ;`jx9;NA1UT=$OqN%M_H|pzHicSMDIUf~M$I6f>A|Pf zwipQxa&K*GE9z0OKd5u)A_;QVR-Kf`m{#3#c)!INJVz#d%`y!(xN&s37B3ieo$56` zsaM|1OPMH(bRs~tK6X{!YS3u@x@X<>8vD<8yWfNf^6wdCf`5rr=jyyvy*!H<?S5C- zX$;=@?V9gwCU~A&OssIJQc>*1zU3IPn83&*%z&2<NgrA1xbj95xpBUwxR^l>9@@`1 z4QZ=*<?y=|&{fsvgs}YVmqmGKg??Muq$q<@Ra$z3#4WbID7%#nEc|=lgyX#Sbjj$% zUcUCtg8|4Yeh8yO-wz~}mU-20q=LDQQ}X9_=uO)${y@E`ZO1bHI&&BrBLBCfswHUt zWSYsIv9t9`T{}*hz#if3<8|??i6Ff+O<cT-g$#eluX~M=JBG?`ZK6CS@q1hz8Lz@U zt<R-I1B>HAXWNTphS>Dl{e>z9e1}_OJMMy<f}AgI=7MzYgj$*}ACJvnvc}mNX#L?l z_xeW4lUtVl{$?E8J-Z{*%M|2YJ)XP?EvfTM|Fp(*bf}}DjuCZ#bIN)J5O#3q+|$hZ zA^kh<jI;xmd`^v}sSl_pJ2Ssy{@GlcPfsE}0$RLmqDi)e^Pi91HiNDmsJhlFN+ecI z-+kE;F(Ay7XW=0EkG7?E8Ha_5W|EwX)6sJaeCwYxNQ;9qmy88%cE8lV5gH2u<h#zM zVHgmt5~w0Z+{}d+$pGe?P38ID*r4IW@`gF6t2l1j+eNm_LPNf`o&pn`I7P`o$OQ{C zAp1jm>M}QgEu9^{aSG!%n(v%_WV!-5Ay9#x^&UQOlZ-3%x<89!#CN)zx+4wnRhToC z<&3yT++7IfeXl{gEN@UP)6Phqswg0QfC2w-ck_bn;J&ZqZN`{fgi~U3D_5P3e$77x z+zUqAy~P#Nn-eSn!BJ(S2S<6p{b66b_mRfZa25!~aqRsed4#{?--_(|a_NyhWKuf= zB{EMW`eo`1O`1`VqB`*KpP;Sw;J(MVq4_~W=J3pQ8XI*zGh=EGN(mTCMDMWVDYs)o z^H69<j(7(fbY%Z3)L1S|3_!qqEWyq&JZ!l3w~!MR#xSXkuPv(bgeJ<UFTOynKvWo& zO-z*f^nJmT<#r<;kEb-7*AdM9*!2Mmlz93_(k30mZsc8A%|>RZ9;Z?d(tdDA=qb$N z3N=BsJ2ecH7OLwyfpwb|Jr2wklyG$%9Ss8g2xd~YK1K=;ZauNqReZN1U~mNs;_nj( zp0U6`f^&^-)Ee&O$K{K7x5-YVqnm+nQnn`eU5FCDE&wEs7~sqkojWn|7EjmKf%?FW zez=ioil)dV-B!U!>#ti*X#Ajh3$szFmM>|^L5VfaQNK+O9E!2DoP|`$ys42vshL5h zMG9l0iiFQk)tQAFv3#b^JscdShCh^`kv(bIr8V-Vs6QjRQ4XaFAI)ERY@37@wHynd zkNd20O}-2QXT>MBs}4j+Y#v#tqZi3-$S&wai@i-wRSh4w-9y{LHz7q}J!|-R9!3rx z^g2<NFWvxSK%G_3Shqdd@!nhz?fo!!asGF|{1Hvt^Q0UqXYxMa-84{^?%n;dVZz)u z@}j=IU^ul@XZO8(CZLOFfE^a8Y@8c6M{tNI^PL11?tjg5t5p$i&MJ8nGgrW)7S4l2 zH>SOPc>KE`beA0;5`AfW16VlRdR_Upy!3GQg782nm5^l&+OjuxYyaf3g)$?=t@1#4 zXmjwnEHP~rBh?&MY*8#q^i9O4+{%!=Z7&#?$EM7PzF7+3?{6N#!9U^D2Z}%#YaVFJ zboqGQT9~-t$yqmJ&U8FrBZDk{WU^v00uy0D_-aH&rei@mh%H!VxUZwlFSkc?<=<o! za!hjzc;%Cr`%n$MrrByjwhs$YqVjQk^0hc_dG5C3s<gxk3qV`O`j6W3V9$nt76xXc zn3VkrB}#6@CtvviW`GnRLmJz_EAP0gi`9TrLen1?<qMT!GXyA+bs|3b-==Sk&w9VR zlt0?Ggy)0?BS$?UuxHHGhrfQO#qovn@hi{c2=2Yosj@6UoM>9KcDhEO4(`^%AZ;EQ zTdR9Z3@iL=&N6z?Hj@$%o2F^Fuk~x`?vD!|=aBGm93@h=#^1b<AvtPTz(M=5PqMFS zm?&|1x%1MC?SG0dW>oB}n*(e%v@xXZ_h`H)c(pO=_`@x(tuMJDc2B~_?D{2=rqqF^ zZ(|bCdv1lMVDihYu@aA%{veFmrU_+njKIj5L0!u(epw%3UCteEc74<Ibteb)#B3$P zqInx!id^Yd+TeEB`XBSgzO0hQ#^tjRv=bU4Fr`i}TN8}ByBu{knwoRgLJ7shxL_F} zxyJ?*b^MQt3F_is=QoSK?|q<bPg2UTA}HVAr?&}Mshhs5h#BiiJQ86v<$P`7bQE({ z9hga(I88or0QFVD1+(=FMsJOT%ns(Da5J%yW0O<Q*(l*BiE|8jYj^!MOP;M|FL+^T zu3}yiY5nSO=goT{w(y=_>xS(!J!TV}hh!&MrtZHSw(ko8sg^|z%`a;=%Clb?;$S2* z3RKrgZr6yG`2X=sk^+JnpeZuUo#HkeCF~|uX0I4DGCpO(#;ey7pzEpF-yPw{JvkzF z9XMx5;MYhwWb)b?z|0S6RgtxviJ*TnY~-r5ZBQcii8_~^x0A`%f^$HZw;6&{pI3^( z?lo-O;sNQ0^>{2tIF4gK`teKEnK$5y^@SD6&T&&>kh-6ajP;XWV=<=ld?=$yCaA7& z3g+%|kAm8qKoGv$1qSKRmo=fYYPlkUwqxNMId0_)@=~Acln(Ob7T^t`CGyp2aM)1l z%b&Cqgw2OrTBJJkMBXWo^R}s+YnWW13P(5|398c!F>-O!5n-x)M?2gItyWP1NHY0; z+z_R-`B@WH)X*ll>m?h&F3GFyx{Fd5VqL{XtHZP*O)uv7Jb^;qr2tisg5<TA{`IW* z7SzNDPGm;-(#Q*70K1<dE^F!tgp@<=;kXr`ga}lR8A-<XE`gyF1VtQgV1ZPNkfE3W z``K!^`!*^YDXa4Xp`6H*qAx9d-*1jPX<dOt&(g51EHL)w*3=iB>hqA|7C1wW+p>Xj z)M+Ep7o95ltk4_>&&SpXK~C~iKz2ZD`=xdC{;H2n%?u1*9Ip&q#e+)w?4e5G&^71# zFXkdtoOtlxz4VdITpHP-90=O<oA*1+AxO#t&OqVZcovQ4@&gFYKQ>11#ifY~pifv3 zfIC7sf(89@wl(afu{ubesyd{Y4fkf^4hh(QiXtB@LIjECC70@!LY<*4=RjLNe?PL; z5GDP_4>c@Sb|3+-12Q`HcAtt>1PC1B=F1h+VmHxBt2yfen?e0%cd0-#5QKB7A%DzS z2Qn&HdM-pAC-6;BmG_Z$AL0?J+^*zGG}M{50OpwHlc4@vW?=kr^J9krGst@cj^?f3 z(^#OSZ+f%6l%N;FRSwM%2>Vm#f%*x%Ql$7a<g88GcAhh>&6k@mY0K`136po#Mr7rI zfiaPrd7-x&<a`^d=y%NoB`3v$mv+%c%!4ep9!v>-&>}--O5Q2-dP3w^rqHt9`?{o- zwUF}FLlZ6QqF~`#soa|s!&KA(pT_FmLD(cms7-cz4npY*F9c}9s317zP;2v#FJo5h z207pLn~kLuQlN$@k5g?&V-d<jGI;41nthMSfUv5$H!Sp}_zV?@P_?DD&=piT?MIg= z1*!j~fc7v-RbT7JEZhtR1b*SCrBQa0HNJs7$x;z3k{J?PrC&DF6c^y2XMs&94VEgq za31vGs3seXYU){m!ioNOGaU?}ug{RF$Ypo&7p?A8BygzzotE@89-7BcG-!nq`XRTW zA|w?61xfW<rwg`=#ttaZXZR*68#o-4*d~DLmreJf1#pfW|B%WZC6Fa98a?}uJR4`5 z<%H{SgmDzCaoV=QFAxU#n`gmZDBYatY}rwB_t!x1l`DCw!-KxN%`{b!H<R=z=4B>< z>JRT~AVq@Xi0tI+`a?KxNrOiH6?kTGo5XXTq<5oaucUWv5C*AjR%K%!yqEie!0)9c zNuSrlI7&xPQNn9(8c^U=KcXM%0C>#|jQ6g{z!QRTPqY+Yg-o#&%>ngiZj*Q9q0|xa zP-cSvh-42G-Uro>8)wGQAaCWFDA#oT4ZxYSYwCP)hL+(Pg!$DP##E!kBcjao9EAH5 zQXgwyuL^$7@NtiKI$x&oJK#90hLJ^e1yPOPZiYR6?IhJqi}!jJe^ME0vD4OQt`n5c zgpq!Z>_ez$T#v{U)88QO8u`tNh_4Lv>hHGtb2mVkKN)6Owkx)O4qy6xM!&f$F!nge zf{p~dPHf&;G7F(bCC4(mN@04DgbJ_X=C@}rYWKwa{;aG=6WECKy>`jK5=v4EypO4@ zE=}-B;#YI&^J+S4e@7Qbk^Tr3BRMmg^N&=-yVL^%{x%RO;qEayp#xQ6o?*SwLLb9a zk~}+EN77Eu*~rOfR~v#tN$FoKSjHjLW9FM_KY)rxGFM4$%A-sT_!}Ul(p7THF`CkG z^`w>%^r;LvDQTLhrD#&s?wk=eTMr5qP#>YZmKMsF;h>DPAe2aw_2gh6L}Twawis$w zW~zWbiDi#X)GS)}KJ+&90RQB-B$_=l+RUQWQf9RbDF++_ejPTVL0)1GC-v|pAQV)~ zMbS`uHMDxY;KX>yXzO$u=?p9S_<RU3E=z=(&xoZ#PB9$*)?m*7;WBt3OUY3x59Yu` zP$Kbzg)xov#?<2JFxZJumSC@c(4pBhrzrGe2=Wvq1HgD73@4H><n<H*l(_4k=S3^P z)Oa<O2@pI_LlIU`1g*t#KPxa{Z9}(Ywr3{Nj5T==3Q)MT!9a#j!J4lMS!_)(B}-K{ zwGYsiiuJ<3n867v-`6>s2HC6jDxZaeH}8EvNPT&Lk=u(h!GUcro=Y9MjOPqRpbj_f zS@{$FofO^WC;GHkxh%FC5cii#ItTP61LliA)ZCykNy-QH2}UsT;p>hUG%CR<BF^~& zgmY3?m(E()7z|@~PA7m>#_k=?Qh6Jg;o{+tBg%P0#s-LhD-o3{ON23!$47trEL9lm zQ16P+!RLTbW?)I#qgk|3>gQHZE`zg9X5?oVDG@K$NU;(Q9+=&<qze$>9YI$H$S^_U z!Oo^1ay%lc8lg^KbHirSVzBGYs=qBG)`2adk;2x-UZ=|t3%;1E-W8-nfTRakOr?G= zQ<FYxWw^abkiMVR^(*~8=ZfhC`We2bpS3a^|Mxy=Iry|g5?XjtwD)PQkJ=ArbF05t zlR3K35ZjK0TGD547O+J#VL*l0`RLNminG`eG@&~So#SZ29hynYK(VN$wxxG0yCW;5 zmQF;#yN1?OA!mBQrza&VKkaCKuzPSBtqpEbK+}rIl$H>t%{;ac=hQ1xxm&p^L>-;p zFs2!^Qe~J*phV$*FP&v13HWkSuL0gk^j#kqpG(@((T|`ptm5&G_LdiQ=4;Nc4nW4| z66;))q@i+J!9G$QikY|G`KDA%bttCk-60oJIOD@_G&TM$;=MPrCInz)uu|(fsc>mj z9zuB|orkw%NHcI5`c4+8p!o;bjs~=7)^G%{{&tXVqHtnc&nulQ;Mz{T@RQW`Iki-Q zP-V{8jTut^$ZA6S!e>F{k|3!YJvm>2z?$?u`I2rS1cw8gsG#-wa;e?7%(n;vaL{hZ zAF!pNlY9jMk}0>S(y7VPj}g~>_0a8J?bc+|p+kUvt>w;{&;?b9V*Ryy(%>wDw^K#x zI#SNeHuWT10QaHn?l<RY)hFOf(IJkkRA_uV-yU)zLjAO*#o#K-d9ncLJ)T@f47n~@ zNmFNPz`3ahJu`YuS}yUwVMZ1c_oRga8)d_nnl=T<=zfEjaMl968tiB3)>zc*Uy6lt zgZyRAyl=p1cCp+4w+m=5s+fjwe7ep3!gX>vr)jqW-UHN7hHL~rjWxxzL2)PkZUA?m z^e544XjOa|W&v3$)4dZ7-fcL>;`n6xlCd{*&d@qtRj`kc;rK+RgMrZ~@2G<2Qm3t& z?`WSP=%hlt5@2OSA!A3(9Hmt<8NK3%I2Xv|IKMI@D$AD4mwLn-A3`WNq?u7AN*!HN zaXknyV8N-Z{0ZTS4~e-Ay1-BV)1#L&lckL1?VBZTIw0YK(20}Vw?tP;$^}0$X%_@? zSUKBLtu1Jm&VduY-n8dtM6UAEA24h22{HGpF1hDuFcRFoSWepBcB3d|r0~mh+$Zsd zGL5%Hqw6nGYNQ-o)ZghHv!JQ3Glnzn#%ZO>NjbY*q{)1PIZ`jy|3yx4|C<*PXM2n- z1)Ed-?JM^_fY$@|x`*b``c&HshB_t!e+~NBwxv^VPHn18r2kMblA=D;ERDfAyd8~_ zHNC(z?h(sk)3%%RYQnTJtUfl$Ed)8v^)ftLcbbmHX`-rEVjx2;I#7V_-5+rXdXMns z>2aqze;;+P0yB;Jy@)22OV?lmb7Xm+8zs;BKs_VrcTpx?OoJFFY^Opt>mQX9SPA_~ z#`FEhwpi1w6is4VzH+;uO@{m#iXSKE!Xn9gi)v?yqf|fz8a|&t()p?tifR#0BxFcT zP%4+%te}-HaiMG69!BnVk()Y5I2)?R@98XmN&}uD?qx{+MB$Cnxh`%Ty$ty9oV_I; z3{WK#FLL&=f_&eyb{9>gnt@O~T(pnEAe#Foys=gSV__H=+HKRM#mGaov&CsjAVqH7 zq_xFDC~ds@tI+RuN5Fs$@pn}sgC6zo5+5Kp8Im14^pLX&n#y=~tgy{40<h87;gzQG zP|9vB*I%Un`#JG0BF(F@ijg|69q#zhH>>f<TJ8m1a+iT<d*H={U`5)Ap{|0~uMeNK z|La}#<iRA@{4W_CJKn!oI`?S*Z|<4+o}d6WEbYPW^siTkDpEP<?874cUn>}(RMn!V z^YwG6QtVdFoj3{VV+KqwYNDIC=cH5H8in25uM&fU<p9SNg&!9kfK2abXtkF}BB)$M za9(ho%u6*=haI0{qqmQU5+h^<9!+yF#X;@G>uFeZt?zAqquQifP^>=7Y3%Ps2K1?> zR{Nwl#vq}T5vcFLTqp8bY)v1lYKhtc<OJ%ObFe$Y@au5Iz}_lEk3N^A;k|%~9I)fe zg{_kpjn1|mGzZBw>x0qCA1m%O)ui^eeobnzQqdHrS`F*lQEKwGAwfDh#K=caJulTI zuSFcO<osBkIcmI*uHs-&x!>79plE6ibBnS^7ay5yHoq7Js`hUxz<v^T#x1^;H!D-G zJMwgL)G8b4=sr&=HV<<zHz-rbR>w?*82luP|4p2YgM2QzbR|#@L;x%$#3G)y{^-f* zdS&8t$3vZJP-8&5(ue;R(j>m@RmWzWUJmabuv1w2ttohWFk=I=9;r2e{>X`=j+RPb zr=knmic7I$IsQn`W}Q_Wqb*VN$}*exo407J8zUVqjnwbN;IAUODKLEYDQqtJIvrFV zPRKN$j^-<zu!Gban43%CVZ%txM@Lnxa_+D!wDuC!z*>o;Ljkyv_aRIU9uE&4gvW<f zlZ2h&1%*toZDd)=m?(8d$@k84mdj79fP`!fIYpB05;jl^_fNocrcO?ZCMDmbKSw{9 z9@uL4uPd<n*QCw!6v2GB3bv)q)CEcLQw7i&cD8t;=?E|NbG<6FW*KzsZI;zwb_O5h zR4(Z84Q4#OuLN(F2sGtu^A1ylQ?#>Q)n<v7!x0?C)D%pOMD0c=%}c^1Tu~$3@(&Mx z8};`y>~RQyw@RlN+k5+E%s|hV8Nu(r45KBkS`PjY4aJg2#vI|bmZh?8%lI3TV88Z< z<#Cxp{pV(8VQVi+Ddb)GJc}K@dBHJ5cSnwOi@79SZ1P$0nkHDZ*&tB)C6S|eAQ5MO zcE=Q0Gu=k@1QoRyePek1=D&kJ=s)~z@`}!!P+pYL#GX|tAF8%_A$Y)%P20ULhXH^+ zp#K-(O%MDnPi1(^>ZfVq1$JAHOPY6OZ}<z3gR{UK-b>d{72X4SDfQ+hBiD-K+~c0C z1M9rl@94n+K~+(dIFq{&MhhK92m&vcouz{t^T+C22G1c_IfjwD84INy17{oHz}{Gg zz5)2rP_Ak`KmLQl8Mw;+epp&E@K|T!KSuwV?!RE5uaN%BBT6FkK2&qC+&Ih$z`ylt LUG1}0b58vqH^pd! literal 14719 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 diff --git a/packages/app/public/site.webmanifest b/packages/app/public/site.webmanifest index 0cea885cdb..cebc59d846 100644 --- a/packages/app/public/site.webmanifest +++ b/packages/app/public/site.webmanifest @@ -1,6 +1,6 @@ { "name": "Polkadot Cloud Staking", - "short_name": "Polkadot Cloud Staking", + "short_name": "Staking", "icons": [ { "src": "/favicons/web-app-manifest-192x192.png", @@ -18,4 +18,4 @@ "theme_color": "#ffffff", "background_color": "#ffffff", "display": "standalone" -} +} \ No newline at end of file diff --git a/packages/app/src/library/SideMenu/Wrapper.ts b/packages/app/src/library/SideMenu/Wrapper.ts index 65b5ab0a1e..9f9ed2efdd 100644 --- a/packages/app/src/library/SideMenu/Wrapper.ts +++ b/packages/app/src/library/SideMenu/Wrapper.ts @@ -121,7 +121,7 @@ export const LogoWrapper = styled.button<MinimisedProps>` .logo { width: auto; - height: ${(props) => (props.$minimised ? '2.15rem' : '1.5rem')}; + height: ${(props) => (props.$minimised ? '2.15rem' : '1.45rem')}; } } diff --git a/packages/assets/src/svg/icons/cloud.svg b/packages/assets/src/svg/icons/cloud.svg index 4535d93089..5e8fe6dff8 100644 --- a/packages/assets/src/svg/icons/cloud.svg +++ b/packages/assets/src/svg/icons/cloud.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 595.522 379.463"><path d="M473.475 169.487C461.663 60.316 386.888-10.774 280.446 1.341c-74.149 8.439-123.163 52.913-148.99 131.982C39.283 136.155-5.319 194.232.505 267.215c5.494 68.842 61.597 112.3 128.942 112.248h366.28c59.497-.33 100.115-41.792 99.793-102.815s-38.171-107.502-122.045-107.161z" className="accent" /></svg> \ No newline at end of file +<svg viewBox="0 0 29 29" fill="#fff" xmlns="http://www.w3.org/2000/svg" ><path fill-rule="evenodd" clip-rule="evenodd" d="M9.063 23.244h13.399c.036.003.072.006.11.006 1.297 0 2.932-.31 4.136-1.514a5.241 5.241 0 00-2.348-8.768c.18-1.755.2-3.885-1.096-5.74-2.43-3.479-7.258-4.252-10.771-1.798-.686.479-1.405 1.218-1.975 2.018a7.395 7.395 0 00-.92 1.69 7.063 7.063 0 10-.535 14.106z" className="accent" stroke="none"/></svg> \ No newline at end of file From 4e3671232bb0e7ffcbf73348c1a2af883277146f Mon Sep 17 00:00:00 2001 From: Ross Bulat <ross@jkrb.io> Date: Mon, 24 Feb 2025 13:49:32 +0700 Subject: [PATCH 17/18] feat: Rename dapp to Polkadot Cloud Staking (#2550) --- README.md | 12 ++++++------ docs/CONTRIBUTING.md | 6 +++--- docs/YARN_MODERN.md | 6 +++--- packages/app/index.html | 14 +++++++------- .../app/src/contexts/WalletConnect/index.tsx | 2 +- packages/app/vite.config.ts | 5 ----- packages/consts/src/index.ts | 2 +- packages/locales/src/resources/cn/help.json | 10 +++++----- packages/locales/src/resources/cn/modals.json | 6 +++--- packages/locales/src/resources/cn/tips.json | 4 ++-- packages/locales/src/resources/en/app.json | 2 +- packages/locales/src/resources/en/help.json | 2 +- packages/locales/src/resources/en/modals.json | 6 +++--- packages/locales/src/resources/en/tips.json | 8 ++++---- packages/locales/src/resources/es/app.json | 2 +- packages/locales/src/resources/es/help.json | 16 ++++++++-------- packages/locales/src/resources/es/modals.json | 12 ++++++------ packages/locales/src/resources/es/tips.json | 8 ++++---- packages/ui-buttons/src/ButtonText/index.tsx | 2 +- 19 files changed, 60 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index e129020a03..359e050a8b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ <!-- markdown-link-check-enable --> -# Polkadot Staking Dashboard +# Polkadot Cloud Staking <img width="1479" alt="Screenshot 2024-10-06 at 13 56 44" src="https://github.com/user-attachments/assets/d8edbbae-3cf0-4330-bac3-280e74f5d3cc"> @@ -12,17 +12,17 @@ ### Validator Operators -To showcase a validator operator on staking dashboard, submit a PR to [**`@w3ux/w3ux-library`**](https://github.com/w3ux/w3ux-library/tree/main). The operator will then be available in the **`@w3ux/validator-assets`** NPM package. [Full instructions](https://github.com/w3ux/w3ux-library/tree/main/library/validator-assets). +To showcase your validator operator, submit a PR to [**`@w3ux/w3ux-library`**](https://github.com/w3ux/w3ux-library/tree/main). The operator will then be available in the **`@w3ux/validator-assets`** NPM package. [Full instructions](https://github.com/w3ux/w3ux-library/tree/main/library/validator-assets). ## URL Variable Support -Polkadot Staking Dashboard supports URL variables that can be used to direct users to specific configurations of the app, such as landing on a specific language or on a specific network. Variables are added at the end of the hash portion of URL. +Polkadot Cloud Staking supports URL variables that can be used to direct users to specific configurations of the app, such as landing on a specific language or on a specific network. Variables are added at the end of the hash portion of URL. The currently supported URL variables are as follows: -- **n**: Controls the default network to connect to upon visiting the dashboard. Supported values are `polkadot`, `kusama` and `westend`. -- **l**: Controls the default to use upon visiting the dashboard. Supported values are `en` and `cn`. -- **a**: Controls the account to connect to upon visiting the dashboard. Ignored if the account is not present in the initial imported accounts. +- **n**: Controls the default network to connect to upon visiting the app. Supported values are `polkadot`, `kusama` and `westend`. +- **l**: Controls the default to use upon visiting the app. +- **a**: Controls the account to connect to upon visiting the app. Ignored if the account is not present in the initial imported accounts. URL variables take precedence over saved values in local storage, and will overwrite current configurations. URL variables will update (if present) as a user switches configurations in-app, such as changing the network or language. diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index c48eca7458..660c4e863d 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,8 +1,8 @@ # Contribution Guide -This section aims to familiarise developers to the Polkadot Staking Dashboard [[Deployment](https://staking.polkadot.cloud)]. +This section aims to familiarise developers to the Polkadot Cloud Staking [[Deployment](https://staking.polkadot.cloud)]. -Reach out to ross@jkrb.io for clarification of any content within this document. +Reach out to staking@polkadot.cloud for clarification of any content within this document. ## Submitting Pull Requests @@ -25,7 +25,7 @@ If you would like to know more about the Conventional Commits specification, ple ## Releases -[Release Please](https://github.com/googleapis/release-please) is used for automating staking dashboard's changelog and release generation. +[Release Please](https://github.com/googleapis/release-please) is used for automating staking each package's changelog and release generation. Release Please is a GitHub action maintained by Google that automates CHANGELOG generation, the creation of GitHub releases, and version bumps. [[Gtihub docs](https://github.com/googleapis/release-please), [Action](https://github.com/marketplace/actions/release-please-action)] diff --git a/docs/YARN_MODERN.md b/docs/YARN_MODERN.md index c70bf3a2e5..a75db85bf1 100644 --- a/docs/YARN_MODERN.md +++ b/docs/YARN_MODERN.md @@ -1,6 +1,6 @@ # Using Yarn Modern -Staking dashboard uses Yarn Modern as its package manager. It contains a local binary of the yarn version used, so you don't need to install anything globally. +Yarn Modern is used in this workspace as the chosen package manager. It contains a local binary of the yarn version used, so you don't need to install anything globally. _If you fetch this repository for the first time, or if the yarn version is updated in the repository, restart or reload your IDE or CLI to make sure it picks up the updated version._ @@ -20,7 +20,7 @@ Verify the version with `npm --version`. You may need to restart your IDE or CLI ### I cannot switch between Yarn Classic and Yarn Modern on my machine -It should not matter that you have Yarn Classic installed globally, as staking dashboard has a local yarn binary that it uses. If however you _do_ require Yarn Modern on your machine, try the following troubleshooting steps: +It should not matter that you have Yarn Classic installed globally, as a local yarn binary is used within the workspace. If however you _do_ require Yarn Modern on your machine, try the following troubleshooting steps: #### Check for other yarn config files @@ -32,7 +32,7 @@ Run `which yarn` to determine where your system yarn binary is located and verif #### Verify your system's yarn version -Verify the active yarn version on your machine with `yarn --version`. This should be run outside of the staking dashboard repository as to not pick up the local yarn binary in the project. To be sure the correct version is being displayed, it is safest to do this in the active yarn directory, e.g. the directory from the previous step. +Verify the active yarn version on your machine with `yarn --version`. This should be run outside of this repository as to not pick up the local yarn binary in the project. To be sure the correct version is being displayed, it is safest to do this in the active yarn directory, e.g. the directory from the previous step. #### Set a new yarn version diff --git a/packages/app/index.html b/packages/app/index.html index 146f83015e..4755e4288e 100644 --- a/packages/app/index.html +++ b/packages/app/index.html @@ -20,22 +20,22 @@ <link rel="manifest" href="/site.webmanifest" /> <meta name="title" - content="Polkadot Staking Dashboard | Polkadot Staking (DOT)" + content="Polkadot Cloud Staking | Polkadot Staking (DOT)" /> <meta name="description" - content="Polkadot Staking Dashboard is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." + content="Polkadot Cloud Staking is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." /> <!-- Open Graph / Facebook --> <meta property="og:type" content="website" /> <meta property="og:url" content="https://staking.polkadot.cloud" /> <meta property="og:title" - content="Polkadot Staking Dashboard | Polkadot Staking (DOT)" + content="Polkadot Cloud Staking | Polkadot Staking (DOT)" /> <meta property="og:description" - content="Polkadot Staking Dashboard is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." + content="Polkadot Cloud Staking is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." /> <meta property="og:image" @@ -46,11 +46,11 @@ <meta property="twitter:url" content="https://staking.polkadot.cloud" /> <meta property="twitter:title" - content="Polkadot Staking Dashboard | Polkadot Staking (DOT)" + content="Polkadot Cloud Staking | Polkadot Staking (DOT)" /> <meta property="twitter:description" - content="Polkadot Staking Dashboard is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." + content="Polkadot Cloud Staking is the easiest way to stake DOT, check validator stats, manage your nominations and join nomination pools. Stake on Polkadot (DOT)." /> <meta property="twitter:image" @@ -60,7 +60,7 @@ import { Buffer } from 'buffer' window.Buffer = Buffer </script> - <title>Polkadot Staking Dashboard | Polkadot Staking (DOT) + Polkadot Cloud Staking | Polkadot Staking (DOT)
diff --git a/packages/app/src/contexts/WalletConnect/index.tsx b/packages/app/src/contexts/WalletConnect/index.tsx index 29c9c0e8f8..65bdc56e0f 100644 --- a/packages/app/src/contexts/WalletConnect/index.tsx +++ b/packages/app/src/contexts/WalletConnect/index.tsx @@ -65,7 +65,7 @@ export const WalletConnectProvider = ({ const provider = await UniversalProvider.init({ projectId: wcProjectId, metadata: { - name: 'Polkadot Staking Dashboard', + name: 'Polkadot Cloud Staking', description: 'A fully featured dashboard for Polkadot staking and nomination pools', url: 'https://staking.polkadot.cloud/', diff --git a/packages/app/vite.config.ts b/packages/app/vite.config.ts index ece6daa501..ee83489a31 100644 --- a/packages/app/vite.config.ts +++ b/packages/app/vite.config.ts @@ -9,11 +9,6 @@ import svgr from 'vite-plugin-svgr' import tsconfigPaths from 'vite-tsconfig-paths' // https://vitejs.dev/config/ -// -// NOTES: -// - `base` is configured in `package.json` with the vite --base flag. In local dev it is `/`, -// whereas gh-pages always deploys to `/polkadot-staking-dashboard/`. Producution builds can also -// be configureed with the `--base` flag. // - `BASE_URL`env variable is used in the codebase to refer to the supplied base. export default defineConfig({ plugins: [ diff --git a/packages/consts/src/index.ts b/packages/consts/src/index.ts index b3c3137067..2fb4c3f3a2 100644 --- a/packages/consts/src/index.ts +++ b/packages/consts/src/index.ts @@ -4,7 +4,7 @@ /* * Global Constants */ -export const DappName = 'Polkadot Staking Dashboard' +export const DappName = 'Polkadot Cloud Staking' export const ManualSigners = ['ledger', 'vault', 'wallet_connect'] export const DiscordSupportUrl = 'https://discord.gg/QY7CSSJm3D' export const MailSupportAddress = 'staking@polkadot.cloud' diff --git a/packages/locales/src/resources/cn/help.json b/packages/locales/src/resources/cn/help.json index 0376407564..d3acaa2069 100644 --- a/packages/locales/src/resources/cn/help.json +++ b/packages/locales/src/resources/cn/help.json @@ -150,7 +150,7 @@ "ledgerHardwareWallets": [ "Ledger硬件钱包", [ - "Staking Dashboard己完全支持可兼容的Ledger设备.您可开始使用Ledger管理{NETWORK_NAME}上的抵押.", + "Cloud Staking.您可开始使用Ledger管理{NETWORK_NAME}上的抵押.", "因为您的私钥一直在硬件设备上,所以硬件钱包也称为冷钱包.硬件钱包没有连接互联网,所以使用该类钱包可确保安全.", "为了使用Ledger设备导入和签署交易, 您的设备必须安装{NETWORK_NAME} Ledger App. 该应用程序可以通过Ledger自己的应用程序Ledger Live安装.", "详情请在其官方网站上查找:ledger.com." @@ -332,7 +332,7 @@ [ "代理帐户是代理另一个帐户的帐户.", "在代理帐户术语中, 代理帐户称为委托帐户, 代理帐户所代表的代理帐户被称为委托人帐户.", - "Staking Dashboard允许被委托人代表委托人签署交易. 如果代理账户在没有委托人的委托的情况下而存在, 则委托人将自动列为只读帐户." + "Cloud Staking允许被委托人代表委托人签署交易. 如果代理账户在没有委托人的委托的情况下而存在, 则委托人将自动列为只读帐户." ] ], "readOnlyAccounts": [ @@ -351,7 +351,7 @@ "reserveBalanceForExistentialDeposit": [ "为最低存款存储", [ - "如果您的账户已经锁定了足够涵盖最低存款的金额, 例如为提名而锁定的金额, Staking Dashboard则不会另外锁定任何额外的可用金额.", + "如果您的账户已经锁定了足够涵盖最低存款的金额, 例如为提名而锁定的金额, Cloud Staking则不会另外锁定任何额外的可用金额.", "在这种情况下, \"无\" 会显示在存储下的 \"为最低存款存储\"部分." ] ], @@ -416,7 +416,7 @@ "wrongTransaction": [ "错误交易", [ - "此错误发生原因为当Ledger设备正在签名或签名后的交易与Staking Dashboard上当前活动交易不同.", + "此错误发生原因为当Ledger设备正在签名或签名后的交易与Cloud Staking上当前活动交易不同.", "请确保Ledger设备上没有未完成的交易, 然后重试." ] ], @@ -437,7 +437,7 @@ "claimRewards": "申领提名池奖励", "connectAccounts": "如何连接您的帐户", "createPools": "创建提名池", - "howToUse": "如何使用Staking Dashboard:概述", + "howToUse": "Cloud Staking:概述", "polkawatchAnalytics": "Polkawatch的去中心化分析: 介绍", "rebonding": "解除质押中", "stakeDot": "抵押您的DOT", diff --git a/packages/locales/src/resources/cn/modals.json b/packages/locales/src/resources/cn/modals.json index 1a30eb556e..951007ca78 100644 --- a/packages/locales/src/resources/cn/modals.json +++ b/packages/locales/src/resources/cn/modals.json @@ -220,7 +220,7 @@ "scanFromPolkadotVault": "从Polkadot Vault中扫描", "searchAccount": "搜索帐户", "selectNetwork": "网络选择", - "selectRpcProvider": "可选择任意一个RPC服务端来更改Staking Dashboard连接的{{network}}节点", + "selectRpcProvider": "可选择任意一个RPC服务端来更改Cloud Staking连接的{{network}}节点", "selected": "己选", "selfStake": "自我抵押", "sentToCommissionPayee": "此金额将发送到为此提名池己设置的佣金收款人帐户", @@ -239,8 +239,8 @@ "submitting": "提交中", "subscanDisabled": "Subscan己断开", "successfullyFetchedAddress": "成功获取地址", - "supportDiscord": "加入 Staking Dashboard Discord 频道,获得我们团队的专门支持并与 Polkadot 社区建立联系.", - "supportEmail": "我们为 Staking Dashboard 用户提供专用电子邮件支持。联系我们,我们的团队将尽力及时回复并为您提供帮助.", + "supportDiscord": "加入 Cloud Staking Discord 频道,获得我们团队的专门支持并与 Polkadot 社区建立联系.", + "supportEmail": "我们为 Cloud Staking 用户提供专用电子邮件支持。联系我们,我们的团队将尽力及时回复并为您提供帮助.", "thisMinimumDelay": "这个最小延迟近似等于{{count}}个块", "titleExtensionConnected": "{{title}} 扩展已连接", "togglePlugins": "切换插件", diff --git a/packages/locales/src/resources/cn/tips.json b/packages/locales/src/resources/cn/tips.json index 5377f2d5d4..b4e61ceeda 100644 --- a/packages/locales/src/resources/cn/tips.json +++ b/packages/locales/src/resources/cn/tips.json @@ -2,9 +2,9 @@ "tips": { "connectExtensions": [ "连接扩展", - "连接您的帐户,开始使用Polkadot Staking Dashboard.", + "连接您的帐户,开始使用Polkadot Cloud Staking.", [ - "连接您的帐户,开始使用Polkadot Staking Dashboard.", + "连接您的帐户,开始使用Polkadot Cloud Staking.", "通过充当钱包的网络扩展访问账户。您的钱包用于签署在应用中提交的交易.", "从应用中右上角的“连接”按钮连接您的钱包,然后选择您希望用于抵押的帐户继续.", "该应用支持一系列扩展和钱包." diff --git a/packages/locales/src/resources/en/app.json b/packages/locales/src/resources/en/app.json index c2bc8dbae5..c7c6407703 100644 --- a/packages/locales/src/resources/en/app.json +++ b/packages/locales/src/resources/en/app.json @@ -249,7 +249,7 @@ "second_one": "second", "second_other": "seconds" }, - "title": "Polkadot Staking Dashboard", + "title": "Polkadot Cloud Staking", "tooSmall": "Bond amount is too small.", "top": "Top", "transactionCancelled": "Transaction was cancelled", diff --git a/packages/locales/src/resources/en/help.json b/packages/locales/src/resources/en/help.json index 7077276deb..5b84f77b11 100644 --- a/packages/locales/src/resources/en/help.json +++ b/packages/locales/src/resources/en/help.json @@ -426,7 +426,7 @@ "claimRewards": "Claiming Nomination Pool Rewards", "connectAccounts": "How to Connect Your Accounts", "createPools": "Creating Nomination Pools", - "howToUse": "How to Use the Staking Dashboard: Overview", + "howToUse": "How to Use the Polkadot Cloud Staking: Overview", "polkawatchAnalytics": "Decentralization Analytics by Polkawatch: Introduction", "rebonding": "Rebonding", "stakeDot": "Staking your DOT", diff --git a/packages/locales/src/resources/en/modals.json b/packages/locales/src/resources/en/modals.json index 83744b93a5..87719e84ee 100644 --- a/packages/locales/src/resources/en/modals.json +++ b/packages/locales/src/resources/en/modals.json @@ -232,7 +232,7 @@ "scanFromPolkadotVault": "Scan From Polkadot Vault", "searchAccount": "Search Account", "selectNetwork": "Select Network", - "selectRpcProvider": "Select an RPC provider to change the {{network}} node Staking Dashboard connects to.", + "selectRpcProvider": "Select an RPC provider to change the {{network}} node Cloud Staking connects to.", "selected": "Selected", "selfStake": "Self Stake", "sentToCommissionPayee": "This amount will be sent to the commission payee account configured for this pool.", @@ -251,8 +251,8 @@ "submitting": "Submitting", "subscanDisabled": "Subscan Disabled", "successfullyFetchedAddress": "Successfully Fetched Address", - "supportDiscord": "Join the Staking Dashboard Discord channel to receive dedicated support from our team and connect with the Polkadot community.", - "supportEmail": "We provide dedicated email support for Staking Dashboard users. Contact us, and our team will strive to respond promptly to assist you.", + "supportDiscord": "Join the Cloud Staking Discord channel to receive dedicated support from our team and connect with the Polkadot community.", + "supportEmail": "We provide dedicated email support for Cloud Staking users. Contact us, and our team will strive to respond promptly to assist you.", "thisMinimumDelay_one": "This minimum delay is the approximate equivalent of {{count}} block.", "thisMinimumDelay_other": "This minimum delay is the approximate equivalent of {{count}} blocks.", "titleExtensionConnected": "The {{title}} extension has been connected.", diff --git a/packages/locales/src/resources/en/tips.json b/packages/locales/src/resources/en/tips.json index c75005c8ca..07582fc0ef 100644 --- a/packages/locales/src/resources/en/tips.json +++ b/packages/locales/src/resources/en/tips.json @@ -2,12 +2,12 @@ "tips": { "connectExtensions": [ "Connect Extensions", - "Connect your accounts to begin using Polkadot Staking Dashboard.", + "Connect your accounts to begin using Polkadot Cloud Staking.", [ - "Connect your accounts to begin using Polkadot Staking Dashboard.", + "Connect your accounts to begin using Polkadot Cloud Staking.", "Accounts are accessed via web extensions, that act as wallets. Your wallet is used to sign transactions that you submit within the dashboard.", "Connect your wallets from the Connect button at the top right of the dashboard, and select the account you wish to stake with to continue.", - "Staking Dashboard supports a range of extensions and wallets." + "Cloud Staking supports a range of extensions and wallets." ] ], "howToStake": [ @@ -92,7 +92,7 @@ [ "Various factors affect how much validators are rewarded, such as the amount of era points it generates and how many nominators are backing it.", "All these metrics change over time, sometimes in an unpredictable manner. It is therefore important that nominators actively monitor validators and their performance.", - "Staking dashboard provides a range of metrics to help you understand how a validator is performing." + "Cloud Staking provides a range of metrics to help you understand how a validator is performing." ] ] } diff --git a/packages/locales/src/resources/es/app.json b/packages/locales/src/resources/es/app.json index 26a2cad5e3..0a4761878d 100644 --- a/packages/locales/src/resources/es/app.json +++ b/packages/locales/src/resources/es/app.json @@ -249,7 +249,7 @@ "second_one": "segundo", "second_other": "segundos" }, - "title": "Polkadot Staking Dashboard", + "title": "Polkadot Cloud Staking", "tooSmall": "El monto vinculado es demasiado pequeño.", "top": "Top", "transactionCancelled": "La transacción fue cancelada", diff --git a/packages/locales/src/resources/es/help.json b/packages/locales/src/resources/es/help.json index 83d2471797..f187a5400b 100644 --- a/packages/locales/src/resources/es/help.json +++ b/packages/locales/src/resources/es/help.json @@ -146,7 +146,7 @@ "ledgerHardwareWallets": [ "Carteras Hardware Ledger", [ - "Los dispositivos Ledger compatibles están completamente soportados en el Staking Dashboard. Usa tu Ledger para gestionar tu actividad de staking en {NETWORK_NAME}.", + "Los dispositivos Ledger compatibles están completamente soportados en el Cloud Staking. Usa tu Ledger para gestionar tu actividad de staking en {NETWORK_NAME}.", "Usar una cartera hardware asegura una experiencia segura, donde tus claves permanecen en el dispositivo hardware en todo momento. Esto también se conoce como almacenamiento en frío, ya que no hay conexión activa a internet con tu cartera.", "Para importar y firmar transacciones con tu dispositivo Ledger, tu dispositivo debe tener la app Ledger de {NETWORK_NAME} instalada. La app de {NETWORK_NAME} puede ser instalada a través de la aplicación Ledger Live.", "Encuentra más información sobre Ledger en su sitio web oficial, ledger.com." @@ -170,7 +170,7 @@ "Balance Comprometido", [ "En {NETWORK_NAME}, algunas acciones requieren que tu balance esté comprometido, como hacer staking o votar en gobernanza. Si parte de tu balance está comprometido, no puede ser transferido.", - "La cantidad de balance comprometido mostrado en el Staking Dashboard representa todos tus compromisos aparte del compromiso de staking - por lo tanto muestra todo el balance comprometido a tu disposición que puedes usar para nominar.", + "La cantidad de balance comprometido mostrado en el Cloud Staking representa todos tus compromisos aparte del compromiso de staking - por lo tanto muestra todo el balance comprometido a tu disposición que puedes usar para nominar.", "Puedes nominar con cualquier balance comprometido restante, pero no puedes unirte a un pool con él, ya que hacerlo requiere una transferencia a la cuenta del pool." ] ], @@ -301,7 +301,7 @@ "Tu estado de membresía del pool refleja si eres miembro de un pool.", "Las membresías de pool pueden ser de miembro del pool o propietario del pool.", "Actualmente en {NETWORK_NAME}, las cuentas solo pueden unirse a un pool a la vez. Si deseas unirte a otro pool, primero debes abandonar tu pool actual.", - "Para dejar un pool, simplemente necesitas desvincular y retirar todos tus {NETWORK_UNIT} vinculados. El Staking Dashboard proporciona un botón específico de Salir para desvincular del pool." + "Para dejar un pool, simplemente necesitas desvincular y retirar todos tus {NETWORK_UNIT} vinculados. El Cloud Staking proporciona un botón específico de Salir para desvincular del pool." ] ], "poolRewardHistory": [ @@ -333,7 +333,7 @@ [ "Las cuentas proxy son cuentas que actúan en nombre de otra cuenta.", "En términos de cuentas proxy, la cuenta proxy se llama cuenta delegada, y la cuenta representada se llama cuenta delegadora.", - "El Staking Dashboard permite a los delegados firmar transacciones en nombre de un delegador. Si existe un delegado en el panel sin su delegador, el delegador se importa automáticamente como una cuenta de solo lectura." + "El Cloud Staking permite a los delegados firmar transacciones en nombre de un delegador. Si existe un delegado en el panel sin su delegador, el delegador se importa automáticamente como una cuenta de solo lectura." ] ], "readOnlyAccounts": [ @@ -346,13 +346,13 @@ "Balance de Reserva", [ "En {NETWORK_NAME}, debes tener un balance superior a cierta cantidad para que tu cuenta exista en la cadena. Esta cantidad se llama tu 'depósito existencial'.", - "El Staking Dashboard asegura que esta cantidad de {NETWORK_UNIT} nunca se toque." + "El Cloud Staking asegura que esta cantidad de {NETWORK_UNIT} nunca se toque." ] ], "reserveBalanceForExistentialDeposit": [ "Balance de Reserva para Depósito Existencial", [ - "Si tu cuenta ya tiene un balance inmovilizado que cubre el depósito existencial de tu cuenta, como el balance inmovilizado para nominar, entonces el Staking Dashboard no inmovilizará ningún balance libre adicional.", + "Si tu cuenta ya tiene un balance inmovilizado que cubre el depósito existencial de tu cuenta, como el balance inmovilizado para nominar, entonces el Cloud Staking no inmovilizará ningún balance libre adicional.", "En este escenario, se muestra \"Ninguno\" bajo la sección \"Reserva Para Depósito Existencial\" en tus ajustes de Balance de Reserva." ] ], @@ -407,7 +407,7 @@ "wrongTransaction": [ "Transacción Incorrecta", [ - "Este error ocurre cuando un dispositivo Ledger firmó o está en proceso de firmar una transacción diferente a la actualmente activa en el Staking Dashboard.", + "Este error ocurre cuando un dispositivo Ledger firmó o está en proceso de firmar una transacción diferente a la actualmente activa en el Cloud Staking.", "Asegúrate de que no haya transacciones pendientes en el dispositivo Ledger e inténtalo de nuevo." ] ], @@ -428,7 +428,7 @@ "claimRewards": "Reclamar Recompensas del Pool de Nominación", "connectAccounts": "Cómo Conectar Tus Cuentas", "createPools": "Crear Pools de Nominación", - "howToUse": "Cómo Usar el Staking Dashboard: Overview", + "howToUse": "Cómo Usar el Cloud Staking: Overview", "polkawatchAnalytics": "Análisis de Descentralización por Polkawatch: Introducción", "rebonding": "Revincular", "stakeDot": "Hacer Stake con tus DOT", diff --git a/packages/locales/src/resources/es/modals.json b/packages/locales/src/resources/es/modals.json index d8a922aa10..e0b19b38d7 100644 --- a/packages/locales/src/resources/es/modals.json +++ b/packages/locales/src/resources/es/modals.json @@ -38,7 +38,7 @@ "bondingWithdraw": "La vinculación también retirará tus recompensas pendientes de", "bouncer": "Bouncer", "cancel": "Cancelar", - "changeNomination": "Una vez enviado, tus nominaciones se eliminarán de tu Staking Dashboard inmediatamente y no serán nominadas desde el inicio de la siguiente era.", + "changeNomination": "Una vez enviado, tus nominaciones se eliminarán de tu Cloud Staking inmediatamente y no serán nominadas desde el inicio de la siguiente era.", "changePoolRoles": "Cambiar roles del Pool", "changeRate": "Cambiar Tasa", "changeToDestroy": "Cambiar Pool a estado de Destrucción.", @@ -73,7 +73,7 @@ "developerTools": "Herramientas de Desarrollo", "differentNetworkAddress": "Dirección de red diferente", "disconnect": "Desconectar", - "disconnectFromExtension": "¿Estás seguro de que deseas desconectarte de esta extensión? Esto recargará el Staking Dashboard.", + "disconnectFromExtension": "¿Estás seguro de que deseas desconectarte de esta extensión? Esto recargará el Cloud Staking.", "done": "Hecho", "ensureLedgerIsConnected": "Consejo: Asegúrate de que tu dispositivo Ledger esté conectado antes de continuar.", "exitYourStakingPosition": "Salir de tu posición de staking.", @@ -139,7 +139,7 @@ "ledgerImportedAccount": "Cuenta Ledger {{account}} importada", "ledgerRemovedAccount": "Cuenta Ledger {{account}} eliminada", "ledgerRequestTimeout": "La solicitud a Ledger ha expirado. Por favor, inténtalo de nuevo.", - "ledgerWillBeReset": "Tu lista de direcciones Ledger se restablecerá, y cualquier cuenta importada será eliminada del Staking Dashboard.", + "ledgerWillBeReset": "Tu lista de direcciones Ledger se restablecerá, y cualquier cuenta importada será eliminada del Cloud Staking.", "lightClient": "Light Client", "lockPool": "Comprometer Pool", "lockPoolSubtitle": "Una vez que comprometas el pool, nadie más podrá unirse al pool.", @@ -232,7 +232,7 @@ "scanFromPolkadotVault": "Escanear desde Polkadot Vault", "searchAccount": "Buscar Cuenta", "selectNetwork": "Seleccionar Red", - "selectRpcProvider": "Selecciona un proveedor RPC para cambiar el nodo {{network}} al que se conecta el Staking Dashboard.", + "selectRpcProvider": "Selecciona un proveedor RPC para cambiar el nodo {{network}} al que se conecta el Cloud Staking.", "selected": "Seleccionado", "selfStake": "Auto-stake", "sentToCommissionPayee": "Esta cantidad será enviada a la cuenta de beneficiario de comisiones configurada para este Pool.", @@ -251,8 +251,8 @@ "submitting": "Enviando", "subscanDisabled": "Subscan Desactivado", "successfullyFetchedAddress": "Dirección Obtenida Exitosamente", - "supportDiscord": "Únete al canal de Discord del Staking Dashboard para recibir soporte dedicado de nuestro equipo y conectar con la comunidad de Polkadot.", - "supportEmail": "Proporcionamos soporte por correo dedicado para usuarios del Staking Dashboard. Contáctanos, y nuestro equipo se esforzará por responder rápidamente para ayudarte.", + "supportDiscord": "Únete al canal de Discord del Cloud Staking para recibir soporte dedicado de nuestro equipo y conectar con la comunidad de Polkadot.", + "supportEmail": "Proporcionamos soporte por correo dedicado para usuarios del Cloud Staking. Contáctanos, y nuestro equipo se esforzará por responder rápidamente para ayudarte.", "thisMinimumDelay_one": "Este retraso mínimo es el equivalente aproximado a {{count}} bloque.", "thisMinimumDelay_other": "Este retraso mínimo es el equivalente aproximado a {{count}} bloques.", "titleExtensionConnected": "La extensión {{title}} ha sido conectada.", diff --git a/packages/locales/src/resources/es/tips.json b/packages/locales/src/resources/es/tips.json index e4f4211d6b..cc6cafe0cf 100644 --- a/packages/locales/src/resources/es/tips.json +++ b/packages/locales/src/resources/es/tips.json @@ -2,12 +2,12 @@ "tips": { "connectExtensions": [ "Conectar Extensiones", - "Conecta tus cuentas para comenzar a usar Polkadot Staking Dashboard.", + "Conecta tus cuentas para comenzar a usar Polkadot Cloud Staking.", [ - "Conecta tus cuentas para comenzar a usar Polkadot Staking Dashboard.", + "Conecta tus cuentas para comenzar a usar Polkadot Cloud Staking.", "Las cuentas se acceden a través de extensiones web, que actúan como billeteras. Tu billetera se usa para firmar las transacciones que envías dentro del dashboard.", "Conecta tus billeteras desde el botón Conectar en la parte superior derecha del dashboard, y selecciona la cuenta con la que deseas hacer staking para continuar.", - "Staking Dashboard soporta una amplia gama de extensiones y billeteras." + "Cloud Staking soporta una amplia gama de extensiones y billeteras." ] ], "howToStake": [ @@ -92,7 +92,7 @@ [ "Varios factores afectan cuánto se recompensa a los validadores, como la cantidad de puntos de era que genera y cuántos nominadores lo respaldan.", "Todas estas métricas cambian con el tiempo, a veces de manera impredecible. Por lo tanto, es importante que los nominadores monitoreen activamente los validadores y su rendimiento.", - "Staking Dashboard proporciona una variedad de métricas para ayudarte a entender cómo está funcionando un validador." + "Cloud Staking proporciona una variedad de métricas para ayudarte a entender cómo está funcionando un validador." ] ] } diff --git a/packages/ui-buttons/src/ButtonText/index.tsx b/packages/ui-buttons/src/ButtonText/index.tsx index 9230244aac..c7685124f2 100644 --- a/packages/ui-buttons/src/ButtonText/index.tsx +++ b/packages/ui-buttons/src/ButtonText/index.tsx @@ -10,7 +10,7 @@ import type { ButtonTextProps } from './types' /** * @name ButtonText - * @description Plain button style used within the main interface of dashboards. + * @description Plain button style used within the main interface. * * @param {ButtonTextProps} props - The props for the ButtonText component. * @returns {JSX.Element} The rendered primary button component. From 73255da94df9c626f29bcbd67fc34e18c2825598 Mon Sep 17 00:00:00 2001 From: Ross Bulat Date: Mon, 24 Feb 2025 22:19:12 +0700 Subject: [PATCH 18/18] chore: bump, lint --- packages/app/package.json | 2 +- packages/app/public/site.webmanifest | 2 +- .../app/src/config/validators/GuruStaking.tsx | 2416 +++++++++++++++++ packages/app/src/config/validators/index.ts | 21 + packages/styles/theme/theme.scss | 12 +- yarn.lock | 10 +- 6 files changed, 2452 insertions(+), 11 deletions(-) create mode 100644 packages/app/src/config/validators/GuruStaking.tsx diff --git a/packages/app/package.json b/packages/app/package.json index 5db53d41f9..bec8de5326 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -28,7 +28,7 @@ "@w3ux/factories": "^1.0.0", "@w3ux/react-connect-kit": "^2.1.1", "@w3ux/react-odometer": "^1.1.0", - "@w3ux/validator-assets": "^0.3.1", + "@w3ux/validator-assets": "^0.3.2", "@zondax/ledger-substrate": "^1.0.1", "assets": "workspace:*", "buffer": "^6.0.3", diff --git a/packages/app/public/site.webmanifest b/packages/app/public/site.webmanifest index cebc59d846..93e14ce73e 100644 --- a/packages/app/public/site.webmanifest +++ b/packages/app/public/site.webmanifest @@ -18,4 +18,4 @@ "theme_color": "#ffffff", "background_color": "#ffffff", "display": "standalone" -} \ No newline at end of file +} diff --git a/packages/app/src/config/validators/GuruStaking.tsx b/packages/app/src/config/validators/GuruStaking.tsx new file mode 100644 index 0000000000..ace407db8d --- /dev/null +++ b/packages/app/src/config/validators/GuruStaking.tsx @@ -0,0 +1,2416 @@ +const GuruStaking = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +export default GuruStaking diff --git a/packages/app/src/config/validators/index.ts b/packages/app/src/config/validators/index.ts index f7f6f4b400..bba8117682 100644 --- a/packages/app/src/config/validators/index.ts +++ b/packages/app/src/config/validators/index.ts @@ -242,6 +242,24 @@ export const ValidatorCommunity: ValidatorEntry[] = [ kusama: ['JJiV1xrj1814BVDDG2pFCsgzdbR7K29VcyXQGXEUhn7LWhK'], }, }, + { + name: 'GuruStaking👳', + icon: 'GuruStaking', + bio: 'We are thrilled to have you join us in this exciting journey of blockchain validation and decentralized governance. As a validator, we play a crucial role in securing the network, verifying transactions, and contributing to the overall stability and reliability of the DotSama ecosystem.', + email: 'stake@gurustaking.com', + x: '@GuruStaking', + website: 'https://gurustaking.com', + validators: { + polkadot: [ + '138tCNoHg9QbhjqanRS7R8ZC8547A6CdaSmrCtJCRLpjQk6r', + '1ja8qGypM5HT9Rqq6AGQ9z58bSi2kfkrqsGuB84zxdp1SZH', + ], + kusama: [ + 'F5j1j9TJ7xWePJmYh64Bf2b97pmer3mX1BsonCUpx3CJZpu', + 'ESE6ka6wGpXGDJ5ykjAvH1TTuAC9Dg5VFfc1dcfoEwX9qc1', + ], + }, + }, { name: 'Helikon', icon: 'Helikon', @@ -779,6 +797,9 @@ export const ValidatorCommunity: ValidatorEntry[] = [ 'Gfwn89EPQqTbcfhuSPznquqAC1N2GFDCzqLbMQaijUwDspf', 'FVkxBDehfaTfRiGtE2m2zLnMXQXji66KVpd7xviufZpGYYC', 'HPrV3G2PR2AtyMf2uoDBE4GyvRGdz9UhUASEvSGEENmobBB', + 'Gj4dYBs4PPvQjf7Exkrpfe65EoitvdecNYhtBPa3ymWZF3S', + 'HqFz6V9aV4dLXaGp6TY5tLdK85vkiiea96GVUJQ7hgXUqh5', + 'EfWJofhHXhL6RkaoSxrXbq3wWkta1bmXxqTbDtBcF5wnR6N', ], }, }, diff --git a/packages/styles/theme/theme.scss b/packages/styles/theme/theme.scss index 48b0d58c70..47a1baf6fd 100644 --- a/packages/styles/theme/theme.scss +++ b/packages/styles/theme/theme.scss @@ -90,12 +90,14 @@ SPDX-License-Identifier: GPL-3.0-only */ --grid-color-secondary: #e8e8e8; --grid-canvas-axis: #222; --grid-canvas: #ccc; - --card-shadow: -1px -2px 12px 1px var(--card-shadow-color-secondary), + --card-shadow: + -1px -2px 12px 1px var(--card-shadow-color-secondary), 0px 0.5px 1px 0px var(--card-deep-shadow-color), 0 3.5px 6px -1px var(--card-shadow-color), 0.4px -0.4px 0px 0px var(--card-shadow-color), -0.4px 0px 0px 0px var(--card-shadow-color); - --card-shadow-secondary: 0px 1px 1px 0px var(--card-shadow-color-secondary), + --card-shadow-secondary: + 0px 1px 1px 0px var(--card-shadow-color-secondary), 0 0.5px 1px -1px var(--card-shadow-color-secondary), 0.4px -0.4px 0px 0px var(--card-shadow-color-secondary), -0.4px 0px 0px 0px var(--card-shadow-color-secondary); @@ -168,12 +170,14 @@ SPDX-License-Identifier: GPL-3.0-only */ --grid-color-secondary: rgb(53 45 53); --grid-canvas-axis: #eee; --grid-canvas: #444; - --card-shadow: -1px -2px 12px 1px var(--card-shadow-color-secondary), + --card-shadow: + -1px -2px 12px 1px var(--card-shadow-color-secondary), 0px 0.75px 1px 0px var(--card-deep-shadow-color), 0 3.5px 6px -1px var(--card-shadow-color), 0.4px -0.4px 0px 0px var(--card-shadow-color), -0.4px 0px 0px 0px var(--card-shadow-color); - --card-shadow-secondary: 0px 1px 1px 0px var(--card-shadow-color-secondary), + --card-shadow-secondary: + 0px 1px 1px 0px var(--card-shadow-color-secondary), 0 0.5px 1px -1px var(--card-shadow-color-secondary), 0.4px -0.4px 0px 0px var(--card-shadow-color-secondary), -0.4px 0px 0px 0px var(--card-shadow-color-secondary); diff --git a/yarn.lock b/yarn.lock index 6f00eac710..b98825913a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5221,12 +5221,12 @@ __metadata: languageName: node linkType: hard -"@w3ux/validator-assets@npm:^0.3.1": - version: 0.3.1 - resolution: "@w3ux/validator-assets@npm:0.3.1" +"@w3ux/validator-assets@npm:^0.3.2": + version: 0.3.2 + resolution: "@w3ux/validator-assets@npm:0.3.2" peerDependencies: react: ^18 - checksum: 10c0/1130d2be6debcb6589d635a890b331cb8047d497047df6c5e966a5f2edead6dc7ba1d59855ef595bcc3587691ae9ba1165375f44ef55e8191af0ef3643359e9d + checksum: 10c0/7a1e87093017556c2c1af7350b79e58d319d327bd939395ac58635a8c10ca6998eb8f41c3c3532bc133d5b1aa7dcb8fb0d6063095a0461673c54a5d83cacf396 languageName: node linkType: hard @@ -5787,7 +5787,7 @@ __metadata: "@w3ux/factories": "npm:^1.0.0" "@w3ux/react-connect-kit": "npm:^2.1.1" "@w3ux/react-odometer": "npm:^1.1.0" - "@w3ux/validator-assets": "npm:^0.3.1" + "@w3ux/validator-assets": "npm:^0.3.2" "@zondax/ledger-substrate": "npm:^1.0.1" assets: "workspace:*" buffer: "npm:^6.0.3"