ETH Price: $2,676.45 (-2.56%)

Token

Wrapped Tekomon (wTEKOMON)
 

Overview

Max Total Supply

1,476 wTEKOMON

Holders

84

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
nftclub.eth
Balance
0 wTEKOMON

Value
$0.00
0xdfeb50f97bb6a660697849ac13645e2e26cc4915
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

Contract Name:
TekomonWrapper

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

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

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

contract TekomonWrapper is ERC20721TWrapper {
    constructor(
        address base
    ) ERC20721TWrapper("Wrapped Tekomon", "wTEKOMON", base) {}
}

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

[{"inputs":[{"internalType":"address","name":"base","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InsufficientNFTBalance","type":"error"},{"inputs":[],"name":"InvalidArrayOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Unwrap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Wrap","type":"event"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"contract IERC20721T","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unwrap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"wrap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wrappedTokenPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b50604051620023bf380380620023bf833981810160405281019062000037919062000170565b6040518060400160405280600f81526020017f577261707065642054656b6f6d6f6e00000000000000000000000000000000008152506040518060400160405280600881526020017f7754454b4f4d4f4e000000000000000000000000000000000000000000000000815250828260019081620000b591906200041c565b508160029081620000c791906200041c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505050505062000503565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000138826200010b565b9050919050565b6200014a816200012b565b81146200015657600080fd5b50565b6000815190506200016a816200013f565b92915050565b60006020828403121562000189576200018862000106565b5b6000620001998482850162000159565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022457607f821691505b6020821081036200023a5762000239620001dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000265565b620002b0868362000265565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002fd620002f7620002f184620002c8565b620002d2565b620002c8565b9050919050565b6000819050919050565b6200031983620002dc565b62000331620003288262000304565b84845462000272565b825550505050565b600090565b6200034862000339565b620003558184846200030e565b505050565b5b818110156200037d57620003716000826200033e565b6001810190506200035b565b5050565b601f821115620003cc57620003968162000240565b620003a18462000255565b81016020851015620003b1578190505b620003c9620003c08562000255565b8301826200035a565b50505b505050565b600082821c905092915050565b6000620003f160001984600802620003d1565b1980831691505092915050565b60006200040c8383620003de565b9150826002028217905092915050565b6200042782620001a2565b67ffffffffffffffff811115620004435762000442620001ad565b5b6200044f82546200020b565b6200045c82828562000381565b600060209050601f8311600181146200049457600084156200047f578287015190505b6200048b8582620003fe565b865550620004fb565b601f198416620004a48662000240565b60005b82811015620004ce57848901518255600182019150602085019450602081019050620004a7565b86831015620004ee5784890151620004ea601f891682620003de565b8355505b6001600288020188555050505b505050505050565b608051611e76620005496000396000818161048a0152818161052e015281816105520152818161074c015281816108cf015281816109d40152610a8f0152611e766000f3fe6080604052600436106100e85760003560e01c806363ac2a4c1161008a578063cc17a5bf11610059578063cc17a5bf146102ff578063dd62ed3e1461031b578063de0e9a3e14610358578063ea598cb014610374576100e8565b806363ac2a4c1461023e57806370a082311461025a57806395d89b4114610297578063a9059cbb146102c2576100e8565b806323b872dd116100c657806323b872dd14610180578063313ce567146101bd57806336ae4b36146101e85780635001f3b514610213576100e8565b806306fdde03146100ed578063095ea7b31461011857806318160ddd14610155575b600080fd5b3480156100f957600080fd5b50610102610390565b60405161010f919061138d565b60405180910390f35b34801561012457600080fd5b5061013f600480360381019061013a9190611457565b610422565b60405161014c91906114b2565b60405180910390f35b34801561016157600080fd5b5061016a610445565b60405161017791906114dc565b60405180910390f35b34801561018c57600080fd5b506101a760048036038101906101a291906114f7565b61044e565b6040516101b491906114b2565b60405180910390f35b3480156101c957600080fd5b506101d261047d565b6040516101df9190611566565b60405180910390f35b3480156101f457600080fd5b506101fd610486565b60405161020a919061163f565b60405180910390f35b34801561021f57600080fd5b5061022861052c565b60405161023591906116c0565b60405180910390f35b61025860048036038101906102539190611740565b610550565b005b34801561026657600080fd5b50610281600480360381019061027c919061178d565b61064c565b60405161028e91906114dc565b60405180910390f35b3480156102a357600080fd5b506102ac610695565b6040516102b9919061138d565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190611457565b610727565b6040516102f691906114b2565b60405180910390f35b61031960048036038101906103149190611740565b61074a565b005b34801561032757600080fd5b50610342600480360381019061033d91906117ba565b610846565b60405161034f91906114dc565b60405180910390f35b610372600480360381019061036d91906117fa565b6108cd565b005b61038e600480360381019061038991906117fa565b6109d0565b005b60606001805461039f90611856565b80601f01602080910402602001604051908101604052809291908181526020018280546103cb90611856565b80156104185780601f106103ed57610100808354040283529160200191610418565b820191906000526020600020905b8154815290600101906020018083116103fb57829003601f168201915b5050505050905090565b60008061042d610b8a565b905061043a818585610b92565b600191505092915050565b60008054905090565b600080610459610b8a565b9050610466858285610ba4565b610471858585610c38565b60019150509392505050565b60006012905090565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638462151c306040518263ffffffff1660e01b81526004016104e19190611896565b600060405180830381865afa1580156104fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105279190611a04565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633593cebc303385856040518563ffffffff1660e01b81526004016105af9493929190611ab7565b600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b5050505061060c336105ed61047d565b600a6105f99190611c59565b848490506106079190611ca4565b610d2c565b7f5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c23383839050604051610640929190611ce6565b60405180910390a15050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600280546106a490611856565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611856565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600080610732610b8a565b905061073f818585610c38565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633593cebc333085856040518563ffffffff1660e01b81526004016107a99493929190611ab7565b600060405180830381600087803b1580156107c357600080fd5b505af11580156107d7573d6000803e3d6000fd5b50505050610806336107e761047d565b600a6107f39190611c59565b848490506108019190611ca4565b610dae565b7fb61d00fdfee32467c7d81db64c811ae60c104c346debf36a14afe84b8fce59e5338383905060405161083a929190611ce6565b60405180910390a15050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610928929190611ce6565b6020604051808303816000875af1158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b9190611d3b565b506109943361097861047d565b600a6109849190611c59565b8361098f9190611ca4565b610d2c565b7f5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c233826040516109c5929190611ce6565b60405180910390a150565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b8152600401610a2b9190611896565b600060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a719190611a04565b90508181511015610a8d57610a8c631475883f60e01b610e30565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633593cebc3330610ad58587610e3a565b6040518463ffffffff1660e01b8152600401610af393929190611d68565b600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b50505050610b4d33610b3161047d565b600a610b3d9190611c59565b84610b489190611ca4565b610dae565b7fb61d00fdfee32467c7d81db64c811ae60c104c346debf36a14afe84b8fce59e53383604051610b7e929190611ce6565b60405180910390a15050565b600033905090565b610b9f8383836001610f00565b505050565b6000610bb08484610846565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c325781811015610c22578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c1993929190611da6565b60405180910390fd5b610c3184848484036000610f00565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610caa5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610ca19190611896565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d1c5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d139190611896565b60405180910390fd5b610d278383836110d7565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d9e5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d959190611896565b60405180910390fd5b610daa826000836110d7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e205760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e179190611896565b60405180910390fd5b610e2c600083836110d7565b5050565b8060005260046000fd5b60608251821115610e5657610e5563b3a6a31060e01b610e30565b5b60008267ffffffffffffffff811115610e7257610e716118b1565b5b604051908082528060200260200182016040528015610ea05781602001602082028036833780820191505090505b50905060005b83811015610ef557848181518110610ec157610ec0611ddd565b5b6020026020010151828281518110610edc57610edb611ddd565b5b6020026020010181815250508080600101915050610ea6565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f725760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f699190611896565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fe45760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610fdb9190611896565b60405180910390fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156110d1578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110c891906114dc565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611128578060008082825461111c9190611e0c565b925050819055506111fd565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111b5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016111ac93929190611da6565b60405180910390fd5b818103600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124557806000808282540392505081905550611293565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112f091906114dc565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561133757808201518184015260208101905061131c565b60008484015250505050565b6000601f19601f8301169050919050565b600061135f826112fd565b6113698185611308565b9350611379818560208601611319565b61138281611343565b840191505092915050565b600060208201905081810360008301526113a78184611354565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113ee826113c3565b9050919050565b6113fe816113e3565b811461140957600080fd5b50565b60008135905061141b816113f5565b92915050565b6000819050919050565b61143481611421565b811461143f57600080fd5b50565b6000813590506114518161142b565b92915050565b6000806040838503121561146e5761146d6113b9565b5b600061147c8582860161140c565b925050602061148d85828601611442565b9150509250929050565b60008115159050919050565b6114ac81611497565b82525050565b60006020820190506114c760008301846114a3565b92915050565b6114d681611421565b82525050565b60006020820190506114f160008301846114cd565b92915050565b6000806000606084860312156115105761150f6113b9565b5b600061151e8682870161140c565b935050602061152f8682870161140c565b925050604061154086828701611442565b9150509250925092565b600060ff82169050919050565b6115608161154a565b82525050565b600060208201905061157b6000830184611557565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6115b681611421565b82525050565b60006115c883836115ad565b60208301905092915050565b6000602082019050919050565b60006115ec82611581565b6115f6818561158c565b93506116018361159d565b8060005b8381101561163257815161161988826115bc565b9750611624836115d4565b925050600181019050611605565b5085935050505092915050565b6000602082019050818103600083015261165981846115e1565b905092915050565b6000819050919050565b600061168661168161167c846113c3565b611661565b6113c3565b9050919050565b60006116988261166b565b9050919050565b60006116aa8261168d565b9050919050565b6116ba8161169f565b82525050565b60006020820190506116d560008301846116b1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611700576116ff6116db565b5b8235905067ffffffffffffffff81111561171d5761171c6116e0565b5b602083019150836020820283011115611739576117386116e5565b5b9250929050565b60008060208385031215611757576117566113b9565b5b600083013567ffffffffffffffff811115611775576117746113be565b5b611781858286016116ea565b92509250509250929050565b6000602082840312156117a3576117a26113b9565b5b60006117b18482850161140c565b91505092915050565b600080604083850312156117d1576117d06113b9565b5b60006117df8582860161140c565b92505060206117f08582860161140c565b9150509250929050565b6000602082840312156118105761180f6113b9565b5b600061181e84828501611442565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061186e57607f821691505b60208210810361188157611880611827565b5b50919050565b611890816113e3565b82525050565b60006020820190506118ab6000830184611887565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6118e982611343565b810181811067ffffffffffffffff82111715611908576119076118b1565b5b80604052505050565b600061191b6113af565b905061192782826118e0565b919050565b600067ffffffffffffffff821115611947576119466118b1565b5b602082029050602081019050919050565b6000815190506119678161142b565b92915050565b600061198061197b8461192c565b611911565b905080838252602082019050602084028301858111156119a3576119a26116e5565b5b835b818110156119cc57806119b88882611958565b8452602084019350506020810190506119a5565b5050509392505050565b600082601f8301126119eb576119ea6116db565b5b81516119fb84826020860161196d565b91505092915050565b600060208284031215611a1a57611a196113b9565b5b600082015167ffffffffffffffff811115611a3857611a376113be565b5b611a44848285016119d6565b91505092915050565b600080fd5b82818337505050565b6000611a67838561158c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611a9a57611a99611a4d565b5b602083029250611aab838584611a52565b82840190509392505050565b6000606082019050611acc6000830187611887565b611ad96020830186611887565b8181036040830152611aec818486611a5b565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115611b7d57808604811115611b5957611b58611af7565b5b6001851615611b685780820291505b8081029050611b7685611b26565b9450611b3d565b94509492505050565b600082611b965760019050611c52565b81611ba45760009050611c52565b8160018114611bba5760028114611bc457611bf3565b6001915050611c52565b60ff841115611bd657611bd5611af7565b5b8360020a915084821115611bed57611bec611af7565b5b50611c52565b5060208310610133831016604e8410600b8410161715611c285782820a905083811115611c2357611c22611af7565b5b611c52565b611c358484846001611b33565b92509050818404811115611c4c57611c4b611af7565b5b81810290505b9392505050565b6000611c6482611421565b9150611c6f8361154a565b9250611c9c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611b86565b905092915050565b6000611caf82611421565b9150611cba83611421565b9250828202611cc881611421565b91508282048414831517611cdf57611cde611af7565b5b5092915050565b6000604082019050611cfb6000830185611887565b611d0860208301846114cd565b9392505050565b611d1881611497565b8114611d2357600080fd5b50565b600081519050611d3581611d0f565b92915050565b600060208284031215611d5157611d506113b9565b5b6000611d5f84828501611d26565b91505092915050565b6000606082019050611d7d6000830186611887565b611d8a6020830185611887565b8181036040830152611d9c81846115e1565b9050949350505050565b6000606082019050611dbb6000830186611887565b611dc860208301856114cd565b611dd560408301846114cd565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e1782611421565b9150611e2283611421565b9250828201905080821115611e3a57611e39611af7565b5b9291505056fea264697066735822122042afb56da1e962389ee6b0028571c0d47a6f676d3c4677354a77765ce19281a964736f6c634300081800330000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc2

Deployed Bytecode

0x6080604052600436106100e85760003560e01c806363ac2a4c1161008a578063cc17a5bf11610059578063cc17a5bf146102ff578063dd62ed3e1461031b578063de0e9a3e14610358578063ea598cb014610374576100e8565b806363ac2a4c1461023e57806370a082311461025a57806395d89b4114610297578063a9059cbb146102c2576100e8565b806323b872dd116100c657806323b872dd14610180578063313ce567146101bd57806336ae4b36146101e85780635001f3b514610213576100e8565b806306fdde03146100ed578063095ea7b31461011857806318160ddd14610155575b600080fd5b3480156100f957600080fd5b50610102610390565b60405161010f919061138d565b60405180910390f35b34801561012457600080fd5b5061013f600480360381019061013a9190611457565b610422565b60405161014c91906114b2565b60405180910390f35b34801561016157600080fd5b5061016a610445565b60405161017791906114dc565b60405180910390f35b34801561018c57600080fd5b506101a760048036038101906101a291906114f7565b61044e565b6040516101b491906114b2565b60405180910390f35b3480156101c957600080fd5b506101d261047d565b6040516101df9190611566565b60405180910390f35b3480156101f457600080fd5b506101fd610486565b60405161020a919061163f565b60405180910390f35b34801561021f57600080fd5b5061022861052c565b60405161023591906116c0565b60405180910390f35b61025860048036038101906102539190611740565b610550565b005b34801561026657600080fd5b50610281600480360381019061027c919061178d565b61064c565b60405161028e91906114dc565b60405180910390f35b3480156102a357600080fd5b506102ac610695565b6040516102b9919061138d565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190611457565b610727565b6040516102f691906114b2565b60405180910390f35b61031960048036038101906103149190611740565b61074a565b005b34801561032757600080fd5b50610342600480360381019061033d91906117ba565b610846565b60405161034f91906114dc565b60405180910390f35b610372600480360381019061036d91906117fa565b6108cd565b005b61038e600480360381019061038991906117fa565b6109d0565b005b60606001805461039f90611856565b80601f01602080910402602001604051908101604052809291908181526020018280546103cb90611856565b80156104185780601f106103ed57610100808354040283529160200191610418565b820191906000526020600020905b8154815290600101906020018083116103fb57829003601f168201915b5050505050905090565b60008061042d610b8a565b905061043a818585610b92565b600191505092915050565b60008054905090565b600080610459610b8a565b9050610466858285610ba4565b610471858585610c38565b60019150509392505050565b60006012905090565b60607f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff16638462151c306040518263ffffffff1660e01b81526004016104e19190611896565b600060405180830381865afa1580156104fe573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906105279190611a04565b905090565b7f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc281565b7f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff16633593cebc303385856040518563ffffffff1660e01b81526004016105af9493929190611ab7565b600060405180830381600087803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b5050505061060c336105ed61047d565b600a6105f99190611c59565b848490506106079190611ca4565b610d2c565b7f5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c23383839050604051610640929190611ce6565b60405180910390a15050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600280546106a490611856565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090611856565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600080610732610b8a565b905061073f818585610c38565b600191505092915050565b7f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff16633593cebc333085856040518563ffffffff1660e01b81526004016107a99493929190611ab7565b600060405180830381600087803b1580156107c357600080fd5b505af11580156107d7573d6000803e3d6000fd5b50505050610806336107e761047d565b600a6107f39190611c59565b848490506108019190611ca4565b610dae565b7fb61d00fdfee32467c7d81db64c811ae60c104c346debf36a14afe84b8fce59e5338383905060405161083a929190611ce6565b60405180910390a15050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610928929190611ce6565b6020604051808303816000875af1158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b9190611d3b565b506109943361097861047d565b600a6109849190611c59565b8361098f9190611ca4565b610d2c565b7f5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c233826040516109c5929190611ce6565b60405180910390a150565b60007f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff16638462151c336040518263ffffffff1660e01b8152600401610a2b9190611896565b600060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a719190611a04565b90508181511015610a8d57610a8c631475883f60e01b610e30565b5b7f0000000000000000000000006e9149150171deba46b1e777f573cebea8c56cc273ffffffffffffffffffffffffffffffffffffffff16633593cebc3330610ad58587610e3a565b6040518463ffffffff1660e01b8152600401610af393929190611d68565b600060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b50505050610b4d33610b3161047d565b600a610b3d9190611c59565b84610b489190611ca4565b610dae565b7fb61d00fdfee32467c7d81db64c811ae60c104c346debf36a14afe84b8fce59e53383604051610b7e929190611ce6565b60405180910390a15050565b600033905090565b610b9f8383836001610f00565b505050565b6000610bb08484610846565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c325781811015610c22578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c1993929190611da6565b60405180910390fd5b610c3184848484036000610f00565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610caa5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610ca19190611896565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d1c5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d139190611896565b60405180910390fd5b610d278383836110d7565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d9e5760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d959190611896565b60405180910390fd5b610daa826000836110d7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e205760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e179190611896565b60405180910390fd5b610e2c600083836110d7565b5050565b8060005260046000fd5b60608251821115610e5657610e5563b3a6a31060e01b610e30565b5b60008267ffffffffffffffff811115610e7257610e716118b1565b5b604051908082528060200260200182016040528015610ea05781602001602082028036833780820191505090505b50905060005b83811015610ef557848181518110610ec157610ec0611ddd565b5b6020026020010151828281518110610edc57610edb611ddd565b5b6020026020010181815250508080600101915050610ea6565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f725760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f699190611896565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fe45760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610fdb9190611896565b60405180910390fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156110d1578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110c891906114dc565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611128578060008082825461111c9190611e0c565b925050819055506111fd565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156111b5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016111ac93929190611da6565b60405180910390fd5b818103600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361124557806000808282540392505081905550611293565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112f091906114dc565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561133757808201518184015260208101905061131c565b60008484015250505050565b6000601f19601f8301169050919050565b600061135f826112fd565b6113698185611308565b9350611379818560208601611319565b61138281611343565b840191505092915050565b600060208201905081810360008301526113a78184611354565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006113ee826113c3565b9050919050565b6113fe816113e3565b811461140957600080fd5b50565b60008135905061141b816113f5565b92915050565b6000819050919050565b61143481611421565b811461143f57600080fd5b50565b6000813590506114518161142b565b92915050565b6000806040838503121561146e5761146d6113b9565b5b600061147c8582860161140c565b925050602061148d85828601611442565b9150509250929050565b60008115159050919050565b6114ac81611497565b82525050565b60006020820190506114c760008301846114a3565b92915050565b6114d681611421565b82525050565b60006020820190506114f160008301846114cd565b92915050565b6000806000606084860312156115105761150f6113b9565b5b600061151e8682870161140c565b935050602061152f8682870161140c565b925050604061154086828701611442565b9150509250925092565b600060ff82169050919050565b6115608161154a565b82525050565b600060208201905061157b6000830184611557565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6115b681611421565b82525050565b60006115c883836115ad565b60208301905092915050565b6000602082019050919050565b60006115ec82611581565b6115f6818561158c565b93506116018361159d565b8060005b8381101561163257815161161988826115bc565b9750611624836115d4565b925050600181019050611605565b5085935050505092915050565b6000602082019050818103600083015261165981846115e1565b905092915050565b6000819050919050565b600061168661168161167c846113c3565b611661565b6113c3565b9050919050565b60006116988261166b565b9050919050565b60006116aa8261168d565b9050919050565b6116ba8161169f565b82525050565b60006020820190506116d560008301846116b1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611700576116ff6116db565b5b8235905067ffffffffffffffff81111561171d5761171c6116e0565b5b602083019150836020820283011115611739576117386116e5565b5b9250929050565b60008060208385031215611757576117566113b9565b5b600083013567ffffffffffffffff811115611775576117746113be565b5b611781858286016116ea565b92509250509250929050565b6000602082840312156117a3576117a26113b9565b5b60006117b18482850161140c565b91505092915050565b600080604083850312156117d1576117d06113b9565b5b60006117df8582860161140c565b92505060206117f08582860161140c565b9150509250929050565b6000602082840312156118105761180f6113b9565b5b600061181e84828501611442565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061186e57607f821691505b60208210810361188157611880611827565b5b50919050565b611890816113e3565b82525050565b60006020820190506118ab6000830184611887565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6118e982611343565b810181811067ffffffffffffffff82111715611908576119076118b1565b5b80604052505050565b600061191b6113af565b905061192782826118e0565b919050565b600067ffffffffffffffff821115611947576119466118b1565b5b602082029050602081019050919050565b6000815190506119678161142b565b92915050565b600061198061197b8461192c565b611911565b905080838252602082019050602084028301858111156119a3576119a26116e5565b5b835b818110156119cc57806119b88882611958565b8452602084019350506020810190506119a5565b5050509392505050565b600082601f8301126119eb576119ea6116db565b5b81516119fb84826020860161196d565b91505092915050565b600060208284031215611a1a57611a196113b9565b5b600082015167ffffffffffffffff811115611a3857611a376113be565b5b611a44848285016119d6565b91505092915050565b600080fd5b82818337505050565b6000611a67838561158c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611a9a57611a99611a4d565b5b602083029250611aab838584611a52565b82840190509392505050565b6000606082019050611acc6000830187611887565b611ad96020830186611887565b8181036040830152611aec818486611a5b565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115611b7d57808604811115611b5957611b58611af7565b5b6001851615611b685780820291505b8081029050611b7685611b26565b9450611b3d565b94509492505050565b600082611b965760019050611c52565b81611ba45760009050611c52565b8160018114611bba5760028114611bc457611bf3565b6001915050611c52565b60ff841115611bd657611bd5611af7565b5b8360020a915084821115611bed57611bec611af7565b5b50611c52565b5060208310610133831016604e8410600b8410161715611c285782820a905083811115611c2357611c22611af7565b5b611c52565b611c358484846001611b33565b92509050818404811115611c4c57611c4b611af7565b5b81810290505b9392505050565b6000611c6482611421565b9150611c6f8361154a565b9250611c9c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611b86565b905092915050565b6000611caf82611421565b9150611cba83611421565b9250828202611cc881611421565b91508282048414831517611cdf57611cde611af7565b5b5092915050565b6000604082019050611cfb6000830185611887565b611d0860208301846114cd565b9392505050565b611d1881611497565b8114611d2357600080fd5b50565b600081519050611d3581611d0f565b92915050565b600060208284031215611d5157611d506113b9565b5b6000611d5f84828501611d26565b91505092915050565b6000606082019050611d7d6000830186611887565b611d8a6020830185611887565b8181036040830152611d9c81846115e1565b9050949350505050565b6000606082019050611dbb6000830186611887565b611dc860208301856114cd565b611dd560408301846114cd565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611e1782611421565b9150611e2283611421565b9250828201905080821115611e3a57611e39611af7565b5b9291505056fea264697066735822122042afb56da1e962389ee6b0028571c0d47a6f676d3c4677354a77765ce19281a964736f6c63430008180033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.