Skip to content

Commit 4151089

Browse files
chore: call getPermissions on accountsChanged when using extension (#1185)
* chore: call getPermissions on accountsChanged when using extension * chore: fixes linting * chore: uses await instead of .then and adds coverage
1 parent d647181 commit 4151089

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed

packages/sdk/src/services/MetaMaskSDK/InitializerManager/setupExtensionPreferences.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { TrackingEvents } from '@metamask/sdk-communication-layer';
22
import { MetaMaskSDK } from '../../../sdk';
3+
import { SDKProvider } from '../../../provider/SDKProvider';
34
import { getBrowserExtension } from '../../../utils/get-browser-extension';
5+
import { EXTENSION_EVENTS, RPC_METHODS } from '../../../config';
46
import { setupExtensionPreferences } from './setupExtensionPreferences';
57

68
jest.mock('../../../utils/get-browser-extension');
@@ -81,4 +83,36 @@ describe('setupExtensionPreferences', () => {
8183
event: TrackingEvents.SDK_USE_EXTENSION,
8284
});
8385
});
86+
87+
it('should terminate instance if permissions are revoked', async () => {
88+
const mockTerminate = jest.fn().mockResolvedValue(undefined);
89+
const mockRequest = jest.fn().mockResolvedValue([]);
90+
91+
instance.getProvider = jest.fn().mockReturnValue({
92+
request: mockRequest,
93+
}) as unknown as () => SDKProvider;
94+
95+
instance.terminate = mockTerminate;
96+
instance.extensionActive = true; // Ensure extension is active
97+
98+
const mockBrowserExtension = {
99+
on: jest.fn((event: string, callback: (accounts: string[]) => void) => {
100+
if (event === EXTENSION_EVENTS.ACCOUNTS_CHANGED) {
101+
// Directly call the callback to simulate the event
102+
callback([]);
103+
}
104+
}),
105+
};
106+
107+
(getBrowserExtension as jest.Mock).mockReturnValue(mockBrowserExtension);
108+
109+
await setupExtensionPreferences(instance);
110+
111+
expect(mockRequest).toHaveBeenCalledWith({
112+
method: RPC_METHODS.WALLET_GETPERMISSIONS,
113+
params: [],
114+
});
115+
116+
expect(mockTerminate).toHaveBeenCalled();
117+
});
84118
});

packages/sdk/src/services/MetaMaskSDK/InitializerManager/setupExtensionPreferences.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { TrackingEvents } from '@metamask/sdk-communication-layer';
22
import { logger } from '../../../utils/logger';
33
import { SDKProvider } from '../../../provider/SDKProvider';
4-
import { EXTENSION_EVENTS, STORAGE_PROVIDER_TYPE } from '../../../config';
4+
import {
5+
EXTENSION_EVENTS,
6+
RPC_METHODS,
7+
STORAGE_PROVIDER_TYPE,
8+
} from '../../../config';
59
import { MetaMaskSDK } from '../../../sdk';
610
import { getBrowserExtension } from '../../../utils/get-browser-extension';
711
import { Ethereum } from '../../Ethereum';
@@ -64,7 +68,7 @@ export async function setupExtensionPreferences(instance: MetaMaskSDK) {
6468

6569
metamaskBrowserExtension.on(
6670
EXTENSION_EVENTS.ACCOUNTS_CHANGED,
67-
(accounts) => {
71+
async (accounts) => {
6872
logger(
6973
`[MetaMaskSDK: setupExtensionPreferences()] PROPAGATE accountsChanged accounts=${accounts}`,
7074
);
@@ -80,9 +84,28 @@ export async function setupExtensionPreferences(instance: MetaMaskSDK) {
8084
}
8185

8286
if (isExtensionActive && (accounts as string[])?.length === 0) {
83-
logger(
84-
`[MetaMaskSDK: setupExtensionPreferences()] permissions were revoked on extension or extension was locked`,
85-
);
87+
const getPermissionsResponse = await instance
88+
.getProvider()
89+
?.request({
90+
method: RPC_METHODS.WALLET_GETPERMISSIONS,
91+
params: [],
92+
});
93+
94+
const permissions = getPermissionsResponse as {
95+
caveats: { type: string; value: string[] }[];
96+
parentCapability: string;
97+
}[];
98+
99+
if (permissions.length === 0) {
100+
try {
101+
await instance.terminate();
102+
} catch (error) {
103+
logger(
104+
`[MetaMaskSDK: setupExtensionPreferences()] error terminating on permissions revoked`,
105+
error,
106+
);
107+
}
108+
}
86109
}
87110
},
88111
);

0 commit comments

Comments
 (0)