Skip to content

Commit

Permalink
Store chain ID and network client ID in metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewwalsh0 committed Oct 17, 2024
1 parent 8fb04fc commit 6d497e3
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 42 deletions.
4 changes: 3 additions & 1 deletion packages/signature-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"@metamask/auto-changelog": "^3.4.4",
"@metamask/keyring-controller": "^17.2.2",
"@metamask/logging-controller": "^6.0.1",
"@metamask/network-controller": "^21.0.1",
"@types/jest": "^27.4.1",
"deepmerge": "^4.2.2",
"jest": "^27.5.1",
Expand All @@ -71,7 +72,8 @@
"peerDependencies": {
"@metamask/approval-controller": "^7.0.0",
"@metamask/keyring-controller": "^17.0.0",
"@metamask/logging-controller": "^6.0.0"
"@metamask/logging-controller": "^6.0.0",
"@metamask/network-controller": "^21.0.1"
},
"engines": {
"node": "^18.18 || >=20"
Expand Down
81 changes: 57 additions & 24 deletions packages/signature-controller/src/SignatureController.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ import type {
SignatureControllerState,
} from './SignatureController';
import { SignatureController } from './SignatureController';
import type { MessageParamsPersonal, SignatureRequest } from './types';
import type {
MessageParamsPersonal,
OriginalRequest,
SignatureRequest,
} from './types';
import { SignatureRequestStatus, SignatureRequestType } from './types';
import {
normalizePersonalMessageParams,
Expand All @@ -29,6 +33,7 @@ jest.mock('@metamask/controller-utils', () => ({

const ID_MOCK = '123-456';
const CHAIN_ID_MOCK = '0x1';
const NETWORK_CLIENT_ID_MOCK = 'testNetworkClientId';
const FROM_MOCK = '0x456DEF';
const DATA_MOCK = '0xABC123';
const SIGNATURE_HASH_MOCK = '0x123ABC';
Expand All @@ -40,9 +45,15 @@ const PARAMS_MOCK = {
data: DATA_MOCK,
};

const REQUEST_MOCK = {
networkClientId: NETWORK_CLIENT_ID_MOCK,
};

const SIGNATURE_REQUEST_MOCK: SignatureRequest = {
chainId: CHAIN_ID_MOCK,
id: ID_MOCK,
messageParams: PARAMS_MOCK,
networkClientId: NETWORK_CLIENT_ID_MOCK,
status: SignatureRequestStatus.Signed,
time: Date.now(),
type: SignatureRequestType.PersonalSign,
Expand All @@ -57,6 +68,7 @@ function createMessengerMock() {
const approvalControllerAddRequestMock = jest.fn();
const keyringControllerSignPersonalMessageMock = jest.fn();
const keyringControllerSignTypedMessageMock = jest.fn();
const networkControllerGetNetworkClientByIdMock = jest.fn();

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const callMock = (method: string, ...args: any[]) => {
Expand All @@ -69,6 +81,8 @@ function createMessengerMock() {
return keyringControllerSignPersonalMessageMock(...args);
case 'KeyringController:signTypedMessage':
return keyringControllerSignTypedMessageMock(...args);
case 'NetworkController:getNetworkClientById':
return networkControllerGetNetworkClientByIdMock(...args);
default:
throw new Error(`Messenger method not recognised: ${method}`);
}
Expand All @@ -84,6 +98,12 @@ function createMessengerMock() {
approvalControllerAddRequestMock.mockResolvedValue({});
loggingControllerAddMock.mockResolvedValue({});

networkControllerGetNetworkClientByIdMock.mockReturnValue({
configuration: {
chainId: CHAIN_ID_MOCK,
},
});

return {
approvalControllerAddRequestMock,
keyringControllerSignPersonalMessageMock,
Expand Down Expand Up @@ -327,13 +347,13 @@ describe('SignatureController', () => {
describe.each([
[
'newUnsignedPersonalMessage',
(controller: SignatureController, request = {}) =>
(controller: SignatureController, request: OriginalRequest) =>
controller.newUnsignedPersonalMessage({ ...PARAMS_MOCK }, request),
SignatureRequestType.PersonalSign,
],
[
'newUnsignedTypedMessage',
(controller: SignatureController, request = {}) =>
(controller: SignatureController, request: OriginalRequest) =>
controller.newUnsignedTypedMessage(
PARAMS_MOCK,
request,
Expand All @@ -352,7 +372,7 @@ describe('SignatureController', () => {
approvalControllerAddRequestMock.mockRejectedValueOnce(error);

await expect(
controller.newUnsignedPersonalMessage({ ...PARAMS_MOCK }, {}),
controller.newUnsignedPersonalMessage({ ...PARAMS_MOCK }, REQUEST_MOCK),
).rejects.toMatchObject({
message: ERROR_MESSAGE_MOCK,
code: ERROR_CODE_MOCK,
Expand Down Expand Up @@ -383,7 +403,7 @@ describe('SignatureController', () => {
SIGNATURE_HASH_MOCK,
);

await fn(controller);
await fn(controller, REQUEST_MOCK);

expect(resultCallbackSuccessMock).toHaveBeenCalledTimes(1);
expect(resultCallbackSuccessMock).toHaveBeenCalledWith(
Expand All @@ -398,7 +418,7 @@ describe('SignatureController', () => {

controller.hub.on(`${ID_MOCK}:finished`, listener);

await fn(controller);
await fn(controller, REQUEST_MOCK);

const state = controller.state.signatureRequests[ID_MOCK];

Expand All @@ -418,7 +438,7 @@ describe('SignatureController', () => {

approvalControllerAddRequestMock.mockRejectedValueOnce(errorMock);

await fn(controller).catch(() => {
await fn(controller, REQUEST_MOCK).catch(() => {
// Ignore error
});

Expand All @@ -431,7 +451,7 @@ describe('SignatureController', () => {
it('adds logs to logging controller if approved', async () => {
const { controller, loggingControllerAddMock } = createController();

await fn(controller);
await fn(controller, REQUEST_MOCK);

expect(loggingControllerAddMock).toHaveBeenCalledTimes(2);

Expand Down Expand Up @@ -465,7 +485,7 @@ describe('SignatureController', () => {

approvalControllerAddRequestMock.mockRejectedValueOnce(errorMock);

await expect(fn(controller)).rejects.toThrow(errorMock);
await expect(fn(controller, REQUEST_MOCK)).rejects.toThrow(errorMock);

expect(loggingControllerAddMock).toHaveBeenCalledTimes(2);

Expand All @@ -491,7 +511,7 @@ describe('SignatureController', () => {
it('populates origin from request', async () => {
const { controller } = createController();

await fn(controller, { origin: 'test' });
await fn(controller, { ...REQUEST_MOCK, origin: 'test' });

expect(
controller.state.signatureRequests[ID_MOCK].messageParams.origin,
Expand All @@ -501,11 +521,19 @@ describe('SignatureController', () => {
it('populates request ID from request', async () => {
const { controller } = createController();

await fn(controller, { id: 'test' });
await fn(controller, { ...REQUEST_MOCK, id: 123 });

expect(
controller.state.signatureRequests[ID_MOCK].messageParams.requestId,
).toBe('test');
).toBe(123);
});

it('throws if no network client ID in request', async () => {
const { controller } = createController();

await expect(fn(controller, {} as OriginalRequest)).rejects.toThrow(
'Network client ID not found in request',
);
});

it('emits unapproved message event', async () => {
Expand All @@ -515,7 +543,7 @@ describe('SignatureController', () => {

controller.hub.on('unapprovedMessage', listener);

await fn(controller);
await fn(controller, REQUEST_MOCK);

expect(listener).toHaveBeenCalledTimes(1);
expect(listener).toHaveBeenCalledWith({
Expand Down Expand Up @@ -543,7 +571,7 @@ describe('SignatureController', () => {

controller.hub.on(`${type}:signed`, listener);

await fn(controller);
await fn(controller, REQUEST_MOCK);

expect(listener).toHaveBeenCalledTimes(1);
expect(listener).toHaveBeenCalledWith({
Expand All @@ -568,7 +596,7 @@ describe('SignatureController', () => {
keyringControllerSignPersonalMessageMock.mockRejectedValueOnce(errorMock);
keyringControllerSignTypedMessageMock.mockRejectedValueOnce(errorMock);

await fn(controller).catch(() => {
await fn(controller, REQUEST_MOCK).catch(() => {
// Ignore error
});

Expand Down Expand Up @@ -599,7 +627,9 @@ describe('SignatureController', () => {
keyringControllerSignPersonalMessageMock.mockRejectedValueOnce(errorMock);
keyringControllerSignTypedMessageMock.mockRejectedValueOnce(errorMock);

await expect(fn(controller)).rejects.toThrow(ERROR_MESSAGE_MOCK);
await expect(fn(controller, REQUEST_MOCK)).rejects.toThrow(
ERROR_MESSAGE_MOCK,
);

expect(resultCallbackErrorMock).toHaveBeenCalledTimes(1);
expect(resultCallbackErrorMock).toHaveBeenCalledWith(errorMock);
Expand All @@ -617,7 +647,7 @@ describe('SignatureController', () => {

const result = await controller.newUnsignedPersonalMessage(
{ ...PARAMS_MOCK },
{},
REQUEST_MOCK,
);

expect(result).toBe(SIGNATURE_HASH_MOCK);
Expand All @@ -633,7 +663,10 @@ describe('SignatureController', () => {

detectSIWEMock.mockReturnValueOnce(siweMock);

await controller.newUnsignedPersonalMessage({ ...PARAMS_MOCK }, {});
await controller.newUnsignedPersonalMessage(
{ ...PARAMS_MOCK },
REQUEST_MOCK,
);

const messageParams = controller.state.signatureRequests[ID_MOCK]
.messageParams as MessageParamsPersonal;
Expand All @@ -653,7 +686,7 @@ describe('SignatureController', () => {

const result = await controller.newUnsignedTypedMessage(
PARAMS_MOCK,
{},
REQUEST_MOCK,
SignTypedDataVersion.V1,
{ parseJsonData: false },
);
Expand All @@ -676,7 +709,7 @@ describe('SignatureController', () => {
...PARAMS_MOCK,
data: JSON.stringify({ test: 123 }),
},
{},
REQUEST_MOCK,
version as SignTypedDataVersion,
{ parseJsonData: true },
);
Expand Down Expand Up @@ -706,7 +739,7 @@ describe('SignatureController', () => {
...PARAMS_MOCK,
data: JSON.stringify({ test: 123 }),
},
{},
REQUEST_MOCK,
SignTypedDataVersion.V1,
{ parseJsonData: true },
);
Expand All @@ -733,7 +766,7 @@ describe('SignatureController', () => {
await expect(
controller.newUnsignedTypedMessage(
PARAMS_MOCK,
{},
REQUEST_MOCK,
SignTypedDataVersion.V3,
{ parseJsonData: false },
),
Expand Down Expand Up @@ -782,7 +815,7 @@ describe('SignatureController', () => {
...PARAMS_MOCK,
deferSetAsSigned: true,
},
{},
REQUEST_MOCK,
)
.then((result) => {
resolved = true;
Expand Down Expand Up @@ -860,7 +893,7 @@ describe('SignatureController', () => {
...PARAMS_MOCK,
deferSetAsSigned: true,
},
{},
REQUEST_MOCK,
)
.catch((error) => {
rejectedError = error;
Expand Down
Loading

0 comments on commit 6d497e3

Please sign in to comment.