mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-23 10:30:04 +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.
80 lines
2.4 KiB
JavaScript
80 lines
2.4 KiB
JavaScript
import { prependZero } from '../../../shared/modules/string-utils';
|
|
|
|
export default class BackupController {
|
|
constructor(opts = {}) {
|
|
const {
|
|
preferencesController,
|
|
addressBookController,
|
|
networkController,
|
|
trackMetaMetricsEvent,
|
|
} = opts;
|
|
|
|
this.preferencesController = preferencesController;
|
|
this.addressBookController = addressBookController;
|
|
this.networkController = networkController;
|
|
this._trackMetaMetricsEvent = trackMetaMetricsEvent;
|
|
}
|
|
|
|
async restoreUserData(jsonString) {
|
|
const existingPreferences = this.preferencesController.store.getState();
|
|
const { preferences, addressBook, network } = JSON.parse(jsonString);
|
|
if (preferences) {
|
|
preferences.identities = existingPreferences.identities;
|
|
preferences.lostIdentities = existingPreferences.lostIdentities;
|
|
preferences.selectedAddress = existingPreferences.selectedAddress;
|
|
|
|
this.preferencesController.store.updateState(preferences);
|
|
}
|
|
|
|
if (addressBook) {
|
|
this.addressBookController.update(addressBook, true);
|
|
}
|
|
|
|
if (network) {
|
|
this.networkController.loadBackup(network);
|
|
}
|
|
|
|
if (preferences || addressBook || network) {
|
|
this._trackMetaMetricsEvent({
|
|
event: 'User Data Imported',
|
|
category: 'Backup',
|
|
});
|
|
}
|
|
}
|
|
|
|
async backupUserData() {
|
|
const userData = {
|
|
preferences: { ...this.preferencesController.store.getState() },
|
|
addressBook: { ...this.addressBookController.state },
|
|
network: {
|
|
networkConfigurations:
|
|
this.networkController.state.networkConfigurations,
|
|
},
|
|
};
|
|
|
|
/**
|
|
* We can remove these properties since we will won't be restoring identities from backup
|
|
*/
|
|
delete userData.preferences.identities;
|
|
delete userData.preferences.lostIdentities;
|
|
delete userData.preferences.selectedAddress;
|
|
|
|
const result = JSON.stringify(userData);
|
|
|
|
const date = new Date();
|
|
|
|
const prefixZero = (num) => prependZero(num, 2);
|
|
|
|
/*
|
|
* userData.YYYY_MM_DD_HH_mm_SS e.g userData.2022_01_13_13_45_56
|
|
* */
|
|
const userDataFileName = `MetaMaskUserData.${date.getFullYear()}_${prefixZero(
|
|
date.getMonth() + 1,
|
|
)}_${prefixZero(date.getDay())}_${prefixZero(date.getHours())}_${prefixZero(
|
|
date.getMinutes(),
|
|
)}_${prefixZero(date.getDay())}.json`;
|
|
|
|
return { fileName: userDataFileName, data: result };
|
|
}
|
|
}
|