Display decoded ExtrinsicFailed errors (#2137)

* Display decoded ExtrinsicFailed errors

* Revert debug log

* Bump API (error lookup)
This commit is contained in:
Jaco Greeff 2020-01-16 15:21:02 +01:00 committed by GitHub
parent abec239d67
commit 2ea6dd0af3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 141 additions and 239 deletions

View File

@ -10,10 +10,10 @@
"packages/*"
],
"resolutions": {
"@polkadot/api": "^1.0.0-beta.7",
"@polkadot/api-contract": "^1.0.0-beta.7",
"@polkadot/api": "^1.0.0-beta.8",
"@polkadot/api-contract": "^1.0.0-beta.8",
"@polkadot/keyring": "^2.0.0-beta.4",
"@polkadot/types": "^1.0.0-beta.7",
"@polkadot/types": "^1.0.0-beta.8",
"@polkadot/util": "^2.0.0-beta.4",
"@polkadot/util-crypto": "^2.0.0-beta.4",
"babel-core": "^7.0.0-bridge.0",

View File

@ -11,6 +11,6 @@
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.7.7",
"@polkadot/api-contract": "^1.0.0-beta.7"
"@polkadot/api-contract": "^1.0.0-beta.8"
}
}

View File

@ -31,7 +31,7 @@
"homepage": "https://github.com/polkadot-js/ui/tree/master/packages/ui-reactive#readme",
"dependencies": {
"@babel/runtime": "^7.7.6",
"@polkadot/api": "^1.0.0-beta.7",
"@polkadot/api": "^1.0.0-beta.8",
"@polkadot/extension-dapp": "^0.15.0-beta.1",
"edgeware-node-types": "^1.0.10",
"rxjs-compat": "^6.5.3"

View File

@ -3,7 +3,8 @@
// of the Apache-2.0 license. See the LICENSE file for details.
import { SubmittableExtrinsic } from '@polkadot/api/promise/types';
import { SignerPayloadJSON } from '@polkadot/types/types';
import { DispatchError } from '@polkadot/types/interfaces';
import { ITuple, SignerPayloadJSON } from '@polkadot/types/types';
import { BareProps } from '../types';
import { ActionStatus, PartialQueueTxExtrinsic, PartialQueueTxRpc, QueueStatus, QueueTx, QueueTxExtrinsic, QueueTxRpc, QueueTxStatus, SignerCallback } from './types';
@ -128,13 +129,31 @@ export default function Queue ({ children }: Props): React.ReactElement<Props> {
// filter events handled globally, or those we are not interested in, these are
// handled by the global overview, so don't add them here
.filter((record): boolean => !!record.event && record.event.section !== 'democracy')
.map(({ event: { method, section } }): ActionStatus => ({
action: `${section}.${method}`,
status: section === 'system' && method === 'ExtrinsicFailed'
? 'error'
: 'event',
message: 'extrinsic event'
}))
.map(({ event: { data, method, section } }): ActionStatus => {
if (section === 'system' && method === 'ExtrinsicFailed') {
const [dispatchError] = data as unknown as ITuple<[DispatchError]>;
let message = dispatchError.type;
if (dispatchError.isModule) {
const mod = dispatchError.asModule;
const error = registry.findMetaError(new Uint8Array([mod.index.toNumber(), mod.error.toNumber()]));
message = `${error.section}.${error.name}`;
}
return {
action: `${section}.${method}`,
status: 'error',
message
};
}
return {
action: `${section}.${method}`,
status: 'event',
message: 'extrinsic event'
};
})
);
if (STATUS_COMPLETE.includes(status)) {

View File

@ -1,167 +0,0 @@
// Copyright 2017-2020 @polkadot/react-components authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { SubmittableExtrinsic } from '@polkadot/api/promise/types';
import { SignerPayloadJSON } from '@polkadot/types/types';
import { BareProps } from '../types';
import { ActionStatus, PartialQueueTxExtrinsic, PartialQueueTxRpc, QueueStatus, QueueTx, QueueTxExtrinsic, QueueTxRpc, QueueTxStatus, SignerCallback } from './types';
import React, { useRef, useState } from 'react';
import { SubmittableResult } from '@polkadot/api';
import jsonrpc from '@polkadot/jsonrpc';
import { registry } from '@polkadot/react-api';
import { createType } from '@polkadot/types';
import { QueueProvider } from './Context';
export interface Props extends BareProps {
children: React.ReactNode;
}
let nextId = 0;
const REMOVE_TIMEOUT = 7500;
const SUBMIT_RPC = jsonrpc.author.methods.submitAndWatchExtrinsic;
const STATUS_COMPLETE: QueueTxStatus[] = [
// status from subscription
'finalized', 'usurped', 'dropped', 'invalid',
// normal completion
'cancelled', 'error', 'sent'
];
export default function Queue ({ children }: Props): React.ReactElement<Props> {
const [stqueue, setStQueue] = useState<QueueStatus[]>([]);
const [txqueue, setTxQueue] = useState<QueueTx[]>([]);
const _clearTxStatus = useRef(
(id: number): () => void =>
(): void => setTxQueue([...txqueue.map((item): QueueTx =>
item.id === id
? { ...item, status: 'completed' }
: item
)])
);
const _addToTxQueue = useRef(
(value: QueueTxExtrinsic | QueueTxRpc | QueueTx): number => {
const id = ++nextId;
setTxQueue([...txqueue, {
...value,
id,
removeItem: _clearTxStatus.current(id),
rpc: (value as QueueTxRpc).rpc || SUBMIT_RPC,
status: 'queued'
}]);
return id;
}
);
const queueAction = useRef(
(status: ActionStatus | ActionStatus[]): number => {
const todos = (Array.isArray(status) ? status : [status]).map((item: ActionStatus) => {
const id = ++nextId;
const removeItem = (): void =>
setStQueue([...stqueue.filter((item): boolean => item.id !== id)]);
setTimeout(removeItem, REMOVE_TIMEOUT);
return {
...item,
id,
isCompleted: false,
removeItem
};
});
setStQueue([...stqueue, ...todos]);
return todos[0].id;
}
);
const queueExtrinsic = useRef(
({ accountId, extrinsic, txFailedCb, txSuccessCb, txStartCb, txUpdateCb, isUnsigned }: PartialQueueTxExtrinsic): number =>
_addToTxQueue.current({
accountId,
extrinsic,
isUnsigned,
txFailedCb,
txSuccessCb,
txStartCb,
txUpdateCb
})
);
const queuePayload = useRef(
(payload: SignerPayloadJSON, signerCb: SignerCallback): number =>
_addToTxQueue.current({
accountId: payload.address,
// this is not great, but the Extrinsic we don't need a submittable
extrinsic: createType(registry, 'Extrinsic',
{ method: createType(registry, 'Call', payload.method) },
{ version: payload.version }
) as unknown as SubmittableExtrinsic,
payload,
signerCb
})
);
const queueRpc = useRef(
({ accountId, rpc, values }: PartialQueueTxRpc): number =>
_addToTxQueue.current({
accountId,
rpc,
values
})
);
const queueSetTxStatus = useRef(
(id: number, status: QueueTxStatus, result?: SubmittableResult, error?: Error): void => {
setTxQueue([...txqueue.map((item): QueueTx =>
item.id === id
? {
...item,
error: error === undefined
? item.error
: error,
result: result === undefined
? item.result
: result,
status: item.status === 'completed'
? item.status
: status
}
: item
)]);
queueAction.current(
((result && result.events) || [])
// filter events handled globally, or those we are not interested in, these are
// handled by the global overview, so don't add them here
.filter((record): boolean => !!record.event && record.event.section !== 'democracy')
.map(({ event: { method, section } }): ActionStatus => ({
action: `${section}.${method}`,
status: section === 'system' && method === 'ExtrinsicFailed'
? 'error'
: 'event',
message: 'extrinsic event'
}))
);
if (STATUS_COMPLETE.includes(status)) {
setTimeout(_clearTxStatus.current(id), REMOVE_TIMEOUT);
}
}
);
return (
<QueueProvider value={{
queueAction: queueAction.current,
queueExtrinsic: queueExtrinsic.current,
queuePayload: queuePayload.current,
queueRpc: queueRpc.current,
queueSetTxStatus: queueSetTxStatus.current,
stqueue,
txqueue
}}>
{children}
</QueueProvider>
);
}

View File

@ -0,0 +1,46 @@
// Copyright 2017-2020 @polkadot/react-components authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { DispatchError } from '@polkadot/types/interfaces';
import { Props } from '../types';
import React from 'react';
import { registry } from '@polkadot/react-api';
import { Input } from '@polkadot/react-components';
import { useTranslation } from '../translate';
import Static from './Static';
import Unknown from './Unknown';
export default function ErrorDisplay (props: Props): React.ReactElement<Props> {
const { t } = useTranslation();
if (!props.isDisabled || !props.defaultValue?.value?.isModule) {
return <Unknown {...props} />;
}
const mod = (props.defaultValue.value as DispatchError).asModule;
const error = registry.findMetaError(new Uint8Array([mod.index.toNumber(), mod.error.toNumber()]));
const type = `${error.section}.${error.name}`;
const details = error.documentation.join(', ');
return (
<Static {...props}>
<Input
className='full'
isDisabled
label={t('type')}
value={type}
/>
{details && (
<Input
className='full'
isDisabled
label={t('details')}
value={details}
/>
)}
</Static>
);
}

View File

@ -12,11 +12,12 @@ import Bare from './Bare';
interface Props extends BareProps {
asHex?: boolean;
children?: React.ReactNode;
defaultValue: RawParam;
withLabel?: boolean;
}
export default function StaticParam ({ asHex, className, defaultValue, label, style }: Props): React.ReactElement<Props> {
export default function StaticParam ({ asHex, children, className, defaultValue, label, style }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const value = defaultValue && defaultValue.value && defaultValue.value[asHex ? 'toHex' : 'toString']();
@ -30,6 +31,7 @@ export default function StaticParam ({ asHex, className, defaultValue, label, st
label={label}
value={value || t('<empty>')}
/>
{children}
</Bare>
);
}

View File

@ -15,6 +15,7 @@ import Balance from './Balance';
import Bool from './Bool';
import Bytes from './Bytes';
import Code from './Code';
import DispatchError from './DispatchError';
import Enum from './Enum';
import Hash256 from './Hash256';
import Hash512 from './Hash512';
@ -46,6 +47,7 @@ const components: ComponentMap = ([
{ c: Bool, t: ['bool'] },
{ c: Bytes, t: ['Bytes'] },
{ c: Code, t: ['Code'] },
{ c: DispatchError, t: ['DispatchError'] },
{ c: Raw, t: ['Raw', 'Keys'] },
{ c: Enum, t: ['Enum'] },
{ c: Hash256, t: ['BlockHash', 'CodeHash', 'Hash', 'H256', 'SeedOf'] },

116
yarn.lock
View File

@ -2093,36 +2093,36 @@
dependencies:
"@types/node" ">= 8"
"@polkadot/api-contract@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-1.0.0-beta.7.tgz#10cd98f7162c3ce7fda28769c0cee2c3c520ffc7"
integrity sha512-KNPNKh62NxqAGQjGC2dgIZ+duGtFa9a85TjP/hyGQwwlV31PXDYdceb6e+7qgar0VlO4+Wf6MtJt6pHuM0/CpQ==
"@polkadot/api-contract@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-1.0.0-beta.8.tgz#e5ad53023c1b992d6ca466b13e1f594e8ad21161"
integrity sha512-CnoAL+H8lcMOhLDXvs6zCCiaDNBNtkQ9yiaKJIVOZ9juLsURBh2Dp9B2nNeQEH7CFMjDBtbxka2JikbKJDtYZg==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/types" "^1.0.0-beta.7"
"@polkadot/types" "^1.0.0-beta.8"
"@polkadot/api-derive@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-1.0.0-beta.7.tgz#f48682b16e1473cb1bb06c3e823c4156a5f89f97"
integrity sha512-ZlVzupjDQAb4aLk0Au0CGBmV+2sVzTpRLTREMgn6k6P+qAfYcaMJObeq7KdFbTtdZDMFXVg1cIOuKChj7Xbzbw==
"@polkadot/api-derive@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-1.0.0-beta.8.tgz#9bf79f4aca19a0bd733aa37e2cd1003f50dd516d"
integrity sha512-J8bPbAte7zMEcfgrIn52wNsDXgMRcDMfkwFLYGvrevuEZadViS4GSCZ9cBAiwp1ZQLCiQAIvvMgTLO8EBKQCag==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/api" "^1.0.0-beta.7"
"@polkadot/types" "^1.0.0-beta.7"
"@polkadot/api" "^1.0.0-beta.8"
"@polkadot/types" "^1.0.0-beta.8"
"@polkadot/api@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-1.0.0-beta.7.tgz#e80a9bbd75e87a4ebe7e099b98fefe7cf48f2aa5"
integrity sha512-A8pUOeiQWAYwTDMD6Qk0HDpYibdGfJOdWGPdb3jrmoGMic3cQ+BHuCGnQwwAPxeL7wHya7HQbvnKH/j04zMhQQ==
"@polkadot/api@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-1.0.0-beta.8.tgz#065330218f20e5d18a2c4a4e72da90f05035ad01"
integrity sha512-naSIXZQyQXJH8LRaw/xeB4NeNQlViceiRcmUCAeFTPP0CXQ1aXToG1tWD5R7UDVeftuKNiisf3pb5yWcMogqiA==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/api-derive" "^1.0.0-beta.7"
"@polkadot/keyring" "^2.0.0-beta.2"
"@polkadot/metadata" "^1.0.0-beta.7"
"@polkadot/rpc-core" "^1.0.0-beta.7"
"@polkadot/rpc-provider" "^1.0.0-beta.7"
"@polkadot/types" "^1.0.0-beta.7"
"@polkadot/util-crypto" "^2.0.0-beta.2"
"@polkadot/api-derive" "^1.0.0-beta.8"
"@polkadot/keyring" "^2.0.0-beta.4"
"@polkadot/metadata" "^1.0.0-beta.8"
"@polkadot/rpc-core" "^1.0.0-beta.8"
"@polkadot/rpc-provider" "^1.0.0-beta.8"
"@polkadot/types" "^1.0.0-beta.8"
"@polkadot/util-crypto" "^2.0.0-beta.4"
"@polkadot/dev-react@^0.32.14":
version "0.32.14"
@ -2226,14 +2226,14 @@
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/jsonrpc@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/jsonrpc/-/jsonrpc-1.0.0-beta.7.tgz#64972112d983f427a03f37f3fbebeaad96ca6b14"
integrity sha512-ssfzufC3uo62HPhX4tD0OyXk5UyiuM05wChKYtRXZLmd/0/Pe+os71YDURZrWUWFQxXuDlqgN1iBNduLqr6lsw==
"@polkadot/jsonrpc@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/jsonrpc/-/jsonrpc-1.0.0-beta.8.tgz#42291c3e945f39e427ff2bed358577b912e08788"
integrity sha512-aLMcT99kFGfQVBhiaETvn+fyljyehcgJXATJoUvLu8ZOtJP4K7MWnU8FZ/mulr5uYIo01t5koEvb7BHIkrtU4g==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/keyring@^2.0.0-beta.2", "@polkadot/keyring@^2.0.0-beta.4":
"@polkadot/keyring@^2.0.0-beta.4":
version "2.0.0-beta.4"
resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-2.0.0-beta.4.tgz#036b8c49a6ce34a17c2d070125c772f64356fc4f"
integrity sha512-Fz+LEIeJzV3uDrb/im2qkJORTO9037dDp4LZVtLvP7H63e401vYd0Q0RbWjKnDq47Um3nuPjog/HmxUUEEnNRw==
@ -2242,15 +2242,15 @@
"@polkadot/util" "^2.0.0-beta.4"
"@polkadot/util-crypto" "^2.0.0-beta.4"
"@polkadot/metadata@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-1.0.0-beta.7.tgz#fb59f49701733b64beff9833695df63d05a271ab"
integrity sha512-I54dag0cm1gE38i2DWXiYPjPO/lgNLZTBRkiruYbE8ZZ/mWPgRdeqeH5ao/e0y0hAFrrGZeKNlyBlO/QVmSwpA==
"@polkadot/metadata@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-1.0.0-beta.8.tgz#823fa4acd840cc2b2b3279539b261111a7f99a4d"
integrity sha512-LxPizi7CQJqXMvsb3xIYs4PKmLyvgry/3EQgeSqVRrt34Z/hn02/8fX4R9Gqr685CAwRRolVre6wHhN9dWwaLw==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/types" "^1.0.0-beta.7"
"@polkadot/util" "^2.0.0-beta.2"
"@polkadot/util-crypto" "^2.0.0-beta.2"
"@polkadot/types" "^1.0.0-beta.8"
"@polkadot/util" "^2.0.0-beta.4"
"@polkadot/util-crypto" "^2.0.0-beta.4"
"@polkadot/react-identicon@^0.48.0-beta.12":
version "0.48.0-beta.12"
@ -2276,27 +2276,27 @@
qrcode-generator "^1.4.4"
react-qr-reader "^2.2.1"
"@polkadot/rpc-core@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-1.0.0-beta.7.tgz#14f9e749f7a51f4978476bf1562384de8dacb5cc"
integrity sha512-kze/coKDVDF5lE0h+pscT7wTg9ncWuQrUd1yabEeZ3CrndbWIGW9dFw8Hqo+DMJIOxW3aklgYD9FINRS7DN4aQ==
"@polkadot/rpc-core@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-1.0.0-beta.8.tgz#c65a25ac2436f76aa2ce22360c06cbd3ec73e6d3"
integrity sha512-pQlD0GM9GLvCNo0dmY+BmVh/yctsPbGCSa0mT9a5Tsboa+HLAUguWR5ijMTfiukX6XfobB/e5V/ByxWPIc5sVQ==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/jsonrpc" "^1.0.0-beta.7"
"@polkadot/rpc-provider" "^1.0.0-beta.7"
"@polkadot/types" "^1.0.0-beta.7"
"@polkadot/util" "^2.0.0-beta.2"
"@polkadot/jsonrpc" "^1.0.0-beta.8"
"@polkadot/rpc-provider" "^1.0.0-beta.8"
"@polkadot/types" "^1.0.0-beta.8"
"@polkadot/util" "^2.0.0-beta.4"
rxjs "^6.5.4"
"@polkadot/rpc-provider@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-1.0.0-beta.7.tgz#43fe5bfb87351b9f6b0c54a0b12a0dbd6d1d4e27"
integrity sha512-jvzhJBxKE43NlqiS3KlkwlQnF8kaqSlbyE8JT6bIR4eRKIYWVTefIkNaHRrwuALOzE37V2XiFA01Cb9mp1Ns0g==
"@polkadot/rpc-provider@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-1.0.0-beta.8.tgz#9e584b21b57b285df98d832c8ff2f61bf10cc716"
integrity sha512-E7Vwxnw4c3ec13kFmeWGyFOjUFAm6D++xOn9FT8KRGtT6+0iF2X02k7FS5cYQfhy6+d78eC1GPAAoqGqsYKMvg==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/metadata" "^1.0.0-beta.7"
"@polkadot/util" "^2.0.0-beta.2"
"@polkadot/util-crypto" "^2.0.0-beta.2"
"@polkadot/metadata" "^1.0.0-beta.8"
"@polkadot/util" "^2.0.0-beta.4"
"@polkadot/util-crypto" "^2.0.0-beta.4"
eventemitter3 "^4.0.0"
isomorphic-fetch "^2.2.1"
websocket "^1.0.31"
@ -2308,15 +2308,15 @@
dependencies:
"@types/chrome" "^0.0.91"
"@polkadot/types@^1.0.0-beta.7":
version "1.0.0-beta.7"
resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-1.0.0-beta.7.tgz#2b812525ba2be1a7d8fcb14e6f1bd3aab33d5132"
integrity sha512-ZfDKvtUrQNL+RZbqtFAlgRqAd7LOr+MdfXnIefm0jWlF+avh/JSwDHXmhMZ6RCwRiankPRGAigB/WktNIW29oQ==
"@polkadot/types@^1.0.0-beta.8":
version "1.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-1.0.0-beta.8.tgz#60104657c810e948a52997c8c28d9812e76931fd"
integrity sha512-OzSSgJjiGdmnvOdqqsQ0sSauWPT2yEzgjjehpEo23O1Rxk3z2X/3QTXESJmsi4s6Ky7MYJ5fF/K6TSYxy/2jhA==
dependencies:
"@babel/runtime" "^7.7.7"
"@polkadot/metadata" "^1.0.0-beta.7"
"@polkadot/util" "^2.0.0-beta.2"
"@polkadot/util-crypto" "^2.0.0-beta.2"
"@polkadot/metadata" "^1.0.0-beta.8"
"@polkadot/util" "^2.0.0-beta.4"
"@polkadot/util-crypto" "^2.0.0-beta.4"
"@types/memoizee" "^0.4.3"
memoizee "^0.4.14"
@ -2364,7 +2364,7 @@
"@types/color" "^3.0.1"
color "^3.1.2"
"@polkadot/util-crypto@^2.0.0-beta.2", "@polkadot/util-crypto@^2.0.0-beta.4":
"@polkadot/util-crypto@^2.0.0-beta.4":
version "2.0.0-beta.4"
resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-2.0.0-beta.4.tgz#1828ccf34a4f7246f74cd51de29977263296eaaf"
integrity sha512-gKbLx4bm3EyR/C/P0ckFTuB17JRK31CKgY6a7bYxiNzOXLLEVBlFm8IznJv54trYb1St2xb3JpijMdJ2cuBL6w==
@ -2386,7 +2386,7 @@
tweetnacl "^1.0.1"
xxhashjs "^0.2.2"
"@polkadot/util@^2.0.0-beta.2", "@polkadot/util@^2.0.0-beta.4":
"@polkadot/util@^2.0.0-beta.4":
version "2.0.0-beta.4"
resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-2.0.0-beta.4.tgz#f7be2e17abe85596c6860d980ee3af686154467a"
integrity sha512-OsmCYd5Go0QQcYPNVcwv8brEGTDw25SLaWgaaU2YPJqLnHkJp/1vZW6VP6TSW15BpAxN0+GhZs84Ja+1gYHM/g==