@metamask-previews/signature-controller 5.3.0-preview.d32a7cc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,71 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [5.3.0]
10
+ ### Added
11
+ - Add new methods `setDeferredSignSuccess` and `setDeferredSignError` ([#1506](https://github.com/MetaMask/core/pull/1506))
12
+
13
+ ### Changed
14
+ - Update `@metamask/utils` to `^6.2.0` ([#1514](https://github.com/MetaMask/core/pull/1514))
15
+
16
+ ## [5.2.0]
17
+ ### Added
18
+ - Add `messages` getter that returns all messages ([#1469](https://github.com/MetaMask/core/pull/1469))
19
+ - Add `setMessageMetadata` method for customizing the metadata for an individual message ([#1469](https://github.com/MetaMask/core/pull/1469))
20
+
21
+ ## [5.1.0]
22
+ ### Changed
23
+ - Report approval success using result callbacks ([#1458](https://github.com/MetaMask/core/pull/1458))
24
+
25
+ ## [5.0.0]
26
+ ### Added
27
+ - **BREAKING** Add sign version to approval message in Signature Controller ([#1440](https://github.com/MetaMask/core/pull/1440))
28
+ - Method `newUnsignedTypedMessage` on the SignatureController now requires a fourth argument: `signingOpts`
29
+ - Method `signMessage` on the SignatureController no longer expects a `version` as a second argument. The second argument is now `signingOpts` which was previously the third argument.
30
+
31
+ ## [4.0.1]
32
+ ### Fixed
33
+ - Remove optional parameter from newUnsignedTypedMessage function ([#1436](https://github.com/MetaMask/core/pull/1436))
34
+
35
+ ## [4.0.0]
36
+ ### Changed
37
+ - **BREAKING:** `newUnsignedXMessage` middlewares now creates and awaits approvals itself. ([#1377](https://github.com/MetaMask/core/pull/1377))
38
+
39
+ ### Removed
40
+ - **BREAKING:** Removed `cancelXMessage` and `signXMessage` from public API. ([#1377](https://github.com/MetaMask/core/pull/1377))
41
+
42
+ ## [3.0.0]
43
+ ### Added
44
+ - Add support for deferred signing ([#1364](https://github.com/MetaMask/core/pull/1364))
45
+ - If the parameter `deferSetAsSigned` is set, the message won't be set as signed when the keyring is asked to sign it
46
+ - Emit the event `${methodName}:signed` when the keying is asked to sign a message ([#1364](https://github.com/MetaMask/core/pull/1364))
47
+ - Add methods `setTypedMessageInProgress` and `setPersonalMessageInProgress` to set a message status to `inProgress` ([#1339](https://github.com/MetaMask/core/pull/1339))
48
+
49
+ ### Changed
50
+ - **BREAKING:** The constructor option `getCurrentChainId` now expects a `Hex` return value rather than `string` ([#1367](https://github.com/MetaMask/core/pull/1367))
51
+ - **BREAKING:** Update `@metamask/approval-controller` dependency and add it as a peer dependency ([#1393](https://github.com/MetaMask/core/pull/1393))
52
+ - Add `@metamask/utils` dependency ([#1367](https://github.com/MetaMask/core/pull/1367))
53
+
54
+ ## [2.0.0]
55
+ ### Added
56
+ - **BREAKING:** Add `getCurrentChainId` argument to constructor ([#1350](https://github.com/MetaMask/core/pull/1350))
57
+
58
+ ## [1.0.0]
59
+ ### Added
60
+ - Initial release ([#1214](https://github.com/MetaMask/core/pull/1214))
61
+
62
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@5.3.0...HEAD
63
+ [5.3.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@5.2.0...@metamask/signature-controller@5.3.0
64
+ [5.2.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@5.1.0...@metamask/signature-controller@5.2.0
65
+ [5.1.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@5.0.0...@metamask/signature-controller@5.1.0
66
+ [5.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@4.0.1...@metamask/signature-controller@5.0.0
67
+ [4.0.1]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@4.0.0...@metamask/signature-controller@4.0.1
68
+ [4.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@3.0.0...@metamask/signature-controller@4.0.0
69
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@2.0.0...@metamask/signature-controller@3.0.0
70
+ [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/signature-controller@1.0.0...@metamask/signature-controller@2.0.0
71
+ [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/signature-controller@1.0.0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 MetaMask
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # `@metamask/signature-controller`
2
+
3
+ Processes signing requests in order to sign arbitrary or typed data.
4
+
5
+ ## Installation
6
+
7
+ `yarn add @metamask/signature-controller`
8
+
9
+ or
10
+
11
+ `npm install @metamask/signature-controller`
12
+
13
+ ## Contributing
14
+
15
+ This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme).
@@ -0,0 +1,167 @@
1
+ /// <reference types="node" />
2
+ import type { AddApprovalRequest } from '@metamask/approval-controller';
3
+ import type { RestrictedControllerMessenger } from '@metamask/base-controller';
4
+ import { BaseControllerV2 } from '@metamask/base-controller';
5
+ import type { MessageParams, PersonalMessageParams, TypedMessageParams, AbstractMessage, AbstractMessageParams, OriginalRequest, TypedMessage, PersonalMessage, Message } from '@metamask/message-manager';
6
+ import type { Hex, Json } from '@metamask/utils';
7
+ import EventEmitter from 'events';
8
+ import type { Patch } from 'immer';
9
+ declare const controllerName = "SignatureController";
10
+ declare type StateMessage = Required<AbstractMessage> & {
11
+ msgParams: Required<AbstractMessageParams>;
12
+ };
13
+ declare type SignatureControllerState = {
14
+ unapprovedMsgs: Record<string, StateMessage>;
15
+ unapprovedPersonalMsgs: Record<string, StateMessage>;
16
+ unapprovedTypedMessages: Record<string, StateMessage>;
17
+ unapprovedMsgCount: number;
18
+ unapprovedPersonalMsgCount: number;
19
+ unapprovedTypedMessagesCount: number;
20
+ };
21
+ declare type AllowedActions = AddApprovalRequest;
22
+ declare type TypedMessageSigningOptions = {
23
+ parseJsonData: boolean;
24
+ };
25
+ export declare type GetSignatureState = {
26
+ type: `${typeof controllerName}:getState`;
27
+ handler: () => SignatureControllerState;
28
+ };
29
+ export declare type SignatureStateChange = {
30
+ type: `${typeof controllerName}:stateChange`;
31
+ payload: [SignatureControllerState, Patch[]];
32
+ };
33
+ export declare type SignatureControllerActions = GetSignatureState;
34
+ export declare type SignatureControllerEvents = SignatureStateChange;
35
+ export declare type SignatureControllerMessenger = RestrictedControllerMessenger<typeof controllerName, SignatureControllerActions | AllowedActions, SignatureControllerEvents, AllowedActions['type'], never>;
36
+ export interface KeyringController {
37
+ signMessage: (messsageParams: MessageParams) => Promise<string>;
38
+ signPersonalMessage: (messsageParams: PersonalMessageParams) => Promise<string>;
39
+ signTypedMessage: (messsageParams: TypedMessageParams, options: {
40
+ version: string | undefined;
41
+ }) => Promise<string>;
42
+ }
43
+ export declare type SignatureControllerOptions = {
44
+ messenger: SignatureControllerMessenger;
45
+ keyringController: KeyringController;
46
+ isEthSignEnabled: () => boolean;
47
+ getAllState: () => unknown;
48
+ securityProviderRequest?: (requestData: any, methodName: string) => Promise<any>;
49
+ getCurrentChainId: () => Hex;
50
+ };
51
+ /**
52
+ * Controller for creating signing requests requiring user approval.
53
+ */
54
+ export declare class SignatureController extends BaseControllerV2<typeof controllerName, SignatureControllerState, SignatureControllerMessenger> {
55
+ #private;
56
+ hub: EventEmitter;
57
+ /**
58
+ * Construct a Sign controller.
59
+ *
60
+ * @param options - The controller options.
61
+ * @param options.messenger - The restricted controller messenger for the sign controller.
62
+ * @param options.keyringController - An instance of a keyring controller used to perform the signing operations.
63
+ * @param options.isEthSignEnabled - Callback to return true if eth_sign is enabled.
64
+ * @param options.getAllState - Callback to retrieve all user state.
65
+ * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.
66
+ * @param options.getCurrentChainId - A function for retrieving the current chainId.
67
+ */
68
+ constructor({ messenger, keyringController, isEthSignEnabled, getAllState, securityProviderRequest, getCurrentChainId, }: SignatureControllerOptions);
69
+ /**
70
+ * A getter for the number of 'unapproved' Messages in this.messages.
71
+ *
72
+ * @returns The number of 'unapproved' Messages in this.messages
73
+ */
74
+ get unapprovedMsgCount(): number;
75
+ /**
76
+ * A getter for the number of 'unapproved' PersonalMessages in this.messages.
77
+ *
78
+ * @returns The number of 'unapproved' PersonalMessages in this.messages
79
+ */
80
+ get unapprovedPersonalMessagesCount(): number;
81
+ /**
82
+ * A getter for the number of 'unapproved' TypedMessages in this.messages.
83
+ *
84
+ * @returns The number of 'unapproved' TypedMessages in this.messages
85
+ */
86
+ get unapprovedTypedMessagesCount(): number;
87
+ /**
88
+ * A getter for returning all messages.
89
+ *
90
+ * @returns The object containing all messages.
91
+ */
92
+ get messages(): {
93
+ [id: string]: Message | PersonalMessage | TypedMessage;
94
+ };
95
+ /**
96
+ * Reset the controller state to the initial state.
97
+ */
98
+ resetState(): void;
99
+ /**
100
+ * Reject all unapproved messages of any type.
101
+ *
102
+ * @param reason - A message to indicate why.
103
+ */
104
+ rejectUnapproved(reason?: string): void;
105
+ /**
106
+ * Clears all unapproved messages from memory.
107
+ */
108
+ clearUnapproved(): void;
109
+ /**
110
+ * Called when a Dapp uses the eth_sign method, to request user approval.
111
+ * eth_sign is a pure signature of arbitrary data. It is on a deprecation
112
+ * path, since this data can be a transaction, or can leak private key
113
+ * information.
114
+ *
115
+ * @param messageParams - The params passed to eth_sign.
116
+ * @param [req] - The original request, containing the origin.
117
+ * @returns Promise resolving to the raw data of the signature request.
118
+ */
119
+ newUnsignedMessage(messageParams: MessageParams, req: OriginalRequest): Promise<string>;
120
+ /**
121
+ * Called when a dapp uses the personal_sign method.
122
+ * This is identical to the Geth eth_sign method, and may eventually replace
123
+ * eth_sign.
124
+ *
125
+ * We currently define our eth_sign and personal_sign mostly for legacy Dapps.
126
+ *
127
+ * @param messageParams - The params of the message to sign & return to the Dapp.
128
+ * @param req - The original request, containing the origin.
129
+ * @returns Promise resolving to the raw data of the signature request.
130
+ */
131
+ newUnsignedPersonalMessage(messageParams: PersonalMessageParams, req: OriginalRequest): Promise<string>;
132
+ /**
133
+ * Called when a dapp uses the eth_signTypedData method, per EIP 712.
134
+ *
135
+ * @param messageParams - The params passed to eth_signTypedData.
136
+ * @param req - The original request, containing the origin.
137
+ * @param version - The version indicating the format of the typed data.
138
+ * @param signingOpts - An options bag for signing.
139
+ * @param signingOpts.parseJsonData - Whether to parse the JSON before signing.
140
+ * @returns Promise resolving to the raw data of the signature request.
141
+ */
142
+ newUnsignedTypedMessage(messageParams: TypedMessageParams, req: OriginalRequest, version: string, signingOpts: TypedMessageSigningOptions): Promise<string>;
143
+ /**
144
+ * Called to update the message status as signed.
145
+ *
146
+ * @param messageId - The id of the Message to update.
147
+ * @param signature - The data to update the message with.
148
+ */
149
+ setDeferredSignSuccess(messageId: string, signature: any): void;
150
+ /**
151
+ * Called when the message metadata needs to be updated.
152
+ *
153
+ * @param messageId - The id of the message to update.
154
+ * @param metadata - The data to update the metadata property in the message.
155
+ */
156
+ setMessageMetadata(messageId: string, metadata: Json): void;
157
+ /**
158
+ * Called to cancel a signing message.
159
+ *
160
+ * @param messageId - The id of the Message to update.
161
+ */
162
+ setDeferredSignError(messageId: string): void;
163
+ setTypedMessageInProgress(messageId: string): void;
164
+ setPersonalMessageInProgress(messageId: string): void;
165
+ }
166
+ export {};
167
+ //# sourceMappingURL=SignatureController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureController.d.ts","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EACV,aAAa,EAEb,qBAAqB,EAErB,kBAAkB,EAGlB,eAAe,EAEf,qBAAqB,EAErB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,OAAO,EACR,MAAM,2BAA2B,CAAC;AAMnC,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,QAAA,MAAM,cAAc,wBAAwB,CAAC;AAwB7C,aAAK,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG;IAC9C,SAAS,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;CAC5C,CAAC;AAEF,aAAK,wBAAwB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrD,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;IACnC,4BAA4B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,aAAK,cAAc,GAAG,kBAAkB,CAAC;AAEzC,aAAK,0BAA0B,GAAG;IAChC,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC9B,IAAI,EAAE,GAAG,OAAO,cAAc,WAAW,CAAC;IAC1C,OAAO,EAAE,MAAM,wBAAwB,CAAC;CACzC,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,IAAI,EAAE,GAAG,OAAO,cAAc,cAAc,CAAC;IAC7C,OAAO,EAAE,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,CAAC;CAC9C,CAAC;AAEF,oBAAY,0BAA0B,GAAG,iBAAiB,CAAC;AAE3D,oBAAY,yBAAyB,GAAG,oBAAoB,CAAC;AAE7D,oBAAY,4BAA4B,GAAG,6BAA6B,CACtE,OAAO,cAAc,EACrB,0BAA0B,GAAG,cAAc,EAC3C,yBAAyB,EACzB,cAAc,CAAC,MAAM,CAAC,EACtB,KAAK,CACN,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,cAAc,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,mBAAmB,EAAE,CACnB,cAAc,EAAE,qBAAqB,KAClC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,gBAAgB,EAAE,CAChB,cAAc,EAAE,kBAAkB,EAClC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KACrC,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,oBAAY,0BAA0B,GAAG;IACvC,SAAS,EAAE,4BAA4B,CAAC;IACxC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,uBAAuB,CAAC,EAAE,CACxB,WAAW,EAAE,GAAG,EAChB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB,CACvD,OAAO,cAAc,EACrB,wBAAwB,EACxB,4BAA4B,CAC7B;;IACC,GAAG,EAAE,YAAY,CAAC;IAclB;;;;;;;;;;OAUG;gBACS,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,iBAAiB,GAClB,EAAE,0BAA0B;IAkE7B;;;;OAIG;IACH,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED;;;;OAIG;IACH,IAAI,+BAA+B,IAAI,MAAM,CAE5C;IAED;;;;OAIG;IACH,IAAI,4BAA4B,IAAI,MAAM,CAEzC;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,CAAA;KAAE,CAezE;IAED;;OAEG;IACH,UAAU;IAIV;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM;IAMhC;;OAEG;IACH,eAAe;IAMf;;;;;;;;;OASG;IACG,kBAAkB,CACtB,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC;IAYlB;;;;;;;;;;OAUG;IACG,0BAA0B,CAC9B,aAAa,EAAE,qBAAqB,EACpC,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC;IAWlB;;;;;;;;;OASG;IACG,uBAAuB,CAC3B,aAAa,EAAE,kBAAkB,EACjC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,0BAA0B,GACtC,OAAO,CAAC,MAAM,CAAC;IAclB;;;;;OAKG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;IAQxD;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI;IAQpD;;;;OAIG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM;IAItC,yBAAyB,CAAC,SAAS,EAAE,MAAM;IAI3C,4BAA4B,CAAC,SAAS,EAAE,MAAM;CA2a/C"}
@@ -0,0 +1,464 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
12
+ if (kind === "m") throw new TypeError("Private method is not writable");
13
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
14
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
15
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
16
+ };
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
22
+ var __rest = (this && this.__rest) || function (s, e) {
23
+ var t = {};
24
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
25
+ t[p] = s[p];
26
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
27
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
28
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
29
+ t[p[i]] = s[p[i]];
30
+ }
31
+ return t;
32
+ };
33
+ var __importDefault = (this && this.__importDefault) || function (mod) {
34
+ return (mod && mod.__esModule) ? mod : { "default": mod };
35
+ };
36
+ var _SignatureController_instances, _SignatureController_keyringController, _SignatureController_isEthSignEnabled, _SignatureController_getAllState, _SignatureController_messageManager, _SignatureController_personalMessageManager, _SignatureController_typedMessageManager, _SignatureController_validateUnsignedMessage, _SignatureController_newUnsignedAbstractMessage, _SignatureController_signMessage, _SignatureController_signPersonalMessage, _SignatureController_signTypedMessage, _SignatureController_tryForEachMessageManager, _SignatureController_trySetDeferredSignSuccess, _SignatureController_trySetMessageMetadata, _SignatureController_trySetDeferredSignError, _SignatureController_rejectUnapproved, _SignatureController_clearUnapproved, _SignatureController_signAbstractMessage, _SignatureController_errorMessage, _SignatureController_cancelAbstractMessage, _SignatureController_handleMessageManagerEvents, _SignatureController_subscribeToMessageState, _SignatureController_migrateMessages, _SignatureController_migrateMessage, _SignatureController_normalizeMsgData, _SignatureController_getMessage, _SignatureController_requestApproval, _SignatureController_removeJsonData;
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.SignatureController = void 0;
39
+ const base_controller_1 = require("@metamask/base-controller");
40
+ const controller_utils_1 = require("@metamask/controller-utils");
41
+ const message_manager_1 = require("@metamask/message-manager");
42
+ const eth_rpc_errors_1 = require("eth-rpc-errors");
43
+ const ethereumjs_util_1 = require("ethereumjs-util");
44
+ const events_1 = __importDefault(require("events"));
45
+ const lodash_1 = require("lodash");
46
+ const controllerName = 'SignatureController';
47
+ const stateMetadata = {
48
+ unapprovedMsgs: { persist: false, anonymous: false },
49
+ unapprovedPersonalMsgs: { persist: false, anonymous: false },
50
+ unapprovedTypedMessages: { persist: false, anonymous: false },
51
+ unapprovedMsgCount: { persist: false, anonymous: false },
52
+ unapprovedPersonalMsgCount: { persist: false, anonymous: false },
53
+ unapprovedTypedMessagesCount: { persist: false, anonymous: false },
54
+ };
55
+ const getDefaultState = () => ({
56
+ unapprovedMsgs: {},
57
+ unapprovedPersonalMsgs: {},
58
+ unapprovedTypedMessages: {},
59
+ unapprovedMsgCount: 0,
60
+ unapprovedPersonalMsgCount: 0,
61
+ unapprovedTypedMessagesCount: 0,
62
+ });
63
+ /**
64
+ * Controller for creating signing requests requiring user approval.
65
+ */
66
+ class SignatureController extends base_controller_1.BaseControllerV2 {
67
+ /**
68
+ * Construct a Sign controller.
69
+ *
70
+ * @param options - The controller options.
71
+ * @param options.messenger - The restricted controller messenger for the sign controller.
72
+ * @param options.keyringController - An instance of a keyring controller used to perform the signing operations.
73
+ * @param options.isEthSignEnabled - Callback to return true if eth_sign is enabled.
74
+ * @param options.getAllState - Callback to retrieve all user state.
75
+ * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.
76
+ * @param options.getCurrentChainId - A function for retrieving the current chainId.
77
+ */
78
+ constructor({ messenger, keyringController, isEthSignEnabled, getAllState, securityProviderRequest, getCurrentChainId, }) {
79
+ super({
80
+ name: controllerName,
81
+ metadata: stateMetadata,
82
+ messenger,
83
+ state: getDefaultState(),
84
+ });
85
+ _SignatureController_instances.add(this);
86
+ _SignatureController_keyringController.set(this, void 0);
87
+ _SignatureController_isEthSignEnabled.set(this, void 0);
88
+ _SignatureController_getAllState.set(this, void 0);
89
+ _SignatureController_messageManager.set(this, void 0);
90
+ _SignatureController_personalMessageManager.set(this, void 0);
91
+ _SignatureController_typedMessageManager.set(this, void 0);
92
+ __classPrivateFieldSet(this, _SignatureController_keyringController, keyringController, "f");
93
+ __classPrivateFieldSet(this, _SignatureController_isEthSignEnabled, isEthSignEnabled, "f");
94
+ __classPrivateFieldSet(this, _SignatureController_getAllState, getAllState, "f");
95
+ this.hub = new events_1.default();
96
+ __classPrivateFieldSet(this, _SignatureController_messageManager, new message_manager_1.MessageManager(undefined, undefined, securityProviderRequest), "f");
97
+ __classPrivateFieldSet(this, _SignatureController_personalMessageManager, new message_manager_1.PersonalMessageManager(undefined, undefined, securityProviderRequest), "f");
98
+ __classPrivateFieldSet(this, _SignatureController_typedMessageManager, new message_manager_1.TypedMessageManager(undefined, undefined, securityProviderRequest, undefined, getCurrentChainId), "f");
99
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), 'unapprovedMessage');
100
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), 'unapprovedPersonalMessage');
101
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), 'unapprovedTypedMessage');
102
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), (state, newMessages, messageCount) => {
103
+ state.unapprovedMsgs = newMessages;
104
+ state.unapprovedMsgCount = messageCount;
105
+ });
106
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), (state, newMessages, messageCount) => {
107
+ state.unapprovedPersonalMsgs = newMessages;
108
+ state.unapprovedPersonalMsgCount = messageCount;
109
+ });
110
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), (state, newMessages, messageCount) => {
111
+ state.unapprovedTypedMessages = newMessages;
112
+ state.unapprovedTypedMessagesCount = messageCount;
113
+ });
114
+ }
115
+ /**
116
+ * A getter for the number of 'unapproved' Messages in this.messages.
117
+ *
118
+ * @returns The number of 'unapproved' Messages in this.messages
119
+ */
120
+ get unapprovedMsgCount() {
121
+ return __classPrivateFieldGet(this, _SignatureController_messageManager, "f").getUnapprovedMessagesCount();
122
+ }
123
+ /**
124
+ * A getter for the number of 'unapproved' PersonalMessages in this.messages.
125
+ *
126
+ * @returns The number of 'unapproved' PersonalMessages in this.messages
127
+ */
128
+ get unapprovedPersonalMessagesCount() {
129
+ return __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").getUnapprovedMessagesCount();
130
+ }
131
+ /**
132
+ * A getter for the number of 'unapproved' TypedMessages in this.messages.
133
+ *
134
+ * @returns The number of 'unapproved' TypedMessages in this.messages
135
+ */
136
+ get unapprovedTypedMessagesCount() {
137
+ return __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").getUnapprovedMessagesCount();
138
+ }
139
+ /**
140
+ * A getter for returning all messages.
141
+ *
142
+ * @returns The object containing all messages.
143
+ */
144
+ get messages() {
145
+ const messages = [
146
+ ...__classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").getAllMessages(),
147
+ ...__classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").getAllMessages(),
148
+ ...__classPrivateFieldGet(this, _SignatureController_messageManager, "f").getAllMessages(),
149
+ ];
150
+ const messagesObject = messages.reduce((acc, message) => {
151
+ acc[message.id] = message;
152
+ return acc;
153
+ }, {});
154
+ return messagesObject;
155
+ }
156
+ /**
157
+ * Reset the controller state to the initial state.
158
+ */
159
+ resetState() {
160
+ this.update(() => getDefaultState());
161
+ }
162
+ /**
163
+ * Reject all unapproved messages of any type.
164
+ *
165
+ * @param reason - A message to indicate why.
166
+ */
167
+ rejectUnapproved(reason) {
168
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), reason);
169
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), reason);
170
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), reason);
171
+ }
172
+ /**
173
+ * Clears all unapproved messages from memory.
174
+ */
175
+ clearUnapproved() {
176
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_clearUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"));
177
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_clearUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"));
178
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_clearUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"));
179
+ }
180
+ /**
181
+ * Called when a Dapp uses the eth_sign method, to request user approval.
182
+ * eth_sign is a pure signature of arbitrary data. It is on a deprecation
183
+ * path, since this data can be a transaction, or can leak private key
184
+ * information.
185
+ *
186
+ * @param messageParams - The params passed to eth_sign.
187
+ * @param [req] - The original request, containing the origin.
188
+ * @returns Promise resolving to the raw data of the signature request.
189
+ */
190
+ newUnsignedMessage(messageParams, req) {
191
+ return __awaiter(this, void 0, void 0, function* () {
192
+ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, 'Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signMessage).bind(this), messageParams, req, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_validateUnsignedMessage).bind(this));
193
+ });
194
+ }
195
+ /**
196
+ * Called when a dapp uses the personal_sign method.
197
+ * This is identical to the Geth eth_sign method, and may eventually replace
198
+ * eth_sign.
199
+ *
200
+ * We currently define our eth_sign and personal_sign mostly for legacy Dapps.
201
+ *
202
+ * @param messageParams - The params of the message to sign & return to the Dapp.
203
+ * @param req - The original request, containing the origin.
204
+ * @returns Promise resolving to the raw data of the signature request.
205
+ */
206
+ newUnsignedPersonalMessage(messageParams, req) {
207
+ return __awaiter(this, void 0, void 0, function* () {
208
+ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, 'Personal Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signPersonalMessage).bind(this), messageParams, req);
209
+ });
210
+ }
211
+ /**
212
+ * Called when a dapp uses the eth_signTypedData method, per EIP 712.
213
+ *
214
+ * @param messageParams - The params passed to eth_signTypedData.
215
+ * @param req - The original request, containing the origin.
216
+ * @param version - The version indicating the format of the typed data.
217
+ * @param signingOpts - An options bag for signing.
218
+ * @param signingOpts.parseJsonData - Whether to parse the JSON before signing.
219
+ * @returns Promise resolving to the raw data of the signature request.
220
+ */
221
+ newUnsignedTypedMessage(messageParams, req, version, signingOpts) {
222
+ return __awaiter(this, void 0, void 0, function* () {
223
+ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, 'Typed Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signTypedMessage).bind(this), messageParams, req, undefined, version, signingOpts);
224
+ });
225
+ }
226
+ /**
227
+ * Called to update the message status as signed.
228
+ *
229
+ * @param messageId - The id of the Message to update.
230
+ * @param signature - The data to update the message with.
231
+ */
232
+ setDeferredSignSuccess(messageId, signature) {
233
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetDeferredSignSuccess), messageId, signature);
234
+ }
235
+ /**
236
+ * Called when the message metadata needs to be updated.
237
+ *
238
+ * @param messageId - The id of the message to update.
239
+ * @param metadata - The data to update the metadata property in the message.
240
+ */
241
+ setMessageMetadata(messageId, metadata) {
242
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetMessageMetadata), messageId, metadata);
243
+ }
244
+ /**
245
+ * Called to cancel a signing message.
246
+ *
247
+ * @param messageId - The id of the Message to update.
248
+ */
249
+ setDeferredSignError(messageId) {
250
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetDeferredSignError), messageId);
251
+ }
252
+ setTypedMessageInProgress(messageId) {
253
+ __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").setMessageStatusInProgress(messageId);
254
+ }
255
+ setPersonalMessageInProgress(messageId) {
256
+ __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").setMessageStatusInProgress(messageId);
257
+ }
258
+ }
259
+ exports.SignatureController = SignatureController;
260
+ _SignatureController_keyringController = new WeakMap(), _SignatureController_isEthSignEnabled = new WeakMap(), _SignatureController_getAllState = new WeakMap(), _SignatureController_messageManager = new WeakMap(), _SignatureController_personalMessageManager = new WeakMap(), _SignatureController_typedMessageManager = new WeakMap(), _SignatureController_instances = new WeakSet(), _SignatureController_validateUnsignedMessage = function _SignatureController_validateUnsignedMessage(messageParams) {
261
+ if (!__classPrivateFieldGet(this, _SignatureController_isEthSignEnabled, "f").call(this)) {
262
+ throw eth_rpc_errors_1.ethErrors.rpc.methodNotFound('eth_sign has been disabled. You must enable it in the advanced settings');
263
+ }
264
+ const data = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_normalizeMsgData).call(this, messageParams.data);
265
+ // 64 hex + "0x" at the beginning
266
+ // This is needed because Ethereum's EcSign works only on 32 byte numbers
267
+ // For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607
268
+ if (data.length !== 66 && data.length !== 67) {
269
+ throw eth_rpc_errors_1.ethErrors.rpc.invalidParams('eth_sign requires 32 byte message hash');
270
+ }
271
+ }, _SignatureController_newUnsignedAbstractMessage = function _SignatureController_newUnsignedAbstractMessage(messageManager, approvalType, messageName, signMessage, messageParams, req, validateMessage, version, signingOpts) {
272
+ return __awaiter(this, void 0, void 0, function* () {
273
+ if (validateMessage) {
274
+ validateMessage(messageParams);
275
+ }
276
+ let resultCallbacks;
277
+ try {
278
+ const messageId = yield messageManager.addUnapprovedMessage(messageParams, req, version);
279
+ const messageParamsWithId = Object.assign(Object.assign(Object.assign({}, messageParams), { metamaskId: messageId }), (version && { version }));
280
+ const signaturePromise = messageManager.waitForFinishStatus(messageParamsWithId, messageName);
281
+ try {
282
+ const acceptResult = yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, messageParamsWithId, approvalType);
283
+ resultCallbacks = acceptResult.resultCallbacks;
284
+ }
285
+ catch (_a) {
286
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
287
+ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.');
288
+ }
289
+ yield signMessage(messageParamsWithId, signingOpts);
290
+ const signatureResult = yield signaturePromise;
291
+ /* istanbul ignore next */
292
+ resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.success(signatureResult);
293
+ return signatureResult;
294
+ }
295
+ catch (error) {
296
+ resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.error(error);
297
+ throw error;
298
+ }
299
+ });
300
+ }, _SignatureController_signMessage = function _SignatureController_signMessage(msgParams) {
301
+ return __awaiter(this, void 0, void 0, function* () {
302
+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signMessage(cleanMsgParams); }));
303
+ });
304
+ }, _SignatureController_signPersonalMessage = function _SignatureController_signPersonalMessage(msgParams) {
305
+ return __awaiter(this, void 0, void 0, function* () {
306
+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); }));
307
+ });
308
+ }, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams,
309
+ /* istanbul ignore next */
310
+ opts = { parseJsonData: true }) {
311
+ return __awaiter(this, void 0, void 0, function* () {
312
+ const { version } = msgParams;
313
+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () {
314
+ const finalMessageParams = opts.parseJsonData
315
+ ? __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_removeJsonData).call(this, cleanMsgParams, version)
316
+ : cleanMsgParams;
317
+ return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signTypedMessage(finalMessageParams, {
318
+ version,
319
+ });
320
+ }));
321
+ });
322
+ }, _SignatureController_tryForEachMessageManager = function _SignatureController_tryForEachMessageManager(callbackFn, ...args) {
323
+ const messageManagers = [
324
+ __classPrivateFieldGet(this, _SignatureController_messageManager, "f"),
325
+ __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"),
326
+ __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"),
327
+ ];
328
+ for (const manager of messageManagers) {
329
+ if (callbackFn(manager, ...args)) {
330
+ return true;
331
+ }
332
+ }
333
+ throw new Error('Message not found');
334
+ }, _SignatureController_trySetDeferredSignSuccess = function _SignatureController_trySetDeferredSignSuccess(messageManager, messageId, signature) {
335
+ try {
336
+ messageManager.setMessageStatusSigned(messageId, signature);
337
+ return true;
338
+ }
339
+ catch (error) {
340
+ return false;
341
+ }
342
+ }, _SignatureController_trySetMessageMetadata = function _SignatureController_trySetMessageMetadata(messageManager, messageId, metadata) {
343
+ try {
344
+ messageManager.setMetadata(messageId, metadata);
345
+ return true;
346
+ }
347
+ catch (error) {
348
+ return false;
349
+ }
350
+ }, _SignatureController_trySetDeferredSignError = function _SignatureController_trySetDeferredSignError(messageManager, messageId) {
351
+ try {
352
+ messageManager.rejectMessage(messageId);
353
+ return true;
354
+ }
355
+ catch (error) {
356
+ return false;
357
+ }
358
+ }, _SignatureController_rejectUnapproved = function _SignatureController_rejectUnapproved(messageManager, reason) {
359
+ Object.keys(messageManager.getUnapprovedMessages()).forEach((messageId) => {
360
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId, reason);
361
+ });
362
+ }, _SignatureController_clearUnapproved = function _SignatureController_clearUnapproved(messageManager) {
363
+ messageManager.update({
364
+ unapprovedMessages: {},
365
+ unapprovedMessagesCount: 0,
366
+ });
367
+ }, _SignatureController_signAbstractMessage = function _SignatureController_signAbstractMessage(messageManager, methodName, msgParams, getSignature) {
368
+ return __awaiter(this, void 0, void 0, function* () {
369
+ console.info(`MetaMaskController - ${methodName}`);
370
+ const messageId = msgParams.metamaskId;
371
+ try {
372
+ const cleanMessageParams = yield messageManager.approveMessage(msgParams);
373
+ try {
374
+ const signature = yield getSignature(cleanMessageParams);
375
+ this.hub.emit(`${methodName}:signed`, { signature, messageId });
376
+ if (!cleanMessageParams.deferSetAsSigned) {
377
+ messageManager.setMessageStatusSigned(messageId, signature);
378
+ }
379
+ return signature;
380
+ }
381
+ catch (error) {
382
+ this.hub.emit(`${messageId}:signError`, { error });
383
+ throw error;
384
+ }
385
+ }
386
+ catch (error) {
387
+ console.info(`MetaMaskController - ${methodName} failed.`, error);
388
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_errorMessage).call(this, messageManager, messageId, error.message);
389
+ throw error;
390
+ }
391
+ });
392
+ }, _SignatureController_errorMessage = function _SignatureController_errorMessage(messageManager, messageId, error) {
393
+ if (messageManager instanceof message_manager_1.TypedMessageManager) {
394
+ messageManager.setMessageStatusErrored(messageId, error);
395
+ }
396
+ else {
397
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
398
+ }
399
+ }, _SignatureController_cancelAbstractMessage = function _SignatureController_cancelAbstractMessage(messageManager, messageId, reason) {
400
+ if (reason) {
401
+ const message = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_getMessage).call(this, messageId);
402
+ this.hub.emit('cancelWithReason', { message, reason });
403
+ }
404
+ messageManager.rejectMessage(messageId);
405
+ }, _SignatureController_handleMessageManagerEvents = function _SignatureController_handleMessageManagerEvents(messageManager, eventName) {
406
+ messageManager.hub.on('updateBadge', () => {
407
+ this.hub.emit('updateBadge');
408
+ });
409
+ messageManager.hub.on('unapprovedMessage', (msgParams) => {
410
+ this.hub.emit(eventName, msgParams);
411
+ });
412
+ }, _SignatureController_subscribeToMessageState = function _SignatureController_subscribeToMessageState(messageManager, updateState) {
413
+ messageManager.subscribe((state) => {
414
+ const newMessages = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_migrateMessages).call(this, state.unapprovedMessages);
415
+ this.update(() => {
416
+ const newState = Object.assign({}, this.state);
417
+ updateState(newState, newMessages, state.unapprovedMessagesCount);
418
+ return newState;
419
+ });
420
+ });
421
+ }, _SignatureController_migrateMessages = function _SignatureController_migrateMessages(coreMessages) {
422
+ const stateMessages = {};
423
+ for (const messageId of Object.keys(coreMessages)) {
424
+ const coreMessage = coreMessages[messageId];
425
+ const stateMessage = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_migrateMessage).call(this, coreMessage);
426
+ stateMessages[messageId] = stateMessage;
427
+ }
428
+ return stateMessages;
429
+ }, _SignatureController_migrateMessage = function _SignatureController_migrateMessage(coreMessage) {
430
+ const { messageParams } = coreMessage, coreMessageData = __rest(coreMessage, ["messageParams"]);
431
+ // Core message managers use messageParams but frontend uses msgParams with lots of references
432
+ const stateMessage = Object.assign(Object.assign({}, coreMessageData), { msgParams: messageParams });
433
+ return stateMessage;
434
+ }, _SignatureController_normalizeMsgData = function _SignatureController_normalizeMsgData(data) {
435
+ if (data.startsWith('0x')) {
436
+ // data is already hex
437
+ return data;
438
+ }
439
+ // data is unicode, convert to hex
440
+ return (0, ethereumjs_util_1.bufferToHex)(Buffer.from(data, 'utf8'));
441
+ }, _SignatureController_getMessage = function _SignatureController_getMessage(messageId) {
442
+ return Object.assign(Object.assign(Object.assign({}, this.state.unapprovedMsgs), this.state.unapprovedPersonalMsgs), this.state.unapprovedTypedMessages)[messageId];
443
+ }, _SignatureController_requestApproval = function _SignatureController_requestApproval(msgParams, type) {
444
+ return __awaiter(this, void 0, void 0, function* () {
445
+ const id = msgParams.metamaskId;
446
+ const origin = msgParams.origin || controller_utils_1.ORIGIN_METAMASK;
447
+ // We are explicitly cloning the message params here to prevent the mutation errors on development mode
448
+ // Because sending it through the messaging system will make the object read only
449
+ const clonedMsgParams = (0, lodash_1.cloneDeep)(msgParams);
450
+ return (yield this.messagingSystem.call('ApprovalController:addRequest', {
451
+ id,
452
+ origin,
453
+ type,
454
+ requestData: clonedMsgParams,
455
+ expectsResult: true,
456
+ }, true));
457
+ });
458
+ }, _SignatureController_removeJsonData = function _SignatureController_removeJsonData(messageParams, version) {
459
+ if (version === 'V1' || typeof messageParams.data !== 'string') {
460
+ return messageParams;
461
+ }
462
+ return Object.assign(Object.assign({}, messageParams), { data: JSON.parse(messageParams.data) });
463
+ };
464
+ //# sourceMappingURL=SignatureController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignatureController.js","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,+DAA6D;AAC7D,iEAA2E;AAkB3E,+DAImC;AAEnC,mDAA2C;AAC3C,qDAA8C;AAC9C,oDAAkC;AAElC,mCAAmC;AAEnC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,MAAM,aAAa,GAAG;IACpB,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACpD,sBAAsB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5D,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7D,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACxD,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAChE,4BAA4B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;CACnE,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,EAAE;IAClB,sBAAsB,EAAE,EAAE;IAC1B,uBAAuB,EAAE,EAAE;IAC3B,kBAAkB,EAAE,CAAC;IACrB,0BAA0B,EAAE,CAAC;IAC7B,4BAA4B,EAAE,CAAC;CAChC,CAAC,CAAC;AAsEH;;GAEG;AACH,MAAa,mBAAoB,SAAQ,kCAIxC;IAeC;;;;;;;;;;OAUG;IACH,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,iBAAiB,GACU;QAC3B,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,eAAe,EAAE;SACzB,CAAC,CAAC;;QApCL,yDAAsC;QAEtC,wDAAiC;QAEjC,mDAAwB;QAExB,sDAAgC;QAEhC,8DAAgD;QAEhD,2DAA0C;QA4BxC,uBAAA,IAAI,0CAAsB,iBAAiB,MAAA,CAAC;QAC5C,uBAAA,IAAI,yCAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,oCAAgB,WAAW,MAAA,CAAC;QAEhC,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAC9B,uBAAA,IAAI,uCAAmB,IAAI,gCAAc,CACvC,SAAS,EACT,SAAS,EACT,uBAAuB,CACxB,MAAA,CAAC;QACF,uBAAA,IAAI,+CAA2B,IAAI,wCAAsB,CACvD,SAAS,EACT,SAAS,EACT,uBAAuB,CACxB,MAAA,CAAC;QACF,uBAAA,IAAI,4CAAwB,IAAI,qCAAmB,CACjD,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,SAAS,EACT,iBAAiB,CAClB,MAAA,CAAC;QAEF,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EAA6B,uBAAA,IAAI,2CAAgB,EAAE,mBAAmB,CAAC,CAAC;QAC5E,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACF,uBAAA,IAAI,mDAAwB,EAC5B,2BAA2B,CAC5B,CAAC;QACF,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACF,uBAAA,IAAI,gDAAqB,EACzB,wBAAwB,CACzB,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,2CAAgB,EACpB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,cAAc,GAAG,WAAW,CAAC;YACnC,KAAK,CAAC,kBAAkB,GAAG,YAAY,CAAC;QAC1C,CAAC,CACF,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,mDAAwB,EAC5B,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,sBAAsB,GAAG,WAAW,CAAC;YAC3C,KAAK,CAAC,0BAA0B,GAAG,YAAY,CAAC;QAClD,CAAC,CACF,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,gDAAqB,EACzB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,uBAAuB,GAAG,WAAW,CAAC;YAC5C,KAAK,CAAC,4BAA4B,GAAG,YAAY,CAAC;QACpD,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,IAAI,kBAAkB;QACpB,OAAO,uBAAA,IAAI,2CAAgB,CAAC,0BAA0B,EAAE,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,IAAI,+BAA+B;QACjC,OAAO,uBAAA,IAAI,mDAAwB,CAAC,0BAA0B,EAAE,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,IAAI,4BAA4B;QAC9B,OAAO,uBAAA,IAAI,gDAAqB,CAAC,0BAA0B,EAAE,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACH,IAAI,QAAQ;QACV,MAAM,QAAQ,GAAG;YACf,GAAG,uBAAA,IAAI,gDAAqB,CAAC,cAAc,EAAE;YAC7C,GAAG,uBAAA,IAAI,mDAAwB,CAAC,cAAc,EAAE;YAChD,GAAG,uBAAA,IAAI,2CAAgB,CAAC,cAAc,EAAE;SACzC,CAAC;QAEF,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAEnC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YAClB,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;YAC1B,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,MAAe;QAC9B,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,2CAAgB,EAAE,MAAM,CAAC,CAAC;QACrD,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,mDAAwB,EAAE,MAAM,CAAC,CAAC;QAC7D,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,gDAAqB,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,eAAe;QACb,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,2CAAgB,CAAC,CAAC;QAC5C,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,mDAAwB,CAAC,CAAC;QACpD,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,gDAAqB,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;;OASG;IACG,kBAAkB,CACtB,aAA4B,EAC5B,GAAoB;;YAEpB,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,2CAAgB,EACpB,+BAAY,CAAC,OAAO,EACpB,SAAS,EACT,uBAAA,IAAI,wEAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,aAAa,EACb,GAAG,EACH,uBAAA,IAAI,oFAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CACzC,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;;OAUG;IACG,0BAA0B,CAC9B,aAAoC,EACpC,GAAoB;;YAEpB,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,mDAAwB,EAC5B,+BAAY,CAAC,YAAY,EACzB,kBAAkB,EAClB,uBAAA,IAAI,gFAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,aAAa,EACb,GAAG,CACJ,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;OASG;IACG,uBAAuB,CAC3B,aAAiC,EACjC,GAAoB,EACpB,OAAe,EACf,WAAuC;;YAEvC,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,gDAAqB,EACzB,+BAAY,CAAC,gBAAgB,EAC7B,eAAe,EACf,uBAAA,IAAI,6EAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EACjC,aAAa,EACb,GAAG,EACH,SAAS,EACT,OAAO,EACP,WAAW,CACZ,CAAC;QACJ,CAAC;KAAA;IAED;;;;;OAKG;IACH,sBAAsB,CAAC,SAAiB,EAAE,SAAc;QACtD,uBAAA,IAAI,qFAA0B,MAA9B,IAAI,EACF,uBAAA,IAAI,sFAA2B,EAC/B,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,SAAiB,EAAE,QAAc;QAClD,uBAAA,IAAI,qFAA0B,MAA9B,IAAI,EACF,uBAAA,IAAI,kFAAuB,EAC3B,SAAS,EACT,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAAC,SAAiB;QACpC,uBAAA,IAAI,qFAA0B,MAA9B,IAAI,EAA2B,uBAAA,IAAI,oFAAyB,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED,yBAAyB,CAAC,SAAiB;QACzC,uBAAA,IAAI,gDAAqB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,4BAA4B,CAAC,SAAiB;QAC5C,uBAAA,IAAI,mDAAwB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;CAyaF;AAttBD,kDAstBC;keAva0B,aAAoC;IAC3D,IAAI,CAAC,uBAAA,IAAI,6CAAkB,MAAtB,IAAI,CAAoB,EAAE;QAC7B,MAAM,0BAAS,CAAC,GAAG,CAAC,cAAc,CAChC,yEAAyE,CAC1E,CAAC;KACH;IACD,MAAM,IAAI,GAAG,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,aAAa,CAAC,IAAI,CAAC,CAAC;IACxD,iCAAiC;IACjC,yEAAyE;IACzE,gGAAgG;IAChG,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE;QAC5C,MAAM,0BAAS,CAAC,GAAG,CAAC,aAAa,CAC/B,wCAAwC,CACzC,CAAC;KACH;AACH,CAAC,6GAQC,cAAgD,EAChD,YAA0B,EAC1B,WAAmB,EACnB,WAA0D,EAC1D,aAAiB,EACjB,GAAoB,EACpB,eAAsC,EACtC,OAAgB,EAChB,WAAgB;;QAEhB,IAAI,eAAe,EAAE;YACnB,eAAe,CAAC,aAAa,CAAC,CAAC;SAChC;QAED,IAAI,eAAkD,CAAC;QACvD,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,oBAAoB,CACzD,aAAa,EACb,GAAG,EACH,OAAO,CACR,CAAC;YAEF,MAAM,mBAAmB,iDACpB,aAAa,KAChB,UAAU,EAAE,SAAS,KAClB,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC,CAC5B,CAAC;YAEF,MAAM,gBAAgB,GAAG,cAAc,CAAC,mBAAmB,CACzD,mBAAmB,EACnB,WAAW,CACZ,CAAC;YAEF,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAC7B,mBAAmB,EACnB,YAAY,CACb,CAAC;gBAEF,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC;aAChD;YAAC,WAAM;gBACN,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,0BAAS,CAAC,QAAQ,CAAC,mBAAmB,CAC1C,4BAA4B,CAC7B,CAAC;aACH;YAED,MAAM,WAAW,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAEpD,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC;YAE/C,0BAA0B;YAC1B,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAE1C,OAAO,eAAe,CAAC;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAC,KAAc,CAAC,CAAC;YACvC,MAAM,KAAK,CAAC;SACb;IACH,CAAC;gFAQkB,SAAgC;;QACjD,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,2CAAgB,EACpB,+BAAY,CAAC,OAAO,EACpB,SAAS,EACT,CAAO,cAAc,EAAE,EAAE,gDACvB,OAAA,MAAM,uBAAA,IAAI,8CAAmB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,GAAA,CAC5D,CAAC;IACJ,CAAC;gGAS0B,SAAwC;;QACjE,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,mDAAwB,EAC5B,+BAAY,CAAC,YAAY,EACzB,SAAS,EACT,CAAO,cAAc,EAAE,EAAE,gDACvB,OAAA,MAAM,uBAAA,IAAI,8CAAmB,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA,GAAA,CACpE,CAAC;IACJ,CAAC;0FAYC,SAAqC;AACrC,0BAA0B;AAC1B,IAAI,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE;;QAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QAC9B,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,gDAAqB,EACzB,+BAAY,CAAC,gBAAgB,EAC7B,SAAS,EACT,CAAO,cAAc,EAAE,EAAE;YACvB,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa;gBAC3C,CAAC,CAAC,uBAAA,IAAI,2EAAgB,MAApB,IAAI,EAAiB,cAAc,EAAE,OAAiB,CAAC;gBACzD,CAAC,CAAC,cAAc,CAAC;YAEnB,OAAO,MAAM,uBAAA,IAAI,8CAAmB,CAAC,gBAAgB,CACnD,kBAAkB,EAClB;gBACE,OAAO;aACR,CACF,CAAC;QACJ,CAAC,CAAA,CACF,CAAC;IACJ,CAAC;0GAGC,UAGY,EACZ,GAAG,IAAS;IAEZ,MAAM,eAAe,GAAG;QACtB,uBAAA,IAAI,2CAAgB;QACpB,uBAAA,IAAI,mDAAwB;QAC5B,uBAAA,IAAI,gDAAqB;KAC1B,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE;QACrC,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE;YAChC,OAAO,IAAI,CAAC;SACb;KACF;IACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACvC,CAAC,2GAGC,cAAqD,EACrD,SAAiB,EACjB,SAAc;IAEd,IAAI;QACF,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,KAAK,CAAC;KACd;AACH,CAAC,mGAGC,cAAqD,EACrD,SAAiB,EACjB,QAAc;IAEd,IAAI;QACF,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,KAAK,CAAC;KACd;AACH,CAAC,uGAGC,cAAqD,EACrD,SAAiB;IAEjB,IAAI;QACF,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,KAAK,CAAC;KACd;AACH,CAAC,yFAMC,cAAgD,EAAE,MAAe;IACjE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACxE,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,uFAMC,cAAgD;IAChD,cAAc,CAAC,MAAM,CAAC;QACpB,kBAAkB,EAAE,EAAE;QACtB,uBAAuB,EAAE,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC,+FAOC,cAAgD,EAChD,UAAkB,EAClB,SAAa,EACb,YAAqD;;QAErD,OAAO,CAAC,IAAI,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAoB,CAAC;QAEjD,IAAI;YACF,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAE1E,IAAI;gBACF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,CAAC;gBAEzD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBAEhE,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;oBACxC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBAC7D;gBAED,OAAO,SAAS,CAAC;aAClB;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnD,MAAM,KAAK,CAAC;aACb;SACF;QAAC,OAAO,KAAU,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,wBAAwB,UAAU,UAAU,EAAE,KAAK,CAAC,CAAC;YAClE,uBAAA,IAAI,yEAAc,MAAlB,IAAI,EAAe,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;SACb;IACH,CAAC;kFAOC,cAAgD,EAChD,SAAiB,EACjB,KAAa;IAEb,IAAI,cAAc,YAAY,qCAAmB,EAAE;QACjD,cAAc,CAAC,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAC1D;SAAM;QACL,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,CAAC,CAAC;KACxD;AACH,CAAC,mGAOC,cAAgD,EAChD,SAAiB,EACjB,MAAe;IAEf,IAAI,MAAM,EAAE;QACV,MAAM,OAAO,GAAG,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;KACxD;IACD,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,6GAMC,cAAgD,EAAE,SAAiB;IACnE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,GAAG,CAAC,EAAE,CACnB,mBAAmB,EACnB,CAAC,SAAwC,EAAE,EAAE;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC,uGAOC,cAAgD,EAChD,WAIS;IAET,cAAc,CAAC,SAAS,CAAC,CAAC,KAA2C,EAAE,EAAE;QACvE,MAAM,WAAW,GAAG,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EACtB,KAAK,CAAC,kBAAyB,CAChC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,MAAM,QAAQ,qBAAQ,IAAI,CAAC,KAAK,CAAE,CAAC;YACnC,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAClE,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,uFAGC,YAAyC;IAEzC,MAAM,aAAa,GAAiC,EAAE,CAAC;IAEvD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACjD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,uBAAA,IAAI,2EAAgB,MAApB,IAAI,EAAiB,WAAW,CAAC,CAAC;QAEvD,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;KACzC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,qFAEe,WAAwB;IACtC,MAAM,EAAE,aAAa,KAAyB,WAAW,EAA/B,eAAe,UAAK,WAAW,EAAnD,iBAAqC,CAAc,CAAC;IAE1D,8FAA8F;IAC9F,MAAM,YAAY,mCACb,eAAe,KAClB,SAAS,EAAE,aAAa,GACzB,CAAC;IAEF,OAAO,YAA4B,CAAC;AACtC,CAAC,yFAEiB,IAAY;IAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACzB,sBAAsB;QACtB,OAAO,IAAI,CAAC;KACb;IACD,kCAAkC;IAClC,OAAO,IAAA,6BAAW,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC,6EAEW,SAAiB;IAC3B,OAAO,8CACF,IAAI,CAAC,KAAK,CAAC,cAAc,GACzB,IAAI,CAAC,KAAK,CAAC,sBAAsB,GACjC,IAAI,CAAC,KAAK,CAAC,uBAAuB,EACrC,SAAS,CAAC,CAAC;AACf,CAAC,uFAGC,SAAwC,EACxC,IAAkB;;QAElB,MAAM,EAAE,GAAG,SAAS,CAAC,UAAoB,CAAC;QAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,kCAAe,CAAC;QAEnD,uGAAuG;QACvG,iFAAiF;QACjF,MAAM,eAAe,GAAG,IAAA,kBAAS,EAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CACrC,+BAA+B,EAC/B;YACE,EAAE;YACF,MAAM;YACN,IAAI;YACJ,WAAW,EAAE,eAA0D;YACvE,aAAa,EAAE,IAAI;SACpB,EACD,IAAI,CACL,CAAuB,CAAC;IAC3B,CAAC;sFAGC,aAAiC,EACjC,OAAe;IAEf,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC9D,OAAO,aAAa,CAAC;KACtB;IAED,uCACK,aAAa,KAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IACpC;AACJ,CAAC","sourcesContent":["import type {\n AddApprovalRequest,\n AcceptResultCallbacks,\n AddResult,\n} from '@metamask/approval-controller';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport { ApprovalType, ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type {\n MessageParams,\n MessageParamsMetamask,\n PersonalMessageParams,\n PersonalMessageParamsMetamask,\n TypedMessageParams,\n TypedMessageParamsMetamask,\n AbstractMessageManager,\n AbstractMessage,\n MessageManagerState,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n TypedMessage,\n PersonalMessage,\n Message,\n} from '@metamask/message-manager';\nimport {\n MessageManager,\n PersonalMessageManager,\n TypedMessageManager,\n} from '@metamask/message-manager';\nimport type { Hex, Json } from '@metamask/utils';\nimport { ethErrors } from 'eth-rpc-errors';\nimport { bufferToHex } from 'ethereumjs-util';\nimport EventEmitter from 'events';\nimport type { Patch } from 'immer';\nimport { cloneDeep } from 'lodash';\n\nconst controllerName = 'SignatureController';\n\nconst stateMetadata = {\n unapprovedMsgs: { persist: false, anonymous: false },\n unapprovedPersonalMsgs: { persist: false, anonymous: false },\n unapprovedTypedMessages: { persist: false, anonymous: false },\n unapprovedMsgCount: { persist: false, anonymous: false },\n unapprovedPersonalMsgCount: { persist: false, anonymous: false },\n unapprovedTypedMessagesCount: { persist: false, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n unapprovedMsgs: {},\n unapprovedPersonalMsgs: {},\n unapprovedTypedMessages: {},\n unapprovedMsgCount: 0,\n unapprovedPersonalMsgCount: 0,\n unapprovedTypedMessagesCount: 0,\n});\n\ntype CoreMessage = AbstractMessage & {\n messageParams: AbstractMessageParams;\n};\n\ntype StateMessage = Required<AbstractMessage> & {\n msgParams: Required<AbstractMessageParams>;\n};\n\ntype SignatureControllerState = {\n unapprovedMsgs: Record<string, StateMessage>;\n unapprovedPersonalMsgs: Record<string, StateMessage>;\n unapprovedTypedMessages: Record<string, StateMessage>;\n unapprovedMsgCount: number;\n unapprovedPersonalMsgCount: number;\n unapprovedTypedMessagesCount: number;\n};\n\ntype AllowedActions = AddApprovalRequest;\n\ntype TypedMessageSigningOptions = {\n parseJsonData: boolean;\n};\n\nexport type GetSignatureState = {\n type: `${typeof controllerName}:getState`;\n handler: () => SignatureControllerState;\n};\n\nexport type SignatureStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [SignatureControllerState, Patch[]];\n};\n\nexport type SignatureControllerActions = GetSignatureState;\n\nexport type SignatureControllerEvents = SignatureStateChange;\n\nexport type SignatureControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SignatureControllerActions | AllowedActions,\n SignatureControllerEvents,\n AllowedActions['type'],\n never\n>;\n\nexport interface KeyringController {\n signMessage: (messsageParams: MessageParams) => Promise<string>;\n signPersonalMessage: (\n messsageParams: PersonalMessageParams,\n ) => Promise<string>;\n signTypedMessage: (\n messsageParams: TypedMessageParams,\n options: { version: string | undefined },\n ) => Promise<string>;\n}\n\nexport type SignatureControllerOptions = {\n messenger: SignatureControllerMessenger;\n keyringController: KeyringController;\n isEthSignEnabled: () => boolean;\n getAllState: () => unknown;\n securityProviderRequest?: (\n requestData: any,\n methodName: string,\n ) => Promise<any>;\n getCurrentChainId: () => Hex;\n};\n\n/**\n * Controller for creating signing requests requiring user approval.\n */\nexport class SignatureController extends BaseControllerV2<\n typeof controllerName,\n SignatureControllerState,\n SignatureControllerMessenger\n> {\n hub: EventEmitter;\n\n #keyringController: KeyringController;\n\n #isEthSignEnabled: () => boolean;\n\n #getAllState: () => any;\n\n #messageManager: MessageManager;\n\n #personalMessageManager: PersonalMessageManager;\n\n #typedMessageManager: TypedMessageManager;\n\n /**\n * Construct a Sign controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the sign controller.\n * @param options.keyringController - An instance of a keyring controller used to perform the signing operations.\n * @param options.isEthSignEnabled - Callback to return true if eth_sign is enabled.\n * @param options.getAllState - Callback to retrieve all user state.\n * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.\n * @param options.getCurrentChainId - A function for retrieving the current chainId.\n */\n constructor({\n messenger,\n keyringController,\n isEthSignEnabled,\n getAllState,\n securityProviderRequest,\n getCurrentChainId,\n }: SignatureControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: getDefaultState(),\n });\n\n this.#keyringController = keyringController;\n this.#isEthSignEnabled = isEthSignEnabled;\n this.#getAllState = getAllState;\n\n this.hub = new EventEmitter();\n this.#messageManager = new MessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#personalMessageManager = new PersonalMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#typedMessageManager = new TypedMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n undefined,\n getCurrentChainId,\n );\n\n this.#handleMessageManagerEvents(this.#messageManager, 'unapprovedMessage');\n this.#handleMessageManagerEvents(\n this.#personalMessageManager,\n 'unapprovedPersonalMessage',\n );\n this.#handleMessageManagerEvents(\n this.#typedMessageManager,\n 'unapprovedTypedMessage',\n );\n\n this.#subscribeToMessageState(\n this.#messageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedMsgs = newMessages;\n state.unapprovedMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#personalMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedPersonalMsgs = newMessages;\n state.unapprovedPersonalMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#typedMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedTypedMessages = newMessages;\n state.unapprovedTypedMessagesCount = messageCount;\n },\n );\n }\n\n /**\n * A getter for the number of 'unapproved' Messages in this.messages.\n *\n * @returns The number of 'unapproved' Messages in this.messages\n */\n get unapprovedMsgCount(): number {\n return this.#messageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' PersonalMessages in this.messages.\n *\n * @returns The number of 'unapproved' PersonalMessages in this.messages\n */\n get unapprovedPersonalMessagesCount(): number {\n return this.#personalMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' TypedMessages in this.messages.\n *\n * @returns The number of 'unapproved' TypedMessages in this.messages\n */\n get unapprovedTypedMessagesCount(): number {\n return this.#typedMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for returning all messages.\n *\n * @returns The object containing all messages.\n */\n get messages(): { [id: string]: Message | PersonalMessage | TypedMessage } {\n const messages = [\n ...this.#typedMessageManager.getAllMessages(),\n ...this.#personalMessageManager.getAllMessages(),\n ...this.#messageManager.getAllMessages(),\n ];\n\n const messagesObject = messages.reduce<{\n [id: string]: Message | PersonalMessage | TypedMessage;\n }>((acc, message) => {\n acc[message.id] = message;\n return acc;\n }, {});\n\n return messagesObject;\n }\n\n /**\n * Reset the controller state to the initial state.\n */\n resetState() {\n this.update(() => getDefaultState());\n }\n\n /**\n * Reject all unapproved messages of any type.\n *\n * @param reason - A message to indicate why.\n */\n rejectUnapproved(reason?: string) {\n this.#rejectUnapproved(this.#messageManager, reason);\n this.#rejectUnapproved(this.#personalMessageManager, reason);\n this.#rejectUnapproved(this.#typedMessageManager, reason);\n }\n\n /**\n * Clears all unapproved messages from memory.\n */\n clearUnapproved() {\n this.#clearUnapproved(this.#messageManager);\n this.#clearUnapproved(this.#personalMessageManager);\n this.#clearUnapproved(this.#typedMessageManager);\n }\n\n /**\n * Called when a Dapp uses the eth_sign method, to request user approval.\n * eth_sign is a pure signature of arbitrary data. It is on a deprecation\n * path, since this data can be a transaction, or can leak private key\n * information.\n *\n * @param messageParams - The params passed to eth_sign.\n * @param [req] - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedMessage(\n messageParams: MessageParams,\n req: OriginalRequest,\n ): Promise<string> {\n return this.#newUnsignedAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n 'Message',\n this.#signMessage.bind(this),\n messageParams,\n req,\n this.#validateUnsignedMessage.bind(this),\n );\n }\n\n /**\n * Called when a dapp uses the personal_sign method.\n * This is identical to the Geth eth_sign method, and may eventually replace\n * eth_sign.\n *\n * We currently define our eth_sign and personal_sign mostly for legacy Dapps.\n *\n * @param messageParams - The params of the message to sign & return to the Dapp.\n * @param req - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedPersonalMessage(\n messageParams: PersonalMessageParams,\n req: OriginalRequest,\n ): Promise<string> {\n return this.#newUnsignedAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n 'Personal Message',\n this.#signPersonalMessage.bind(this),\n messageParams,\n req,\n );\n }\n\n /**\n * Called when a dapp uses the eth_signTypedData method, per EIP 712.\n *\n * @param messageParams - The params passed to eth_signTypedData.\n * @param req - The original request, containing the origin.\n * @param version - The version indicating the format of the typed data.\n * @param signingOpts - An options bag for signing.\n * @param signingOpts.parseJsonData - Whether to parse the JSON before signing.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedTypedMessage(\n messageParams: TypedMessageParams,\n req: OriginalRequest,\n version: string,\n signingOpts: TypedMessageSigningOptions,\n ): Promise<string> {\n return this.#newUnsignedAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n 'Typed Message',\n this.#signTypedMessage.bind(this),\n messageParams,\n req,\n undefined,\n version,\n signingOpts,\n );\n }\n\n /**\n * Called to update the message status as signed.\n *\n * @param messageId - The id of the Message to update.\n * @param signature - The data to update the message with.\n */\n setDeferredSignSuccess(messageId: string, signature: any) {\n this.#tryForEachMessageManager(\n this.#trySetDeferredSignSuccess,\n messageId,\n signature,\n );\n }\n\n /**\n * Called when the message metadata needs to be updated.\n *\n * @param messageId - The id of the message to update.\n * @param metadata - The data to update the metadata property in the message.\n */\n setMessageMetadata(messageId: string, metadata: Json) {\n this.#tryForEachMessageManager(\n this.#trySetMessageMetadata,\n messageId,\n metadata,\n );\n }\n\n /**\n * Called to cancel a signing message.\n *\n * @param messageId - The id of the Message to update.\n */\n setDeferredSignError(messageId: string) {\n this.#tryForEachMessageManager(this.#trySetDeferredSignError, messageId);\n }\n\n setTypedMessageInProgress(messageId: string) {\n this.#typedMessageManager.setMessageStatusInProgress(messageId);\n }\n\n setPersonalMessageInProgress(messageId: string) {\n this.#personalMessageManager.setMessageStatusInProgress(messageId);\n }\n\n #validateUnsignedMessage(messageParams: MessageParamsMetamask): void {\n if (!this.#isEthSignEnabled()) {\n throw ethErrors.rpc.methodNotFound(\n 'eth_sign has been disabled. You must enable it in the advanced settings',\n );\n }\n const data = this.#normalizeMsgData(messageParams.data);\n // 64 hex + \"0x\" at the beginning\n // This is needed because Ethereum's EcSign works only on 32 byte numbers\n // For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607\n if (data.length !== 66 && data.length !== 67) {\n throw ethErrors.rpc.invalidParams(\n 'eth_sign requires 32 byte message hash',\n );\n }\n }\n\n async #newUnsignedAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n SO,\n >(\n messageManager: AbstractMessageManager<M, P, PM>,\n approvalType: ApprovalType,\n messageName: string,\n signMessage: (messageParams: PM, signingOpts?: SO) => void,\n messageParams: PM,\n req: OriginalRequest,\n validateMessage?: (params: PM) => void,\n version?: string,\n signingOpts?: SO,\n ) {\n if (validateMessage) {\n validateMessage(messageParams);\n }\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\n try {\n const messageId = await messageManager.addUnapprovedMessage(\n messageParams,\n req,\n version,\n );\n\n const messageParamsWithId = {\n ...messageParams,\n metamaskId: messageId,\n ...(version && { version }),\n };\n\n const signaturePromise = messageManager.waitForFinishStatus(\n messageParamsWithId,\n messageName,\n );\n\n try {\n const acceptResult = await this.#requestApproval(\n messageParamsWithId,\n approvalType,\n );\n\n resultCallbacks = acceptResult.resultCallbacks;\n } catch {\n this.#cancelAbstractMessage(messageManager, messageId);\n throw ethErrors.provider.userRejectedRequest(\n 'User rejected the request.',\n );\n }\n\n await signMessage(messageParamsWithId, signingOpts);\n\n const signatureResult = await signaturePromise;\n\n /* istanbul ignore next */\n resultCallbacks?.success(signatureResult);\n\n return signatureResult;\n } catch (error) {\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n /**\n * Signifies user intent to complete an eth_sign method.\n *\n * @param msgParams - The params passed to eth_call.\n * @returns Signature result from signing.\n */\n async #signMessage(msgParams: MessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signMessage(cleanMsgParams),\n );\n }\n\n /**\n * Signifies a user's approval to sign a personal_sign message in queue.\n * Triggers signing, and the callback function from newUnsignedPersonalMessage.\n *\n * @param msgParams - The params of the message to sign & return to the Dapp.\n * @returns Signature result from signing.\n */\n async #signPersonalMessage(msgParams: PersonalMessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signPersonalMessage(cleanMsgParams),\n );\n }\n\n /**\n * The method for a user approving a call to eth_signTypedData, per EIP 712.\n * Triggers the callback in newUnsignedTypedMessage.\n *\n * @param msgParams - The params passed to eth_signTypedData.\n * @param opts - The options for the method.\n * @param opts.parseJsonData - Whether to parse JSON data before calling the KeyringController.\n * @returns Signature result from signing.\n */\n async #signTypedMessage(\n msgParams: TypedMessageParamsMetamask,\n /* istanbul ignore next */\n opts = { parseJsonData: true },\n ): Promise<any> {\n const { version } = msgParams;\n return await this.#signAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n msgParams,\n async (cleanMsgParams) => {\n const finalMessageParams = opts.parseJsonData\n ? this.#removeJsonData(cleanMsgParams, version as string)\n : cleanMsgParams;\n\n return await this.#keyringController.signTypedMessage(\n finalMessageParams,\n {\n version,\n },\n );\n },\n );\n }\n\n #tryForEachMessageManager(\n callbackFn: (\n messageManager: AbstractMessageManager<any, any, any>,\n ...args: any[]\n ) => boolean,\n ...args: any\n ) {\n const messageManagers = [\n this.#messageManager,\n this.#personalMessageManager,\n this.#typedMessageManager,\n ];\n\n for (const manager of messageManagers) {\n if (callbackFn(manager, ...args)) {\n return true;\n }\n }\n throw new Error('Message not found');\n }\n\n #trySetDeferredSignSuccess(\n messageManager: AbstractMessageManager<any, any, any>,\n messageId: string,\n signature: any,\n ) {\n try {\n messageManager.setMessageStatusSigned(messageId, signature);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n #trySetMessageMetadata(\n messageManager: AbstractMessageManager<any, any, any>,\n messageId: string,\n metadata: Json,\n ) {\n try {\n messageManager.setMetadata(messageId, metadata);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n #trySetDeferredSignError(\n messageManager: AbstractMessageManager<any, any, any>,\n messageId: string,\n ) {\n try {\n messageManager.rejectMessage(messageId);\n return true;\n } catch (error) {\n return false;\n }\n }\n\n #rejectUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager<M, P, PM>, reason?: string) {\n Object.keys(messageManager.getUnapprovedMessages()).forEach((messageId) => {\n this.#cancelAbstractMessage(messageManager, messageId, reason);\n });\n }\n\n #clearUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager<M, P, PM>) {\n messageManager.update({\n unapprovedMessages: {},\n unapprovedMessagesCount: 0,\n });\n }\n\n async #signAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager<M, P, PM>,\n methodName: string,\n msgParams: PM,\n getSignature: (cleanMessageParams: P) => Promise<any>,\n ) {\n console.info(`MetaMaskController - ${methodName}`);\n\n const messageId = msgParams.metamaskId as string;\n\n try {\n const cleanMessageParams = await messageManager.approveMessage(msgParams);\n\n try {\n const signature = await getSignature(cleanMessageParams);\n\n this.hub.emit(`${methodName}:signed`, { signature, messageId });\n\n if (!cleanMessageParams.deferSetAsSigned) {\n messageManager.setMessageStatusSigned(messageId, signature);\n }\n\n return signature;\n } catch (error) {\n this.hub.emit(`${messageId}:signError`, { error });\n throw error;\n }\n } catch (error: any) {\n console.info(`MetaMaskController - ${methodName} failed.`, error);\n this.#errorMessage(messageManager, messageId, error.message);\n throw error;\n }\n }\n\n #errorMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager<M, P, PM>,\n messageId: string,\n error: string,\n ) {\n if (messageManager instanceof TypedMessageManager) {\n messageManager.setMessageStatusErrored(messageId, error);\n } else {\n this.#cancelAbstractMessage(messageManager, messageId);\n }\n }\n\n #cancelAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager<M, P, PM>,\n messageId: string,\n reason?: string,\n ) {\n if (reason) {\n const message = this.#getMessage(messageId);\n this.hub.emit('cancelWithReason', { message, reason });\n }\n messageManager.rejectMessage(messageId);\n }\n\n #handleMessageManagerEvents<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager<M, P, PM>, eventName: string) {\n messageManager.hub.on('updateBadge', () => {\n this.hub.emit('updateBadge');\n });\n\n messageManager.hub.on(\n 'unapprovedMessage',\n (msgParams: AbstractMessageParamsMetamask) => {\n this.hub.emit(eventName, msgParams);\n },\n );\n }\n\n #subscribeToMessageState<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager<M, P, PM>,\n updateState: (\n state: SignatureControllerState,\n newMessages: Record<string, StateMessage>,\n messageCount: number,\n ) => void,\n ) {\n messageManager.subscribe((state: MessageManagerState<AbstractMessage>) => {\n const newMessages = this.#migrateMessages(\n state.unapprovedMessages as any,\n );\n\n this.update(() => {\n const newState = { ...this.state };\n updateState(newState, newMessages, state.unapprovedMessagesCount);\n return newState;\n });\n });\n }\n\n #migrateMessages(\n coreMessages: Record<string, CoreMessage>,\n ): Record<string, StateMessage> {\n const stateMessages: Record<string, StateMessage> = {};\n\n for (const messageId of Object.keys(coreMessages)) {\n const coreMessage = coreMessages[messageId];\n const stateMessage = this.#migrateMessage(coreMessage);\n\n stateMessages[messageId] = stateMessage;\n }\n\n return stateMessages;\n }\n\n #migrateMessage(coreMessage: CoreMessage): StateMessage {\n const { messageParams, ...coreMessageData } = coreMessage;\n\n // Core message managers use messageParams but frontend uses msgParams with lots of references\n const stateMessage = {\n ...coreMessageData,\n msgParams: messageParams,\n };\n\n return stateMessage as StateMessage;\n }\n\n #normalizeMsgData(data: string) {\n if (data.startsWith('0x')) {\n // data is already hex\n return data;\n }\n // data is unicode, convert to hex\n return bufferToHex(Buffer.from(data, 'utf8'));\n }\n\n #getMessage(messageId: string): StateMessage {\n return {\n ...this.state.unapprovedMsgs,\n ...this.state.unapprovedPersonalMsgs,\n ...this.state.unapprovedTypedMessages,\n }[messageId];\n }\n\n async #requestApproval(\n msgParams: AbstractMessageParamsMetamask,\n type: ApprovalType,\n ): Promise<AddResult> {\n const id = msgParams.metamaskId as string;\n const origin = msgParams.origin || ORIGIN_METAMASK;\n\n // We are explicitly cloning the message params here to prevent the mutation errors on development mode\n // Because sending it through the messaging system will make the object read only\n const clonedMsgParams = cloneDeep(msgParams);\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData: clonedMsgParams as Required<AbstractMessageParamsMetamask>,\n expectsResult: true,\n },\n true,\n )) as Promise<AddResult>;\n }\n\n #removeJsonData(\n messageParams: TypedMessageParams,\n version: string,\n ): TypedMessageParams {\n if (version === 'V1' || typeof messageParams.data !== 'string') {\n return messageParams;\n }\n\n return {\n ...messageParams,\n data: JSON.parse(messageParams.data),\n };\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './SignatureController';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./SignatureController"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC","sourcesContent":["export * from './SignatureController';\n"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@metamask-previews/signature-controller",
3
+ "version": "5.3.0-preview.d32a7cc",
4
+ "description": "Processes signing requests in order to sign arbitrary and typed data",
5
+ "keywords": [
6
+ "MetaMask",
7
+ "Ethereum"
8
+ ],
9
+ "homepage": "https://github.com/MetaMask/core/tree/main/packages/signature-controller#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/MetaMask/core/issues"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/MetaMask/core.git"
16
+ },
17
+ "license": "MIT",
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "files": [
21
+ "dist/"
22
+ ],
23
+ "scripts": {
24
+ "build:docs": "typedoc",
25
+ "changelog:validate": "../../scripts/validate-changelog.sh @metamask/signature-controller",
26
+ "publish:preview": "yarn npm publish --tag preview",
27
+ "test": "jest",
28
+ "test:watch": "jest --watch"
29
+ },
30
+ "dependencies": {
31
+ "@metamask-previews/approval-controller": "3.5.0-preview.d32a7cc",
32
+ "@metamask-previews/base-controller": "3.2.0-preview.d32a7cc",
33
+ "@metamask-previews/controller-utils": "4.3.1-preview.d32a7cc",
34
+ "@metamask-previews/message-manager": "7.3.0-preview.d32a7cc",
35
+ "@metamask/utils": "^6.2.0",
36
+ "eth-rpc-errors": "^4.0.2",
37
+ "ethereumjs-util": "^7.0.10",
38
+ "immer": "^9.0.6",
39
+ "lodash": "^4.17.21"
40
+ },
41
+ "devDependencies": {
42
+ "@metamask/auto-changelog": "^3.1.0",
43
+ "@types/jest": "^27.4.1",
44
+ "deepmerge": "^4.2.2",
45
+ "jest": "^27.5.1",
46
+ "ts-jest": "^27.1.4",
47
+ "typedoc": "^0.22.15",
48
+ "typedoc-plugin-missing-exports": "^0.22.6",
49
+ "typescript": "~4.6.3"
50
+ },
51
+ "peerDependencies": {
52
+ "@metamask-previews/approval-controller": "3.5.0-preview.d32a7cc"
53
+ },
54
+ "engines": {
55
+ "node": ">=16.0.0"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public",
59
+ "registry": "https://registry.npmjs.org/"
60
+ }
61
+ }