Transpile 7bce2b72
This commit is contained in:
36
contracts/utils/cryptography/SignatureCheckerUpgradeable.sol
Normal file
36
contracts/utils/cryptography/SignatureCheckerUpgradeable.sol
Normal file
@ -0,0 +1,36 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/SignatureChecker.sol)
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "./ECDSAUpgradeable.sol";
|
||||
import "../AddressUpgradeable.sol";
|
||||
import "../../interfaces/IERC1271Upgradeable.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).
|
||||
*
|
||||
* _Available since v4.1._
|
||||
*/
|
||||
library SignatureCheckerUpgradeable {
|
||||
function isValidSignatureNow(
|
||||
address signer,
|
||||
bytes32 hash,
|
||||
bytes memory signature
|
||||
) internal view returns (bool) {
|
||||
(address recovered, ECDSAUpgradeable.RecoverError error) = ECDSAUpgradeable.tryRecover(hash, signature);
|
||||
if (error == ECDSAUpgradeable.RecoverError.NoError && recovered == signer) {
|
||||
return true;
|
||||
}
|
||||
|
||||
(bool success, bytes memory result) = signer.staticcall(
|
||||
abi.encodeWithSelector(IERC1271Upgradeable.isValidSignature.selector, hash, signature)
|
||||
);
|
||||
return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271Upgradeable.isValidSignature.selector);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user