Skip to content

Commit

Permalink
Merge branch 'main' into fix/error-pending-transaction-alert
Browse files Browse the repository at this point in the history
  • Loading branch information
vinistevam authored Jan 31, 2025
2 parents b30a247 + 014c9dc commit cedc534
Show file tree
Hide file tree
Showing 54 changed files with 1,425 additions and 1,004 deletions.
64 changes: 30 additions & 34 deletions app/scripts/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,12 @@ import {
import { getCurrentChainId } from '../../shared/modules/selectors/networks';
import { addNonceToCsp } from '../../shared/modules/add-nonce-to-csp';
import { checkURLForProviderInjection } from '../../shared/modules/provider-injection';
import { PersistenceManager } from './lib/stores/persistence-manager';
import ExtensionStore from './lib/stores/extension-store';
import ReadOnlyNetworkStore from './lib/stores/read-only-network-store';
import migrations from './migrations';
import Migrator from './lib/migrator';
import ExtensionPlatform from './platforms/extension';
import LocalStore from './lib/local-store';
import ReadOnlyNetworkStore from './lib/network-store';
import { SENTRY_BACKGROUND_STATE } from './constants/sentry-state';

import createStreamSink from './lib/createStreamSink';
Expand All @@ -63,7 +64,6 @@ import NotificationManager, {
import MetamaskController, {
METAMASK_CONTROLLER_EVENTS,
} from './metamask-controller';
import rawFirstTimeState from './first-time-state';
import getFirstPreferredLangCode from './lib/get-first-preferred-lang-code';
import getObjStructure from './lib/getObjStructure';
import setupEnsIpfsResolver from './lib/ens-ipfs/setup';
Expand All @@ -72,8 +72,9 @@ import {
getPlatform,
shouldEmitDappViewedEvent,
} from './lib/util';
import { generateWalletState } from './fixtures/generate-wallet-state';
import { createOffscreen } from './offscreen';
import { generateWalletState } from './fixtures/generate-wallet-state';
import rawFirstTimeState from './first-time-state';

/* eslint-enable import/first */

Expand All @@ -87,9 +88,17 @@ const BADGE_MAX_COUNT = 9;

// Setup global hook for improved Sentry state snapshots during initialization
const inTest = process.env.IN_TEST;
const localStore = inTest ? new ReadOnlyNetworkStore() : new LocalStore();
const migrator = new Migrator({
migrations,
defaultVersion: process.env.WITH_STATE
? FIXTURE_STATE_METADATA_VERSION
: null,
});

const localStore = inTest ? new ReadOnlyNetworkStore() : new ExtensionStore();
const persistenceManager = new PersistenceManager({ localStore });
global.stateHooks.getMostRecentPersistedState = () =>
localStore.mostRecentRetrievedState;
persistenceManager.mostRecentRetrievedState;

const { sentry } = global;
let firstTimeState = { ...rawFirstTimeState };
Expand All @@ -113,11 +122,11 @@ let uiIsTriggering = false;
const openMetamaskTabsIDs = {};
const requestAccountTabIds = {};
let controller;
let versionedData;
const tabOriginMapping = {};

if (inTest || process.env.METAMASK_DEBUG) {
global.stateHooks.metamaskGetState = localStore.get.bind(localStore);
global.stateHooks.metamaskGetState =
persistenceManager.get.bind(persistenceManager);
}

const phishingPageUrl = new URL(process.env.PHISHING_WARNING_PAGE_URL);
Expand Down Expand Up @@ -599,12 +608,6 @@ async function loadPhishingWarningPage() {
*/
export async function loadStateFromPersistence() {
// migrations
const migrator = new Migrator({
migrations,
defaultVersion: process.env.WITH_STATE
? FIXTURE_STATE_METADATA_VERSION
: null,
});
migrator.on('error', console.warn);

if (process.env.WITH_STATE) {
Expand All @@ -614,31 +617,22 @@ export async function loadStateFromPersistence() {

// read from disk
// first from preferred, async API:
versionedData =
(await localStore.get()) || migrator.generateInitialState(firstTimeState);

// check if somehow state is empty
// this should never happen but new error reporting suggests that it has
// for a small number of users
// https://github.com/metamask/metamask-extension/issues/3919
if (versionedData && !versionedData.data) {
// unable to recover, clear state
versionedData = migrator.generateInitialState(firstTimeState);
sentry.captureMessage('MetaMask - Empty vault found - unable to recover');
}
const preMigrationVersionedData =
(await persistenceManager.get()) ||
migrator.generateInitialState(firstTimeState);

// report migration errors to sentry
migrator.on('error', (err) => {
// get vault structure without secrets
const vaultStructure = getObjStructure(versionedData);
const vaultStructure = getObjStructure(preMigrationVersionedData);
sentry.captureException(err, {
// "extra" key is required by Sentry
extra: { vaultStructure },
});
});

// migrate data
versionedData = await migrator.migrateData(versionedData);
const versionedData = await migrator.migrateData(preMigrationVersionedData);
if (!versionedData) {
throw new Error('MetaMask - migrator returned undefined');
} else if (!isObject(versionedData.meta)) {
Expand All @@ -656,10 +650,10 @@ export async function loadStateFromPersistence() {
);
}
// this initializes the meta/version data as a class variable to be used for future writes
localStore.setMetadata(versionedData.meta);
persistenceManager.setMetadata(versionedData.meta);

// write to disk
localStore.set(versionedData.data);
persistenceManager.set(versionedData.data);

// return just the data
return versionedData;
Expand Down Expand Up @@ -821,7 +815,7 @@ export function setupController(
getOpenMetamaskTabsIds: () => {
return openMetamaskTabsIDs;
},
localStore,
persistenceManager,
overrides,
isFirstMetaMaskControllerSetup,
currentMigrationVersion: stateMetadata.version,
Expand All @@ -845,7 +839,7 @@ export function setupController(
storeAsStream(controller.store),
debounce(1000),
createStreamSink(async (state) => {
await localStore.set(state);
await persistenceManager.set(state);
statePersistenceEvents.emit('state-persisted', state);
}),
(error) => {
Expand Down Expand Up @@ -1304,12 +1298,14 @@ const addAppInstalledEvent = () => {

// On first install, open a new tab with MetaMask
async function onInstall() {
const storeAlreadyExisted = Boolean(await localStore.get());
const storeAlreadyExisted = Boolean(await persistenceManager.get());
// If the store doesn't exist, then this is the first time running this script,
// and is therefore an install
if (process.env.IN_TEST) {
addAppInstalledEvent();
} else if (!storeAlreadyExisted && !process.env.METAMASK_DEBUG) {
// If storeAlreadyExisted is true then this is a fresh installation
// and an app installed event should be tracked.
addAppInstalledEvent();
platform.openExtensionInBrowser();
}
Expand Down Expand Up @@ -1358,7 +1354,7 @@ async function initBackground() {
window.document?.documentElement?.classList.add('controller-loaded');
}
}
localStore.cleanUpMostRecentRetrievedState();
persistenceManager.cleanUpMostRecentRetrievedState();
} catch (error) {
log.error(error);
}
Expand Down
139 changes: 0 additions & 139 deletions app/scripts/lib/local-store.js

This file was deleted.

Loading

0 comments on commit cedc534

Please sign in to comment.