|
@@ -162,10 +162,15 @@ library ECDSA {
|
|
|
*
|
|
|
* See {recover}.
|
|
|
*/
|
|
|
- function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
|
|
|
+ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {
|
|
|
// 32 is the length in bytes of hash,
|
|
|
// enforced by the type signature above
|
|
|
- return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
|
|
|
+ /// @solidity memory-safe-assembly
|
|
|
+ assembly {
|
|
|
+ mstore(0x00, "\x19Ethereum Signed Message:\n32")
|
|
|
+ mstore(0x1c, hash)
|
|
|
+ message := keccak256(0x00, 0x3c)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -189,7 +194,14 @@ library ECDSA {
|
|
|
*
|
|
|
* See {recover}.
|
|
|
*/
|
|
|
- function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
|
|
|
- return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
|
|
|
+ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {
|
|
|
+ /// @solidity memory-safe-assembly
|
|
|
+ assembly {
|
|
|
+ let ptr := mload(0x40)
|
|
|
+ mstore(ptr, "\x19\x01")
|
|
|
+ mstore(add(ptr, 0x02), domainSeparator)
|
|
|
+ mstore(add(ptr, 0x22), structHash)
|
|
|
+ data := keccak256(ptr, 0x42)
|
|
|
+ }
|
|
|
}
|
|
|
}
|