Fix extrinsic proposals (#15)

* Fix file upload size

* Extrinsics should extrinsic again
This commit is contained in:
Jaco Greeff 2018-05-05 13:20:23 +02:00 committed by GitHub
parent d256ea6b30
commit da5c28faa6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 211 additions and 103 deletions

View File

@ -11,9 +11,9 @@
"test": "jest --coverage"
},
"devDependencies": {
"@polkadot/primitives": "^0.12.4",
"@polkadot/primitives-codec": "^0.12.4",
"@polkadot/primitives-json": "^0.12.4",
"@polkadot/primitives": "^0.12.6",
"@polkadot/primitives-codec": "^0.12.6",
"@polkadot/primitives-json": "^0.12.6",
"@polkadot/ui-react-app": "^0.1.7",
"@polkadot/util-crypto": "^0.19.4"
}

View File

@ -11,8 +11,8 @@
"test": "jest --coverage"
},
"devDependencies": {
"@polkadot/extrinsics": "^0.12.4",
"@polkadot/extrinsics-codec": "^0.12.4",
"@polkadot/extrinsics": "^0.12.6",
"@polkadot/extrinsics-codec": "^0.12.6",
"@polkadot/ui-react-app": "^0.1.7",
"react-dropzone": "^4.2.9"
}

View File

@ -10,18 +10,37 @@ import React from 'react';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import withObservable from '@polkadot/rx-react/with/observable';
import Submission from './Submission';
import Signer from './Signer';
import Submission from './Submission';
import Status from './Status';
import translate from './translate';
type Props = I18nProps & {};
const CLOSE_STATUS = ['cancelled', 'error', 'sent'];
const queue: rxjs$BehaviorSubject<QueueTx> = new BehaviorSubject(({
isValid: false,
status: 'incomplete'
}: $Shape<QueueTx>));
const QueuedSigner = withObservable(queue)(Signer);
const QueuedStatus = withObservable(queue)(Status);
queue.subscribe(({ status }) => {
if (CLOSE_STATUS.includes(status)) {
setTimeout(() => {
const tx = queue.getValue();
if (CLOSE_STATUS.includes(tx.status)) {
queue.next({
...tx,
status: 'incomplete'
});
}
}, 5000);
}
});
function App ({ className, style }: Props): React$Node {
return (
@ -31,6 +50,7 @@ function App ({ className, style }: Props): React$Node {
>
<Submission subject={queue} />
<QueuedSigner subject={queue} />
<QueuedStatus />
</div>
);
}

View File

@ -64,7 +64,9 @@ export default class Extrinsic extends React.PureComponent<Props> {
values[index].isValid;
}, !!values);
const raw = values.map((param) => param && param.value);
const data = extrinsic.params && encodeExtrinsic(extrinsic, raw);
const data = extrinsic.params
? encodeExtrinsic(extrinsic, raw)
: new Uint8Array([]);
this.props.subject.next({
data,

View File

@ -0,0 +1,37 @@
// Copyright 2017-2018 Jaco Greeff
// This software may be modified and distributed under the terms
// of the ISC license. See the LICENSE file for details.
// @flow
import type { I18nProps } from '@polkadot/ui-react-app/types';
import type { QueueTx } from './types';
import React from 'react';
import translate from './translate';
type Props = I18nProps & {
value: QueueTx
}
function Status ({ className, style, value: { extrinsic, isValid, status } }: Props): React$Node {
if (!isValid || ['incomplete'].includes(status)) {
return null;
}
return (
<div
className={['extrinsics--Status', status, className].join(' ')}
style={style}
>
<div className='header'>
{extrinsic.section}_{extrinsic.name}
</div>
<div className='status'>
{status}
</div>
</div>
);
}
export default translate(Status);

View File

@ -35,14 +35,15 @@ class Submission extends React.PureComponent<Props> {
}
componentWillMount () {
this.subjects.index.subscribe(this.onChange);
this.subjects.method.subscribe(this.onChange);
this.subjects.sender.subscribe(this.onChange);
}
onChange = (): void => {
const publicKey = this.subjects.sender.getValue();
const message = this.subjects.method.getValue();
const index = this.subjects.index.getValue();
const message = this.subjects.method.getValue();
const publicKey = this.subjects.sender.getValue();
const isValid = !!(publicKey && publicKey.length && message && message.isValid);
this.subjects.call.next({

View File

@ -5,3 +5,23 @@
.extrinsics--App {
padding: 1em;
}
.extrinsics--Status {
background: #bcdaf0;
display: inline-block;
padding: 0.5rem 1rem;
position: fixed;
bottom: 0.125rem;
right: 0.125rem;
text-align: center;
z-index: 1001;
}
.extrinsics--Status .status {
font-weight: 700;
}
.extrinsics--Status.error {
background: red;
color: white;
}

View File

@ -11,8 +11,9 @@
"test": "jest --coverage"
},
"dependencies": {
"@polkadot/extrinsics-substrate": "^0.12.4",
"@polkadot/rx-react": "^0.5.2",
"@polkadot/extrinsics-substrate": "^0.12.6",
"@polkadot/rx-react": "^0.5.3",
"@polkadot/storage-substrate": "^0.12.6",
"@polkadot/ui-react": "^0.10.2",
"@polkadot/util": "^0.19.4",
"@polkadot/util-keyring": "^0.19.4",
@ -25,5 +26,8 @@
"react-router-dom": "^4.2.2",
"semantic-ui-css": "^2.3.1",
"semantic-ui-react": "^0.79.1"
},
"devDepependencies": {
"@polkadot/primitives": "^0.12.6"
}
}

View File

@ -23,6 +23,7 @@ type Props = I18nProps & {
};
function SelectMethod ({ className, isError, label = '', onChange, style, subject, t, type, value }: Props): React$Node {
// $FlowFixMe string vs ...
if (!value || !extrinsics[value.section]) {
return null;
}

View File

@ -5,7 +5,7 @@
// TODO: We have a lot shared between this and InputExtrinsic
import type { Extrinsic, ExtrinsicSectionName } from '@polkadot/extrinsics/types';
import type { Extrinsic } from '@polkadot/extrinsics/types';
import type { I18nProps } from '../types';
import './InputExtrinsic.css';
@ -30,7 +30,7 @@ type Props = I18nProps & {
};
class InputExtrinsic extends React.PureComponent<Props> {
sectionSubject: rxjs$Subject<ExtrinsicSectionName>;
sectionSubject: rxjs$Subject<string>;
SelectMethod: React$ComponentType<*>;
subscriptions: Array<rxjs$ISubscription>
@ -55,6 +55,7 @@ class InputExtrinsic extends React.PureComponent<Props> {
const options = methodOptions(section, type);
subject.next(
// $FlowFixMe we have string to be generix, but...
map[section].methods[type][options[0].value]
);
})

View File

@ -8,14 +8,21 @@ import type { ExtrinsicSectionName } from '@polkadot/extrinsics/types';
import React from 'react';
import map from '@polkadot/extrinsics-substrate';
export default function createOptions (sectionName: ExtrinsicSectionName, type: 'private' | 'public'): Array<*> {
const methods = map[sectionName].methods[type];
// flowlint-next-line unclear-type:off
export default function createOptions (sectionName: any, type: 'private' | 'public'): Array<*> {
const section = map[(sectionName: ExtrinsicSectionName)];
if (!section) {
return [];
}
const methods = section.methods[type];
return Object
.keys(methods)
.sort()
.map((name) => {
const { description, params = {} } = methods[name];
const { description = '', params = {} } = methods[name];
const inputs = Object.keys(params).join(', ');
return {

View File

@ -22,6 +22,7 @@ type Props = I18nProps & {
};
function SelectKey ({ className, isError, label = '', onChange, style, subject, t, value }: Props): React$Node {
// $FlowFixMe string vs ...
if (!value || !map[value.section]) {
return null;
}

View File

@ -5,7 +5,7 @@
// TODO: We have a lot shared between this and InputExtrinsic
import type { StorageDef$Key, StateDb$SectionNames } from '@polkadot/storage/types';
import type { StorageDef$Key } from '@polkadot/storage/types';
import type { I18nProps } from '../types';
import './InputStorage.css';
@ -29,7 +29,7 @@ type Props = I18nProps & {
};
class InputStorage extends React.PureComponent<Props> {
sectionSubject: rxjs$Subject<StateDb$SectionNames>;
sectionSubject: rxjs$Subject<string>;
subscriptions: Array<rxjs$ISubscription>
SelectKey: React$ComponentType<*>;
@ -53,6 +53,7 @@ class InputStorage extends React.PureComponent<Props> {
const options = keyOptions(section);
subject.next(
// $FlowFixMe we have string to be generix, but...
map[section].keys[options[0].value]
);
})

View File

@ -8,8 +8,13 @@ import type { StateDb$SectionNames } from '@polkadot/storage/types';
import React from 'react';
import map from '@polkadot/storage-substrate/keys';
export default function createOptions (sectionName: StateDb$SectionNames): Array<*> {
const section = map[sectionName];
// flowlint-next-line unclear-type:off
export default function createOptions (sectionName: any): Array<*> {
const section = map[(sectionName: StateDb$SectionNames)];
if (!section) {
return [];
}
return Object
.keys(section.keys)
@ -20,7 +25,7 @@ export default function createOptions (sectionName: StateDb$SectionNames): Array
return !isDeprecated && !isHidden && Object.keys(params).length === 0;
})
.map((name) => {
const { description, params = {} } = section.keys[name];
const { description = '', params = {} } = section.keys[name];
const inputs = Object.keys(params).join(', ');
return {

View File

@ -9,6 +9,8 @@ import type { RawParam } from '../types';
import React from 'react';
import Dropzone from 'react-dropzone';
import withObservable from '@polkadot/rx-react/with/observable';
import bnToU8a from '@polkadot/util/bn/toU8a';
import u8aConcat from '@polkadot/util/u8a/concat';
import translate from '../../translate';
import Base from './Base';
@ -30,9 +32,13 @@ function BytesFile ({ className, isError = false, label, onChange, subject, t }:
files.forEach((file) => {
const reader = new FileReader();
reader.onload = () =>
reader.onload = () => {
// flowlint-next-line unclear-type:off
onChange(file, new Uint8Array((((reader.result): any): ArrayBuffer)));
const data = new Uint8Array((((reader.result): any): ArrayBuffer));
const vec = u8aConcat(bnToU8a(data.length, 32, true), data);
onChange(file, vec);
};
reader.onabort = () =>
onChange();
reader.onerror = () =>

View File

@ -45,7 +45,9 @@ class Params extends React.PureComponent<Props, State> {
}
static getDerivedStateFromProps (props: Props, prevState: State): $Shape<State> | null {
if (!props.value || Object.keys(props.value.params || {}).length === 0) {
const { value: { params = {} } = {}, subject } = props;
if (Object.keys(params).length === 0) {
Params.unsubscribe(prevState.subscriptions);
return {
@ -54,12 +56,12 @@ class Params extends React.PureComponent<Props, State> {
};
}
const subjects = createSubjects(props.value.params, props.subject);
const subjects = createSubjects(params, subject);
let subscriptions;
if (props.subject) {
if (subject) {
const onChange = (): void => {
props.subject.next(
subject.next(
subjects.map((s) => s.getValue())
);
};
@ -85,8 +87,8 @@ class Params extends React.PureComponent<Props, State> {
return null;
}
const { name, params } = value;
const paramNames = Object.keys(params || {});
const { name, params = {} } = value;
const paramNames = Object.keys(params);
if (paramNames.length === 0) {
return null;

View File

@ -3,7 +3,7 @@
// of the ISC license. See the LICENSE file for details.
// @flow
import type { Extrinsic$Params } from '@polkadot/extrinsics/types';
import type { Params } from '@polkadot/primitives/param';
import type { RawParam } from './types';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@ -11,7 +11,7 @@ import isUndefined from '@polkadot/util/is/undefined';
import getInitValue from './initValue';
export default function subjects (params: Extrinsic$Params, subject: rxjs$BehaviorSubject<Array<RawParam>>): Array<rxjs$BehaviorSubject<RawParam>> {
export default function subjects (params: Params, subject: rxjs$BehaviorSubject<Array<RawParam>>): Array<rxjs$BehaviorSubject<RawParam>> {
return Object
.keys(params)
.map((name: string): rxjs$BehaviorSubject<RawParam> => {

144
yarn.lock
View File

@ -622,25 +622,25 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
"@polkadot/api-format@^0.9.13":
version "0.9.13"
resolved "https://registry.yarnpkg.com/@polkadot/api-format/-/api-format-0.9.13.tgz#3f0bb7a1a3775bd026793903aff72a63ca040c31"
"@polkadot/api-format@^0.9.15":
version "0.9.15"
resolved "https://registry.yarnpkg.com/@polkadot/api-format/-/api-format-0.9.15.tgz#25d21f5d06dba64d00b614ee2a314ef4cbfbd782"
dependencies:
"@polkadot/primitives-json" "^0.12.4"
"@polkadot/primitives-json" "^0.12.6"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/api-jsonrpc@^0.9.13":
version "0.9.13"
resolved "https://registry.yarnpkg.com/@polkadot/api-jsonrpc/-/api-jsonrpc-0.9.13.tgz#4bf1de6a3a4cb0103bd5da3777eb4a656b3ce673"
"@polkadot/api-jsonrpc@^0.9.15":
version "0.9.15"
resolved "https://registry.yarnpkg.com/@polkadot/api-jsonrpc/-/api-jsonrpc-0.9.15.tgz#e210f5ce82d7c41c11ddf3cd83e521ede9f1ddae"
dependencies:
babel-runtime "^6.26.0"
"@polkadot/api-provider@^0.9.13":
version "0.9.13"
resolved "https://registry.yarnpkg.com/@polkadot/api-provider/-/api-provider-0.9.13.tgz#b09f68d491b1f6d07d4f70e26f56eb536765bd9c"
"@polkadot/api-provider@^0.9.15":
version "0.9.15"
resolved "https://registry.yarnpkg.com/@polkadot/api-provider/-/api-provider-0.9.15.tgz#b641c2e83fb0cf966b4ecfa2500b7e5d816cefed"
dependencies:
"@polkadot/storage-substrate" "^0.12.4"
"@polkadot/storage-substrate" "^0.12.6"
"@polkadot/util" "^0.19.4"
"@polkadot/util-crypto" "^0.19.4"
"@polkadot/util-keyring" "^0.19.4"
@ -649,13 +649,13 @@
isomorphic-fetch "^2.2.1"
websocket "^1.0.25"
"@polkadot/api@^0.9.13":
version "0.9.13"
resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-0.9.13.tgz#0ea002e6a8fa9c1bedf8e31e6217d846ec537e6d"
"@polkadot/api@^0.9.15":
version "0.9.15"
resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-0.9.15.tgz#0a372b488f11c06d00b1e174633d304e16c94f6e"
dependencies:
"@polkadot/api-format" "^0.9.13"
"@polkadot/api-jsonrpc" "^0.9.13"
"@polkadot/api-provider" "^0.9.13"
"@polkadot/api-format" "^0.9.15"
"@polkadot/api-jsonrpc" "^0.9.15"
"@polkadot/api-provider" "^0.9.15"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
@ -697,108 +697,108 @@
stylelint "^9.1.1"
stylelint-config-standard "^18.2.0"
"@polkadot/extrinsics-codec@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics-codec/-/extrinsics-codec-0.12.4.tgz#ab14f34a140f347089bfe48d439d74ecb7107fcb"
"@polkadot/extrinsics-codec@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics-codec/-/extrinsics-codec-0.12.6.tgz#c4d0fb859fe189ddf57b2a993663fa7847a6fc1f"
dependencies:
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
bn.js "^4.11.8"
"@polkadot/extrinsics-substrate@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics-substrate/-/extrinsics-substrate-0.12.4.tgz#d32a06b7c6a39f5cd5c50124c4a29062bc2429b0"
"@polkadot/extrinsics-substrate@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics-substrate/-/extrinsics-substrate-0.12.6.tgz#36d35000053695e27c92dab6172e7f3a968f2ca8"
dependencies:
"@polkadot/extrinsics" "^0.12.4"
"@polkadot/extrinsics" "^0.12.6"
babel-runtime "^6.26.0"
"@polkadot/extrinsics@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics/-/extrinsics-0.12.4.tgz#1c80415c6588ffcb5580b039e8fe014ca0bd2778"
"@polkadot/extrinsics@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/extrinsics/-/extrinsics-0.12.6.tgz#627ad928da9ea8adf74c1abb313883544b75f7ef"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/primitives-builder@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-builder/-/primitives-builder-0.12.4.tgz#213ee92bcc2ee3b248d3fcd02c0f2ac463d27c50"
"@polkadot/primitives-builder@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-builder/-/primitives-builder-0.12.6.tgz#e6bfd80ce811d65ed1cafde910f45df9661b9f44"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives-codec" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/primitives-codec" "^0.12.6"
"@polkadot/util" "^0.19.4"
"@polkadot/util-crypto" "^0.19.4"
"@polkadot/util-triehash" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/primitives-codec@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-codec/-/primitives-codec-0.12.4.tgz#358bf9e2299c01d4e36ccc6369d755aae5a6711b"
"@polkadot/primitives-codec@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-codec/-/primitives-codec-0.12.6.tgz#d64ad268f32ea734bd3ef77310412f269648e75f"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives-builder" "^0.12.4"
"@polkadot/primitives-rlp" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/primitives-builder" "^0.12.6"
"@polkadot/primitives-rlp" "^0.12.6"
"@polkadot/util" "^0.19.4"
"@polkadot/util-keyring" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/primitives-json@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-json/-/primitives-json-0.12.4.tgz#8e83799db0750df3d6f011bebae16e0cbffad159"
"@polkadot/primitives-json@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-json/-/primitives-json-0.12.6.tgz#f58149578e4bbb970469272cae80c26be24fbe7d"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives-builder" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/primitives-builder" "^0.12.6"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/primitives-rlp@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-rlp/-/primitives-rlp-0.12.4.tgz#0a936925a9afc32e1ad6b78540eff19b47b1a22e"
"@polkadot/primitives-rlp@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/primitives-rlp/-/primitives-rlp-0.12.6.tgz#ceaddeeb42bd6e35664ea5a5a548123c0ef4403a"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives-builder" "^0.12.4"
"@polkadot/primitives-json" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/primitives-builder" "^0.12.6"
"@polkadot/primitives-json" "^0.12.6"
"@polkadot/util" "^0.19.4"
"@polkadot/util-crypto" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/primitives@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/primitives/-/primitives-0.12.4.tgz#7aa00e2ae19c44cc6c1e30a999342ac6cc5afbb8"
"@polkadot/primitives@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/primitives/-/primitives-0.12.6.tgz#717b062853eb08370f1cb5a6cba37a612fd47829"
dependencies:
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/rx-api@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@polkadot/rx-api/-/rx-api-0.5.2.tgz#df4f16d849f3fa1bb1842158dca70bf5e07ed6a7"
"@polkadot/rx-api@^0.5.3":
version "0.5.3"
resolved "https://registry.yarnpkg.com/@polkadot/rx-api/-/rx-api-0.5.3.tgz#d635f80e01f695b1af85a1bc0cfcb14aaef0dbd6"
dependencies:
"@polkadot/api" "^0.9.13"
"@polkadot/api-provider" "^0.9.13"
"@polkadot/api" "^0.9.15"
"@polkadot/api-provider" "^0.9.15"
rxjs "^5.5.10"
"@polkadot/rx-react@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@polkadot/rx-react/-/rx-react-0.5.2.tgz#9c65b1d329f20273b294238c19bfa3fe2e7a615e"
"@polkadot/rx-react@^0.5.3":
version "0.5.3"
resolved "https://registry.yarnpkg.com/@polkadot/rx-react/-/rx-react-0.5.3.tgz#f553c618a5f9849819d85ffeff9fb3a8a24dfd5f"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/rx-api" "^0.5.2"
"@polkadot/storage-substrate" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/rx-api" "^0.5.3"
"@polkadot/storage-substrate" "^0.12.6"
"@polkadot/util" "^0.19.4"
"@polkadot/storage-substrate@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/storage-substrate/-/storage-substrate-0.12.4.tgz#a48ee75ef88a2c8119fd712bd7fca59c67b728e7"
"@polkadot/storage-substrate@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/storage-substrate/-/storage-substrate-0.12.6.tgz#5aff477494ef6a4fef883accd6ad9382c3fa22cf"
dependencies:
"@polkadot/storage" "^0.12.4"
"@polkadot/storage" "^0.12.6"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"
"@polkadot/storage@^0.12.4":
version "0.12.4"
resolved "https://registry.yarnpkg.com/@polkadot/storage/-/storage-0.12.4.tgz#ec50733ea6fa4efeabc9238fd32aa3b60e39001b"
"@polkadot/storage@^0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@polkadot/storage/-/storage-0.12.6.tgz#d65661cc10d3af5120516c7d252c5413ef89db6f"
dependencies:
"@polkadot/primitives" "^0.12.4"
"@polkadot/primitives" "^0.12.6"
"@polkadot/util" "^0.19.4"
babel-runtime "^6.26.0"