diff --git a/.changeset/smooth-terms-stare.md b/.changeset/smooth-terms-stare.md new file mode 100644 index 0000000000..845148fadd --- /dev/null +++ b/.changeset/smooth-terms-stare.md @@ -0,0 +1,5 @@ +--- +'web-neutron': major +--- + +updated params page and token display in staking component diff --git a/apps/web-neutron/src/chainConfig/types.ts b/apps/web-neutron/src/chainConfig/types.ts index 45a4065b3d..eba5e2a6f5 100644 --- a/apps/web-neutron/src/chainConfig/types.ts +++ b/apps/web-neutron/src/chainConfig/types.ts @@ -147,7 +147,7 @@ export interface ChainConfig extends ChainSettings { keplr: string | undefined; provider: { primaryTokenUnit: string; - tokenunits: { + tokenUnits: { [token: string]: { display: string; exponent: number; diff --git a/apps/web-neutron/src/components/layout/index.tsx b/apps/web-neutron/src/components/layout/index.tsx new file mode 100644 index 0000000000..3a7e0aa70b --- /dev/null +++ b/apps/web-neutron/src/components/layout/index.tsx @@ -0,0 +1,54 @@ +import { motion, Transition, Variants } from 'framer-motion'; +import Banner, { getBannersLinks } from '@/components/banner'; +import Footer from '@/components/footer'; +import useStyles from '@/components/layout/styles'; +import type { LayoutProps } from '@/components/layout/types'; +import Nav from '@/components/nav'; +import Typography from '@mui/material/Typography'; +import useAppTranslation from '@/hooks/useAppTranslation'; + +const bannerLinks = getBannersLinks(); + +const variants: Variants = { + initial: { filter: 'blur(4px)' }, + animate: { filter: 'blur(0px)' }, + exit: { filter: 'blur(4px)' }, +}; + +const transition: Transition = { + duration: 1, +}; + +const Layout = (props: LayoutProps) => { + const { classes, cx } = useStyles(); + const { children, navTitle, className } = props; + const { t } = useAppTranslation('validators'); + + return ( + + + + + + {!!bannerLinks.length && } + {navTitle === 'Validators' ? ( + + {t('stakingDataIsSourcedFromCosmoshub')} + + ) : null} + {children} + + + + + ); +}; + +export default Layout; diff --git a/apps/web-neutron/src/components/layout/styles.ts b/apps/web-neutron/src/components/layout/styles.ts new file mode 100644 index 0000000000..298b2bd167 --- /dev/null +++ b/apps/web-neutron/src/components/layout/styles.ts @@ -0,0 +1,49 @@ +import { CSSObject } from '@emotion/react'; +import { makeStyles } from 'tss-react/mui'; + +const useStyles = makeStyles()(theme => ({ + root: { + [theme.breakpoints.up('lg')]: { + display: 'flex', + flexDirection: 'column', + minHeight: '100vh', + }, + }, + contentWrapper: { + [theme.breakpoints.up('lg')]: { + display: 'flex', + flex: 1, + }, + }, + footer: { + [theme.breakpoints.up('lg')]: { + position: 'relative', + zIndex: 1299, + }, + }, + appBarPlaceholder: theme.mixins.toolbar as CSSObject, + children: { + flexGrow: 1, + display: 'flex', + flexDirection: 'column', + '& .main-content': { + width: '100%', + flex: 1, + }, + }, + content: { + flex: 1, + display: 'flex', + alignItems: 'center', + justifyContent: 'space-around', + textAlign: 'center', + color: theme.palette.custom.fonts.fontOne, + backgroundColor: theme.palette.custom.wallet.backgroundTwo, + padding: theme.spacing(1.5), + marginTop: theme.spacing(2), + marginLeft: theme.spacing(1), + marginRight: theme.spacing(1), + }, +})); + +export default useStyles; diff --git a/apps/web-neutron/src/components/nav/components/title_bar/styles.ts b/apps/web-neutron/src/components/nav/components/title_bar/styles.ts new file mode 100644 index 0000000000..5b6e7f2c3a --- /dev/null +++ b/apps/web-neutron/src/components/nav/components/title_bar/styles.ts @@ -0,0 +1,76 @@ +import { makeStyles } from 'tss-react/mui'; + +const useStyles = makeStyles()((theme) => ({ + root: { + padding: theme.spacing(1, 2), + display: 'flex', + justifyContent: 'center', + flexDirection: 'column', + alignItems: 'flex-start', + [theme.breakpoints.up('lg')]: { + padding: theme.spacing(1, 3), + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + flexDirection: 'row', + width: '100%', + '& .MuiTypography-h1': { + lineHeight: 1, + alignSelf: 'flex-end', + }, + }, + '&& h1': { + lineHeight: '56px', + }, + }, + logo: { + height: '36px', + }, + content: { + width: '100%', + background: theme.palette.custom.general.surfaceOne, + marginTop: theme.spacing(2), + borderRadius: theme.shape.borderRadius, + padding: theme.spacing(1), + display: 'flex', + flexDirection: 'column', + flexWrap: 'wrap', + alignItems: 'flex-start', + [theme.breakpoints.up('md')]: { + flexDirection: 'row', + }, + [theme.breakpoints.up('lg')]: { + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 0, + width: '70%', + padding: theme.spacing(1, 3), + flexWrap: 'nowrap', + }, + }, + item: { + display: 'flex', + alignItems: 'flex-start', + justifyContent: 'flex-start', + flexDirection: 'column', + padding: theme.spacing(1), + width: '100%', + '& .label': { + marginRight: theme.spacing(1), + }, + [theme.breakpoints.up('sm')]: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + [theme.breakpoints.up('md')]: { + width: '50%', + }, + [theme.breakpoints.up('lg')]: { + padding: 0, + width: 'auto', + }, + }, +})); + +export default useStyles; diff --git a/apps/web-neutron/src/screens/params/hooks.ts b/apps/web-neutron/src/screens/params/hooks.ts index 2bcb35330f..b9d65ad0a0 100644 --- a/apps/web-neutron/src/screens/params/hooks.ts +++ b/apps/web-neutron/src/screens/params/hooks.ts @@ -1,63 +1,16 @@ -import numeral from 'numeral'; import * as R from 'ramda'; import { useCallback, useState } from 'react'; -import chainConfig from '@/chainConfig'; import { ParamsQuery, useParamsQuery } from '@/graphql/types/provider_types'; -import { DistributionParams, GovParams, MintParams, SlashingParams, StakingParams } from '@/models'; +import { DistributionParams, MintParams } from '@/models'; import type { ParamsState } from '@/screens/params/types'; -import { formatToken } from '@/utils/format_token'; import CCVConsumerParams from '../../models/ccv_consumer_params'; -const { primaryTokenUnit } = chainConfig(); - const initialState: ParamsState = { loading: true, exists: true, ccvConsumer: null, - staking: null, - slashing: null, minting: null, distribution: null, - gov: null, -}; - -// ================================ -// staking -// ================================ -const formatStaking = (data: ParamsQuery) => { - if (data.bdjuno_provider?.staking_params.length) { - const stakingParamsRaw = StakingParams.fromJson( - data?.bdjuno_provider?.staking_params?.[0]?.params ?? {} - ); - return { - bondDenom: stakingParamsRaw.bondDenom, - unbondingTime: stakingParamsRaw.unbondingTime, - maxEntries: stakingParamsRaw.maxEntries, - historicalEntries: stakingParamsRaw.historicalEntries, - maxValidators: stakingParamsRaw.maxValidators, - }; - } - - return null; -}; - -// ================================ -// slashing -// ================================ -const formatSlashing = (data: ParamsQuery) => { - if (data.bdjuno_provider?.staking_params.length) { - const slashingParamsRaw = SlashingParams.fromJson( - data?.bdjuno_provider?.staking_params?.[0]?.params ?? {} - ); - return { - downtimeJailDuration: slashingParamsRaw.downtimeJailDuration, - minSignedPerWindow: slashingParamsRaw.minSignedPerWindow, - signedBlockWindow: slashingParamsRaw.signedBlockWindow, - slashFractionDoubleSign: slashingParamsRaw.slashFractionDoubleSign, - slashFractionDowntime: slashingParamsRaw.slashFractionDowntime, - }; - } - return null; }; // ================================ @@ -102,30 +55,6 @@ const formatDistribution = (data: ParamsQuery) => { return null; }; -// ================================ -// distribution -// ================================ - -const formatGov = (data: ParamsQuery) => { - if (data.bdjuno_provider?.gov_params.length) { - const govParamsRaw = GovParams.fromJson(data?.bdjuno_provider?.gov_params?.[0] ?? {}); - return { - minDeposit: formatToken( - govParamsRaw.depositParams.minDeposit?.[0]?.amount ?? 0, - govParamsRaw.depositParams.minDeposit?.[0]?.denom ?? primaryTokenUnit - ), - maxDepositPeriod: govParamsRaw.depositParams.maxDepositPeriod, - quorum: numeral(numeral(govParamsRaw.tallyParams.quorum).format('0.[00]')).value() ?? 0, - threshold: numeral(numeral(govParamsRaw.tallyParams.threshold).format('0.[00]')).value() ?? 0, - vetoThreshold: - numeral(numeral(govParamsRaw.tallyParams.vetoThreshold).format('0.[00]')).value() ?? 0, - votingPeriod: govParamsRaw.votingParams.votingPeriod, - }; - } - - return null; -}; - const formatCCVConsumer = (data: ParamsQuery) => { if (data?.ccv_consumer_params[0]?.params) { const ccvConsumerParamsRaw = CCVConsumerParams(data?.ccv_consumer_params[0]?.params ?? {}); @@ -149,16 +78,10 @@ const formatParam = (data: ParamsQuery) => { results.ccvConsumer = formatCCVConsumer(data); - results.staking = formatStaking(data); - - results.slashing = formatSlashing(data); - results.minting = formatMint(data); results.distribution = formatDistribution(data); - results.gov = formatGov(data); - return results; }; diff --git a/apps/web-neutron/src/screens/params/index.tsx b/apps/web-neutron/src/screens/params/index.tsx index 39077de3da..8d6b682e16 100644 --- a/apps/web-neutron/src/screens/params/index.tsx +++ b/apps/web-neutron/src/screens/params/index.tsx @@ -5,34 +5,12 @@ import Layout from '@/components/layout'; import LoadAndExist from '@/components/load_and_exist'; import { useParams } from '@/screens/params/hooks'; import useStyles from '@/screens/params/styles'; -import { - formatDistribution, - formatGov, - formatMinting, - formatSlashing, - formatStaking, - formatCCVConsumer, -} from '@/screens/params/utils'; +import { formatDistribution, formatMinting, formatCCVConsumer } from '@/screens/params/utils'; const Params = () => { const { t } = useAppTranslation('params'); const { classes } = useStyles(); const { state } = useParams(); - - const staking = state.staking - ? { - title: t('staking') ?? undefined, - details: formatStaking(state.staking, t), - } - : null; - - const slashing = state.slashing - ? { - title: t('slashing') ?? undefined, - details: formatSlashing(state.slashing, t), - } - : null; - const minting = state.minting ? { title: t('minting') ?? undefined, @@ -47,13 +25,6 @@ const Params = () => { } : null; - const gov = state.gov - ? { - title: t('gov') ?? undefined, - details: formatGov(state.gov, t), - } - : null; - const ccvConsumer = state.ccvConsumer ? { title: t('CCVConsumer') ?? undefined, @@ -71,11 +42,8 @@ const Params = () => { - {staking && } - {slashing && } {minting && } {distribution && } - {gov && } {ccvConsumer && } diff --git a/apps/web-neutron/src/screens/params/types.ts b/apps/web-neutron/src/screens/params/types.ts index c38d28780c..7e4177126c 100644 --- a/apps/web-neutron/src/screens/params/types.ts +++ b/apps/web-neutron/src/screens/params/types.ts @@ -1,19 +1,3 @@ -export interface Staking { - bondDenom: string; - unbondingTime: number; - maxEntries: number; - historicalEntries: number; - maxValidators: number; -} - -export interface Slashing { - downtimeJailDuration: number; - minSignedPerWindow: number; - signedBlockWindow: number; - slashFractionDoubleSign: number; - slashFractionDowntime: number; -} - export interface Minting { blocksPerYear: number; goalBonded: number; @@ -30,15 +14,6 @@ export interface Distribution { withdrawAddressEnabled: boolean; } -export interface Gov { - minDeposit: TokenUnit; - maxDepositPeriod: number; - quorum: number; - threshold: number; - vetoThreshold: number; - votingPeriod: number; -} - export interface CCVConsumer { enabled: boolean; unbondingPeriod: number; @@ -54,9 +29,6 @@ export interface ParamsState { loading: boolean; exists: boolean; ccvConsumer: CCVConsumer | null; - staking: Staking | null; - slashing: Slashing | null; minting: Minting | null; distribution: Distribution | null; - gov: Gov | null; } diff --git a/apps/web-neutron/src/screens/params/utils.tsx b/apps/web-neutron/src/screens/params/utils.tsx index 33d7059b98..1f94921a2a 100644 --- a/apps/web-neutron/src/screens/params/utils.tsx +++ b/apps/web-neutron/src/screens/params/utils.tsx @@ -1,11 +1,4 @@ -import type { - CCVConsumer, - Distribution, - Gov, - Minting, - Slashing, - Staking, -} from '@/screens/params/types'; +import type { CCVConsumer, Distribution, Minting } from '@/screens/params/types'; import { nanoToSeconds, secondsToDays } from '@/utils/time'; import type { TFunction } from '@/hooks/useAppTranslation'; import numeral from 'numeral'; @@ -21,64 +14,6 @@ const convertBySeconds = (seconds: number, t: TFunction) => { }); }; -export const formatStaking = (data: Staking, t: TFunction) => [ - { - key: 'bondDenom', - label: t('bondDenom'), - detail: data.bondDenom, - }, - { - key: 'unbondingTime', - label: t('unbondingTime'), - detail: convertBySeconds(nanoToSeconds(data.unbondingTime), t), - }, - { - key: 'maxEntries', - label: t('maxEntries'), - detail: numeral(data.maxEntries).format('0,0'), - }, - { - key: 'historicalEntries', - label: t('historicalEntries'), - detail: numeral(data.historicalEntries).format('0,0'), - }, - { - key: 'maxValidators', - label: t('maxValidators'), - detail: numeral(data.maxValidators).format('0,0'), - }, -]; - -export const formatSlashing = (data: Slashing, t: TFunction) => [ - { - key: 'downtimeJailDuration', - label: t('downtimeJailDuration'), - detail: t('seconds', { - second: numeral(nanoToSeconds(data.downtimeJailDuration)).format('0,0'), - }), - }, - { - key: 'minSignedPerWindow', - label: t('minSignedPerWindow'), - detail: `${numeral(data.minSignedPerWindow * 100).format('0.[00]')}%`, - }, - { - key: 'signedBlockWindow', - label: t('signedBlockWindow'), - detail: numeral(data.signedBlockWindow).format('0,0'), - }, - { - key: 'slashFractionDoubleSign', - label: t('slashFractionDoubleSign'), - detail: `${data.slashFractionDoubleSign * 100} / 100`, - }, - { - key: 'slashFractionDowntime', - label: t('slashFractionDowntime'), - detail: `${data.slashFractionDowntime * 10000} / ${numeral(10000).format('0,0')}`, - }, -]; - export const formatMinting = (data: Minting, t: TFunction) => [ { key: 'blocksPerYear', @@ -135,39 +70,6 @@ export const formatDistribution = (data: Distribution, t: TFunction) => [ }, ]; -export const formatGov = (data: Gov, t: TFunction) => [ - { - key: 'minDeposit', - label: t('minDeposit'), - detail: `${data.minDeposit.value} ${data.minDeposit.displayDenom.toUpperCase()}`, - }, - { - key: 'maxDepositPeriod', - label: t('maxDepositPeriod'), - detail: convertBySeconds(nanoToSeconds(data.maxDepositPeriod), t), - }, - { - key: 'quorum', - label: t('quorum'), - detail: `${numeral(data.quorum * 100).format('0.[00]')}%`, - }, - { - key: 'threshold', - label: t('threshold'), - detail: `${numeral(data.threshold * 100).format('0.[00]')}%`, - }, - { - key: 'vetoThreshold', - label: t('vetoThreshold'), - detail: `${numeral(data.vetoThreshold * 100).format('0.[00]')}%`, - }, - { - key: 'votingPeriod', - label: t('votingPeriod'), - detail: convertBySeconds(nanoToSeconds(data.votingPeriod), t), - }, -]; - export const formatCCVConsumer = (data: CCVConsumer, t: TFunction) => [ { key: 'unbondingPeriod', diff --git a/apps/web-neutron/src/screens/validator_details/components/blocks/hooks.ts b/apps/web-neutron/src/screens/validator_details/components/blocks/hooks.ts deleted file mode 100644 index 88db99c252..0000000000 --- a/apps/web-neutron/src/screens/validator_details/components/blocks/hooks.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useRouter } from 'next/router'; -import { useState } from 'react'; -import { - LastHundredBlocksSubscription, - useLastHundredBlocksSubscription, -} from '@/graphql/types/provider_types'; - -const formatLastHundredBlocks = (data: LastHundredBlocksSubscription) => - data.block.map((x) => ({ - height: x.height, - txs: x.transactions.length, - proposer: x.ccv_validator?.validator?.validatorInfo?.operatorAddress ?? '', - signed: x.precommits.length === 1, - })); - -type BlocksState = { - height: number; - txs: number; - proposer: string; - signed: boolean; -}[]; - -export const useBlocks = (address?: string) => { - const [state, setState] = useState([]); - - const router = useRouter(); - - const { loading } = useLastHundredBlocksSubscription({ - variables: { - address: address ?? (router?.query?.address as string) ?? '', - }, - onData: (data) => { - if (!data.data.data) return; - setState(formatLastHundredBlocks(data.data.data)); - }, - }); - - return { - state, - loading, - }; -}; diff --git a/apps/web-neutron/src/screens/validator_details/components/blocks/index.tsx b/apps/web-neutron/src/screens/validator_details/components/blocks/index.tsx new file mode 100644 index 0000000000..f1a1db44b8 --- /dev/null +++ b/apps/web-neutron/src/screens/validator_details/components/blocks/index.tsx @@ -0,0 +1,20 @@ +import Typography from '@mui/material/Typography'; +import useAppTranslation from '@/hooks/useAppTranslation'; +import { FC } from 'react'; +import Box from '@/components/box'; +import useStyles from '@/screens/validator_details/components/blocks/styles'; + +const Blocks: FC = ({ className }) => { + const { t } = useAppTranslation('validators'); + const { classes, cx } = useStyles(); + return ( + + {t('lastBlocks')} + + {t('comingSoon')} + + + ); +}; + +export default Blocks; diff --git a/apps/web-neutron/src/screens/validator_details/components/blocks/styles.ts b/apps/web-neutron/src/screens/validator_details/components/blocks/styles.ts new file mode 100644 index 0000000000..8c0b6fe457 --- /dev/null +++ b/apps/web-neutron/src/screens/validator_details/components/blocks/styles.ts @@ -0,0 +1,21 @@ +import { makeStyles } from 'tss-react/mui'; + +const useStyles = makeStyles()(theme => ({ + root: { + '& .MuiTypography-h2': { + marginBottom: theme.spacing(2), + }, + }, + content: { + flex: 1, + display: 'flex', + alignItems: 'center', + justifyContent: 'space-around', + color: theme.palette.custom.fonts.fontThree, + backgroundColor: theme.palette.custom.general.surfaceTwo, + borderRadius: '8px', + height: '22vh', + }, +})); + +export default useStyles; diff --git a/apps/web-neutron/src/screens/validator_details/components/staking/hooks.ts b/apps/web-neutron/src/screens/validator_details/components/staking/hooks.ts index 2399173cb2..04d399aaf6 100644 --- a/apps/web-neutron/src/screens/validator_details/components/staking/hooks.ts +++ b/apps/web-neutron/src/screens/validator_details/components/staking/hooks.ts @@ -23,14 +23,14 @@ import { } from '@/screens/validator_details/components/staking/types'; import { formatProviderToken } from '../../../../utils/format_provider_token'; -const provider = chainConfig(); +const config = chainConfig(); export const ROWS_PER_PAGE = 10; export const formatDelegations = (data: Delegations[]) => data .map((x): UnbondingType => { const address = R.pathOr('', ['delegator_address'], x); - const delegation = getDenom(x.coins, provider.primaryTokenUnit); + const delegation = getDenom(x.coins, config.provider.primaryTokenUnit); return { address, amount: formatProviderToken(delegation.amount, delegation.denom), @@ -45,7 +45,7 @@ export const formatRedelegations = (data: Redelegations[]) => { results.push({ address: x?.delegator_address ?? '', to: x?.validator_dst_address ?? '', - amount: formatProviderToken(y.balance, provider.primaryTokenUnit), + amount: formatProviderToken(y.balance, config.provider.primaryTokenUnit), completionTime: R.pathOr('', ['completion_time'], y), }); }); @@ -61,7 +61,7 @@ export const formatUnbondings = (data: Undelegations[]) => { x?.entries?.forEach((y) => { results.push({ address: R.pathOr('', ['delegator_address'], x), - amount: formatProviderToken(y.balance, provider.primaryTokenUnit), + amount: formatProviderToken(y.balance, config.provider.primaryTokenUnit), completionTime: R.pathOr('', ['completion_time'], y), }); }); diff --git a/apps/web-neutron/src/screens/validator_details/index.tsx b/apps/web-neutron/src/screens/validator_details/index.tsx new file mode 100644 index 0000000000..0eab35742a --- /dev/null +++ b/apps/web-neutron/src/screens/validator_details/index.tsx @@ -0,0 +1,56 @@ +import { NextSeo } from 'next-seo'; +import useAppTranslation from '@/hooks/useAppTranslation'; +import DesmosProfile from '@/components/desmos_profile'; +import Layout from '@/components/layout'; +import LoadAndExist from '@/components/load_and_exist'; +import Blocks from '@/screens/validator_details/components/blocks'; +import Profile from '@/screens/validator_details/components/profile'; +import Staking from '@/screens/validator_details/components/staking'; +import Transactions from '@/screens/validator_details/components/transactions'; +import ValidatorOverview from '@/screens/validator_details/components/validator_overview'; +import VotingPower from '@/screens/validator_details/components/voting_power'; +import { useValidatorDetails } from '@/screens/validator_details/hooks'; +import useStyles from '@/screens/validator_details/styles'; + +const ValidatorDetails = () => { + const { t } = useAppTranslation('validators'); + const { classes } = useStyles(); + const { state, loading } = useValidatorDetails(); + const { desmosProfile, exists, overview, status, votingPower, cosmosAddress } = state; + + return ( + <> + + + + + {desmosProfile ? ( + + ) : ( + + )} + + + + + + + + + > + ); +}; + +export default ValidatorDetails; diff --git a/apps/web-neutron/src/utils/format_provider_token/index.ts b/apps/web-neutron/src/utils/format_provider_token/index.ts index d361b350f4..afb664b453 100644 --- a/apps/web-neutron/src/utils/format_provider_token/index.ts +++ b/apps/web-neutron/src/utils/format_provider_token/index.ts @@ -12,9 +12,9 @@ const provider = chainConfig(); */ export const formatProviderToken = ( value: number | string | null | undefined, - denom = '' + denom: string ): TokenUnit => { - const selectedDenom = provider?.tokenUnits[denom]; + const selectedDenom = provider?.provider?.tokenUnits[denom]; if (typeof value !== 'string' && typeof value !== 'number') { value = '0'; diff --git a/packages/ui/public/locales/en/web_neutron.json b/packages/ui/public/locales/en/web_neutron.json index 80b77b3c19..ab85a0eda0 100644 --- a/packages/ui/public/locales/en/web_neutron.json +++ b/packages/ui/public/locales/en/web_neutron.json @@ -6,5 +6,7 @@ "params.softOptOutThreshold": "Soft Opt Out Threshold", "params.transferTimeoutPeriod": "Transfer Timeout Period", "params.consumerRedistributionFraction": "Consumer Redistribution Fraction", - "params.blocksPerDistributionTransmission": "Blocks Per Distribution Transmission" + "params.blocksPerDistributionTransmission": "Blocks Per Distribution Transmission", + "validators.stakingDataIsSourcedFromCosmoshub": "The staking data is sourced from Cosmos Hub, as Neutron is a consumer chain.", + "validators.comingSoon": "Coming soon" } \ No newline at end of file diff --git a/packages/ui/public/locales/it/web_neutron.json b/packages/ui/public/locales/it/web_neutron.json index 257a5fb874..05784048f4 100644 --- a/packages/ui/public/locales/it/web_neutron.json +++ b/packages/ui/public/locales/it/web_neutron.json @@ -6,5 +6,6 @@ "params.softOptOutThreshold": "Soglia di disattivazione soft", "params.transferTimeoutPeriod": "Periodo di timeout del trasferimento", "params.consumerRedistributionFraction": "Frazione di ridistribuzione del consumatore", - "params.blocksPerDistributionTransmission": "Blocchi per trasmissione di distribuzione" + "params.blocksPerDistributionTransmission": "Blocchi per trasmissione di distribuzione", + "validators.stakingDataIsSourcedFromCosmoshub": "I dati di staking provengono da Cosmos Hub, poiché Neutron è una catena di consumatori." } \ No newline at end of file diff --git a/packages/ui/public/locales/pl/web_neutron.json b/packages/ui/public/locales/pl/web_neutron.json index caf420ee20..d8d3f15f48 100644 --- a/packages/ui/public/locales/pl/web_neutron.json +++ b/packages/ui/public/locales/pl/web_neutron.json @@ -6,5 +6,6 @@ "params.softOptOutThreshold": "Próg rezygnacji", "params.transferTimeoutPeriod": "Okres limitu czasu transferu", "params.consumerRedistributionFraction": "Frakcja redystrybucji konsumentów", - "params.blocksPerDistributionTransmission": "Bloki na transmisję dystrybucyjną" + "params.blocksPerDistributionTransmission": "Bloki na transmisję dystrybucyjną", + "validators.stakingDataIsSourcedFromCosmoshub": "Dane dotyczące stakingu pochodzą z Cosmos Hub, ponieważ Neutron jest siecią konsumencką." } \ No newline at end of file diff --git a/packages/ui/public/locales/zhs/web_neutron.json b/packages/ui/public/locales/zhs/web_neutron.json index 4dd1e73c38..5aeff37b5d 100644 --- a/packages/ui/public/locales/zhs/web_neutron.json +++ b/packages/ui/public/locales/zhs/web_neutron.json @@ -6,5 +6,6 @@ "params.softOptOutThreshold": "软选择退出阈值", "params.transferTimeoutPeriod": "传输超时时间", "params.consumerRedistributionFraction": "消费者重新分配分数", - "params.blocksPerDistributionTransmission": "每次分发传输的块数" + "params.blocksPerDistributionTransmission": "每次分发传输的块数", + "validators.stakeDataIsSourcedFromCosmoshub": "质押数据来源于 Cosmos Hub,因为 Neutron 是一条消费者链。" } \ No newline at end of file diff --git a/packages/ui/public/locales/zht/web_neutron.json b/packages/ui/public/locales/zht/web_neutron.json index b9a4439541..424d11d9ab 100644 --- a/packages/ui/public/locales/zht/web_neutron.json +++ b/packages/ui/public/locales/zht/web_neutron.json @@ -6,5 +6,6 @@ "params.softOptOutThreshold": "軟體選擇退出閾值", "params.transferTimeoutPeriod": "傳輸逾時時間", "params.consumerRedistributionFraction": "消費者重新分配分數", - "params.blocksPerDistributionTransmission": "每次分發傳輸的區塊數" + "params.blocksPerDistributionTransmission": "每次分發傳輸的區塊數", + "validators.stakeDataIsSourcedFromCosmoshub": "質押資料來自 Cosmos Hub,因為 Neutron 是一條消費鏈。" } \ No newline at end of file