/
SignatureVerifier.sol
76 lines (65 loc) 路 3.32 KB
/
SignatureVerifier.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻戔枅鈻堚枅鈻堚枅鈺椻枒鈻堚枅鈻堚枅鈻堚枅鈺椻枒鈻堚枅鈻堚枅鈻堚枅鈺椻枒鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈻堚枅鈻堚枅鈺椻枒鈻戔枒鈻戔枅鈻堚枅鈻堚枅鈻堚枅鈺椻枅鈻堚晽
// 鈺氣晲鈺愨晲鈺愨枅鈻堚晳鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻堚枅鈺斺晲鈺愨晲鈺愨暆鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻戔枒鈻戔枅鈻堚晹鈺愨晲鈺愨晲鈺濃枅鈻堚晳
// 鈻戔枒鈻堚枅鈻堚晹鈺愨暆鈻堚枅鈻堚枅鈻堚枅鈻堚晳鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻堚枅鈻堚枅鈻堚晽鈻戔枒鈻堚枅鈻堚枅鈻堚枅鈺斺暆鈻戔枒鈻戔枅鈻堚枅鈻堚枅鈺椻枒鈻戔枅鈻堚晳
// 鈻堚枅鈺斺晲鈺愨暆鈻戔枒鈻堚枅鈺斺晲鈺愨枅鈻堚晳鈻堚枅鈺斺晲鈺愨晲鈺濃枒鈻堚枅鈺斺晲鈺愨晲鈺濃枒鈻堚枅鈺斺晲鈺愨暆鈻戔枒鈻堚枅鈺斺晲鈺愨枅鈻堚晽鈻戔枒鈻戔枅鈻堚晹鈺愨晲鈺濃枒鈻戔枅鈻堚晳
// 鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺戔枒鈻戔枅鈻堚晳鈻堚枅鈺戔枒鈻戔枒鈻戔枒鈻堚枅鈺戔枒鈻戔枒鈻戔枒鈻堚枅鈻堚枅鈻堚枅鈻堚晽鈻堚枅鈺戔枒鈻戔枅鈻堚晳鈻堚枅鈺椻枅鈻堚晳鈻戔枒鈻戔枒鈻戔枅鈻堚晳
// 鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺濃枒鈻戔暁鈺愨暆鈺氣晲鈺濃枒鈻戔枒鈻戔枒鈺氣晲鈺濃枒鈻戔枒鈻戔枒鈺氣晲鈺愨晲鈺愨晲鈺愨暆鈺氣晲鈺濃枒鈻戔暁鈺愨暆鈺氣晲鈺濃暁鈺愨暆鈻戔枒鈻戔枒鈻戔暁鈺愨暆
// Copyright (C) 2021 zapper
// Copyright (c) 2018 Tasuku Nakamura
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
///@author Zapper
///@notice This contract checks if a message has been signed by a verified signer via personal_sign.
// SPDX-License-Identifier: GPLv2
pragma solidity ^0.8.0;
library SignatureVerifier {
function verify(
address signer,
address account,
uint256 id,
bytes memory signature
) public pure returns (bool) {
bytes32 messageHash = getMessageHash(account, id);
bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
return recoverSigner(ethSignedMessageHash, signature) == signer;
}
function getMessageHash(address account, uint256 id) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(account, id));
}
function getEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
}
function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
internal
pure
returns (address)
{
(bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
return ecrecover(_ethSignedMessageHash, v, r, s);
}
function splitSignature(bytes memory signature)
internal
pure
returns (
bytes32 r,
bytes32 s,
uint8 v
)
{
require(signature.length == 65, "invalid signature length");
//solium-disable-next-line
assembly {
r := mload(add(signature, 32))
s := mload(add(signature, 64))
v := byte(0, mload(add(signature, 96)))
}
}
}