diff --git a/contracts/prebuilts/account/non-upgradeable/Account.sol b/contracts/prebuilts/account/non-upgradeable/Account.sol index 82212d517..6ec968f36 100644 --- a/contracts/prebuilts/account/non-upgradeable/Account.sol +++ b/contracts/prebuilts/account/non-upgradeable/Account.sol @@ -33,6 +33,8 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115 using ECDSA for bytes32; using EnumerableSet for EnumerableSet.AddressSet; + bytes32 private constant MSG_TYPEHASH = keccak256("AccountMessage(bytes message)"); + /*/////////////////////////////////////////////////////////////// Constructor, Initializer, Modifiers //////////////////////////////////////////////////////////////*/ @@ -61,14 +63,17 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115 } /// @notice See EIP-1271 - function isValidSignature(bytes32 _hash, bytes memory _signature) + function isValidSignature(bytes32 _message, bytes memory _signature) public view virtual override returns (bytes4 magicValue) { - address signer = _hash.recover(_signature); + bytes memory messageData = encodeMessageData(abi.encode(_message)); + bytes32 messageHash = keccak256(messageData); + + address signer = messageHash.recover(_signature); if (isAdmin(signer)) { return MAGICVALUE; @@ -87,6 +92,25 @@ contract Account is AccountCore, ContractMetadata, ERC1271, ERC721Holder, ERC115 } } + /** + * @notice Returns the hash of message that should be signed for EIP1271 verification. + * @param message Message to be hashed + * @return Hashed message + */ + function getMessageHash(bytes memory message) public view returns (bytes32) { + return keccak256(encodeMessageData(message)); + } + + /** + * @notice Returns encoded message to be hashed + * @param message Message to be encoded + * @return Encoded message to be hashed + */ + function encodeMessageData(bytes memory message) public view returns (bytes memory) { + bytes32 messageHash = keccak256(abi.encode(MSG_TYPEHASH, keccak256(message))); + return abi.encodePacked("\x19\x01", _domainSeparatorV4(), messageHash); + } + /*/////////////////////////////////////////////////////////////// External functions //////////////////////////////////////////////////////////////*/ diff --git a/contracts/prebuilts/account/utils/AccountExtension.sol b/contracts/prebuilts/account/utils/AccountExtension.sol index c3ec67a72..175b3c403 100644 --- a/contracts/prebuilts/account/utils/AccountExtension.sol +++ b/contracts/prebuilts/account/utils/AccountExtension.sol @@ -32,6 +32,8 @@ contract AccountExtension is ContractMetadata, ERC1271, AccountPermissions, ERC7 using ECDSA for bytes32; using EnumerableSet for EnumerableSet.AddressSet; + bytes32 private constant MSG_TYPEHASH = keccak256("AccountMessage(bytes message)"); + /*/////////////////////////////////////////////////////////////// Constructor, Initializer, Modifiers //////////////////////////////////////////////////////////////*/ @@ -63,14 +65,17 @@ contract AccountExtension is ContractMetadata, ERC1271, AccountPermissions, ERC7 } /// @notice See EIP-1271 - function isValidSignature(bytes32 _hash, bytes memory _signature) + function isValidSignature(bytes32 _message, bytes memory _signature) public view virtual override returns (bytes4 magicValue) { - address signer = _hash.recover(_signature); + bytes memory messageData = encodeMessageData(abi.encode(_message)); + bytes32 messageHash = keccak256(messageData); + + address signer = messageHash.recover(_signature); if (isAdmin(signer)) { return MAGICVALUE; @@ -89,6 +94,25 @@ contract AccountExtension is ContractMetadata, ERC1271, AccountPermissions, ERC7 } } + /** + * @notice Returns the hash of message that should be signed for EIP1271 verification. + * @param message Message to be hashed + * @return Hashed message + */ + function getMessageHash(bytes memory message) public view returns (bytes32) { + return keccak256(encodeMessageData(message)); + } + + /** + * @notice Returns encoded message to be hashed + * @param message Message to be encoded + * @return Encoded message to be hashed + */ + function encodeMessageData(bytes memory message) public view returns (bytes memory) { + bytes32 messageHash = keccak256(abi.encode(MSG_TYPEHASH, keccak256(message))); + return abi.encodePacked("\x19\x01", _domainSeparatorV4(), messageHash); + } + /*/////////////////////////////////////////////////////////////// External functions //////////////////////////////////////////////////////////////*/ diff --git a/lib/aa-benchmark b/lib/aa-benchmark new file mode 160000 index 000000000..4b8e548ef --- /dev/null +++ b/lib/aa-benchmark @@ -0,0 +1 @@ +Subproject commit 4b8e548ef6b004069cff599347a2afb9ac837e54 diff --git a/lib/solady b/lib/solady new file mode 160000 index 000000000..77809c18e --- /dev/null +++ b/lib/solady @@ -0,0 +1 @@ +Subproject commit 77809c18e010b914dde9518956a4ae7cb507d383