ETH Price: $1,638.11 (-1.22%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...220948412025-03-21 11:07:1125 days ago1742555231IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000046031
Set Approval For...219393152025-02-27 17:58:1146 days ago1740679091IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000019080.78884797
Safe Transfer Fr...215705322025-01-07 5:34:1198 days ago1736228051IN
0x021Ca7D7...5F44C1AF1
0 ETH0.00036937.99210696
Safe Transfer Fr...215705282025-01-07 5:33:2398 days ago1736228003IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000833289.25782542
Set Approval For...209692692024-10-15 6:46:59182 days ago1728974819IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0005096711.05539452
Set Approval For...205831312024-08-22 9:04:23236 days ago1724317463IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000031091.28555379
Set Approval For...205448482024-08-17 0:44:47241 days ago1723855487IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000024191
Set Approval For...202325342024-07-04 10:24:23285 days ago1720088663IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0005239411.37965133
Set Approval For...198093122024-05-06 6:38:47344 days ago1714977527IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000218074.73895226
Safe Transfer Fr...186234262023-11-21 23:30:11510 days ago1700609411IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0019466542
Safe Transfer Fr...186234192023-11-21 23:28:35510 days ago1700609315IN
0x021Ca7D7...5F44C1AF1
0 ETH0.002293941
Safe Transfer Fr...186234162023-11-21 23:27:59510 days ago1700609279IN
0x021Ca7D7...5F44C1AF1
0 ETH0.003696141
Set Approval For...170153722023-04-10 4:14:59736 days ago1681100099IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0009454420.54500443
Set Approval For...167554682023-03-04 13:47:35772 days ago1677937655IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0030513966.18797279
Set Approval For...167114272023-02-26 9:09:47779 days ago1677402587IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0007362816
Set Approval For...163861782023-01-11 21:14:23824 days ago1673471663IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0011913225.88832828
Set Approval For...163221242023-01-02 22:38:23833 days ago1672699103IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0009253620.07216964
Set Approval For...162911332022-12-29 14:52:47837 days ago1672325567IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0008281317.96787696
Transfer From161649432022-12-12 0:07:11855 days ago1670803631IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0016574921.33999437
Set Approval For...161348842022-12-07 19:21:59859 days ago1670440919IN
0x021Ca7D7...5F44C1AF1
0 ETH0.000732715.92209269
Submit Hashes160737062022-11-29 5:57:59868 days ago1669701479IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0005441912.38041356
Submit Hashes160737062022-11-29 5:57:59868 days ago1669701479IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0036678835.38041356
Claim160736422022-11-29 5:45:11868 days ago1669700711IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0014531510.01956252
Safe Transfer Fr...159012272022-11-05 3:47:47892 days ago1667620067IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0007181615.49063439
Set Approval For...158968192022-11-04 13:02:11893 days ago1667566931IN
0x021Ca7D7...5F44C1AF1
0 ETH0.0009146419.87572053
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xf883ab97...A015EfD8A
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
EvohClaimable

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2021-07-07
*/

// SPDX-License-Identifier: NONE

pragma solidity 0.8.3;



// Part: ERC721TokenReceiver

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///         unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

// Part: EvohERC721

contract EvohERC721 {

    string public name;
    string public symbol;
    uint256 public totalSupply;

    mapping(bytes4 => bool) public supportsInterface;

    struct UserData {
        uint256 balance;
        uint256[4] ownership;
    }
    mapping(address => UserData) userData;

    address[1024] tokenOwners;
    address[1024] tokenApprovals;
    mapping(uint256 => string) tokenURIs;

    mapping (address => mapping (address => bool)) private operatorApprovals;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
        supportsInterface[_INTERFACE_ID_ERC165] = true;
        supportsInterface[_INTERFACE_ID_ERC721] = true;
        supportsInterface[_INTERFACE_ID_ERC721_METADATA] = true;
        supportsInterface[_INTERFACE_ID_ERC721_ENUMERABLE] = true;
    }

    /// @notice Count all NFTs assigned to an owner
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0), "Query for zero address");
        return userData[_owner].balance;
    }

    /// @notice Find the owner of an NFT
    function ownerOf(uint256 tokenId) public view returns (address) {
        if (tokenId < 1024) {
            address owner = tokenOwners[tokenId];
            if (owner != address(0)) return owner;
        }
        revert("Query for nonexistent tokenId");
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        require(_from != address(0));
        require(_to != address(0));
        address owner = ownerOf(_tokenId);
        if (
            msg.sender == owner ||
            getApproved(_tokenId) == msg.sender ||
            isApprovedForAll(owner, msg.sender)
        ) {
            delete tokenApprovals[_tokenId];
            removeOwnership(_from, _tokenId);
            addOwnership(_to, _tokenId);
            emit Transfer(_from, _to, _tokenId);
            return;
        }
        revert("Caller is not owner nor approved");
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param _data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
        _transfer(_from, _to, _tokenId);
        require(_checkOnERC721Received(_from, _to, _tokenId, _data), "Transfer to non ERC721 receiver");
    }

    function removeOwnership(address _owner, uint256 _tokenId) internal {
        UserData storage data = userData[_owner];
        data.balance -= 1;
        uint256 idx = _tokenId / 256;
        uint256 bitfield = data.ownership[idx];
        data.ownership[idx] = bitfield & ~(uint256(1) << (_tokenId % 256));
    }

    function addOwnership(address _owner, uint256 _tokenId) internal {
        tokenOwners[_tokenId] = _owner;
        UserData storage data = userData[_owner];
        data.balance += 1;
        uint256 idx = _tokenId / 256;
        uint256 bitfield = data.ownership[idx];
        data.ownership[idx] = bitfield | uint256(1) << (_tokenId % 256);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        safeTransferFrom(_from, _to, _tokenId, bytes(""));
    }

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external {
        _transfer(_from, _to, _tokenId);
    }

        /// @notice Change or reaffirm the approved address for an NFT
    function approve(address approved, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "Not owner nor approved for all"
        );
        tokenApprovals[tokenId] = approved;
        emit Approval(owner, approved, tokenId);
    }

    /// @notice Get the approved address for a single NFT
    function getApproved(uint256 tokenId) public view returns (address) {
        ownerOf(tokenId);
        return tokenApprovals[tokenId];
    }

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///         all of `msg.sender`'s assets
    function setApprovalForAll(address operator, bool approved) external {
        operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Query if an address is an authorized operator for another address
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return operatorApprovals[owner][operator];
    }

    /// @notice Concatenates tokenId to baseURI and returns the string.
    function tokenURI(uint256 tokenId) public view returns (string memory) {
        ownerOf(tokenId);
        return tokenURIs[tokenId];
    }

    /// @notice Enumerate valid NFTs
    function tokenByIndex(uint256 _index) external view returns (uint256) {
        require(_index < totalSupply, "Index out of bounds");
        return _index;
    }

    /// @notice Enumerate NFTs assigned to an owner
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        UserData storage data = userData[_owner];
        require (_index < data.balance, "Index out of bounds");
        uint256 bitfield;
        uint256 count;
        for (uint256 i = 0; i < 1024; i++) {
            uint256 key = i % 256;
            if (key == 0) {
                bitfield = data.ownership[i / 256];
            }
            if ((bitfield >> key) & uint256(1) == 1) {
                if (count == _index) {
                    return i;
                }
                count++;
            }
        }
        revert();
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    )
        private
        returns (bool)
    {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(to) }
        if (size == 0) {
            return true;
        }

        (bool success, bytes memory returnData) = to.call{ value: 0 }(
            abi.encodeWithSelector(
                ERC721TokenReceiver(to).onERC721Received.selector,
                msg.sender,
                from,
                tokenId,
                _data
            )
        );
        require(success, "Transfer to non ERC721 receiver");
        bytes4 returnValue = abi.decode(returnData, (bytes4));
        return (returnValue == _ERC721_RECEIVED);
    }

}

// File: Claimable.sol

contract EvohClaimable is EvohERC721 {

    uint256 public maxTotalSupply;
    bytes32 public hashRoot;
    address public owner;
    uint256 public startTime;

    struct ClaimData {
        bytes32 root;
        uint256 count;
        uint256 limit;
        mapping(address => bool) claimed;
    }

    ClaimData[] public claimData;

    constructor(
        string memory _name,
        string memory _symbol,
        bytes32 _hashRoot,
        uint256 _maxTotalSupply,
        uint256 _startTime
    )
        EvohERC721(_name, _symbol)
    {
        owner = msg.sender;
        hashRoot = _hashRoot;
        maxTotalSupply = _maxTotalSupply;
        startTime = _startTime;
    }

    function addClaimRoots(bytes32[] calldata _merkleRoots, uint256[] calldata _claimLimits) external {
        require(msg.sender == owner);
        for (uint256 i = 0; i < _merkleRoots.length; i++) {
            ClaimData storage data = claimData.push();
            data.root = _merkleRoots[i];
            data.limit = _claimLimits[i];
        }
    }

    function isClaimed(uint256 _claimIndex, address _account) public view returns (bool) {
        return claimData[_claimIndex].claimed[_account];
    }

    /**
        @notice Claim an NFT using an eligible account
        @param _claimIndex Index of the claim hash to validate `_claimProof` against
        @param _claimProof Proof to validate against the claim root
     */
    function claim(
        uint256 _claimIndex,
        bytes32[] calldata _claimProof
    )
        external
    {
        require(block.timestamp >= startTime, "Cannot claim before start time");
        uint256 claimed = totalSupply;
        require(maxTotalSupply > claimed, "All NFTs claimed");

        // Verify the claim
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        ClaimData storage data = claimData[_claimIndex];

        require(_claimIndex < claimData.length, "Invalid merkleIndex");
        require(data.count < data.limit, "All NFTs claimed in this airdrop");
        require(!data.claimed[msg.sender], "User has claimed in this airdrop");
        require(verify(_claimProof, data.root, node), "Invalid claim proof");

        // Mark as claimed, write the hash and send the token.
        data.count++;
        data.claimed[msg.sender] = true;

        addOwnership(msg.sender, claimed);
        emit Transfer(address(0), msg.sender, claimed);
        totalSupply = claimed + 1;
    }

     /**
        @notice Submit NFT hashes on-chain.
        @param _indexes Indexes of the hashes being added.
        @param _hashes IPFS hashes being added.
        @param _proofs Proofs for the IPFS hashes. These are checked against `hashRoot`.
     */
    function submitHashes(
        uint256[] calldata _indexes,
        string[] calldata _hashes,
        bytes32[][] calldata _proofs
    ) external {
        require(_indexes.length == _proofs.length);
        bytes32 root = hashRoot;
        for (uint256 i = 0; i < _indexes.length; i++) {
            bytes32 node = keccak256(abi.encodePacked(_indexes[i], _hashes[i]));
            require(verify(_proofs[i], root, node), "Invalid hash proof");
            tokenURIs[_indexes[i]] = _hashes[i];
        }
    }

    function verify(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    )
        internal
        pure
        returns (bool)
    {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_hashRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleRoots","type":"bytes32[]"},{"internalType":"uint256[]","name":"_claimLimits","type":"uint256[]"}],"name":"addClaimRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"},{"internalType":"bytes32[]","name":"_claimProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimData","outputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hashRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"string[]","name":"_hashes","type":"string[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"}],"name":"submitHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806354ef224b116100de578063a22cb46511610097578063c6f0308c11610071578063c6f0308c14610327578063c87b56dd14610355578063d2ef079514610368578063e985e9c51461037b57610173565b8063a22cb465146102f7578063b29a31051461030a578063b88d4fde1461031457610173565b806354ef224b146102985780636352211e146102ab57806370a08231146102be57806378e97925146102d15780638da5cb5b146102db57806395d89b41146102ef57610173565b806323b872dd1161013057806323b872dd1461022f5780632ab4d052146102425780632f52ebb71461024c5780632f745c591461025f57806342842e0e146102725780634f6ccce71461028557610173565b806301ffc9a71461017857806306fdde03146101b0578063081812fc146101c5578063095ea7b3146101f057806318160ddd1461020557806319e41c7e1461021c575b600080fd5b61019b6101863660046117fe565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101b861038e565b6040516101a79190611959565b6101d86101d3366004611836565b61041c565b6040516001600160a01b0390911681526020016101a7565b6102036101fe3660046116d6565b61045e565b005b61020e60025481565b6040519081526020016101a7565b61020361022a366004611768565b61054f565b61020361023d36600461158c565b610704565b61020e6108075481565b61020361025a366004611870565b610714565b61020e61026d3660046116d6565b6109f4565b61020361028036600461158c565b610afa565b61020e610293366004611836565b610b15565b6102036102a63660046116ff565b610b62565b6101d86102b9366004611836565b610c30565b61020e6102cc366004611539565b610cc4565b61020e61080a5481565b610809546101d8906001600160a01b031681565b6101b8610d31565b61020361030536600461169c565b610d3e565b61020e6108085481565b6102036103223660046115c7565b610dab565b61033a610335366004611836565b610e14565b604080519384526020840192909252908201526060016101a7565b6101b8610363366004611836565b610e48565b61019b61037636600461184e565b610ef3565b61019b61038936600461155a565b610f4b565b6000805461039b90611a68565b80601f01602080910402602001604051908101604052809291908181526020018280546103c790611a68565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505081565b600061042782610c30565b5061040582610400811061044b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690505b919050565b600061046982610c30565b9050336001600160a01b038216148061048757506104878133610f4b565b6104d85760405162461bcd60e51b815260206004820152601e60248201527f4e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c000060448201526064015b60405180910390fd5b826104058361040081106104fc57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03928316179055604051839185811691908416907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4505050565b84811461055b57600080fd5b6108085460005b868110156106fa57600088888381811061058c57634e487b7160e01b600052603260045260246000fd5b905060200201358787848181106105b357634e487b7160e01b600052603260045260246000fd5b90506020028101906105c591906119b4565b6040516020016105d793929190611902565b60405160208183030381529060405280519060200120905061062b85858481811061061257634e487b7160e01b600052603260045260246000fd5b9050602002810190610624919061196c565b8584610f7a565b61066c5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2103430b9b410383937b7b360711b60448201526064016104cf565b86868381811061068c57634e487b7160e01b600052603260045260246000fd5b905060200281019061069e91906119b4565b61080560008c8c878181106106c357634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002091906106e5929190611448565b505080806106f290611aa3565b915050610562565b5050505050505050565b61070f838383611038565b505050565b61080a544210156107675760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420636c61696d206265666f72652073746172742074696d65000060448201526064016104cf565b6002546108075481106107af5760405162461bcd60e51b815260206004820152601060248201526f105b1b081391951cc818db185a5b595960821b60448201526064016104cf565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050600061080b868154811061080c57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201905061080b8054905086106108675760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dacae4d6d8ca92dcc8caf606b1b60448201526064016104cf565b80600201548160010154106108be5760405162461bcd60e51b815260206004820181905260248201527f416c6c204e46547320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b33600090815260038201602052604090205460ff16156109205760405162461bcd60e51b815260206004820181905260248201527f557365722068617320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b6109308585836000015485610f7a565b6109725760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21031b630b4b690383937b7b360691b60448201526064016104cf565b60018101805490600061098483611aa3565b90915550503360008181526003830160205260409020805460ff191660011790556109af908461117c565b604051839033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46109e98360016119f9565b600255505050505050565b6001600160a01b038216600090815260046020526040812080548310610a525760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b60008060005b610400811015610aee576000610a7061010083611abe565b905080610aaa5760018501610a8761010084611a11565b60048110610aa557634e487b7160e01b600052603260045260246000fd5b015493505b60018185901c1660011415610adb5786831415610acd57509350610af492505050565b82610ad781611aa3565b9350505b5080610ae681611aa3565b915050610a58565b50600080fd5b92915050565b61070f83838360405180602001604052806000815250610dab565b60006002548210610b5e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b5090565b610809546001600160a01b03163314610b7a57600080fd5b60005b83811015610c295761080b80546001810182556000919091526004027f49269584b067be73383c276ccddb229298ef6883c3f229e0e1f150dc5ed2f9f801858583818110610bdb57634e487b7160e01b600052603260045260246000fd5b6020029190910135825550838383818110610c0657634e487b7160e01b600052603260045260246000fd5b905060200201358160020181905550508080610c2190611aa3565b915050610b7d565b5050505050565b6000610400821015610c7c5760006005836104008110610c6057634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690508015610c7a579050610459565b505b60405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e496400000060448201526064016104cf565b60006001600160a01b038216610d155760405162461bcd60e51b8152602060048201526016602482015275517565727920666f72207a65726f206164647265737360501b60448201526064016104cf565b506001600160a01b031660009081526004602052604090205490565b6001805461039b90611a68565b336000818152610806602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610db6848484611038565b610dc28484848461125c565b610e0e5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b50505050565b61080b8181548110610e2557600080fd5b600091825260209091206004909102018054600182015460029092015490925083565b6060610e5382610c30565b506000828152610805602052604090208054610e6e90611a68565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90611a68565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b50505050509050919050565b600061080b8381548110610f1757634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600160a01b03861684526003600490930201919091019052604090205460ff16905092915050565b6001600160a01b0391821660009081526108066020908152604080832093909416825291909152205460ff1690565b600081815b8581101561102a576000878783818110610fa957634e487b7160e01b600052603260045260246000fd5b905060200201359050808311610fea576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611017565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061102281611aa3565b915050610f7f565b50831490505b949350505050565b6001600160a01b03831661104b57600080fd5b6001600160a01b03821661105e57600080fd5b600061106982610c30565b9050336001600160a01b03821614806110925750336110878361041c565b6001600160a01b0316145b806110a257506110a28133610f4b565b15611134576104058261040081106110ca57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b03191690556110e384836113a6565b6110ed838361117c565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45061070f565b60405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656460448201526064016104cf565b81600582610400811061119f57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392831617905582166000908152600460205260408120805490916001918391906111df9084906119f9565b90915550600090506111f361010084611a11565b9050600082600101826004811061121a57634e487b7160e01b600052603260045260246000fd5b0154905061122a61010085611abe565b6001901b811783600101836004811061125357634e487b7160e01b600052603260045260246000fd5b01555050505050565b6000833b8061126f576001915050611030565b600080866001600160a01b0316600063150b7a0260e01b338b8a8a60405160240161129d949392919061191c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516112db91906118e6565b60006040518083038185875af1925050503d8060008114611318576040519150601f19603f3d011682016040523d82523d6000602084013e61131d565b606091505b50915091508161136f5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b600081806020019051810190611385919061181a565b6001600160e01b031916630a85bd0160e11b14945050505050949350505050565b6001600160a01b0382166000908152600460205260408120805490916001918391906113d3908490611a25565b90915550600090506113e761010084611a11565b9050600082600101826004811061140e57634e487b7160e01b600052603260045260246000fd5b0154905061141e61010085611abe565b6001901b19811683600101836004811061125357634e487b7160e01b600052603260045260246000fd5b82805461145490611a68565b90600052602060002090601f01602090048101928261147657600085556114bc565b82601f1061148f5782800160ff198235161785556114bc565b828001600101855582156114bc579182015b828111156114bc5782358255916020019190600101906114a1565b50610b5e9291505b80821115610b5e57600081556001016114c4565b80356001600160a01b038116811461045957600080fd5b60008083601f840112611500578081fd5b50813567ffffffffffffffff811115611517578182fd5b6020830191508360208260051b850101111561153257600080fd5b9250929050565b60006020828403121561154a578081fd5b611553826114d8565b9392505050565b6000806040838503121561156c578081fd5b611575836114d8565b9150611583602084016114d8565b90509250929050565b6000806000606084860312156115a0578081fd5b6115a9846114d8565b92506115b7602085016114d8565b9150604084013590509250925092565b600080600080608085870312156115dc578081fd5b6115e5856114d8565b93506115f3602086016114d8565b925060408501359150606085013567ffffffffffffffff80821115611616578283fd5b818701915087601f830112611629578283fd5b81358181111561163b5761163b611afe565b604051601f8201601f19908116603f0116810190838211818310171561166357611663611afe565b816040528281528a602084870101111561167b578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156116ae578182fd5b6116b7836114d8565b9150602083013580151581146116cb578182fd5b809150509250929050565b600080604083850312156116e8578182fd5b6116f1836114d8565b946020939093013593505050565b60008060008060408587031215611714578384fd5b843567ffffffffffffffff8082111561172b578586fd5b611737888389016114ef565b9096509450602087013591508082111561174f578384fd5b5061175c878288016114ef565b95989497509550505050565b60008060008060008060608789031215611780578182fd5b863567ffffffffffffffff80821115611797578384fd5b6117a38a838b016114ef565b909850965060208901359150808211156117bb578384fd5b6117c78a838b016114ef565b909650945060408901359150808211156117df578384fd5b506117ec89828a016114ef565b979a9699509497509295939492505050565b60006020828403121561180f578081fd5b813561155381611b14565b60006020828403121561182b578081fd5b815161155381611b14565b600060208284031215611847578081fd5b5035919050565b60008060408385031215611860578182fd5b82359150611583602084016114d8565b600080600060408486031215611884578081fd5b83359250602084013567ffffffffffffffff8111156118a1578182fd5b6118ad868287016114ef565b9497909650939450505050565b600081518084526118d2816020860160208601611a3c565b601f01601f19169290920160200192915050565b600082516118f8818460208701611a3c565b9190910192915050565b600084825282846020840137910160200190815292915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061194f908301846118ba565b9695505050505050565b60006020825261155360208301846118ba565b6000808335601e19843603018112611982578283fd5b83018035915067ffffffffffffffff82111561199c578283fd5b6020019150600581901b360382131561153257600080fd5b6000808335601e198436030181126119ca578182fd5b83018035915067ffffffffffffffff8211156119e4578283fd5b60200191503681900382131561153257600080fd5b60008219821115611a0c57611a0c611ad2565b500190565b600082611a2057611a20611ae8565b500490565b600082821015611a3757611a37611ad2565b500390565b60005b83811015611a57578181015183820152602001611a3f565b83811115610e0e5750506000910152565b600181811c90821680611a7c57607f821691505b60208210811415611a9d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ab757611ab7611ad2565b5060010190565b600082611acd57611acd611ae8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b2a57600080fd5b5056fea2646970667358221220c9e02a5e461939ae5097cac77464dd08d9eb2ac85a1c2d20c6e0e5381859ddbd64736f6c63430008030033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.