From cc71b4f52b861fda6620874dd8c9ae30c0c0ede9 Mon Sep 17 00:00:00 2001 From: Brendan Chou Date: Tue, 20 Aug 2019 12:52:59 -0700 Subject: Add support for eth_signTypedData_v4 (#6930) --- app/scripts/controllers/network/createMetamaskMiddleware.js | 2 ++ app/scripts/lib/typed-message-manager.js | 1 + app/scripts/metamask-controller.js | 5 ++++- ui/app/components/app/signature-request.js | 7 ++++--- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/scripts/controllers/network/createMetamaskMiddleware.js b/app/scripts/controllers/network/createMetamaskMiddleware.js index 319c5bf3e..5dcd3a895 100644 --- a/app/scripts/controllers/network/createMetamaskMiddleware.js +++ b/app/scripts/controllers/network/createMetamaskMiddleware.js @@ -12,6 +12,7 @@ function createMetamaskMiddleware ({ processEthSignMessage, processTypedMessage, processTypedMessageV3, + processTypedMessageV4, processPersonalMessage, getPendingNonce, }) { @@ -27,6 +28,7 @@ function createMetamaskMiddleware ({ processEthSignMessage, processTypedMessage, processTypedMessageV3, + processTypedMessageV4, processPersonalMessage, }), createPendingNonceMiddleware({ getPendingNonce }), diff --git a/app/scripts/lib/typed-message-manager.js b/app/scripts/lib/typed-message-manager.js index b10145f3b..5e2a4cd0a 100644 --- a/app/scripts/lib/typed-message-manager.js +++ b/app/scripts/lib/typed-message-manager.js @@ -141,6 +141,7 @@ module.exports = class TypedMessageManager extends EventEmitter { }, 'Expected EIP712 typed data') break case 'V3': + case 'V4': let data assert.equal(typeof params, 'object', 'Params should be an object.') assert.ok('data' in params, 'Params must include a data field.') diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 1007412c6..1bf34a074 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -341,6 +341,7 @@ module.exports = class MetamaskController extends EventEmitter { processEthSignMessage: this.newUnsignedMessage.bind(this), processTypedMessage: this.newUnsignedTypedMessage.bind(this), processTypedMessageV3: this.newUnsignedTypedMessage.bind(this), + processTypedMessageV4: this.newUnsignedTypedMessage.bind(this), processPersonalMessage: this.newUnsignedPersonalMessage.bind(this), getPendingNonce: this.getPendingNonce.bind(this), } @@ -1141,6 +1142,9 @@ module.exports = class MetamaskController extends EventEmitter { case 'V3': signature = sigUtil.signTypedData(privKey, { data: JSON.parse(cleanMsgParams.data) }) break + case 'V4': + signature = sigUtil.signTypedData_v4(privKey, { data: JSON.parse(cleanMsgParams.data) }) + break } } else { signature = await keyring.signTypedData(address, cleanMsgParams.data) @@ -1797,4 +1801,3 @@ module.exports = class MetamaskController extends EventEmitter { return this.keyringController.setLocked() } } - diff --git a/ui/app/components/app/signature-request.js b/ui/app/components/app/signature-request.js index 9c0f53f57..039485f88 100644 --- a/ui/app/components/app/signature-request.js +++ b/ui/app/components/app/signature-request.js @@ -215,7 +215,7 @@ SignatureRequest.prototype.msgHexToText = function (hex) { } // eslint-disable-next-line react/display-name -SignatureRequest.prototype.renderTypedDataV3 = function (data) { +SignatureRequest.prototype.renderTypedData = function (data) { const { domain, message } = JSON.parse(data) return [ h('div.request-signature__typed-container', [ @@ -267,8 +267,9 @@ SignatureRequest.prototype.renderBody = function () { }), }, [notice]), - h('div.request-signature__rows', type === 'eth_signTypedData' && version === 'V3' ? - this.renderTypedDataV3(data) : + h('div.request-signature__rows', + type === 'eth_signTypedData' && (version === 'V3' || version === 'V4') ? + this.renderTypedData(data) : rows.map(({ name, value }) => { if (typeof value === 'boolean') { value = value.toString() -- cgit