mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-02 06:07:06 +01:00
89cec5335f
This commit fulfills a long-standing desire to get the extension using the same network controller as mobile by removing NetworkController from this repo and replacing it with NetworkController from the `@metamask/network-controller` package. The new version of NetworkController is different the old one in a few ways: - The new controller inherits from BaseControllerV2, so the `state` property is used to access the state instead of `store.getState()`. All references of the latter have been replaced with the former. - As the new controller no longer has a `store` property, it cannot be subscribed to; the controller takes a messenger which can be subscribed to instead. There were various places within MetamaskController where the old way of subscribing has been replaced with the new way. In addition, DetectTokensController has been updated to take a messenger object so that it can listen for NetworkController state changes. - The state of the new controller is not updatable from the outside. This affected BackupController, which dumps state from NetworkController (among other controllers), but also loads the same state into NetworkController on import. A method `loadBackup` has been added to NetworkController to facilitate this use case, and BackupController is now using this method instead of attempting to call `update` on NetworkController. - The new controller does not have a `getCurrentChainId` method; instead, the chain ID can be read from the provider config in state. This affected MmiController. (MmiController was also updated to read custom networks from the new network controller instead of the preferences controller). - The default network that the new controller is set to is always Mainnet (previously it could be either localhost or Goerli in test mode, depending on environment variables). This has been addressed by feeding the NetworkController initial state using the old logic, so this should not apply.
252 lines
6.9 KiB
JavaScript
252 lines
6.9 KiB
JavaScript
import { strict as assert } from 'assert';
|
|
import sinon from 'sinon';
|
|
import BackupController from './backup';
|
|
|
|
function getMockPreferencesController() {
|
|
const mcState = {
|
|
getSelectedAddress: sinon.stub().returns('0x01'),
|
|
selectedAddress: '0x01',
|
|
identities: {
|
|
'0x295e26495CEF6F69dFA69911d9D8e4F3bBadB89B': {
|
|
address: '0x295e26495CEF6F69dFA69911d9D8e4F3bBadB89B',
|
|
lastSelected: 1655380342907,
|
|
name: 'Account 3',
|
|
},
|
|
},
|
|
lostIdentities: {
|
|
'0xfd59bbe569376e3d3e4430297c3c69ea93f77435': {
|
|
address: '0xfd59bbe569376e3d3e4430297c3c69ea93f77435',
|
|
lastSelected: 1655379648197,
|
|
name: 'Ledger 1',
|
|
},
|
|
},
|
|
update: (store) => (mcState.store = store),
|
|
};
|
|
|
|
mcState.store = {
|
|
getState: sinon.stub().returns(mcState),
|
|
updateState: (store) => (mcState.store = store),
|
|
};
|
|
|
|
return mcState;
|
|
}
|
|
|
|
function getMockAddressBookController() {
|
|
const mcState = {
|
|
addressBook: {
|
|
'0x61': {
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06': {
|
|
address: '0x42EB768f2244C8811C63729A21A3569731535f06',
|
|
chainId: '0x61',
|
|
isEns: false,
|
|
memo: '',
|
|
name: '',
|
|
},
|
|
},
|
|
},
|
|
|
|
update: (store) => (mcState.store = store),
|
|
};
|
|
|
|
mcState.store = {
|
|
getState: sinon.stub().returns(mcState),
|
|
updateState: (store) => (mcState.store = store),
|
|
};
|
|
|
|
return mcState;
|
|
}
|
|
|
|
function getMockNetworkController() {
|
|
const state = {
|
|
networkConfigurations: {},
|
|
};
|
|
|
|
const loadBackup = ({ networkConfigurations }) => {
|
|
Object.assign(state, { networkConfigurations });
|
|
};
|
|
|
|
return { state, loadBackup };
|
|
}
|
|
|
|
const jsonData = JSON.stringify({
|
|
addressBook: {
|
|
addressBook: {
|
|
'0x61': {
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06': {
|
|
address: '0x42EB768f2244C8811C63729A21A3569731535f06',
|
|
chainId: '0x61',
|
|
isEns: false,
|
|
memo: '',
|
|
name: '',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
network: {
|
|
networkConfigurations: {
|
|
'network-configuration-id-1': {
|
|
chainId: '0x539',
|
|
nickname: 'Localhost 8545',
|
|
rpcPrefs: {},
|
|
rpcUrl: 'http://localhost:8545',
|
|
ticker: 'ETH',
|
|
},
|
|
'network-configuration-id-2': {
|
|
chainId: '0x38',
|
|
nickname: 'Binance Smart Chain Mainnet',
|
|
rpcPrefs: {
|
|
blockExplorerUrl: 'https://bscscan.com',
|
|
},
|
|
rpcUrl: 'https://bsc-dataseed1.binance.org',
|
|
ticker: 'BNB',
|
|
},
|
|
'network-configuration-id-3': {
|
|
chainId: '0x61',
|
|
nickname: 'Binance Smart Chain Testnet',
|
|
rpcPrefs: {
|
|
blockExplorerUrl: 'https://testnet.bscscan.com',
|
|
},
|
|
rpcUrl: 'https://data-seed-prebsc-1-s1.binance.org:8545',
|
|
ticker: 'tBNB',
|
|
},
|
|
'network-configuration-id-4': {
|
|
chainId: '0x89',
|
|
nickname: 'Polygon Mainnet',
|
|
rpcPrefs: {
|
|
blockExplorerUrl: 'https://polygonscan.com',
|
|
},
|
|
rpcUrl: 'https://polygon-rpc.com',
|
|
ticker: 'MATIC',
|
|
},
|
|
},
|
|
},
|
|
preferences: {
|
|
useBlockie: false,
|
|
useNonceField: false,
|
|
usePhishDetect: true,
|
|
dismissSeedBackUpReminder: false,
|
|
useTokenDetection: false,
|
|
useCollectibleDetection: false,
|
|
openSeaEnabled: false,
|
|
advancedGasFee: null,
|
|
featureFlags: {
|
|
sendHexData: true,
|
|
showIncomingTransactions: true,
|
|
},
|
|
knownMethodData: {},
|
|
currentLocale: 'en',
|
|
forgottenPassword: false,
|
|
preferences: {
|
|
hideZeroBalanceTokens: false,
|
|
showFiatInTestnets: false,
|
|
showTestNetworks: true,
|
|
useNativeCurrencyAsPrimaryCurrency: true,
|
|
},
|
|
ipfsGateway: 'dweb.link',
|
|
infuraBlocked: false,
|
|
ledgerTransportType: 'webhid',
|
|
theme: 'light',
|
|
customNetworkListEnabled: false,
|
|
textDirection: 'auto',
|
|
},
|
|
});
|
|
|
|
describe('BackupController', function () {
|
|
const getBackupController = () => {
|
|
return new BackupController({
|
|
preferencesController: getMockPreferencesController(),
|
|
addressBookController: getMockAddressBookController(),
|
|
networkController: getMockNetworkController(),
|
|
trackMetaMetricsEvent: sinon.stub(),
|
|
});
|
|
};
|
|
|
|
describe('constructor', function () {
|
|
it('should setup correctly', async function () {
|
|
const backupController = getBackupController();
|
|
const selectedAddress =
|
|
backupController.preferencesController.getSelectedAddress();
|
|
assert.equal(selectedAddress, '0x01');
|
|
});
|
|
|
|
it('should restore backup', async function () {
|
|
const backupController = getBackupController();
|
|
await backupController.restoreUserData(jsonData);
|
|
// check networks backup
|
|
assert.equal(
|
|
backupController.networkController.state.networkConfigurations[
|
|
'network-configuration-id-1'
|
|
].chainId,
|
|
'0x539',
|
|
);
|
|
assert.equal(
|
|
backupController.networkController.state.networkConfigurations[
|
|
'network-configuration-id-2'
|
|
].chainId,
|
|
'0x38',
|
|
);
|
|
assert.equal(
|
|
backupController.networkController.state.networkConfigurations[
|
|
'network-configuration-id-3'
|
|
].chainId,
|
|
'0x61',
|
|
);
|
|
assert.equal(
|
|
backupController.networkController.state.networkConfigurations[
|
|
'network-configuration-id-4'
|
|
].chainId,
|
|
'0x89',
|
|
);
|
|
// make sure identities are not lost after restore
|
|
assert.equal(
|
|
backupController.preferencesController.store.identities[
|
|
'0x295e26495CEF6F69dFA69911d9D8e4F3bBadB89B'
|
|
].lastSelected,
|
|
1655380342907,
|
|
);
|
|
assert.equal(
|
|
backupController.preferencesController.store.identities[
|
|
'0x295e26495CEF6F69dFA69911d9D8e4F3bBadB89B'
|
|
].name,
|
|
'Account 3',
|
|
);
|
|
assert.equal(
|
|
backupController.preferencesController.store.lostIdentities[
|
|
'0xfd59bbe569376e3d3e4430297c3c69ea93f77435'
|
|
].lastSelected,
|
|
1655379648197,
|
|
);
|
|
assert.equal(
|
|
backupController.preferencesController.store.lostIdentities[
|
|
'0xfd59bbe569376e3d3e4430297c3c69ea93f77435'
|
|
].name,
|
|
'Ledger 1',
|
|
);
|
|
// make sure selected address is not lost after restore
|
|
assert.equal(
|
|
backupController.preferencesController.store.selectedAddress,
|
|
'0x01',
|
|
);
|
|
// check address book backup
|
|
assert.equal(
|
|
backupController.addressBookController.store.addressBook['0x61'][
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06'
|
|
].chainId,
|
|
'0x61',
|
|
);
|
|
assert.equal(
|
|
backupController.addressBookController.store.addressBook['0x61'][
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06'
|
|
].address,
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06',
|
|
);
|
|
assert.equal(
|
|
backupController.addressBookController.store.addressBook['0x61'][
|
|
'0x42EB768f2244C8811C63729A21A3569731535f06'
|
|
].isEns,
|
|
false,
|
|
);
|
|
});
|
|
});
|
|
});
|