Skip to content

Commit 60385bd

Browse files
committed
Merge remote-tracking branch 'origin/main' into refactor/5477/v5-compat
2 parents 95d2990 + 35c98db commit 60385bd

File tree

17 files changed

+110
-34
lines changed

17 files changed

+110
-34
lines changed

app/scripts/controller-init/messengers/snaps/snap-controller-messenger.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ import { NetworkControllerGetNetworkClientByIdAction } from '@metamask/network-c
4444
import { PreferencesControllerGetStateAction } from '../../../controllers/preferences-controller';
4545
import { MetaMetricsControllerTrackEventAction } from '../../../controllers/metametrics-controller';
4646
import { RootMessenger } from '../../../lib/messenger';
47+
import {
48+
OnboardingControllerGetStateAction,
49+
OnboardingControllerStateChangeEvent,
50+
} from '../../../controllers/onboarding';
4751

4852
type Actions =
4953
| GetEndowments
@@ -148,9 +152,13 @@ type InitActions =
148152
| KeyringControllerGetKeyringsByTypeAction
149153
| PreferencesControllerGetStateAction
150154
| MetaMetricsControllerTrackEventAction
151-
| SetClientActive;
155+
| SetClientActive
156+
| OnboardingControllerGetStateAction;
152157

153-
type InitEvents = KeyringControllerUnlockEvent | KeyringControllerLockEvent;
158+
type InitEvents =
159+
| KeyringControllerUnlockEvent
160+
| KeyringControllerLockEvent
161+
| OnboardingControllerStateChangeEvent;
154162

155163
export type SnapControllerInitMessenger = ReturnType<
156164
typeof getSnapControllerInitMessenger
@@ -182,8 +190,13 @@ export function getSnapControllerInitMessenger(
182190
'PreferencesController:getState',
183191
'MetaMetricsController:trackEvent',
184192
'SnapController:setClientActive',
193+
'OnboardingController:getState',
194+
],
195+
events: [
196+
'KeyringController:lock',
197+
'KeyringController:unlock',
198+
'OnboardingController:stateChange',
185199
],
186-
events: ['KeyringController:lock', 'KeyringController:unlock'],
187200
});
188201
return controllerInitMessenger;
189202
}

app/scripts/controller-init/snaps/snap-controller-init.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ describe('SnapControllerInit', () => {
6868
getMnemonicSeed: expect.any(Function),
6969
preinstalledSnaps: expect.any(Array),
7070
trackEvent: expect.any(Function),
71+
ensureOnboardingComplete: expect.any(Function),
7172
});
7273
});
7374

app/scripts/controller-init/snaps/snap-controller-init.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { SnapController } from '@metamask/snaps-controllers';
2-
import { hasProperty, Json } from '@metamask/utils';
2+
import { createDeferredPromise, hasProperty, Json } from '@metamask/utils';
33
import { ControllerInitFunction } from '../types';
44
import {
55
EndowmentPermissions,
@@ -13,6 +13,7 @@ import {
1313
SnapControllerMessenger,
1414
} from '../messengers/snaps';
1515
import { getBooleanFlag } from '../../lib/util';
16+
import { OnboardingControllerState } from '../../controllers/onboarding';
1617

1718
// Copied from `@metamask/snaps-controllers`, since it is not exported.
1819
type TrackingEventPayload = {
@@ -93,6 +94,34 @@ export const SnapControllerInit: ControllerInitFunction<
9394
};
9495
}
9596

97+
/**
98+
* Async function that resolves when onboarding has been completed.
99+
*
100+
* @returns A promise that resolves when onboarding is complete.
101+
*/
102+
async function ensureOnboardingComplete() {
103+
const { completedOnboarding } = initMessenger.call(
104+
'OnboardingController:getState',
105+
);
106+
107+
if (completedOnboarding) {
108+
return;
109+
}
110+
111+
const { promise, resolve } = createDeferredPromise();
112+
113+
const listener = (state: OnboardingControllerState) => {
114+
if (state.completedOnboarding) {
115+
resolve();
116+
initMessenger.unsubscribe('OnboardingController:stateChange', listener);
117+
}
118+
};
119+
120+
initMessenger.subscribe('OnboardingController:stateChange', listener);
121+
122+
await promise;
123+
}
124+
96125
const controller = new SnapController({
97126
environmentEndowmentPermissions: Object.values(EndowmentPermissions),
98127
excludedPermissions: {
@@ -131,6 +160,8 @@ export const SnapControllerInit: ControllerInitFunction<
131160
preinstalledSnaps,
132161
getFeatureFlags,
133162

163+
ensureOnboardingComplete,
164+
134165
// `TrackEventHook` from `snaps-controllers` uses `Json | undefined` for
135166
// properties, but `MetaMetricsEventPayload` uses `Json`, even though
136167
// `undefined` is supported.

app/scripts/controller-init/snaps/snaps-registry-init.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ function getInitRequestMock(): jest.Mocked<
2525
}
2626

2727
describe('SnapsRegistryInit', () => {
28+
const metamaskVersion = process.env.METAMASK_VERSION;
29+
beforeAll(() => {
30+
process.env.METAMASK_VERSION = '13.9.0-flask.0';
31+
});
32+
33+
afterAll(() => {
34+
process.env.METAMASK_VERSION = metamaskVersion;
35+
});
36+
2837
it('initializes the controller', () => {
2938
const { controller } = SnapsRegistryInit(getInitRequestMock());
3039
expect(controller).toBeInstanceOf(JsonSnapsRegistry);
@@ -38,6 +47,10 @@ describe('SnapsRegistryInit', () => {
3847
messenger: expect.any(Object),
3948
state: undefined,
4049
refetchOnAllowlistMiss: false,
50+
clientConfig: {
51+
type: 'extension',
52+
version: '13.9.0',
53+
},
4154
});
4255
});
4356
});

app/scripts/controller-init/snaps/snaps-registry-init.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { JsonSnapsRegistry } from '@metamask/snaps-controllers';
2+
import { SemVerVersion } from '@metamask/utils';
3+
import { parse } from 'semver';
24
import { ControllerInitFunction } from '../types';
35
import { SnapsRegistryMessenger } from '../messengers/snaps';
46
import { getBooleanFlag } from '../../lib/util';
@@ -17,13 +19,26 @@ export const SnapsRegistryInit: ControllerInitFunction<
1719
> = ({ controllerMessenger, persistedState }) => {
1820
const requireAllowlist = getBooleanFlag(process.env.REQUIRE_SNAPS_ALLOWLIST);
1921

22+
const originalVersion = process.env.METAMASK_VERSION;
23+
const parsedVersion = parse(originalVersion);
24+
// Strip prerelease versions as they just indicate build types.
25+
const version = (
26+
parsedVersion
27+
? `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}`
28+
: originalVersion
29+
) as SemVerVersion;
30+
2031
const controller = new JsonSnapsRegistry({
2132
// @ts-expect-error: `persistedState.SnapsRegistry` is not compatible
2233
// with the expected type.
2334
// TODO: Look into the type mismatch.
2435
state: persistedState.SnapsRegistry,
2536
messenger: controllerMessenger,
2637
refetchOnAllowlistMiss: requireAllowlist,
38+
clientConfig: {
39+
type: 'extension',
40+
version,
41+
},
2742
});
2843

2944
return {

lavamoat/browserify/beta/policy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@
19571957
"@metamask/snaps-utils": true,
19581958
"@metamask/superstruct": true,
19591959
"@metamask/utils": true,
1960-
"@noble/hashes": true
1960+
"@noble/hashes": true,
1961+
"@metamask/eth-qr-keyring>async-mutex": true
19611962
}
19621963
},
19631964
"@metamask/snaps-sdk": {

lavamoat/browserify/experimental/policy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@
19571957
"@metamask/snaps-utils": true,
19581958
"@metamask/superstruct": true,
19591959
"@metamask/utils": true,
1960-
"@noble/hashes": true
1960+
"@noble/hashes": true,
1961+
"@metamask/eth-qr-keyring>async-mutex": true
19611962
}
19621963
},
19631964
"@metamask/snaps-sdk": {

lavamoat/browserify/flask/policy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@
19571957
"@metamask/snaps-utils": true,
19581958
"@metamask/superstruct": true,
19591959
"@metamask/utils": true,
1960-
"@noble/hashes": true
1960+
"@noble/hashes": true,
1961+
"@metamask/eth-qr-keyring>async-mutex": true
19611962
}
19621963
},
19631964
"@metamask/snaps-sdk": {

lavamoat/browserify/main/policy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@
19571957
"@metamask/snaps-utils": true,
19581958
"@metamask/superstruct": true,
19591959
"@metamask/utils": true,
1960-
"@noble/hashes": true
1960+
"@noble/hashes": true,
1961+
"@metamask/eth-qr-keyring>async-mutex": true
19611962
}
19621963
},
19631964
"@metamask/snaps-sdk": {

lavamoat/webpack/mv2/policy.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2017,7 +2017,8 @@
20172017
"@metamask/snaps-utils": true,
20182018
"@metamask/superstruct": true,
20192019
"@metamask/utils": true,
2020-
"@noble/hashes": true
2020+
"@noble/hashes": true,
2021+
"@metamask/eth-qr-keyring>async-mutex": true
20212022
}
20222023
},
20232024
"@metamask/snaps-sdk": {

0 commit comments

Comments
 (0)