From 7c1ff045001886794f891bf3f595e34a5bd3ea3d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 2 Oct 2019 14:24:02 +0200 Subject: [PATCH] Add insert key functionality (#1683) --- .../src/Actions/Account/InjectKeys.tsx | 138 ++++++++++++++++++ .../app-staking/src/Actions/Account/index.tsx | 23 ++- .../react-components/src/Status/index.tsx | 9 +- packages/react-components/src/styles/index.ts | 5 + packages/react-signer/src/Modal.tsx | 2 + 5 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 packages/app-staking/src/Actions/Account/InjectKeys.tsx diff --git a/packages/app-staking/src/Actions/Account/InjectKeys.tsx b/packages/app-staking/src/Actions/Account/InjectKeys.tsx new file mode 100644 index 0000000000..e3386b3fe5 --- /dev/null +++ b/packages/app-staking/src/Actions/Account/InjectKeys.tsx @@ -0,0 +1,138 @@ +// Copyright 2017-2019 @polkadot/app-staking 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 { I18nProps } from '@polkadot/react-components/types'; +import { KeypairType } from '@polkadot/util-crypto/types'; + +import React, { useContext, useEffect, useState } from 'react'; +import { Button, Dropdown, Icon, Input, Modal } from '@polkadot/react-components'; +import { QueueContext } from '@polkadot/react-components/Status'; +import keyring from '@polkadot/ui-keyring'; +import { assert, u8aToHex } from '@polkadot/util'; +import { keyExtractSuri, mnemonicValidate } from '@polkadot/util-crypto'; + +import translate from '../../translate'; + +interface Props extends I18nProps { + isOpen?: boolean; + onClose: () => void; +} + +const CRYPTO_MAP: Record = { + aura: ['ed25519', 'sr25519'], + babe: ['sr25519'], + gran: ['ed25519'], + imon: ['ed25519', 'sr25519'], + para: ['sr25519'] +}; + +const EMPTY_KEY = '0x'; + +function InjectKeys ({ isOpen = true, onClose, t }: Props): React.ReactElement | null { + const { queueRpc } = useContext(QueueContext); + // this needs to align with what is set as the first value in `type` + const [crypto, setCrypto] = useState('sr25519'); + const [publicKey, setPublicKey] = useState(EMPTY_KEY); + const [suri, setSuri] = useState(''); + const [type, setType] = useState('babe'); + + useEffect((): void => { + setCrypto(CRYPTO_MAP[type][0]); + }, [type]); + + useEffect((): void => { + try { + const { phrase } = keyExtractSuri(suri); + + assert(mnemonicValidate(phrase), 'Invalid mnemonic phrase'); + + setPublicKey(u8aToHex(keyring.createFromUri(suri, {}, crypto).publicKey)); + } catch (error) { + setPublicKey(EMPTY_KEY); + } + }, [crypto, suri]); + + if (!isOpen) { + return null; + } + + const _onSubmit = (): void => { + queueRpc({ + rpc: { section: 'author', method: 'insertKey' } as any, + values: [type, suri, publicKey] + }); + }; + const _cryptoOptions = CRYPTO_MAP[type].map((value): { text: string; value: KeypairType } => ({ + text: value === 'ed25519' + ? t('ed25519, Edwards') + : t('sr15519, Schnorrkel'), + value + })); + + return ( + + + {t('Inject Keys')} + + + + + + +
+
{t('This operation will submit the seed via an RPC call. Do not perform this operation on a public RPC node, but ensure that the node is local, connected to your validator and secure.')}
+
+
+ + +