mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
694773f17a
Co-authored-by: georgewrmarshall <george.marshall@consensys.net> Co-authored-by: NidhiKJha <nidhi.kumari@consensys.net> Co-authored-by: montelaidev <monte.lai@consensys.net>
76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
import { isValidMnemonic } from '@ethersproject/hdnode';
|
|
import {
|
|
bufferToHex,
|
|
getBinarySize,
|
|
isValidPrivate,
|
|
toBuffer,
|
|
} from 'ethereumjs-util';
|
|
import Wallet from 'ethereumjs-wallet';
|
|
import importers from 'ethereumjs-wallet/thirdparty';
|
|
import log from 'loglevel';
|
|
import { stripHexPrefix } from '../../../shared/modules/hexstring-utils';
|
|
import { addHexPrefix } from '../lib/util';
|
|
|
|
const accountImporter = {
|
|
async importAccount(strategy, args) {
|
|
const importer = this.strategies[strategy];
|
|
const privateKeyHex = importer(...args);
|
|
return privateKeyHex;
|
|
},
|
|
|
|
strategies: {
|
|
'Private Key': (privateKey) => {
|
|
if (!privateKey) {
|
|
throw new Error('Cannot import an empty key.'); // It should never get here, because this should be stopped in the UI
|
|
}
|
|
|
|
// Check if the user has entered an SRP by mistake instead of a private key
|
|
if (isValidMnemonic(privateKey.trim())) {
|
|
throw new Error(`t('importAccountErrorIsSRP')`);
|
|
}
|
|
|
|
const trimmedPrivateKey = privateKey.replace(/\s+/gu, ''); // Remove all whitespace
|
|
|
|
const prefixedPrivateKey = addHexPrefix(trimmedPrivateKey);
|
|
let buffer;
|
|
try {
|
|
buffer = toBuffer(prefixedPrivateKey);
|
|
} catch (e) {
|
|
throw new Error(`t('importAccountErrorNotHexadecimal')`);
|
|
}
|
|
|
|
try {
|
|
if (
|
|
!isValidPrivate(buffer) ||
|
|
getBinarySize(prefixedPrivateKey) !== 64 + '0x'.length // Fixes issue #17719 -- isValidPrivate() will let a key of 63 hex digits through without complaining, this line ensures 64 hex digits + '0x' = 66 digits
|
|
) {
|
|
throw new Error(`t('importAccountErrorNotAValidPrivateKey')`);
|
|
}
|
|
} catch (e) {
|
|
throw new Error(`t('importAccountErrorNotAValidPrivateKey')`);
|
|
}
|
|
|
|
const strippedPrivateKey = stripHexPrefix(prefixedPrivateKey);
|
|
return strippedPrivateKey;
|
|
},
|
|
'JSON File': (input, password) => {
|
|
let wallet;
|
|
try {
|
|
wallet = importers.fromEtherWallet(input, password);
|
|
} catch (e) {
|
|
log.debug('Attempt to import as EtherWallet format failed, trying V3');
|
|
wallet = Wallet.fromV3(input, password, true);
|
|
}
|
|
|
|
return walletToPrivateKey(wallet);
|
|
},
|
|
},
|
|
};
|
|
|
|
function walletToPrivateKey(wallet) {
|
|
const privateKeyBuffer = wallet.getPrivateKey();
|
|
return bufferToHex(privateKeyBuffer);
|
|
}
|
|
|
|
export default accountImporter;
|