|
|
|
@ -8,16 +8,20 @@ import "../Address.sol"; |
|
|
|
|
import "../../interfaces/IERC1271.sol"; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @dev Signature verification helper: Provide a single mechanism to verify both private-key (EOA) ECDSA signature and |
|
|
|
|
* ERC1271 contract signatures. Using this instead of ECDSA.recover in your contract will make them compatible with |
|
|
|
|
* smart contract wallets such as Argent and Gnosis. |
|
|
|
|
* |
|
|
|
|
* Note: unlike ECDSA signatures, contract signature's are revocable, and the outcome of this function can thus change |
|
|
|
|
* through time. It could return true at block N and false at block N+1 (or the opposite). |
|
|
|
|
* @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA |
|
|
|
|
* signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like |
|
|
|
|
* Argent and Gnosis Safe. |
|
|
|
|
* |
|
|
|
|
* _Available since v4.1._ |
|
|
|
|
*/ |
|
|
|
|
library SignatureChecker { |
|
|
|
|
/** |
|
|
|
|
* @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the |
|
|
|
|
* signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. |
|
|
|
|
* |
|
|
|
|
* NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus |
|
|
|
|
* change through time. It could return true at block N and false at block N+1 (or the opposite). |
|
|
|
|
*/ |
|
|
|
|
function isValidSignatureNow( |
|
|
|
|
address signer, |
|
|
|
|
bytes32 hash, |
|
|
|
|