ETH Price: $2,429.52 (+0.28%)

Contract

0xe2a91532ef9Cdf62a63F0216c22b445980F964C0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mark Ids180415732023-09-01 12:02:23401 days ago1693569743IN
0xe2a91532...980F964C0
0 ETH0.0013223525.11261649
Unmark Ids180344312023-08-31 12:02:59402 days ago1693483379IN
0xe2a91532...980F964C0
0 ETH0.0007671921.56679997
Unmark Ids180344292023-08-31 12:02:35402 days ago1693483355IN
0xe2a91532...980F964C0
0 ETH0.000884721.1565022
Mark Ids180344272023-08-31 12:02:11402 days ago1693483331IN
0xe2a91532...980F964C0
0 ETH0.0007516221.13138495
Unmark Ids180272862023-08-30 12:02:35403 days ago1693396955IN
0xe2a91532...980F964C0
0 ETH0.0010048928.24877406
Mark Ids180272852023-08-30 12:02:23403 days ago1693396943IN
0xe2a91532...980F964C0
0 ETH0.0010715428.95279592
Mark Ids180201462023-08-29 12:02:35404 days ago1693310555IN
0xe2a91532...980F964C0
0 ETH0.0011951128.58448032
Mark Ids180201442023-08-29 12:02:11404 days ago1693310531IN
0xe2a91532...980F964C0
0 ETH0.0017817928.75072727
Unmark Ids180130162023-08-28 12:02:35405 days ago1693224155IN
0xe2a91532...980F964C0
0 ETH0.0006416120.84985451
Mark Ids180130142023-08-28 12:02:11405 days ago1693224131IN
0xe2a91532...980F964C0
0 ETH0.0008220523.11161008
Unmark Ids180058742023-08-27 12:02:35406 days ago1693137755IN
0xe2a91532...980F964C0
0 ETH0.0006495215.53263181
Mark Ids180058722023-08-27 12:02:11406 days ago1693137731IN
0xe2a91532...980F964C0
0 ETH0.0006976516.68620739
Unmark Ids179987112023-08-26 12:02:23407 days ago1693051343IN
0xe2a91532...980F964C0
0 ETH0.0004754813.36633838
Unmark Ids179915822023-08-25 12:02:59408 days ago1692964979IN
0xe2a91532...980F964C0
0 ETH0.0005794918.83854013
Unmark Ids179915812023-08-25 12:02:47408 days ago1692964967IN
0xe2a91532...980F964C0
0 ETH0.0006581618.49550701
Unmark Ids179915792023-08-25 12:02:23408 days ago1692964943IN
0xe2a91532...980F964C0
0 ETH0.000675118.97804318
Unmark Ids179844352023-08-24 12:02:59409 days ago1692878579IN
0xe2a91532...980F964C0
0 ETH0.000918925.83149772
Mark Ids179844342023-08-24 12:02:47409 days ago1692878567IN
0xe2a91532...980F964C0
0 ETH0.0014412827.37125035
Update Marked NF...179844332023-08-24 12:02:35409 days ago1692878555IN
0xe2a91532...980F964C0
0 ETH0.0010930427.32807527
Unmark Ids179844322023-08-24 12:02:23409 days ago1692878543IN
0xe2a91532...980F964C0
0 ETH0.000969527.25384286
Mark Ids179772792023-08-23 12:02:35410 days ago1692792155IN
0xe2a91532...980F964C0
0 ETH0.0005152414.48578735
Mark Ids179772782023-08-23 12:02:23410 days ago1692792143IN
0xe2a91532...980F964C0
0 ETH0.0008137714.98879081
Unmark Ids179701262023-08-22 12:02:35411 days ago1692705755IN
0xe2a91532...980F964C0
0 ETH0.0009365622.39677803
Mark Ids179701252023-08-22 12:02:23411 days ago1692705743IN
0xe2a91532...980F964C0
0 ETH0.0007900622.212236
Update Marked NF...179701242023-08-22 12:02:11411 days ago1692705731IN
0xe2a91532...980F964C0
0 ETH0.0014779222.34611026
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MarkedNFTFilter

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : MarkedNFTFilter.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import {BitMaps} from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
import {IExternalFilter} from "./IExternalFilter.sol";

contract MarkedNFTFilter is Ownable, ERC165, IExternalFilter {
  using BitMaps for BitMaps.BitMap;

  mapping(address => BitMaps.BitMap) private collections;
  mapping(address => uint256) private markedCount;
  mapping(address => bool) private enabled;

  /**
   * @notice Pools can nominate an external contract to approve whether NFT IDs are accepted.
   * This is typically used to implement some kind of dynamic block list, e.g. stolen NFTs.
   * @param collection NFT contract address
   * @param nftIds List of NFT IDs to check
   * @return allowed True if swap (pool buys) is allowed
   */
  function areNFTsAllowed(address collection, uint256[] calldata nftIds, bytes calldata /* context */) external view returns (bool allowed) {
    if (!enabled[collection]) {
      return true;
    }

    uint256 length = nftIds.length;

    // this is a blacklist, so if we did not index the collection, it's allowed
    for (uint256 i; i < length;) {
      if (collections[collection].get(nftIds[i])) {
        return false;
      }

      unchecked {
        ++i;
      }
    }

    return true;
  }

  /**
   * @notice Returns marked NFTs in the same positions as the input array
   * @param collection NFT contract address
   * @param nftIds List of NFT IDs to check
   * @return marked bool[] of marked NFTs
   */
  function getMarkedNFTs(address collection, uint256[] calldata nftIds) external view returns (bool[] memory marked) {
    uint256 length = nftIds.length;
    marked = new bool[](length);

    for (uint256 i; i < length;) {
      if (collections[collection].get(nftIds[i])) {
        marked[i] = true;
      }
      else {
        marked[i] = false;
      }

      unchecked {
        ++i;
      }
    }

    return marked;
  }

  function getMarkedCount(address collection) external view returns (uint256 count) {
    return markedCount[collection];
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) {
    return interfaceId == type(IExternalFilter).interfaceId || super.supportsInterface(interfaceId);
  }

  function updateMarkedNFTs(address collection, uint256[] calldata toMark, uint256[] calldata toUnmark) public onlyOwner {
    markIds(collection, toMark);
    unmarkIds(collection, toUnmark);
  }

  function markIds(address collection, uint256[] calldata nftIds) public onlyOwner {
    uint256 length = nftIds.length;

    for (uint256 i; i < length;) {
      if (!collections[collection].get(nftIds[i])) {
        collections[collection].set(nftIds[i]);
        markedCount[collection]++;
      }

      unchecked {
        ++i;
      }
    }
  }

  function unmarkIds(address collection, uint256[] calldata nftIds) public onlyOwner {
    uint256 length = nftIds.length;

    for (uint256 i; i < length;) {
      if (collections[collection].get(nftIds[i])) {
        collections[collection].unset(nftIds[i]);
        markedCount[collection]--;
      }

      unchecked {
        ++i;
      }
    }
  }

  function isEnabled(address collection) external view returns (bool) {
    return enabled[collection];
  }

  function disableCollections(address[] calldata toDisable) public onlyOwner {
    uint256 length = toDisable.length;

    for (uint256 i; i < length;) {
      // we cannot free the BitMap, so just set this flag to false
      delete enabled[toDisable[i]];

      unchecked {
        ++i;
      }
    }
  }

  function enableCollections(address[] calldata toEnable) public onlyOwner {
    uint256 length = toEnable.length;

    for (uint256 i; i < length;) {
      enabled[toEnable[i]] = true;

      unchecked {
        ++i;
      }
    }
  }

  function toggleCollections(address[] calldata toEnable, address[] calldata toDisable) public onlyOwner {
    enableCollections(toEnable);
    disableCollections(toDisable);
  }
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

File 4 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 8 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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[EIP 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);
}

File 7 of 8 : BitMaps.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/BitMaps.sol)
pragma solidity ^0.8.0;

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */
library BitMaps {
    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}

File 8 of 8 : IExternalFilter.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.0;

import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";

interface IExternalFilter is IERC165 {
  /**
   * @notice Pools can nominate an external contract to approve whether NFT IDs are accepted.
   * This is typically used to implement some kind of dynamic block list, e.g. stolen NFTs.
   * @param collection NFT contract address
   * @param nftIds List of NFT IDs to check
   * @return allowed True if swap (pool buys) is allowed
   */
  function areNFTsAllowed(address collection, uint256[] calldata nftIds, bytes calldata context)
    external
    returns (bool allowed);
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"areNFTsAllowed","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toDisable","type":"address[]"}],"name":"disableCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toEnable","type":"address[]"}],"name":"enableCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getMarkedCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"getMarkedNFTs","outputs":[{"internalType":"bool[]","name":"marked","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"markIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toEnable","type":"address[]"},{"internalType":"address[]","name":"toDisable","type":"address[]"}],"name":"toggleCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"unmarkIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"toMark","type":"uint256[]"},{"internalType":"uint256[]","name":"toUnmark","type":"uint256[]"}],"name":"updateMarkedNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c348061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806380ab33161161008c5780638da5cb5b116100665780638da5cb5b146101ea5780639015d37114610205578063c4ff4dfe14610231578063f2fde38b1461024457600080fd5b806380ab3316146101b1578063840608ca146101c457806384db9549146101d757600080fd5b806332a303a2116100c857806332a303a21461013f5780634a071bb31461015f5780636d63bbbf14610196578063715018a6146101a957600080fd5b806301ffc9a7146100ef5780630c1fb48c146101175780630e7ba72e1461012c575b600080fd5b6101026100fd366004610865565b610257565b60405190151581526020015b60405180910390f35b61012a6101253660046108e2565b61028e565b005b61012a61013a366004610940565b610305565b61015261014d3660046109c1565b61032a565b60405161010e9190610a14565b61018861016d366004610a5a565b6001600160a01b031660009081526002602052604090205490565b60405190815260200161010e565b61012a6101a4366004610a75565b61043c565b61012a610458565b6101026101bf366004610ae1565b61046c565b61012a6101d23660046108e2565b610523565b61012a6101e53660046109c1565b61058b565b6000546040516001600160a01b03909116815260200161010e565b610102610213366004610a5a565b6001600160a01b031660009081526003602052604090205460ff1690565b61012a61023f3660046109c1565b610688565b61012a610252366004610a5a565b61073d565b60006001600160e01b03198216634055998b60e11b148061028857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6102966107bb565b8060005b818110156102ff576001600360008686858181106102ba576102ba610b8c565b90506020020160208101906102cf9190610a5a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161029a565b50505050565b61030d6107bb565b610318858585610688565b61032385838361058b565b5050505050565b6060818067ffffffffffffffff81111561034657610346610ba2565b60405190808252806020026020018201604052801561036f578160200160208202803683370190505b50915060005b81811015610433576103d885858381811061039257610392610b8c565b6001600160a01b038a16600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b156104065760018382815181106103f1576103f1610b8c565b9115156020928302919091019091015261042b565b600083828151811061041a5761041a610b8c565b911515602092830291909101909101525b600101610375565b50509392505050565b6104446107bb565b61044e848461028e565b6102ff8282610523565b6104606107bb565b61046a6000610815565b565b6001600160a01b03851660009081526003602052604081205460ff166104945750600161051a565b8360005b81811015610513576104fb8787838181106104b5576104b5610b8c565b6001600160a01b038c16600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b1561050b5760009250505061051a565b600101610498565b5060019150505b95945050505050565b61052b6107bb565b8060005b818110156102ff576003600085858481811061054d5761054d610b8c565b90506020020160208101906105629190610a5a565b6001600160a01b031681526020810191909152604001600020805460ff1916905560010161052f565b6105936107bb565b8060005b81811015610323576105fa8484838181106105b4576105b4610b8c565b6001600160a01b038916600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b156106805761065684848381811061061457610614610b8c565b6001600160a01b038916600090815260016020818152604080842094820290960135600881901c8452939052939020805460ff9092169390931b191690915550565b6001600160a01b038516600090815260026020526040812080549161067a83610bce565b91905055505b600101610597565b6106906107bb565b8060005b81811015610323576106b18484838181106105b4576105b4610b8c565b6107355761070b8484838181106106ca576106ca610b8c565b6001600160a01b038916600090815260016020818152604080842094820290960135600881901c8452939052939020805460ff9092169390931b1790915550565b6001600160a01b038516600090815260026020526040812080549161072f83610be5565b91905055505b600101610694565b6107456107bb565b6001600160a01b0381166107af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6107b881610815565b50565b6000546001600160a01b0316331461046a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561087757600080fd5b81356001600160e01b03198116811461088f57600080fd5b9392505050565b60008083601f8401126108a857600080fd5b50813567ffffffffffffffff8111156108c057600080fd5b6020830191508360208260051b85010111156108db57600080fd5b9250929050565b600080602083850312156108f557600080fd5b823567ffffffffffffffff81111561090c57600080fd5b61091885828601610896565b90969095509350505050565b80356001600160a01b038116811461093b57600080fd5b919050565b60008060008060006060868803121561095857600080fd5b61096186610924565b9450602086013567ffffffffffffffff8082111561097e57600080fd5b61098a89838a01610896565b909650945060408801359150808211156109a357600080fd5b506109b088828901610896565b969995985093965092949392505050565b6000806000604084860312156109d657600080fd5b6109df84610924565b9250602084013567ffffffffffffffff8111156109fb57600080fd5b610a0786828701610896565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015610a4e578351151583529284019291840191600101610a30565b50909695505050505050565b600060208284031215610a6c57600080fd5b61088f82610924565b60008060008060408587031215610a8b57600080fd5b843567ffffffffffffffff80821115610aa357600080fd5b610aaf88838901610896565b90965094506020870135915080821115610ac857600080fd5b50610ad587828801610896565b95989497509550505050565b600080600080600060608688031215610af957600080fd5b610b0286610924565b9450602086013567ffffffffffffffff80821115610b1f57600080fd5b610b2b89838a01610896565b90965094506040880135915080821115610b4457600080fd5b818801915088601f830112610b5857600080fd5b813581811115610b6757600080fd5b896020828501011115610b7957600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600081610bdd57610bdd610bb8565b506000190190565b600060018201610bf757610bf7610bb8565b506001019056fea2646970667358221220ba7b066fccd0e11efccec3fb32d92c57389cf750881db2c4a21645e9060f2dc064736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806380ab33161161008c5780638da5cb5b116100665780638da5cb5b146101ea5780639015d37114610205578063c4ff4dfe14610231578063f2fde38b1461024457600080fd5b806380ab3316146101b1578063840608ca146101c457806384db9549146101d757600080fd5b806332a303a2116100c857806332a303a21461013f5780634a071bb31461015f5780636d63bbbf14610196578063715018a6146101a957600080fd5b806301ffc9a7146100ef5780630c1fb48c146101175780630e7ba72e1461012c575b600080fd5b6101026100fd366004610865565b610257565b60405190151581526020015b60405180910390f35b61012a6101253660046108e2565b61028e565b005b61012a61013a366004610940565b610305565b61015261014d3660046109c1565b61032a565b60405161010e9190610a14565b61018861016d366004610a5a565b6001600160a01b031660009081526002602052604090205490565b60405190815260200161010e565b61012a6101a4366004610a75565b61043c565b61012a610458565b6101026101bf366004610ae1565b61046c565b61012a6101d23660046108e2565b610523565b61012a6101e53660046109c1565b61058b565b6000546040516001600160a01b03909116815260200161010e565b610102610213366004610a5a565b6001600160a01b031660009081526003602052604090205460ff1690565b61012a61023f3660046109c1565b610688565b61012a610252366004610a5a565b61073d565b60006001600160e01b03198216634055998b60e11b148061028857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6102966107bb565b8060005b818110156102ff576001600360008686858181106102ba576102ba610b8c565b90506020020160208101906102cf9190610a5a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161029a565b50505050565b61030d6107bb565b610318858585610688565b61032385838361058b565b5050505050565b6060818067ffffffffffffffff81111561034657610346610ba2565b60405190808252806020026020018201604052801561036f578160200160208202803683370190505b50915060005b81811015610433576103d885858381811061039257610392610b8c565b6001600160a01b038a16600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b156104065760018382815181106103f1576103f1610b8c565b9115156020928302919091019091015261042b565b600083828151811061041a5761041a610b8c565b911515602092830291909101909101525b600101610375565b50509392505050565b6104446107bb565b61044e848461028e565b6102ff8282610523565b6104606107bb565b61046a6000610815565b565b6001600160a01b03851660009081526003602052604081205460ff166104945750600161051a565b8360005b81811015610513576104fb8787838181106104b5576104b5610b8c565b6001600160a01b038c16600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b1561050b5760009250505061051a565b600101610498565b5060019150505b95945050505050565b61052b6107bb565b8060005b818110156102ff576003600085858481811061054d5761054d610b8c565b90506020020160208101906105629190610a5a565b6001600160a01b031681526020810191909152604001600020805460ff1916905560010161052f565b6105936107bb565b8060005b81811015610323576105fa8484838181106105b4576105b4610b8c565b6001600160a01b038916600090815260016020908152604090912093910201359050600881901c600090815260208390526040902054600160ff83161b16151592915050565b156106805761065684848381811061061457610614610b8c565b6001600160a01b038916600090815260016020818152604080842094820290960135600881901c8452939052939020805460ff9092169390931b191690915550565b6001600160a01b038516600090815260026020526040812080549161067a83610bce565b91905055505b600101610597565b6106906107bb565b8060005b81811015610323576106b18484838181106105b4576105b4610b8c565b6107355761070b8484838181106106ca576106ca610b8c565b6001600160a01b038916600090815260016020818152604080842094820290960135600881901c8452939052939020805460ff9092169390931b1790915550565b6001600160a01b038516600090815260026020526040812080549161072f83610be5565b91905055505b600101610694565b6107456107bb565b6001600160a01b0381166107af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6107b881610815565b50565b6000546001600160a01b0316331461046a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561087757600080fd5b81356001600160e01b03198116811461088f57600080fd5b9392505050565b60008083601f8401126108a857600080fd5b50813567ffffffffffffffff8111156108c057600080fd5b6020830191508360208260051b85010111156108db57600080fd5b9250929050565b600080602083850312156108f557600080fd5b823567ffffffffffffffff81111561090c57600080fd5b61091885828601610896565b90969095509350505050565b80356001600160a01b038116811461093b57600080fd5b919050565b60008060008060006060868803121561095857600080fd5b61096186610924565b9450602086013567ffffffffffffffff8082111561097e57600080fd5b61098a89838a01610896565b909650945060408801359150808211156109a357600080fd5b506109b088828901610896565b969995985093965092949392505050565b6000806000604084860312156109d657600080fd5b6109df84610924565b9250602084013567ffffffffffffffff8111156109fb57600080fd5b610a0786828701610896565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015610a4e578351151583529284019291840191600101610a30565b50909695505050505050565b600060208284031215610a6c57600080fd5b61088f82610924565b60008060008060408587031215610a8b57600080fd5b843567ffffffffffffffff80821115610aa357600080fd5b610aaf88838901610896565b90965094506020870135915080821115610ac857600080fd5b50610ad587828801610896565b95989497509550505050565b600080600080600060608688031215610af957600080fd5b610b0286610924565b9450602086013567ffffffffffffffff80821115610b1f57600080fd5b610b2b89838a01610896565b90965094506040880135915080821115610b4457600080fd5b818801915088601f830112610b5857600080fd5b813581811115610b6757600080fd5b896020828501011115610b7957600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600081610bdd57610bdd610bb8565b506000190190565b600060018201610bf757610bf7610bb8565b506001019056fea2646970667358221220ba7b066fccd0e11efccec3fb32d92c57389cf750881db2c4a21645e9060f2dc064736f6c63430008120033

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.