Skip to content

feat: account tag enhancement & uppercase for OneKey labels #29999

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 21, 2025
25 changes: 13 additions & 12 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { JsonRpcError, providerErrors, rpcErrors } from '@metamask/rpc-errors';
import { Mutex } from 'await-semaphore';
import log from 'loglevel';
import {
OneKeyKeyring,
TrezorConnectBridge,
TrezorKeyring,
} from '@metamask/eth-trezor-keyring';
Expand Down Expand Up @@ -426,9 +427,6 @@ const API_TYPE = {
// stream channels
const PHISHING_SAFELIST = 'metamask-phishing-safelist';

// OneKey devices can connect to Metamask using Trezor USB transport. They use a specific device minor version (99) to differentiate between genuine Trezor and OneKey devices.
export const ONE_KEY_VIA_TREZOR_MINOR_VERSION = 99;

const environmentMappingForRemoteFeatureFlag = {
[ENVIRONMENT.DEVELOPMENT]: EnvironmentType.Development,
[ENVIRONMENT.RELEASE_CANDIDATE]: EnvironmentType.ReleaseCandidate,
Expand Down Expand Up @@ -1122,6 +1120,10 @@ export default class MetamaskController extends EventEmitter {
keyring: keyringOverrides?.trezor || TrezorKeyring,
bridge: keyringOverrides?.trezorBridge || TrezorConnectBridge,
},
{
keyring: keyringOverrides?.oneKey || OneKeyKeyring,
bridge: keyringOverrides?.oneKeyBridge || TrezorConnectBridge,
},
{
keyring: keyringOverrides?.ledger || LedgerKeyring,
bridge: keyringOverrides?.ledgerBridge || LedgerIframeBridge,
Expand All @@ -1146,6 +1148,10 @@ export default class MetamaskController extends EventEmitter {
TrezorKeyring,
keyringOverrides?.trezorBridge || TrezorOffscreenBridge,
),
hardwareKeyringBuilderFactory(
OneKeyKeyring,
keyringOverrides?.oneKey || TrezorOffscreenBridge,
),
hardwareKeyringBuilderFactory(
LedgerKeyring,
keyringOverrides?.ledgerBridge || LedgerOffscreenBridge,
Expand Down Expand Up @@ -4908,16 +4914,9 @@ export default class MetamaskController extends EventEmitter {
* @returns {HardwareKeyringType} Keyring hardware type
*/
async getHardwareTypeForMetric(address) {
// The `getKeyringForAccount` is now deprecated, so we just use `withKeyring` instead to access our keyring.
return await this.keyringController.withKeyring(
{ address },
({ keyring }) => {
const { type: keyringType, bridge: keyringBridge } = keyring;
// Specific case for OneKey devices, see `ONE_KEY_VIA_TREZOR_MINOR_VERSION` for further details.
return keyringBridge?.minorVersion === ONE_KEY_VIA_TREZOR_MINOR_VERSION
? HardwareKeyringType.oneKey
: HardwareKeyringType[keyringType];
},
({ keyring }) => HardwareKeyringType[keyring.type],
);
}

Expand Down Expand Up @@ -8005,9 +8004,11 @@ export default class MetamaskController extends EventEmitter {
let keyringType = null;
switch (options.name) {
case HardwareDeviceNames.trezor:
case HardwareDeviceNames.oneKey:
keyringType = keyringOverrides?.trezor?.type || TrezorKeyring.type;
break;
case HardwareDeviceNames.oneKey:
keyringType = keyringOverrides?.oneKey?.type || OneKeyKeyring?.type;
break;
case HardwareDeviceNames.ledger:
keyringType = keyringOverrides?.ledger?.type || LedgerKeyring.type;
break;
Expand Down
24 changes: 2 additions & 22 deletions app/scripts/metamask-controller.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ import {
} from '../../shared/constants/permissions';
import { deferredPromise } from './lib/util';
import { METAMASK_COOKIE_HANDLER } from './constants/stream';
import MetaMaskController, {
ONE_KEY_VIA_TREZOR_MINOR_VERSION,
} from './metamask-controller';
import MetaMaskController from './metamask-controller';
import { PermissionNames } from './controllers/permissions';

const { Ganache } = require('../../test/e2e/seeder/ganache');
Expand Down Expand Up @@ -1913,7 +1911,7 @@ describe('MetaMaskController', () => {
});

describe('getHardwareTypeForMetric', () => {
it.each(['ledger', 'lattice', 'trezor', 'qr'])(
it.each(['ledger', 'lattice', 'trezor', 'oneKey', 'qr'])(
'should return the correct type for %s',
async (type) => {
jest
Expand All @@ -1927,24 +1925,6 @@ describe('MetaMaskController', () => {
expect(result).toBe(HardwareKeyringType[type]);
},
);

it('should handle special case for oneKey', async () => {
jest
.spyOn(metamaskController.keyringController, 'withKeyring')
.mockImplementation((_, fn) => {
const keyring = {
type: 'trezor',
bridge: { minorVersion: ONE_KEY_VIA_TREZOR_MINOR_VERSION },
};
return fn({ keyring });
});

const result = await metamaskController.getHardwareTypeForMetric(
'0x123',
);

expect(result).toBe('OneKey Hardware');
});
});

describe('forgetDevice', () => {
Expand Down
3 changes: 2 additions & 1 deletion shared/constants/hardware-wallets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ export enum HardwareKeyringType {
export enum HardwareKeyringNames {
ledger = 'Ledger',
trezor = 'Trezor',
oneKey = 'OneKey',
lattice = 'Lattice1',
qr = 'QR',
}

export enum HardwareDeviceNames {
ledger = 'ledger',
trezor = 'trezor',
oneKey = 'onekey',
oneKey = 'oneKey',
lattice = 'lattice',
qr = 'QR Hardware',
}
Expand Down
2 changes: 1 addition & 1 deletion ui/ducks/app/app.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ describe('App State', () => {
it('sets hardware wallet default hd path', () => {
const hdPaths = {
trezor: "m/44'/60'/0'/0",
onekey: "m/44'/60'/0'/0",
oneKey: "m/44'/60'/0'/0",
ledger: "m/44'/60'/0'",
lattice: "m/44'/60'/0'/0",
};
Expand Down
4 changes: 2 additions & 2 deletions ui/ducks/app/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ type AppState = {
buyView: Record<string, any>;
defaultHdPaths: {
trezor: string;
onekey: string;
oneKey: string;
ledger: string;
lattice: string;
};
Expand Down Expand Up @@ -181,7 +181,7 @@ const initialState: AppState = {
buyView: {},
defaultHdPaths: {
trezor: `m/44'/60'/0'/0`,
onekey: `m/44'/60'/0'/0`,
oneKey: `m/44'/60'/0'/0`,
ledger: `m/44'/60'/0'/0/0`,
lattice: `m/44'/60'/0'/0`,
},
Expand Down
2 changes: 2 additions & 0 deletions ui/helpers/utils/accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ export function getAccountLabel(
return HardwareKeyringNames.qr;
case KeyringType.trezor:
return HardwareKeyringNames.trezor;
case KeyringType.oneKey:
return HardwareKeyringNames.oneKey;
case KeyringType.ledger:
return HardwareKeyringNames.ledger;
case KeyringType.lattice:
Expand Down
7 changes: 7 additions & 0 deletions ui/helpers/utils/accounts.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,13 @@ describe('Accounts', () => {
);
});

it('should return the correct label for OneKey hardware wallet', () => {
mockAccount.metadata.keyring.type = KeyringType.oneKey;
expect(getAccountLabel(KeyringType.oneKey, mockAccount)).toBe(
HardwareKeyringNames.oneKey,
);
});

it('should return the correct label for Ledger hardware wallet', () => {
mockAccount.metadata.keyring.type = KeyringType.ledger;
expect(getAccountLabel(KeyringType.ledger, mockAccount)).toBe(
Expand Down
6 changes: 4 additions & 2 deletions ui/pages/create-account/connect-hardware/account-list.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class AccountList extends Component {
<div className="hw-connect__hdPath">
<Dropdown
className="hw-connect__hdPath__select"
options={hdPaths[device.toLowerCase()]}
options={hdPaths[device]}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting device name to lowercase would fail checking hdPaths for device with camel case naming. So far, there's apparently no need to do so for other devices.

selectedOption={pathValue || selectedPath}
onChange={(value) => {
this.setPath(value);
Expand All @@ -73,7 +73,9 @@ class AccountList extends Component {
HardwareDeviceNames.lattice,
HardwareDeviceNames.trezor,
HardwareDeviceNames.oneKey,
].includes(device.toLowerCase());
]
.map((name) => name.toLowerCase())
.includes(device.toLowerCase());
return (
<div className="hw-connect">
<h3 className="hw-connect__unlock-title">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const render = () => {
ledger: LEDGER_HD_PATHS,
lattice: LATTICE_HD_PATHS,
trezor: TREZOR_HD_PATHS,
onekey: TREZOR_HD_PATHS,
oneKey: TREZOR_HD_PATHS,
},
onPathChange: jest.fn(),
onAccountChange: jest.fn(),
Expand Down
2 changes: 1 addition & 1 deletion ui/pages/create-account/connect-hardware/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ const HD_PATHS = {
ledger: LEDGER_HD_PATHS,
lattice: LATTICE_HD_PATHS,
trezor: TREZOR_HD_PATHS,
onekey: TREZOR_HD_PATHS,
oneKey: TREZOR_HD_PATHS,
};

const getErrorMessage = (errorCode, t) => {
Expand Down
1 change: 1 addition & 0 deletions ui/selectors/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ export function getAccountTypeForKeyring(keyring) {

switch (type) {
case KeyringType.trezor:
case KeyringType.oneKey:
case KeyringType.ledger:
case KeyringType.lattice:
case KeyringType.qr:
Expand Down
Loading