From b71e029cc88438292ec9f5dde2bf00f13f9e959c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 29 Apr 2018 16:52:55 +0200 Subject: [PATCH] Round out available extrinsic methods (#8) * Expand methods * Remove extra params label * Move shared extrinsic definitions * Split extrinsics into own packages * Update entry location * Include all method calls * Expand to include all extrinsics * Cleanup extrinsic definitions * Build folder change --- .flowconfig | 6 +- flow-typed/semantic-ui-react.js | 6 +- package.json | 13 +- packages/app-explorer/package.json | 14 +- packages/app-explorer/src/App/index.js | 2 +- packages/app-extrinsics/package.json | 13 +- packages/app-extrinsics/src/Account.js | 3 +- .../app-extrinsics/src/Extrinsic/index.js | 4 +- .../app-extrinsics/src/Extrinsic/subjects.js | 6 +- .../app-extrinsics/src/InputAddress/index.js | 8 +- .../src/InputExtrinsic/InputExtrinsic.css | 2 - .../src/InputExtrinsic/index.js | 7 +- .../src/InputExtrinsic/options.js | 33 ++-- packages/app-extrinsics/src/Params/Account.js | 9 +- packages/app-extrinsics/src/Params/Amount.js | 6 +- packages/app-extrinsics/src/Params/Bool.js | 39 ++++ packages/app-extrinsics/src/Params/Hash.js | 37 ++++ packages/app-extrinsics/src/Params/Param.js | 29 +-- .../app-extrinsics/src/Params/Proposal.js | 9 +- packages/app-extrinsics/src/Params/Unknown.js | 14 +- .../src/Params/VoteThreshold.js | 39 ++++ .../src/Params/findComponent.js | 40 ++++ packages/app-extrinsics/src/Params/index.js | 23 +-- .../app-extrinsics/src/Params/initValue.js | 17 +- .../app-extrinsics/src/Params/subjects.js | 2 +- .../app-extrinsics/src/Params/subscriber.js | 2 +- .../app-extrinsics/src/Params/typeToText.js | 16 ++ packages/app-extrinsics/src/Params/types.js | 3 +- packages/app-extrinsics/src/Signer/sign.js | 21 -- packages/app-extrinsics/src/Signer/submit.js | 20 +- .../app-extrinsics/src/Submission/index.js | 12 +- .../app-extrinsics/src/Submission/subjects.js | 8 +- packages/app-extrinsics/src/encode/param.js | 34 ---- .../src/extrinsics/consensus.js | 14 -- .../app-extrinsics/src/extrinsics/council.js | 14 -- .../src/extrinsics/councilVoting.js | 14 -- .../src/extrinsics/democracy.js | 24 --- .../app-extrinsics/src/extrinsics/index.js | 82 -------- .../app-extrinsics/src/extrinsics/staking.js | 67 ------- packages/app-extrinsics/src/types.js | 2 +- packages/{portal => apps}/.env | 0 packages/{portal => apps}/LICENSE | 0 packages/{portal => apps}/README.md | 0 packages/{portal => apps}/package.json | 10 +- packages/apps/public/favicon.ico | Bin 0 -> 38078 bytes packages/{portal => apps}/public/index.html | 2 +- .../public/locales/en/portal.json | 0 .../{portal => apps}/public/manifest.json | 0 packages/{portal => apps}/src/App/App.css | 0 packages/{portal => apps}/src/App/App.spec.js | 0 packages/{portal => apps}/src/App/index.js | 0 .../src/Connecting/Connecting.css | 0 .../{portal => apps}/src/Connecting/index.js | 0 .../{portal => apps}/src/Content/Content.css | 0 .../{portal => apps}/src/Content/index.js | 0 .../src/NotFound/NotFound.css | 0 .../{portal => apps}/src/NotFound/index.js | 0 .../{portal => apps}/src/SideBar/Item.css | 0 packages/{portal => apps}/src/SideBar/Item.js | 0 .../{portal => apps}/src/SideBar/SideBar.css | 0 .../{portal => apps}/src/SideBar/index.js | 0 packages/{portal => apps}/src/i18n.js | 0 packages/{portal => apps}/src/index.css | 0 packages/{portal => apps}/src/index.js | 0 .../{portal => apps}/src/routing/explorer.js | 2 +- .../src/routing/extrinsics.js | 2 +- .../{portal => apps}/src/routing/index.js | 0 packages/{portal => apps}/src/semantic.css | 0 packages/{portal => apps}/src/translate.js | 0 packages/{portal => apps}/src/types.js | 0 packages/{portal => apps}/src/urlParams.js | 0 packages/extrinsics-codec/LICENSE | 15 ++ packages/extrinsics-codec/README.md | 1 + packages/extrinsics-codec/package.json | 21 ++ .../src/encode/call.js | 2 - .../src/encode/extrinsic.js | 2 +- .../src/encode/index.js | 4 +- packages/extrinsics-codec/src/encode/param.js | 32 +++ .../src/encode/params.js | 2 +- packages/extrinsics-codec/src/encode/type.js | 47 +++++ packages/extrinsics-polkadot/LICENSE | 15 ++ packages/extrinsics-polkadot/README.md | 1 + packages/extrinsics-polkadot/package.json | 17 ++ packages/extrinsics-polkadot/src/consensus.js | 30 +++ packages/extrinsics-polkadot/src/council.js | 85 ++++++++ .../extrinsics-polkadot/src/councilVoting.js | 52 +++++ packages/extrinsics-polkadot/src/democracy.js | 54 +++++ packages/extrinsics-polkadot/src/index.js | 26 +++ packages/extrinsics-polkadot/src/session.js | 35 ++++ packages/extrinsics-polkadot/src/staking.js | 60 ++++++ packages/extrinsics/LICENSE | 15 ++ packages/extrinsics/README.md | 1 + .../session.js => extrinsics/index.js} | 10 +- packages/extrinsics/package.json | 17 ++ packages/extrinsics/src/index.js | 46 +++++ packages/extrinsics/src/methods.js | 35 ++++ packages/extrinsics/src/params.js | 19 ++ packages/extrinsics/src/section.js | 23 +++ .../extrinsics => extrinsics/src}/types.js | 60 ++++-- packages/portal/public/favicon.ico | Bin 3870 -> 0 bytes yarn.lock | 186 +++++++++--------- 101 files changed, 1118 insertions(+), 525 deletions(-) create mode 100644 packages/app-extrinsics/src/Params/Bool.js create mode 100644 packages/app-extrinsics/src/Params/Hash.js create mode 100644 packages/app-extrinsics/src/Params/VoteThreshold.js create mode 100644 packages/app-extrinsics/src/Params/findComponent.js create mode 100644 packages/app-extrinsics/src/Params/typeToText.js delete mode 100644 packages/app-extrinsics/src/Signer/sign.js delete mode 100644 packages/app-extrinsics/src/encode/param.js delete mode 100644 packages/app-extrinsics/src/extrinsics/consensus.js delete mode 100644 packages/app-extrinsics/src/extrinsics/council.js delete mode 100644 packages/app-extrinsics/src/extrinsics/councilVoting.js delete mode 100644 packages/app-extrinsics/src/extrinsics/democracy.js delete mode 100644 packages/app-extrinsics/src/extrinsics/index.js delete mode 100644 packages/app-extrinsics/src/extrinsics/staking.js rename packages/{portal => apps}/.env (100%) rename packages/{portal => apps}/LICENSE (100%) rename packages/{portal => apps}/README.md (100%) rename packages/{portal => apps}/package.json (81%) create mode 100644 packages/apps/public/favicon.ico rename packages/{portal => apps}/public/index.html (92%) rename packages/{portal => apps}/public/locales/en/portal.json (100%) rename packages/{portal => apps}/public/manifest.json (100%) rename packages/{portal => apps}/src/App/App.css (100%) rename packages/{portal => apps}/src/App/App.spec.js (100%) rename packages/{portal => apps}/src/App/index.js (100%) rename packages/{portal => apps}/src/Connecting/Connecting.css (100%) rename packages/{portal => apps}/src/Connecting/index.js (100%) rename packages/{portal => apps}/src/Content/Content.css (100%) rename packages/{portal => apps}/src/Content/index.js (100%) rename packages/{portal => apps}/src/NotFound/NotFound.css (100%) rename packages/{portal => apps}/src/NotFound/index.js (100%) rename packages/{portal => apps}/src/SideBar/Item.css (100%) rename packages/{portal => apps}/src/SideBar/Item.js (100%) rename packages/{portal => apps}/src/SideBar/SideBar.css (100%) rename packages/{portal => apps}/src/SideBar/index.js (100%) rename packages/{portal => apps}/src/i18n.js (100%) rename packages/{portal => apps}/src/index.css (100%) rename packages/{portal => apps}/src/index.js (100%) rename packages/{portal => apps}/src/routing/explorer.js (89%) rename packages/{portal => apps}/src/routing/extrinsics.js (88%) rename packages/{portal => apps}/src/routing/index.js (100%) rename packages/{portal => apps}/src/semantic.css (100%) rename packages/{portal => apps}/src/translate.js (100%) rename packages/{portal => apps}/src/types.js (100%) rename packages/{portal => apps}/src/urlParams.js (100%) create mode 100644 packages/extrinsics-codec/LICENSE create mode 100644 packages/extrinsics-codec/README.md create mode 100644 packages/extrinsics-codec/package.json rename packages/{app-extrinsics => extrinsics-codec}/src/encode/call.js (95%) rename packages/{app-extrinsics => extrinsics-codec}/src/encode/extrinsic.js (89%) rename packages/{app-extrinsics => extrinsics-codec}/src/encode/index.js (87%) create mode 100644 packages/extrinsics-codec/src/encode/param.js rename packages/{app-extrinsics => extrinsics-codec}/src/encode/params.js (87%) create mode 100644 packages/extrinsics-codec/src/encode/type.js create mode 100644 packages/extrinsics-polkadot/LICENSE create mode 100644 packages/extrinsics-polkadot/README.md create mode 100644 packages/extrinsics-polkadot/package.json create mode 100644 packages/extrinsics-polkadot/src/consensus.js create mode 100644 packages/extrinsics-polkadot/src/council.js create mode 100644 packages/extrinsics-polkadot/src/councilVoting.js create mode 100644 packages/extrinsics-polkadot/src/democracy.js create mode 100644 packages/extrinsics-polkadot/src/index.js create mode 100644 packages/extrinsics-polkadot/src/session.js create mode 100644 packages/extrinsics-polkadot/src/staking.js create mode 100644 packages/extrinsics/LICENSE create mode 100644 packages/extrinsics/README.md rename packages/{app-extrinsics/src/extrinsics/session.js => extrinsics/index.js} (50%) create mode 100644 packages/extrinsics/package.json create mode 100644 packages/extrinsics/src/index.js create mode 100644 packages/extrinsics/src/methods.js create mode 100644 packages/extrinsics/src/params.js create mode 100644 packages/extrinsics/src/section.js rename packages/{app-extrinsics/src/extrinsics => extrinsics/src}/types.js (50%) delete mode 100644 packages/portal/public/favicon.ico diff --git a/.flowconfig b/.flowconfig index 051845a5df..e6ffabb22e 100644 --- a/.flowconfig +++ b/.flowconfig @@ -12,5 +12,7 @@ all=warn [options] include_warnings=true -module.name_mapper='^@polkadot/app-\(accounts\|explorer\|extrinsics\|home\|settings\)\(.*\)$' -> '/packages/app-\1/src\2' -module.name_mapper='^@polkadot/portal\(.*\)$' -> '/packages/portal/src\1' +module.name_mapper='^@polkadot/app-\(accounts\|explorer\|extrinsics\|home\|rpc\|settings\|storage\)\(.*\)$' -> '/packages/app-\1/src\2' +module.name_mapper='^@polkadot/apps\(.*\)$' -> '/packages/apps/src\1' +module.name_mapper='^@polkadot/extrinsics-\(codec\|polkadot\|substrate\)\(.*\)$' -> '/packages/extrinsics-\1/src\2' +module.name_mapper='^@polkadot/extrinsics\(.*\)$' -> '/packages/extrinsics/src\1' diff --git a/flow-typed/semantic-ui-react.js b/flow-typed/semantic-ui-react.js index 53ca9071a4..3e1ddefb7b 100644 --- a/flow-typed/semantic-ui-react.js +++ b/flow-typed/semantic-ui-react.js @@ -23,7 +23,11 @@ declare module 'semantic-ui-react/dist/es/elements/Label' { } declare module 'semantic-ui-react/dist/es/modules/Dropdown' { - declare module.exports: React$StatelessFunctionalComponent<*> + declare module.exports: React$StatelessFunctionalComponent<*> & { + Divider: React$StatelessFunctionalComponent<*>, + Header: React$StatelessFunctionalComponent<*>, + Item: React$StatelessFunctionalComponent<*> + } } declare module 'semantic-ui-react/dist/es/modules/Modal' { diff --git a/package.json b/package.json index f4124b0a7a..8cec8f85db 100644 --- a/package.json +++ b/package.json @@ -6,15 +6,12 @@ "packages/*" ], "scripts": { - "build": "polkadot-dev-build-babel && yarn run build:portal", - "build:portal": "cd packages/portal && react-scripts build", + "build": "polkadot-dev-build-babel && yarn run build:apps", + "build:apps": "cd packages/apps && react-scripts build", "check": "eslint packages && flow check", - "deploy:ghpages": "gh-pages -d packages/portal/build", - "start": "cd packages/portal && react-scripts start", - "test": "echo 'to tests executed'" - }, - "dependencies": { - "@polkadot/portal": "^0.1.1" + "deploy:ghpages": "gh-pages -d packages/apps/build", + "start": "cd packages/apps && react-scripts start", + "test": "echo 'no tests executed'" }, "devDependencies": { "@polkadot/dev": "^0.17.12", diff --git a/packages/app-explorer/package.json b/packages/app-explorer/package.json index d3b9f4c829..b5fa7bddc5 100644 --- a/packages/app-explorer/package.json +++ b/packages/app-explorer/package.json @@ -1,7 +1,7 @@ { "name": "@polkadot/app-explorer", "version": "0.1.3", - "main": "src/index.js", + "main": "index.js", "repository": "https://github.com/polkadot-js/portal.git", "author": "Jaco Greeff ", "license": "ISC", @@ -11,12 +11,12 @@ "test": "jest --coverage" }, "devDependencies": { - "@polkadot/primitives": "^0.10.3", - "@polkadot/primitives-codec": "^0.10.3", - "@polkadot/primitives-json": "^0.10.3", - "@polkadot/rx-react": "^0.4.6", - "@polkadot/util": "^0.19.2", - "@polkadot/util-crypto": "^0.19.2", + "@polkadot/primitives": "^0.10.4", + "@polkadot/primitives-codec": "^0.10.4", + "@polkadot/primitives-json": "^0.10.4", + "@polkadot/rx-react": "^0.4.7", + "@polkadot/util": "^0.19.4", + "@polkadot/util-crypto": "^0.19.4", "react": "^16.3.1", "react-dom": "^16.3.1", "react-i18next": "^7.5.1", diff --git a/packages/app-explorer/src/App/index.js b/packages/app-explorer/src/App/index.js index b0703fc5e0..f48c0c35c0 100644 --- a/packages/app-explorer/src/App/index.js +++ b/packages/app-explorer/src/App/index.js @@ -3,7 +3,7 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { BaseProps } from '@polkadot/portal/types'; +import type { BaseProps } from '../types'; import './App.css'; diff --git a/packages/app-extrinsics/package.json b/packages/app-extrinsics/package.json index 550979cf03..47dced3dab 100644 --- a/packages/app-extrinsics/package.json +++ b/packages/app-extrinsics/package.json @@ -1,7 +1,7 @@ { "name": "@polkadot/app-extrinsics", "version": "0.1.3", - "main": "src/index.js", + "main": "index.js", "repository": "https://github.com/polkadot-js/portal.git", "author": "Jaco Greeff ", "license": "ISC", @@ -11,10 +11,13 @@ "test": "jest --coverage" }, "devDependencies": { - "@polkadot/rx-react": "^0.4.6", - "@polkadot/ui-react": "^0.9.11", - "@polkadot/util": "^0.19.2", - "@polkadot/util-keyring": "^0.19.2", + "@polkadot/extrinsics": "^0.1.3", + "@polkadot/extrinsics-codec": "^0.1.3", + "@polkadot/extrinsics-polkadot": "^0.1.3", + "@polkadot/rx-react": "^0.4.7", + "@polkadot/ui-react": "^0.9.12", + "@polkadot/util": "^0.19.4", + "@polkadot/util-keyring": "^0.19.4", "react": "^16.3.1", "react-dom": "^16.3.1", "react-i18next": "^7.5.1", diff --git a/packages/app-extrinsics/src/Account.js b/packages/app-extrinsics/src/Account.js index ef8b859a7f..18e0e63a32 100644 --- a/packages/app-extrinsics/src/Account.js +++ b/packages/app-extrinsics/src/Account.js @@ -14,11 +14,12 @@ import translate from './translate'; import InputAddress from './InputAddress'; type Props = BaseProps & { + isError?: boolean, label: string, subject: rxjs$BehaviorSubject }; -function Account ({ className, label, subject, style, t }: Props): React$Node { +function Account ({ className, isError, label, subject, style, t }: Props): React$Node { const AccountBalance = withObservableParams(subject)(Balance); return ( diff --git a/packages/app-extrinsics/src/Extrinsic/index.js b/packages/app-extrinsics/src/Extrinsic/index.js index 5576241cdd..df3fb4b9c4 100644 --- a/packages/app-extrinsics/src/Extrinsic/index.js +++ b/packages/app-extrinsics/src/Extrinsic/index.js @@ -14,12 +14,13 @@ import Params from '../Params'; import createSubjects from './subjects'; type Props = BareProps & { + isError?: boolean, isPrivate?: boolean, label: string, subject: rxjs$BehaviorSubject }; -export default function ExtrinsicMethod ({ className, isPrivate, label, style, subject }: Props): React$Node { +export default function Extrinsic ({ className, isError, isPrivate, label, style, subject }: Props): React$Node { const subjects = createSubjects(subject); const MethodParams = withObservable(subjects.method)(Params); @@ -31,6 +32,7 @@ export default function ExtrinsicMethod ({ className, isPrivate, label, style, s
diff --git a/packages/app-extrinsics/src/Extrinsic/subjects.js b/packages/app-extrinsics/src/Extrinsic/subjects.js index 8272a65434..c25b358206 100644 --- a/packages/app-extrinsics/src/Extrinsic/subjects.js +++ b/packages/app-extrinsics/src/Extrinsic/subjects.js @@ -3,14 +3,13 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Extrinsic } from '../extrinsics/types'; +import type { Extrinsic } from '@polkadot/extrinsics/types'; import type { EncodedParams, RawParam } from '../types'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import encodeExtrinsic from '@polkadot/extrinsics-codec/src/encode/extrinsic'; import isUndefined from '@polkadot/util/is/undefined'; -import encodeExtrinsic from '../encode/extrinsic'; - type Subjects = { method: rxjs$BehaviorSubject, params: rxjs$BehaviorSubject> @@ -38,7 +37,6 @@ export default function subjects (subject: rxjs$BehaviorSubject): }); }; - subjects.method.subscribe(onChange); subjects.params.subscribe(onChange); return subjects; diff --git a/packages/app-extrinsics/src/InputAddress/index.js b/packages/app-extrinsics/src/InputAddress/index.js index 1918bf1521..c5dd9b8e61 100644 --- a/packages/app-extrinsics/src/InputAddress/index.js +++ b/packages/app-extrinsics/src/InputAddress/index.js @@ -17,6 +17,7 @@ import keyring from '../keyring'; type Props = { className?: string, + isError?: boolean, onChange?: (event: SyntheticEvent<*>, value: Uint8Array) => void, style?: { [string]: string @@ -44,11 +45,16 @@ export default function InputAddress (props: Props): React$Node { } }; + const _props = {...props}; + + delete _props.isError; + return ( diff --git a/packages/app-extrinsics/src/InputExtrinsic/InputExtrinsic.css b/packages/app-extrinsics/src/InputExtrinsic/InputExtrinsic.css index e48f780182..7f26eb5305 100644 --- a/packages/app-extrinsics/src/InputExtrinsic/InputExtrinsic.css +++ b/packages/app-extrinsics/src/InputExtrinsic/InputExtrinsic.css @@ -4,8 +4,6 @@ .ui--InputExtrinsic {} -.ui--InputExtrinsic-Header {} - .ui--InputExtrinsic .text { box-sizing: border-box; display: flex !important; diff --git a/packages/app-extrinsics/src/InputExtrinsic/index.js b/packages/app-extrinsics/src/InputExtrinsic/index.js index 3c3dff7b51..05b6d3ef87 100644 --- a/packages/app-extrinsics/src/InputExtrinsic/index.js +++ b/packages/app-extrinsics/src/InputExtrinsic/index.js @@ -5,18 +5,19 @@ // TODO: This is a useful, shared component, move out -import type { Extrinsic } from '../extrinsics/types'; +import type { Extrinsic } from '@polkadot/extrinsics/types'; import './InputExtrinsic.css'; import React from 'react'; import Dropdown from 'semantic-ui-react/dist/es/modules/Dropdown'; +import extrinsics from '@polkadot/extrinsics-polkadot/src'; -import extrinsics from '../extrinsics'; import options from './options'; type Props = { className?: string, + isError?: boolean, isPrivate?: boolean, onChange?: (event: SyntheticEvent<*>, value: Extrinsic) => void, style?: { @@ -41,6 +42,7 @@ export default function InputExtrinsic (props: Props): React$Node { const _props = Object.assign({}, props); + delete _props.isError; delete _props.isPrivate; return ( @@ -48,6 +50,7 @@ export default function InputExtrinsic (props: Props): React$Node { selection {..._props} className={['ui--InputExtrinsic', props.className].join(' ')} + error={props.isError} onChange={onChange} options={ // flowlint-next-line sketchy-null-bool:off diff --git a/packages/app-extrinsics/src/InputExtrinsic/options.js b/packages/app-extrinsics/src/InputExtrinsic/options.js index ef764cd9af..9d4f3e68ea 100644 --- a/packages/app-extrinsics/src/InputExtrinsic/options.js +++ b/packages/app-extrinsics/src/InputExtrinsic/options.js @@ -4,33 +4,40 @@ // @flow import React from 'react'; - -import extrinsics from '../extrinsics'; +import Dropdown from 'semantic-ui-react/dist/es/modules/Dropdown'; +import extrinsics from '@polkadot/extrinsics-polkadot/src'; const options = { private: [], public: [] }; -extrinsics.sections.forEach(({ description, hasPrivate, hasPublic, methods, name }) => { - const header = { - className: 'ui--InputExtrinsic-Header', - disabled: true, - text: description, - value: name - }; +const sortByName = (a, b) => + a.name.localeCompare(b.name); - hasPublic && options.public.push(header); - hasPrivate && options.private.push(header); +const addHeader = (shouldAdd, to, description) => { + if (shouldAdd) { + to.push(); + to.push( + + {description} + + ); + } +}; - methods.forEach(({ description, name, params, isPrivate }) => { +extrinsics.sections.sort(sortByName).forEach(({ description, hasPrivate, hasPublic, methods, name }) => { + addHeader(hasPublic, options.public, description); + addHeader(hasPrivate, options.private, description); + + methods.sort(sortByName).forEach(({ description, name, params, isPrivate }) => { const inputs = params.map(({ name }) => name).join(', '); options[isPrivate ? 'private' : 'public'].push({ className: 'ui--InputExtrinsic-Item', text: [
- {description} + {description || name}
,
{name}({inputs}) diff --git a/packages/app-extrinsics/src/Params/Account.js b/packages/app-extrinsics/src/Params/Account.js index 8c309a4f0d..2aaa680a41 100644 --- a/packages/app-extrinsics/src/Params/Account.js +++ b/packages/app-extrinsics/src/Params/Account.js @@ -10,18 +10,19 @@ import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import BaseAccount from '../Account'; -export default function Account ({ label, subject }: Props): React$Node { +export default function Account ({ isError, label, subject }: Props): React$Node { const account: rxjs$BehaviorSubject = new BehaviorSubject(new Uint8Array([])); - account.subscribe((value: Uint8Array) => { + account.subscribe((value: Uint8Array) => subject.next({ isValid: !!(value && value.length), value - }); - }); + }) + ); return ( diff --git a/packages/app-extrinsics/src/Params/Amount.js b/packages/app-extrinsics/src/Params/Amount.js index 4160309f98..4bb8199ca9 100644 --- a/packages/app-extrinsics/src/Params/Amount.js +++ b/packages/app-extrinsics/src/Params/Amount.js @@ -11,17 +11,16 @@ import Input from 'semantic-ui-react/dist/es/elements/Input'; import Base from './Base'; -export default function Amount ({ label, subject, t, value: { options: { initValue = 0, maxValue, minValue = 0 } = {} }, type }: Props): React$Node { +export default function Amount ({ isError, label, subject, t, value: { options: { initValue = 0, maxValue, minValue = 0 } = {} } }: Props): React$Node { // flowlint-next-line sketchy-null-mixed:off, sketchy-null-number:off const defaultValue = initValue || minValue; // eslint-disable-next-line no-unused-vars - const onChange = (event: SyntheticEvent<*>, { value }): void => { + const onChange = (event: SyntheticEvent<*>, { value }) => subject.next({ isValid: true, // flowlint-next-line sketchy-null-mixed:off, sketchy-null-number:off value: new BN(value || minValue || 0) }); - }; return ( , { value }) => + subject.next({ + isValid: true, + value + }); + + return ( + + + + ); +} diff --git a/packages/app-extrinsics/src/Params/Hash.js b/packages/app-extrinsics/src/Params/Hash.js new file mode 100644 index 0000000000..bc52a54fd1 --- /dev/null +++ b/packages/app-extrinsics/src/Params/Hash.js @@ -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 { Props } from './types'; + +import React from 'react'; +import Input from 'semantic-ui-react/dist/es/elements/Input'; +import hexToU8a from '@polkadot/util/hex/toU8a'; + +import Base from './Base'; + +export default function Hash ({ isError, label, subject, t }: Props): React$Node { + // eslint-disable-next-line no-unused-vars + const onChange = (event: SyntheticEvent<*>, { value }) => { + const u8a = hexToU8a(value); + + subject.next({ + isValid: u8a.length === 32, + value: u8a + }); + }; + + return ( + + + + ); +} diff --git a/packages/app-extrinsics/src/Params/Param.js b/packages/app-extrinsics/src/Params/Param.js index d4ea2225a5..4bd4d75d46 100644 --- a/packages/app-extrinsics/src/Params/Param.js +++ b/packages/app-extrinsics/src/Params/Param.js @@ -3,33 +3,24 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { BaseProps } from './types'; +import type { Extrinsic$Param } from '@polkadot/extrinsics/types'; +import type { BareProps, RawParam } from '../types'; import React from 'react'; -import Account from './Account'; -import Amount from './Amount'; -import Proposal from './Proposal'; -import Unknown from './Unknown'; +import findComponent from './findComponent'; +import typeToText from './typeToText'; -type Props = BaseProps & { - label?: string; +type Props = BareProps & { + label?: string, + subject: rxjs$BehaviorSubject, + value: Extrinsic$Param } -const Components = { - 'AccountId': Account, - 'Balance': Amount, - 'BlockNumber': Amount, - 'Bytes': Unknown, - 'Proposal': Proposal, - 'u32': Amount, - 'u64': Amount -}; - export default function Param ({ className, label, style, subject, value }: Props): React$Node { // flowlint-next-line sketchy-null-string:off - const defaultLabel = label || `${value.name}: ${value.type}`; - const Component = Components[value.type]; + const defaultLabel = label || `${value.name}: ${typeToText(value.type)}`; + const Component = findComponent(value.type); return ( = new BehaviorSubject(({ isValid: false }: $Shape)); - extrinsic.subscribe(({ data, isValid }: EncodedParams) => { + extrinsic.subscribe(({ data, isValid }: EncodedParams) => subject.next({ isValid, value: data - }); - }); + }) + ); return ( -
+
{t('param.unknown', { - defaultValue: `ERROR: Unknown input of type '{{type}}' found. No renderer exists`, + defaultValue: `ERROR: Unimplemented type '{{type}}' requested. No renderer exists`, replace: { - type + type: typeToText(type) } })}
diff --git a/packages/app-extrinsics/src/Params/VoteThreshold.js b/packages/app-extrinsics/src/Params/VoteThreshold.js new file mode 100644 index 0000000000..70e8c0b82b --- /dev/null +++ b/packages/app-extrinsics/src/Params/VoteThreshold.js @@ -0,0 +1,39 @@ +// 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 { Props } from './types'; + +import React from 'react'; +import Dropdown from 'semantic-ui-react/dist/es/modules/Dropdown'; + +import Base from './Base'; + +const options = [ + { text: 'Super majority approval', value: 0 }, + { text: 'Super majority rejection', value: 1 }, + { text: 'Simple majority', value: 2 } +]; + +export default function VoteThreshold ({ label, subject, t, value: { options: { initValue = 0 } = {} } }: Props): React$Node { + const onChange = (event: SyntheticEvent<*>, { value }) => + subject.next({ + isValid: true, + value + }); + + return ( + + + + ); +} diff --git a/packages/app-extrinsics/src/Params/findComponent.js b/packages/app-extrinsics/src/Params/findComponent.js new file mode 100644 index 0000000000..773a3a0f3c --- /dev/null +++ b/packages/app-extrinsics/src/Params/findComponent.js @@ -0,0 +1,40 @@ +// 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 { Extrinsic$Type } from '@polkadot/extrinsics/types'; + +import Account from './Account'; +import Amount from './Amount'; +import Bool from './Bool'; +import Hash from './Hash'; +import Proposal from './Proposal'; +import Unknown from './Unknown'; +import VoteThreshold from './VoteThreshold'; + +const Components = { + 'AccountId': Account, + 'Balance': Amount, + 'BlockNumber': Amount, + 'bool': Bool, + 'Bytes': Unknown, + 'Hash': Hash, + 'MisbehaviorReport': Unknown, + 'Proposal': Proposal, + 'SessionKey': Unknown, + 'u32': Amount, + 'u64': Amount, + 'VoteThreshold': VoteThreshold +}; + +export default function findComponent (type: Extrinsic$Type): React$ComponentType<*> { + if (Array.isArray(type)) { + // eslint-disable-next-line no-unused-vars + const [outer, inner] = type; + + return findComponent(inner); + } + + return Components[type]; +} diff --git a/packages/app-extrinsics/src/Params/index.js b/packages/app-extrinsics/src/Params/index.js index a21cebe1c8..12dd1a207e 100644 --- a/packages/app-extrinsics/src/Params/index.js +++ b/packages/app-extrinsics/src/Params/index.js @@ -3,24 +3,30 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Extrinsic } from '../extrinsics/types'; +import type { Extrinsic } from '@polkadot/extrinsics/types'; import type { BaseProps, RawParam } from '../types'; import './Params.css'; import React from 'react'; -import Label from 'semantic-ui-react/dist/es/elements/Label'; +// import Label from 'semantic-ui-react/dist/es/elements/Label'; +// import translate from '../translate'; import Param from './Param'; import createSubscriber from './subscriber'; +import typeToText from './typeToText'; type Props = BaseProps & { subject: rxjs$BehaviorSubject>, value: Extrinsic; }; -function Params ({ className, style, subject, t, value: { name, params } }: Props): React$Node { +function Params ({ className, style, subject, value: { name, params } }: Props): React$Node { if (!params || !params.length) { return null; } @@ -33,18 +39,13 @@ function Params ({ className, style, subject, t, value: { name, params } }: Prop style={style} >
-
- {params.map((param, index) => ( + {params.map((value, index) => ( ))}
diff --git a/packages/app-extrinsics/src/Params/initValue.js b/packages/app-extrinsics/src/Params/initValue.js index 903f3557de..1410c5ac2a 100644 --- a/packages/app-extrinsics/src/Params/initValue.js +++ b/packages/app-extrinsics/src/Params/initValue.js @@ -2,24 +2,27 @@ // This software may be modified and distributed under the terms // of the ISC license. See the LICENSE file for details. // @flow +// flowlint sketchy-null-mixed:off -import type { Extrinsic$Param } from '../extrinsics/types'; +import type { Extrinsic$Param } from '@polkadot/extrinsics/types'; import BN from 'bn.js'; export default function getInitValue ({ options: { initValue, minValue } = {}, type }: Extrinsic$Param): mixed { - // flowlint-next-line sketchy-null-mixed:off - const defaultValue = initValue || minValue; - switch (type) { case 'Balance': case 'BlockNumber': case 'u32': case 'u64': - // flowlint-next-line sketchy-null-mixed:off - return new BN(defaultValue || 0); + return new BN(initValue || minValue || 0); + + case 'bool': + return initValue || false; + + case 'VoteThreshold': + return initValue || 0; default: - return defaultValue; + return initValue; } } diff --git a/packages/app-extrinsics/src/Params/subjects.js b/packages/app-extrinsics/src/Params/subjects.js index 53ed8f0900..1c4e7df61a 100644 --- a/packages/app-extrinsics/src/Params/subjects.js +++ b/packages/app-extrinsics/src/Params/subjects.js @@ -3,7 +3,7 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Extrinsic$Params } from '../extrinsics/types'; +import type { Extrinsic$Params } from '@polkadot/extrinsics/types'; import type { RawParam } from '../types'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; diff --git a/packages/app-extrinsics/src/Params/subscriber.js b/packages/app-extrinsics/src/Params/subscriber.js index bb05f5d864..670c73b95a 100644 --- a/packages/app-extrinsics/src/Params/subscriber.js +++ b/packages/app-extrinsics/src/Params/subscriber.js @@ -3,7 +3,7 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Extrinsic$Params } from '../extrinsics/types'; +import type { Extrinsic$Params } from '@polkadot/extrinsics/types'; import type { RawParam } from '../types'; import createSubjects from './subjects'; diff --git a/packages/app-extrinsics/src/Params/typeToText.js b/packages/app-extrinsics/src/Params/typeToText.js new file mode 100644 index 0000000000..4349fbe948 --- /dev/null +++ b/packages/app-extrinsics/src/Params/typeToText.js @@ -0,0 +1,16 @@ +// 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 { Extrinsic$Type } from '@polkadot/extrinsics/types'; + +export default function typeToText (type: Extrinsic$Type): string { + if (Array.isArray(type)) { + const [outer, inner] = type; + + return `${outer}<${inner}>`; + } + + return type; +} diff --git a/packages/app-extrinsics/src/Params/types.js b/packages/app-extrinsics/src/Params/types.js index 9a74727a47..1e6cf4f283 100644 --- a/packages/app-extrinsics/src/Params/types.js +++ b/packages/app-extrinsics/src/Params/types.js @@ -3,7 +3,7 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Extrinsic$Param } from '../extrinsics/types'; +import type { Extrinsic$Param } from '@polkadot/extrinsics/types'; import type { BareProps, RawParam } from '../types'; export type BaseProps = BareProps & { @@ -12,5 +12,6 @@ export type BaseProps = BareProps & { }; export type Props = BaseProps & { + isError?: boolean, label: string }; diff --git a/packages/app-extrinsics/src/Signer/sign.js b/packages/app-extrinsics/src/Signer/sign.js deleted file mode 100644 index 0f1fbc5f00..0000000000 --- a/packages/app-extrinsics/src/Signer/sign.js +++ /dev/null @@ -1,21 +0,0 @@ -// 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 - -// TODO: Move to portal - -import type { KeyringPair } from '@polkadot/util-keyring/types'; - -const assert = require('@polkadot/util/assert'); -const u8aConcat = require('@polkadot/util/u8a/concat'); - -module.exports = function sign (sender?: ?KeyringPair, message: Uint8Array): Uint8Array { - assert(sender, 'Expected a valid sender to sign'); - - return u8aConcat( - message, - // $FlowFixMe sender has an actual value - sender.sign(message) - ); -}; diff --git a/packages/app-extrinsics/src/Signer/submit.js b/packages/app-extrinsics/src/Signer/submit.js index d36ff91fde..ee7ef59cb9 100644 --- a/packages/app-extrinsics/src/Signer/submit.js +++ b/packages/app-extrinsics/src/Signer/submit.js @@ -6,19 +6,21 @@ import type { RxApiInterface } from '@polkadot/rx-api/types'; import type { QueueTx } from '../types'; -import encodeCall from '../encode/call'; +import encodeCall from '@polkadot/extrinsics-codec/src/encode/call'; +import u8aConcat from '@polkadot/util/u8a/concat'; +import u8aToHex from '@polkadot/util/u8a/toHex'; + import keyring from '../keyring'; -import sign from './sign'; - export default function submit (api: RxApiInterface, tx: QueueTx, subject: rxjs$BehaviorSubject): Promise { + const message = encodeCall(tx.publicKey, tx.index, tx.data); + const signature = keyring.getPair(tx.publicKey).sign(message); + + console.log('submitExtrinsic: message =', u8aToHex(message)); + console.log('submitExtrinsic: signature =', u8aToHex(signature)); + return api.author - .submitExtrinsic( - sign( - keyring.getPair(tx.publicKey), - encodeCall(tx.publicKey, tx.index, tx.data) - ) - ) + .submitExtrinsic(u8aConcat(message, signature)) .toPromise() .then((result) => { console.log('submitExtrinsic: result=', result); diff --git a/packages/app-extrinsics/src/Submission/index.js b/packages/app-extrinsics/src/Submission/index.js index bbd67f2afa..d787f89b56 100644 --- a/packages/app-extrinsics/src/Submission/index.js +++ b/packages/app-extrinsics/src/Submission/index.js @@ -36,6 +36,12 @@ function Submission ({ className, subject, style, t }: Props): React$Node { })} subject={subjects.sender} /> + -
diff --git a/packages/app-extrinsics/src/Submission/subjects.js b/packages/app-extrinsics/src/Submission/subjects.js index 4f091cffc8..2bd207ee35 100644 --- a/packages/app-extrinsics/src/Submission/subjects.js +++ b/packages/app-extrinsics/src/Submission/subjects.js @@ -18,8 +18,12 @@ type Subjects = { export default function createSubjects (): Subjects { const subjects = { index: new BehaviorSubject(new BN(0)), - call: new BehaviorSubject(({ isValid: false }: $Shape)), - method: new BehaviorSubject(({ isValid: false }: $Shape)), + call: new BehaviorSubject(({ + isValid: false + }: $Shape)), + method: new BehaviorSubject(({ + isValid: false + }: $Shape)), sender: new BehaviorSubject(new Uint8Array([])) }; diff --git a/packages/app-extrinsics/src/encode/param.js b/packages/app-extrinsics/src/encode/param.js deleted file mode 100644 index c321f643c6..0000000000 --- a/packages/app-extrinsics/src/encode/param.js +++ /dev/null @@ -1,34 +0,0 @@ -// 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 { Extrinsic$Param } from '../extrinsics/types'; - -const bnToU8a = require('@polkadot/util/bn/toU8a'); -const u8aToU8a = require('@polkadot/util/u8a/toU8a'); - -// flowlint-next-line unclear-type:off -module.exports = function encodeValue ({ type }: Extrinsic$Param, value: any): Uint8Array { - switch (type) { - case 'AccountId': - return value; - - case 'Balance': - case 'BlockNumber': - case 'u64': - return bnToU8a(value, 64, true); - - case 'Bytes': - return u8aToU8a(value); - - case 'Proposal': - return u8aToU8a(value); - - case 'u32': - return bnToU8a(value, 32, true); - - default: - throw new Error(`Unable to encode value with type '${type}'`); - } -}; diff --git a/packages/app-extrinsics/src/extrinsics/consensus.js b/packages/app-extrinsics/src/extrinsics/consensus.js deleted file mode 100644 index 098796c014..0000000000 --- a/packages/app-extrinsics/src/extrinsics/consensus.js +++ /dev/null @@ -1,14 +0,0 @@ -// 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 { ExtrinsicsBasic } from './types'; - -module.exports = ({ - description: 'Consensus', - methods: { - public: [], - private: [] - } -}: ExtrinsicsBasic); diff --git a/packages/app-extrinsics/src/extrinsics/council.js b/packages/app-extrinsics/src/extrinsics/council.js deleted file mode 100644 index 6ddcff378c..0000000000 --- a/packages/app-extrinsics/src/extrinsics/council.js +++ /dev/null @@ -1,14 +0,0 @@ -// 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 { ExtrinsicsBasic } from './types'; - -module.exports = ({ - description: 'Council', - methods: { - public: [], - private: [] - } -}: ExtrinsicsBasic); diff --git a/packages/app-extrinsics/src/extrinsics/councilVoting.js b/packages/app-extrinsics/src/extrinsics/councilVoting.js deleted file mode 100644 index ef7075dac0..0000000000 --- a/packages/app-extrinsics/src/extrinsics/councilVoting.js +++ /dev/null @@ -1,14 +0,0 @@ -// 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 { ExtrinsicsBasic } from './types'; - -module.exports = ({ - description: 'Council Voting', - methods: { - public: [], - private: [] - } -}: ExtrinsicsBasic); diff --git a/packages/app-extrinsics/src/extrinsics/democracy.js b/packages/app-extrinsics/src/extrinsics/democracy.js deleted file mode 100644 index 8e18561f7b..0000000000 --- a/packages/app-extrinsics/src/extrinsics/democracy.js +++ /dev/null @@ -1,24 +0,0 @@ -// 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 { ExtrinsicsBasic } from './types'; - -module.exports = ({ - description: 'Democracy', - methods: { - public: [ - { - description: 'Propose', - index: 0, - name: 'propose', - params: [ - { name: 'proposal', type: 'Proposal' }, - { name: 'value', type: 'Balance' } - ] - } - ], - private: [] - } -}: ExtrinsicsBasic); diff --git a/packages/app-extrinsics/src/extrinsics/index.js b/packages/app-extrinsics/src/extrinsics/index.js deleted file mode 100644 index fa3ac26a60..0000000000 --- a/packages/app-extrinsics/src/extrinsics/index.js +++ /dev/null @@ -1,82 +0,0 @@ -// 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 - -// TODO: Move to API - -import type { Extrinsic, Extrinsics, ExtrinsicBasic, ExtrinsicsBasic, ExtrinsicsMap, ExtrinsicSection } from './types'; - -const assert = require('@polkadot/util/assert'); -const bnToU8a = require('@polkadot/util/bn/toU8a'); -const u8aConcat = require('@polkadot/util/u8a/concat'); - -const consensus = require('./consensus'); -const council = require('./council'); -const councilVoting = require('./councilVoting'); -const democracy = require('./democracy'); -const session = require('./session'); -const staking = require('./staking'); - -const map: { [string]: ExtrinsicsBasic } = { - consensus, // 0 - session, // 1 - staking, // 2 - democracy, // 3 - council, // 4 - councilVoting // 5 -}; -const extrinsicsMap: ExtrinsicsMap = {}; -const extrinsics: Extrinsics = { - sections: [], - get: (method: string): Extrinsic => { - const extrinsic = extrinsicsMap[method]; - - assert(extrinsic, `Unable to retrieve extrinsic with name '${method}'`); - - return extrinsic; - } -}; - -const sectionNames = Object.keys(map); - -function mapMethods (sectionSource: ExtrinsicsBasic, section: ExtrinsicSection, isPrivate: boolean): void { - const methods = sectionSource.methods[isPrivate ? 'private' : 'public']; - - methods.forEach(({ description, index, name, params }: ExtrinsicBasic) => { - const method: Extrinsic = { - description, - index: u8aConcat(section.index, bnToU8a(index, 8)), - isPrivate, - name: `${section.name}_${name}`, - params - }; - - extrinsicsMap[method.name] = method; - section[isPrivate ? 'hasPrivate' : 'hasPublic'] = true; - - section.methods.push(method); - }); -} - -sectionNames.reduce((sections: Array, sectionName: string, index: number) => { - const sectionSource = map[sectionName]; - - const section: ExtrinsicSection = { - description: sectionSource.description, - hasPrivate: false, - hasPublic: false, - index: bnToU8a(index, 8), - methods: [], - name: sectionName - }; - - mapMethods(sectionSource, section, true); - mapMethods(sectionSource, section, false); - - sections.push(section); - - return sections; -}, extrinsics.sections); - -module.exports = extrinsics; diff --git a/packages/app-extrinsics/src/extrinsics/staking.js b/packages/app-extrinsics/src/extrinsics/staking.js deleted file mode 100644 index 6f0f794ffb..0000000000 --- a/packages/app-extrinsics/src/extrinsics/staking.js +++ /dev/null @@ -1,67 +0,0 @@ -// 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 { ExtrinsicsBasic } from './types'; - -module.exports = ({ - description: 'Staking', - methods: { - public: [ - { - description: 'Transfer', - index: 0, - name: 'transfer', - params: [ - { name: 'recipient', type: 'AccountId' }, - { name: 'value', type: 'Balance', options: { minValue: 1 } } - ] - }, - { - description: 'Stake', - index: 1, - name: 'stake', - params: [] - }, - { - description: 'Unstake', - index: 2, - name: 'unstake', - params: [] - } - ], - private: [ - { - description: 'Set sessions per era', - index: 0, - name: 'setSessionsPerEra', - params: [ - { name: 'sessions', type: 'u64' } - ] - }, - { - description: 'Set bonding duration', - index: 1, - name: 'setBondingDuration', - params: [ - { name: 'duration', type: 'u64' } - ] - }, - { - description: 'Set validator count', - index: 2, - name: 'setValidatorCount', - params: [ - { name: 'count', type: 'u32' } - ] - }, - { - description: 'Force new era', - index: 3, - name: 'forceNewEra', - params: [] - } - ] - } -}: ExtrinsicsBasic); diff --git a/packages/app-extrinsics/src/types.js b/packages/app-extrinsics/src/types.js index efb47e35df..2693c0dc47 100644 --- a/packages/app-extrinsics/src/types.js +++ b/packages/app-extrinsics/src/types.js @@ -4,7 +4,7 @@ // @flow import type BN from 'bn.js'; -import type { Extrinsic } from './extrinsics/types'; +import type { Extrinsic } from '@polkadot/extrinsics/types'; export type BareProps = { className?: string, diff --git a/packages/portal/.env b/packages/apps/.env similarity index 100% rename from packages/portal/.env rename to packages/apps/.env diff --git a/packages/portal/LICENSE b/packages/apps/LICENSE similarity index 100% rename from packages/portal/LICENSE rename to packages/apps/LICENSE diff --git a/packages/portal/README.md b/packages/apps/README.md similarity index 100% rename from packages/portal/README.md rename to packages/apps/README.md diff --git a/packages/portal/package.json b/packages/apps/package.json similarity index 81% rename from packages/portal/package.json rename to packages/apps/package.json index 4c900173c1..68bdd42a6d 100644 --- a/packages/portal/package.json +++ b/packages/apps/package.json @@ -1,8 +1,8 @@ { - "name": "@polkadot/portal", + "name": "@polkadot/apps", "version": "0.1.3", - "description": "A Portal into the Polkadot network", - "main": "src/index.js", + "description": "An Apps portal into the Polkadot network", + "main": "index.js", "homepage": ".", "repository": "https://github.com/polkadot-js/portal.git", "author": "Jaco Greeff ", @@ -16,8 +16,8 @@ "devDependencies": { "@polkadot/app-explorer": "^0.1.3", "@polkadot/app-extrinsics": "^0.1.3", - "@polkadot/rx-react": "^0.4.6", - "@polkadot/ui-react": "^0.9.11", + "@polkadot/rx-react": "^0.4.7", + "@polkadot/ui-react": "^0.9.12", "i18next": "^11.1.1", "i18next-browser-languagedetector": "^2.2.0", "i18next-xhr-backend": "^1.5.1", diff --git a/packages/apps/public/favicon.ico b/packages/apps/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec3c167a5bf8b409f54ee4dfbce5dc84b70bcfc0 GIT binary patch literal 38078 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 - Polkadot Portal + Polkadot Apps Portal