-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implements `permit` and `encumberBySig`, both of which support EIP-1271 signatures.
- Loading branch information
1 parent
c615df7
commit ac5a639
Showing
10 changed files
with
1,366 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule openzeppelin-contracts
added at
fd81a9
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
ds-test/=lib/forge-std/lib/ds-test/src/ | ||
forge-std/=lib/forge-std/src/ | ||
solmate/=lib/solmate/src/ | ||
ds-test/=lib/forge-std/lib/ds-test/src/ | ||
solmate/=lib/solmate/src/ | ||
erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/ | ||
openzeppelin-contracts/=lib/openzeppelin-contracts/ | ||
openzeppelin/=lib/openzeppelin-contracts/contracts/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity 0.8.21; | ||
|
||
contract EIP1271Signer { | ||
bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e; | ||
|
||
address public owner; | ||
|
||
constructor(address _owner) { | ||
owner = _owner; | ||
} | ||
|
||
function isValidSignature(bytes32 messageHash, bytes memory signature) external view returns (bytes4) { | ||
if (recoverSigner(messageHash, signature) == owner) { | ||
return EIP1271_MAGIC_VALUE; | ||
} else { | ||
return 0xffffffff; | ||
} | ||
} | ||
|
||
function recoverSigner(bytes32 messageHash, bytes memory signature) internal pure returns (address) { | ||
require(signature.length == 65, "SignatureValidator#recoverSigner: invalid signature length"); | ||
|
||
bytes32 r; | ||
bytes32 s; | ||
uint8 v; | ||
assembly { | ||
r := mload(add(signature, 32)) | ||
s := mload(add(signature, 64)) | ||
v := and(mload(add(signature, 65)), 255) | ||
} | ||
|
||
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature | ||
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines | ||
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most | ||
// signatures from current libraries generate a unique signature with an s-value in the lower half order. | ||
// | ||
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value | ||
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or | ||
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept | ||
// these malleable signatures as well. | ||
// | ||
// Source OpenZeppelin | ||
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol | ||
|
||
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { | ||
revert("SignatureValidator#recoverSigner: invalid signature 's' value"); | ||
} | ||
|
||
if (v != 27 && v != 28) { | ||
revert("SignatureValidator#recoverSigner: invalid signature 'v' value"); | ||
} | ||
|
||
// Recover ECDSA signer | ||
address signer = ecrecover(messageHash, v, r, s); | ||
|
||
// Prevent signer from being 0x0 | ||
require( | ||
signer != address(0x0), | ||
"SignatureValidator#recoverSigner: INVALID_SIGNER" | ||
); | ||
|
||
return signer; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.