diff --git a/package.json b/package.json index 82bc308c6e..d8fbd301dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/core-monorepo", - "version": "223.0.0", + "version": "225.0.0", "private": true, "description": "Monorepo for packages shared between MetaMask clients", "repository": { diff --git a/packages/keyring-controller/package.json b/packages/keyring-controller/package.json index 620ee20598..b38c0f9e7c 100644 --- a/packages/keyring-controller/package.json +++ b/packages/keyring-controller/package.json @@ -52,7 +52,7 @@ "@metamask/base-controller": "^7.0.1", "@metamask/browser-passworder": "^4.3.0", "@metamask/eth-hd-keyring": "^7.0.4", - "@metamask/eth-sig-util": "^7.0.1", + "@metamask/eth-sig-util": "^8.0.0", "@metamask/eth-simple-keyring": "^6.0.5", "@metamask/keyring-api": "^8.1.3", "@metamask/message-manager": "^11.0.0", diff --git a/packages/message-manager/package.json b/packages/message-manager/package.json index bd2cfbe416..e4711ed242 100644 --- a/packages/message-manager/package.json +++ b/packages/message-manager/package.json @@ -49,7 +49,7 @@ "dependencies": { "@metamask/base-controller": "^7.0.1", "@metamask/controller-utils": "^11.3.0", - "@metamask/eth-sig-util": "^7.0.1", + "@metamask/eth-sig-util": "^8.0.0", "@metamask/utils": "^9.1.0", "@types/uuid": "^8.3.0", "jsonschema": "^1.2.4", diff --git a/packages/notification-services-controller/CHANGELOG.md b/packages/notification-services-controller/CHANGELOG.md index 0ae2e9bc0c..bb017925bc 100644 --- a/packages/notification-services-controller/CHANGELOG.md +++ b/packages/notification-services-controller/CHANGELOG.md @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.11.0] + +### Added + +- Added support for an optional FCM token parameter for push notifications on mobile platforms, allowing native handling of FCM token creation through the Firebase SDK ([#4823](https://github.com/MetaMask/core/pull/4823)) + +### Changed + +- update the types described in `types/on-chain-notification/schema` and `types/on-chain-notification/on-chain-notification` ([#4818](https://github.com/MetaMask/core/pull/4818)) + + - adds new notifications: aave_v3_health_factor; ens_expiration; lido_staking_rewards; notional_loan_expiration; rocketpool_staking_rewards; spark_fi_health_factor + - splits Wallet Notifications from Web 3 Notifications + +- updated and added new notification mocks ([#4818](https://github.com/MetaMask/core/pull/4818)) + - can be accessed through `@metamask/notification-services-controller/notification-services/mocks` + +### Fixed + +- made `updateMetamaskNotificationsList` function work correctly by making the message handler async and moving the publish call outside of the update function. This ensures the `NotificationServicesController:notificationsListUpdated` event is received by the extension ([#4826](https://github.com/MetaMask/core/pull/4826)) + ## [0.10.0] ### Added @@ -200,7 +220,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release -[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.10.0...HEAD +[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.11.0...HEAD +[0.11.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.10.0...@metamask/notification-services-controller@0.11.0 [0.10.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.9.0...@metamask/notification-services-controller@0.10.0 [0.9.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.8.2...@metamask/notification-services-controller@0.9.0 [0.8.2]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@0.8.1...@metamask/notification-services-controller@0.8.2 diff --git a/packages/notification-services-controller/package.json b/packages/notification-services-controller/package.json index d7380aa849..77ab65da62 100644 --- a/packages/notification-services-controller/package.json +++ b/packages/notification-services-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/notification-services-controller", - "version": "0.10.0", + "version": "0.11.0", "description": "Manages New MetaMask decentralized Notification system", "keywords": [ "MetaMask", diff --git a/packages/notification-services-controller/src/NotificationServicesController/NotificationServicesController.ts b/packages/notification-services-controller/src/NotificationServicesController/NotificationServicesController.ts index 34b65bb136..a9b6c38b81 100644 --- a/packages/notification-services-controller/src/NotificationServicesController/NotificationServicesController.ts +++ b/packages/notification-services-controller/src/NotificationServicesController/NotificationServicesController.ts @@ -577,7 +577,7 @@ export default class NotificationServicesController extends BaseController< #registerMessageHandlers(): void { this.messagingSystem.registerActionHandler( `${controllerName}:updateMetamaskNotificationsList`, - this.updateMetamaskNotificationsList.bind(this), + async (...args) => this.updateMetamaskNotificationsList(...args), ); this.messagingSystem.registerActionHandler( @@ -1375,12 +1375,13 @@ export default class NotificationServicesController extends BaseController< processedNotification, ...state.metamaskNotificationsList, ]; - this.messagingSystem.publish( - `${controllerName}:notificationsListUpdated`, - state.metamaskNotificationsList, - ); } }); + + this.messagingSystem.publish( + `${controllerName}:notificationsListUpdated`, + this.state.metamaskNotificationsList, + ); } } } diff --git a/packages/signature-controller/CHANGELOG.md b/packages/signature-controller/CHANGELOG.md index 23ab9162f3..18ecb23af4 100644 --- a/packages/signature-controller/CHANGELOG.md +++ b/packages/signature-controller/CHANGELOG.md @@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [20.1.0] + +### Added + +- Add additional properties to message parameter types ([#4822](https://github.com/MetaMask/core/pull/4822)) + - Add `metamaskId` to `MessageParams`. + - Add `version` to `MessageParamsTyped`. + +### Changed + +- Update required arguments in methods ([#4822](https://github.com/MetaMask/core/pull/4822)) + - Make `request` argument optional in `newUnsignedPersonalMessage` and `newUnsignedTypedMessage`. + - Make `signingOptions` argument optional in `newUnsignedTypedMessage`. +- Bump `eth-sig-util` from `^7.0.1` to `^8.0.0` ([#4830](https://github.com/MetaMask/core/pull/4830)) +- Bump `@metamask/keyring-controller` from `^17.2.2` to `^17.3.0` ([#4643](https://github.com/MetaMask/core/pull/4643)) + ## [20.0.0] ### Added @@ -363,7 +379,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release ([#1214](https://github.com/MetaMask/core/pull/1214)) -[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@20.0.0...HEAD +[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@20.1.0...HEAD +[20.1.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@20.0.0...@metamask/signature-controller@20.1.0 [20.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@19.1.0...@metamask/signature-controller@20.0.0 [19.1.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@19.0.0...@metamask/signature-controller@19.1.0 [19.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@18.1.0...@metamask/signature-controller@19.0.0 diff --git a/packages/signature-controller/package.json b/packages/signature-controller/package.json index 3475427452..81480a4203 100644 --- a/packages/signature-controller/package.json +++ b/packages/signature-controller/package.json @@ -1,6 +1,6 @@ { "name": "@metamask/signature-controller", - "version": "20.0.0", + "version": "20.1.0", "description": "Processes signing requests in order to sign arbitrary and typed data", "keywords": [ "MetaMask", @@ -49,7 +49,7 @@ "dependencies": { "@metamask/base-controller": "^7.0.1", "@metamask/controller-utils": "^11.3.0", - "@metamask/eth-sig-util": "^7.0.1", + "@metamask/eth-sig-util": "^8.0.0", "@metamask/utils": "^9.1.0", "jsonschema": "^1.2.4", "lodash": "^4.17.21", diff --git a/packages/signature-controller/src/SignatureController.test.ts b/packages/signature-controller/src/SignatureController.test.ts index 2fb84b55d8..a4e8f89e67 100644 --- a/packages/signature-controller/src/SignatureController.test.ts +++ b/packages/signature-controller/src/SignatureController.test.ts @@ -1,5 +1,5 @@ import type { SIWEMessage } from '@metamask/controller-utils'; -import { detectSIWE } from '@metamask/controller-utils'; +import { detectSIWE, ORIGIN_METAMASK } from '@metamask/controller-utils'; import { SignTypedDataVersion } from '@metamask/keyring-controller'; import { LogType, SigningStage } from '@metamask/logging-controller'; import { v1 } from 'uuid'; @@ -11,7 +11,12 @@ import type { SignatureControllerState, } from './SignatureController'; import { SignatureController } from './SignatureController'; -import type { MessageParamsPersonal, SignatureRequest } from './types'; +import type { + MessageParamsPersonal, + MessageParamsTyped, + OriginalRequest, + SignatureRequest, +} from './types'; import { SignatureRequestStatus, SignatureRequestType } from './types'; import { normalizePersonalMessageParams, @@ -34,10 +39,14 @@ const DATA_MOCK = '0xABC123'; const SIGNATURE_HASH_MOCK = '0x123ABC'; const ERROR_MESSAGE_MOCK = 'Test Error Message'; const ERROR_CODE_MOCK = 1234; +const ORIGIN_MOCK = 'testOrigin'; const PARAMS_MOCK = { - from: FROM_MOCK, data: DATA_MOCK, + from: FROM_MOCK, + metamaskId: ID_MOCK, + origin: ORIGIN_MOCK, + version: SignTypedDataVersion.V1, }; const SIGNATURE_REQUEST_MOCK: SignatureRequest = { @@ -327,15 +336,26 @@ describe('SignatureController', () => { describe.each([ [ 'newUnsignedPersonalMessage', - (controller: SignatureController, request = {}) => - controller.newUnsignedPersonalMessage({ ...PARAMS_MOCK }, request), + ( + controller: SignatureController, + request?: OriginalRequest, + params?: Partial, + ) => + controller.newUnsignedPersonalMessage( + { ...PARAMS_MOCK, ...params }, + request, + ), SignatureRequestType.PersonalSign, ], [ 'newUnsignedTypedMessage', - (controller: SignatureController, request = {}) => + ( + controller: SignatureController, + request?: OriginalRequest, + params?: Partial, + ) => controller.newUnsignedTypedMessage( - PARAMS_MOCK, + { ...PARAMS_MOCK, ...params }, request, SignTypedDataVersion.V1, { parseJsonData: false }, @@ -488,7 +508,7 @@ describe('SignatureController', () => { }); }); - it('populates origin from request', async () => { + it('populates origin from request if present', async () => { const { controller } = createController(); await fn(controller, { origin: 'test' }); @@ -498,14 +518,34 @@ describe('SignatureController', () => { ).toBe('test'); }); + it('populates origin from message params if no request', async () => { + const { controller } = createController(); + + await fn(controller); + + expect( + controller.state.signatureRequests[ID_MOCK].messageParams.origin, + ).toBe(ORIGIN_MOCK); + }); + it('populates request ID from request', async () => { const { controller } = createController(); - await fn(controller, { id: 'test' }); + await fn(controller, { id: 123 }); expect( controller.state.signatureRequests[ID_MOCK].messageParams.requestId, - ).toBe('test'); + ).toBe(123); + }); + + it('populates metamask ID using ID', async () => { + const { controller } = createController(); + + await fn(controller); + + expect( + controller.state.signatureRequests[ID_MOCK].messageParams.metamaskId, + ).toBe(ID_MOCK); }); it('emits unapproved message event', async () => { @@ -604,6 +644,50 @@ describe('SignatureController', () => { expect(resultCallbackErrorMock).toHaveBeenCalledTimes(1); expect(resultCallbackErrorMock).toHaveBeenCalledWith(errorMock); }); + + it('requests approval', async () => { + const { controller, approvalControllerAddRequestMock } = + createController(); + + await fn(controller); + + expect(approvalControllerAddRequestMock).toHaveBeenCalledTimes(1); + expect(approvalControllerAddRequestMock).toHaveBeenCalledWith( + { + expectsResult: true, + id: ID_MOCK, + origin: ORIGIN_MOCK, + requestData: expect.objectContaining({ + data: PARAMS_MOCK.data, + from: PARAMS_MOCK.from, + }), + type, + }, + true, + ); + }); + + it('requests approval with internal origin if no origin provided', async () => { + const { controller, approvalControllerAddRequestMock } = + createController(); + + await fn(controller, undefined, { origin: undefined }); + + expect(approvalControllerAddRequestMock).toHaveBeenCalledTimes(1); + expect(approvalControllerAddRequestMock).toHaveBeenCalledWith( + { + expectsResult: true, + id: ID_MOCK, + origin: ORIGIN_METAMASK, + requestData: expect.objectContaining({ + data: PARAMS_MOCK.data, + from: PARAMS_MOCK.from, + }), + type, + }, + true, + ); + }); }); describe('newUnsignedPersonalMessage', () => { @@ -685,6 +769,7 @@ describe('SignatureController', () => { { ...PARAMS_MOCK, data: { test: 123 }, + version, }, version, ); @@ -746,6 +831,24 @@ describe('SignatureController', () => { ERROR_MESSAGE_MOCK, ); }); + + it('populates version in params', async () => { + const { controller } = createController(); + + await controller.newUnsignedTypedMessage( + PARAMS_MOCK, + {}, + SignTypedDataVersion.V3, + { parseJsonData: false }, + ); + + expect( + ( + controller.state.signatureRequests[ID_MOCK] + .messageParams as MessageParamsTyped + ).version, + ).toBe(SignTypedDataVersion.V3); + }); }); describe('setDeferredSignSuccess', () => { diff --git a/packages/signature-controller/src/SignatureController.ts b/packages/signature-controller/src/SignatureController.ts index 6ec64bf6c1..0b6da72927 100644 --- a/packages/signature-controller/src/SignatureController.ts +++ b/packages/signature-controller/src/SignatureController.ts @@ -296,7 +296,7 @@ export class SignatureController extends BaseController< */ async newUnsignedPersonalMessage( messageParams: MessageParamsPersonal, - request: OriginalRequest, + request?: OriginalRequest, options: { traceContext?: TraceContext } = {}, ): Promise { validatePersonalSignatureRequest(messageParams); @@ -330,9 +330,9 @@ export class SignatureController extends BaseController< */ async newUnsignedTypedMessage( messageParams: MessageParamsTyped, - request: OriginalRequest, + request: OriginalRequest | undefined, version: string, - signingOptions: TypedSigningOptions, + signingOptions?: TypedSigningOptions, options: { traceContext?: TraceContext } = {}, ): Promise { validateTypedSignatureRequest( @@ -444,7 +444,7 @@ export class SignatureController extends BaseController< traceContext, }: { messageParams: MessageParams; - request: OriginalRequest; + request?: OriginalRequest; type: SignatureRequestType; approvalType: ApprovalType; version?: SignTypedDataVersion; @@ -539,21 +539,26 @@ export class SignatureController extends BaseController< version, }: { messageParams: MessageParams; - request: OriginalRequest; + request?: OriginalRequest; signingOptions?: TypedSigningOptions; type: SignatureRequestType; version?: SignTypedDataVersion; }): SignatureRequest { + const id = random(); + const origin = request?.origin ?? messageParams.origin; + const requestId = request?.id; + const securityAlertResponse = request?.securityAlertResponse; + const finalMessageParams = { ...messageParams, - origin: request.origin, - requestId: request.id, + metamaskId: id, + origin, + requestId, + version, }; - const { securityAlertResponse } = request; - const metadata = { - id: random(), + id, messageParams: finalMessageParams, securityAlertResponse, signingOptions, diff --git a/packages/signature-controller/src/types.ts b/packages/signature-controller/src/types.ts index 1f59e55594..c295f6d431 100644 --- a/packages/signature-controller/src/types.ts +++ b/packages/signature-controller/src/types.ts @@ -28,6 +28,9 @@ export type MessageParams = { /** Ethereum address to sign with. */ from: string; + /** ID of the associated signature request. */ + metamaskId?: string; + /** * Source of the request. * Such as a hostname of a dApp. @@ -65,6 +68,9 @@ export type MessageParamsTyped = MessageParams & { primaryType: string; message: Json; }; + + /** Version of the signTypedData request. */ + version?: string; }; type SignatureRequestBase = { diff --git a/yarn.lock b/yarn.lock index 893ed6048b..905f9625d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2612,7 +2612,7 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-sig-util@npm:^7.0.1, @metamask/eth-sig-util@npm:^7.0.3": +"@metamask/eth-sig-util@npm:^7.0.3": version: 7.0.3 resolution: "@metamask/eth-sig-util@npm:7.0.3" dependencies: @@ -2626,6 +2626,20 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-sig-util@npm:^8.0.0": + version: 8.0.0 + resolution: "@metamask/eth-sig-util@npm:8.0.0" + dependencies: + "@ethereumjs/util": "npm:^8.1.0" + "@metamask/abi-utils": "npm:^2.0.4" + "@metamask/utils": "npm:^9.0.0" + "@scure/base": "npm:~1.1.3" + ethereum-cryptography: "npm:^2.1.2" + tweetnacl: "npm:^1.0.3" + checksum: 10/5de92bc59df31bcf417ecbdfd2b47f15c21b29454f45108513c55d9c005b7cb51373e9d254bd97533603ab7c7758fdf8fc5159612f366b05f92ebe5beb6d75d8 + languageName: node + linkType: hard + "@metamask/eth-simple-keyring@npm:^6.0.5": version: 6.0.5 resolution: "@metamask/eth-simple-keyring@npm:6.0.5" @@ -2960,7 +2974,7 @@ __metadata: "@metamask/base-controller": "npm:^7.0.1" "@metamask/browser-passworder": "npm:^4.3.0" "@metamask/eth-hd-keyring": "npm:^7.0.4" - "@metamask/eth-sig-util": "npm:^7.0.1" + "@metamask/eth-sig-util": "npm:^8.0.0" "@metamask/eth-simple-keyring": "npm:^6.0.5" "@metamask/keyring-api": "npm:^8.1.3" "@metamask/message-manager": "npm:^11.0.0" @@ -3007,7 +3021,7 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^7.0.1" "@metamask/controller-utils": "npm:^11.3.0" - "@metamask/eth-sig-util": "npm:^7.0.1" + "@metamask/eth-sig-util": "npm:^8.0.0" "@metamask/utils": "npm:^9.1.0" "@types/jest": "npm:^27.4.1" "@types/uuid": "npm:^8.3.0" @@ -3512,7 +3526,7 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^7.0.1" "@metamask/controller-utils": "npm:^11.3.0" - "@metamask/eth-sig-util": "npm:^7.0.1" + "@metamask/eth-sig-util": "npm:^8.0.0" "@metamask/keyring-controller": "npm:^17.3.0" "@metamask/logging-controller": "npm:^6.0.1" "@metamask/utils": "npm:^9.1.0"