Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
No gas? No problem. MetaMask Gas Station includes gas fees directly in your quote.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$167.70 (@ $3,330.51/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (8)1.26839168 WALLETAmbire Walle... (WALLET)$0.02@0.01370.07 stETHstETH (stETH)$232.89@3,327.0410.53584823 DAIDai Stableco... (DAI)$10.55@1.00110.000001 FTMFantom Token (FTM)$8.29@0.82879.106256 USDTTether USD (USDT)$9.09@0.9985125.19196466 ADX-STAKINGERC-20: AdEx... (ADX-ST...)79,006.85393347 xWALLETERC-20: Ambi... (xWALLE...)350 TokenERC-20 TOKEN*[Suspicious]NFT Tokens (19)MERGETheMergeERC-721ENSEthereum Name Servicex2ERC-721BGYCBored Goat Yacht Clubx2ERC-721DERPDerpERC-721Doodles2FreeDoodles 2 Free Mint Eventx6ERC-721Doodles2Doodles2x5ERC-721LOONIESLooniesERC-721MSPDMetaspaceDudesERC-721SAFECORESafe{Core}, IntroducedERC-721claim rewards on stakedeth.iostakedeth.ioERC-1155VZKIVagiZukix2ERC-721
More Info
Private Name Tags
ContractCreator
Multichain Info
4 addresses found via- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 4 from a total of 4 transactions
Transaction Hash MethodBlockFromToTransfer 17426651 2023-06-07 6:13:35 569 days ago 1686118415 IN 0.06056359 ETH$201.71 0.0004832 20.37796965 Transfer 17426572 2023-06-07 5:57:23 569 days ago 1686117443 IN 0.06062118 ETH$201.90 0.00048826 20.59164403 Transfer 15795460 2022-10-21 9:03:11 798 days ago 1666342991 IN 0.07095205 ETH$236.31 0.00056908 24 Transfer 13816489 2021-12-16 13:36:57 1107 days ago 1639661817 IN 0.28091307 ETH$935.59 0.001365 65 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo17426664 2023-06-07 6:16:11 569 days ago 1686118571 0.00008766 ETH$0.29 17426664 2023-06-07 6:16:11 569 days ago 1686118571 0.01762007 ETH$58.68 17426615 2023-06-07 6:06:23 569 days ago 1686117983 0.00798976 ETH$26.61 17426615 2023-06-07 6:06:23 569 days ago 1686117983 0.00017522 ETH$0.58 17426615 2023-06-07 6:06:23 569 days ago 1686117983 0.03522082 ETH$117.30 17426615 2023-06-07 6:06:23 569 days ago 1686117983 0.05 ETH$166.53 16764250 2023-03-05 19:24:11 663 days ago 1678044251 0.00776629 ETH$25.87 16764250 2023-03-05 19:24:11 663 days ago 1678044251 0.000777 ETH$2.59 15917540 2022-11-07 10:26:47 781 days ago 1667816807 0.01 ETH$33.31 15804465 2022-10-22 15:12:59 797 days ago 1666451579 0.07 ETH$233.14 15802413 2022-10-22 8:20:47 797 days ago 1666426847 0.03 ETH$99.92 15780939 2022-10-19 8:23:59 800 days ago 1666167839 0.03 ETH$99.92 15370338 2022-08-19 8:50:05 861 days ago 1660899005 0.00086675 ETH$2.89 15370338 2022-08-19 8:50:05 861 days ago 1660899005 0.00953426 ETH$31.75 15166001 2022-07-18 10:09:19 893 days ago 1658138959 0.00095122 ETH$3.17 15166001 2022-07-18 10:09:19 893 days ago 1658138959 0.01112486 ETH$37.05 15165920 2022-07-18 9:51:19 893 days ago 1658137879 0.00101352 ETH$3.38 15165920 2022-07-18 9:51:19 893 days ago 1658137879 0.0111488 ETH$37.13 15044414 2022-06-29 9:49:28 912 days ago 1656496168 0.00061826 ETH$2.06 15043907 2022-06-29 7:31:35 912 days ago 1656487895 0.02772693 ETH$92.34 15017419 2022-06-24 8:32:41 917 days ago 1656059561 0.001 ETH$3.33 14996746 2022-06-20 13:14:43 921 days ago 1655730883 0.03 ETH$99.92 14507870 2022-04-02 16:43:24 1000 days ago 1648917804 0.003 ETH$9.99 14435964 2022-03-22 11:52:44 1011 days ago 1647949964 0.00835824 ETH$27.84 14435964 2022-03-22 11:52:44 1011 days ago 1647949964 0.00013905 ETH$0.46 Loading...LoadingMinimal Proxy Contract for 0x2a2b85eb1054d6f0c6c2e37da05ed3e5fea684ef
Contract Name:Identity
Compiler Versionv0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
Decompile Bytecode Similar Contracts- library LibBytes
- - function trimToSize(bytes memory b, u ...
- - function readBytes32(
- interface IERC1271Wallet
- - function isValidSignature(bytes32 has ...
- library SignatureValidator
- - function recoverAddr(bytes32 hash, by ...
- - function recoverAddrImpl(bytes32 hash ...
- contract Identity *
- - function setAddrPrivilege(address add ...
- - function tipMiner(uint amount)
- - function tryCatch(address to, uint va ...
- - function execute(Transaction[] callda ...
- - function executeBySender(Transaction[ ...
- - function executeBySelf(Transaction[] ...
- - function executeCall(address to, uint ...
- - function isValidSignature(bytes32 has ...
- - function supportsInterface(bytes4 int ...
/** *Submitted for verification at Etherscan.io on 2021-11-14 */ pragma solidity 0.8.7; // @TODO: Formatting library LibBytes { // @TODO: see if we can just set .length = function trimToSize(bytes memory b, uint newLen) internal pure { require(b.length > newLen, "BytesLib: only shrinking"); assembly { mstore(b, newLen) } } /***********************************| | Read Bytes Functions | |__________________________________*/ /** * @dev Reads a bytes32 value from a position in a byte array. * @param b Byte array containing a bytes32 value. * @param index Index in byte array of bytes32 value. * @return result bytes32 value from byte array. */ function readBytes32( bytes memory b, uint256 index ) internal pure returns (bytes32 result) { // Arrays are prefixed by a 256 bit length parameter index += 32; require(b.length >= index, "BytesLib: length"); // Read the bytes32 from array memory assembly { result := mload(add(b, index)) } return result; } } interface IERC1271Wallet { function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4 magicValue); } library SignatureValidator { using LibBytes for bytes; enum SignatureMode { EIP712, EthSign, SmartWallet, Spoof } // bytes4(keccak256("isValidSignature(bytes32,bytes)")) bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e; function recoverAddr(bytes32 hash, bytes memory sig) internal view returns (address) { return recoverAddrImpl(hash, sig, false); } function recoverAddrImpl(bytes32 hash, bytes memory sig, bool allowSpoofing) internal view returns (address) { require(sig.length >= 1, "SV_SIGLEN"); uint8 modeRaw; unchecked { modeRaw = uint8(sig[sig.length - 1]); } SignatureMode mode = SignatureMode(modeRaw); // {r}{s}{v}{mode} if (mode == SignatureMode.EIP712 || mode == SignatureMode.EthSign) { require(sig.length == 66, "SV_LEN"); bytes32 r = sig.readBytes32(0); bytes32 s = sig.readBytes32(32); uint8 v = uint8(sig[64]); // Hesitant about this check: seems like this is something that has no business being checked on-chain require(v == 27 || v == 28, "SV_INVALID_V"); if (mode == SignatureMode.EthSign) hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); address signer = ecrecover(hash, v, r, s); require(signer != address(0), "SV_ZERO_SIG"); return signer; // {sig}{verifier}{mode} } else if (mode == SignatureMode.SmartWallet) { // 32 bytes for the addr, 1 byte for the type = 33 require(sig.length > 33, "SV_LEN_WALLET"); uint newLen; unchecked { newLen = sig.length - 33; } IERC1271Wallet wallet = IERC1271Wallet(address(uint160(uint256(sig.readBytes32(newLen))))); sig.trimToSize(newLen); require(ERC1271_MAGICVALUE_BYTES32 == wallet.isValidSignature(hash, sig), "SV_WALLET_INVALID"); return address(wallet); // {address}{mode}; the spoof mode is used when simulating calls } else if (mode == SignatureMode.Spoof && allowSpoofing) { require(tx.origin == address(1), "SV_SPOOF_ORIGIN"); require(sig.length == 33, "SV_SPOOF_LEN"); sig.trimToSize(32); return abi.decode(sig, (address)); } else revert("SV_SIGMODE"); } } contract Identity { mapping (address => bytes32) public privileges; // The next allowed nonce uint public nonce; // Events event LogPrivilegeChanged(address indexed addr, bytes32 priv); event LogErr(address indexed to, uint value, bytes data, bytes returnData); // only used in tryCatch // Transaction structure // we handle replay protection separately by requiring (address(this), chainID, nonce) as part of the sig struct Transaction { address to; uint value; bytes data; } constructor(address[] memory addrs) { uint len = addrs.length; for (uint i=0; i<len; i++) { // @TODO should we allow setting to any arb value here? privileges[addrs[i]] = bytes32(uint(1)); emit LogPrivilegeChanged(addrs[i], bytes32(uint(1))); } } // This contract can accept ETH without calldata receive() external payable {} // This contract can accept ETH with calldata // However, to support EIP 721 and EIP 1155, we need to respond to those methods with their own method signature fallback() external payable { bytes4 method = msg.sig; if ( method == 0x150b7a02 // bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")) || method == 0xf23a6e61 // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) || method == 0xbc197c81 // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) ) { // Copy back the method // solhint-disable-next-line no-inline-assembly assembly { calldatacopy(0, 0, 0x04) return (0, 0x20) } } } function setAddrPrivilege(address addr, bytes32 priv) external { require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL'); // Anti-bricking measure: if the privileges slot is used for special data (not 0x01), // don't allow to set it to true if (uint(privileges[addr]) > 1) require(priv != bytes32(uint(1)), 'UNSETTING_SPECIAL_DATA'); privileges[addr] = priv; emit LogPrivilegeChanged(addr, priv); } function tipMiner(uint amount) external { require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL'); // See https://docs.flashbots.net/flashbots-auction/searchers/advanced/coinbase-payment/#managing-payments-to-coinbaseaddress-when-it-is-a-contract // generally this contract is reentrancy proof cause of the nonce executeCall(block.coinbase, amount, new bytes(0)); } function tryCatch(address to, uint value, bytes calldata data) external { require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL'); (bool success, bytes memory returnData) = to.call{value: value, gas: gasleft()}(data); if (!success) emit LogErr(to, value, data, returnData); } // WARNING: if the signature of this is changed, we have to change IdentityFactory function execute(Transaction[] calldata txns, bytes calldata signature) external { require(txns.length > 0, 'MUST_PASS_TX'); uint currentNonce = nonce; // NOTE: abi.encode is safer than abi.encodePacked in terms of collision safety bytes32 hash = keccak256(abi.encode(address(this), block.chainid, currentNonce, txns)); // We have to increment before execution cause it protects from reentrancies nonce = currentNonce + 1; address signer = SignatureValidator.recoverAddrImpl(hash, signature, true); require(privileges[signer] != bytes32(0), 'INSUFFICIENT_PRIVILEGE'); uint len = txns.length; for (uint i=0; i<len; i++) { Transaction memory txn = txns[i]; executeCall(txn.to, txn.value, txn.data); } // The actual anti-bricking mechanism - do not allow a signer to drop their own priviledges require(privileges[signer] != bytes32(0), 'PRIVILEGE_NOT_DOWNGRADED'); } // no need for nonce management here cause we're not dealing with sigs function executeBySender(Transaction[] calldata txns) external { require(txns.length > 0, 'MUST_PASS_TX'); require(privileges[msg.sender] != bytes32(0), 'INSUFFICIENT_PRIVILEGE'); uint len = txns.length; for (uint i=0; i<len; i++) { Transaction memory txn = txns[i]; executeCall(txn.to, txn.value, txn.data); } // again, anti-bricking require(privileges[msg.sender] != bytes32(0), 'PRIVILEGE_NOT_DOWNGRADED'); } function executeBySelf(Transaction[] calldata txns) external { require(msg.sender == address(this), 'ONLY_IDENTITY_CAN_CALL'); require(txns.length > 0, 'MUST_PASS_TX'); uint len = txns.length; for (uint i=0; i<len; i++) { Transaction memory txn = txns[i]; executeCall(txn.to, txn.value, txn.data); } } // we shouldn't use address.call(), cause: https://github.com/ethereum/solidity/issues/2884 // copied from https://github.com/uport-project/uport-identity/blob/develop/contracts/Proxy.sol // there's also // https://github.com/gnosis/MultiSigWallet/commit/e1b25e8632ca28e9e9e09c81bd20bf33fdb405ce // https://github.com/austintgriffith/bouncer-proxy/blob/master/BouncerProxy/BouncerProxy.sol // https://github.com/gnosis/safe-contracts/blob/7e2eeb3328bb2ae85c36bc11ea6afc14baeb663c/contracts/base/Executor.sol function executeCall(address to, uint256 value, bytes memory data) internal { assembly { let result := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0) switch result case 0 { let size := returndatasize() let ptr := mload(0x40) returndatacopy(ptr, 0, size) revert(ptr, size) } default {} } // A single call consumes around 477 more gas with the pure solidity version, for whatever reason // WARNING: do not use this, it corrupts the returnData string (returns it in a slightly different format) //(bool success, bytes memory returnData) = to.call{value: value, gas: gasleft()}(data); //if (!success) revert(string(data)); } // EIP 1271 implementation // see https://eips.ethereum.org/EIPS/eip-1271 function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4) { if (privileges[SignatureValidator.recoverAddr(hash, signature)] != bytes32(0)) { // bytes4(keccak256("isValidSignature(bytes32,bytes)") return 0x1626ba7e; } else { return 0xffffffff; } } // EIP 1155 implementation // we pretty much only need to signal that we support the interface for 165, but for 1155 we also need the fallback function function supportsInterface(bytes4 interfaceID) external pure returns (bool) { return interfaceID == 0x01ffc9a7 || // ERC-165 support (i.e. `bytes4(keccak256('supportsInterface(bytes4)'))`). interfaceID == 0x4e2312e0; // ERC-1155 `ERC1155TokenReceiver` support (i.e. `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) ^ bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`). } }
Contract ABI
[{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"LogErr","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bytes32","name":"priv","type":"bytes32"}],"name":"LogPrivilegeChanged","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"}],"name":"executeBySelf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Identity.Transaction[]","name":"txns","type":"tuple[]"}],"name":"executeBySender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privileges","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32","name":"priv","type":"bytes32"}],"name":"setAddrPrivilege","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tipMiner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"tryCatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH 30.38% $3,327.04 0.07 $232.89 ETH Ether (ETH)21.88% $3,331.82 0.0504 $167.76 ETH 1.38% $1 10.5358 $10.55 ETH 1.19% $0.998542 9.1063 $9.09 ETH 1.08% $0.828688 10 $8.29 ARB 12.94% $3,330.98 0.0298 $99.19 ARB 9.12% $0.998808 70 $69.92 ARB 3.91% $0.999989 30 $30 OP 13.05% $3,332.05 0.03 $100.06 GNO 3.75% $0.999746 28.7683 $28.76 POL 1.30% $0.998972 10 $9.99 POL 0.01% $0.013689 7.3204 $0.1002 Loading...Loading[ Download: CSV Export ][ 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.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.