Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4601690 | 14 secs ago | 0 ETH | ||||
4601690 | 14 secs ago | 0 ETH | ||||
4601679 | 25 secs ago | 0 ETH | ||||
4601679 | 25 secs ago | 0 ETH | ||||
4601667 | 37 secs ago | 0 ETH | ||||
4601667 | 37 secs ago | 0 ETH | ||||
4601667 | 37 secs ago | 0 ETH | ||||
4601549 | 2 mins ago | 0 ETH | ||||
4601549 | 2 mins ago | 0 ETH | ||||
4601498 | 3 mins ago | 0 ETH | ||||
4601498 | 3 mins ago | 0 ETH | ||||
4601406 | 5 mins ago | 0 ETH | ||||
4601406 | 5 mins ago | 0 ETH | ||||
4601404 | 5 mins ago | 0 ETH | ||||
4601404 | 5 mins ago | 0 ETH | ||||
4601374 | 5 mins ago | 0 ETH | ||||
4601374 | 5 mins ago | 0 ETH | ||||
4601347 | 6 mins ago | 0 ETH | ||||
4601347 | 6 mins ago | 0 ETH | ||||
4601347 | 6 mins ago | 0 ETH | ||||
4601339 | 6 mins ago | 0 ETH | ||||
4601339 | 6 mins ago | 0 ETH | ||||
4601339 | 6 mins ago | 0 ETH | ||||
4601280 | 7 mins ago | 0 ETH | ||||
4601280 | 7 mins ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
EOAValidator
Compiler Version
v0.8.26+commit.8a97fa7a
ZkSolc Version
v1.5.6
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.17; import {IK1Validator, IERC165, OperationType} from '../interfaces/IValidator.sol'; import {ECDSA} from '@openzeppelin/contracts/utils/cryptography/ECDSA.sol'; /** * @title secp256k1 ec keys' signature validator contract implementing its interface * @author https://getclave.io */ contract EOAValidator is IK1Validator { // ECDSA library to make verifications using ECDSA for bytes32; /// @inheritdoc IK1Validator function validateSignature( OperationType operationType, bytes32 signedHash, bytes calldata signature ) external pure override returns (address signer) { (signer, ,) = signedHash.tryRecover(signature); } /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { return interfaceId == type(IK1Validator).interfaceId || interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.17; import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol'; enum OperationType { Signature, Transaction } /** * @title secp256r1 ec keys' signature validator interface * @author https://getclave.io */ interface IR1Validator is IERC165 { /** * @notice Allows to validate secp256r1 ec signatures * @param signedHash bytes32 - hash of the data that is signed by the key * @param signature bytes - signature * @param pubKey bytes32[2] - public key coordinates array for the x and y values * @return valid bool - validation result */ function validateSignature( OperationType operationType, bytes32 signedHash, bytes calldata signature, bytes32[2] calldata pubKey ) external view returns (bool valid); } /** * @title secp256k1 ec keys' signature validator interface * @author https://getclave.io */ interface IK1Validator is IERC165 { /** * @notice Allows to validate secp256k1 ec signatures * @param signedHash bytes32 - hash of the transaction signed by the key * @param signature bytes - signature * @return signer address - recovered signer address */ function validateSignature( OperationType operationType, bytes32 signedHash, bytes calldata signature ) external view returns (address signer); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.20; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS } /** * @dev The signature derives the `address(0)`. */ error ECDSAInvalidSignature(); /** * @dev The signature has an invalid length. */ error ECDSAInvalidSignatureLength(uint256 length); /** * @dev The signature has an S value that is in the upper half order. */ error ECDSAInvalidSignatureS(bytes32 s); /** * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not * return address(0) without also returning an error description. Errors are documented using an enum (error type) * and a bytes32 providing additional information about the error. * * If no error is returned, then the address can be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function tryRecover( bytes32 hash, bytes memory signature ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly ("memory-safe") { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length)); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures] */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) { unchecked { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); // We do not check for an overflow here since the shift operation results in 0 or 1. uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) { // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS, s); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature, bytes32(0)); } return (signer, RecoverError.NoError, bytes32(0)); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s); _throwError(error, errorArg); return recovered; } /** * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. */ function _throwError(RecoverError error, bytes32 errorArg) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert ECDSAInvalidSignature(); } else if (error == RecoverError.InvalidSignatureLength) { revert ECDSAInvalidSignatureLength(uint256(errorArg)); } else if (error == RecoverError.InvalidSignatureS) { revert ECDSAInvalidSignatureS(errorArg); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "evmVersion": "cancun", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": true, "libraries": {} }
[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum OperationType","name":"operationType","type":"uint8"},{"internalType":"bytes32","name":"signedHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignature","outputs":[{"internalType":"address","name":"signer","type":"address"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
3cda335100000000000000000000000000000000000000000000000000000000000000000100004b600127d5a39aac2a1dc8687da71e2fd6a1e2be55ac41c2f9636160c600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0000008003000039000000400030043f00000001002001900000001f0000c13d00000060021002700000003703200197000000040030008c000000400000413d000000000201043b000000e002200270000000390020009c000000270000613d0000003a0020009c000000400000c13d000000240030008c000000400000413d0000000002000416000000000002004b000000400000c13d0000000401100370000000000101043b0000004400100198000000400000c13d000000450010009c00000000020000390000000102006039000000460010009c00000001022061bf000000800020043f0000004701000041000000d70001042e0000000001000416000000000001004b000000400000c13d0000002001000039000001000010044300000120000004430000003801000041000000d70001042e000000640030008c000000400000413d0000000002000416000000000002004b000000400000c13d0000000402100370000000000202043b000000010020008c000000400000213d0000004402100370000000000502043b0000003b0050009c000000400000213d0000002302500039000000000032004b000000400000813d0000000404500039000000000241034f000000000202043b0000003b0020009c000000400000213d00000000052500190000002405500039000000000035004b000000420000a13d0000000001000019000000d8000104300000001f0520003900000048055001970000003f0550003900000048055001970000003c0050009c0000004e0000413d0000004201000041000000000010043f0000004101000039000000040010043f0000004301000041000000d8000104300000008005500039000000400050043f0000002004400039000000000441034f000000800020043f00000048052001980000001f0620018f000000a0035000390000005d0000613d000000a007000039000000000804034f000000008908043c0000000007970436000000000037004b000000590000c13d000000000006004b0000006a0000613d000000000454034f0000000305600210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000a00220003900000000000204350000002401100370000000000101043b000000800200043d000000410020008c0000000003000019000000ac0000c13d000000c00200043d0000003d0020009c0000000003000019000000ac0000213d000000400300043d0000006004300039000000e00500043d000000a00600043d000000000024043500000040023000390000000000620435000000f802500270000000200430003900000000002404350000000000130435000000000000043f000000370030009c000000370300804100000040013002100000000002000414000000370020009c0000003702008041000000c002200210000000000112019f0000003e011001c7000000010200003900d600d10000040f00000060031002700000003703300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000009b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000000970000c13d000000000005004b000000a80000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f00000000005404350000000100200190000000b30000613d000000000100043d0000004003100197000000400100043d0000000000310435000000370010009c0000003701008041000000400110021000000041011001c7000000d70001042e0000001f0530018f0000003f06300198000000400200043d0000000004620019000000be0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000000ba0000c13d000000000005004b000000cb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000000370020009c00000037020080410000004002200210000000000112019f000000d800010430000000d4002104230000000102000039000000000001042d0000000002000019000000000001042d000000d600000432000000d70001042e000000d80001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000002250737a0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff807fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000200000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000002250737a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000b2f3471a1ecab1a431c5ff208cb584de6c0f207a672c90ece3eb415aebfafe6a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.