└── SignatureVerifier.sol /SignatureVerifier.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | contract SignatureVerifier { 5 | function verifySignature(bytes32 message, bytes memory signature) public pure returns (address) { 6 | bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", message)); 7 | return recoverSigner(ethSignedMessageHash, signature); 8 | } 9 | 10 | function recoverSigner(bytes32 ethSignedMessageHash, bytes memory signature) public pure returns (address) { 11 | (uint8 v, bytes32 r, bytes32 s) = splitSignature(signature); 12 | return ecrecover(ethSignedMessageHash, v, r, s); 13 | } 14 | 15 | function splitSignature(bytes memory sig) public pure returns (uint8 v, bytes32 r, bytes32 s) { 16 | require(sig.length == 65, "Invalid signature length"); 17 | assembly { 18 | r := mload(add(sig, 32)) 19 | s := mload(add(sig, 64)) 20 | v := byte(0, mload(add(sig, 96))) 21 | } 22 | } 23 | } 24 | --------------------------------------------------------------------------------