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.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Dive into 100s of games and play anonymously with major cryptos. Join CryptoWins today!
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$56.93 (@ $2,409.10/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (10)206.72947854 WALLETAmbire Walle... (WALLET)$2.29@0.01111.51739714 stETHstETH (stETH)$3,645.36@2,402.3810.12476528 stkAAVEStaked Aave (stkAAV...)$1,312.17@129.600.00807241 TUSDTrueUSD (TUSD)$0.01@0.9978127,232.04880799 xWALLETAmbire Walle... (xWALLE...)30 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]350 TokenERC-20 TOKEN*[Suspicious]400 TokenERC-20 TOKEN*[Unsafe]30 TokenERC-20 TOKEN*[Spam]NFT Tokens (24)LOBSlobsterdaoERC-721zsteth.com : airdrop recipient# zsteth.com : airdrop recipientERC-1155aavevault.comaavevault.comERC-1155Atsui Anime LimitedAtsui Anime LimitedERC-1155Blue NFTLottery LimitedBlue NFTLottery LimitedERC-1155First Uniswap V3 Positions NFTFirst Uniswap V3 Positions NFTERC-1155claim rewards on poolstake.orgpoolstake.orgERC-1155Round DT CollectionRound DT CollectionERC-721The Rebels of Gyaku OfficialThe Rebels of Gyaku OfficialERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
Multichain Info
3 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 25 from a total of 91 transactions
Transaction Hash MethodBlockFromToExecute 16678881 2023-02-21 19:13:47 622 days ago 1677006827 IN 0 ETH$0.00 0.00462615 32.46426841 Execute 16678879 2023-02-21 19:13:23 622 days ago 1677006803 IN 0 ETH$0.00 0.00259351 32.33649475 Execute 16678873 2023-02-21 19:12:11 622 days ago 1677006731 IN 0 ETH$0.00 0.0053925 35.17660116 Execute 16637094 2023-02-15 22:23:23 628 days ago 1676499803 IN 0 ETH$0.00 0.00745095 52.2767468 Execute 16637050 2023-02-15 22:14:35 628 days ago 1676499275 IN 0 ETH$0.00 0.00376702 46.95805786 Execute 16637038 2023-02-15 22:12:11 628 days ago 1676499131 IN 0 ETH$0.00 0.00754428 45.25202624 Execute 16229655 2022-12-21 1:01:11 685 days ago 1671584471 IN 0 ETH$0.00 0.00104279 12.84040142 Execute 16229630 2022-12-21 0:56:11 685 days ago 1671584171 IN 0 ETH$0.00 0.0022085 14.31824588 Execute 16229411 2022-12-21 0:12:11 685 days ago 1671581531 IN 0 ETH$0.00 0.0018973 13.30394018 Execute 16039760 2022-11-24 12:12:47 711 days ago 1669291967 IN 0 ETH$0.00 0.00105634 13.00451008 Execute 16039749 2022-11-24 12:10:35 711 days ago 1669291835 IN 0 ETH$0.00 0.00205074 13.29444508 Execute 16017351 2022-11-21 8:59:47 714 days ago 1669021187 IN 0 ETH$0.00 0.00095928 11.81481431 Execute 16017327 2022-11-21 8:54:59 714 days ago 1669020899 IN 0 ETH$0.00 0.0018107 12.04149441 Execute 16017293 2022-11-21 8:47:59 714 days ago 1669020479 IN 0 ETH$0.00 0.00181051 11.38645165 Execute 16017276 2022-11-21 8:44:35 714 days ago 1669020275 IN 0 ETH$0.00 0.00228444 14.30971917 Execute 16010720 2022-11-20 10:46:23 715 days ago 1668941183 IN 0 ETH$0.00 0.00114731 13.74623508 Execute 15863199 2022-10-30 20:14:47 736 days ago 1667160887 IN 0 ETH$0.00 0.00169311 10.7931869 Execute 15723544 2022-10-11 8:02:11 755 days ago 1665475331 IN 0 ETH$0.00 0.00382012 26.81634273 Execute 15696246 2022-10-07 12:31:59 759 days ago 1665145919 IN 0 ETH$0.00 0.00177015 21.79671377 Execute 15696211 2022-10-07 12:24:59 759 days ago 1665145499 IN 0 ETH$0.00 0.00141075 9.05518163 Execute 15696156 2022-10-07 12:13:47 759 days ago 1665144827 IN 0 ETH$0.00 0.00135527 9.50997787 Execute 15520677 2022-09-12 11:41:38 784 days ago 1662982898 IN 0 ETH$0.00 0.00191337 14.48953729 Execute 15490134 2022-09-07 11:48:19 789 days ago 1662551299 IN 0 ETH$0.00 0.00080778 6.11570536 Execute 15490132 2022-09-07 11:47:48 789 days ago 1662551268 IN 0 ETH$0.00 0.0004698 5.78497869 Execute 15490105 2022-09-07 11:43:12 789 days ago 1662550992 IN 0 ETH$0.00 0.00147367 9.46092667 Latest 7 internal transactions
Advanced mode:Parent Transaction Hash Block From To 14829912 2022-05-23 13:43:24 896 days ago 1653313404 0.38 ETH$915.46 14829864 2022-05-23 13:32:32 896 days ago 1653312752 0.4 ETH$963.64 14299885 2022-03-01 8:03:33 979 days ago 1646121813 0.01175635 ETH$28.32 14212411 2022-02-15 18:43:48 993 days ago 1644950628 0.02142904 ETH$51.62 14212386 2022-02-15 18:37:58 993 days ago 1644950278 0.01489138 ETH$35.87 14212386 2022-02-15 18:37:58 993 days ago 1644950278 Contract Creation 0 ETH$0.00 14212340 2022-02-15 18:29:08 993 days ago 1644949748 0.0517099 ETH$124.57 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 67.72% $2,402.38 1.5174 $3,645.36 ETH 24.38% $129.6 10.1248 $1,312.17 ETH Ether (ETH)1.06% $2,409.1 0.0236 $56.93 ETH 0.04% $0.011097 206.7295 $2.29 OP 3.58% $2,408.52 0.08 $192.68 BSC 1.77% $1 95.217 $95.22 POL 1.38% $0.295498 251.7551 $74.39 POL 0.05% $0.294212 9.9581 $2.93 AVAX 0.01% $22.85 0.0313 $0.714945 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.Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.