diff --git a/packages/extension-base/src/background/handlers/Tabs.ts b/packages/extension-base/src/background/handlers/Tabs.ts index b6f2ec9f..590cd4ef 100644 --- a/packages/extension-base/src/background/handlers/Tabs.ts +++ b/packages/extension-base/src/background/handlers/Tabs.ts @@ -9,6 +9,7 @@ import type { SubjectInfo } from '@polkadot/ui-keyring/observable/types'; import type { MessageTypes, RequestAccountList, RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestTypes, ResponseRpcListProviders, ResponseSigning, ResponseTypes, SubscriptionMessageTypes } from '../types'; import { PHISHING_PAGE_REDIRECT } from '@polkadot/extension-base/defaults'; +import { canDerive } from '@polkadot/extension-base/utils'; import { checkIfDenied } from '@polkadot/phishing'; import keyring from '@polkadot/ui-keyring'; import { accounts as accountsObservable } from '@polkadot/ui-keyring/observable/accounts'; @@ -23,7 +24,7 @@ function transformAccounts (accounts: SubjectInfo, anyType = false): InjectedAcc return Object .values(accounts) .filter(({ json: { meta: { isHidden } } }) => !isHidden) - .filter(({ type }) => anyType ? true : type && ['ed25519', 'sr25519', 'ecdsa'].includes(type)) + .filter(({ type }) => anyType ? true : canDerive(type)) .sort((a, b) => (a.json.meta.whenCreated || 0) - (b.json.meta.whenCreated || 0)) .map(({ json: { address, meta: { genesisHash, name } }, type }): InjectedAccount => ({ address, diff --git a/packages/extension-base/src/utils/canDerive.ts b/packages/extension-base/src/utils/canDerive.ts new file mode 100644 index 00000000..f0380a30 --- /dev/null +++ b/packages/extension-base/src/utils/canDerive.ts @@ -0,0 +1,8 @@ +// Copyright 2019-2020 @polkadot/extension authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import type { KeypairType } from '@polkadot/util-crypto/types'; + +export default function canDerive (type?: KeypairType): boolean { + return !!type && ['ed25519', 'sr25519', 'ecdsa'].includes(type); +} diff --git a/packages/extension-base/src/utils/index.ts b/packages/extension-base/src/utils/index.ts new file mode 100644 index 00000000..b20e316e --- /dev/null +++ b/packages/extension-base/src/utils/index.ts @@ -0,0 +1,4 @@ +// Copyright 2019-2020 @polkadot/extension authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export { default as canDerive } from './canDerive'; diff --git a/packages/extension-ui/src/Popup/Accounts/Account.test.tsx b/packages/extension-ui/src/Popup/Accounts/Account.test.tsx index 3167d966..830adf42 100644 --- a/packages/extension-ui/src/Popup/Accounts/Account.test.tsx +++ b/packages/extension-ui/src/Popup/Accounts/Account.test.tsx @@ -30,7 +30,7 @@ describe('Account component', () => { ); it('shows Export option if account is not external', () => { - wrapper = mountAccountComponent({ isExternal: false }); + wrapper = mountAccountComponent({ isExternal: false, type: 'ed25519' }); wrapper.find('.settings').first().simulate('click'); expect(wrapper.find('a.menuItem').length).toBe(4); @@ -41,11 +41,21 @@ describe('Account component', () => { }); it('does not show Export option if account is external', () => { - wrapper = mountAccountComponent({ isExternal: true }); + wrapper = mountAccountComponent({ isExternal: true, type: 'ed25519' }); wrapper.find('.settings').first().simulate('click'); expect(wrapper.find('a.menuItem').length).toBe(2); expect(wrapper.find('a.menuItem').at(0).text()).toBe('Rename'); expect(wrapper.find('a.menuItem').at(1).text()).toBe('Forget Account'); }); + + it('does not show Derive option if account is of ethereum type', () => { + wrapper = mountAccountComponent({ isExternal: false, type: 'ethereum' }); + wrapper.find('.settings').first().simulate('click'); + + expect(wrapper.find('a.menuItem').length).toBe(3); + expect(wrapper.find('a.menuItem').at(0).text()).toBe('Rename'); + expect(wrapper.find('a.menuItem').at(1).text()).toBe('Export Account'); + expect(wrapper.find('a.menuItem').at(2).text()).toBe('Forget Account'); + }); }); diff --git a/packages/extension-ui/src/Popup/Accounts/Account.tsx b/packages/extension-ui/src/Popup/Accounts/Account.tsx index 30a8d798..ae357147 100644 --- a/packages/extension-ui/src/Popup/Accounts/Account.tsx +++ b/packages/extension-ui/src/Popup/Accounts/Account.tsx @@ -6,6 +6,7 @@ import type { AccountJson } from '@polkadot/extension-base/background/types'; import React, { useCallback, useContext, useMemo, useState } from 'react'; import styled from 'styled-components'; +import { canDerive } from '@polkadot/extension-base/utils'; import genesisOptions from '@polkadot/extension-chains/genesisHashes'; import { ActionContext, Address, Dropdown, Link, MenuDivider } from '../../components'; @@ -62,7 +63,7 @@ function Account ({ address, className, genesisHash, isExternal, isHidden, paren > {t('Rename')} - {!isExternal && type !== 'ethereum' && ( + {!isExternal && canDerive(type) && ( { const mountComponent = async (locked = false): Promise<{ diff --git a/packages/extension-ui/src/Popup/Derive/SelectParent.tsx b/packages/extension-ui/src/Popup/Derive/SelectParent.tsx index f87e7055..6d282866 100644 --- a/packages/extension-ui/src/Popup/Derive/SelectParent.tsx +++ b/packages/extension-ui/src/Popup/Derive/SelectParent.tsx @@ -6,6 +6,7 @@ import type { ThemeProps } from '../../types'; import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import styled from 'styled-components'; +import { canDerive } from '@polkadot/extension-base/utils'; import { assert } from '@polkadot/util'; import { AccountContext, ActionContext, Address, ButtonArea, Checkbox, InputWithLabel, Label, NextStepButton, VerticalSpace, Warning } from '../../components'; @@ -38,6 +39,7 @@ function SelectParent ({ className, isLocked, onDerivationConfirmed, parentAddre const allAddresses = useMemo( () => hierarchy .filter(({ isExternal }) => !isExternal) + .filter(({ type }) => canDerive(type)) .map(({ address, genesisHash }): [string, string | null] => [address, genesisHash || null]), [hierarchy] ); diff --git a/packages/extension-ui/src/Popup/index.tsx b/packages/extension-ui/src/Popup/index.tsx index 79920458..210df666 100644 --- a/packages/extension-ui/src/Popup/index.tsx +++ b/packages/extension-ui/src/Popup/index.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useState } from 'react'; import { Route, Switch } from 'react-router'; import { PHISHING_PAGE_REDIRECT } from '@polkadot/extension-base/defaults'; +import { canDerive } from '@polkadot/extension-base/utils'; import uiSettings from '@polkadot/ui-settings'; import { ErrorBoundary, Loading } from '../components'; @@ -51,7 +52,7 @@ async function requestMediaAccess (cameraOn: boolean): Promise { function initAccountContext (accounts: AccountJson[]): AccountsContext { const hierarchy = buildHierarchy(accounts); - const master = hierarchy.find((account) => !account.isExternal); + const master = hierarchy.find(({ isExternal, type }) => !isExternal && canDerive(type)); return { accounts,