ETH Price: $1,787.54 (+9.81%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...220703172025-03-18 0:54:5936 days ago1742259299IN
0x0CE49000...3Eb5bdE18
0 ETH0.000044720.9597501
Set Approval For...218110192025-02-09 19:22:4772 days ago1739128967IN
0x0CE49000...3Eb5bdE18
0 ETH0.000067321.44229627
Set Approval For...217289602025-01-29 8:21:4783 days ago1738138907IN
0x0CE49000...3Eb5bdE18
0 ETH0.000122992.63954534
Safe Transfer Fr...217208662025-01-28 5:14:2385 days ago1738041263IN
0x0CE49000...3Eb5bdE18
0 ETH0.00022984.38257671
Safe Transfer Fr...217208642025-01-28 5:13:5985 days ago1738041239IN
0x0CE49000...3Eb5bdE18
0 ETH0.000225623.94192827
Safe Transfer Fr...217208622025-01-28 5:13:3585 days ago1738041215IN
0x0CE49000...3Eb5bdE18
0 ETH0.000245924.29668798
Safe Transfer Fr...217208612025-01-28 5:13:2385 days ago1738041203IN
0x0CE49000...3Eb5bdE18
0 ETH0.000240614.20481193
Safe Transfer Fr...217208592025-01-28 5:12:5985 days ago1738041179IN
0x0CE49000...3Eb5bdE18
0 ETH0.000206563.60893367
Approve215741912025-01-07 17:49:35105 days ago1736272175IN
0x0CE49000...3Eb5bdE18
0 ETH0.000412216.33789195
Set Approval For...215510622025-01-04 12:18:11108 days ago1735993091IN
0x0CE49000...3Eb5bdE18
0 ETH0.000395648.49085373
Set Approval For...215237622024-12-31 16:52:23112 days ago1735663943IN
0x0CE49000...3Eb5bdE18
0 ETH0.0006439913.81704517
Set Approval For...214060792024-12-15 6:17:59129 days ago1734243479IN
0x0CE49000...3Eb5bdE18
0 ETH0.000293986.29771039
Set Approval For...214060792024-12-15 6:17:59129 days ago1734243479IN
0x0CE49000...3Eb5bdE18
0 ETH0.000293456.29771039
Set Approval For...211301382024-11-06 17:35:47167 days ago1730914547IN
0x0CE49000...3Eb5bdE18
0 ETH0.0008006117.18174249
Set Approval For...211117032024-11-04 3:50:23170 days ago1730692223IN
0x0CE49000...3Eb5bdE18
0 ETH0.000086613.50879854
Set Approval For...206623452024-09-02 10:39:23232 days ago1725273563IN
0x0CE49000...3Eb5bdE18
0 ETH0.000152336.15029608
Set Approval For...206272622024-08-28 13:03:23237 days ago1724850203IN
0x0CE49000...3Eb5bdE18
0 ETH0.000138482.96659365
Set Approval For...197126362024-04-22 18:10:23365 days ago1713809423IN
0x0CE49000...3Eb5bdE18
0 ETH0.0006120413.11118892
Set Approval For...197095962024-04-22 7:58:35366 days ago1713772715IN
0x0CE49000...3Eb5bdE18
0 ETH0.000200828.10792589
Set Approval For...196768472024-04-17 18:00:59370 days ago1713376859IN
0x0CE49000...3Eb5bdE18
0 ETH0.0010083721.64038441
Set Approval For...196507412024-04-14 2:15:59374 days ago1713060959IN
0x0CE49000...3Eb5bdE18
0 ETH0.0006035612.95282457
Set Approval For...196157792024-04-09 4:42:47379 days ago1712637767IN
0x0CE49000...3Eb5bdE18
0 ETH0.0004976820.09304851
Set Approval For...194002512024-03-09 21:32:59409 days ago1710019979IN
0x0CE49000...3Eb5bdE18
0 ETH0.002332450.05484194
Set Approval For...193247802024-02-28 8:15:47419 days ago1709108147IN
0x0CE49000...3Eb5bdE18
0 ETH0.0022613948.53090223
Set Approval For...193130522024-02-26 16:53:23421 days ago1708966403IN
0x0CE49000...3Eb5bdE18
0 ETH0.00297563.7468495
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer192496322024-02-17 19:24:23430 days ago1708197863
0x0CE49000...3Eb5bdE18
89.65 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Tekomon

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 3 : Tekomon.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/*

1st on-chain Pocket Monster Game. @TekoMonERC 
1st scaled ERC20721 collection & game.
1st mover on the ERC20721t standard, learn more at TekoMon.io/about

3,000 total supply
Stealth Launch

Welcome to TekoMon!
$TEKOMON + $wTEKOMON
TekoMon.io 

Your legendary journey awaits.

*/

import {ERC20721T} from "./ERC20721T.sol";

error Paused();
error Restricted();
error IncorrectAmountOfEther();
error TooFewTokensRemaining();
error WalletMaximumReached();
error SaleInactive();

contract Tekomon is ERC20721T {
    uint256 public price = 0.05 ether;
    uint256 public walletCap = 100;
    bool public saleActive = true;
    bool public paused;
    string baseURI =
        "https://nftstorage.link/ipfs/bafkreictkp324gwa2rjht4afojdtdrtrq2fufyuqciigbi7n2xrj5ofiqu/?"; // pre-reveal
    mapping(address => uint8) public admin;

    constructor() ERC20721T("Tekomon", "TEKOMON") {
        admin[msg.sender] = 1;
    }

    // RESTRICTED //

    modifier restricted() {
        if (admin[msg.sender] != 1) revert Restricted();
        _;
    }

    modifier whenNotPaused() {
        if (paused) revert Paused();
        _;
    }

    function setPrice(uint256 _price) external restricted {
        price = _price;
    }

    function setWalletCap(uint256 _walletCap) external restricted {
        walletCap = _walletCap;
    }

    function setSaleActive(bool active) external restricted {
        saleActive = active;
    }

    function setPaused(bool _paused) external restricted {
        paused = _paused;
    }

    function setBaseURI(string memory URI) external restricted {
        baseURI = URI;
    }

    function setAdmin(address account, bool privileged) external restricted {
        admin[account] = privileged ? 1 : 0;
    }

    function setWrapper(address _contract) external restricted {
        _setWrapper(_contract);
    }

    function reserve(uint256 amount, address recipient) external restricted {
        _safeMint(recipient, amount);
    }

    function withdraw() external restricted {
        payable(msg.sender).transfer(address(this).balance);
    }

    // EXTERNAL //

    function mint(uint256 quantity) external payable whenNotPaused {
        if (!saleActive) revert SaleInactive();
        if (quantity + _numberMinted(msg.sender) > walletCap)
            revert WalletMaximumReached();
        if (_totalMinted() + quantity > _maxSupply())
            revert TooFewTokensRemaining();
        if (msg.value != price * quantity) revert IncorrectAmountOfEther();
        _safeMint(msg.sender, quantity);
    }

    function burn(uint256 tokenId) external whenNotPaused {
        _burn(tokenId, true);
    }

    function exists(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }

    // INTERNAL //

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function _maxSupply() internal pure override returns (uint256) {
        return 3000;
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal override whenNotPaused {
        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }
}

File 2 of 3 : ERC20721T.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./IERC20721T.sol";

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC20721T is IERC20721T {
    struct TokenApprovalRef {
        address value;
    }

    struct UserApprovalRef {
        mapping(address => uint256) allowance;
        mapping(address => bool) approved;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    uint256 private constant _BITPOS_AUX = 192;
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    uint256 private constant _BITMASK_BURNED = 1 << 224;
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    uint256 private constant _BITPOS_EXTRA_DATA = 232;
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    bytes32 private constant _ERC721_TRANSFER_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    bytes32 private constant _ERC20_TRANSFER_SIGNATURE =
        keccak256(bytes("Transfer(address,address,uint256)"));
    bytes32 private constant _ERC20_APPROVAL_SIGNATURE =
        keccak256(bytes("Approval(address,address,uint256)"));

    address private _wrapper;
    uint256 private _currentIndex;
    uint256 private _burnCounter;
    uint256 public decimals;
    string private _name;
    string private _symbol;
    mapping(uint256 => uint256) private _packedOwnerships;
    mapping(address => uint256) private _packedAddressData;
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    mapping(address => UserApprovalRef) private _userApprovals;

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

    function _maxSupply() internal view virtual returns (uint256) {
        return 1000;
    }

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

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function wrapper() public view virtual returns (address) {
        return _wrapper;
    }

    function totalSupply() public view virtual returns (uint256) {
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector);
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256) {
        return _userApprovals[owner].allowance[spender];
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return
            (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) &
            _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed =
            (packed & _BITMASK_AUX_COMPLEMENT) |
            (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    function _setWrapper(address w) internal virtual {
        _wrapper = w;
    }

    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual 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 name() public view virtual returns (string memory) {
        return _name;
    }

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

    function tokenURI(
        uint256 tokenId
    ) public view virtual returns (string memory) {
        if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector);

        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 ownerOf(uint256 tokenId) public view virtual returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(
        uint256 tokenId
    ) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(
        uint256 index
    ) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _ownershipIsInitialized(
        uint256 index
    ) internal view virtual returns (bool) {
        return _packedOwnerships[index] != 0;
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(
        uint256 tokenId
    ) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    if (packed & _BITMASK_BURNED == 0) {
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        _revert(OwnerQueryForNonexistentToken.selector);
    }

    function _unpackedOwnership(
        uint256 packed
    ) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(
        address owner,
        uint256 flags
    ) private view returns (uint256 result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(
                owner,
                or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)
            )
        }
    }

    function _nextInitializedFlag(
        uint256 quantity
    ) private pure returns (uint256 result) {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(
        address _spender,
        uint256 quantityOrTokenId
    ) external returns (bool) {
        uint256 max = _maxSupply() + 1;
        if (quantityOrTokenId > max && quantityOrTokenId <= max * 2) {
            _approveERC721(_spender, quantityOrTokenId);
        } else {
            _approveERC20(msg.sender, _spender, quantityOrTokenId);
        }
        return true;
    }

    function _approveERC721(address to, uint256 tokenId) internal virtual {
        address owner = ownerOf(tokenId);

        if (_msgSender() != owner)
            if (!isApprovedForAll(owner, _msgSender())) {
                _revert(ApprovalCallerNotOwnerNorApproved.selector);
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function _approveERC20(
        address _owner,
        address _spender,
        uint256 _tokens
    ) internal {
        _userApprovals[_owner].allowance[_spender] = _tokens;
        emit ERC20Approval(
            _ERC20_APPROVAL_SIGNATURE,
            _owner,
            _spender,
            _tokens
        );
    }

    function getApproved(
        uint256 tokenId
    ) public view virtual returns (address) {
        if (!_exists(tokenId))
            _revert(ApprovalQueryForNonexistentToken.selector);

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        _userApprovals[_msgSender()].approved[operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(
        address owner,
        address operator
    ) public view virtual returns (bool) {
        return _userApprovals[owner].approved[operator] || _wrapper == operator;
    }

    function tokensOfOwner(
        address owner
    ) public view returns (uint256[] memory) {
        uint256 start = _startTokenId();
        uint256 stop = _nextTokenId();
        uint256[] memory tokenIds;
        if (start != stop) tokenIds = _tokensOfOwnerIn(owner, start, stop);
        return tokenIds;
    }

    function _tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) private view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) _revert(InvalidQueryRange.selector);
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            uint256 stopLimit = _nextTokenId();
            if (stop >= stopLimit) {
                stop = stopLimit;
            }
            uint256[] memory tokenIds;
            uint256 tokenIdsMaxLength = balanceOf(owner);
            bool startLtStop = start < stop;
            assembly {
                tokenIdsMaxLength := mul(tokenIdsMaxLength, startLtStop)
            }
            if (tokenIdsMaxLength != 0) {
                if (stop - start <= tokenIdsMaxLength) {
                    tokenIdsMaxLength = stop - start;
                }
                assembly {
                    tokenIds := mload(0x40)
                    mstore(
                        0x40,
                        add(tokenIds, shl(5, add(tokenIdsMaxLength, 1)))
                    )
                }

                TokenOwnership memory ownership = _explicitOwnershipOf(start);
                address currOwnershipAddr;

                if (!ownership.burned) {
                    currOwnershipAddr = ownership.addr;
                }
                uint256 tokenIdsIdx;
                do {
                    ownership = _ownershipAt(start);
                    assembly {
                        switch mload(add(ownership, 0x40))
                        case 0 {
                            if mload(ownership) {
                                currOwnershipAddr := mload(ownership)
                            }
                            if iszero(shl(96, xor(currOwnershipAddr, owner))) {
                                tokenIdsIdx := add(tokenIdsIdx, 1)
                                mstore(
                                    add(tokenIds, shl(5, tokenIdsIdx)),
                                    start
                                )
                            }
                        }
                        default {
                            currOwnershipAddr := 0
                        }
                        start := add(start, 1)
                    }
                } while (!(start == stop || tokenIdsIdx == tokenIdsMaxLength));
                assembly {
                    mstore(tokenIds, tokenIdsIdx)
                }
            }
            return tokenIds;
        }
    }

    function _explicitOwnershipOf(
        uint256 tokenId
    ) internal view virtual returns (TokenOwnership memory ownership) {
        unchecked {
            if (tokenId >= _startTokenId()) {
                if (tokenId < _nextTokenId()) {
                    // If the `tokenId` is within bounds,
                    // scan backwards for the initialized ownership slot.
                    while (!_ownershipIsInitialized(tokenId)) --tokenId;
                    return _ownershipAt(tokenId);
                }
            }
        }
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) internal view virtual returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(
        uint256 tokenId
    )
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transfer(
        address to,
        uint256 quantity
    ) public payable virtual returns (bool) {
        _transfer(msg.sender, to, quantity);
        return true;
    }

    function _transfer(address from, address to, uint256 quantity) internal {
        uint256[] memory tokens = tokensOfOwner(from);

        if (tokens.length < quantity) _revert(InsufficientBalance.selector);

        batchTransfer(
            from,
            to,
            tokens.length > quantity
                ? _getLimitedArray(tokens, quantity)
                : tokens
        );
    }

    function transferFrom(
        address from,
        address to,
        uint256 quantityOrTokenId
    ) public payable virtual returns (bool) {
        uint256 max = _maxSupply();
        if (quantityOrTokenId <= max) {
            _transfer(from, to, quantityOrTokenId);
        } else if (quantityOrTokenId <= max * 2) {
            _transferFrom(from, to, quantityOrTokenId);
            emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1);
        } else {
            return false;
        }

        return true;
    }

    function _transferFrom(address from, address to, uint256 tokenId) internal {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from)
            _revert(TransferFromIncorrectOwner.selector);

        (
            uint256 approvedAddressSlot,
            address approvedAddress
        ) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender()))
            if (!isApprovedForAll(from, _msgSender()))
                if (_userApprovals[from].allowance[msg.sender] < 1)
                    _revert(TransferCallerNotOwnerNorApproved.selector);

        if (to == address(0)) _revert(TransferToZeroAddress.selector);

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {
            --_packedAddressData[from];
            ++_packedAddressData[to];

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED |
                    _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        if (_userApprovals[from].allowance[msg.sender] > 0) {
            _userApprovals[from].allowance[msg.sender]--;
        }

        if (from == _wrapper) {
            emit Locked(tokenId);
            emit MetadataUpdate(tokenId);
        } else if (to == _wrapper) {
            emit Unlocked(tokenId);
            emit MetadataUpdate(tokenId);
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function batchTransfer(
        address from,
        address to,
        uint256[] memory tokenIds
    ) public {
        emit ERC20Transfer(
            _ERC20_TRANSFER_SIGNATURE,
            from,
            to,
            tokenIds.length
        );
        for (uint256 i; i < tokenIds.length; i++) {
            _transferFrom(from, to, tokenIds[i]);
        }
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual {
        emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, to, 1);
        _transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                _revert(TransferToNonERC721ReceiverImplementer.selector);
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) _revert(MintZeroQuantity.selector);

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {
                toMasked := and(to, _BITMASK_ADDRESS)
                log4(
                    0,
                    0,
                    _ERC721_TRANSFER_SIGNATURE,
                    0,
                    toMasked,
                    startTokenId
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    log4(0, 0, _ERC721_TRANSFER_SIGNATURE, 0, toMasked, tokenId)
                }
            }

            emit ERC20Transfer(
                _ERC20_TRANSFER_SIGNATURE,
                address(0),
                to,
                quantity
            );

            if (toMasked == 0) _revert(MintToZeroAddress.selector);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) _revert(MintToZeroAddress.selector);
        if (quantity == 0) _revert(MintZeroQuantity.selector);
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT)
            _revert(MintERC2309QuantityExceedsLimit.selector);

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        unchecked {
            _packedAddressData[to] +=
                quantity *
                ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) |
                    _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(
                startTokenId,
                startTokenId + quantity - 1,
                address(0),
                to
            );

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            index++,
                            _data
                        )
                    ) {
                        _revert(
                            TransferToNonERC721ReceiverImplementer.selector
                        );
                    }
                } while (index < end);
                if (_currentIndex != end) revert();
            }
        }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, "");
    }

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (
            uint256 approvedAddressSlot,
            address approvedAddress
        ) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSender()))
                if (!isApprovedForAll(from, _msgSender()))
                    _revert(TransferCallerNotOwnerNorApproved.selector);
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) |
                    _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                if (_packedOwnerships[nextTokenId] == 0) {
                    if (nextTokenId != _currentIndex) {
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit ERC20Transfer(_ERC20_TRANSFER_SIGNATURE, from, address(0), 1);
        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        unchecked {
            _burnCounter++;
        }
    }

    function _getLimitedArray(
        uint256[] memory originalArray,
        uint256 length
    ) internal pure returns (uint256[] memory) {
        if (length > originalArray.length)
            _revert(InvalidArrayOperation.selector);
        uint256[] memory limitedArray = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            limitedArray[i] = originalArray[i];
        }
        return limitedArray;
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector);
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed =
            (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) |
            (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(
        uint256 value
    ) internal pure virtual returns (string memory str) {
        assembly {
            let m := add(mload(0x40), 0xa0)
            mstore(0x40, m)
            str := sub(m, 0x20)
            mstore(str, 0)

            let end := str

            for {
                let temp := value
            } 1 {

            } {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) {
                    break
                }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }

    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

contract ERC20721TWrapper is IERC20721TWrapper {
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    IERC20721T public immutable base;

    constructor(
        string memory name_,
        string memory symbol_,
        address _baseContract
    ) {
        _name = name_;
        _symbol = symbol_;
        base = IERC20721T(_baseContract);
    }

    function wrappedTokenPool() public view returns (uint256[] memory) {
        return base.tokensOfOwner(address(this));
    }

    function wrap(uint256 quantity) public payable virtual {
        uint256[] memory tokens = base.tokensOfOwner(msg.sender);
        if (tokens.length < quantity) _revert(InsufficientNFTBalance.selector);
        base.batchTransfer(
            msg.sender,
            address(this),
            _getLimitedArray(tokens, quantity)
        );
        _mint(msg.sender, quantity * 10 ** decimals());
        emit Wrap(msg.sender, quantity);
    }

    function wrap(uint256[] calldata tokenIds) public payable virtual {
        base.batchTransfer(msg.sender, address(this), tokenIds);
        _mint(msg.sender, tokenIds.length * 10 ** decimals());
        emit Wrap(msg.sender, tokenIds.length);
    }

    function unwrap(uint256 quantity) public payable virtual {
        base.transfer(msg.sender, quantity);
        _burn(msg.sender, quantity * 10 ** decimals());
        emit Unwrap(msg.sender, quantity);
    }

    function unwrap(uint256[] calldata tokenIds) public payable virtual {
        base.batchTransfer(address(this), msg.sender, tokenIds);
        _burn(msg.sender, tokenIds.length * 10 ** decimals());
        emit Unwrap(msg.sender, tokenIds.length);
    }

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

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

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 value
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 value
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(
                    spender,
                    currentAllowance,
                    value
                );
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }

    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _getLimitedArray(
        uint256[] memory originalArray,
        uint256 length
    ) internal pure returns (uint256[] memory) {
        if (length > originalArray.length)
            _revert(InvalidArrayOperation.selector);
        uint256[] memory limitedArray = new uint256[](length);
        for (uint256 i = 0; i < length; i++) {
            limitedArray[i] = originalArray[i];
        }
        return limitedArray;
    }

    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

File 3 of 3 : IERC20721T.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IERC20721T {
    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();
    error InvalidQueryRange();
    error InsufficientBalance();
    error InvalidArrayOperation();

    event ERC20Transfer(
        bytes32 indexed topic0,
        address indexed from,
        address indexed to,
        uint256 tokens
    ) anonymous;
    event ERC20Approval(
        bytes32 indexed topic0,
        address indexed owner,
        address indexed spender,
        uint256 tokens
    ) anonymous;
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed from,
        address indexed to
    );
    event Locked(uint256 tokenId);
    event Unlocked(uint256 tokenId);
    event MetadataUpdate(uint256 _tokenId);

    function decimals() 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);

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

    function approve(
        address _spender,
        uint256 quantityOrTokenId
    ) external returns (bool);

    function getApproved(uint256 tokenId) external view returns (address);

    function setApprovalForAll(address operator, bool approved) external;

    function isApprovedForAll(
        address owner,
        address operator
    ) external view returns (bool);

    function tokensOfOwner(
        address owner
    ) external view returns (uint256[] memory);

    function transfer(
        address to,
        uint256 quantity
    ) external payable returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 quantityOrTokenId
    ) external payable returns (bool);

    function batchTransfer(
        address from,
        address to,
        uint256[] memory tokenIds
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external payable;

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

interface IERC20721TWrapper {
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
    error InvalidArrayOperation();
    error InsufficientNFTBalance();

    event Wrap(address account, uint256 quantity);
    event Unwrap(address account, uint256 quantity);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function base() external view returns (IERC20721T);

    function wrappedTokenPool() external view returns (uint256[] memory);

    function wrap(uint256 quantity) external payable;

    function wrap(uint256[] calldata tokenIds) external payable;

    function unwrap(uint256 quantity) external payable;

    function unwrap(uint256[] calldata tokenIds) external payable;

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

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

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"IncorrectAmountOfEther","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidArrayOperation","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"Restricted","type":"error"},{"inputs":[],"name":"SaleInactive","type":"error"},{"inputs":[],"name":"TooFewTokensRemaining","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WalletMaximumReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admin","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"privileged","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletCap","type":"uint256"}],"name":"setWalletCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setWrapper","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":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantityOrTokenId","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"walletCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405266b1a2bc2ec50000600a556064600b556001600c60006101000a81548160ff0219169083151502179055506040518060800160405280605a815260200162004510605a9139600d908162000059919062000418565b503480156200006757600080fd5b506040518060400160405280600781526020017f54656b6f6d6f6e000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f54454b4f4d4f4e000000000000000000000000000000000000000000000000008152508160049081620000e5919062000418565b508060059081620000f7919062000418565b50620001086200016f60201b60201c565b60018190555050506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555062000569565b60006001620001836200019460201b60201c565b6200018f91906200052e565b905090565b6000610bb8905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022057607f821691505b602082108103620002365762000235620001d8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000261565b620002ac868362000261565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f9620002f3620002ed84620002c4565b620002ce565b620002c4565b9050919050565b6000819050919050565b6200031583620002d8565b6200032d620003248262000300565b8484546200026e565b825550505050565b600090565b6200034462000335565b620003518184846200030a565b505050565b5b8181101562000379576200036d6000826200033a565b60018101905062000357565b5050565b601f821115620003c85762000392816200023c565b6200039d8462000251565b81016020851015620003ad578190505b620003c5620003bc8562000251565b83018262000356565b50505b505050565b600082821c905092915050565b6000620003ed60001984600802620003cd565b1980831691505092915050565b6000620004088383620003da565b9150826002028217905092915050565b62000423826200019e565b67ffffffffffffffff8111156200043f576200043e620001a9565b5b6200044b825462000207565b620004588282856200037d565b600060209050601f8311600181146200049057600084156200047b578287015190505b620004878582620003fa565b865550620004f7565b601f198416620004a0866200023c565b60005b82811015620004ca57848901518255600182019150602085019450602081019050620004a3565b86831015620004ea5784890151620004e6601f891682620003da565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200053b82620002c4565b91506200054883620002c4565b9250828201905080821115620005635762000562620004ff565b5b92915050565b613f9780620005796000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c6343000818003368747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261666b72656963746b7033323467776132726a68743461666f6a6474647274727132667566797571636969676269376e3278726a356f666971752f3f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636352211e11610123578063a035b1fe116100ab578063b88d4fde1161006f578063b88d4fde146107d3578063c2167d93146107ef578063c87b56dd14610818578063dd62ed3e14610855578063e985e9c5146108925761021a565b8063a035b1fe14610708578063a0712d6814610733578063a22cb4651461074f578063a9059cbb14610778578063ac210cc7146107a85761021a565b806370a08231116100f257806370a0823114610611578063841718a61461064e5780638462151c1461067757806391b7f5ed146106b457806395d89b41146106dd5761021a565b80636352211e1461054357806363a846f81461058057806365a64668146105bd57806368428a1b146105e65761021a565b80633593cebc116101a65780634b0bddd2116101755780634b0bddd21461045e5780634f558e791461048757806355f804b3146104c457806358950c22146104ed5780635c975abb146105185761021a565b80633593cebc146103d95780633ccfd60b1461040257806342842e0e1461041957806342966c68146104355761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806316c38b3c1461032a57806318160ddd1461035357806323b872dd1461037e578063313ce567146103ae5761021a565b806301ffc9a71461021f57806303339bcb1461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906130b8565b6108cf565b6040516102539190613100565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e91906131af565b610961565b005b34801561029157600080fd5b5061029a6109f8565b6040516102a7919061327f565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d291906132a1565b610a8a565b6040516102e491906132dd565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f91906132f8565b610ae8565b6040516103219190613100565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613364565b610b47565b005b34801561035f57600080fd5b50610368610bed565b60405161037591906133a0565b60405180910390f35b610398600480360381019061039391906133bb565b610c04565b6040516103a59190613100565b60405180910390f35b3480156103ba57600080fd5b506103c3610cc8565b6040516103d091906133a0565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613556565b610cce565b005b34801561040e57600080fd5b50610417610d77565b005b610433600480360381019061042e91906133bb565b610e49565b005b34801561044157600080fd5b5061045c600480360381019061045791906132a1565b610e69565b005b34801561046a57600080fd5b50610485600480360381019061048091906135c5565b610ebe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906132a1565b610fb1565b6040516104bb9190613100565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e691906136ba565b610fc3565b005b3480156104f957600080fd5b5061050261105f565b60405161050f91906133a0565b60405180910390f35b34801561052457600080fd5b5061052d611065565b60405161053a9190613100565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906132a1565b611078565b60405161057791906132dd565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613703565b61108a565b6040516105b4919061374c565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906132a1565b6110aa565b005b3480156105f257600080fd5b506105fb61113d565b6040516106089190613100565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613703565b611150565b60405161064591906133a0565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613364565b6111e7565b005b34801561068357600080fd5b5061069e60048036038101906106999190613703565b61128d565b6040516106ab9190613825565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d691906132a1565b6112c9565b005b3480156106e957600080fd5b506106f261135c565b6040516106ff919061327f565b60405180910390f35b34801561071457600080fd5b5061071d6113ee565b60405161072a91906133a0565b60405180910390f35b61074d600480360381019061074891906132a1565b6113f4565b005b34801561075b57600080fd5b50610776600480360381019061077191906135c5565b611576565b005b610792600480360381019061078d91906132f8565b611684565b60405161079f9190613100565b60405180910390f35b3480156107b457600080fd5b506107bd61169b565b6040516107ca91906132dd565b60405180910390f35b6107ed60048036038101906107e891906138e8565b6116c4565b005b3480156107fb57600080fd5b5061081660048036038101906108119190613703565b61177b565b005b34801561082457600080fd5b5061083f600480360381019061083a91906132a1565b611810565b60405161084c919061327f565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061396b565b61188d565b60405161088991906133a0565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061396b565b611917565b6040516108c69190613100565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146109ea576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f48183611a04565b5050565b606060048054610a07906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610a33906139da565b8015610a805780601f10610a5557610100808354040283529160200191610a80565b820191906000526020600020905b815481529060010190602001808311610a6357829003601f168201915b5050505050905090565b6000610a9582611a22565b610aaa57610aa963cf4700e460e01b611a81565b5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806001610af5611a8b565b610aff9190613a3a565b90508083118015610b1c5750600281610b189190613a6e565b8311155b15610b3057610b2b8484611a95565b610b3c565b610b3b338585611bb8565b5b600191505092915050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610bd0576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610bf7611ca5565b6002546001540303905090565b600080610c0f611a8b565b9050808311610c2857610c23858585611cc0565b610cbb565b600281610c359190613a6e565b8311610cb057610c46858585611d10565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001206001604051610ca39190613af5565b60405180910390a3610cba565b6000915050610cc1565b5b60019150505b9392505050565b60035481565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f4160219139805190602001208351604051610d2b91906133a0565b60405180910390a360005b8151811015610d7157610d648484848481518110610d5757610d56613b10565b5b6020026020010151611d10565b8080600101915050610d36565b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610e00576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e46573d6000803e3d6000fd5b50565b610e64838383604051806020016040528060008152506116c4565b505050565b600c60019054906101000a900460ff1615610eb0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebb8160016122ff565b50565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614610f47576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610f53576000610f56565b60015b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6000610fbc82611a22565b9050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff161461104c576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d908161105b9190613ce1565b5050565b600b5481565b600c60019054906101000a900460ff1681565b600061108382612596565b9050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611133576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b8190555050565b600c60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119657611195638f4eb60460e01b611a81565b5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611270576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606000611299611ca5565b905060006112a5612642565b905060608183146112be576112bb85848461264c565b90505b809350505050919050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611352576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a8190555050565b60606005805461136b906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054611397906139da565b80156113e45780601f106113b9576101008083540402835291602001916113e4565b820191906000526020600020905b8154815290600101906020018083116113c757829003601f168201915b5050505050905090565b600a5481565b600c60019054906101000a900460ff161561143b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c60009054906101000a900460ff16611481576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5461148d33612772565b826114989190613a3a565b11156114d0576040517f1a710ac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d8611a8b565b816114e16127c9565b6114eb9190613a3a565b1115611523576040517f53ae7e1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a546115319190613a6e565b3414611569576040517feb4033ac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115733382611a04565b50565b80600960006115836127dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116336127dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116789190613100565b60405180910390a35050565b6000611691338484611cc0565b6001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012060016040516117219190613af5565b60405180910390a3611734848484611d10565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117755761175f848484846127e4565b6117745761177363d1a57ed660e01b611a81565b5b5b50505050565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614611804576040517fccc0891300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180d81612923565b50565b606061181b82611a22565b6118305761182f63a14c4b5060e01b611a81565b5b600061183a612966565b9050600081510361185a5760405180602001604052806000815250611885565b80611864846129f8565b604051602001611875929190613def565b6040516020818303038152906040525b915050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119fc57508173ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b611a1e828260405180602001604052806000815250612a48565b5050565b600081611a2d611ca5565b11158015611a3c575060015482105b8015611a7a575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b8060005260046000fd5b6000610bb8905090565b6000611aa082611078565b90508073ffffffffffffffffffffffffffffffffffffffff16611ac16127dc565b73ffffffffffffffffffffffffffffffffffffffff1614611b0357611aed81611ae86127dc565b611917565b611b0257611b0163cfb3b94260e01b611a81565b5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f20602191398051906020012083604051611c9891906133a0565b60405180910390a3505050565b60006001611cb1611a8b565b611cbb9190613a3a565b905090565b6000611ccb8461128d565b90508181511015611ce757611ce663f4d678b860e01b611a81565b5b611d0a848484845111611cfa5783611d05565b611d048486612ac5565b5b610cce565b50505050565b6000611d1b82612596565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d6157611d6063a114810060e01b611a81565b5b600080611d6d84612b8b565b91509150611d838187611d7e6127dc565b612bb2565b611e3757611d9886611d936127dc565b611917565b611e36576001600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e3557611e346359c896be60e01b611a81565b5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e7c57611e7b63ea553b3460e01b611a81565b5b611e898686866001612bf6565b8015611e9457600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611f6285611f3e888887612c4f565b7c020000000000000000000000000000000000000000000000000000000017612c77565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611fe85760006001850190506000600660008381526020019081526020016000205403611fe6576001548114611fe5578360066000838152602001908152602001600020819055505b5b505b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561210657600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061210090613e13565b91905055505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036121cc577f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16118460405161218891906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7846040516121bf91906133a0565b60405180910390a161228f565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361228e577ff27b6ce5b2f5e68ddb2fd95a8a909d4ecf1daaac270935fff052feacb24f18428460405161224e91906133a0565b60405180910390a17ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78460405161228591906133a0565b60405180910390a15b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f78686866001612ca2565b505050505050565b600061230a83612596565b9050600081905060008061231d86612b8b565b9150915084156123655761233981846123346127dc565b612bb2565b6123645761234e836123496127dc565b611917565b612363576123626359c896be60e01b611a81565b5b5b5b612373836000886001612bf6565b801561237e57600082555b600160806001901b03600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612426836123e385600088612c4f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612c77565b600660008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036124ac57600060018701905060006006600083815260200190815260200160002054036124aa5760015481146124a9578460066000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f416021913980519060200120600160405161250a9190613af5565b60405180910390a385600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257c836000886001612ca2565b600260008154809291906001019190505550505050505050565b600080829050806125a5611ca5565b1161262b5760015481101561262a5760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612628575b6000810361261e5760066000836001900393508381526020019081526020016000205490506125f4565b809250505061263d565b505b5b61263b63df2d9b4260e01b611a81565b505b919050565b6000600154905090565b6060818310612666576126656332c1995a60e01b611a81565b5b61266e611ca5565b8310156126805761267d611ca5565b92505b600061268a612642565b9050808310612697578092505b606060006126a487611150565b9050600085871090508082029150600082146127645781878703116126c95786860391505b60405192506001820160051b830160405260006126e588612ca8565b9050600081604001516126fa57816000015190505b60005b6127068a612cfe565b925060408301516000811461271e5760009250612744565b83511561272a57835192505b8b831860601b612743576001820191508a8260051b8801525b5b5060018a019950888a148061275857508481145b156126fd578086525050505b829450505050509392505050565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006127d3611ca5565b60015403905090565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280a6127dc565b8786866040518563ffffffff1660e01b815260040161282c9493929190613e91565b6020604051808303816000875af192505050801561286857506040513d601f19601f820116820180604052508101906128659190613ef2565b60015b6128ca573d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5060008151036128bc576128b763d1a57ed660e01b611a81565b6128c4565b805181602001fd5b5061291a565b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b5b949350505050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600d8054612975906139da565b80601f01602080910402602001604051908101604052809291908181526020018280546129a1906139da565b80156129ee5780601f106129c3576101008083540402835291602001916129ee565b820191906000526020600020905b8154815290600101906020018083116129d157829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612a3357600184039350600a81066030018453600a8104905080612a11575b50828103602084039350808452505050919050565b612a528383612d29565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a9360008683806001019450866127e4565b612aa857612aa763d1a57ed660e01b611a81565b5b818110612a80578160015414612abd57600080fd5b50505b505050565b60608251821115612ae157612ae063b3a6a31060e01b611a81565b5b60008267ffffffffffffffff811115612afd57612afc613413565b5b604051908082528060200260200182016040528015612b2b5781602001602082028036833780820191505090505b50905060005b83811015612b8057848181518110612b4c57612b4b613b10565b5b6020026020010151828281518110612b6757612b66613b10565b5b6020026020010181815250508080600101915050612b31565b508091505092915050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60019054906101000a900460ff1615612c3d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4984848484612f08565b50505050565b60008060e883901c905060e8612c66868684612f0e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612cb0612ffd565b612cb8611ca5565b8210612cf857612cc6612642565b821015612cf7575b612cd782612f17565b612ce75781600190039150612cce565b612cf082612cfe565b9050612cf9565b5b5b919050565b612d06612ffd565b612d226006600084815260200190815260200160002054612f37565b9050919050565b6000600154905060008203612d4957612d4863b562e8dd60e01b611a81565b5b612d566000848385612bf6565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612dcd83612dbe6000866000612c4f565b612dc785612fed565b17612c77565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612e6e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612e33565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060218152602001613f41602191398051906020012086604051612ecc91906133a0565b60405180910390a360008203612eed57612eec632e07630060e01b611a81565b5b806001819055505050612f036000848385612ca2565b505050565b50505050565b60009392505050565b600080600660008481526020019081526020016000205414159050919050565b612f3f612ffd565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61309581613060565b81146130a057600080fd5b50565b6000813590506130b28161308c565b92915050565b6000602082840312156130ce576130cd613056565b5b60006130dc848285016130a3565b91505092915050565b60008115159050919050565b6130fa816130e5565b82525050565b600060208201905061311560008301846130f1565b92915050565b6000819050919050565b61312e8161311b565b811461313957600080fd5b50565b60008135905061314b81613125565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317c82613151565b9050919050565b61318c81613171565b811461319757600080fd5b50565b6000813590506131a981613183565b92915050565b600080604083850312156131c6576131c5613056565b5b60006131d48582860161313c565b92505060206131e58582860161319a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561322957808201518184015260208101905061320e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613251826131ef565b61325b81856131fa565b935061326b81856020860161320b565b61327481613235565b840191505092915050565b600060208201905081810360008301526132998184613246565b905092915050565b6000602082840312156132b7576132b6613056565b5b60006132c58482850161313c565b91505092915050565b6132d781613171565b82525050565b60006020820190506132f260008301846132ce565b92915050565b6000806040838503121561330f5761330e613056565b5b600061331d8582860161319a565b925050602061332e8582860161313c565b9150509250929050565b613341816130e5565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613056565b5b60006133888482850161334f565b91505092915050565b61339a8161311b565b82525050565b60006020820190506133b56000830184613391565b92915050565b6000806000606084860312156133d4576133d3613056565b5b60006133e28682870161319a565b93505060206133f38682870161319a565b92505060406134048682870161313c565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344b82613235565b810181811067ffffffffffffffff8211171561346a57613469613413565b5b80604052505050565b600061347d61304c565b90506134898282613442565b919050565b600067ffffffffffffffff8211156134a9576134a8613413565b5b602082029050602081019050919050565b600080fd5b60006134d26134cd8461348e565b613473565b905080838252602082019050602084028301858111156134f5576134f46134ba565b5b835b8181101561351e578061350a888261313c565b8452602084019350506020810190506134f7565b5050509392505050565b600082601f83011261353d5761353c61340e565b5b813561354d8482602086016134bf565b91505092915050565b60008060006060848603121561356f5761356e613056565b5b600061357d8682870161319a565b935050602061358e8682870161319a565b925050604084013567ffffffffffffffff8111156135af576135ae61305b565b5b6135bb86828701613528565b9150509250925092565b600080604083850312156135dc576135db613056565b5b60006135ea8582860161319a565b92505060206135fb8582860161334f565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561362557613624613413565b5b61362e82613235565b9050602081019050919050565b82818337600083830152505050565b600061365d6136588461360a565b613473565b90508281526020810184848401111561367957613678613605565b5b61368484828561363b565b509392505050565b600082601f8301126136a1576136a061340e565b5b81356136b184826020860161364a565b91505092915050565b6000602082840312156136d0576136cf613056565b5b600082013567ffffffffffffffff8111156136ee576136ed61305b565b5b6136fa8482850161368c565b91505092915050565b60006020828403121561371957613718613056565b5b60006137278482850161319a565b91505092915050565b600060ff82169050919050565b61374681613730565b82525050565b6000602082019050613761600083018461373d565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61379c8161311b565b82525050565b60006137ae8383613793565b60208301905092915050565b6000602082019050919050565b60006137d282613767565b6137dc8185613772565b93506137e783613783565b8060005b838110156138185781516137ff88826137a2565b975061380a836137ba565b9250506001810190506137eb565b5085935050505092915050565b6000602082019050818103600083015261383f81846137c7565b905092915050565b600067ffffffffffffffff82111561386257613861613413565b5b61386b82613235565b9050602081019050919050565b600061388b61388684613847565b613473565b9050828152602081018484840111156138a7576138a6613605565b5b6138b284828561363b565b509392505050565b600082601f8301126138cf576138ce61340e565b5b81356138df848260208601613878565b91505092915050565b6000806000806080858703121561390257613901613056565b5b60006139108782880161319a565b94505060206139218782880161319a565b93505060406139328782880161313c565b925050606085013567ffffffffffffffff8111156139535761395261305b565b5b61395f878288016138ba565b91505092959194509250565b6000806040838503121561398257613981613056565b5b60006139908582860161319a565b92505060206139a18582860161319a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139f257607f821691505b602082108103613a0557613a046139ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a458261311b565b9150613a508361311b565b9250828201905080821115613a6857613a67613a0b565b5b92915050565b6000613a798261311b565b9150613a848361311b565b9250828202613a928161311b565b91508282048414831517613aa957613aa8613a0b565b5b5092915050565b6000819050919050565b6000819050919050565b6000613adf613ada613ad584613ab0565b613aba565b61311b565b9050919050565b613aef81613ac4565b82525050565b6000602082019050613b0a6000830184613ae6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b64565b613bab8683613b64565b95508019841693508086168417925050509392505050565b6000613bde613bd9613bd48461311b565b613aba565b61311b565b9050919050565b6000819050919050565b613bf883613bc3565b613c0c613c0482613be5565b848454613b71565b825550505050565b600090565b613c21613c14565b613c2c818484613bef565b505050565b5b81811015613c5057613c45600082613c19565b600181019050613c32565b5050565b601f821115613c9557613c6681613b3f565b613c6f84613b54565b81016020851015613c7e578190505b613c92613c8a85613b54565b830182613c31565b50505b505050565b600082821c905092915050565b6000613cb860001984600802613c9a565b1980831691505092915050565b6000613cd18383613ca7565b9150826002028217905092915050565b613cea826131ef565b67ffffffffffffffff811115613d0357613d02613413565b5b613d0d82546139da565b613d18828285613c54565b600060209050601f831160018114613d4b5760008415613d39578287015190505b613d438582613cc5565b865550613dab565b601f198416613d5986613b3f565b60005b82811015613d8157848901518255600182019150602085019450602081019050613d5c565b86831015613d9e5784890151613d9a601f891682613ca7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000613dc9826131ef565b613dd38185613db3565b9350613de381856020860161320b565b80840191505092915050565b6000613dfb8285613dbe565b9150613e078284613dbe565b91508190509392505050565b6000613e1e8261311b565b915060008203613e3157613e30613a0b565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000613e6382613e3c565b613e6d8185613e47565b9350613e7d81856020860161320b565b613e8681613235565b840191505092915050565b6000608082019050613ea660008301876132ce565b613eb360208301866132ce565b613ec06040830185613391565b8181036060830152613ed28184613e58565b905095945050505050565b600081519050613eec8161308c565b92915050565b600060208284031215613f0857613f07613056565b5b6000613f1684828501613edd565b9150509291505056fe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a264697066735822122048e1d0c88e988f79a5ffdbaa436cbde1c278cba9d98fca6c375d93a828bd00ee64736f6c63430008180033

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  ]
[ 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.