Skip to content

Commit ba0074f

Browse files
authored
Merge pull request #1401 from PolkaGate/addPaseo
support Paseo
2 parents e22cc96 + df9af38 commit ba0074f

File tree

12 files changed

+116
-173
lines changed

12 files changed

+116
-173
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"@polkadot/types-support": "^11.2.1",
6565
"@polkadot/util": "^12.6.2",
6666
"@polkadot/util-crypto": "^12.6.2",
67-
"@polkagate/apps-config": "^0.133.87",
67+
"@polkagate/apps-config": "^0.140.2",
6868
"@substrate/connect": "^0.7.32",
6969
"@vaadin/icons": "^23.2.3",
7070
"babel-plugin-transform-import-meta": "^2.1.1",

packages/extension-polkagate/src/fullscreen/stake/easyMode/index.tsx

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Copyright 2019-2024 @polkadot/extension-polkagate authors & contributors
22
// SPDX-License-Identifier: Apache-2.0
3-
// @ts-nocheck
43

54
/* eslint-disable react/jsx-max-props-per-line */
65

@@ -18,6 +17,7 @@ import type { BalancesInfo } from '../../../util/types';
1817
import { amountToHuman, amountToMachine } from '../../../util/utils';
1918
import type { Inputs } from '../Entry';
2019
import { STEPS } from '..';
20+
import { POLKAGATE_POOL_IDS } from '../../../util/constants';
2121

2222
interface Props {
2323
address: string
@@ -27,22 +27,16 @@ interface Props {
2727
setInputs: React.Dispatch<React.SetStateAction<Inputs | undefined>>
2828
}
2929

30-
const POLKAGATE_POOL_IDS = {
31-
Kusama: 18,
32-
Polkadot: 8,
33-
Westend: 6
34-
};
35-
3630
export default function EasyMode({ address, balances, inputs, setInputs, setStep }: Props): React.ReactElement {
3731
const { t } = useTranslation();
3832
const theme = useTheme();
3933
const { api, chainName, decimal, formatted } = useInfo(address);
40-
const pool = usePool(address, POLKAGATE_POOL_IDS[chainName] as number);
34+
const pool = usePool(address, POLKAGATE_POOL_IDS[chainName as string] as number);
4135

4236
const poolConsts = usePoolConsts(address);
4337
const stakingConsts = useStakingConsts(address);
4438

45-
const [amount, setAmount] = useState<string>(inputs?.extraInfo?.amount);
39+
const [amount, setAmount] = useState<string>(inputs?.extraInfo?.['amount'] as string);
4640
const [amountAsBN, setAmountAsBN] = useState<BN>(BN_ZERO);
4741
const [isNextClicked, setNextIsClicked] = useState<boolean>();
4842
const [topStakingLimit, setTopStakingLimit] = useState<BN>();
@@ -55,7 +49,7 @@ export default function EasyMode({ address, balances, inputs, setInputs, setStep
5549
return !amount || !amountAsBN || !topStakingLimit || parseFloat(amount) === 0 || amountAsBN.gt(topStakingLimit);
5650
}, [amount, amountAsBN, topStakingLimit]);
5751

58-
const isBusy = !inputs?.extraInfo?.amount && isNextClicked;
52+
const isBusy = !inputs?.extraInfo?.['amount'] && isNextClicked;
5953

6054
useEffect(() => {
6155
if (!amountAsBN || !amount) {
@@ -75,11 +69,11 @@ export default function EasyMode({ address, balances, inputs, setInputs, setStep
7569
}
7670

7771
if (!api?.call?.['transactionPaymentApi']) {
78-
return setEstimatedMaxFee(api.createType('Balance', BN_ONE));
72+
return setEstimatedMaxFee(api.createType('Balance', BN_ONE) as Balance);
7973
}
8074

8175
amountAsBN && api.tx['nominationPools']['bondExtra']({ FreeBalance: availableBalance.toString() }).paymentInfo(formatted).then((i) => {
82-
setEstimatedMaxFee(api.createType('Balance', i?.partialFee));
76+
setEstimatedMaxFee(api.createType('Balance', i?.partialFee) as Balance);
8377
});
8478
}, [formatted, api, availableBalance, amount, decimal, amountAsBN]);
8579

@@ -103,8 +97,7 @@ export default function EasyMode({ address, balances, inputs, setInputs, setStep
10397
pool
10498
});
10599
} else {
106-
console.log('waiting!');
107-
console.log('waiting:', amount, amountAsBN, poolConsts, pool, api, poolConsts?.minJoinBond && amountAsBN?.gte(poolConsts?.minJoinBond));
100+
console.log('waiting for pool:', pool);
108101
}
109102
}, [amount, amountAsBN, api, pool, poolConsts, setInputs]);
110103

packages/extension-polkagate/src/fullscreen/stake/solo/partials/ShowValidator.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ function ShowValidator({ accountInfo, allInOneRow = true, api, chain, check, dec
108108
{t('Nominators')}:
109109
</Grid>
110110
<Grid fontSize='14px' fontWeight={400} item lineHeight='22px' pl='3px'>
111-
{v.exposure.others.length || t('N/A')}
111+
{v.exposure.others?.length || t('N/A')}
112112
</Grid>
113113
</Grid>
114114
<Grid alignItems='center' container item justifyContent='flex-end' sx={{ lineHeight: '23px', pl: '2px' }} width='fit-content'>

packages/extension-polkagate/src/fullscreen/stake/solo/partials/ValidatorsTable.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
// Copyright 2019-2024 @polkadot/extension-polkagate authors & contributors
22
// SPDX-License-Identifier: Apache-2.0
3-
// @ts-nocheck
43

54
/* eslint-disable react/jsx-max-props-per-line */
65

76
import type { AccountId } from '@polkadot/types/interfaces';
87

98
import { alpha, Grid, type SxProps, type Theme, useTheme } from '@mui/material';
109
import React, { useCallback, useEffect, useRef, useState } from 'react';
10+
// @ts-ignore
1111
import { FixedSizeList as List } from 'react-window';
1212

13-
import { DeriveAccountInfo } from '@polkadot/api-derive/types';
13+
import type { DeriveAccountInfo } from '@polkadot/api-derive/types';
1414
import { useInfo } from '@polkadot/extension-polkagate/src/hooks';
1515
import ValidatorInfoPage from '@polkadot/extension-polkagate/src/popup/staking/partial/ValidatorInfo';
1616
import { BN, hexToBn, isHex } from '@polkadot/util';
@@ -55,18 +55,18 @@ export default function ValidatorsTable({ activeValidators, address, allValidato
5555
}
5656

5757
const threshold = stakingConsts.maxNominatorRewardedPerValidator;
58-
const sortedNominators = v.exposure.others.sort((a, b) => b.value - a.value);
59-
const maybeMyIndex = staked ? sortedNominators.findIndex((n) => new BN(isHex(n.value) ? hexToBn(n.value) : String(n.value)).lt(staked)) : -1;
58+
const sortedNominators = v.exposure.others?.sort((a:any, b:any) => b.value - a.value);
59+
const maybeMyIndex = staked ? sortedNominators?.findIndex((n:any) => new BN(isHex(n.value) ? hexToBn(n.value) : String(n.value)).lt(staked)) : -1;
6060

6161
return {
62-
notSafe: v.exposure.others.length > threshold && (maybeMyIndex > threshold || maybeMyIndex === -1),
63-
safe: v.exposure.others.length > threshold && (maybeMyIndex < threshold || maybeMyIndex === -1)
62+
notSafe: v.exposure.others?.length > threshold && (maybeMyIndex > threshold || maybeMyIndex === -1),
63+
safe: v.exposure.others?.length > threshold && (maybeMyIndex < threshold || maybeMyIndex === -1)
6464
};
6565
}, [staked, stakingConsts]);
6666

6767
useEffect(() => {
68-
if (maxSelected) {
69-
ref.current.scrollTop = 0;
68+
if (maxSelected && ref.current) {
69+
(ref.current as any).scrollTop = 0;
7070
}
7171
}, [maxSelected]);
7272

@@ -93,8 +93,8 @@ export default function ValidatorsTable({ activeValidators, address, allValidato
9393
ref={ref}
9494
width={'100%'}
9595
>
96-
{({ index, key, style }) => {
97-
const v = validatorsToList[index];
96+
{({ index, key, style }: { index: number, key:number, style:any }) => {
97+
const v = validatorsToList![index];
9898
const isActive = !!activeValidators?.find((av) => v.accountId === av?.accountId);
9999
const isOversubscribed = overSubscribed(v);
100100
const accountInfo = allValidatorsIdentities?.find((a) => a.accountId === v?.accountId);

packages/extension-polkagate/src/hooks/usePeopleChain.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useMemo } from 'react';
77
import type { Chain } from '@polkadot/extension-chains/types';
88

99

10-
import { KUSAMA_PEOPLE_GENESIS_HASH, POLKADOT_GENESIS_HASH, WESTEND_PEOPLE_GENESIS_HASH } from '../util/constants';
10+
import { KUSAMA_PEOPLE_GENESIS_HASH, PASEO_GENESIS_HASH, POLKADOT_GENESIS_HASH, RELAY_CHAINS_NAMES, WESTEND_PEOPLE_GENESIS_HASH } from '../util/constants';
1111
import getChain from '../util/getChain';
1212
import { sanitizeChainName } from '../util/utils';
1313
import { useInfo, useMetadata } from '.';
@@ -24,8 +24,7 @@ interface PeopleChainInfo {
2424
*/
2525

2626
const getPeopleChainGenesisHash = (chainName: string | undefined) => {
27-
const relayChainNames = ['Westend', 'Kusama', 'Polkadot'];
28-
const startWith = relayChainNames.find((name) => chainName?.startsWith(name)) || undefined;
27+
const startWith = RELAY_CHAINS_NAMES.find((name) => chainName?.startsWith(name)) || undefined;
2928

3029
switch (startWith) {
3130
case 'Westend':
@@ -34,6 +33,8 @@ const getPeopleChainGenesisHash = (chainName: string | undefined) => {
3433
return KUSAMA_PEOPLE_GENESIS_HASH;
3534
case 'Polkadot':
3635
return POLKADOT_GENESIS_HASH; // should be changed to POLKADOT_PEOPLE_GENESIS_HASH in the future
36+
case 'Paseo':
37+
return PASEO_GENESIS_HASH;
3738
default:
3839
return undefined;
3940
}

packages/extension-polkagate/src/hooks/useTeleport.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Copyright 2019-2024 @polkadot/extension-polkagate authors & contributors
22
// SPDX-License-Identifier: Apache-2.0
3-
// @ts-nocheck
43

54
import type { LinkOption } from '@polkagate/apps-config/endpoints/types';
65
import type { ParaId } from '@polkadot/types/interfaces';
@@ -70,8 +69,8 @@ export default function useTeleport(address: string | undefined): Teleport {
7069
const [secondEndpoint, setSecondEndpoint] = useState<ExtLinkOption | undefined>(undefined);
7170

7271
useEffect((): void => {
73-
api && api.query.parachainInfo && api.query.parachainInfo.parachainId()
74-
.then(setParaId)
72+
api && api.query['parachainInfo'] && api.query['parachainInfo']['parachainId']()
73+
.then((id: any) => { setParaId(id) })
7574
.catch((error) => {
7675
console.error('Failed to fetch parachain ID:', error);
7776
});

packages/extension-polkagate/src/hooks/useValidatorSuggestion.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Copyright 2019-2024 @polkadot/extension-polkagate authors & contributors
22
// SPDX-License-Identifier: Apache-2.0
3-
// @ts-nocheck
43

54
import type { StakingConsts, ValidatorInfo, ValidatorInfoWithIdentity } from '../util/types';
65

@@ -23,7 +22,7 @@ export default function useValidatorSuggestion(address: string): ValidatorInfo[]
2322

2423
const [selected, setSelected] = useState<ValidatorInfo[] | undefined>();
2524

26-
const allValidators = useMemo(() => allValidatorsInfo?.current?.concat(allValidatorsInfo.waiting)?.filter((v) => v.validatorPrefs.blocked === false || v.validatorPrefs.blocked.isFalse), [allValidatorsInfo]);
25+
const allValidators = useMemo(() => allValidatorsInfo?.current?.concat(allValidatorsInfo.waiting)?.filter((v) => v.validatorPrefs.blocked as unknown as boolean === false || v.validatorPrefs.blocked.isFalse), [allValidatorsInfo]);
2726

2827
const onLimitValidatorsPerOperator = useCallback((validators: ValidatorInfoWithIdentity[] | undefined, limit: number): ValidatorInfoWithIdentity[] => {
2928
if (!validators?.length) {
@@ -38,7 +37,7 @@ export default function useValidatorSuggestion(address: string): ValidatorInfo[]
3837
v.identity = vId?.identity;
3938
});
4039

41-
aDeepCopyOfValidators.sort((v1, v2) => ('' + v1?.identity?.displayParent).localeCompare(v2?.identity?.displayParent));
40+
aDeepCopyOfValidators.sort((v1, v2) => ('' + v1?.identity?.displayParent).localeCompare(v2?.identity?.displayParent || ''));
4241

4342
let counter = 1;
4443
let indicator = aDeepCopyOfValidators[0];
@@ -65,7 +64,7 @@ export default function useValidatorSuggestion(address: string): ValidatorInfo[]
6564
// !v.validatorPrefs.blocked && // filter blocked validators
6665
Number(v.validatorPrefs.commission) !== 0 && // filter 0 commission validators, to exclude new and chilled validators
6766
(Number(v.validatorPrefs.commission) / (10 ** 7)) < DEFAULT_FILTERS.maxCommission.value && // filter high commission validators
68-
v.exposure.others.length && v.exposure.others.length < stakingConsts?.maxNominatorRewardedPerValidator// filter oversubscribed
67+
v.exposure.others?.length && v.exposure.others.length < stakingConsts?.maxNominatorRewardedPerValidator// filter oversubscribed
6968
// && v.exposure.others.length > stakingConsts?.maxNominatorRewardedPerValidator / 4 // filter validators with very low nominators
7069
);
7170
const filtered2 = onLimitValidatorsPerOperator(filtered1, DEFAULT_FILTERS.limitOfValidatorsPerOperator.value);

packages/extension-polkagate/src/popup/staking/partial/ShowValidator.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ function ShowValidator({ accountInfo, api, chain, check, decimal, handleCheck, i
100100
<Grid alignItems='end' container item sx={{ fontSize: '12px', fontWeight: 300, lineHeight: '23px' }} width='fit-content'>
101101
{t<string>('Nominators:')}
102102
<Grid fontSize='12px' fontWeight={400} item lineHeight='22px' pl='3px'>
103-
{v.exposure.others.length || t('N/A')}
103+
{v.exposure.others?.length || t('N/A')}
104104
</Grid>
105105
</Grid>
106106
<Grid alignItems='center' container item justifyContent='flex-end' sx={{ lineHeight: '23px', pl: '2px' }} width='fit-content'>

packages/extension-polkagate/src/util/constants.tsx

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ export const EXTENSION_NAME = 'Polkagate';
77
export const NEW_VERSION_ALERT = 'alert_v0.5.8';
88
export const PREFERRED_POOL_NAME = EXTENSION_NAME;
99

10+
export const POLKAGATE_POOL_IDS: { [key: string]: number } = {
11+
Kusama: 18,
12+
Polkadot: 8,
13+
Westend: 6,
14+
Paseo: 3
15+
};
16+
1017
// export const EXTENSION_FEEDBACK_FORM_URL = 'https://docs.google.com/forms/d/e/1FAIpQLSf2WHD0oVR0NS7tW6C1U025H1XBEZXqwxvFvPhcoFa18eHQiA/viewform';
1118

1219
export const BALANCES_VALIDITY_PERIOD = 5 * 60 * 1000; // to show outdated balance in grey
@@ -26,56 +33,54 @@ export const CHAINS_WITH_BLACK_LOGO = ['statescan', 'Centrifuge', 'Centrifuge Ch
2633
export const TOKENS_WITH_BLACK_LOGO = ['KSM', 'PEN', 'ZTG'];
2734
export const CHAINS_ON_POLKAHOLIC = ['Pendulum', 'Pendulum chain', 'Amplitude', 'Amplitude chain'];
2835
export const DISABLED_NETWORKS = ['3DP network', 'xx network', 'Polkadex Mainnet', 'Stafi'];
29-
export const RELAY_CHAINS = [
30-
{
31-
name: 'Polkadot',
32-
symbol: 'DOT'
33-
},
34-
{
35-
name: 'Kusama',
36-
symbol: 'KSM'
37-
},
38-
{
39-
name: 'Westend',
40-
symbol: 'WND'
41-
}
42-
];
4336

44-
export const POLKADOT_GENESIS_HASH = '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3';
45-
export const KUSAMA_GENESIS_HASH = '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe';
46-
export const WESTEND_GENESIS_HASH = '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e';
4737
export const ACALA_GENESIS_HASH = '0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c';
4838

4939
export const WESTMINT_GENESIS_HASH = '0x67f9723393ef76214df0118c34bbbd3dbebc8ed46a10973a8c969d48fe7598c9';
5040
export const STATEMINE_GENESIS_HASH = '0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'; // KUSAMA ASSET HUB
5141
export const STATEMINT_GENESIS_HASH = '0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f';
42+
export const PASEO_ASSET_HUB_GENESIS_HASH = '0x862ce2fa5abfdc3d29ead85a9472071efc69433b0128db1d6f009967fae87952';
5243

5344
export const WESTEND_PEOPLE_GENESIS_HASH = '0x1eb6fb0ba5187434de017a70cb84d4f47142df1d571d0ef9e7e1407f2b80b93c';
5445
export const KUSAMA_PEOPLE_GENESIS_HASH = '0xc1af4cb4eb3918e5db15086c0cc5ec17fb334f728b7c65dd44bfe1e174ff8b3f';
5546
export const POLKADOT_PEOPLE_GENESIS_HASH = '';
5647

48+
49+
/** relay chains info */
50+
export const RELAY_CHAINS_NAMES = ['Polkadot', 'Kusama', 'Westend', 'Paseo'];
51+
52+
export const POLKADOT_GENESIS_HASH = '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3';
53+
export const KUSAMA_GENESIS_HASH = '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe';
54+
export const WESTEND_GENESIS_HASH = '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e';
55+
export const PASEO_GENESIS_HASH = '0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f';
56+
5757
export const RELAY_CHAINS_GENESISHASH = [
5858
POLKADOT_GENESIS_HASH,
5959
KUSAMA_GENESIS_HASH,
60-
WESTEND_GENESIS_HASH
60+
WESTEND_GENESIS_HASH,
61+
PASEO_GENESIS_HASH
6162
];
6263

6364
export const ASSET_HUBS = [
6465
WESTMINT_GENESIS_HASH,
6566
STATEMINE_GENESIS_HASH,
66-
STATEMINT_GENESIS_HASH
67+
STATEMINT_GENESIS_HASH,
68+
PASEO_ASSET_HUB_GENESIS_HASH
6769
];
6870

6971
export const TEST_NETS = [
7072
WESTEND_GENESIS_HASH,
7173
WESTMINT_GENESIS_HASH,
72-
WESTEND_PEOPLE_GENESIS_HASH
74+
WESTEND_PEOPLE_GENESIS_HASH,
75+
PASEO_GENESIS_HASH,
76+
PASEO_ASSET_HUB_GENESIS_HASH
7377
];
7478

7579
export const PROXY_CHAINS = [
7680
POLKADOT_GENESIS_HASH,
7781
KUSAMA_GENESIS_HASH,
7882
WESTEND_GENESIS_HASH,
83+
PASEO_GENESIS_HASH,
7984
...ASSET_HUBS
8085
];
8186

@@ -98,8 +103,9 @@ export const SOCIAL_RECOVERY_CHAINS = [
98103
// used to enable/disable staking icon in account page
99104
export const STAKING_CHAINS = [
100105
POLKADOT_GENESIS_HASH,
106+
KUSAMA_GENESIS_HASH,
101107
WESTEND_GENESIS_HASH,
102-
KUSAMA_GENESIS_HASH
108+
PASEO_GENESIS_HASH
103109
];
104110

105111
export const PEOPLE_CHAINS = ['Kusama', 'Westend', 'KusamaPeople', 'WestendPeople'];
@@ -143,8 +149,9 @@ const PROXY_TYPE_POLKADOT = ['Any', 'NonTransfer', 'Staking', 'Governance', 'Ide
143149
const PROXY_TYPE_KUSAMA = ['Any', 'NonTransfer', 'Staking', 'Society', 'Governance', 'IdentityJudgement', 'CancelProxy', 'Auction', 'NominationPools'];
144150
const PROXY_TYPE_WESTEND = ['Any', 'NonTransfer', 'Staking', 'Governance', 'SudoBalances', 'IdentityJudgement', 'CancelProxy', 'Auction', 'NominationPools'];
145151
const PROXY_TYPE_ASSET_HUBS = ['Any', 'NonTransfer', 'CancelProxy', 'Assets', 'AssetOwner', 'AssetManager', 'Collator'];
152+
const PROXY_TYPE_PASEO = ['Any', 'NonTransfer', 'Staking', 'Governance', 'IdentityJudgement', 'CancelProxy', 'Auction', 'NominationPools'];
146153

147-
export const CHAIN_PROXY_TYPES = { Kusama: PROXY_TYPE_KUSAMA, Polkadot: PROXY_TYPE_POLKADOT, Westend: PROXY_TYPE_WESTEND, AssetHubs: PROXY_TYPE_ASSET_HUBS};
154+
export const CHAIN_PROXY_TYPES = { Kusama: PROXY_TYPE_KUSAMA, Polkadot: PROXY_TYPE_POLKADOT, Westend: PROXY_TYPE_WESTEND, AssetHubs: PROXY_TYPE_ASSET_HUBS, Paseo: PROXY_TYPE_PASEO };
148155

149156
export const VOTE_MAP = {
150157
AYE: 1,

packages/extension-polkagate/src/util/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ export async function getHistoryFromStorage(formatted: string): Promise<Transact
336336
export const isHexToBn = (i: string): BN => isHex(i) ? hexToBn(i) : new BN(i);
337337
export const toBN = (i: any): BN => isHexToBn(String(i));
338338

339-
export const sanitizeChainName = (chainName: string | undefined) => (chainName?.replace(' Relay Chain', '')?.replace(' Network', '')?.replace(' chain', '')?.replace(' Chain', '')?.replace(' Finance', '')?.replace(/\s/g, ''));
339+
export const sanitizeChainName = (chainName: string | undefined) => (chainName?.replace(' Relay Chain', '')?.replace(' Network', '')?.replace(' chain', '')?.replace(' Chain', '')?.replace(' Finance', '')?.replace(' Testnet', '')?.replace(/\s/g, ''));
340340

341341
export const isEmail = (input: string | undefined) => {
342342
if (!input) {

0 commit comments

Comments
 (0)