@metamask-previews/signature-controller 19.1.0-preview-d33a5c02 → 19.1.0-preview-e46fca9e

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.
@@ -13,23 +13,28 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _SignatureController_instances, _SignatureController_getAllState, _SignatureController_personalMessageManager, _SignatureController_typedMessageManager, _SignatureController_trace, _SignatureController_newUnsignedAbstractMessage, _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_getMessage, _SignatureController_requestApproval, _SignatureController_removeJsonData, _SignatureController_addLog, _SignatureController_getSignTypeForLogger;
16
+ var _SignatureController_instances, _SignatureController_getCurrentChainId, _SignatureController_trace, _SignatureController_parseTypedData, _SignatureController_processSignatureRequest, _SignatureController_approveAndSignRequest, _SignatureController_signRequest, _SignatureController_rejectSignatureRequest, _SignatureController_waitForSignatureRequestFinished, _SignatureController_requestApproval, _SignatureController_updateMetadata, _SignatureController_updateState, _SignatureController_generateLegacyState, _SignatureController_addLog, _SignatureController_getSignTypeForLogger;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.SignatureController = void 0;
19
19
  const base_controller_1 = require("@metamask/base-controller");
20
20
  const controller_utils_1 = require("@metamask/controller-utils");
21
+ const keyring_controller_1 = require("@metamask/keyring-controller");
21
22
  const logging_controller_1 = require("@metamask/logging-controller");
22
- const message_manager_1 = require("@metamask/message-manager");
23
23
  const events_1 = __importDefault(require("events"));
24
- const lodash_1 = require("lodash");
24
+ const uuid_1 = require("uuid");
25
+ const logger_1 = require("./logger.cjs");
26
+ const types_1 = require("./types.cjs");
27
+ const validation_1 = require("./utils/validation.cjs");
25
28
  const controllerName = 'SignatureController';
26
29
  const stateMetadata = {
30
+ signatureRequests: { persist: false, anonymous: false },
27
31
  unapprovedPersonalMsgs: { persist: false, anonymous: false },
28
32
  unapprovedTypedMessages: { persist: false, anonymous: false },
29
33
  unapprovedPersonalMsgCount: { persist: false, anonymous: false },
30
34
  unapprovedTypedMessagesCount: { persist: false, anonymous: false },
31
35
  };
32
36
  const getDefaultState = () => ({
37
+ signatureRequests: {},
33
38
  unapprovedPersonalMsgs: {},
34
39
  unapprovedTypedMessages: {},
35
40
  unapprovedPersonalMsgCount: 0,
@@ -43,79 +48,59 @@ class SignatureController extends base_controller_1.BaseController {
43
48
  * Construct a Sign controller.
44
49
  *
45
50
  * @param options - The controller options.
51
+ * @param options.getCurrentChainId - A function that returns the current chain ID.
46
52
  * @param options.messenger - The restricted controller messenger for the sign controller.
47
- * @param options.getAllState - Callback to retrieve all user state.
48
- * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.
49
- * @param options.getCurrentChainId - A function for retrieving the current chainId.
53
+ * @param options.state - Initial state to set on this controller.
50
54
  * @param options.trace - Callback to generate trace information.
51
55
  */
52
- constructor({ getAllState, getCurrentChainId, messenger, securityProviderRequest, trace, }) {
56
+ constructor({ getCurrentChainId, messenger, state, trace, }) {
53
57
  super({
54
58
  name: controllerName,
55
59
  metadata: stateMetadata,
56
60
  messenger,
57
- state: getDefaultState(),
61
+ state: {
62
+ ...getDefaultState(),
63
+ ...state,
64
+ },
58
65
  });
59
66
  _SignatureController_instances.add(this);
60
- // TODO: Replace `any` with type
61
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
- _SignatureController_getAllState.set(this, void 0);
63
- _SignatureController_personalMessageManager.set(this, void 0);
64
- _SignatureController_typedMessageManager.set(this, void 0);
67
+ _SignatureController_getCurrentChainId.set(this, void 0);
65
68
  _SignatureController_trace.set(this, void 0);
66
- __classPrivateFieldSet(this, _SignatureController_getAllState, getAllState, "f");
67
69
  this.hub = new events_1.default();
68
- __classPrivateFieldSet(this, _SignatureController_personalMessageManager, new message_manager_1.PersonalMessageManager(undefined, undefined, securityProviderRequest), "f");
69
- __classPrivateFieldSet(this, _SignatureController_typedMessageManager, new message_manager_1.TypedMessageManager(undefined, undefined, securityProviderRequest, undefined, getCurrentChainId), "f");
70
+ __classPrivateFieldSet(this, _SignatureController_getCurrentChainId, getCurrentChainId, "f");
70
71
  __classPrivateFieldSet(this, _SignatureController_trace, trace ?? ((_request, fn) => fn?.()), "f");
71
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), 'unapprovedPersonalMessage');
72
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), 'unapprovedTypedMessage');
73
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), (state, newMessages, messageCount) => {
74
- state.unapprovedPersonalMsgs = newMessages;
75
- state.unapprovedPersonalMsgCount = messageCount;
76
- });
77
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), (state, newMessages, messageCount) => {
78
- state.unapprovedTypedMessages = newMessages;
79
- state.unapprovedTypedMessagesCount = messageCount;
80
- });
81
72
  }
82
73
  /**
83
74
  * A getter for the number of 'unapproved' PersonalMessages in this.messages.
84
- *
75
+ * @deprecated Use `signatureRequests` state instead.
85
76
  * @returns The number of 'unapproved' PersonalMessages in this.messages
86
77
  */
87
78
  get unapprovedPersonalMessagesCount() {
88
- return __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").getUnapprovedMessagesCount();
79
+ return this.state.unapprovedPersonalMsgCount;
89
80
  }
90
81
  /**
91
82
  * A getter for the number of 'unapproved' TypedMessages in this.messages.
92
- *
83
+ * @deprecated Use `signatureRequests` state instead.
93
84
  * @returns The number of 'unapproved' TypedMessages in this.messages
94
85
  */
95
86
  get unapprovedTypedMessagesCount() {
96
- return __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").getUnapprovedMessagesCount();
87
+ return this.state.unapprovedTypedMessagesCount;
97
88
  }
98
89
  /**
99
90
  * A getter for returning all messages.
100
- *
91
+ * @deprecated Use `signatureRequests` state instead.
101
92
  * @returns The object containing all messages.
102
93
  */
103
94
  get messages() {
104
- const messages = [
105
- ...__classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").getAllMessages(),
106
- ...__classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").getAllMessages(),
107
- ];
108
- const messagesObject = messages.reduce((acc, message) => {
109
- acc[message.id] = message;
110
- return acc;
111
- }, {});
112
- return messagesObject;
95
+ return this.state.signatureRequests;
113
96
  }
114
97
  /**
115
98
  * Reset the controller state to the initial state.
116
99
  */
117
100
  resetState() {
118
- this.update(() => getDefaultState());
101
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateState).call(this, (state) => {
102
+ Object.assign(state, getDefaultState());
103
+ });
119
104
  }
120
105
  /**
121
106
  * Reject all unapproved messages of any type.
@@ -123,303 +108,262 @@ class SignatureController extends base_controller_1.BaseController {
123
108
  * @param reason - A message to indicate why.
124
109
  */
125
110
  rejectUnapproved(reason) {
126
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), reason);
127
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), reason);
111
+ const unapprovedSignatureRequests = Object.values(this.state.signatureRequests).filter((metadata) => metadata.status === types_1.SignatureRequestStatus.Unapproved);
112
+ for (const metadata of unapprovedSignatureRequests) {
113
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectSignatureRequest).call(this, metadata.id, reason);
114
+ }
128
115
  }
129
116
  /**
130
117
  * Clears all unapproved messages from memory.
131
118
  */
132
119
  clearUnapproved() {
133
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_clearUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"));
134
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_clearUnapproved).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"));
120
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateState).call(this, (state) => {
121
+ Object.values(state.signatureRequests)
122
+ .filter((metadata) => metadata.status === types_1.SignatureRequestStatus.Unapproved)
123
+ .forEach((metadata) => delete state.signatureRequests[metadata.id]);
124
+ });
135
125
  }
136
126
  /**
137
- * Called when a dapp uses the personal_sign method.
127
+ * Called when a dApp uses the personal_sign method.
128
+ * We currently provide personal_sign mostly for legacy dApps.
138
129
  *
139
- * We currently define personal_sign mostly for legacy Dapps.
140
- *
141
- * @param messageParams - The params of the message to sign & return to the Dapp.
142
- * @param req - The original request, containing the origin.
130
+ * @param messageParams - The params of the message to sign and return to the dApp.
131
+ * @param request - The original request, containing the origin.
143
132
  * @param options - An options bag for the method.
144
133
  * @param options.traceContext - The parent context for any new traces.
145
- * @returns Promise resolving to the raw data of the signature request.
134
+ * @returns Promise resolving to the raw signature hash generated from the signature request.
146
135
  */
147
- async newUnsignedPersonalMessage(messageParams, req, options = {}) {
148
- return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, logging_controller_1.SigningMethod.PersonalSign, 'Personal Message',
149
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
150
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
151
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signPersonalMessage).bind(this), messageParams, req, undefined, undefined, options.traceContext);
136
+ async newUnsignedPersonalMessage(messageParams, request, options = {}) {
137
+ (0, validation_1.validatePersonalSignatureRequest)(messageParams);
138
+ messageParams.siwe = (0, controller_utils_1.detectSIWE)(messageParams);
139
+ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_processSignatureRequest).call(this, {
140
+ messageParams,
141
+ request,
142
+ type: types_1.SignatureRequestType.PersonalSign,
143
+ approvalType: controller_utils_1.ApprovalType.PersonalSign,
144
+ traceContext: options.traceContext,
145
+ });
152
146
  }
153
147
  /**
154
- * Called when a dapp uses the eth_signTypedData method, per EIP 712.
148
+ * Called when a dapp uses the eth_signTypedData method, per EIP-712.
155
149
  *
156
- * @param messageParams - The params passed to eth_signTypedData.
157
- * @param req - The original request, containing the origin.
158
- * @param version - The version indicating the format of the typed data.
159
- * @param signingOpts - An options bag for signing.
160
- * @param signingOpts.parseJsonData - Whether to parse the JSON before signing.
150
+ * @param messageParams - The params of the message to sign and return to the dApp.
151
+ * @param request - The original request, containing the origin.
152
+ * @param version - The version of the signTypedData request.
153
+ * @param signingOptions - Options for signing the typed message.
161
154
  * @param options - An options bag for the method.
162
155
  * @param options.traceContext - The parent context for any new traces.
163
- * @returns Promise resolving to the raw data of the signature request.
156
+ * @returns Promise resolving to the raw signature hash generated from the signature request.
164
157
  */
165
- async newUnsignedTypedMessage(messageParams, req, version, signingOpts, options = {}) {
166
- const signTypeForLogger = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_getSignTypeForLogger).call(this, version);
167
- return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, signTypeForLogger, 'Typed Message',
168
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
169
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
170
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signTypedMessage).bind(this), messageParams, req, version, signingOpts, options.traceContext);
158
+ async newUnsignedTypedMessage(messageParams, request, version, signingOptions, options = {}) {
159
+ (0, validation_1.validateTypedSignatureRequest)(messageParams, version, __classPrivateFieldGet(this, _SignatureController_getCurrentChainId, "f").call(this));
160
+ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_processSignatureRequest).call(this, {
161
+ messageParams,
162
+ request,
163
+ type: types_1.SignatureRequestType.TypedSign,
164
+ approvalType: controller_utils_1.ApprovalType.EthSignTypedData,
165
+ version: version,
166
+ signingOptions,
167
+ traceContext: options.traceContext,
168
+ });
171
169
  }
172
170
  /**
173
- * Called to update the message status as signed.
171
+ * Provide a signature for a pending signature request that used `deferSetAsSigned`.
172
+ * Changes the status of the signature request to `signed`.
174
173
  *
175
- * @param messageId - The id of the Message to update.
176
- * @param signature - The data to update the message with.
174
+ * @param signatureRequestId - The ID of the signature request.
175
+ * @param signature - The signature to provide.
177
176
  */
178
- // TODO: Replace `any` with type
179
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
- setDeferredSignSuccess(messageId, signature) {
181
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetDeferredSignSuccess), messageId, signature);
177
+ setDeferredSignSuccess(signatureRequestId, signature) {
178
+ const updatedSignatureRequest = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, signatureRequestId, (draftMetadata) => {
179
+ draftMetadata.signature = signature;
180
+ draftMetadata.status = types_1.SignatureRequestStatus.Signed;
181
+ });
182
+ this.hub.emit(`${signatureRequestId}:finished`, updatedSignatureRequest);
182
183
  }
183
184
  /**
184
- * Called when the message metadata needs to be updated.
185
- *
186
- * @param messageId - The id of the message to update.
187
- * @param metadata - The data to update the metadata property in the message.
185
+ * Set custom metadata on a signature request.
186
+ * @param signatureRequestId - The ID of the signature request.
187
+ * @param metadata - The custom metadata to set.
188
188
  */
189
- setMessageMetadata(messageId, metadata) {
190
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetMessageMetadata), messageId, metadata);
189
+ setMessageMetadata(signatureRequestId, metadata) {
190
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, signatureRequestId, (draftMetadata) => {
191
+ draftMetadata.metadata = metadata;
192
+ });
191
193
  }
192
194
  /**
193
- * Called to cancel a signing message.
195
+ * Reject a pending signature request that used `deferSetAsSigned`.
196
+ * Changes the status of the signature request to `rejected`.
194
197
  *
195
- * @param messageId - The id of the Message to update.
198
+ * @param signatureRequestId - The ID of the signature request.
196
199
  */
197
- setDeferredSignError(messageId) {
198
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_tryForEachMessageManager).call(this, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_trySetDeferredSignError), messageId);
200
+ setDeferredSignError(signatureRequestId) {
201
+ const updatedSignatureRequest = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, signatureRequestId, (draftMetadata) => {
202
+ draftMetadata.status = types_1.SignatureRequestStatus.Rejected;
203
+ });
204
+ this.hub.emit(`${signatureRequestId}:finished`, updatedSignatureRequest);
199
205
  }
200
- setTypedMessageInProgress(messageId) {
201
- __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f").setMessageStatusInProgress(messageId);
206
+ /**
207
+ * Set the status of a signature request to 'inProgress'.
208
+ *
209
+ * @param signatureRequestId - The ID of the signature request.
210
+ */
211
+ setTypedMessageInProgress(signatureRequestId) {
212
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, signatureRequestId, (draftMetadata) => {
213
+ draftMetadata.status = types_1.SignatureRequestStatus.InProgress;
214
+ });
202
215
  }
203
- setPersonalMessageInProgress(messageId) {
204
- __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f").setMessageStatusInProgress(messageId);
216
+ /**
217
+ * Set the status of a signature request to 'inProgress'.
218
+ *
219
+ * @param signatureRequestId - The ID of the signature request.
220
+ */
221
+ setPersonalMessageInProgress(signatureRequestId) {
222
+ this.setTypedMessageInProgress(signatureRequestId);
205
223
  }
206
224
  }
207
225
  exports.SignatureController = SignatureController;
208
- _SignatureController_getAllState = new WeakMap(), _SignatureController_personalMessageManager = new WeakMap(), _SignatureController_typedMessageManager = new WeakMap(), _SignatureController_trace = new WeakMap(), _SignatureController_instances = new WeakSet(), _SignatureController_newUnsignedAbstractMessage = async function _SignatureController_newUnsignedAbstractMessage(messageManager, approvalType, signTypeForLogger, messageName, signMessage, messageParams, req, version, signingOpts, traceContext) {
226
+ _SignatureController_getCurrentChainId = new WeakMap(), _SignatureController_trace = new WeakMap(), _SignatureController_instances = new WeakSet(), _SignatureController_parseTypedData = function _SignatureController_parseTypedData(messageParams, version) {
227
+ if (![keyring_controller_1.SignTypedDataVersion.V3, keyring_controller_1.SignTypedDataVersion.V4].includes(version) ||
228
+ typeof messageParams.data !== 'string') {
229
+ return messageParams;
230
+ }
231
+ return {
232
+ ...messageParams,
233
+ data: JSON.parse(messageParams.data),
234
+ };
235
+ }, _SignatureController_processSignatureRequest = async function _SignatureController_processSignatureRequest({ messageParams, request, type, approvalType, version, signingOptions, traceContext, }) {
236
+ (0, logger_1.projectLogger)('Processing signature request', {
237
+ messageParams,
238
+ request,
239
+ type,
240
+ version,
241
+ });
242
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, type, version, logging_controller_1.SigningStage.Proposed, messageParams);
243
+ const { securityAlertResponse } = request;
244
+ const finalMessageParams = {
245
+ ...messageParams,
246
+ origin: request.origin,
247
+ requestId: request.id,
248
+ };
209
249
  let resultCallbacks;
210
250
  try {
211
- const messageId = await messageManager.addUnapprovedMessage(messageParams, req, version);
212
- const messageParamsWithId = {
213
- ...messageParams,
214
- metamaskId: messageId,
215
- ...(version && { version }),
251
+ const metadata = {
252
+ id: (0, uuid_1.v1)(),
253
+ request: finalMessageParams,
254
+ securityAlertResponse,
255
+ signingOptions,
256
+ status: types_1.SignatureRequestStatus.Unapproved,
257
+ time: Date.now(),
258
+ type,
259
+ version,
216
260
  };
217
- const signaturePromise = messageManager.waitForFinishStatus(messageParamsWithId, messageName);
261
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateState).call(this, (state) => {
262
+ state.signatureRequests[metadata.id] = metadata;
263
+ });
264
+ this.hub.emit('unapprovedMessage', {
265
+ messageParams,
266
+ metamaskId: metadata.id,
267
+ });
268
+ const finishedPromise = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_waitForSignatureRequestFinished).call(this, metadata.id);
218
269
  try {
219
- // Signature request is proposed to the user
220
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, signTypeForLogger, logging_controller_1.SigningStage.Proposed, messageParamsWithId);
221
- const acceptResult = await __classPrivateFieldGet(this, _SignatureController_trace, "f").call(this, { name: 'Await Approval', parentContext: traceContext }, (context) => __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, messageParamsWithId, approvalType, {
270
+ const acceptResult = await __classPrivateFieldGet(this, _SignatureController_trace, "f").call(this, { name: 'Await Approval', parentContext: traceContext }, (context) => __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, metadata, approvalType, {
222
271
  traceContext: context,
223
- actionId: req?.id?.toString(),
272
+ actionId: request?.id?.toString(),
224
273
  }));
225
274
  resultCallbacks = acceptResult.resultCallbacks;
226
275
  }
227
276
  catch (error) {
228
- // User rejected the signature request
229
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, signTypeForLogger, logging_controller_1.SigningStage.Rejected, messageParamsWithId);
230
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
277
+ (0, logger_1.projectLogger)('User rejected request', metadata.id);
278
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, type, version, logging_controller_1.SigningStage.Rejected, messageParams);
279
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectSignatureRequest).call(this, metadata.id);
231
280
  throw error;
232
281
  }
233
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
234
- // eslint-disable-next-line @typescript-eslint/await-thenable
235
- await __classPrivateFieldGet(this, _SignatureController_trace, "f").call(this, { name: 'Sign', parentContext: traceContext }, () => signMessage(messageParamsWithId, signingOpts));
236
- const signatureResult = await signaturePromise;
237
- // Signature operation is completed
238
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, signTypeForLogger, logging_controller_1.SigningStage.Signed, messageParamsWithId);
239
- /* istanbul ignore next */
240
- resultCallbacks?.success(signatureResult);
241
- return signatureResult;
282
+ await __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_approveAndSignRequest).call(this, metadata, traceContext);
283
+ const signature = await finishedPromise;
284
+ (0, logger_1.projectLogger)('Signature request finished', { id: metadata.id, signature });
285
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_addLog).call(this, type, version, logging_controller_1.SigningStage.Signed, messageParams);
286
+ resultCallbacks?.success(signature);
287
+ return signature;
242
288
  }
243
289
  catch (error) {
290
+ (0, logger_1.projectLogger)('Signature request failed', error);
244
291
  resultCallbacks?.error(error);
245
292
  throw error;
246
293
  }
247
- }, _SignatureController_signPersonalMessage =
248
- /**
249
- * Signifies a user's approval to sign a personal_sign message in queue.
250
- * Triggers signing, and the callback function from newUnsignedPersonalMessage.
251
- *
252
- * @param msgParams - The params of the message to sign & return to the Dapp.
253
- * @returns Signature result from signing.
254
- */
255
- async function _SignatureController_signPersonalMessage(msgParams) {
256
- return await __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, async (cleanMsgParams) => await this.messagingSystem.call('KeyringController:signPersonalMessage', cleanMsgParams));
257
- }, _SignatureController_signTypedMessage =
258
- /**
259
- * The method for a user approving a call to eth_signTypedData, per EIP 712.
260
- * Triggers the callback in newUnsignedTypedMessage.
261
- *
262
- * @param msgParams - The params passed to eth_signTypedData.
263
- * @param opts - The options for the method.
264
- * @param opts.parseJsonData - Whether to parse JSON data before calling the KeyringController.
265
- * @returns Signature result from signing.
266
- */
267
- async function _SignatureController_signTypedMessage(msgParams,
268
- /* istanbul ignore next */
269
- opts = { parseJsonData: true }) {
270
- const { version } = msgParams;
271
- return await __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, msgParams, async (cleanMsgParams) => {
272
- const finalMessageParams = opts.parseJsonData
273
- ? __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_removeJsonData).call(this, cleanMsgParams, version)
274
- : cleanMsgParams;
275
- return await this.messagingSystem.call('KeyringController:signTypedMessage', finalMessageParams, version);
276
- });
277
- }, _SignatureController_tryForEachMessageManager = function _SignatureController_tryForEachMessageManager(callbackFn,
278
- // TODO: Replace `any` with type
279
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
280
- ...args) {
281
- const messageManagers = [
282
- __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"),
283
- __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"),
284
- ];
285
- for (const manager of messageManagers) {
286
- if (callbackFn(manager, ...args)) {
287
- return true;
288
- }
289
- }
290
- throw new Error('Message not found');
291
- }, _SignatureController_trySetDeferredSignSuccess = function _SignatureController_trySetDeferredSignSuccess(
292
- // TODO: Replace `any` with type
293
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
294
- messageManager, messageId,
295
- // TODO: Replace `any` with type
296
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
297
- signature) {
298
- try {
299
- messageManager.setMessageStatusSigned(messageId, signature);
300
- return true;
301
- }
302
- catch (error) {
303
- return false;
304
- }
305
- }, _SignatureController_trySetMessageMetadata = function _SignatureController_trySetMessageMetadata(
306
- // TODO: Replace `any` with type
307
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
- messageManager, messageId, metadata) {
309
- try {
310
- messageManager.setMetadata(messageId, metadata);
311
- return true;
312
- }
313
- catch (error) {
314
- return false;
315
- }
316
- }, _SignatureController_trySetDeferredSignError = function _SignatureController_trySetDeferredSignError(
317
- // TODO: Replace `any` with type
318
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
319
- messageManager, messageId) {
320
- try {
321
- messageManager.rejectMessage(messageId);
322
- return true;
323
- }
324
- catch (error) {
325
- return false;
326
- }
327
- }, _SignatureController_rejectUnapproved = function _SignatureController_rejectUnapproved(messageManager, reason) {
328
- Object.keys(messageManager.getUnapprovedMessages()).forEach((messageId) => {
329
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId, reason);
330
- });
331
- }, _SignatureController_clearUnapproved = function _SignatureController_clearUnapproved(messageManager) {
332
- messageManager.update({
333
- unapprovedMessages: {},
334
- unapprovedMessagesCount: 0,
294
+ }, _SignatureController_approveAndSignRequest = async function _SignatureController_approveAndSignRequest(metadata, traceContext) {
295
+ const { id } = metadata;
296
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, id, (draftMetadata) => {
297
+ draftMetadata.status = types_1.SignatureRequestStatus.Approved;
335
298
  });
336
- }, _SignatureController_signAbstractMessage = async function _SignatureController_signAbstractMessage(messageManager, methodName, msgParams,
337
- // TODO: Replace `any` with type
338
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
339
- getSignature) {
340
- console.info(`MetaMaskController - ${methodName}`);
341
- const messageId = msgParams.metamaskId;
299
+ await __classPrivateFieldGet(this, _SignatureController_trace, "f").call(this, { name: 'Sign', parentContext: traceContext }, () => __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signRequest).call(this, metadata));
300
+ }, _SignatureController_signRequest = async function _SignatureController_signRequest(metadata) {
301
+ const { id, request, signingOptions, type } = metadata;
342
302
  try {
343
- const cleanMessageParams = await messageManager.approveMessage(msgParams);
344
- try {
345
- const signature = await getSignature(cleanMessageParams);
346
- this.hub.emit(`${methodName}:signed`, { signature, messageId });
347
- if (!cleanMessageParams.deferSetAsSigned) {
348
- messageManager.setMessageStatusSigned(messageId, signature);
349
- }
350
- return signature;
303
+ let signature;
304
+ switch (type) {
305
+ case types_1.SignatureRequestType.PersonalSign:
306
+ signature = await this.messagingSystem.call('KeyringController:signPersonalMessage', request);
307
+ break;
308
+ case types_1.SignatureRequestType.TypedSign:
309
+ const finalRequest = signingOptions?.parseJsonData
310
+ ? __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_parseTypedData).call(this, request, metadata.version)
311
+ : request;
312
+ signature = await this.messagingSystem.call('KeyringController:signTypedMessage', finalRequest, metadata.version);
313
+ break;
314
+ /* istanbul ignore next */
315
+ default:
316
+ throw new Error(`Unknown signature request type: ${type}`);
351
317
  }
352
- catch (error) {
353
- this.hub.emit(`${messageId}:signError`, { error });
354
- throw error;
318
+ this.hub.emit(`${type}:signed`, { signature, messageId: id });
319
+ if (request.deferSetAsSigned) {
320
+ return;
355
321
  }
356
- // TODO: Replace `any` with type
357
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
322
+ const finalMetadata = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, id, (draftMetadata) => {
323
+ draftMetadata.signature = signature;
324
+ draftMetadata.status = types_1.SignatureRequestStatus.Signed;
325
+ });
326
+ this.hub.emit(`${id}:finished`, finalMetadata);
358
327
  }
359
328
  catch (error) {
360
- console.info(`MetaMaskController - ${methodName} failed.`, error);
361
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_errorMessage).call(this, messageManager, messageId, error.message);
329
+ if (type === types_1.SignatureRequestType.TypedSign) {
330
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, id, (draftMetadata) => {
331
+ draftMetadata.status = types_1.SignatureRequestStatus.Errored;
332
+ draftMetadata.error = error.message;
333
+ });
334
+ }
335
+ else {
336
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_rejectSignatureRequest).call(this, id);
337
+ }
338
+ this.hub.emit(`${id}:signError`, { error });
362
339
  throw error;
363
340
  }
364
- }, _SignatureController_errorMessage = function _SignatureController_errorMessage(messageManager, messageId, error) {
365
- if (messageManager instanceof message_manager_1.TypedMessageManager) {
366
- messageManager.setMessageStatusErrored(messageId, error);
367
- }
368
- else {
369
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
370
- }
371
- }, _SignatureController_cancelAbstractMessage = function _SignatureController_cancelAbstractMessage(messageManager, messageId, reason) {
341
+ }, _SignatureController_rejectSignatureRequest = function _SignatureController_rejectSignatureRequest(signatureRequestId, reason) {
372
342
  if (reason) {
373
- const message = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_getMessage).call(this, messageId);
374
- this.hub.emit('cancelWithReason', { message, reason });
343
+ const metadata = this.state.signatureRequests[signatureRequestId];
344
+ this.hub.emit('cancelWithReason', { metadata, reason });
375
345
  }
376
- messageManager.rejectMessage(messageId);
377
- }, _SignatureController_handleMessageManagerEvents = function _SignatureController_handleMessageManagerEvents(messageManager, eventName) {
378
- messageManager.hub.on('updateBadge', () => {
379
- this.hub.emit('updateBadge');
380
- });
381
- messageManager.hub.on('unapprovedMessage', (msgParams) => {
382
- this.hub.emit(eventName, msgParams);
346
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateMetadata).call(this, signatureRequestId, (draftMetadata) => {
347
+ draftMetadata.status = types_1.SignatureRequestStatus.Rejected;
383
348
  });
384
- }, _SignatureController_subscribeToMessageState = function _SignatureController_subscribeToMessageState(messageManager, updateState) {
385
- messageManager.subscribe((state) => {
386
- const newMessages = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_migrateMessages).call(this,
387
- // TODO: Replace `any` with type
388
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
389
- state.unapprovedMessages);
390
- this.update(() => {
391
- const newState = { ...this.state };
392
- updateState(newState, newMessages, state.unapprovedMessagesCount);
393
- return newState;
349
+ }, _SignatureController_waitForSignatureRequestFinished = async function _SignatureController_waitForSignatureRequestFinished(id) {
350
+ return new Promise((resolve, reject) => {
351
+ this.hub.once(`${id}:finished`, (metadata) => {
352
+ const { request, signature, status, type } = metadata;
353
+ switch (status) {
354
+ case types_1.SignatureRequestStatus.Signed:
355
+ return resolve(signature);
356
+ case types_1.SignatureRequestStatus.Rejected:
357
+ return reject(new Error(`MetaMask ${type} Signature: User denied message signature.`));
358
+ /* istanbul ignore next */
359
+ default:
360
+ return reject(new Error(`MetaMask ${type} Signature: Unknown problem: ${JSON.stringify(request)}`));
361
+ }
394
362
  });
395
363
  });
396
- }, _SignatureController_migrateMessages = function _SignatureController_migrateMessages(coreMessages) {
397
- const stateMessages = {};
398
- for (const messageId of Object.keys(coreMessages)) {
399
- const coreMessage = coreMessages[messageId];
400
- const stateMessage = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_migrateMessage).call(this, coreMessage);
401
- stateMessages[messageId] = stateMessage;
402
- }
403
- return stateMessages;
404
- }, _SignatureController_migrateMessage = function _SignatureController_migrateMessage(coreMessage) {
405
- const { messageParams, ...coreMessageData } = coreMessage;
406
- // Core message managers use messageParams but frontend uses msgParams with lots of references
407
- const stateMessage = {
408
- ...coreMessageData,
409
- msgParams: messageParams,
410
- };
411
- return stateMessage;
412
- }, _SignatureController_getMessage = function _SignatureController_getMessage(messageId) {
413
- return {
414
- ...this.state.unapprovedPersonalMsgs,
415
- ...this.state.unapprovedTypedMessages,
416
- }[messageId];
417
- }, _SignatureController_requestApproval = async function _SignatureController_requestApproval(msgParams, type, { traceContext, actionId, }) {
418
- const id = msgParams.metamaskId;
419
- const origin = msgParams.origin || controller_utils_1.ORIGIN_METAMASK;
420
- // We are explicitly cloning the message params here to prevent the mutation errors on development mode
421
- // Because sending it through the messaging system will make the object read only
422
- const clonedMsgParams = (0, lodash_1.cloneDeep)(msgParams);
364
+ }, _SignatureController_requestApproval = async function _SignatureController_requestApproval(metadata, type, { traceContext, actionId, }) {
365
+ const { id, request } = metadata;
366
+ const origin = request.origin || controller_utils_1.ORIGIN_METAMASK;
423
367
  await __classPrivateFieldGet(this, _SignatureController_trace, "f").call(this, {
424
368
  name: 'Notification Display',
425
369
  id: actionId,
@@ -429,18 +373,37 @@ getSignature) {
429
373
  id,
430
374
  origin,
431
375
  type,
432
- requestData: clonedMsgParams,
376
+ requestData: { ...request },
433
377
  expectsResult: true,
434
378
  }, true));
435
- }, _SignatureController_removeJsonData = function _SignatureController_removeJsonData(messageParams, version) {
436
- if (version === 'V1' || typeof messageParams.data !== 'string') {
437
- return messageParams;
438
- }
439
- return {
440
- ...messageParams,
441
- data: JSON.parse(messageParams.data),
442
- };
443
- }, _SignatureController_addLog = function _SignatureController_addLog(signingMethod, stage, signingData) {
379
+ }, _SignatureController_updateMetadata = function _SignatureController_updateMetadata(id, callback) {
380
+ const { nextState } = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_updateState).call(this, (state) => {
381
+ const metadata = state.signatureRequests[id];
382
+ if (!metadata) {
383
+ throw new Error(`Signature request with id ${id} not found`);
384
+ }
385
+ callback(metadata);
386
+ });
387
+ return nextState.signatureRequests[id];
388
+ }, _SignatureController_updateState = function _SignatureController_updateState(callback) {
389
+ return this.update((state) => {
390
+ // eslint-disable-next-line n/callback-return, n/no-callback-literal
391
+ callback(state);
392
+ const unapprovedRequests = Object.values(state.signatureRequests).filter((request) => request.status === types_1.SignatureRequestStatus.Unapproved);
393
+ state.unapprovedPersonalMsgs = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_generateLegacyState).call(this, unapprovedRequests, types_1.SignatureRequestType.PersonalSign);
394
+ state.unapprovedTypedMessages = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_generateLegacyState).call(this, unapprovedRequests, types_1.SignatureRequestType.TypedSign);
395
+ state.unapprovedPersonalMsgCount = Object.values(state.unapprovedPersonalMsgs).length;
396
+ state.unapprovedTypedMessagesCount = Object.values(state.unapprovedTypedMessages).length;
397
+ });
398
+ }, _SignatureController_generateLegacyState = function _SignatureController_generateLegacyState(unapprovedSignatureRequests, type) {
399
+ return unapprovedSignatureRequests
400
+ .filter((request) => request.type === type)
401
+ .reduce((acc, request) => ({
402
+ ...acc,
403
+ [request.id]: { ...request, msgParams: request.request },
404
+ }), {});
405
+ }, _SignatureController_addLog = function _SignatureController_addLog(signatureRequestType, version, stage, signingData) {
406
+ const signingMethod = __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_getSignTypeForLogger).call(this, signatureRequestType, version);
444
407
  this.messagingSystem.call('LoggingController:add', {
445
408
  type: logging_controller_1.LogType.EthSignLog,
446
409
  data: {
@@ -449,14 +412,18 @@ getSignature) {
449
412
  signingData,
450
413
  },
451
414
  });
452
- }, _SignatureController_getSignTypeForLogger = function _SignatureController_getSignTypeForLogger(version) {
453
- let signTypeForLogger = logging_controller_1.SigningMethod.EthSignTypedData;
454
- if (version === 'V3') {
455
- signTypeForLogger = logging_controller_1.SigningMethod.EthSignTypedDataV3;
415
+ }, _SignatureController_getSignTypeForLogger = function _SignatureController_getSignTypeForLogger(requestType, version) {
416
+ if (requestType === types_1.SignatureRequestType.PersonalSign) {
417
+ return logging_controller_1.SigningMethod.PersonalSign;
418
+ }
419
+ if (requestType === types_1.SignatureRequestType.TypedSign &&
420
+ version === keyring_controller_1.SignTypedDataVersion.V3) {
421
+ return logging_controller_1.SigningMethod.EthSignTypedDataV3;
456
422
  }
457
- else if (version === 'V4') {
458
- signTypeForLogger = logging_controller_1.SigningMethod.EthSignTypedDataV4;
423
+ if (requestType === types_1.SignatureRequestType.TypedSign &&
424
+ version === keyring_controller_1.SignTypedDataVersion.V4) {
425
+ return logging_controller_1.SigningMethod.EthSignTypedDataV4;
459
426
  }
460
- return signTypeForLogger;
427
+ return logging_controller_1.SigningMethod.EthSignTypedData;
461
428
  };
462
429
  //# sourceMappingURL=SignatureController.cjs.map