ETH Price: $3,087.81 (-1.07%)

Contract

0xCf2f795C60a19BE4833B8102d75AFDdB26d824C5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Rearrange Board ...211334512024-11-07 4:41:2311 days ago1730954483IN
0xCf2f795C...B26d824C5
0 ETH0.0009047711.30073413
Claim Verified B...211248962024-11-06 0:01:3512 days ago1730851295IN
0xCf2f795C...B26d824C5
0 ETH0.001260927.08948597
Rearrange Board ...211110132024-11-04 1:31:2314 days ago1730683883IN
0xCf2f795C...B26d824C5
0 ETH0.000322783.50414692
Rearrange Board ...211103732024-11-03 23:22:3514 days ago1730676155IN
0xCf2f795C...B26d824C5
0 ETH0.000730464.26200321
Claim Verified B...211103552024-11-03 23:18:5914 days ago1730675939IN
0xCf2f795C...B26d824C5
0 ETH0.00066724.65922803
Claim Verified B...210965132024-11-02 0:55:2316 days ago1730508923IN
0xCf2f795C...B26d824C5
0 ETH0.000481124.20188342
Claim Verified B...210965092024-11-02 0:54:3516 days ago1730508875IN
0xCf2f795C...B26d824C5
0 ETH0.000463644.04923949
Claim Verified B...210964992024-11-02 0:52:3516 days ago1730508755IN
0xCf2f795C...B26d824C5
0 ETH0.000533044.65533377
Buy Board210852702024-10-31 11:18:3518 days ago1730373515IN
0xCf2f795C...B26d824C5
0 ETH0.001366659.07089061
Claim Verified B...210852472024-10-31 11:13:5918 days ago1730373239IN
0xCf2f795C...B26d824C5
0 ETH0.000939548.28668598
Claim POAP210750482024-10-30 1:01:5919 days ago1730250119IN
0xCf2f795C...B26d824C5
0 ETH0.00026486.96989328
Claim Verified B...197610852024-04-29 12:51:11202 days ago1714395071IN
0xCf2f795C...B26d824C5
0 ETH0.0018133610.23887306
Claim Verified B...196769682024-04-17 18:25:23214 days ago1713378323IN
0xCf2f795C...B26d824C5
0 ETH0.0027407821.00622062
Claim Verified B...196768412024-04-17 17:59:47214 days ago1713376787IN
0xCf2f795C...B26d824C5
0 ETH0.0024007218.39988347
Claim Verified B...196767782024-04-17 17:46:47214 days ago1713376007IN
0xCf2f795C...B26d824C5
0 ETH0.0024569718.83102262
Claim Verified B...196718542024-04-17 1:17:23215 days ago1713316643IN
0xCf2f795C...B26d824C5
0 ETH0.000930148.20378409
Claim Verified B...196162132024-04-09 6:10:23223 days ago1712643023IN
0xCf2f795C...B26d824C5
0 ETH0.0027092419.59228091
Claim POAP195934772024-04-06 1:42:23226 days ago1712367743IN
0xCf2f795C...B26d824C5
0 ETH0.0003972810.704857
Claim All191800642024-02-08 1:05:23284 days ago1707354323IN
0xCf2f795C...B26d824C5
0 ETH0.0049571628.79827201
Claim Verified B...191153532024-01-29 23:07:59293 days ago1706569679IN
0xCf2f795C...B26d824C5
0 ETH0.0024220718.56351635
Claim POAP190709182024-01-23 17:40:47299 days ago1706031647IN
0xCf2f795C...B26d824C5
0 ETH0.0006056416.3188886
Claim POAP190620482024-01-22 11:41:23301 days ago1705923683IN
0xCf2f795C...B26d824C5
0 ETH0.0012030614.02110817
Claim Verified B...190596112024-01-22 3:28:35301 days ago1705894115IN
0xCf2f795C...B26d824C5
0 ETH0.0015554811.92168096
Claim Verified B...189696592024-01-09 13:19:23313 days ago1704806363IN
0xCf2f795C...B26d824C5
0 ETH0.0026500720.31100826
Claim Verified B...189689632024-01-09 10:59:23314 days ago1704797963IN
0xCf2f795C...B26d824C5
0 ETH0.0015235813.43787993
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:
AnonymiceBadges

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : AnonymiceBadges.sol
/* solhint-disable quotes */
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPBoard.sol";
import "./POAPLibrary.sol";
import "./IDescriptor.sol";
import "./IBadgesVerifier.sol";
import "./ICheeth.sol";

contract AnonymiceBadges is POAPBoard {
    address public cheethAddress;
    address public descriptorAddress;
    address public badgesVerifierAddress;
    bool public isPaused = true;
    mapping(uint256 => uint256) public boardPrices;
    mapping(address => string) public boardNames;
    mapping(address => bool) private _auth;

    constructor() POAPBoard("Anonymice Collector Cards", "AnonymiceCollectorCards") {}

    function mint() external pure override {
        revert("no free mint");
    }

    function claimAll(
        uint256[] calldata ids,
        bytes32[][] calldata proofs,
        uint256[] calldata genesisMice,
        uint256[] calldata babyMice
    ) external {
        for (uint256 index = 0; index < ids.length; index++) {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(proofs[index], merkleRootsByPOAPId[ids[index]], leaf), "not in whitelist");
            _claimPOAP(ids[index], msg.sender);
        }

        uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges(
            genesisMice,
            babyMice,
            msg.sender
        );

        for (uint256 index = 0; index < badgeIds.length; index++) {
            uint256 badgeId = badgeIds[index];
            if (badgeId == 0) break;
            if (!_poapOwners[badgeId][msg.sender]) {
                _claimPOAP(badgeIds[index], msg.sender);
            }
        }
    }

    function claimVerifiedBadge(
        uint256[] calldata genesisMice,
        uint256[] calldata babyMice,
        uint256 badgeIdToClaim
    ) external {
        uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges(
            genesisMice,
            babyMice,
            msg.sender
        );

        for (uint256 index = 0; index < badgeIds.length; index++) {
            uint256 badgeId = badgeIds[index];
            if (badgeId == 0) break;
            if (badgeIdToClaim == badgeId) {
                if (!_poapOwners[badgeId][msg.sender]) {
                    _claimPOAP(badgeIds[index], msg.sender);
                }
            }
        }
    }

    function getVerifiedBadges(uint256[] memory genesisMice, uint256[] memory babyMice)
        external
        view
        returns (uint256[] memory)
    {
        return IBadgesVerifier(badgesVerifierAddress).claimableBadges(genesisMice, babyMice, msg.sender);
    }

    function buyBoard(uint256 boardId) external {
        require(boardPrices[boardId] > 0, "price not set");
        ICheeth(cheethAddress).burnFrom(msg.sender, boardPrices[boardId]);
        if (!_minted(msg.sender)) {
            _mint(msg.sender);
            currentBoard[msg.sender] = boardId;
        }
        _claimBoard(boardId, msg.sender);
    }

    function setBoardName(string memory name) external {
        boardNames[msg.sender] = name;
    }

    function externalClaimBoard(uint256 boardId, address to) external {
        require(_auth[msg.sender], "no auth");
        _claimBoard(boardId, to);
    }

    function externalClaimPOAP(uint256 id, address to) external {
        require(_auth[msg.sender], "no auth");
        _claimPOAP(id, to);
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return IDescriptor(descriptorAddress).tokenURI(id);
    }

    function rearrangeBoardAndName(
        uint256 boardId,
        uint256[] memory slots,
        string memory text
    ) external {
        if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false);
        _rearrangePOAPs(slots);
        boardNames[msg.sender] = text;
    }

    function previewBoard(
        uint256 boardId,
        uint256[] calldata badges,
        string memory text
    ) external view returns (string memory) {
        return IDescriptor(descriptorAddress).buildSvg(boardId, badges, text, true);
    }

    function setDescriptorAddress(address _descriptorAddress) external onlyOwner {
        descriptorAddress = _descriptorAddress;
    }

    function setCheethAddress(address _cheethAddress) external onlyOwner {
        cheethAddress = _cheethAddress;
    }

    function setBadgesVerifierAddress(address _badgesVerifierAddress) external onlyOwner {
        badgesVerifierAddress = _badgesVerifierAddress;
    }

    function setAuth(address wallet, bool value) external onlyOwner {
        _auth[wallet] = value;
    }

    function setIsPaused(bool value) external onlyOwner {
        isPaused = value;
    }

    function setBoardPrice(uint256 boardId, uint256 boardPrice) external onlyOwner {
        boardPrices[boardId] = boardPrice;
    }
}
/* solhint-enable quotes */

File 2 of 13 : POAPBoard.sol
/* solhint-disable quotes */
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./ERC721UniqueBound.sol";
import "./IPOAPBoard.sol";
import "./POAPLibrary.sol";

contract POAPBoard is Ownable, ERC721UniqueBound {
    mapping(uint256 => mapping(address => bool)) internal _poapOwners;
    mapping(address => mapping(uint256 => uint256)) internal _poaps;

    uint256 public boardCount;
    uint256 public poapCount;
    mapping(uint256 => POAPLibrary.Board) public boards;
    mapping(address => uint256) public currentBoard;
    mapping(address => uint256) public poapsBalanceOf;
    mapping(uint256 => bytes32) public merkleRootsByPOAPId;
    mapping(uint256 => bytes32) public merkleRootsByBoardId;
    mapping(address => mapping(uint256 => bool)) public availableBoards;
    mapping(address => mapping(uint256 => uint256)) public poapPositions;

    constructor(string memory name_, string memory symbol_) ERC721UniqueBound(name_, symbol_) {}

    function mint() external virtual {
        _mint(msg.sender);
        availableBoards[msg.sender][1] = true;
        currentBoard[msg.sender] = 1;
    }

    function claimBoard(uint256 boardId, bytes32[] calldata proof) external {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, merkleRootsByBoardId[boardId], leaf), "not in whitelist");
        _claimBoard(boardId, msg.sender);
    }

    function claimPOAP(uint256 id, bytes32[] calldata proof) public {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, merkleRootsByPOAPId[id], leaf), "not in whitelist");
        _claimPOAP(id, msg.sender);
    }

    function setCurrentBoard(uint256 boardId) external {
        _swapBoard(boardId, true);
    }

    function rearrangeBoard(uint256 boardId, uint256[] memory slots) external {
        if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false);
        _rearrangePOAPs(slots);
    }

    function rearrangePOAPs(uint256[] memory slots) external {
        _rearrangePOAPs(slots);
    }

    function _rearrangePOAPs(uint256[] memory slots) internal {
        POAPLibrary.Board memory selectedBoard = boards[currentBoard[msg.sender]];
        require(slots.length == selectedBoard.slots.length, "wrong size");
        for (uint256 index = 0; index < slots.length; index++) {
            uint256 poapId = slots[index];
            for (uint256 innerIndex = 0; innerIndex < index; innerIndex++) {
                require(poapId == 0 || poapId != slots[innerIndex], "already used");
            }
            poapPositions[msg.sender][index] = _poapOwners[poapId][msg.sender] ? poapId : 0;
        }
    }

    function _swapBoard(uint256 boardId, bool shouldWipe) internal {
        require(currentBoard[msg.sender] != boardId, "same board");
        require(availableBoards[msg.sender][boardId], "locked board");

        currentBoard[msg.sender] = boardId;
        if (shouldWipe) {
            POAPLibrary.Board memory selectedBoard = boards[boardId];
            for (uint256 index = 0; index < selectedBoard.slots.length; index++) {
                poapPositions[msg.sender][index] = 0;
            }
        }
    }

    function getAllPOAPs(address wallet) public view returns (uint256[] memory) {
        uint256 poapsCount = poapsBalanceOf[wallet];
        uint256[] memory poaps = new uint256[](poapsCount);
        for (uint256 index = 0; index < poapsCount; index++) {
            poaps[index] = _poaps[wallet][index];
        }
        return poaps;
    }

    function getBoardPOAPs(address wallet) public view returns (uint256[] memory) {
        POAPLibrary.Board memory selectedBoard = boards[currentBoard[wallet]];
        uint256[] memory poaps = new uint256[](selectedBoard.slots.length);
        for (uint256 index = 0; index < poaps.length; index++) {
            poaps[index] = poapPositions[wallet][index];
        }
        return poaps;
    }

    function getBoards(address wallet) public view returns (POAPLibrary.Board[] memory) {
        uint256 walletCount;
        for (uint256 boardId = 1; boardId <= boardCount; boardId++) {
            if (availableBoards[wallet][boardId]) {
                walletCount++;
            }
        }
        POAPLibrary.Board[] memory walletBoards = new POAPLibrary.Board[](walletCount);
        uint256 walletBoardsIndex;
        for (uint256 boardId = 1; boardId <= boardCount; boardId++) {
            if (availableBoards[wallet][boardId]) {
                walletBoards[walletBoardsIndex++] = boards[boardId];
            }
        }
        return walletBoards;
    }

    function getCurrentBoard(address wallet) public view returns (POAPLibrary.Board memory) {
        return boards[currentBoard[wallet]];
    }

    function getWalletState(address wallet)
        external
        view
        returns (
            uint256[] memory,
            POAPLibrary.Board[] memory,
            POAPLibrary.Board memory
        )
    {
        return (getAllPOAPs(wallet), getBoards(wallet), getCurrentBoard(wallet));
    }

    function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory) {
        return boards[boardId];
    }

    function _claimPOAP(uint256 poapId, address to) internal existingPOAP(poapId) {
        if (_poapOwners[poapId][to]) return;
        _poapOwners[poapId][to] = true;
        _poaps[to][poapsBalanceOf[to]] = poapId;
        poapsBalanceOf[to]++;
    }

    function _claimBoard(uint256 boardId, address to) internal existingBoard(boardId) {
        require(_minted(to), "mint required");
        require(!availableBoards[to][boardId], "already claimed");
        availableBoards[to][boardId] = true;
    }

    // OWNER FUNCTIONS

    function registerBoard(
        uint64 width,
        uint64 height,
        POAPLibrary.Slot[] memory slots
    ) external onlyOwner {
        boardCount++;
        POAPLibrary.Board storage newBoard = boards[boardCount];
        newBoard.id = uint128(boardCount);
        newBoard.width = width;
        newBoard.height = height;
        for (uint256 index = 0; index < slots.length; index++) {
            newBoard.slots.push(slots[index]);
        }
    }

    function registerPOAP() external onlyOwner {
        poapCount++;
    }

    function setPOAPCount(uint256 count) external onlyOwner {
        poapCount = count;
    }

    function overrideBoard(
        uint128 id,
        uint64 width,
        uint64 height,
        POAPLibrary.Slot[] memory slots
    ) external onlyOwner existingBoard(id) {
        POAPLibrary.Board storage newBoard = boards[id];
        newBoard.id = id;
        newBoard.width = width;
        newBoard.height = height;
        uint256 oldSlotsSize = newBoard.slots.length; // 3
        for (uint256 index = 0; index < slots.length; index++) {
            if (oldSlotsSize <= index) {
                newBoard.slots.push(slots[index]);
            } else {
                newBoard.slots[index] = slots[index];
            }
        }
    }

    function setMerkleRootsByPOAPId(uint256 poapId, bytes32 merkleRoot) external onlyOwner {
        merkleRootsByPOAPId[poapId] = merkleRoot;
    }

    function setMerkleRootsByBoardId(uint256 boardId, bytes32 merkleRoot) external onlyOwner {
        merkleRootsByBoardId[boardId] = merkleRoot;
    }

    modifier existingBoard(uint256 boardId) {
        require(boardId <= boardCount, "unknown board");
        _;
    }

    modifier existingPOAP(uint256 poapId) {
        require(poapId <= poapCount, "unknown poap");
        _;
    }
}
/* solhint-enable quotes */

File 3 of 13 : POAPLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

library POAPLibrary {
    struct Slot {
        uint32 x;
        uint32 y;
        uint32 scale;
    }
    struct Board {
        uint128 id;
        uint64 width;
        uint64 height;
        Slot[] slots;
    }

    string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 4 of 13 : IDescriptor.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

interface IDescriptor {
    function badgeImages(uint256 badgeId) external view returns (string memory);

    function boardImages(uint256 boardId) external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    function getSvg(uint256 id) external view returns (string memory);

    function buildSvg(
        uint256 boardId,
        uint256[] memory poaps,
        string memory boardName,
        bool isPreview
    ) external view returns (string memory);
}

File 5 of 13 : IBadgesVerifier.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPLibrary.sol";

interface IBadgesVerifier {
    function claimableBadges(
        uint256[] memory genesisMice,
        uint256[] memory babyMice,
        address wallet
    ) external view returns (uint256[] memory);
}

File 6 of 13 : ICheeth.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface ICheeth is IERC20 {
    function burnFrom(address account, uint256 amount) external;
}

File 7 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 8 of 13 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        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));
            }
        }
        return computedHash;
    }
}

File 9 of 13 : ERC721UniqueBound.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.7;

import "./IERC721UniqueBound.sol";

contract ERC721UniqueBound is IERC721UniqueBound {
    uint256 private _currentIndex;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _ownerships;

    mapping(address => uint256) private _ownerToTokenId;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _minted(owner) ? 1 : 0;
    }

    function _minted(address owner) internal view returns (bool) {
        uint256 tokenId = _ownerToTokenId[owner];
        return _ownerships[tokenId] == owner;
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownerships[tokenId];
    }

    function tokenOf(address owner) public view override returns (uint256) {
        return _ownerToTokenId[owner];
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : "";
    }

    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex;
    }

    function _mint(address to) internal {
        if (to == address(0)) revert MintToZeroAddress();
        if (_minted(to)) revert MintToExistingOwnerAddress();

        _ownerships[_currentIndex] = to;
        _ownerToTokenId[to] = _currentIndex;
        emit Transfer(address(0), to, _currentIndex);
        _currentIndex++;
    }

    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 10 of 13 : IPOAPBoard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPLibrary.sol";

interface IPOAPBoard {
    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    function getAllPOAPs(address wallet) external view returns (uint256[] memory);

    function getBoardPOAPs(address wallet) external view returns (uint256[] memory);

    function currentBoard(address wallet) external view returns (uint256);

    function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory);
}

File 11 of 13 : 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 12 of 13 : IERC721UniqueBound.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

interface IERC721UniqueBound {
    error MintZeroQuantity();
    error MintToZeroAddress();
    error MintToExistingOwnerAddress();
    error BalanceQueryForZeroAddress();
    error URIQueryForNonexistentToken();

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function tokenOf(address owner) external view returns (uint256);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToExistingOwnerAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"availableBoards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"badgesVerifierAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boardNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boardPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boards","outputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"buyBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cheethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"},{"internalType":"uint256","name":"badgeIdToClaim","type":"uint256"}],"name":"claimVerifiedBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentBoard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAllPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"getBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoardPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoards","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getCurrentBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"getVerifiedBadges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletState","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByBoardId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByPOAPId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"overrideBoard","outputs":[],"stateMutability":"nonpayable","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":[],"name":"poapCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poapPositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poapsBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"badges","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"previewBoard","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangeBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"rearrangeBoardAndName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangePOAPs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"registerBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_badgesVerifierAddress","type":"address"}],"name":"setBadgesVerifierAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"setBoardName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256","name":"boardPrice","type":"uint256"}],"name":"setBoardPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cheethAddress","type":"address"}],"name":"setCheethAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"setCurrentBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptorAddress","type":"address"}],"name":"setDescriptorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByBoardId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poapId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByPOAPId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPOAPCount","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokenOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526013805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040518060400160405280601981526020017f416e6f6e796d69636520436f6c6c6563746f72204361726473000000000000008152506040518060400160405280601781526020017f416e6f6e796d696365436f6c6c6563746f7243617264730000000000000000008152508181620000ad620000a7620000e860201b60201c565b620000ec565b8151620000c29060029060208501906200013c565b508051620000d89060039060208401906200013c565b5060018055506200021f92505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014a90620001e2565b90600052602060002090601f0160209004810192826200016e5760008555620001b9565b82601f106200018957805160ff1916838001178555620001b9565b82800160010185558215620001b9579182015b82811115620001b95782518255916020019190600101906200019c565b50620001c7929150620001cb565b5090565b5b80821115620001c75760008155600101620001cc565b600181811c90821680620001f757607f821691505b602082108114156200021957634e487b7160e01b600052602260045260246000fd5b50919050565b613738806200022f6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033

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.