Add parachains propose modal (#4375)

* Add parachains propose modal

* Multiple validators

* Bump API

* modal with validator warning

* accounts check
This commit is contained in:
Jaco Greeff 2021-01-12 16:02:08 +01:00 committed by GitHub
parent 64c72a228d
commit ecebd92fa6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 306 additions and 84 deletions

View File

@ -12,15 +12,15 @@
"packages/*"
],
"resolutions": {
"@polkadot/api": "^3.4.2-1",
"@polkadot/api-contract": "^3.4.2-1",
"@polkadot/api": "^3.4.2-3",
"@polkadot/api-contract": "^3.4.2-3",
"@polkadot/keyring": "^5.2.3",
"@polkadot/networks": "^5.2.3",
"@polkadot/types": "^3.4.2-1",
"@polkadot/types": "^3.4.2-3",
"@polkadot/util": "^5.2.3",
"@polkadot/util-crypto": "^5.2.3",
"@polkadot/wasm-crypto": "^3.1.1",
"@polkadot/x-rxjs": "^3.4.2-1",
"@polkadot/x-rxjs": "^3.4.2-3",
"babel-core": "^7.0.0-bridge.0",
"styled-components": "^5.2.0",
"typescript": "^4.1.3"

View File

@ -1,6 +1,7 @@
// Copyright 2017-2021 @polkadot/app-accounts authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { TFunction } from 'i18next';
import type { Data, Option, Vec } from '@polkadot/types';
import type { AccountId, Balance } from '@polkadot/types/interfaces';
import type { ITuple } from '@polkadot/types/types';
@ -25,7 +26,7 @@ interface SubProps {
name: string;
setAddress: (index: number, value: string) => void;
setName: (index: number, value: string) => void;
t: (key: string, opts?: { replace: Record<string, string | number> }) => string;
t: TFunction;
}
function extractInfo ([[ids], opts]: [[string[]], Option<ITuple<[AccountId, Data]>>[]]): [string, string][] {
@ -60,7 +61,7 @@ function IdentitySub ({ address, index, name, setAddress, setName, t }: SubProps
<Columar.Column>
<InputAddress
defaultValue={address}
label={t('address {{index}}', { replace: { index: index + 1 } })}
label={t<string>('address {{index}}', { replace: { index: index + 1 } })}
onChange={_setAddress}
/>
</Columar.Column>
@ -69,7 +70,7 @@ function IdentitySub ({ address, index, name, setAddress, setName, t }: SubProps
defaultValue={name}
isError={!name}
isFull
label={t('sub name')}
label={t<string>('sub name')}
onChange={_setName}
/>
</Columar.Column>

View File

@ -10,6 +10,6 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@polkadot/api-contract": "^3.4.2-1"
"@polkadot/api-contract": "^3.4.2-3"
}
}

View File

@ -4,7 +4,7 @@
import React from 'react';
import { Button } from '@polkadot/react-components';
import { useApi, useToggle } from '@polkadot/react-hooks';
import { useAccounts, useApi, useToggle } from '@polkadot/react-hooks';
import Propose from '../modals/Propose';
import { useTranslation } from '../translate';
@ -16,6 +16,7 @@ interface Props {
function Actions (): React.ReactElement<Props> {
const { t } = useTranslation();
const { api } = useApi();
const { hasAccounts } = useAccounts();
const [showPropose, togglePropose] = useToggle();
return (
@ -24,7 +25,7 @@ function Actions (): React.ReactElement<Props> {
{api.query.proposeParachain && (
<Button
icon='plus'
isDisabled={true}
isDisabled={!hasAccounts}
label={t<string>('Propose')}
onClick={togglePropose}
/>

View File

@ -38,7 +38,7 @@ function Overview (): React.ReactElement<Props> {
<Upcoming ids={upcomingIds} />
</>
)}
{api.query.parachainProposals && (
{api.query.proposeParachain && (
<Proposals proposals={proposals} />
)}
</>

View File

@ -1,11 +1,14 @@
// Copyright 2017-2021 @polkadot/app-parachains authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { TFunction } from 'i18next';
import BN from 'bn.js';
import React, { useCallback, useState } from 'react';
import { InputAddress, InputFile, InputNumber, InputWasm, Modal, TxButton } from '@polkadot/react-components';
import { Button, Input, InputAddress, InputBalance, InputFile, InputNumber, InputWasm, MarkWarning, Modal, TxButton } from '@polkadot/react-components';
import { useApi } from '@polkadot/react-hooks';
import { BN_ZERO, compactAddLength } from '@polkadot/util';
import { BN_TEN, compactAddLength } from '@polkadot/util';
import { useTranslation } from '../translate';
@ -19,11 +22,36 @@ interface CodeState {
wasm: Uint8Array | null;
}
interface ValidatorProps {
address: string;
index: number;
setAddress: (index: number, value: string) => void;
t: TFunction;
}
function Validator ({ address, index, setAddress, t }: ValidatorProps): React.ReactElement<ValidatorProps> {
const _setAddress = useCallback(
(value: string | null) => value && setAddress(index, value),
[index, setAddress]
);
return (
<InputAddress
defaultValue={address}
label={t('validator {{index}}', { replace: { index: index + 1 } })}
onChange={_setAddress}
/>
);
}
function Propose ({ className, onClose }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { api } = useApi();
const [accountId, setAccountId] = useState<string | null>(null);
const [paraId, setParaId] = useState(BN_ZERO);
const [name, setName] = useState('');
const [paraId, setParaId] = useState(new BN(Date.now() % 131072));
const [balance, setBalance] = useState(new BN(1000).mul(BN_TEN.pow(new BN(api.registry.chainDecimals))));
const [validators, setValidators] = useState<string[]>(['']);
const [{ isWasmValid, wasm }, setWasm] = useState<CodeState>({ isWasmValid: false, wasm: null });
const [genesisState, setGenesisState] = useState<Uint8Array | null>(null);
@ -37,16 +65,35 @@ function Propose ({ className, onClose }: Props): React.ReactElement<Props> {
[]
);
const _setAddress = useCallback(
(index: number, address: string) =>
setValidators((v) => v.map((v, i) => i === index ? address : v)),
[]
);
const _addValidator = useCallback(
() => setValidators((v) => [...v, '']),
[]
);
const _delValidator = useCallback(
() => setValidators((v) => [...v.slice(0, v.length - 1)]),
[]
);
const isNameValid = name.length >= 3;
return (
<Modal
className={className}
header={t<string>('Register parachain')}
header={t<string>('Propose parachain')}
size='large'
>
<Modal.Content>
<Modal.Columns>
<Modal.Column>
<InputAddress
label={t<string>('register from')}
label={t<string>('propose from')}
onChange={setAccountId}
type='account'
value={accountId}
@ -56,9 +103,22 @@ function Propose ({ className, onClose }: Props): React.ReactElement<Props> {
<p>{t<string>('This account will be associated with the parachain and pay the deposit.')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<Input
isError={!isNameValid}
label={t<string>('name')}
onChange={setName}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The name for this parachain')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<InputNumber
defaultValue={paraId.toString()}
label={t<string>('parachain id')}
onChange={setParaId}
/>
@ -98,15 +158,59 @@ function Propose ({ className, onClose }: Props): React.ReactElement<Props> {
<p>{t<string>('The genesis state for this parachain.')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
{validators.map((address, index) => (
<Validator
address={address}
index={index}
key={index}
setAddress={_setAddress}
t={t}
/>
))}
{!validators.length && (
<MarkWarning content={t<string>('You need to supply at last one running validator for your parachain alongside this request.')} />
)}
<Button.Group>
<Button
icon='plus'
label={t<string>('Add validator')}
onClick={_addValidator}
/>
<Button
icon='minus'
isDisabled={validators.length === 0}
label={t<string>('Remove validator')}
onClick={_delValidator}
/>
</Button.Group>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The validators for this parachain')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<InputBalance
defaultValue={balance}
label={t<string>('initial balance')}
onChange={setBalance}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The proposed initial balance for this parachain')}</p>
</Modal.Column>
</Modal.Columns>
</Modal.Content>
<Modal.Actions onCancel={onClose}>
<TxButton
accountId={accountId}
icon='plus'
isDisabled={!isWasmValid || !genesisState}
isDisabled={!isWasmValid || !genesisState || !isNameValid || !validators.length}
onStart={onClose}
params={[paraId, genesisState, wasm]}
tx={api.tx.registrar.registerParathread}
params={[paraId, name, wasm, genesisState, validators, balance]}
tx={api.tx.proposeParachain?.proposeParachain}
/>
</Modal.Actions>
</Modal>

View File

@ -0,0 +1,116 @@
// Copyright 2017-2021 @polkadot/app-parachains authors & contributors
// SPDX-License-Identifier: Apache-2.0
import React, { useCallback, useState } from 'react';
import { InputAddress, InputFile, InputNumber, InputWasm, Modal, TxButton } from '@polkadot/react-components';
import { useApi } from '@polkadot/react-hooks';
import { BN_ZERO, compactAddLength } from '@polkadot/util';
import { useTranslation } from '../translate';
interface Props {
className?: string;
onClose: () => void;
}
interface CodeState {
isWasmValid: boolean;
wasm: Uint8Array | null;
}
function RegisterThread ({ className, onClose }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { api } = useApi();
const [accountId, setAccountId] = useState<string | null>(null);
const [paraId, setParaId] = useState(BN_ZERO);
const [{ isWasmValid, wasm }, setWasm] = useState<CodeState>({ isWasmValid: false, wasm: null });
const [genesisState, setGenesisState] = useState<Uint8Array | null>(null);
const _setGenesisState = useCallback(
(data: Uint8Array) => setGenesisState(compactAddLength(data)),
[]
);
const _setWasm = useCallback(
(wasm: Uint8Array, isWasmValid: boolean) => setWasm({ isWasmValid, wasm }),
[]
);
return (
<Modal
className={className}
header={t<string>('Register parathread')}
>
<Modal.Content>
<Modal.Columns>
<Modal.Column>
<InputAddress
label={t<string>('register from')}
onChange={setAccountId}
type='account'
value={accountId}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('This account will be associated with the parachain and pay the deposit.')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<InputNumber
label={t<string>('parachain id')}
onChange={setParaId}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The id of this parachain as known on the network')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<InputWasm
help={t<string>('The compiled runtime WASM for the parachain you wish to register.')}
isError={!isWasmValid}
label={t<string>('code')}
onChange={_setWasm}
placeholder={
wasm && !isWasmValid
? t<string>('The code is not recognized as being in valid WASM format')
: null
}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The WASM validation function for this parachain.')}</p>
</Modal.Column>
</Modal.Columns>
<Modal.Columns>
<Modal.Column>
<InputFile
help={t<string>('The genesis state for the parachain.')}
isError={!genesisState}
label={t<string>('initial state')}
onChange={_setGenesisState}
/>
</Modal.Column>
<Modal.Column>
<p>{t<string>('The genesis state for this parachain.')}</p>
</Modal.Column>
</Modal.Columns>
</Modal.Content>
<Modal.Actions onCancel={onClose}>
<TxButton
accountId={accountId}
icon='plus'
isDisabled={!isWasmValid || !genesisState}
onStart={onClose}
params={[paraId, genesisState, wasm]}
tx={api.tx.registrar.registerParathread}
/>
</Modal.Actions>
</Modal>
);
}
export default React.memo(RegisterThread);

View File

@ -15,9 +15,9 @@
"homepage": "https://github.com/polkadot-js/apps/tree/master/packages/react-api#readme",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@polkadot/api": "^3.4.2-1",
"@polkadot/api": "^3.4.2-3",
"@polkadot/extension-dapp": "^0.36.2-1",
"@polkadot/x-rxjs": "^3.4.2-1",
"@polkadot/x-rxjs": "^3.4.2-3",
"fflate": "^0.4.8"
}
}

126
yarn.lock
View File

@ -1908,54 +1908,54 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/api-contract@npm:^3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/api-contract@npm:3.4.2-1"
"@polkadot/api-contract@npm:^3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/api-contract@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/api": 3.4.2-1
"@polkadot/types": 3.4.2-1
"@polkadot/api": 3.4.2-3
"@polkadot/types": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/x-rxjs": 3.4.2-1
"@polkadot/x-rxjs": 3.4.2-3
bn.js: ^4.11.9
checksum: 44bad7710d00e86323c0b1371d735bb127a4f634faa573497b9e52ce44de20268b07170e66fb689a39a2ba8bdaf41a0c1248ac295be381cadd88b3b3353beb6c
checksum: 03f696bcbd1bb522d93b475536065618ff25dd1754e6c584ce54a5a83631c69f930fdc3acad51ddd5ec9635b8c9650df85878d3f66d8e0dfa62a930feb2f0d92
languageName: node
linkType: hard
"@polkadot/api-derive@npm:3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/api-derive@npm:3.4.2-1"
"@polkadot/api-derive@npm:3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/api-derive@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/api": 3.4.2-1
"@polkadot/rpc-core": 3.4.2-1
"@polkadot/types": 3.4.2-1
"@polkadot/api": 3.4.2-3
"@polkadot/rpc-core": 3.4.2-3
"@polkadot/types": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/util-crypto": ^5.2.3
"@polkadot/x-rxjs": 3.4.2-1
"@polkadot/x-rxjs": 3.4.2-3
bn.js: ^4.11.9
checksum: 5290614fbaa83b8104b6e762df1b82ced68911ed2633bed9c7be010cbe9827e099b854c792d0ce8c75ef8d839814fb3a15adb75e9de9800fae68568f8c2e5304
checksum: 8298c7c858d15ec8cd08b2855b46e46ad8c66c749344aa8b30aba1ef7f9491739bd079ef6a3d07ab0c23befc71cb9d4dbc197c5415eff95fc08aadb7d237c7f1
languageName: node
linkType: hard
"@polkadot/api@npm:^3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/api@npm:3.4.2-1"
"@polkadot/api@npm:^3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/api@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/api-derive": 3.4.2-1
"@polkadot/api-derive": 3.4.2-3
"@polkadot/keyring": ^5.2.3
"@polkadot/metadata": 3.4.2-1
"@polkadot/rpc-core": 3.4.2-1
"@polkadot/rpc-provider": 3.4.2-1
"@polkadot/types": 3.4.2-1
"@polkadot/types-known": 3.4.2-1
"@polkadot/metadata": 3.4.2-3
"@polkadot/rpc-core": 3.4.2-3
"@polkadot/rpc-provider": 3.4.2-3
"@polkadot/types": 3.4.2-3
"@polkadot/types-known": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/util-crypto": ^5.2.3
"@polkadot/x-rxjs": 3.4.2-1
"@polkadot/x-rxjs": 3.4.2-3
bn.js: ^4.11.9
eventemitter3: ^4.0.7
checksum: 880468700bffdaab9be9b6abd4dfcf2b6ca27afdd13ba5a5246e31a212c33b09b5872bf4339a1a8a9a0f543b6859d7cac0baae0a21b60381535abf701ab1fbcf
checksum: b9c8e9da5a1c4fcf5d5ab1e3a05ae920217c5886dec7b54c009a422c4a7b413c5462c9335ddc0fd2e68c1bd90284266ac2eeea148e791971115db2860d2991b5
languageName: node
linkType: hard
@ -2018,7 +2018,7 @@ __metadata:
resolution: "@polkadot/app-contracts@workspace:packages/page-contracts"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/api-contract": ^3.4.2-1
"@polkadot/api-contract": ^3.4.2-3
languageName: unknown
linkType: soft
@ -2427,17 +2427,17 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/metadata@npm:3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/metadata@npm:3.4.2-1"
"@polkadot/metadata@npm:3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/metadata@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/types": 3.4.2-1
"@polkadot/types-known": 3.4.2-1
"@polkadot/types": 3.4.2-3
"@polkadot/types-known": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/util-crypto": ^5.2.3
bn.js: ^4.11.9
checksum: 7c4fc55aaeebb9e0ce2fe8b36b74bed78a807b716af1d5c2e6ac2f623ad05f5124f2359e275267ba14a310a7f87e1bbfe2ba4b55f239332fc46b4367c70519c7
checksum: 7647b8674c57858cf8dd5e8ddbc0fafad113a3ad4d5b5948d33b56c06883771faa3368e8f7b5b10121c2db3a6c9ff182f2d2a5180877d9a9d9890918454bcab3
languageName: node
linkType: hard
@ -2455,9 +2455,9 @@ __metadata:
resolution: "@polkadot/react-api@workspace:packages/react-api"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/api": ^3.4.2-1
"@polkadot/api": ^3.4.2-3
"@polkadot/extension-dapp": ^0.36.2-1
"@polkadot/x-rxjs": ^3.4.2-1
"@polkadot/x-rxjs": ^3.4.2-3
fflate: ^0.4.8
languageName: unknown
linkType: soft
@ -2586,33 +2586,33 @@ __metadata:
languageName: unknown
linkType: soft
"@polkadot/rpc-core@npm:3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/rpc-core@npm:3.4.2-1"
"@polkadot/rpc-core@npm:3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/rpc-core@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/metadata": 3.4.2-1
"@polkadot/rpc-provider": 3.4.2-1
"@polkadot/types": 3.4.2-1
"@polkadot/metadata": 3.4.2-3
"@polkadot/rpc-provider": 3.4.2-3
"@polkadot/types": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/x-rxjs": 3.4.2-1
checksum: 033ccaafe66af06e0c921eaf3609ce07b8be1d8f89f71df52714f270dcf0b87ed5923b9d8c6644d398cd3ee4690e4ce5c6b42e348079b3b7ada3e693c49271a0
"@polkadot/x-rxjs": 3.4.2-3
checksum: 1d942bee38fcb45a10ea313a8ef5de5013aca46e32aaeb79c2ac75446299762dbec6b38f883b46c7336a4c9a666a30329b276aa5a5345b61055f85be4593dceb
languageName: node
linkType: hard
"@polkadot/rpc-provider@npm:3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/rpc-provider@npm:3.4.2-1"
"@polkadot/rpc-provider@npm:3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/rpc-provider@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/types": 3.4.2-1
"@polkadot/types": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/util-crypto": ^5.2.3
"@polkadot/x-fetch": ^5.2.3
"@polkadot/x-ws": ^5.2.3
bn.js: ^4.11.9
eventemitter3: ^4.0.7
checksum: c2f3497f9534d631e472b4cb92374abe99e802bc83fc1134d53cd71d8aa7ac9c952a29015e9e6ccb1e15aa2a5f2908f1afd4d7d1f76cf969481882507d02b96c
checksum: 00b26740fe66250d56672f0367c092532bb9548e7fd517229acd0a0d6e4b30f10d61331b25a2df9f2bf814e54ba543b245abe79ea2333364892c89713a214a44
languageName: node
linkType: hard
@ -2634,30 +2634,30 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/types-known@npm:3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/types-known@npm:3.4.2-1"
"@polkadot/types-known@npm:3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/types-known@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/types": 3.4.2-1
"@polkadot/types": 3.4.2-3
"@polkadot/util": ^5.2.3
bn.js: ^4.11.9
checksum: e13614a362b008e32945e6fe6e00c7d51e564da9cf6df55f7596cd7391195a45196a487019d1c247c6b98bda9aac5e90138eb602998d3bd71a987a578cd4d0e7
checksum: dc960345b49b6b6721e41a34d1fb195fcc8a973daaf108906358d47d762cded06345886911c641592ab2f9e837f2d11c22098f2d155f0bc181f3ea5a740ff828
languageName: node
linkType: hard
"@polkadot/types@npm:^3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/types@npm:3.4.2-1"
"@polkadot/types@npm:^3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/types@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
"@polkadot/metadata": 3.4.2-1
"@polkadot/metadata": 3.4.2-3
"@polkadot/util": ^5.2.3
"@polkadot/util-crypto": ^5.2.3
"@polkadot/x-rxjs": 3.4.2-1
"@polkadot/x-rxjs": 3.4.2-3
"@types/bn.js": ^4.11.6
bn.js: ^4.11.9
checksum: b2a00eec8f8db63f9d7a620cf561a7834e88752475973ac8def97540a876f641ff9982ad9edc3544bc75a72717f5361ebd8d0fc76197a5dcead7a86a44707dd2
checksum: 0bce52064527d5cf9a399c2740e6eb54f3397ea853bd5903015893b60006758212aba26c1e833d0d6bb739ef4ab4b12a1f0564c036e1ecfd73b7d6164354314c
languageName: node
linkType: hard
@ -2819,13 +2819,13 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/x-rxjs@npm:^3.4.2-1":
version: 3.4.2-1
resolution: "@polkadot/x-rxjs@npm:3.4.2-1"
"@polkadot/x-rxjs@npm:^3.4.2-3":
version: 3.4.2-3
resolution: "@polkadot/x-rxjs@npm:3.4.2-3"
dependencies:
"@babel/runtime": ^7.12.5
rxjs: ^6.6.3
checksum: a2db5ef5c70254a9f942ffdc4ceacf1164a9ffa445a22ccd8ac0274a675aae27f94a0bba448e9492af14abf49da3e1ee4747f12f814ddda62a78bd554c2cd9f0
checksum: e1f293fbdaa8ebb1d208a07654cfe97fa13d33476d744c4ded8d9f50c6374d60075975325f2c2396a36930d2b4ee3df8821f03608d24d9224df871c4cb4702bd
languageName: node
linkType: hard