// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; /** * @title ECDSA library * * @dev Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.3.0/contracts/cryptography/ECDSA.sol#L26 */ library ECDSALib { function recoverAddress( bytes32 messageHash, bytes memory signature ) internal pure returns (address) { address result = address(0); if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } if (v < 27) { v += 27; } if (v == 27 || v == 28) { result = ecrecover(messageHash, v, r, s); } } return result; } function toEthereumSignedMessageHash( bytes32 messageHash ) internal pure returns (bytes32) { return keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", messageHash )); } }