diff --git a/contracts/Identity.sol b/contracts/Identity.sol index 94bc488..513d4e7 100644 --- a/contracts/Identity.sol +++ b/contracts/Identity.sol @@ -627,7 +627,7 @@ contract Identity is Storage, IIdentity, Version { function recoverSignerForExecution(address _to, uint256 _value, bytes memory _data, uint256 _keyType, uint8 v, bytes32 r, bytes32 s) internal delegatedOnly view returns(bytes32 keyHash) { if (_keyType == 1) { - bytes32 dataHash = keccak256(abi.encode(_to, _value, _data)); + bytes32 dataHash = keccak256(abi.encode(address(this), _to, _value, _data)); bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash)); address recovered = ecrecover(prefixedHash, v, r, s); diff --git a/contracts/interface/IERC734.sol b/contracts/interface/IERC734.sol index a51764c..da43c31 100644 --- a/contracts/interface/IERC734.sol +++ b/contracts/interface/IERC734.sol @@ -74,7 +74,14 @@ interface IERC734 { * Triggers on execution successful Event: `Executed` * Triggers on execution failure Event: `ExecutionFailed` */ - function approveSigned(uint256 _id, bool _approve, uint256 _keyType, uint8 v, bytes32 r, bytes32 s) external returns (bool success); + function approveSigned( + uint256 _id, + bool _approve, + uint256 _keyType, + uint8 v, + bytes32 r, + bytes32 s + ) external returns (bool success); /** * @dev Removes _purpose for _key from the identity. @@ -108,7 +115,15 @@ interface IERC734 { * Triggers Event: ExecutionRequested * Triggers on direct execution Event: Executed */ - function executeSigned(address _to, uint256 _value, bytes calldata _data, uint256 _keyType, uint8 v, bytes32 r, bytes32 s) external payable returns (uint256 executionId); + function executeSigned( + address _to, + uint256 _value, + bytes calldata _data, + uint256 _keyType, + uint8 v, + bytes32 r, + bytes32 s + ) external payable returns (uint256 executionId); /** * @dev Returns the full key data, if present in the identity. diff --git a/test/identities/executions.test.ts b/test/identities/executions.test.ts index 383b00f..9ebd2fa 100644 --- a/test/identities/executions.test.ts +++ b/test/identities/executions.test.ts @@ -278,8 +278,8 @@ describe('Identity', () => { }; const signature = await aliceWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data], + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data], )))); const signatureParsed = ethers.Signature.from(signature); @@ -309,8 +309,8 @@ describe('Identity', () => { }; const signature = await aliceWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data] + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data] )))); const signatureParsed = ethers.Signature.from(signature); @@ -339,8 +339,8 @@ describe('Identity', () => { }; const signature = await aliceWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data] + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data] )))); const signatureParsed = ethers.Signature.from(signature); @@ -371,8 +371,8 @@ describe('Identity', () => { }; const signature = await aliceWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data] + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data] )))); const signatureParsed = ethers.Signature.from(signature); @@ -446,8 +446,8 @@ describe('Identity', () => { const previousBalance = await ethers.provider.getBalance(bobIdentity); const signature = await carolWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data] + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data] )))); const signatureParsed = ethers.Signature.from(signature); @@ -478,8 +478,8 @@ describe('Identity', () => { }; const signature = await carolWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data] + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data] )))); const signatureParsed = ethers.Signature.from(signature); @@ -558,8 +558,8 @@ describe('Identity', () => { data: '0x', }; const signature = await aliceWallet.signMessage(ethers.getBytes(ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'uint256', 'bytes'], - [action.to, action.value, action.data], + ['address', 'address', 'uint256', 'bytes'], + [await aliceIdentity.getAddress(), action.to, action.value, action.data], )))); const signatureParsed = ethers.Signature.from(signature);