1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-22 17:33:23 +01:00

Convert shared/constants/hardware-wallets.js -> Typescript (#17310)

This commit is contained in:
ryanml 2023-01-20 08:14:40 -07:00 committed by GitHub
parent c744f2d0cf
commit a19a5d60d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 339 additions and 314 deletions

View File

@ -1,5 +1,5 @@
import { draftTransactionInitialState } from '../ui/ducks/send';
import { KEYRING_TYPES } from '../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../shared/constants/hardware-wallets';
const state = {
invalidCustomNetwork: {
@ -1163,14 +1163,14 @@ const state = {
unapprovedTypedMessages: {},
unapprovedTypedMessagesCount: 0,
keyringTypes: [
KEYRING_TYPES.IMPORTED,
KEYRING_TYPES.HD_KEY_TREE,
KEYRING_TYPES.TREZOR,
KEYRING_TYPES.LEDGER,
HardwareKeyringTypes.imported,
HardwareKeyringTypes.hdKeyTree,
HardwareKeyringTypes.trezor,
HardwareKeyringTypes.ledger,
],
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: [
'0x64a845a5b02460acf8a3d84503b0d68d028b4bb4',
'0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e',

View File

@ -3,7 +3,7 @@ import { normalize as normalizeAddress } from 'eth-sig-util';
import { ethers } from 'ethers';
import { IPFS_DEFAULT_GATEWAY_URL } from '../../../shared/constants/network';
import { isPrefixedFormattedHexString } from '../../../shared/modules/network.utils';
import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets';
import { LedgerTransportTypes } from '../../../shared/constants/hardware-wallets';
import { THEME_TYPE } from '../../../ui/pages/settings/settings-tab/settings-tab.constant';
import { NETWORK_EVENTS } from './network';
@ -64,8 +64,8 @@ export default class PreferencesController {
ipfsGateway: IPFS_DEFAULT_GATEWAY_URL,
infuraBlocked: null,
ledgerTransportType: window.navigator.hid
? LEDGER_TRANSPORT_TYPES.WEBHID
: LEDGER_TRANSPORT_TYPES.U2F,
? LedgerTransportTypes.webhid
: LedgerTransportTypes.u2f,
improvedTokenAllowanceEnabled: false,
transactionSecurityCheckEnabled: false,
theme: THEME_TYPE.OS,

View File

@ -1,7 +1,7 @@
import KeyringController from 'eth-keyring-controller';
import log from 'loglevel';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
const seedPhraseVerifier = {
/**
@ -23,7 +23,7 @@ const seedPhraseVerifier = {
const keyringController = new KeyringController({});
const Keyring = keyringController.getKeyringClassForType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
const opts = {
mnemonic: seedPhrase,

View File

@ -6,13 +6,13 @@ import { cloneDeep } from 'lodash';
import KeyringController from 'eth-keyring-controller';
import firstTimeState from '../first-time-state';
import mockEncryptor from '../../../test/lib/mock-encryptor';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
import seedPhraseVerifier from './seed-phrase-verifier';
describe('SeedPhraseVerifier', () => {
describe('verifyAccounts', () => {
const password = 'passw0rd1';
const hdKeyTree = KEYRING_TYPES.HD_KEY_TREE;
const { hdKeyTree } = HardwareKeyringTypes;
let keyringController;
let primaryKeyring;

View File

@ -69,9 +69,11 @@ import {
GAS_DEV_API_BASE_URL,
SWAPS_CLIENT_ID,
} from '../../shared/constants/swaps';
import { KEYRING_TYPES } from '../../shared/constants/keyrings';
import { CHAIN_IDS } from '../../shared/constants/network';
import { DEVICE_NAMES } from '../../shared/constants/hardware-wallets';
import {
HardwareDeviceNames,
HardwareKeyringTypes,
} from '../../shared/constants/hardware-wallets';
import {
CaveatTypes,
RestrictedMethods,
@ -2272,7 +2274,7 @@ export default class MetamaskController extends EventEmitter {
);
const [primaryKeyring] = keyringController.getKeyringsByType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
if (!primaryKeyring) {
throw new Error('MetamaskController - No HD Key Tree found');
@ -2399,10 +2401,10 @@ export default class MetamaskController extends EventEmitter {
// Accounts
const [hdKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
const simpleKeyPairKeyrings = this.keyringController.getKeyringsByType(
KEYRING_TYPES.IMPORTED,
HardwareKeyringTypes.hdKeyTree,
);
const hdAccounts = await hdKeyring.getAccounts();
const simpleKeyPairKeyringAccounts = await Promise.all(
@ -2563,7 +2565,7 @@ export default class MetamaskController extends EventEmitter {
*/
getPrimaryKeyringMnemonic() {
const [keyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
if (!keyring.mnemonic) {
throw new Error('Primary keyring mnemonic unavailable.');
@ -2578,16 +2580,16 @@ export default class MetamaskController extends EventEmitter {
async getKeyringForDevice(deviceName, hdPath = null) {
let keyringName = null;
switch (deviceName) {
case DEVICE_NAMES.TREZOR:
case HardwareDeviceNames.trezor:
keyringName = TrezorKeyring.type;
break;
case DEVICE_NAMES.LEDGER:
case HardwareDeviceNames.ledger:
keyringName = LedgerBridgeKeyring.type;
break;
case DEVICE_NAMES.QR:
case HardwareDeviceNames.qr:
keyringName = QRHardwareKeyring.type;
break;
case DEVICE_NAMES.LATTICE:
case HardwareDeviceNames.lattice:
keyringName = LatticeKeyring.type;
break;
default:
@ -2602,10 +2604,10 @@ export default class MetamaskController extends EventEmitter {
if (hdPath && keyring.setHdPath) {
keyring.setHdPath(hdPath);
}
if (deviceName === DEVICE_NAMES.LATTICE) {
if (deviceName === HardwareDeviceNames.lattice) {
keyring.appName = 'MetaMask';
}
if (deviceName === DEVICE_NAMES.TREZOR) {
if (deviceName === HardwareDeviceNames.trezor) {
const model = keyring.getModel();
this.appStateController.setTrezorModel(model);
}
@ -2616,7 +2618,7 @@ export default class MetamaskController extends EventEmitter {
}
async attemptLedgerTransportCreation() {
const keyring = await this.getKeyringForDevice(DEVICE_NAMES.LEDGER);
const keyring = await this.getKeyringForDevice(HardwareDeviceNames.ledger);
return await keyring.attemptMakeApp();
}
@ -2694,12 +2696,12 @@ export default class MetamaskController extends EventEmitter {
async getAccountType(address) {
const keyring = await this.keyringController.getKeyringForAccount(address);
switch (keyring.type) {
case KEYRING_TYPES.TREZOR:
case KEYRING_TYPES.LATTICE:
case KEYRING_TYPES.QR:
case KEYRING_TYPES.LEDGER:
case HardwareKeyringTypes.trezor:
case HardwareKeyringTypes.lattice:
case HardwareKeyringTypes.qr:
case HardwareKeyringTypes.ledger:
return 'hardware';
case KEYRING_TYPES.IMPORTED:
case HardwareKeyringTypes.imported:
return 'imported';
default:
return 'MetaMask';
@ -2717,16 +2719,16 @@ export default class MetamaskController extends EventEmitter {
async getDeviceModel(address) {
const keyring = await this.keyringController.getKeyringForAccount(address);
switch (keyring.type) {
case KEYRING_TYPES.TREZOR:
case HardwareKeyringTypes.trezor:
return keyring.getModel();
case KEYRING_TYPES.QR:
case HardwareKeyringTypes.qr:
return keyring.getName();
case KEYRING_TYPES.LEDGER:
case HardwareKeyringTypes.ledger:
// TODO: get model after ledger keyring exposes method
return DEVICE_NAMES.LEDGER;
case KEYRING_TYPES.LATTICE:
return HardwareDeviceNames.ledger;
case HardwareKeyringTypes.lattice:
// TODO: get model after lattice keyring exposes method
return DEVICE_NAMES.LATTICE;
return HardwareDeviceNames.lattice;
default:
return 'N/A';
}
@ -2769,7 +2771,9 @@ export default class MetamaskController extends EventEmitter {
newAccounts.forEach((address) => {
if (!oldAccounts.includes(address)) {
const label = this.getAccountLabel(
deviceName === DEVICE_NAMES.QR ? keyring.getName() : deviceName,
deviceName === HardwareDeviceNames.qr
? keyring.getName()
: deviceName,
index,
hdPathDescription,
);
@ -2796,7 +2800,7 @@ export default class MetamaskController extends EventEmitter {
*/
async addNewAccount(accountCount) {
const [primaryKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
if (!primaryKeyring) {
throw new Error('MetamaskController - No HD Key Tree found');
@ -2841,7 +2845,7 @@ export default class MetamaskController extends EventEmitter {
*/
async verifySeedPhrase() {
const [primaryKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.HD_KEY_TREE,
HardwareKeyringTypes.hdKeyTree,
);
if (!primaryKeyring) {
throw new Error('MetamaskController - No HD Key Tree found');
@ -2963,7 +2967,7 @@ export default class MetamaskController extends EventEmitter {
async importAccountWithStrategy(strategy, args) {
const privateKey = await accountImporter.importAccount(strategy, args);
const keyring = await this.keyringController.addNewKeyring(
KEYRING_TYPES.IMPORTED,
HardwareKeyringTypes.imported,
[privateKey],
);
const [firstAccount] = await keyring.getAccounts();
@ -3246,7 +3250,7 @@ export default class MetamaskController extends EventEmitter {
const keyring = await this.keyringController.getKeyringForAccount(address);
switch (keyring.type) {
case KEYRING_TYPES.LEDGER: {
case HardwareKeyringTypes.ledger: {
return new Promise((_, reject) => {
reject(
new Error('Ledger does not support eth_getEncryptionPublicKey.'),
@ -3254,7 +3258,7 @@ export default class MetamaskController extends EventEmitter {
});
}
case KEYRING_TYPES.TREZOR: {
case HardwareKeyringTypes.trezor: {
return new Promise((_, reject) => {
reject(
new Error('Trezor does not support eth_getEncryptionPublicKey.'),
@ -3262,7 +3266,7 @@ export default class MetamaskController extends EventEmitter {
});
}
case KEYRING_TYPES.LATTICE: {
case HardwareKeyringTypes.lattice: {
return new Promise((_, reject) => {
reject(
new Error('Lattice does not support eth_getEncryptionPublicKey.'),
@ -3270,7 +3274,7 @@ export default class MetamaskController extends EventEmitter {
});
}
case KEYRING_TYPES.QR: {
case HardwareKeyringTypes.qr: {
return Promise.reject(
new Error('QR hardware does not support eth_getEncryptionPublicKey.'),
);
@ -4397,7 +4401,7 @@ export default class MetamaskController extends EventEmitter {
const newValue =
this.preferencesController.setLedgerTransportPreference(transportType);
const keyring = await this.getKeyringForDevice(DEVICE_NAMES.LEDGER);
const keyring = await this.getKeyringForDevice(HardwareDeviceNames.ledger);
if (keyring?.updateTransportMethod) {
return keyring.updateTransportMethod(newValue).catch((e) => {
// If there was an error updating the transport, we should
@ -4486,14 +4490,14 @@ export default class MetamaskController extends EventEmitter {
*/
setLocked() {
const [trezorKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.TREZOR,
HardwareKeyringTypes.trezor,
);
if (trezorKeyring) {
trezorKeyring.dispose();
}
const [ledgerKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.LEDGER,
HardwareKeyringTypes.ledger,
);
ledgerKeyring?.destroy?.();

View File

@ -10,8 +10,10 @@ import browser from 'webextension-polyfill';
import { TransactionStatus } from '../../shared/constants/transaction';
import createTxMeta from '../../test/lib/createTxMeta';
import { NETWORK_TYPES } from '../../shared/constants/network';
import { KEYRING_TYPES } from '../../shared/constants/keyrings';
import { DEVICE_NAMES } from '../../shared/constants/hardware-wallets';
import {
HardwareDeviceNames,
HardwareKeyringTypes,
} from '../../shared/constants/hardware-wallets';
import { addHexPrefix, deferredPromise } from './lib/util';
const Ganache = require('../../test/e2e/ganache');
@ -205,7 +207,7 @@ describe('MetaMaskController', function () {
it('adds private key to keyrings in KeyringController', async function () {
const simpleKeyrings =
metamaskController.keyringController.getKeyringsByType(
KEYRING_TYPES.IMPORTED,
HardwareKeyringTypes.imported,
);
const privKeyBuffer = simpleKeyrings[0].wallets[0].privateKey;
const pubKeyBuffer = simpleKeyrings[0].wallets[0].publicKey;
@ -479,15 +481,15 @@ describe('MetaMaskController', function () {
it('should add the Trezor Hardware keyring', async function () {
sinon.spy(metamaskController.keyringController, 'addNewKeyring');
await metamaskController
.connectHardware(DEVICE_NAMES.TREZOR, 0)
.connectHardware(HardwareDeviceNames.trezor, 0)
.catch(() => null);
const keyrings =
await metamaskController.keyringController.getKeyringsByType(
KEYRING_TYPES.TREZOR,
HardwareKeyringTypes.trezor,
);
assert.deepEqual(
metamaskController.keyringController.addNewKeyring.getCall(0).args,
[KEYRING_TYPES.TREZOR],
[HardwareKeyringTypes.trezor],
);
assert.equal(keyrings.length, 1);
});
@ -495,15 +497,15 @@ describe('MetaMaskController', function () {
it('should add the Ledger Hardware keyring', async function () {
sinon.spy(metamaskController.keyringController, 'addNewKeyring');
await metamaskController
.connectHardware(DEVICE_NAMES.LEDGER, 0)
.connectHardware(HardwareDeviceNames.ledger, 0)
.catch(() => null);
const keyrings =
await metamaskController.keyringController.getKeyringsByType(
KEYRING_TYPES.LEDGER,
HardwareKeyringTypes.ledger,
);
assert.deepEqual(
metamaskController.keyringController.addNewKeyring.getCall(0).args,
[KEYRING_TYPES.LEDGER],
[HardwareKeyringTypes.ledger],
);
assert.equal(keyrings.length, 1);
});
@ -526,10 +528,10 @@ describe('MetaMaskController', function () {
it('should be locked by default', async function () {
await metamaskController
.connectHardware(DEVICE_NAMES.TREZOR, 0)
.connectHardware(HardwareDeviceNames.trezor, 0)
.catch(() => null);
const status = await metamaskController.checkHardwareStatus(
DEVICE_NAMES.TREZOR,
HardwareDeviceNames.trezor,
);
assert.equal(status, false);
});
@ -549,12 +551,12 @@ describe('MetaMaskController', function () {
it('should wipe all the keyring info', async function () {
await metamaskController
.connectHardware(DEVICE_NAMES.TREZOR, 0)
.connectHardware(HardwareDeviceNames.trezor, 0)
.catch(() => null);
await metamaskController.forgetDevice(DEVICE_NAMES.TREZOR);
await metamaskController.forgetDevice(HardwareDeviceNames.trezor);
const keyrings =
await metamaskController.keyringController.getKeyringsByType(
KEYRING_TYPES.TREZOR,
HardwareKeyringTypes.trezor,
);
assert.deepEqual(keyrings[0].accounts, []);
@ -593,11 +595,11 @@ describe('MetaMaskController', function () {
sinon.spy(metamaskController.preferencesController, 'setSelectedAddress');
sinon.spy(metamaskController.preferencesController, 'setAccountLabel');
await metamaskController
.connectHardware(DEVICE_NAMES.TREZOR, 0, `m/44'/1'/0'/0`)
.connectHardware(HardwareDeviceNames.trezor, 0, `m/44'/1'/0'/0`)
.catch(() => null);
await metamaskController.unlockHardwareWalletAccount(
accountToUnlock,
DEVICE_NAMES.TREZOR,
HardwareDeviceNames.trezor,
`m/44'/1'/0'/0`,
);
});
@ -614,7 +616,7 @@ describe('MetaMaskController', function () {
it('should set unlockedAccount in the keyring', async function () {
const keyrings =
await metamaskController.keyringController.getKeyringsByType(
KEYRING_TYPES.TREZOR,
HardwareKeyringTypes.trezor,
);
assert.equal(keyrings[0].unlockedAccount, accountToUnlock);
});

View File

@ -1,5 +1,5 @@
import { cloneDeep } from 'lodash';
import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets';
import { LedgerTransportTypes } from '../../../shared/constants/hardware-wallets';
const version = 66;
@ -20,15 +20,15 @@ export default {
function transformState(state) {
const defaultTransportType = window.navigator.hid
? LEDGER_TRANSPORT_TYPES.WEBHID
: LEDGER_TRANSPORT_TYPES.U2F;
? LedgerTransportTypes.webhid
: LedgerTransportTypes.u2f;
const useLedgerLive = Boolean(state.PreferencesController?.useLedgerLive);
const newState = {
...state,
PreferencesController: {
...state?.PreferencesController,
ledgerTransportType: useLedgerLive
? LEDGER_TRANSPORT_TYPES.LIVE
? LedgerTransportTypes.live
: defaultTransportType,
},
};

View File

@ -1,4 +1,4 @@
import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets';
import { LedgerTransportTypes } from '../../../shared/constants/hardware-wallets';
import migration66 from './066';
describe('migration #66', () => {
@ -29,7 +29,7 @@ describe('migration #66', () => {
const newStorage = await migration66.migrate(oldStorage);
expect(
newStorage.data.PreferencesController.ledgerTransportType,
).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F);
).toStrictEqual(LedgerTransportTypes.u2f);
});
it('should set ledgerTransportType to `u2f` if no useLedgerLive property exists and webhid is not available', async () => {
@ -43,7 +43,7 @@ describe('migration #66', () => {
const newStorage = await migration66.migrate(oldStorage);
expect(
newStorage.data.PreferencesController.ledgerTransportType,
).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F);
).toStrictEqual(LedgerTransportTypes.u2f);
});
it('should set ledgerTransportType to `u2f` if useLedgerLive is false and webhid is not available', async () => {
@ -59,7 +59,7 @@ describe('migration #66', () => {
const newStorage = await migration66.migrate(oldStorage);
expect(
newStorage.data.PreferencesController.ledgerTransportType,
).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F);
).toStrictEqual(LedgerTransportTypes.u2f);
});
it('should set ledgerTransportType to `webhid` if useLedgerLive is false and webhid is available', async () => {
@ -77,7 +77,7 @@ describe('migration #66', () => {
const newStorage = await migration66.migrate(oldStorage);
expect(
newStorage.data.PreferencesController.ledgerTransportType,
).toStrictEqual(LEDGER_TRANSPORT_TYPES.WEBHID);
).toStrictEqual(LedgerTransportTypes.webhid);
});
it('should set ledgerTransportType to `ledgerLive` if useLedgerLive is true', async () => {
@ -111,6 +111,6 @@ describe('migration #66', () => {
const newStorage = await migration66.migrate(oldStorage);
expect(
newStorage.data.PreferencesController.ledgerTransportType,
).toStrictEqual(LEDGER_TRANSPORT_TYPES.LIVE);
).toStrictEqual(LedgerTransportTypes.live);
});
});

View File

@ -1,74 +0,0 @@
/**
* Accounts can be instantiated from simple, HD or the multiple hardware wallet
* keyring types. Both simple and HD are treated as default but we do special
* case accounts managed by a hardware wallet.
*/
export const HARDWARE_KEYRING_TYPES = {
LEDGER: 'Ledger Hardware',
TREZOR: 'Trezor Hardware',
LATTICE: 'Lattice Hardware',
QR: 'QR Hardware Wallet Device',
};
export const DEVICE_NAMES = {
LEDGER: 'ledger',
TREZOR: 'trezor',
QR: 'QR Hardware',
LATTICE: 'lattice',
};
export const KEYRING_NAMES = {
LEDGER: 'Ledger',
TREZOR: 'Trezor',
QR: 'QR',
LATTICE: 'Lattice1',
};
/**
* Used for setting the users preference for ledger transport type
*/
export const LEDGER_TRANSPORT_TYPES = {
LIVE: 'ledgerLive',
WEBHID: 'webhid',
U2F: 'u2f',
};
export const LEDGER_USB_VENDOR_ID = '0x2c97';
export const WEBHID_CONNECTED_STATUSES = {
CONNECTED: 'connected',
NOT_CONNECTED: 'notConnected',
UNKNOWN: 'unknown',
};
export const TRANSPORT_STATES = {
NONE: 'NONE',
VERIFIED: 'VERIFIED',
DEVICE_OPEN_FAILURE: 'DEVICE_OPEN_FAILURE',
UNKNOWN_FAILURE: 'UNKNOWN_FAILURE',
};
export const AFFILIATE_LINKS = {
LEDGER: 'https://shop.ledger.com/?r=17c4991a03fa',
GRIDPLUS: 'https://gridplus.io/?afmc=7p',
TREZOR:
'https://shop.trezor.io/product/trezor-one-black?offer_id=35&aff_id=11009',
KEYSTONE:
'https://shop.keyst.one/?rfsn=6088257.656b3e9&utm_source=refersion&utm_medium=affiliate&utm_campaign=6088257.656b3e9',
AIRGAP: 'https://airgap.it/',
COOLWALLET: 'https://www.coolwallet.io/',
DCENT: 'https://dcentwallet.com/',
};
export const AFFILIATE_TUTORIAL_LINKS = {
LEDGER:
'https://support.ledger.com/hc/en-us/articles/4404366864657-Set-up-and-use-MetaMask-to-access-your-Ledger-Ethereum-ETH-account?docs=true',
GRIDPLUS: 'https://docs.gridplus.io/setup/metamask',
TREZOR: 'https://wiki.trezor.io/Apps:MetaMask',
KEYSTONE:
'https://support.keyst.one/3rd-party-wallets/eth-and-web3-wallets-keystone/bind-metamask-with-keystone',
AIRGAP: 'https://support.airgap.it/guides/metamask/',
COOLWALLET: 'https://www.coolwallet.io/metamask-step-by-step-guides/',
DCENT:
'https://medium.com/dcentwallet/dcent-wallet-now-supports-qr-based-protocol-to-link-with-metamask-57555f02603f',
};

View File

@ -0,0 +1,71 @@
/**
* Accounts can be instantiated from simple, HD or the multiple hardware wallet
* keyring types. Both simple and HD are treated as default but we do special
* case accounts managed by a hardware wallet.
*/
export enum HardwareKeyringTypes {
ledger = 'Ledger Hardware',
trezor = 'Trezor Hardware',
lattice = 'Lattice Hardware',
qr = 'QR Hardware Wallet Device',
hdKeyTree = 'HD Key Tree',
imported = 'Simple Key Pair',
}
export enum HardwareKeyringNames {
ledger = 'Ledger',
trezor = 'Trezor',
lattice = 'Lattice1',
qr = 'QR',
}
export enum HardwareDeviceNames {
ledger = 'ledger',
trezor = 'trezor',
lattice = 'lattice',
qr = 'QR Hardware',
}
export enum HardwareTransportStates {
none = 'NONE',
verified = 'VERIFIED',
deviceOpenFailure = 'DEVICE_OPEN_FAILURE',
unknownFailure = 'UNKNOWN_FAILURE',
}
export enum HardwareAffiliateLinks {
ledger = 'https://shop.ledger.com/?r=17c4991a03fa',
gridplus = 'https://gridplus.io/?afmc=7p',
trezor = 'https://shop.trezor.io/product/trezor-one-black?offer_id=35&aff_id=11009',
keystone = 'https://shop.keyst.one/?rfsn=6088257.656b3e9&utm_source=refersion&utm_medium=affiliate&utm_campaign=6088257.656b3e9',
airgap = 'https://airgap.it/',
coolwallet = 'https://www.coolwallet.io/',
dcent = 'https://dcentwallet.com/',
}
export enum HardwareAffiliateTutorialLinks {
ledger = 'https://support.ledger.com/hc/en-us/articles/4404366864657-Set-up-and-use-MetaMask-to-access-your-Ledger-Ethereum-ETH-account?docs=true',
gridplus = 'https://docs.gridplus.io/setup/metamask',
trezor = 'https://wiki.trezor.io/Apps:MetaMask',
keystone = 'https://support.keyst.one/3rd-party-wallets/eth-and-web3-wallets-keystone/bind-metamask-with-keystone',
airgap = 'https://support.airgap.it/guides/metamask/',
coolwallet = 'https://www.coolwallet.io/metamask-step-by-step-guides/',
dcent = 'https://medium.com/dcentwallet/dcent-wallet-now-supports-qr-based-protocol-to-link-with-metamask-57555f02603f',
}
/**
* Used for setting the users preference for ledger transport type
*/
export enum LedgerTransportTypes {
live = 'ledgerLive',
webhid = 'webhid',
u2f = 'u2f',
}
export enum WebHIDConnectedStatuses {
connected = 'connected',
notConnected = 'notConnected',
unknown = 'unknown',
}
export const LEDGER_USB_VENDOR_ID = '0x2c97';

View File

@ -1,7 +0,0 @@
import { HARDWARE_KEYRING_TYPES } from './hardware-wallets';
export const KEYRING_TYPES = {
HD_KEY_TREE: 'HD Key Tree',
IMPORTED: 'Simple Key Pair',
...HARDWARE_KEYRING_TYPES,
};

View File

@ -1,5 +1,5 @@
import { CHAIN_IDS } from '../../shared/constants/network';
import { KEYRING_TYPES } from '../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../shared/constants/hardware-wallets';
const createGetSmartTransactionFeesApiResponse = () => {
return {
@ -253,10 +253,13 @@ export const createSwapsMockStore = () => {
},
},
selectedAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
keyringTypes: [KEYRING_TYPES.IMPORTED, KEYRING_TYPES.HD_KEY_TREE],
keyringTypes: [
HardwareKeyringTypes.imported,
HardwareKeyringTypes.hdKeyTree,
],
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: [
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
'c5b8dbac4c1d3f152cdeb400e2313f309c410acb',
@ -264,7 +267,7 @@ export const createSwapsMockStore = () => {
],
},
{
type: KEYRING_TYPES.IMPORTED,
type: HardwareKeyringTypes.imported,
accounts: ['0xd85a4b6a394794842887b8284293d69163007bbb'],
},
],

View File

@ -3,7 +3,7 @@ import sinon from 'sinon';
import configureMockStore from 'redux-mock-store';
import { fireEvent, screen } from '@testing-library/react';
import { renderWithProvider } from '../../../../test/lib/render-helpers';
import { KEYRING_TYPES } from '../../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../../shared/constants/hardware-wallets';
import AccountMenu from '.';
describe('Account Menu', () => {
@ -37,11 +37,11 @@ describe('Account Menu', () => {
],
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: ['0xAdress'],
},
{
type: KEYRING_TYPES.IMPORTED,
type: HardwareKeyringTypes.imported,
accounts: ['0x1'],
},
],

View File

@ -2,8 +2,10 @@ import React from 'react';
import PropTypes from 'prop-types';
import { useI18nContext } from '../../../hooks/useI18nContext';
import { KEYRING_TYPES } from '../../../../shared/constants/keyrings';
import { KEYRING_NAMES } from '../../../../shared/constants/hardware-wallets';
import {
HardwareKeyringNames,
HardwareKeyringTypes,
} from '../../../../shared/constants/hardware-wallets';
export default function KeyRingLabel({ keyring }) {
const t = useI18nContext();
@ -17,20 +19,20 @@ export default function KeyRingLabel({ keyring }) {
const { type } = keyring;
switch (type) {
case KEYRING_TYPES.QR:
label = KEYRING_NAMES.QR;
case HardwareKeyringTypes.qr:
label = HardwareKeyringNames.qr;
break;
case KEYRING_TYPES.IMPORTED:
case HardwareKeyringTypes.imported:
label = t('imported');
break;
case KEYRING_TYPES.TREZOR:
label = KEYRING_NAMES.TREZOR;
case HardwareKeyringTypes.trezor:
label = HardwareKeyringNames.trezor;
break;
case KEYRING_TYPES.LEDGER:
label = KEYRING_NAMES.LEDGER;
case HardwareKeyringTypes.ledger:
label = HardwareKeyringNames.ledger;
break;
case KEYRING_TYPES.LATTICE:
label = KEYRING_NAMES.LATTICE;
case HardwareKeyringTypes.lattice:
label = HardwareKeyringNames.lattice;
break;
default:
return null;

View File

@ -11,7 +11,7 @@ import { renderWithProvider } from '../../../../../test/lib/render-helpers';
import * as actions from '../../../../store/actions';
import { CHAIN_IDS } from '../../../../../shared/constants/network';
import { KEYRING_TYPES } from '../../../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../../../shared/constants/hardware-wallets';
import UnconnectedAccountAlert from '.';
@ -49,7 +49,7 @@ describe('Unconnected Account Alert', () => {
const keyrings = [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: [
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
'0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b',

View File

@ -2,10 +2,10 @@ import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import {
LEDGER_TRANSPORT_TYPES,
LedgerTransportTypes,
WebHIDConnectedStatuses,
HardwareTransportStates,
LEDGER_USB_VENDOR_ID,
WEBHID_CONNECTED_STATUSES,
TRANSPORT_STATES,
} from '../../../../shared/constants/hardware-wallets';
import {
PLATFORM_FIREFOX,
@ -68,8 +68,8 @@ export default function LedgerInstructionField({ showDataInstruction }) {
useEffect(() => {
const initialConnectedDeviceCheck = async () => {
if (
ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID &&
webHidConnectedStatus !== WEBHID_CONNECTED_STATUSES.CONNECTED
ledgerTransportType === LedgerTransportTypes.webhid &&
webHidConnectedStatus !== WebHIDConnectedStatuses.connected
) {
const devices = await window.navigator.hid.getDevices();
const webHidIsConnected = devices.some(
@ -78,37 +78,41 @@ export default function LedgerInstructionField({ showDataInstruction }) {
dispatch(
setLedgerWebHidConnectedStatus(
webHidIsConnected
? WEBHID_CONNECTED_STATUSES.CONNECTED
: WEBHID_CONNECTED_STATUSES.NOT_CONNECTED,
? WebHIDConnectedStatuses.connected
: WebHIDConnectedStatuses.notConnected,
),
);
}
};
const determineTransportStatus = async () => {
if (
ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID &&
webHidConnectedStatus === WEBHID_CONNECTED_STATUSES.CONNECTED &&
transportStatus === TRANSPORT_STATES.NONE
ledgerTransportType === LedgerTransportTypes.webhid &&
webHidConnectedStatus === WebHIDConnectedStatuses.connected &&
transportStatus === HardwareTransportStates.none
) {
try {
const transportedCreated = await attemptLedgerTransportCreation();
dispatch(
setLedgerTransportStatus(
transportedCreated
? TRANSPORT_STATES.VERIFIED
: TRANSPORT_STATES.UNKNOWN_FAILURE,
? HardwareTransportStates.verified
: HardwareTransportStates.unknownFailure,
),
);
} catch (e) {
if (e.message.match('Failed to open the device')) {
dispatch(
setLedgerTransportStatus(TRANSPORT_STATES.DEVICE_OPEN_FAILURE),
setLedgerTransportStatus(
HardwareTransportStates.deviceOpenFailure,
),
);
} else if (e.message.match('the device is already open')) {
dispatch(setLedgerTransportStatus(TRANSPORT_STATES.VERIFIED));
dispatch(
setLedgerTransportStatus(HardwareTransportStates.verified),
);
} else {
dispatch(
setLedgerTransportStatus(TRANSPORT_STATES.UNKNOWN_FAILURE),
setLedgerTransportStatus(HardwareTransportStates.unknownFailure),
);
}
}
@ -120,12 +124,12 @@ export default function LedgerInstructionField({ showDataInstruction }) {
useEffect(() => {
return () => {
dispatch(setLedgerTransportStatus(TRANSPORT_STATES.NONE));
dispatch(setLedgerTransportStatus(HardwareTransportStates.none));
};
}, [dispatch]);
const usingLedgerLive = ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE;
const usingWebHID = ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID;
const usingLedgerLive = ledgerTransportType === LedgerTransportTypes.live;
const usingWebHID = ledgerTransportType === LedgerTransportTypes.webhid;
const isFirefox = getPlatform() === PLATFORM_FIREFOX;
@ -165,7 +169,7 @@ export default function LedgerInstructionField({ showDataInstruction }) {
{t('ledgerConnectionInstructionCloseOtherApps')}
</Button>
</span>,
transportStatus === TRANSPORT_STATES.DEVICE_OPEN_FAILURE,
transportStatus === HardwareTransportStates.deviceOpenFailure,
)}
{renderInstructionStep(
<span>
@ -184,8 +188,8 @@ export default function LedgerInstructionField({ showDataInstruction }) {
dispatch(
setLedgerWebHidConnectedStatus({
webHidConnectedStatus: webHidIsConnected
? WEBHID_CONNECTED_STATUSES.CONNECTED
: WEBHID_CONNECTED_STATUSES.NOT_CONNECTED,
? WebHIDConnectedStatuses.connected
: WebHIDConnectedStatuses.notConnected,
}),
);
} else {
@ -199,8 +203,7 @@ export default function LedgerInstructionField({ showDataInstruction }) {
</Button>
</span>,
usingWebHID &&
webHidConnectedStatus ===
WEBHID_CONNECTED_STATUSES.NOT_CONNECTED,
webHidConnectedStatus === WebHIDConnectedStatuses.notConnected,
COLORS.WARNING_DEFAULT,
)}
</div>

View File

@ -21,7 +21,7 @@ import {
import { useI18nContext } from '../../../hooks/useI18nContext';
import { getEnvironmentType } from '../../../../app/scripts/lib/util';
import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app';
import { KEYRING_TYPES } from '../../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../../shared/constants/hardware-wallets';
import { EVENT, EVENT_NAMES } from '../../../../shared/constants/metametrics';
import { MetaMetricsContext } from '../../../contexts/metametrics';
@ -41,7 +41,7 @@ export default function AccountOptionsMenu({ anchorElement, onClose }) {
const trackEvent = useContext(MetaMetricsContext);
const blockExplorerLinkText = useSelector(getBlockExplorerLinkText);
const isRemovable = keyring.type !== KEYRING_TYPES.HD_KEY_TREE;
const isRemovable = keyring.type !== HardwareKeyringTypes.hdKeyTree;
const routeToAddBlockExplorerUrl = () => {
history.push(`${NETWORKS_ROUTE}#blockExplorerUrl`);

View File

@ -3,7 +3,7 @@ import configureStore from 'redux-mock-store';
import { fireEvent, screen, waitFor } from '@testing-library/react';
import { renderWithProvider } from '../../../../test/lib/render-helpers';
import { CHAIN_IDS } from '../../../../shared/constants/network';
import { KEYRING_TYPES } from '../../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../../shared/constants/hardware-wallets';
import MenuBar from './menu-bar';
const initState = {
@ -21,7 +21,7 @@ const initState = {
},
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
},
],

View File

@ -2,7 +2,7 @@ import React from 'react';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { renderWithProvider } from '../../../../test/jest/rendering';
import { KEYRING_TYPES } from '../../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../../shared/constants/hardware-wallets';
import TokenOverview from './token-overview';
describe('TokenOverview', () => {
@ -22,11 +22,11 @@ describe('TokenOverview', () => {
selectedAddress: '0x1',
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: ['0x1', '0x2'],
},
{
type: KEYRING_TYPES.LEDGER,
type: HardwareKeyringTypes.ledger,
accounts: [],
},
],

View File

@ -1,6 +1,6 @@
import {
WEBHID_CONNECTED_STATUSES,
TRANSPORT_STATES,
WebHIDConnectedStatuses,
HardwareTransportStates,
} from '../../../shared/constants/hardware-wallets';
import * as actionConstants from '../../store/actionConstants';
@ -49,8 +49,8 @@ export default function reduceApp(state = {}, action) {
gasLoadingAnimationIsShowing: false,
smartTransactionsError: null,
smartTransactionsErrorMessageDismissed: false,
ledgerWebHidConnectedStatus: WEBHID_CONNECTED_STATUSES.UNKNOWN,
ledgerTransportStatus: TRANSPORT_STATES.NONE,
ledgerWebHidConnectedStatus: WebHIDConnectedStatuses.unknown,
ledgerTransportStatus: HardwareTransportStates.none,
newNetworkAdded: '',
newCollectibleAddedMessage: '',
portfolioTooltipWasShownInThisSession: false,

View File

@ -1,5 +1,5 @@
import * as actionConstants from '../../store/actionConstants';
import { DEVICE_NAMES } from '../../../shared/constants/hardware-wallets';
import { HardwareDeviceNames } from '../../../shared/constants/hardware-wallets';
import reduceApp from './app';
const actions = actionConstants;
@ -261,7 +261,7 @@ describe('App State', () => {
const state = reduceApp(metamaskState, {
type: actions.SET_HARDWARE_WALLET_DEFAULT_HD_PATH,
value: {
device: DEVICE_NAMES.LEDGER,
device: HardwareDeviceNames.ledger,
path: "m/44'/60'/0'",
},
});

View File

@ -15,7 +15,7 @@ import { updateTransactionGasFees } from '../../store/actions';
import { setCustomGasLimit, setCustomGasPrice } from '../gas/gas.duck';
import { decGWEIToHexWEI } from '../../helpers/utils/conversions.util';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
import { isEqualCaseInsensitive } from '../../../shared/modules/string-utils';
import { stripHexPrefix } from '../../../shared/modules/hexstring-utils';
@ -433,7 +433,7 @@ export function getLedgerTransportType(state) {
export function isAddressLedger(state, address) {
const keyring = findKeyringForAddress(state, address);
return keyring?.type === KEYRING_TYPES.LEDGER;
return keyring?.type === HardwareKeyringTypes.ledger;
}
/**
@ -445,6 +445,6 @@ export function isAddressLedger(state, address) {
*/
export function doesUserHaveALedgerAccount(state) {
return state.metamask.keyrings.some((kr) => {
return kr.type === KEYRING_TYPES.LEDGER;
return kr.type === HardwareKeyringTypes.ledger;
});
}

View File

@ -13,7 +13,7 @@ import {
} from '../../pages/send/send.constants';
import { CHAIN_IDS } from '../../../shared/constants/network';
import { GAS_ESTIMATE_TYPES, GAS_LIMITS } from '../../../shared/constants/gas';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
import {
AssetType,
TokenStandard,
@ -1278,7 +1278,7 @@ describe('Send Slice', () => {
identities: { '0xAddress': { address: '0xAddress' } },
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: ['0xAddress'],
},
],

View File

@ -8,7 +8,7 @@ import Dropdown from '../../../components/ui/dropdown';
import { getURLHostName } from '../../../helpers/utils/util';
import { DEVICE_NAMES } from '../../../../shared/constants/hardware-wallets';
import { HardwareDeviceNames } from '../../../../shared/constants/hardware-wallets';
import { EVENT } from '../../../../shared/constants/metametrics';
class AccountList extends Component {
@ -65,9 +65,9 @@ class AccountList extends Component {
renderHeader() {
const { device } = this.props;
const shouldShowHDPaths = [
DEVICE_NAMES.LEDGER,
DEVICE_NAMES.LATTICE,
DEVICE_NAMES.TREZOR,
HardwareDeviceNames.ledger,
HardwareDeviceNames.lattice,
HardwareDeviceNames.trezor,
].includes(device.toLowerCase());
return (
<div className="hw-connect">

View File

@ -13,8 +13,8 @@ import { getMostRecentOverviewPage } from '../../../ducks/history/history';
import { EVENT, EVENT_NAMES } from '../../../../shared/constants/metametrics';
import { SECOND } from '../../../../shared/constants/time';
import {
DEVICE_NAMES,
LEDGER_TRANSPORT_TYPES,
HardwareDeviceNames,
LedgerTransportTypes,
} from '../../../../shared/constants/hardware-wallets';
import ZENDESK_URLS from '../../../helpers/constants/zendesk-url';
import SelectHardware from './select-hardware';
@ -89,9 +89,9 @@ class ConnectHardwareForm extends Component {
async checkIfUnlocked() {
for (const device of [
DEVICE_NAMES.TREZOR,
DEVICE_NAMES.LEDGER,
DEVICE_NAMES.LATTICE,
HardwareDeviceNames.trezor,
HardwareDeviceNames.ledger,
HardwareDeviceNames.lattice,
]) {
const path = this.props.defaultHdPaths[device];
const unlocked = await this.props.checkHardwareStatus(device, path);
@ -364,7 +364,7 @@ ConnectHardwareForm.propTypes = {
connectedAccounts: PropTypes.array.isRequired,
defaultHdPaths: PropTypes.object,
mostRecentOverviewPage: PropTypes.string.isRequired,
ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)),
ledgerTransportType: PropTypes.oneOf(Object.values(LedgerTransportTypes)),
};
const mapStateToProps = (state) => ({

View File

@ -8,10 +8,10 @@ import LogoTrezor from '../../../components/ui/logo/logo-trezor';
import LogoLattice from '../../../components/ui/logo/logo-lattice';
import {
DEVICE_NAMES,
LEDGER_TRANSPORT_TYPES,
AFFILIATE_LINKS,
AFFILIATE_TUTORIAL_LINKS,
HardwareDeviceNames,
LedgerTransportTypes,
HardwareAffiliateLinks,
HardwareAffiliateTutorialLinks,
} from '../../../../shared/constants/hardware-wallets';
import ZENDESK_URLS from '../../../helpers/constants/zendesk-url';
import { EVENT } from '../../../../shared/constants/metametrics';
@ -25,7 +25,7 @@ export default class SelectHardware extends Component {
static propTypes = {
connectToHardwareWallet: PropTypes.func.isRequired,
browserSupported: PropTypes.bool.isRequired,
ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)),
ledgerTransportType: PropTypes.oneOf(Object.values(LedgerTransportTypes)),
};
state = {
@ -43,9 +43,11 @@ export default class SelectHardware extends Component {
return (
<button
className={classnames('hw-connect__btn', {
selected: this.state.selectedDevice === DEVICE_NAMES.TREZOR,
selected: this.state.selectedDevice === HardwareDeviceNames.trezor,
})}
onClick={(_) => this.setState({ selectedDevice: DEVICE_NAMES.TREZOR })}
onClick={(_) =>
this.setState({ selectedDevice: HardwareDeviceNames.trezor })
}
>
<LogoTrezor className="hw-connect__btn__img" ariaLabel="Trezor" />
</button>
@ -56,9 +58,11 @@ export default class SelectHardware extends Component {
return (
<button
className={classnames('hw-connect__btn', {
selected: this.state.selectedDevice === DEVICE_NAMES.LATTICE,
selected: this.state.selectedDevice === HardwareDeviceNames.lattice,
})}
onClick={(_) => this.setState({ selectedDevice: DEVICE_NAMES.LATTICE })}
onClick={(_) =>
this.setState({ selectedDevice: HardwareDeviceNames.lattice })
}
>
<LogoLattice className="hw-connect__btn__img" ariaLabel="Lattice" />
</button>
@ -69,9 +73,11 @@ export default class SelectHardware extends Component {
return (
<button
className={classnames('hw-connect__btn', {
selected: this.state.selectedDevice === DEVICE_NAMES.LEDGER,
selected: this.state.selectedDevice === HardwareDeviceNames.ledger,
})}
onClick={(_) => this.setState({ selectedDevice: DEVICE_NAMES.LEDGER })}
onClick={(_) =>
this.setState({ selectedDevice: HardwareDeviceNames.ledger })
}
>
<LogoLedger className="hw-connect__btn__img" ariaLabel="Ledger" />
</button>
@ -82,9 +88,11 @@ export default class SelectHardware extends Component {
return (
<button
className={classnames('hw-connect__btn', {
selected: this.state.selectedDevice === DEVICE_NAMES.QR,
selected: this.state.selectedDevice === HardwareDeviceNames.qr,
})}
onClick={(_) => this.setState({ selectedDevice: DEVICE_NAMES.QR })}
onClick={(_) =>
this.setState({ selectedDevice: HardwareDeviceNames.qr })
}
>
<LogoQRBased className="hw-connect__btn__img" ariaLabel="QRCode" />
</button>
@ -164,13 +172,13 @@ export default class SelectHardware extends Component {
renderTutorialsteps() {
switch (this.state.selectedDevice) {
case DEVICE_NAMES.LEDGER:
case HardwareDeviceNames.ledger:
return this.renderLedgerTutorialSteps();
case DEVICE_NAMES.TREZOR:
case HardwareDeviceNames.trezor:
return this.renderTrezorTutorialSteps();
case DEVICE_NAMES.LATTICE:
case HardwareDeviceNames.lattice:
return this.renderLatticeTutorialSteps();
case DEVICE_NAMES.QR:
case HardwareDeviceNames.qr:
return this.renderQRHardwareWalletSteps();
default:
return '';
@ -179,7 +187,7 @@ export default class SelectHardware extends Component {
renderLedgerTutorialSteps() {
const steps = [];
if (this.props.ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE) {
if (this.props.ledgerTransportType === LedgerTransportTypes.live) {
steps.push({
renderButtons: false,
title: this.context.t('step1LedgerWallet'),
@ -230,7 +238,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Ledger Buy Now',
});
window.open(AFFILIATE_LINKS.LEDGER, '_blank');
window.open(HardwareAffiliateLinks.ledger, '_blank');
}}
>
{this.context.t('buyNow')}
@ -243,7 +251,10 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Ledger Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.LEDGER, '_blank');
window.open(
HardwareAffiliateTutorialLinks.ledger,
'_blank',
);
}}
>
{this.context.t('tutorial')}
@ -298,7 +309,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked GridPlus Buy Now',
});
window.open(AFFILIATE_LINKS.GRIDPLUS, '_blank');
window.open(HardwareAffiliateLinks.gridplus, '_blank');
}}
>
{this.context.t('buyNow')}
@ -311,7 +322,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked GidPlus Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.GRIDPLUS, '_blank');
window.open(HardwareAffiliateTutorialLinks.gridplus, '_blank');
}}
>
{this.context.t('tutorial')}
@ -364,7 +375,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Trezor Buy Now',
});
window.open(AFFILIATE_LINKS.TREZOR, '_blank');
window.open(HardwareAffiliateLinks.trezor, '_blank');
}}
>
{this.context.t('buyNow')}
@ -377,7 +388,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Trezor Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.TREZOR, '_blank');
window.open(HardwareAffiliateTutorialLinks.trezor, '_blank');
}}
>
{this.context.t('tutorial')}
@ -418,7 +429,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Keystone Buy Now',
});
window.open(AFFILIATE_LINKS.KEYSTONE, '_blank');
window.open(HardwareAffiliateLinks.keystone, '_blank');
}}
>
{this.context.t('buyNow')}
@ -431,7 +442,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked Keystone Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.KEYSTONE, '_blank');
window.open(HardwareAffiliateTutorialLinks.keystone, '_blank');
}}
>
{this.context.t('tutorial')}
@ -453,7 +464,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked AirGap Vault Buy Now',
});
window.open(AFFILIATE_LINKS.AIRGAP, '_blank');
window.open(HardwareAffiliateLinks.airgap, '_blank');
}}
>
{this.context.t('downloadNow')}
@ -466,7 +477,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked AirGap Vault Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.AIRGAP, '_blank');
window.open(HardwareAffiliateTutorialLinks.airgap, '_blank');
}}
>
{this.context.t('tutorial')}
@ -488,7 +499,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked CoolWallet Buy Now',
});
window.open(AFFILIATE_LINKS.COOLWALLET, '_blank');
window.open(HardwareAffiliateLinks.coolwallet, '_blank');
}}
>
{this.context.t('buyNow')}
@ -501,7 +512,10 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked CoolWallet Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.COOLWALLET, '_blank');
window.open(
HardwareAffiliateTutorialLinks.coolwallet,
'_blank',
);
}}
>
{this.context.t('tutorial')}
@ -521,7 +535,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked DCent Buy Now',
});
window.open(AFFILIATE_LINKS.DCENT, '_blank');
window.open(HardwareAffiliateLinks.dcent, '_blank');
}}
>
{this.context.t('buyNow')}
@ -534,7 +548,7 @@ export default class SelectHardware extends Component {
category: EVENT.CATEGORIES.NAVIGATION,
event: 'Clicked DCent Tutorial',
});
window.open(AFFILIATE_TUTORIAL_LINKS.DCENT, '_blank');
window.open(HardwareAffiliateTutorialLinks.dcent, '_blank');
}}
>
{this.context.t('tutorial')}

View File

@ -1,6 +1,6 @@
import React from 'react';
import { action } from '@storybook/addon-actions';
import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets';
import { LedgerTransportTypes } from '../../../../shared/constants/hardware-wallets';
import SelectHardware from './select-hardware';
export default {
@ -15,7 +15,7 @@ export const DefaultStory = () => {
connectToHardwareWallet={(selectedDevice) =>
action(`Continue connect to ${selectedDevice}`)()
}
ledgerTransportType={LEDGER_TRANSPORT_TYPES.LIVE}
ledgerTransportType={LedgerTransportTypes.live}
/>
);
};
@ -27,7 +27,7 @@ export const BrowserNotSupported = () => {
<SelectHardware
browserSupported={false}
connectToHardwareWallet={() => undefined}
ledgerTransportType={LEDGER_TRANSPORT_TYPES.LIVE}
ledgerTransportType={LedgerTransportTypes.live}
/>
);
};

View File

@ -8,7 +8,7 @@ import qrCode from 'qrcode-generator';
import Button from '../../components/ui/button';
import LoadingScreen from '../../components/ui/loading-screen';
import { MINUTE, SECOND } from '../../../shared/constants/time';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
const PASSWORD_PROMPT_SCREEN = 'PASSWORD_PROMPT_SCREEN';
const REVEAL_SEED_SCREEN = 'REVEAL_SEED_SCREEN';
@ -82,7 +82,7 @@ export default class MobileSyncPage extends Component {
async exportAccounts() {
const addresses = [];
this.props.keyrings.forEach((keyring) => {
if (keyring.type === KEYRING_TYPES.IMPORTED) {
if (keyring.type === HardwareKeyringTypes.imported) {
addresses.push(keyring.accounts[0]);
}
});

View File

@ -10,7 +10,7 @@ import {
setBackgroundConnection,
} from '../../../test/jest';
import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas';
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
import { INITIAL_SEND_STATE_FOR_EXISTING_DRAFT } from '../../../test/jest/mocks';
import Send from './send';
@ -86,7 +86,7 @@ const baseStore = {
selectedAddress: '0x0',
keyrings: [
{
type: KEYRING_TYPES.HD_KEY_TREE,
type: HardwareKeyringTypes.hdKeyTree,
accounts: ['0x0'],
},
],

View File

@ -16,7 +16,7 @@ import {
} from '../../../helpers/utils/settings-search';
import {
LEDGER_TRANSPORT_TYPES,
LedgerTransportTypes,
LEDGER_USB_VENDOR_ID,
} from '../../../../shared/constants/hardware-wallets';
import { EVENT, EVENT_NAMES } from '../../../../shared/constants/metametrics';
@ -49,7 +49,7 @@ export default class AdvancedTab extends PureComponent {
setAutoLockTimeLimit: PropTypes.func.isRequired,
setShowFiatConversionOnTestnetsPreference: PropTypes.func.isRequired,
setShowTestNetworks: PropTypes.func.isRequired,
ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)),
ledgerTransportType: PropTypes.oneOf(Object.values(LedgerTransportTypes)),
setLedgerTransportPreference: PropTypes.func.isRequired,
setDismissSeedBackUpReminder: PropTypes.func.isRequired,
dismissSeedBackUpReminder: PropTypes.bool.isRequired,
@ -473,18 +473,18 @@ export default class AdvancedTab extends PureComponent {
const transportTypeOptions = [
{
name: LEDGER_TRANSPORT_NAMES.LIVE,
value: LEDGER_TRANSPORT_TYPES.LIVE,
value: LedgerTransportTypes.live,
},
{
name: LEDGER_TRANSPORT_NAMES.U2F,
value: LEDGER_TRANSPORT_TYPES.U2F,
value: LedgerTransportTypes.u2f,
},
];
if (window.navigator.hid) {
transportTypeOptions.push({
name: LEDGER_TRANSPORT_NAMES.WEBHID,
value: LEDGER_TRANSPORT_TYPES.WEBHID,
value: LedgerTransportTypes.webhid,
});
}
@ -520,14 +520,14 @@ export default class AdvancedTab extends PureComponent {
selectedOption={ledgerTransportType}
onChange={async (transportType) => {
if (
ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE &&
transportType === LEDGER_TRANSPORT_TYPES.WEBHID
ledgerTransportType === LedgerTransportTypes.live &&
transportType === LedgerTransportTypes.webhid
) {
this.setState({ showLedgerTransportWarning: true });
}
setLedgerTransportPreference(transportType);
if (
transportType === LEDGER_TRANSPORT_TYPES.WEBHID &&
transportType === LedgerTransportTypes.webhid &&
userHasALedgerAccount
) {
await window.navigator.hid.requestDevice({

View File

@ -22,11 +22,11 @@ import {
CHAIN_IDS,
NETWORK_TYPES,
} from '../../shared/constants/network';
import { KEYRING_TYPES } from '../../shared/constants/keyrings';
import {
WEBHID_CONNECTED_STATUSES,
LEDGER_TRANSPORT_TYPES,
TRANSPORT_STATES,
HardwareKeyringTypes,
WebHIDConnectedStatuses,
LedgerTransportTypes,
HardwareTransportStates,
} from '../../shared/constants/hardware-wallets';
import {
@ -130,7 +130,7 @@ export function hasUnsignedQRHardwareTransaction(state) {
}
const { from } = txParams;
const { keyrings } = state.metamask;
const qrKeyring = keyrings.find((kr) => kr.type === KEYRING_TYPES.QR);
const qrKeyring = keyrings.find((kr) => kr.type === HardwareKeyringTypes.qr);
if (!qrKeyring) {
return false;
}
@ -148,7 +148,7 @@ export function hasUnsignedQRHardwareMessage(state) {
}
const { from } = msgParams;
const { keyrings } = state.metamask;
const qrKeyring = keyrings.find((kr) => kr.type === KEYRING_TYPES.QR);
const qrKeyring = keyrings.find((kr) => kr.type === HardwareKeyringTypes.qr);
if (!qrKeyring) {
return false;
}
@ -239,11 +239,11 @@ export function getAccountType(state) {
const type = currentKeyring && currentKeyring.type;
switch (type) {
case KEYRING_TYPES.TREZOR:
case KEYRING_TYPES.LEDGER:
case KEYRING_TYPES.LATTICE:
case HardwareKeyringTypes.trezor:
case HardwareKeyringTypes.ledger:
case HardwareKeyringTypes.lattice:
return 'hardware';
case KEYRING_TYPES.IMPORTED:
case HardwareKeyringTypes.imported:
return 'imported';
default:
return 'default';
@ -982,10 +982,11 @@ export const getUnreadNotificationsCount = createSelector(
*/
function getAllowedAnnouncementIds(state) {
const currentKeyring = getCurrentKeyring(state);
const currentKeyringIsLedger = currentKeyring?.type === KEYRING_TYPES.LEDGER;
const currentKeyringIsLedger =
currentKeyring?.type === HardwareKeyringTypes.ledger;
const supportsWebHid = window.navigator.hid !== undefined;
const currentlyUsingLedgerLive =
getLedgerTransportType(state) === LEDGER_TRANSPORT_TYPES.LIVE;
getLedgerTransportType(state) === LedgerTransportTypes.live;
return {
1: false,
@ -1118,13 +1119,12 @@ export function getTokenList(state) {
export function doesAddressRequireLedgerHidConnection(state, address) {
const addressIsLedger = isAddressLedger(state, address);
const transportTypePreferenceIsWebHID =
getLedgerTransportType(state) === LEDGER_TRANSPORT_TYPES.WEBHID;
getLedgerTransportType(state) === LedgerTransportTypes.webhid;
const webHidIsNotConnected =
getLedgerWebHidConnectedStatus(state) !==
WEBHID_CONNECTED_STATUSES.CONNECTED;
getLedgerWebHidConnectedStatus(state) !== WebHIDConnectedStatuses.connected;
const ledgerTransportStatus = getLedgerTransportStatus(state);
const transportIsNotSuccessfullyCreated =
ledgerTransportStatus !== TRANSPORT_STATES.VERIFIED;
ledgerTransportStatus !== HardwareTransportStates.verified;
return (
addressIsLedger &&

View File

@ -1,5 +1,5 @@
import mockState from '../../test/data/mock-state.json';
import { KEYRING_TYPES } from '../../shared/constants/keyrings';
import { HardwareKeyringTypes } from '../../shared/constants/hardware-wallets';
import * as selectors from './selectors';
describe('Selectors', () => {
@ -18,38 +18,38 @@ describe('Selectors', () => {
describe('#isHardwareWallet', () => {
it('returns false if it is not a HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.IMPORTED;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.imported;
expect(selectors.isHardwareWallet(mockState)).toBe(false);
});
it('returns true if it is a Ledger HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.LEDGER;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.ledger;
expect(selectors.isHardwareWallet(mockState)).toBe(true);
});
it('returns true if it is a Trezor HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.TREZOR;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.trezor;
expect(selectors.isHardwareWallet(mockState)).toBe(true);
});
});
describe('#getHardwareWalletType', () => {
it('returns undefined if it is not a HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.IMPORTED;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.imported;
expect(selectors.getHardwareWalletType(mockState)).toBeUndefined();
});
it('returns "Ledger Hardware" if it is a Ledger HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.LEDGER;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.ledger;
expect(selectors.getHardwareWalletType(mockState)).toBe(
KEYRING_TYPES.LEDGER,
HardwareKeyringTypes.ledger,
);
});
it('returns "Trezor Hardware" if it is a Trezor HW wallet', () => {
mockState.metamask.keyrings[0].type = KEYRING_TYPES.TREZOR;
mockState.metamask.keyrings[0].type = HardwareKeyringTypes.trezor;
expect(selectors.getHardwareWalletType(mockState)).toBe(
KEYRING_TYPES.TREZOR,
HardwareKeyringTypes.trezor,
);
});
});
@ -87,7 +87,7 @@ describe('Selectors', () => {
...mockState.metamask,
keyrings: [
{
type: KEYRING_TYPES.LEDGER,
type: HardwareKeyringTypes.ledger,
accounts: ['0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'],
},
],

View File

@ -30,8 +30,8 @@ import { switchedToUnconnectedAccount } from '../ducks/alerts/unconnected-accoun
import { getUnconnectedAccountAlertEnabledness } from '../ducks/metamask/metamask';
import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils';
import {
DEVICE_NAMES,
LEDGER_TRANSPORT_TYPES,
HardwareDeviceNames,
LedgerTransportTypes,
LEDGER_USB_VENDOR_ID,
} from '../../shared/constants/hardware-wallets';
import { EVENT } from '../../shared/constants/metametrics';
@ -425,12 +425,12 @@ export function connectHardware(deviceName, page, hdPath, t) {
let accounts;
try {
if (deviceName === DEVICE_NAMES.LEDGER) {
if (deviceName === HardwareDeviceNames.ledger) {
await submitRequestToBackground('establishLedgerTransportPreference');
}
if (
deviceName === DEVICE_NAMES.LEDGER &&
ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID
deviceName === HardwareDeviceNames.ledger &&
ledgerTransportType === LedgerTransportTypes.webhid
) {
const connectedDevices = await window.navigator.hid.requestDevice({
filters: [{ vendorId: LEDGER_USB_VENDOR_ID }],
@ -451,14 +451,14 @@ export function connectHardware(deviceName, page, hdPath, t) {
} catch (error) {
log.error(error);
if (
deviceName === DEVICE_NAMES.LEDGER &&
ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID &&
deviceName === HardwareDeviceNames.ledger &&
ledgerTransportType === LedgerTransportTypes.webhid &&
error.message.match('Failed to open the device')
) {
dispatch(displayWarning(t('ledgerDeviceOpenFailureMessage')));
throw new Error(t('ledgerDeviceOpenFailureMessage'));
} else {
if (deviceName !== DEVICE_NAMES.QR) {
if (deviceName !== HardwareDeviceNames.qr) {
dispatch(displayWarning(error.message));
}
throw error;

View File

@ -4,7 +4,7 @@ import thunk from 'redux-thunk';
import enLocale from '../../app/_locales/en/messages.json';
import MetaMaskController from '../../app/scripts/metamask-controller';
import { TransactionStatus } from '../../shared/constants/transaction';
import { DEVICE_NAMES } from '../../shared/constants/hardware-wallets';
import { HardwareDeviceNames } from '../../shared/constants/hardware-wallets';
import { GAS_LIMITS } from '../../shared/constants/gas';
import * as actions from './actions';
import { _setBackgroundConnection } from './action-queue';
@ -443,7 +443,10 @@ describe('Actions', () => {
_setBackgroundConnection(background);
await store.dispatch(
actions.checkHardwareStatus(DEVICE_NAMES.LEDGER, `m/44'/60'/0'/0`),
actions.checkHardwareStatus(
HardwareDeviceNames.ledger,
`m/44'/60'/0'/0`,
),
);
expect(checkHardwareStatus.callCount).toStrictEqual(1);
});
@ -483,7 +486,7 @@ describe('Actions', () => {
_setBackgroundConnection(background);
await store.dispatch(actions.forgetDevice(DEVICE_NAMES.LEDGER));
await store.dispatch(actions.forgetDevice(HardwareDeviceNames.ledger));
expect(forgetDevice.callCount).toStrictEqual(1);
});
@ -525,7 +528,11 @@ describe('Actions', () => {
_setBackgroundConnection(background);
await store.dispatch(
actions.connectHardware(DEVICE_NAMES.LEDGER, 0, `m/44'/60'/0'/0`),
actions.connectHardware(
HardwareDeviceNames.ledger,
0,
`m/44'/60'/0'/0`,
),
);
expect(connectHardware.callCount).toStrictEqual(1);
});
@ -551,7 +558,7 @@ describe('Actions', () => {
];
await expect(
store.dispatch(actions.connectHardware(DEVICE_NAMES.LEDGER)),
store.dispatch(actions.connectHardware(HardwareDeviceNames.ledger)),
).rejects.toThrow('error');
expect(store.getActions()).toStrictEqual(expectedActions);
@ -575,7 +582,7 @@ describe('Actions', () => {
await store.dispatch(
actions.unlockHardwareWalletAccounts(
[0],
DEVICE_NAMES.LEDGER,
HardwareDeviceNames.ledger,
`m/44'/60'/0'/0`,
'',
),