Rework contracts deploy (#3853)

* Rework contracts deploy

* Bump API

* Remove .wasm from filename

* Remove (instance)
This commit is contained in:
Jaco Greeff 2020-10-11 19:33:55 +02:00 committed by GitHub
parent 0e1b2895b2
commit a7d965ef89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 165 additions and 189 deletions

View File

@ -33,10 +33,10 @@
"afterSign": "electron-builder-notarize"
},
"resolutions": {
"@polkadot/api": "^2.1.2-19",
"@polkadot/api-contract": "^2.1.2-19",
"@polkadot/api": "^2.1.2-20",
"@polkadot/api-contract": "^2.1.2-20",
"@polkadot/keyring": "^3.5.1",
"@polkadot/types": "^2.1.2-19",
"@polkadot/types": "^2.1.2-20",
"@polkadot/util": "^3.5.1",
"@polkadot/util-crypto": "^3.5.1",
"@polkadot/wasm-crypto": "^1.4.1",

View File

@ -12,6 +12,6 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.11.2",
"@polkadot/api-contract": "^2.1.2-19"
"@polkadot/api-contract": "^2.1.2-20"
}
}

View File

@ -3,7 +3,7 @@
import { StringOrNull } from '@polkadot/react-components/types';
import React, { useCallback, useMemo, useState } from 'react';
import React, { useCallback, useState } from 'react';
import { Button, Input, Modal } from '@polkadot/react-components';
import { isNull } from '@polkadot/util';
import { ABI, InputName } from '../shared';
@ -24,16 +24,6 @@ function Add ({ onClose }: Props): React.ReactElement {
const [name, setName] = useState<StringOrNull>(null);
const { abi, contractAbi, errorText, isAbiError, isAbiSupplied, isAbiValid, onChangeAbi, onRemoveAbi } = useAbi();
const isNameValid = useMemo(
(): boolean => !isNull(name) && name.length > 0,
[name]
);
const isValid = useMemo(
(): boolean => isCodeHashValid && isNameValid,
[isCodeHashValid, isNameValid]
);
const _onSave = useCallback(
(): void => {
if (!codeHash || !name) {
@ -50,6 +40,9 @@ function Add ({ onClose }: Props): React.ReactElement {
[abi, codeHash, name, onClose]
);
const isNameValid = !isNull(name) && name.length > 0;
const isValid = isCodeHashValid && isNameValid && isAbiSupplied && isAbiValid;
return (
<Modal header={t('Add an existing code hash')}>
<Modal.Content>
@ -73,7 +66,7 @@ function Add ({ onClose }: Props): React.ReactElement {
<ABI
contractAbi={contractAbi}
errorText={errorText}
isError={isAbiError}
isError={isAbiError || !isAbiError}
isSupplied={isAbiSupplied}
isValid={isAbiValid}
onChange={onChangeAbi}

View File

@ -3,7 +3,7 @@
import { Hash } from '@polkadot/types/interfaces';
import React, { useCallback, useMemo, useState } from 'react';
import React, { useCallback, useState } from 'react';
import { SubmittableResult } from '@polkadot/api';
import { InputAddress, InputFile, Modal, TxButton } from '@polkadot/react-components';
import { useAccountId, useNonEmptyString } from '@polkadot/react-hooks';
@ -25,15 +25,10 @@ function Upload ({ onClose }: Props): React.ReactElement {
const [name, isNameValid, setName] = useNonEmptyString();
const { abi, contractAbi, errorText, isAbiError, isAbiSupplied, isAbiValid, onChangeAbi, onRemoveAbi } = useAbi();
const isSubmittable = useMemo(
() => !!accountId && (!isNull(name) && isNameValid) && isWasmValid && (!isAbiSupplied || isAbiValid),
[accountId, name, isAbiSupplied, isAbiValid, isNameValid, isWasmValid]
);
const _onAddWasm = useCallback(
(wasm: Uint8Array, name: string): void => {
setWasm([compactAddLength(wasm), isWasm(wasm)]);
setName(name);
setName(name.replace('.wasm', ''));
},
[setName]
);
@ -49,7 +44,8 @@ function Upload ({ onClose }: Props): React.ReactElement {
return;
}
store.saveCode(codeHash as Hash, { abi, name, tags: [] })
store
.saveCode(codeHash as Hash, { abi, name, tags: [] })
.then()
.catch((error: any): void => {
console.error('Unable to save code', error);
@ -59,6 +55,8 @@ function Upload ({ onClose }: Props): React.ReactElement {
[abi, name]
);
const isSubmittable = !!accountId && (!isNull(name) && isNameValid) && isWasmValid && isAbiSupplied && isAbiValid;
return (
<Modal header={t('Upload WASM')}>
<Modal.Content>
@ -89,7 +87,7 @@ function Upload ({ onClose }: Props): React.ReactElement {
<ABI
contractAbi={contractAbi}
errorText={errorText}
isError={isAbiError}
isError={isAbiError || !isAbiSupplied}
isSupplied={isAbiSupplied}
isValid={isAbiValid}
onChange={onChangeAbi}

View File

@ -4,7 +4,7 @@
import { StringOrNull } from '@polkadot/react-components/types';
import { ActionStatus } from '@polkadot/react-components/Status/types';
import React, { useCallback, useMemo, useState } from 'react';
import React, { useCallback, useState } from 'react';
import { AddressRow, Button, Input, Modal } from '@polkadot/react-components';
import { useApi, useNonEmptyString } from '@polkadot/react-hooks';
import keyring from '@polkadot/ui-keyring';
@ -26,11 +26,6 @@ function Add ({ onClose }: Props): React.ReactElement {
const [name, isNameValid, setName] = useNonEmptyString('New Contract');
const { abi, contractAbi, errorText, isAbiError, isAbiSupplied, isAbiValid, onChangeAbi, onRemoveAbi } = useAbi([null, null], null, true);
const isValid = useMemo(
(): boolean => isAddressValid && isNameValid && isAbiValid,
[isAbiValid, isAddressValid, isNameValid]
);
const _onAdd = useCallback(
(): void => {
const status: Partial<ActionStatus> = { action: 'create' };
@ -66,6 +61,8 @@ function Add ({ onClose }: Props): React.ReactElement {
[abi, address, api, name, onClose]
);
const isValid = isAddressValid && isNameValid && isAbiValid;
return (
<Modal header={t('Add an existing contract')}>
<Modal.Content>

View File

@ -5,7 +5,7 @@ import { SubmittableExtrinsic } from '@polkadot/api/types';
import { CallResult } from './types';
import BN from 'bn.js';
import React, { useCallback, useState, useEffect, useMemo } from 'react';
import React, { useCallback, useState, useEffect } from 'react';
import styled from 'styled-components';
import { Button, Dropdown, Expander, InputAddress, InputBalance, Modal, TxButton } from '@polkadot/react-components';
import { PromiseContract as ApiContract } from '@polkadot/api-contract';
@ -35,8 +35,7 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
const [outcomes, setOutcomes] = useState<CallResult[]>([]);
const [execTx, setExecTx] = useState<SubmittableExtrinsic<'promise'> | null>(null);
const [params, setParams] = useState<any[]>([]);
const useWeightHook = useWeight();
const { isValid: isWeightValid, weight } = useWeightHook;
const weight = useWeight();
useEffect((): void => {
setParams([]);
@ -45,7 +44,7 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
useEffect((): void => {
value && message.isMutating && setExecTx((): SubmittableExtrinsic<'promise'> | null => {
try {
return contract.exec(message, message.isPayable ? value : 0, weight, ...params);
return contract.exec(message, message.isPayable ? value : 0, weight.weight, ...params);
} catch (error) {
return null;
}
@ -57,7 +56,7 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
if (!accountId || !message || !value || !weight) return;
contract
.read(message, message.isPayable ? value : 0, weight, ...params)
.read(message, message.isPayable ? value : 0, weight.weight, ...params)
.send(accountId)
.then((outcome) => setOutcomes([
{
@ -75,15 +74,12 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
);
const _onClearOutcome = useCallback(
(outcomeIndex: number) => () => setOutcomes(outcomes.slice(0, outcomeIndex).concat(outcomes.slice(outcomeIndex + 1))),
(outcomeIndex: number) =>
() => setOutcomes([...outcomes.filter((_, index) => index !== outcomeIndex)]),
[outcomes]
);
const isValid = useMemo(
() => !!(accountId && isWeightValid && isValueValid),
[accountId, isValueValid, isWeightValid]
);
const isValid = !!(accountId && weight.isValid && isValueValid);
const isViaRpc = contract.hasRpcContractsCall && !message.isMutating;
return (
@ -142,7 +138,7 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
<InputMegaGas
help={t<string>('The maximum amount of gas to use for this contract call. If the call requires more, it will fail.')}
label={t<string>('maximum gas allowed')}
{...useWeightHook}
{...weight}
/>
{outcomes.length > 0 && (
<Expander
@ -175,7 +171,7 @@ function Call ({ className = '', contract, messageIndex, onChangeCallContractAdd
accountId={accountId}
extrinsic={execTx}
icon='sign-in-alt'
isDisabled={!isValid}
isDisabled={!isValid || !execTx}
label={t('Execute')}
withSpinner
/>

View File

@ -1,15 +1,16 @@
// Copyright 2017-2020 @polkadot/app-contracts authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { SubmittableExtrinsic } from '@polkadot/api/types';
import { StringOrNull } from '@polkadot/react-components/types';
import { AccountId } from '@polkadot/types/interfaces';
import { CodecArg } from '@polkadot/types/types';
import { CodeStored } from './types';
import BN from 'bn.js';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { SubmittableResult } from '@polkadot/api';
import { PromiseBlueprint } from '@polkadot/api-contract';
import { Dropdown, InputAddress, InputBalance, Modal, TxButton } from '@polkadot/react-components';
import { useFormField, useNonEmptyString, useNonZeroBn, useApi } from '@polkadot/react-hooks';
import keyring from '@polkadot/ui-keyring';
@ -21,48 +22,46 @@ import useAbi from './useAbi';
import useWeight from './useWeight';
import { ENDOWMENT } from './constants';
type ConstructOptions = { key: string; text: React.ReactNode; value: string }[];
interface Props {
basePath: string;
codeHash: string;
constructorIndex?: number;
constructorIndex: number;
onClose: () => void;
setConstructorIndex: React.Dispatch<number>;
}
function defaultContractName (name: string) {
return `${name} (instance)`;
}
function Deploy ({ basePath, codeHash, constructorIndex = 0, onClose, setConstructorIndex }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { api } = useApi();
const history = useHistory();
const useWeightHook = useWeight();
const { isValid: isWeightValid, weight } = useWeightHook;
const weight = useWeight();
const [initTx, setInitTx] = useState<SubmittableExtrinsic<'promise'> | null>(null);
const [params, setParams] = useState<any[]>([]);
const [accountId, isAccountIdValid, setAccountId] = useFormField<StringOrNull>(null);
const [endowment, isEndowmentValid, setEndowment] = useNonZeroBn(new BN(ENDOWMENT));
useEffect((): void => {
setParams([]);
}, [constructorIndex]);
const code = useMemo(
(): CodeStored => store.getCode(codeHash),
[codeHash]
);
const [accountId, isAccountIdValid, setAccountId] = useFormField<StringOrNull>(null);
const [endowment, isEndowmentValid, setEndowment] = useNonZeroBn(new BN(ENDOWMENT));
const [name, isNameValid, setName] = useNonEmptyString(t(defaultContractName(code.json.name)));
const [name, isNameValid, setName] = useNonEmptyString(code.json.name);
const { abi, contractAbi, errorText, isAbiError, isAbiSupplied, isAbiValid, onChangeAbi, onRemoveAbi } = useAbi([code.json.abi, code.contractAbi], codeHash, true);
const isValid = useMemo(
() => isNameValid && isEndowmentValid && isWeightValid && isAccountIdValid,
[isAccountIdValid, isEndowmentValid, isNameValid, isWeightValid]
const blueprint = useMemo(
() => codeHash && contractAbi
? new PromiseBlueprint(api, contractAbi, codeHash)
: null,
[api, codeHash, contractAbi]
);
const constructOptions = useMemo(
(): ConstructOptions => {
if (!contractAbi) {
return [];
}
return contractAbi.constructors.map((message, index) => ({
() => contractAbi
? contractAbi.constructors.map((message, index) => ({
key: `${index}`,
text: (
<MessageSignature
@ -70,34 +69,27 @@ function Deploy ({ basePath, codeHash, constructorIndex = 0, onClose, setConstru
message={message}
/>
),
value: `${index}`
}));
},
value: index
}))
: [],
[contractAbi]
);
const [params, setParams] = useState<unknown[]>(contractAbi && constructorIndex >= 0 ? contractAbi.constructors[constructorIndex].args : []);
useEffect((): void => {
endowment && setInitTx((): SubmittableExtrinsic<'promise'> | null => {
if (blueprint) {
try {
return blueprint.instantiate(constructorIndex, endowment, weight.weight, ...params);
} catch (error) {
console.error(error);
useEffect(
() => setParams(contractAbi ? contractAbi.constructors[constructorIndex].args : []),
[constructorIndex, contractAbi]
);
useEffect(
() => setName(t(defaultContractName(code.json.name))),
[code, setName, t]
);
const _constructCall = useCallback(
(): any[] => {
if (!contractAbi || constructorIndex < 0) {
return [];
return null;
}
}
return [endowment, weight, codeHash, contractAbi.constructors[constructorIndex](...(params as CodecArg[]))];
},
[codeHash, constructorIndex, contractAbi, endowment, params, weight]
);
return null;
});
}, [blueprint, constructorIndex, endowment, params, weight]);
const _onSuccess = useCallback(
(result: SubmittableResult): void => {
@ -126,6 +118,8 @@ function Deploy ({ basePath, codeHash, constructorIndex = 0, onClose, setConstru
[abi, api, basePath, history, name, onClose]
);
const isValid = isNameValid && isEndowmentValid && weight.isValid && isAccountIdValid;
return (
<Modal header={t('Add an existing code hash')}>
<Modal.Content>
@ -143,38 +137,32 @@ function Deploy ({ basePath, codeHash, constructorIndex = 0, onClose, setConstru
onChange={setName}
value={name || ''}
/>
{isAbiSupplied
? null
: (
<ABI
contractAbi={contractAbi}
errorText={errorText}
isError={isAbiError}
isSupplied={isAbiSupplied}
isValid={isAbiValid}
onChange={onChangeAbi}
onRemove={onRemoveAbi}
withLabel
/>
)
}
{contractAbi
? (
<Dropdown
help={t<string>('The deployment constructor information for this contract, as provided by the ABI.')}
isDisabled={contractAbi.constructors.length <= 1}
label={t('deployment constructor')}
onChange={setConstructorIndex}
options={constructOptions}
value={`${constructorIndex}`}
/>
)
: null
}
{!isAbiSupplied && (
<ABI
contractAbi={contractAbi}
errorText={errorText}
isError={isAbiError}
isSupplied={isAbiSupplied}
isValid={isAbiValid}
onChange={onChangeAbi}
onRemove={onRemoveAbi}
withLabel
/>
)}
{contractAbi && (
<Dropdown
help={t<string>('The deployment constructor information for this contract, as provided by the ABI.')}
isDisabled={contractAbi.constructors.length <= 1}
label={t('deployment constructor')}
onChange={setConstructorIndex}
options={constructOptions}
value={constructorIndex}
/>
)}
<Params
onChange={setParams}
params={
contractAbi && constructorIndex >= 0
contractAbi
? contractAbi.constructors[constructorIndex].args
: []
}
@ -189,19 +177,18 @@ function Deploy ({ basePath, codeHash, constructorIndex = 0, onClose, setConstru
<InputMegaGas
help={t<string>('The maximum amount of gas that can be used by this deployment, if the code requires more, the deployment will fail.')}
label={t<string>('maximum gas allowed')}
{...useWeightHook}
{...weight}
/>
</Modal.Content>
<Modal.Actions onCancel={onClose}>
<TxButton
accountId={accountId}
extrinsic={initTx}
icon='upload'
isDisabled={!isValid}
isDisabled={!isValid || !initTx}
label={t('Deploy')}
onClick={onClose}
onSuccess={_onSuccess}
params={_constructCall}
tx='contracts.instantiate'
withSpinner
/>
</Modal.Actions>

View File

@ -28,9 +28,7 @@ export default function useAbi (initialValue: [string | null | undefined, Abi |
useEffect(
(): void => {
if (!!initialValue[0] && abi !== initialValue[0]) {
setAbi([initialValue[0], initialValue[1], !!initialValue[1], !isRequired || !!initialValue[1]]);
}
initialValue[0] && abi !== initialValue[0] && setAbi([initialValue[0], initialValue[1], !!initialValue[1], !isRequired || !!initialValue[1]]);
},
[abi, initialValue, isRequired]
);

View File

@ -13,23 +13,30 @@ const BN_MILLION = new BN(1e6);
export default function useWeight (initialValue: BN = BN_MILLION): UseWeight {
const [blockTime] = useBlockTime();
const [megaGas, setMegaGas] = useState<BN | undefined>(initialValue);
const [executionTime, isValid, percentage, weight] = useMemo(
(): [number, boolean, number, BN] => {
const [executionTime, percentage, weight, isValid] = useMemo(
(): [number, number, BN, boolean] => {
if (!megaGas) {
return [0, false, 0, BN_ZERO];
return [0, 0, BN_ZERO, false];
}
const weight = megaGas.mul(BN_MILLION);
const executionTime = megaGas.toNumber() / 1e6;
const percentage = Math.round((executionTime / (blockTime / 1000)) * 100);
const isValid = !megaGas.isZero() && percentage < 100;
return [executionTime, isValid, percentage, weight];
return [executionTime, percentage, weight, !megaGas.isZero() && percentage < 100];
},
[blockTime, megaGas]
);
return {
executionTime, isValid, megaGas: megaGas || BN_ZERO, percentage, setMegaGas, weight
};
return useMemo(
() => ({
executionTime,
isValid,
megaGas: megaGas || BN_ZERO,
percentage,
setMegaGas,
weight
}),
[executionTime, isValid, megaGas, percentage, setMegaGas, weight]
);
}

View File

@ -31,7 +31,7 @@
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/ui-reactive#readme",
"dependencies": {
"@babel/runtime": "^7.11.2",
"@polkadot/api": "^2.1.2-19",
"@polkadot/api": "^2.1.2-20",
"@polkadot/extension-dapp": "^0.35.0-beta.12",
"rxjs-compat": "^6.6.3"
}

112
yarn.lock
View File

@ -2039,57 +2039,57 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/api-contract@npm:^2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/api-contract@npm:2.1.2-19"
"@polkadot/api-contract@npm:^2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/api-contract@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/api": 2.1.2-19
"@polkadot/rpc-core": 2.1.2-19
"@polkadot/types": 2.1.2-19
"@polkadot/api": 2.1.2-20
"@polkadot/rpc-core": 2.1.2-20
"@polkadot/types": 2.1.2-20
"@polkadot/util": ^3.5.1
bn.js: ^5.1.3
rxjs: ^6.6.3
checksum: c4aab02ecc776e89f662dc6640053f31b5c6a8cf2f2d8345ea1641caae83e93a4f91d9b93716246b4721e895703e01a457340609e21ee2b8b18e4d13be72907b
checksum: 138f3f2ec27b6772d87d988b2c69fcbc303c821f2c68d1e99af52afe6eb257a0d3395b3350c450a73f7abc8657cb79fe07f54ca073bf38c13d3dae14fb8b9910
languageName: node
linkType: hard
"@polkadot/api-derive@npm:2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/api-derive@npm:2.1.2-19"
"@polkadot/api-derive@npm:2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/api-derive@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/api": 2.1.2-19
"@polkadot/rpc-core": 2.1.2-19
"@polkadot/rpc-provider": 2.1.2-19
"@polkadot/types": 2.1.2-19
"@polkadot/api": 2.1.2-20
"@polkadot/rpc-core": 2.1.2-20
"@polkadot/rpc-provider": 2.1.2-20
"@polkadot/types": 2.1.2-20
"@polkadot/util": ^3.5.1
"@polkadot/util-crypto": ^3.5.1
bn.js: ^5.1.3
memoizee: ^0.4.14
rxjs: ^6.6.3
checksum: 4c333d7b682a9bd37b173d4a7fb70d36452632970fa4739132d102332e124100711c048732fda4f117e93d60b50fe4b0442523ec8fdbf3788542ba71111684ea
checksum: c3294b0cf54e499e260faaaf23ffea74b7188df80efc80b3f7ce8630b5afe55f2dfdb209b15a5e7edcba673e1a52837bfdc4f84e7f9b85d5d5fc6ca1560818a5
languageName: node
linkType: hard
"@polkadot/api@npm:^2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/api@npm:2.1.2-19"
"@polkadot/api@npm:^2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/api@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/api-derive": 2.1.2-19
"@polkadot/api-derive": 2.1.2-20
"@polkadot/keyring": ^3.5.1
"@polkadot/metadata": 2.1.2-19
"@polkadot/rpc-core": 2.1.2-19
"@polkadot/rpc-provider": 2.1.2-19
"@polkadot/types": 2.1.2-19
"@polkadot/types-known": 2.1.2-19
"@polkadot/metadata": 2.1.2-20
"@polkadot/rpc-core": 2.1.2-20
"@polkadot/rpc-provider": 2.1.2-20
"@polkadot/types": 2.1.2-20
"@polkadot/types-known": 2.1.2-20
"@polkadot/util": ^3.5.1
"@polkadot/util-crypto": ^3.5.1
bn.js: ^5.1.3
eventemitter3: ^4.0.7
rxjs: ^6.6.3
checksum: c60419fe8cd141737534bad875befe72b11175dedb6871510f25b74fb1806b2619a8925c21e6ac1db87f37debc5e926832c5bb06a249c9ede1747dca39e1ad34
checksum: 680d0fe4d9e3613cc888cb309a44e2a589fc8bef6bb727bd3bfba8432242a485348691b2c78b83b591a5767e15d44164dc1f3b93856252e0e2053c26300617c0
languageName: node
linkType: hard
@ -2145,7 +2145,7 @@ __metadata:
resolution: "@polkadot/app-contracts@workspace:packages/page-contracts"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/api-contract": ^2.1.2-19
"@polkadot/api-contract": ^2.1.2-20
languageName: unknown
linkType: soft
@ -2525,17 +2525,17 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/metadata@npm:2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/metadata@npm:2.1.2-19"
"@polkadot/metadata@npm:2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/metadata@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/types": 2.1.2-19
"@polkadot/types-known": 2.1.2-19
"@polkadot/types": 2.1.2-20
"@polkadot/types-known": 2.1.2-20
"@polkadot/util": ^3.5.1
"@polkadot/util-crypto": ^3.5.1
bn.js: ^5.1.3
checksum: cbd10cb11d932967ad3cd3c1bf77221a886032e344e7ff1b851946dc955b9dd0279b1cd3010a9972762575087c59a3ea468086f5a9add89d2b93b10df7ca403e
checksum: f08a577035578d691f26142dd5e18ba3202849f176ec422ba2150a1cbdba939701f7e0a699cab4d9d188a165b1c3ddc9ff06f01f0c1663ab31ed44b5137fc0e5
languageName: node
linkType: hard
@ -2544,7 +2544,7 @@ __metadata:
resolution: "@polkadot/react-api@workspace:packages/react-api"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/api": ^2.1.2-19
"@polkadot/api": ^2.1.2-20
"@polkadot/extension-dapp": ^0.35.0-beta.12
rxjs-compat: ^6.6.3
languageName: unknown
@ -2667,35 +2667,35 @@ __metadata:
languageName: unknown
linkType: soft
"@polkadot/rpc-core@npm:2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/rpc-core@npm:2.1.2-19"
"@polkadot/rpc-core@npm:2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/rpc-core@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/metadata": 2.1.2-19
"@polkadot/rpc-provider": 2.1.2-19
"@polkadot/types": 2.1.2-19
"@polkadot/metadata": 2.1.2-20
"@polkadot/rpc-provider": 2.1.2-20
"@polkadot/types": 2.1.2-20
"@polkadot/util": ^3.5.1
memoizee: ^0.4.14
rxjs: ^6.6.3
checksum: 194f52900cece006e6a21d46d30fecf84a806b251aa9870c38181bdfc3494ed609addf158b5a579c7d1e6757fc25aa2d709887a815e269f5d3566d688cfcd8c4
checksum: ff6126e73801ddbd01e9d7b5687be820ac5442be5c4a9d4f0ea1d54ef67cae11c1eff7a7b61bde713f279dfbb3d02217cb58a2b6d801844a1711c261171db14a
languageName: node
linkType: hard
"@polkadot/rpc-provider@npm:2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/rpc-provider@npm:2.1.2-19"
"@polkadot/rpc-provider@npm:2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/rpc-provider@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/metadata": 2.1.2-19
"@polkadot/types": 2.1.2-19
"@polkadot/metadata": 2.1.2-20
"@polkadot/types": 2.1.2-20
"@polkadot/util": ^3.5.1
"@polkadot/util-crypto": ^3.5.1
"@polkadot/x-fetch": ^0.3.2
"@polkadot/x-ws": ^0.3.2
bn.js: ^5.1.3
eventemitter3: ^4.0.7
checksum: 58e93610a3b01e26d1ac111cd77a28a6eea401c444a954e23b3fd18aba1cd3fd931cc47af2793a706a90f4cda047942abb03e8b90c75a3b7a6171df9d10879e8
checksum: 70033a1b200505cf8a743a7e223aff098aee574e31790e3a912f5f6b1eb2faaa13e851729a202b73f6b56d5eac69e257ad5eaca78e6db9e2deee5544e92b8709
languageName: node
linkType: hard
@ -2708,31 +2708,31 @@ __metadata:
languageName: node
linkType: hard
"@polkadot/types-known@npm:2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/types-known@npm:2.1.2-19"
"@polkadot/types-known@npm:2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/types-known@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/types": 2.1.2-19
"@polkadot/types": 2.1.2-20
"@polkadot/util": ^3.5.1
bn.js: ^5.1.3
checksum: 73e0902549e229c2251a26439ec5d05b189d40b24f528f6af2eea3d009c9b4c643432038db9da57995b83af76f9b2db01cd73e0f98b260cff52dc1b75f75b2d9
checksum: 595324baab89b64a248b9b7a957bd84772ba1149ceeb62b95d9d4c4ef4c0c2be1467ebb8dd3debfb9db373d7610e50fb72b5abeed156e87319793f1e13dbac15
languageName: node
linkType: hard
"@polkadot/types@npm:^2.1.2-19":
version: 2.1.2-19
resolution: "@polkadot/types@npm:2.1.2-19"
"@polkadot/types@npm:^2.1.2-20":
version: 2.1.2-20
resolution: "@polkadot/types@npm:2.1.2-20"
dependencies:
"@babel/runtime": ^7.11.2
"@polkadot/metadata": 2.1.2-19
"@polkadot/metadata": 2.1.2-20
"@polkadot/util": ^3.5.1
"@polkadot/util-crypto": ^3.5.1
"@types/bn.js": ^4.11.6
bn.js: ^5.1.3
memoizee: ^0.4.14
rxjs: ^6.6.3
checksum: 72385b2fd521a2c19d43bd8a102df288cb90f5c46dda0cecaacb84165bff951fcf9692ac2650b31b30c3d7bca2194a33777b8bbdeac5793c09a2374d1de38c1a
checksum: 16e9885e94e5537031788b7581fa3ebb7aaa8b989ae604b9f67637ed20ea018d1c90b31b06f996d1317ecce769abc71108e4cf0e68614efd596db31524c0541a
languageName: node
linkType: hard