ETH Price: $3,820.74 (+1.61%)
Gas: 5 Gwei

Contract

0xD0C7304156AF0a4be17352D8ce214222Ec66E8ba
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0xcdb8747513d507085f3e85cca799f1016a3fe815fc165ec229b374bd279a3a91Claim On Chain(pending)2024-05-29 15:25:523 days ago1716996352IN
0xD0C73041...2Ec66E8ba
0 ETH(Pending)(Pending)
Claim On Chain200002122024-06-01 23:19:231 hr ago1717283963IN
0xD0C73041...2Ec66E8ba
0 ETH0.001036245.51221416
Claim On Chain199845922024-05-30 18:58:112 days ago1717095491IN
0xD0C73041...2Ec66E8ba
0 ETH0.0026609214.82716606
Claim On Chain199771202024-05-29 17:51:473 days ago1717005107IN
0xD0C73041...2Ec66E8ba
0 ETH0.0022460912.5163646
Claim On Chain199724132024-05-29 2:03:113 days ago1716948191IN
0xD0C73041...2Ec66E8ba
0 ETH0.00129037.40191155
Claim On Chain199667812024-05-28 7:09:354 days ago1716880175IN
0xD0C73041...2Ec66E8ba
0 ETH0.0032554818.14016676
Claim On Chain199658482024-05-28 4:01:594 days ago1716868919IN
0xD0C73041...2Ec66E8ba
0 ETH0.0020185110.73680673
Claim On Chain199651272024-05-28 1:37:234 days ago1716860243IN
0xD0C73041...2Ec66E8ba
0 ETH0.0021804212.50816394
Claim On Chain199651132024-05-28 1:34:354 days ago1716860075IN
0xD0C73041...2Ec66E8ba
0 ETH0.0019858211.39182326
Claim On Chain199651052024-05-28 1:32:594 days ago1716859979IN
0xD0C73041...2Ec66E8ba
0 ETH0.0019057810.93330786
Claim On Chain199598722024-05-27 7:59:355 days ago1716796775IN
0xD0C73041...2Ec66E8ba
0 ETH0.001418947.90704718
Claim On Chain199586052024-05-27 3:45:115 days ago1716781511IN
0xD0C73041...2Ec66E8ba
0 ETH0.001017566.13833295
Claim On Chain199585432024-05-27 3:32:475 days ago1716780767IN
0xD0C73041...2Ec66E8ba
0 ETH0.001263237.61983385
Claim On Chain199584782024-05-27 3:19:475 days ago1716779987IN
0xD0C73041...2Ec66E8ba
0 ETH0.001047026.31602175
Claim On Chain199583382024-05-27 2:51:355 days ago1716778295IN
0xD0C73041...2Ec66E8ba
0 ETH0.001294997.42927838
Claim On Chain199569972024-05-26 22:20:596 days ago1716762059IN
0xD0C73041...2Ec66E8ba
0 ETH0.000756434.2152459
Claim On Chain199507502024-05-26 1:24:356 days ago1716686675IN
0xD0C73041...2Ec66E8ba
0 ETH0.000523062.7822418
Claim On Chain199482142024-05-25 16:54:477 days ago1716656087IN
0xD0C73041...2Ec66E8ba
0 ETH0.001087286.05888127
Claim On Chain199458212024-05-25 8:52:477 days ago1716627167IN
0xD0C73041...2Ec66E8ba
0 ETH0.000759524.58172653
Claim On Chain199458132024-05-25 8:51:117 days ago1716627071IN
0xD0C73041...2Ec66E8ba
0 ETH0.000750464.52706502
Claim On Chain199458012024-05-25 8:48:477 days ago1716626927IN
0xD0C73041...2Ec66E8ba
0 ETH0.000729134.18299173
Claim On Chain199457892024-05-25 8:46:237 days ago1716626783IN
0xD0C73041...2Ec66E8ba
0 ETH0.000682353.91439678
Claim On Chain199457572024-05-25 8:39:597 days ago1716626399IN
0xD0C73041...2Ec66E8ba
0 ETH0.000768984.4116173
Claim On Chain199457292024-05-25 8:34:237 days ago1716626063IN
0xD0C73041...2Ec66E8ba
0 ETH0.000770914.42266598
Claim On Chain199456992024-05-25 8:28:237 days ago1716625703IN
0xD0C73041...2Ec66E8ba
0 ETH0.000659583.67532097
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
187521082023-12-10 0:02:11175 days ago1702166531
0xD0C73041...2Ec66E8ba
0.00655024 ETH
187520832023-12-09 23:57:11175 days ago1702166231
0xD0C73041...2Ec66E8ba
0.00652924 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultHandlerV7a

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion
File 1 of 1 : VaultHandlerV7a.sol
/**
 *Submitted for verification at Etherscan.io on 2021-07-14
*/

// ___________      ___.   .__                                          
// \_   _____/ _____\_ |__ |  |   ____   _____                          
//  |    __)_ /     \| __ \|  | _/ __ \ /     \                         
//  |        \  Y Y  \ \_\ \  |_\  ___/|  Y Y  \                        
// /_______  /__|_|  /___  /____/\___  >__|_|  /                        
//         \/      \/    \/          \/      \/                         
//     ____   ____            .__   __                                  
//     \   \ /   /____   __ __|  |_/  |_                                
//      \   Y   /\__  \ |  |  \  |\   __\                               
//       \     /  / __ \|  |  /  |_|  |                                 
//       \___/  (____  /____/|____/__|                                 
//                   \/                                                
//   ___ ___                    .___.__                          _________ a
//  /   |   \_____    ____    __| _/|  |   ___________  ___  __ |  ____  /
// /    ~    \__  \  /    \  / __ | |  | _/ __ \_  __ \ \  \/   /    / /
// \    Y    // __ \|   |  \/ /_/ | |  |_\  ___/|  | \/  \    /    / /
//  \___|_  /(____  /___|  /\____ | |____/\___  >__|      \_/    /_/
//       \/      \/     \/      \/           \/                     

  
// File: browser/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: browser/IERC20Token.sol

pragma solidity ^0.8.4;
interface IERC20Token {
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: browser/SafeMath.sol

pragma solidity ^0.8.4;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
// File: browser/VaultHandler_v4.sol
pragma solidity ^0.8.4;

interface IClaimed {
    function isClaimed(address nftAddress, uint tokenId, bytes32[] calldata proof) external returns(bool);
    function claim(address nftAddress, uint tokenId, address _claimedBy) external;
}

pragma experimental ABIEncoderV2;
pragma solidity ^0.8.4;


interface IERC721 {
    function burn(uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external;
    function changeName(string calldata name, string calldata symbol) external;
    function updateTokenUri(uint256 _tokenId,string memory _uri) external;
    function tokenPayload(uint256 _tokenId) external view returns (string memory);
    function ownerOf(uint256 _tokenId) external returns (address _owner);
    function getApproved(uint256 _tokenId) external returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
}

interface Ownable {
    function transferOwnership(address newOwner) external;
}

interface BasicERC20 {
    function burn(uint256 value) external;
    function mint(address account, uint256 amount) external;
    function decimals() external view returns (uint8);
}

contract Context {
    constructor() {}

    // solhint-disable-previous-line no-empty-blocks

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


contract Bridged is Context {
    using SafeMath for uint256;
    using SafeMath for uint8;
    using SafeMath for uint;

    address public paymentAddress;
    
    mapping(uint => bool) public chainIds;
    mapping(uint => uint256) public chainBalances;
    
    constructor () {
        chainIds[1] = true;
        chainBalances[1] = 200000000000000000;
        chainIds[137] = true;
        chainBalances[137] = 200000000000000000;
        chainIds[80001] = true;
        chainBalances[80001] = 200000000000000000;
        chainIds[100] = true;
        chainBalances[100] = 200000000000000000;
        chainIds[56] = true;
        chainBalances[56] = 200000000000000000;
        chainIds[250] = true;
        chainBalances[250] = 200000000000000000;
    }
    
    function transferToChain(uint chainId, uint256 amount) public returns (bool) {
        require(chainIds[chainId], 'Invalid Chain ID');
        IERC20Token paymentToken = IERC20Token(paymentAddress);
        require(paymentToken.allowance(_msgSender(), address(this)) >= amount, 'Handler unable to spend ');
        require(paymentToken.transferFrom(_msgSender(), address(this), amount), 'Transfer ERROR');
        BasicERC20(paymentAddress).burn(amount);
        chainBalances[chainId] = chainBalances[chainId].add(amount);
        emit BridgeDeposit(_msgSender(), amount, chainId);
        
        return true;
    }
    
    function _transferFromChain(address _to, uint chainId, uint256 amount) internal returns (bool) {
        require(chainBalances[chainId] >= amount, 'Can not transfer more than deposited');
        require(chainIds[chainId], 'Invalid Chain ID');
        BasicERC20 paymentToken = BasicERC20(paymentAddress);
        paymentToken.mint(_to, amount);
        chainBalances[chainId] = chainBalances[chainId].sub(amount);
        emit BridgeWithdrawal(_msgSender(), amount, chainId);
        
        return true;
    }
    
    event BridgeDeposit(address indexed sender, uint256 indexed amount, uint chainId);
    event BridgeWithdrawal(address indexed sender, uint256 indexed amount, uint chainId);
    
    function _addChainId(uint chainId) internal returns (bool) {
        chainIds[chainId] = true;
        return true;
    }
    
    function _removeChainId(uint chainId) internal returns (bool) {
        chainIds[chainId] = false;
        return true;
    }
    
}

contract VaultHandlerV7a is ReentrancyGuard, Bridged { 
    
    using SafeMath for uint256;
    using SafeMath for uint8;
    address payable private owner;
    string public metadataBaseUri;
    bool public initialized;
    address public nftAddress;
    address public recipientAddress;
    address public claimAddress;
    uint256 public price;
    bool public shouldBurn = false;
    uint internal blockWindow = 3;
    
    struct PreMint {
        string payload;
        bytes32 preImage;
    }
    
    struct PreTransfer {
        string payload;
        bytes32 preImage;
        address _from;
    }
    
    struct Offer {
        uint tokenId;
        address _from;
    }

    mapping(address => mapping(uint => PreMint)) preMints;
    mapping(address => mapping(uint => PreMint)) preMintsByIndex;
    mapping(address => uint) preMintCounts;
    
    mapping(uint => PreTransfer) preTransfers;
    mapping(uint => mapping(uint => PreTransfer)) preTransfersByIndex;
    mapping(uint => uint) preTransferCounts;
    
    mapping(uint => Offer[]) offers;
    mapping(uint => Offer[]) rejected;
    mapping(address => mapping(uint => Offer)) offered;
    
    mapping(address => bool) public blacklisted;
    mapping(address => bool) public witnesses;
    mapping(uint256 => bool) usedNonces;
    mapping(uint256 => bool) public usedTokenIds;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier isOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    // modifier to check if caller blacklisted
    modifier notBlacklisted() {
        require(!blacklisted[msg.sender], "Caller is blacklisted");
        _;
    }
    
    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function transferOwnership(address payable newOwner) public isOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }
    
    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
    
    constructor(address _nftAddress, address _paymentAddress, address _recipientAddress, uint256 _price) {
        owner = _msgSender(); // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
        addWitness(owner);
        metadataBaseUri = "https://api.emblemvault.io/s:evmetadata/meta/";
        nftAddress = _nftAddress;
        paymentAddress = _paymentAddress;
        recipientAddress = _recipientAddress;
        initialized = true;
        uint decimals = BasicERC20(paymentAddress).decimals();
        price = _price * 10 ** decimals;
    }
    
    function claim(uint256 tokenId) public isOwner {
        bytes32[] memory proof;
        IClaimed claimer = IClaimed(claimAddress);
        require(!claimer.isClaimed(nftAddress, tokenId, proof), "Already Claimed");
        
        IERC721 token = IERC721(nftAddress);
        token.burn(tokenId);
    }

    function claimOnChain(uint256 tokenId) public nonReentrant notBlacklisted {
        bytes32[] memory proof;
        IClaimed claimer = IClaimed(claimAddress);
        require(!claimer.isClaimed(nftAddress, tokenId, proof), "Already Claimed");
        IERC721 token = IERC721(nftAddress);
        require(token.ownerOf(tokenId) == _msgSender(), "Not Token Owner");
        token.burn(tokenId);
        claimer.claim(nftAddress, tokenId, _msgSender());
    }

    function addClaimAddress(address _address) public isOwner {
        claimAddress = _address;
    }

    function toggleBlacklist(address _address) public isOwner {
        blacklisted[_address] = !blacklisted[_address];
    }

    function adjustBlockWindow(uint size) public isOwner {
        blockWindow = size;
    }

    function buyWithSignature2(address _to, uint256 _tokenId, string calldata _payload, uint256 _nonce, uint signedBlock, bytes calldata _signature) public payable notBlacklisted {
        bytes32[] memory proof;
        require(signedBlock.add(blockWindow) > block.number, 'Signature expired');
        require(!IClaimed(claimAddress).isClaimed(nftAddress, _tokenId, proof) && !usedTokenIds[_tokenId], "Already claimed");
        IERC721 nftToken = IERC721(nftAddress);
        if (shouldBurn) {
            require(IERC20Token(paymentAddress).transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient
            BasicERC20(paymentAddress).burn(price);
        } else {
            require(IERC20Token(paymentAddress).transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient
        }
        
        address signer = getAddressFromSignature(_tokenId, _nonce, _payload, signedBlock, _signature);
        require(witnesses[signer], 'Not Witnessed');
        usedNonces[_nonce] = true;
        string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId));
        nftToken.mint(_to, _tokenId, _uri, _payload);
        usedTokenIds[_tokenId] = true;
    }

    
    
    function buyWithSignature(address _to, uint256 _tokenId, string calldata _payload, uint256 _nonce, bytes calldata _signature) public isOwner payable {
        IERC20Token paymentToken = IERC20Token(paymentAddress);
        IERC721 nftToken = IERC721(nftAddress);
        if (shouldBurn) {
            require(paymentToken.transferFrom(msg.sender, address(this), price), 'Transfer ERROR'); // Payment sent to recipient
            BasicERC20(paymentAddress).burn(price);
        } else {
            require(paymentToken.transferFrom(msg.sender, address(recipientAddress), price), 'Transfer ERROR'); // Payment sent to recipient
        }        
        address signer = getAddressFromSignature(_tokenId, _nonce, _payload, _signature);
        require(witnesses[signer], 'Not Witnessed');
        usedNonces[_nonce] = true;
        string memory _uri = concat(metadataBaseUri, uintToStr(_tokenId));
        nftToken.mint(_to, _tokenId, _uri, _payload);
    }
    
    
    function addPreMint(address _for, string calldata _payload, uint256 _tokenId, bytes32 preImage) public isOwner {
        try IERC721(nftAddress).tokenPayload(_tokenId) returns (string memory) {
            revert('NFT Exists with this ID');
        } catch {
            require(!_duplicatePremint(_for, _tokenId), 'Duplicate PreMint');
            preMintCounts[_for] = preMintCounts[_for].add(1);
            preMints[_for][_tokenId] = PreMint(_payload, preImage);
            preMintsByIndex[_for][preMintCounts[_for]] = preMints[_for][_tokenId];
        }
    }
    
    function _duplicatePremint(address _for, uint256 _tokenId) internal view returns (bool) {
        string memory data = preMints[_for][_tokenId].payload;
        bytes32 NULL = keccak256(bytes(''));
        return keccak256(bytes(data)) != NULL;
    }
    
    function deletePreMint(address _for, uint256 _tokenId) public isOwner {
        delete preMintsByIndex[_for][preMintCounts[_for]];
        preMintCounts[_for] = preMintCounts[_for].sub(1);
        delete preMints[_for][_tokenId];
    }
    
    function getPreMint(address _for, uint256 _tokenId) public view returns (PreMint memory) {
        return preMints[_for][_tokenId];
    }
    
    function checkPreMintImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) {
        bytes32 calculated = sha256(abi.encodePacked(image));
        bytes32 preBytes = preImage;
        return (calculated, preBytes, calculated == preBytes);
    }
    
    function getPreMintCount(address _for) public view returns (uint length) {
        return preMintCounts[_for];
    }
    
    function getPreMintByIndex(address _for, uint index) public view returns (PreMint memory) {
        return preMintsByIndex[_for][index];
    }
    
    function toggleShouldBurn() public isOwner {
        shouldBurn = !shouldBurn;
    }
    
    /* Transfer with code */
    function addWitness(address _witness) public isOwner {
        witnesses[_witness] = true;
    }

    function removeWitness(address _witness) public isOwner {
        witnesses[_witness] = false;
    }
    
    function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, bytes memory signature) public view returns (address) {
        require(!usedNonces[_nonce]);
        bytes32 hash = keccak256(abi.encodePacked(concat(uintToStr(_tokenId), uintToStr(_nonce))));
        address addressFromSig = recoverSigner(hash, signature);
        return addressFromSig;
    }
    
    function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, string calldata payload, bytes memory signature) public view returns (address) {
        require(!usedNonces[_nonce]);
        string memory combined = concat(uintToStr(_tokenId), payload);
        bytes32 hash = keccak256(abi.encodePacked(concat(combined, uintToStr(_nonce))));
        address addressFromSig = recoverSigner(hash, signature);
        return addressFromSig;
    }

    function getAddressFromSignature(uint256 _tokenId, uint256 _nonce, string calldata payload, uint blockNumber, bytes memory signature) public view returns (address) {
        require(!usedNonces[_nonce]);
        string memory combined = concat(concat(uintToStr(_tokenId), payload), uintToStr(blockNumber));
        bytes32 hash = keccak256(abi.encodePacked(concat(combined, uintToStr(_nonce))));
        address addressFromSig = recoverSigner(hash, signature);
        return addressFromSig;
    }
    
    function getAddressFromSignature(bytes32 _hash, bytes calldata signature) public pure returns (address) {
        address addressFromSig = recoverSigner(_hash, signature);
        return addressFromSig;
    }
    
    function getHash(string calldata _payload) public pure returns (bytes32) {
        bytes32 hash = keccak256(abi.encodePacked(_payload));
        return hash;
    }
    
    function transferWithCode(uint256 _tokenId, string calldata code, address _to, uint256 _nonce,  bytes memory signature) public payable notBlacklisted {
        require(witnesses[getAddressFromSignature(_tokenId, _nonce, signature)], 'Not Witnessed');
        IERC721 nftToken = IERC721(nftAddress);
        PreTransfer memory preTransfer = preTransfers[_tokenId];
        require(preTransfer.preImage == sha256(abi.encodePacked(code)), 'Code does not match'); // Payload should match
        nftToken.transferFrom(preTransfer._from, _to,  _tokenId);
        delete preTransfers[_tokenId];
        delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]];
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1);
        usedNonces[_nonce] = true;
    }
    
    function addPreTransfer(uint256 _tokenId, bytes32 preImage) public {
        require(!_duplicatePretransfer(_tokenId), 'Duplicate PreTransfer');
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].add(1);
        preTransfers[_tokenId] = PreTransfer("payload", preImage, msg.sender);
        preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]] = preTransfers[_tokenId];
    }
    
    function _duplicatePretransfer(uint256 _tokenId) internal view returns (bool) {
        string memory data = preTransfers[_tokenId].payload;
        bytes32 NULL = keccak256(bytes(''));
        return keccak256(bytes(data)) != NULL;
    }
    
    function deletePreTransfer(uint256 _tokenId) public {
        require(preTransfers[_tokenId]._from == msg.sender, 'PreTransfer does not belong to sender');
        delete preTransfersByIndex[_tokenId][preTransferCounts[_tokenId]];
        preTransferCounts[_tokenId] = preTransferCounts[_tokenId].sub(1);
        delete preTransfers[_tokenId];
    }
    
    function getPreTransfer(uint256 _tokenId) public view returns (PreTransfer memory) {
        return preTransfers[_tokenId];
    }
    
    function checkPreTransferImage(string memory image, bytes32 preImage) public pure returns (bytes32, bytes32, bool) {
        bytes32 calculated = sha256(abi.encodePacked(image));
        bytes32 preBytes = preImage;
        return (calculated, preBytes, calculated == preBytes);
    }
    
    function getPreTransferCount(uint256 _tokenId) public view returns (uint length) {
        return preTransferCounts[_tokenId];
    }
    
    function getPreTransferByIndex(uint256 _tokenId, uint index) public view returns (PreTransfer memory) {
        return preTransfersByIndex[_tokenId][index];
    }
    
    function changeMetadataBaseUri(string calldata _uri) public isOwner {
        metadataBaseUri = _uri;
    }
    
    function transferPaymentOwnership(address newOwner) external isOwner {
        Ownable paymentToken = Ownable(paymentAddress);
        paymentToken.transferOwnership(newOwner);
    }
    
    function transferNftOwnership(address newOwner) external isOwner {
        Ownable nftToken = Ownable(nftAddress);
        nftToken.transferOwnership(newOwner);
    }
    
    function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.mint(_to, _tokenId, _uri, _payload);
    }
    
    function changeName(string calldata name, string calldata symbol) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.changeName(name, symbol);
    }
    
    function updateTokenUri(uint256 _tokenId,string memory _uri) external isOwner {
        IERC721 nftToken = IERC721(nftAddress);
        nftToken.updateTokenUri(_tokenId, _uri);
    }
    
    function getPaymentDecimals() public view returns (uint8){
        BasicERC20 token = BasicERC20(paymentAddress);
        return token.decimals();
    }
    
    function changePayment(address payment) public isOwner {
       paymentAddress = payment;
    }
    
    // function changeCoupon(address coupon) public isOwner {
    //   couponAddress = coupon;
    // }
    
    function changeRecipient(address _recipient) public isOwner {
       recipientAddress = _recipient;
    }
    
    function changeNft(address token) public isOwner {
        nftAddress = token;
    }
    
    function changePrice(uint256 _price) public isOwner {
        uint decimals = BasicERC20(paymentAddress).decimals();
        price = _price * 10 ** decimals;
    }
    
    // function changeOfferPrice(uint256 _price) public isOwner {
    //     uint decimals = BasicERC20(couponAddress).decimals();
    //     offerPrice = _price * 10 ** decimals;
    // }
    
    function addChainId(uint chainId) public isOwner returns (bool) {
        return (_addChainId(chainId));
    }
    
    function removeChainId(uint chainId) public isOwner returns (bool) {
        return (_removeChainId(chainId));
    }
    
    function transferFromChain(address _to, uint chainId, uint256 amount) public isOwner returns (bool) {
        return _transferFromChain(_to, chainId, amount);
    }
    
    function concat(string memory a, string memory b) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b));
    }
    /**
    * @dev Recover signer address from a message by using their signature
    * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
    * @param sig bytes signature, the signature is generated using web3.eth.sign(). Inclusive "0x..."
    */
    function recoverSigner(bytes32 hash, bytes memory sig) internal pure returns (address) {
        require(sig.length == 65, "Require correct length");

        bytes32 r;
        bytes32 s;
        uint8 v;

        // Divide the signature in r, s and v variables
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }

        // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
        if (v < 27) {
            v += 27;
        }

        require(v == 27 || v == 28, "Signature version not match");

        return recoverSigner2(hash, v, r, s);
    }

    function recoverSigner2(bytes32 h, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, h));
        address addr = ecrecover(prefixedHash, v, r, s);

        return addr;
    }
    
    function uintToStr(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
    function stringToBytes32(string memory source) internal pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }
    function bytes32ToStr(bytes32 _bytes32) internal pure returns (string memory) {

        // string memory str = string(_bytes32);
        // TypeError: Explicit type conversion not allowed from "bytes32" to "string storage pointer"
        // thus we should fist convert bytes32 to bytes (to dynamically-sized byte array)
    
        bytes memory bytesArray = new bytes(32);
        for (uint256 i; i < 32; i++) {
            bytesArray[i] = _bytes32[i];
            }
        return string(bytesArray);
    }
    function asciiToInteger(bytes32 x) public pure returns (uint256) {
        uint256 y;
        for (uint256 i = 0; i < 32; i++) {
            uint256 c = (uint256(x) >> (i * 8)) & 0xff;
            if (48 <= c && c <= 57)
                y += (c - 48) * 10 ** i;
            else
                break;
        }
        return y;
    }
    function toString(address account) public pure returns(string memory) {
        return toString(abi.encodePacked(account));
    }
    
    function toString(uint256 value) public pure returns(string memory) {
        return toString(abi.encodePacked(value));
    }
    
    function toString(bytes32 value) public pure returns(string memory) {
        return toString(abi.encodePacked(value));
    }
    
    function toString(bytes memory data) public pure returns(string memory) {
        bytes memory alphabet = "0123456789abcdef";
    
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"address","name":"_paymentAddress","type":"address"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"BridgeWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"addChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addClaimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"addPreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"addWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"adjustBlockWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"x","type":"bytes32"}],"name":"asciiToInteger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"buyWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_payload","type":"string"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"signedBlock","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"buyWithSignature2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"changeMetadataBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"changeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payment","type":"address"}],"name":"changePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"changeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreMintImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"image","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"name":"checkPreTransferImage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimOnChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deletePreTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"string","name":"payload","type":"string"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getAddressFromSignature","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_payload","type":"string"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreMint","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7a.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreMintByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"}],"internalType":"struct VaultHandlerV7a.PreMint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"}],"name":"getPreMintCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransfer","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7a.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPreTransferByIndex","outputs":[{"components":[{"internalType":"string","name":"payload","type":"string"},{"internalType":"bytes32","name":"preImage","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"}],"internalType":"struct VaultHandlerV7a.PreTransfer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPreTransferCount","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipientAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"removeChainId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_witness","type":"address"}],"name":"removeWitness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"toggleBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleShouldBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferNftOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferPaymentOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"code","type":"string"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"transferWithCode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"witnesses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052600a805460ff191690556003600b553480156200002057600080fd5b50604051620053ff380380620053ff8339810160408190526200004391620004f3565b600160008181557fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805460ff1990811684179091556702c68af0bb1400007fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8190557f0cb0be258cd4e0f89ef5514ec447dd8846b0cf865c7d0d8ea82ff58a1eae81a180548316851790557f0f7c2a22036bfa20acc9ee73aa9ab92bebf1413ecc0991a7c2b4d6178e9838ed8190557f2af04f721798314fc694a46b3db9f8005ee5d928ceb0c93e438e01e3ac240ed480548316851790557fdcb06883458ea50914626defda05e41b08347a7ab71dc9fa1dc89dada3554b9c8190557f7673bcbb3401a7cbae68f81d40eea2cf35afdaf7ecd016ebf3f02857fcc1260a80548316851790557f6b16ef514f22b74729cbea5cc7babfecbdc2309e530ca716643d11fe929eed2e8190557f7235287a5cb1908d23369905908658187d8d258d18d7ad15bcb288795998bcba80548316851790557f22848320af6c4894685e387cf97d56ba798f5dabcd8f3a2db70374776f0f2f9381905560fa83527f2246e3a745c1df3cc2a1c7eecb7d02c255de440492ab220c839a47c0ff0ff61f8054909216909317905560036020527fd1a8b09c64a23b2afda8cd351fe2756c44d7cad4fe3cb981d9b54c00cc07ebbc91909155600480546001600160a01b031916339081179091556040519091907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a360045462000289906001600160a01b0316620003ad565b6040518060600160405280602d8152602001620053d2602d91398051620002b99160059160209091019062000430565b5060068054600180546001600160a01b03199081166001600160a01b03888116918217845560078054909316888216179092556001600160a81b03199093166101009189169190910260ff191617179091556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b1580156200034557600080fd5b505afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000544565b60ff1690506200039281600a620005b7565b6200039e908362000675565b60095550620006ea9350505050565b6004546001600160a01b031633146200040c5760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f74206f776e657200000000000000000000000000604482015260640160405180910390fd5b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b8280546200043e9062000697565b90600052602060002090601f016020900481019282620004625760008555620004ad565b82601f106200047d57805160ff1916838001178555620004ad565b82800160010185558215620004ad579182015b82811115620004ad57825182559160200191906001019062000490565b50620004bb929150620004bf565b5090565b5b80821115620004bb5760008155600101620004c0565b80516001600160a01b0381168114620004ee57600080fd5b919050565b6000806000806080858703121562000509578384fd5b6200051485620004d6565b93506200052460208601620004d6565b92506200053460408601620004d6565b6060959095015193969295505050565b60006020828403121562000556578081fd5b815160ff8116811462000567578182fd5b9392505050565b600181815b80851115620005af578160001904821115620005935762000593620006d4565b80851615620005a157918102915b93841c939080029062000573565b509250929050565b6000620005678383600082620005d0575060016200066f565b81620005df575060006200066f565b8160018114620005f85760028114620006035762000623565b60019150506200066f565b60ff841115620006175762000617620006d4565b50506001821b6200066f565b5060208310610133831016604e8410600b841016171562000648575081810a6200066f565b6200065483836200056e565b80600019048211156200066b576200066b620006d4565b0290505b92915050565b6000816000190483118215151615620006925762000692620006d4565b500290565b600181811c90821680620006ac57607f821691505b60208210811415620006ce57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b614cd880620006fa6000396000f3fe6080604052600436106102c85760003560e01c806305691ec8146102cd5780630d7def9514610303578063158ef93e1461031a57806321d93090146103445780632754902f146103745780632e16a69e146103875780632fb102cf146103a757806330e6822c146103c757806331726da1146103e757806331b4805514610407578063321c3cf61461042157806332ca2c001461045157806336864adb1461047e578063379607f5146104a057806339f6c85e146104c05780633b442cdb146104fd5780633debbbc01461051d578063528204d01461053d5780635622bf121461055d57806356ca623e1461057d57806357cb93d91461059d578063582f1da2146105cd57806359e26be1146105ed5780635aaf27b71461060d5780635aff59991461062d5780635b6beeb91461064d5780635bf8633a1461067b5780635e1bd52a146106a0578063633423be146106c05780636900a3ae146106e057806371aad10d146107005780637224bb921461072057806373d0ffe01461074d57806379d336061461076d57806386575e401461078d578063893d20e8146107ad5780638ddc2020146107cb57806392c2bcb4146107eb578063945cfe1f1461080b57806399b2c1c71461082b5780639d75afc71461084b5780639d98eda91461086b5780639eaa56261461087e578063a035b1fe1461089e578063a111fbae146108b4578063a2b40d19146108e1578063ae2a489f14610901578063af62050014610921578063b11a19e8146106e0578063bc2bf73e14610941578063bd54c89c1461096e578063c5eeb8af1461098e578063d02b1153146109ae578063d0569c22146109ce578063d2b6447214610a04578063d31af48414610a2b578063d81fba16146104c0578063dbac26e914610a4b578063df4a529d14610a7b578063e94b770614610a9b578063ee2f13cd14610aae578063f2fde38b14610ace578063fc9a85b114610aee575b600080fd5b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516102fa91906146dd565b60405180910390f35b34801561030f57600080fd5b50610318610b0e565b005b34801561032657600080fd5b506006546103349060ff1681565b60405190151581526020016102fa565b34801561035057600080fd5b5061033461035f3660046141cf565b60026020526000908152604090205460ff1681565b6103186103823660046143ed565b610b55565b34801561039357600080fd5b506103186103a2366004613eff565b610e8e565b3480156103b357600080fd5b506103186103c2366004613fc6565b610ee1565b3480156103d357600080fd5b506103346103e236600461417b565b610f86565b3480156103f357600080fd5b50610318610402366004613eff565b610fc6565b34801561041357600080fd5b50600a546103349060ff1681565b34801561042d57600080fd5b5061033461043c366004613eff565b60166020526000908152604090205460ff1681565b34801561045d57600080fd5b5061047161046c3660046141cf565b611058565b6040516102fa9190614968565b34801561048a57600080fd5b5061049361112e565b6040516102fa9190614825565b3480156104ac57600080fd5b506103186104bb3660046141cf565b6111bc565b3480156104cc57600080fd5b506104e06104db36600461438a565b611300565b6040805193845260208401929092521515908201526060016102fa565b34801561050957600080fd5b506102ed61051836600461450a565b611382565b34801561052957600080fd5b50610318610538366004613eff565b61143f565b34801561054957600080fd5b506103186105583660046143cc565b61149f565b34801561056957600080fd5b506102ed610578366004614583565b611611565b34801561058957600080fd5b50610493610598366004613eff565b6116d6565b3480156105a957600080fd5b506103346105b83660046141cf565b60186020526000908152604090205460ff1681565b3480156105d957600080fd5b506103346105e83660046141cf565b611710565b3480156105f957600080fd5b50610318610608366004613eff565b61175e565b34801561061957600080fd5b50610318610628366004613eff565b6117ac565b34801561063957600080fd5b506007546102ed906001600160a01b031681565b34801561065957600080fd5b5061066d61066836600461427a565b6117f8565b6040519081526020016102fa565b34801561068757600080fd5b506006546102ed9061010090046001600160a01b031681565b3480156106ac57600080fd5b506103346106bb3660046143cc565b61182e565b3480156106cc57600080fd5b506001546102ed906001600160a01b031681565b3480156106ec57600080fd5b506104936106fb3660046141cf565b611aa8565b34801561070c57600080fd5b5061049361071b366004614248565b611ac0565b34801561072c57600080fd5b5061066d61073b3660046141cf565b60036020526000908152604090205481565b34801561075957600080fd5b50610318610768366004613eff565b611d56565b34801561077957600080fd5b506102ed6107883660046141ff565b611da2565b34801561079957600080fd5b506103186107a83660046142b9565b611dee565b3480156107b957600080fd5b506004546001600160a01b03166102ed565b3480156107d757600080fd5b506103186107e6366004613eff565b611e8d565b3480156107f757600080fd5b50610318610806366004613eff565b611edf565b34801561081757600080fd5b506104716108263660046143cc565b611f2b565b34801561083757600080fd5b5061066d6108463660046141cf565b61200d565b34801561085757600080fd5b50610318610866366004613f9b565b61209c565b6103186108793660046140e0565b61216c565b34801561088a57600080fd5b506102ed6108993660046144bd565b612678565b3480156108aa57600080fd5b5061066d60095481565b3480156108c057600080fd5b5061066d6108cf3660046141cf565b60009081526011602052604090205490565b3480156108ed57600080fd5b506103186108fc3660046141cf565b6126e0565b34801561090d57600080fd5b5061031861091c3660046141cf565b6127a8565b34801561092d57600080fd5b5061031861093c3660046141cf565b612a94565b34801561094d57600080fd5b5061096161095c366004613f9b565b612ac3565b6040516102fa9190614936565b34801561097a57600080fd5b5061031861098936600461427a565b612b9b565b34801561099a57600080fd5b506103346109a93660046141cf565b612bd6565b3480156109ba57600080fd5b506103186109c9366004613f37565b612c20565b3480156109da57600080fd5b5061066d6109e9366004613eff565b6001600160a01b03166000908152600e602052604090205490565b348015610a1057600080fd5b50610a19612e86565b60405160ff90911681526020016102fa565b348015610a3757600080fd5b50610318610a46366004614479565b612f0c565b348015610a5757600080fd5b50610334610a66366004613eff565b60156020526000908152604090205460ff1681565b348015610a8757600080fd5b50610318610a963660046141cf565b612fa5565b610318610aa936600461404e565b6130be565b348015610aba57600080fd5b50610318610ac9366004613eff565b613468565b348015610ada57600080fd5b50610318610ae9366004613eff565b6134b3565b348015610afa57600080fd5b50610961610b09366004613f9b565b613539565b6004546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890614862565b60405180910390fd5b600a805460ff19811660ff90911615179055565b3360009081526015602052604090205460ff1615610b855760405162461bcd60e51b8152600401610b3890614907565b60166000610b94888585612678565b6001600160a01b0316815260208101919091526040016000205460ff16610bcd5760405162461bcd60e51b8152600401610b389061488f565b6006546000878152600f602052604080822081516060810190925280546101009094046001600160a01b03169382908290610c0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3390614bc1565b8015610c805780601f10610c5557610100808354040283529160200191610c80565b820191906000526020600020905b815481529060010190602001808311610c6357829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610cc0918a918a910161469e565b60408051601f1981840301815290829052610cda91614660565b602060405180830381855afa158015610cf7573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d1a91906141e7565b816020015114610d625760405162461bcd60e51b8152602060048201526013602482015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b6044820152606401610b38565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610d96919089908d906004016146f1565b600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b5050506000898152600f602052604081209150610de18282613c6b565b50600060018201819055600290910180546001600160a01b031916905588815260106020908152604080832060118352818420548452909152812090610e278282613c6b565b5060006001828101829055600290920180546001600160a01b031916905589815260116020526040902054610e5b9161357d565b6000988952601160209081526040808b20929092559489526017909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601560205260409020805460ff19811660ff90911615179055565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610b3890614862565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610f4b908a908a908a908a908a908a90600401614772565b600060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b3890614862565b610fbe8484846135c6565b949350505050565b6004546001600160a01b03163314610ff05760405162461bcd60e51b8152600401610b3890614862565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b906110229085906004016146dd565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b505050505050565b611060613ca8565b6000828152600f60205260409081902081516060810190925280548290829061108890614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b490614bc1565b80156111015780601f106110d657610100808354040283529160200191611101565b820191906000526020600020905b8154815290600101906020018083116110e457829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015292915050565b6005805461113b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461116790614bc1565b80156111b45780601f10611189576101008083540402835291602001916111b4565b820191906000526020600020905b81548152906001019060200180831161119757829003601f168201915b505050505081565b6004546001600160a01b031633146111e65760405162461bcd60e51b8152600401610b3890614862565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492611227926101009004169087908790600401614715565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127991906141af565b156112965760405162461bcd60e51b8152600401610b38906148de565b600654604051630852cd8d60e31b8152600481018590526101009091046001600160a01b03169081906342966c6890602401600060405180830381600087803b1580156112e257600080fd5b505af11580156112f6573d6000803e3d6000fd5b5050505050505050565b6000806000806002866040516020016113199190614660565b60408051601f198184030181529082905261133391614660565b602060405180830381855afa158015611350573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061137391906141e7565b96949550505083851492915050565b60008481526017602052604081205460ff161561139e57600080fd5b60006113e86113ac8861373d565b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b905060006113fe826113f98961373d565b613856565b60405160200161140e9190614660565b60405160208183030381529060405280519060200120905060006114328286613882565b9998505050505050505050565b6004546001600160a01b031633146114695760405162461bcd60e51b8152600401610b3890614862565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b906110229085906004016146dd565b6114a882613962565b156114ed5760405162461bcd60e51b8152602060048201526015602482015274223ab83634b1b0ba3290283932aa3930b739b332b960591b6044820152606401610b38565b600082815260116020526040902054611507906001613a2c565b600083815260116020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600f82529290912082518051919261156a92849290910190613cc8565b506020828101516001830155604092830151600290920180546001600160a01b0319166001600160a01b03909316929092179091556000848152600f82528281206010835283822060118452848320548352909252919091208154819083906115d290614bc1565b6115dd929190613d4c565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008581526017602052604081205460ff161561162d57600080fd5b600061168361167a61163e8a61373d565b88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b6113f98661373d565b90506000611694826113f98a61373d565b6040516020016116a49190614660565b60405160208183030381529060405280519060200120905060006116c88286613882565b9a9950505050505050505050565b604051606082811b6001600160601b03191660208301529061170a906034015b604051602081830303815290604052611ac0565b92915050565b6004546000906001600160a01b0316331461173d5760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff1916600190811790915561170a565b6004546001600160a01b031633146117885760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6004546001600160a01b031633146117d65760405162461bcd60e51b8152600401610b3890614862565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080838360405160200161180e92919061469e565b60408051808303601f190181529190528051602090910120949350505050565b60008281526002602052604081205460ff1661185c5760405162461bcd60e51b8152600401610b3890614838565b6001546001600160a01b0316828163dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906141e7565b10156119365760405162461bcd60e51b815260206004820152601860248201527702430b7323632b9103ab730b13632903a379039b832b732160451b6044820152606401610b38565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611966903390309088906004016146f1565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906141af565b6119d45760405162461bcd60e51b8152600401610b38906148b6565b600154604051630852cd8d60e31b8152600481018590526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050600085815260036020526040902054611a4b915084613a2c565b60008581526003602052604090205582336001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c86604051611a9691815260200190565b60405180910390a35060019392505050565b606061170a826040516020016116f691815260200190565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090611afb906002614b5b565b611b06906002614a1f565b6001600160401b03811115611b2b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b55576020820181803683370190505b509050600360fc1b81600081518110611b7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611bbb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b8451811015611d4e57826004868381518110611c0157634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110611c3757634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611c52836002614b5b565b611c5d906002614a1f565b81518110611c7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535082858281518110611cb357634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f16908110611ce157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611cfc836002614b5b565b611d07906003614a1f565b81518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535080611d4681614bfc565b915050611bd5565b509392505050565b6004546001600160a01b03163314611d805760405162461bcd60e51b8152600401610b3890614862565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080611de58585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061388292505050565b95945050505050565b6004546001600160a01b03163314611e185760405162461bcd60e51b8152600401610b3890614862565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611e549088908890889088906004016147f3565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610b3890614862565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611f095760405162461bcd60e51b8152600401610b3890614862565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611f33613ca8565b600083815260106020908152604080832085845290915290819020815160608101909252805482908290611f6690614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290614bc1565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015612095576000612029826008614b5b565b8560001c901c60ff16905080603011158015612046575060398111155b1561207c5761205682600a614ab3565b612061603083614b7a565b61206b9190614b5b565b6120759084614a1f565b9250612082565b50612095565b508061208d81614bfc565b915050612013565b5092915050565b6004546001600160a01b031633146120c65760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b0382166000908152600d60209081526040808320600e83528184205484529091528120906120fb8282613c6b565b50600060019182018190556001600160a01b0384168152600e60205260409020546121259161357d565b6001600160a01b0383166000908152600e6020908152604080832093909355600c815282822084835290529081209061215e8282613c6b565b600182016000905550505050565b3360009081526015602052604090205460ff161561219c5760405162461bcd60e51b8152600401610b3890614907565b6060436121b4600b5486613a2c90919063ffffffff16565b116121f55760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610b38565b6008546006546040516305fbdf1560e21b81526001600160a01b03928316926317ef7c549261223492610100909104909116908c908690600401614715565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906141af565b1580156122a2575060008881526018602052604090205460ff16155b6122e05760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610b38565b600654600a546101009091046001600160a01b03169060ff161561240d576001546009546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161233391339130916004016146f1565b602060405180830381600087803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238591906141af565b6123a15760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916123d69160040190815260200190565b600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b505050506124b6565b6001546007546009546040516323b872dd60e01b81526001600160a01b03938416936323b872dd9361244893339392909116916004016146f1565b602060405180830381600087803b15801561246257600080fd5b505af1158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a91906141af565b6124b65760405162461bcd60e51b8152600401610b38906148b6565b60006124fc8a888b8b8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161192505050565b6001600160a01b03811660009081526016602052604090205490915060ff166125375760405162461bcd60e51b8152600401610b389061488f565b6000878152601760205260408120805460ff19166001179055600580546125e9919061256290614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461258e90614bc1565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050506113f98d61373d565b9050826001600160a01b0316632fb102cf8d8d848e8e6040518663ffffffff1660e01b815260040161261f9594939291906147ad565b600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b50505060009b8c525050601860205250506040909720805460ff191660011790555050505050505050565b60008281526017602052604081205460ff161561269457600080fd5b60006126a261167a8661373d565b6040516020016126b29190614660565b60405160208183030381529060405280519060200120905060006126d68285613882565b9695505050505050565b6004546001600160a01b0316331461270a5760405162461bcd60e51b8152600401610b3890614862565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906145ea565b60ff16905061279781600a614ab3565b6127a19083614b5b565b6009555050565b600260005414156127fb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b38565b600260009081553381526015602052604090205460ff161561282f5760405162461bcd60e51b8152600401610b3890614907565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492612870926101009004169087908790600401614715565b602060405180830381600087803b15801561288a57600080fd5b505af115801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c291906141af565b156128df5760405162461bcd60e51b8152600401610b38906148de565b60065461010090046001600160a01b0316336040516331a9108f60e11b8152600481018690526001600160a01b0391821691831690636352211e90602401602060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190613f1b565b6001600160a01b0316146129b75760405162461bcd60e51b815260206004820152600f60248201526e2737ba102a37b5b2b71027bbb732b960891b6044820152606401610b38565b604051630852cd8d60e31b8152600481018590526001600160a01b038216906342966c6890602401600060405180830381600087803b1580156129f957600080fd5b505af1158015612a0d573d6000803e3d6000fd5b5050600654604080516304f4b51360e51b81526101009092046001600160a01b0390811660048401526024830189905233604484015290519086169350639e96a2609250606480830192600092919082900301818387803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b50506001600055505050505050565b6004546001600160a01b03163314612abe5760405162461bcd60e51b8152600401610b3890614862565b600b55565b612acb613dc7565b6001600160a01b0383166000908152600d60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3390614bc1565b8015612b805780601f10612b5557610100808354040283529160200191612b80565b820191906000526020600020905b815481529060010190602001808311612b6357829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314612bc55760405162461bcd60e51b8152600401610b3890614862565b612bd160058383613ddf565b505050565b6004546000906001600160a01b03163314612c035760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff19169055600161170a565b6004546001600160a01b03163314612c4a5760405162461bcd60e51b8152600401610b3890614862565b600654604051634d6ca91960e11b8152600481018490526101009091046001600160a01b031690639ad952329060240160006040518083038186803b158015612c9257600080fd5b505afa925050508015612cc757506040513d6000823e601f3d908101601f19168201604052612cc49190810190614321565b60015b612e3d57612cd58583613a89565b15612d165760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948141c99535a5b9d607a1b6044820152606401610b38565b6001600160a01b0385166000908152600e6020526040902054612d3a906001613a2c565b6001600160a01b0386166000908152600e6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600c8252604080822086835283529020825180519192612dcc92849290910190613cc8565b506020918201516001909101556001600160a01b0386166000818152600c835260408082208683528452808220928252600d8452808220600e855281832054835290935291909120815481908390612e2390614bc1565b612e2e929190613d4c565b50600191820154910155612e7f565b60405162461bcd60e51b815260206004820152601760248201527613919508115e1a5cdd1cc81dda5d1a081d1a1a5cc81251604a1b6044820152606401610b38565b5050505050565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0691906145ea565b91505090565b6004546001600160a01b03163314612f365760405162461bcd60e51b8152600401610b3890614862565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af48490612f6e90869086906004016149af565b600060405180830381600087803b158015612f8857600080fd5b505af1158015612f9c573d6000803e3d6000fd5b50505050505050565b6000818152600f60205260409020600201546001600160a01b0316331461301c5760405162461bcd60e51b815260206004820152602560248201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360448201526432b73232b960d91b6064820152608401610b38565b6000818152601060209081526040808320601183528184205484529091528120906130478282613c6b565b5060006001828101829055600290920180546001600160a01b03191690558281526011602052604090205461307b9161357d565b600082815260116020908152604080832093909355600f9052908120906130a28282613c6b565b506000600182015560020180546001600160a01b031916905550565b6004546001600160a01b031633146130e85760405162461bcd60e51b8152600401610b3890614862565b600154600654600a546001600160a01b03928316926101009092049091169060ff161561321b576009546040516323b872dd60e01b81526001600160a01b038416916323b872dd916131419133913091906004016146f1565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319391906141af565b6131af5760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916131e49160040190815260200190565b600060405180830381600087803b1580156131fe57600080fd5b505af1158015613212573d6000803e3d6000fd5b505050506132c0565b6007546009546040516323b872dd60e01b81526001600160a01b03858116936323b872dd93613252933393909216916004016146f1565b602060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141af565b6132c05760405162461bcd60e51b8152600401610b38906148b6565b600061330589878a8a89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138292505050565b6001600160a01b03811660009081526016602052604090205490915060ff166133405760405162461bcd60e51b8152600401610b389061488f565b6000868152601760205260408120805460ff19166001179055600580546133f2919061336b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461339790614bc1565b80156133e45780601f106133b9576101008083540402835291602001916133e4565b820191906000526020600020905b8154815290600101906020018083116133c757829003601f168201915b50505050506113f98c61373d565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf90613429908e908e9086908f908f906004016147ad565b600060405180830381600087803b15801561344357600080fd5b505af1158015613457573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146134925760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6004546001600160a01b031633146134dd5760405162461bcd60e51b8152600401610b3890614862565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b613541613dc7565b6001600160a01b0383166000908152600c60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b60006135bf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b69565b9392505050565b6000828152600360205260408120548211156136305760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736044820152631a5d195960e21b6064820152608401610b38565b60008381526002602052604090205460ff1661365e5760405162461bcd60e51b8152600401610b3890614838565b6001546040516340c10f1960e01b81526001600160a01b038681166004830152602482018590529091169081906340c10f1990604401600060405180830381600087803b1580156136ae57600080fd5b505af11580156136c2573d6000803e3d6000fd5b5050506000858152600360205260409020546136df91508461357d565b60008581526003602052604090205582336001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc9138660405161372a91815260200190565b60405180910390a3506001949350505050565b6060816137615750506040805180820190915260018152600360fc1b602082015290565b8160005b811561378b578061377581614bfc565b91506137849050600a83614a5c565b9150613765565b6000816001600160401b038111156137b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137dd576020820181803683370190505b5090505b8415610fbe576137f2600183614b7a565b91506137ff600a86614c17565b61380a906030614a1f565b60f81b81838151811061382d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061384f600a86614a5c565b94506137e1565b6060828260405160200161386b9291906146ae565b604051602081830303815290604052905092915050565b600081516041146138ce5760405162461bcd60e51b81526020600482015260166024820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b6044820152606401610b38565b60208201516040830151606084015160001a601b8110156138f7576138f4601b82614a37565b90505b8060ff16601b148061390c57508060ff16601c145b6139565760405162461bcd60e51b815260206004820152601b60248201527a0a6d2cedcc2e8eae4ca40eccae4e6d2dedc40dcdee840dac2e8c6d602b1b6044820152606401610b38565b6126d686828585613b9a565b6000818152600f60205260408120805482919061397e90614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546139aa90614bc1565b80156139f75780601f106139cc576101008083540402835291602001916139f7565b820191906000526020600020905b8154815290600101906020018083116139da57829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c8383398151915214159695505050505050565b600080613a398385614a1f565b9050838110156135bf5760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610b38565b6001600160a01b0382166000908152600c6020908152604080832084845290915281208054829190613aba90614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae690614bc1565b8015613b335780601f10613b0857610100808354040283529160200191613b33565b820191906000526020600020905b815481529060010190602001808311613b1657829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c838339815191521415979650505050505050565b60008184841115613b8d5760405162461bcd60e51b8152600401610b389190614825565b506000611de58486614b7a565b6000806040518060400160405280601c81526020017b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b815250905060008187604051602001613be992919061467c565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015613c54573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b508054613c7790614bc1565b6000825580601f10613c87575050565b601f016020900490600052602060002090810190613ca59190613e53565b50565b604080516060808201835281526000602082018190529181019190915290565b828054613cd490614bc1565b90600052602060002090601f016020900481019282613cf65760008555613d3c565b82601f10613d0f57805160ff1916838001178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578251825591602001919060010190613d21565b50613d48929150613e53565b5090565b828054613d5890614bc1565b90600052602060002090601f016020900481019282613d7a5760008555613d3c565b82601f10613d8b5780548555613d3c565b82800160010185558215613d3c57600052602060002091601f016020900482015b82811115613d3c578254825591600101919060010190613dac565b60408051808201909152606081526000602082015290565b828054613deb90614bc1565b90600052602060002090601f016020900481019282613e0d5760008555613d3c565b82601f10613e265782800160ff19823516178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578235825591602001919060010190613e38565b5b80821115613d485760008155600101613e54565b60008083601f840112613e79578182fd5b5081356001600160401b03811115613e8f578182fd5b602083019150836020828501011115613ea757600080fd5b9250929050565b600082601f830112613ebe578081fd5b8135613ed1613ecc826149f8565b6149c8565b818152846020838601011115613ee5578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613f10578081fd5b81356135bf81614c6d565b600060208284031215613f2c578081fd5b81516135bf81614c6d565b600080600080600060808688031215613f4e578081fd5b8535613f5981614c6d565b945060208601356001600160401b03811115613f73578182fd5b613f7f88828901613e68565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613fad578182fd5b8235613fb881614c6d565b946020939093013593505050565b60008060008060008060808789031215613fde578081fd5b8635613fe981614c6d565b95506020870135945060408701356001600160401b038082111561400b578283fd5b6140178a838b01613e68565b9096509450606089013591508082111561402f578283fd5b5061403c89828a01613e68565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215614068578081fd5b873561407381614c6d565b96506020880135955060408801356001600160401b0380821115614095578283fd5b6140a18b838c01613e68565b909750955060608a0135945060808a01359150808211156140c0578283fd5b506140cd8a828b01613e68565b989b979a50959850939692959293505050565b60008060008060008060008060c0898b0312156140fb578182fd5b883561410681614c6d565b97506020890135965060408901356001600160401b0380821115614128578384fd5b6141348c838d01613e68565b909850965060608b0135955060808b0135945060a08b013591508082111561415a578384fd5b506141678b828c01613e68565b999c989b5096995094979396929594505050565b60008060006060848603121561418f578081fd5b833561419a81614c6d565b95602085013595506040909401359392505050565b6000602082840312156141c0578081fd5b815180151581146135bf578182fd5b6000602082840312156141e0578081fd5b5035919050565b6000602082840312156141f8578081fd5b5051919050565b600080600060408486031215614213578081fd5b8335925060208401356001600160401b0381111561422f578182fd5b61423b86828701613e68565b9497909650939450505050565b600060208284031215614259578081fd5b81356001600160401b0381111561426e578182fd5b610fbe84828501613eae565b6000806020838503121561428c578182fd5b82356001600160401b038111156142a1578283fd5b6142ad85828601613e68565b90969095509350505050565b600080600080604085870312156142ce578182fd5b84356001600160401b03808211156142e4578384fd5b6142f088838901613e68565b90965094506020870135915080821115614308578384fd5b5061431587828801613e68565b95989497509550505050565b600060208284031215614332578081fd5b81516001600160401b03811115614347578182fd5b8201601f81018413614357578182fd5b8051614365613ecc826149f8565b818152856020838501011115614379578384fd5b611de5826020830160208601614b91565b6000806040838503121561439c578182fd5b82356001600160401b038111156143b1578283fd5b6143bd85828601613eae565b95602094909401359450505050565b600080604083850312156143de578182fd5b50508035926020909101359150565b60008060008060008060a08789031215614405578384fd5b8635955060208701356001600160401b0380821115614422578586fd5b61442e8a838b01613e68565b90975095506040890135915061444382614c6d565b909350606088013592506080880135908082111561445f578283fd5b5061446c89828a01613eae565b9150509295509295509295565b6000806040838503121561448b578182fd5b8235915060208301356001600160401b038111156144a7578182fd5b6144b385828601613eae565b9150509250929050565b6000806000606084860312156144d1578081fd5b833592506020840135915060408401356001600160401b038111156144f4578182fd5b61450086828701613eae565b9150509250925092565b600080600080600060808688031215614521578283fd5b853594506020860135935060408601356001600160401b0380821115614545578485fd5b61455189838a01613e68565b90955093506060880135915080821115614569578283fd5b5061457688828901613eae565b9150509295509295909350565b60008060008060008060a0878903121561459b578384fd5b863595506020870135945060408701356001600160401b03808211156145bf578586fd5b6145cb8a838b01613e68565b909650945060608901359350608089013591508082111561445f578283fd5b6000602082840312156145fb578081fd5b815160ff811681146135bf578182fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261464c816020860160208601614b91565b601f01601f19169290920160200192915050565b60008251614672818460208701614b91565b9190910192915050565b6000835161468e818460208801614b91565b9190910191825250602001919050565b8183823760009101908152919050565b600083516146c0818460208801614b91565b8351908301906146d4818360208801614b91565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038416815260208082018490526060604083018190528351908301819052600091848101916080850190845b8181101561476457845183529383019391830191600101614748565b509098975050505050505050565b60018060a01b038716815285602082015260806040820152600061479a60808301868861460b565b828103606084015261143281858761460b565b60018060a01b03861681528460208201526080604082015260006147d46080830186614634565b82810360608401526147e781858761460b565b98975050505050505050565b60408152600061480760408301868861460b565b828103602084015261481a81858761460b565b979650505050505050565b6020815260006135bf6020830184614634565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b6020808252600f908201526e105b1c9958591e4810db185a5b5959608a1b604082015260600190565b60208082526015908201527410d85b1b195c881a5cc8189b1858dadb1a5cdd1959605a1b604082015260600190565b6020815260008251604060208401526149526060840182614634565b9050602084015160408401528091505092915050565b6020815260008251606060208401526149846080840182614634565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b828152604060208201526000610fbe6040830184614634565b604051601f8201601f191681016001600160401b03811182821017156149f0576149f0614c57565b604052919050565b60006001600160401b03821115614a1157614a11614c57565b50601f01601f191660200190565b60008219821115614a3257614a32614c2b565b500190565b600060ff821660ff84168060ff03821115614a5457614a54614c2b565b019392505050565b600082614a6b57614a6b614c41565b500490565b600181815b80851115614aab578160001904821115614a9157614a91614c2b565b80851615614a9e57918102915b93841c9390800290614a75565b509250929050565b60006135bf8383600082614ac95750600161170a565b81614ad65750600061170a565b8160018114614aec5760028114614af657614b12565b600191505061170a565b60ff841115614b0757614b07614c2b565b50506001821b61170a565b5060208310610133831016604e8410600b8410161715614b35575081810a61170a565b614b3f8383614a70565b8060001904821115614b5357614b53614c2b565b029392505050565b6000816000190483118215151615614b7557614b75614c2b565b500290565b600082821015614b8c57614b8c614c2b565b500390565b60005b83811015614bac578181015183820152602001614b94565b83811115614bbb576000848401525b50505050565b600181811c90821680614bd557607f821691505b60208210811415614bf657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c1057614c10614c2b565b5060010190565b600082614c2657614c26614c41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613ca557600080fdfec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470a2646970667358221220b7d58c8a4a6eea7b845d2c030aa15aaefdc9acd05d931347dafcea1bc2b4db1f64736f6c6343000804003368747470733a2f2f6170692e656d626c656d7661756c742e696f2f733a65766d657461646174612f6d6574612f00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a3190100000000000000000000000000000000000000000000000000000000000000fa

Deployed Bytecode

0x6080604052600436106102c85760003560e01c806305691ec8146102cd5780630d7def9514610303578063158ef93e1461031a57806321d93090146103445780632754902f146103745780632e16a69e146103875780632fb102cf146103a757806330e6822c146103c757806331726da1146103e757806331b4805514610407578063321c3cf61461042157806332ca2c001461045157806336864adb1461047e578063379607f5146104a057806339f6c85e146104c05780633b442cdb146104fd5780633debbbc01461051d578063528204d01461053d5780635622bf121461055d57806356ca623e1461057d57806357cb93d91461059d578063582f1da2146105cd57806359e26be1146105ed5780635aaf27b71461060d5780635aff59991461062d5780635b6beeb91461064d5780635bf8633a1461067b5780635e1bd52a146106a0578063633423be146106c05780636900a3ae146106e057806371aad10d146107005780637224bb921461072057806373d0ffe01461074d57806379d336061461076d57806386575e401461078d578063893d20e8146107ad5780638ddc2020146107cb57806392c2bcb4146107eb578063945cfe1f1461080b57806399b2c1c71461082b5780639d75afc71461084b5780639d98eda91461086b5780639eaa56261461087e578063a035b1fe1461089e578063a111fbae146108b4578063a2b40d19146108e1578063ae2a489f14610901578063af62050014610921578063b11a19e8146106e0578063bc2bf73e14610941578063bd54c89c1461096e578063c5eeb8af1461098e578063d02b1153146109ae578063d0569c22146109ce578063d2b6447214610a04578063d31af48414610a2b578063d81fba16146104c0578063dbac26e914610a4b578063df4a529d14610a7b578063e94b770614610a9b578063ee2f13cd14610aae578063f2fde38b14610ace578063fc9a85b114610aee575b600080fd5b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516102fa91906146dd565b60405180910390f35b34801561030f57600080fd5b50610318610b0e565b005b34801561032657600080fd5b506006546103349060ff1681565b60405190151581526020016102fa565b34801561035057600080fd5b5061033461035f3660046141cf565b60026020526000908152604090205460ff1681565b6103186103823660046143ed565b610b55565b34801561039357600080fd5b506103186103a2366004613eff565b610e8e565b3480156103b357600080fd5b506103186103c2366004613fc6565b610ee1565b3480156103d357600080fd5b506103346103e236600461417b565b610f86565b3480156103f357600080fd5b50610318610402366004613eff565b610fc6565b34801561041357600080fd5b50600a546103349060ff1681565b34801561042d57600080fd5b5061033461043c366004613eff565b60166020526000908152604090205460ff1681565b34801561045d57600080fd5b5061047161046c3660046141cf565b611058565b6040516102fa9190614968565b34801561048a57600080fd5b5061049361112e565b6040516102fa9190614825565b3480156104ac57600080fd5b506103186104bb3660046141cf565b6111bc565b3480156104cc57600080fd5b506104e06104db36600461438a565b611300565b6040805193845260208401929092521515908201526060016102fa565b34801561050957600080fd5b506102ed61051836600461450a565b611382565b34801561052957600080fd5b50610318610538366004613eff565b61143f565b34801561054957600080fd5b506103186105583660046143cc565b61149f565b34801561056957600080fd5b506102ed610578366004614583565b611611565b34801561058957600080fd5b50610493610598366004613eff565b6116d6565b3480156105a957600080fd5b506103346105b83660046141cf565b60186020526000908152604090205460ff1681565b3480156105d957600080fd5b506103346105e83660046141cf565b611710565b3480156105f957600080fd5b50610318610608366004613eff565b61175e565b34801561061957600080fd5b50610318610628366004613eff565b6117ac565b34801561063957600080fd5b506007546102ed906001600160a01b031681565b34801561065957600080fd5b5061066d61066836600461427a565b6117f8565b6040519081526020016102fa565b34801561068757600080fd5b506006546102ed9061010090046001600160a01b031681565b3480156106ac57600080fd5b506103346106bb3660046143cc565b61182e565b3480156106cc57600080fd5b506001546102ed906001600160a01b031681565b3480156106ec57600080fd5b506104936106fb3660046141cf565b611aa8565b34801561070c57600080fd5b5061049361071b366004614248565b611ac0565b34801561072c57600080fd5b5061066d61073b3660046141cf565b60036020526000908152604090205481565b34801561075957600080fd5b50610318610768366004613eff565b611d56565b34801561077957600080fd5b506102ed6107883660046141ff565b611da2565b34801561079957600080fd5b506103186107a83660046142b9565b611dee565b3480156107b957600080fd5b506004546001600160a01b03166102ed565b3480156107d757600080fd5b506103186107e6366004613eff565b611e8d565b3480156107f757600080fd5b50610318610806366004613eff565b611edf565b34801561081757600080fd5b506104716108263660046143cc565b611f2b565b34801561083757600080fd5b5061066d6108463660046141cf565b61200d565b34801561085757600080fd5b50610318610866366004613f9b565b61209c565b6103186108793660046140e0565b61216c565b34801561088a57600080fd5b506102ed6108993660046144bd565b612678565b3480156108aa57600080fd5b5061066d60095481565b3480156108c057600080fd5b5061066d6108cf3660046141cf565b60009081526011602052604090205490565b3480156108ed57600080fd5b506103186108fc3660046141cf565b6126e0565b34801561090d57600080fd5b5061031861091c3660046141cf565b6127a8565b34801561092d57600080fd5b5061031861093c3660046141cf565b612a94565b34801561094d57600080fd5b5061096161095c366004613f9b565b612ac3565b6040516102fa9190614936565b34801561097a57600080fd5b5061031861098936600461427a565b612b9b565b34801561099a57600080fd5b506103346109a93660046141cf565b612bd6565b3480156109ba57600080fd5b506103186109c9366004613f37565b612c20565b3480156109da57600080fd5b5061066d6109e9366004613eff565b6001600160a01b03166000908152600e602052604090205490565b348015610a1057600080fd5b50610a19612e86565b60405160ff90911681526020016102fa565b348015610a3757600080fd5b50610318610a46366004614479565b612f0c565b348015610a5757600080fd5b50610334610a66366004613eff565b60156020526000908152604090205460ff1681565b348015610a8757600080fd5b50610318610a963660046141cf565b612fa5565b610318610aa936600461404e565b6130be565b348015610aba57600080fd5b50610318610ac9366004613eff565b613468565b348015610ada57600080fd5b50610318610ae9366004613eff565b6134b3565b348015610afa57600080fd5b50610961610b09366004613f9b565b613539565b6004546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890614862565b60405180910390fd5b600a805460ff19811660ff90911615179055565b3360009081526015602052604090205460ff1615610b855760405162461bcd60e51b8152600401610b3890614907565b60166000610b94888585612678565b6001600160a01b0316815260208101919091526040016000205460ff16610bcd5760405162461bcd60e51b8152600401610b389061488f565b6006546000878152600f602052604080822081516060810190925280546101009094046001600160a01b03169382908290610c0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3390614bc1565b8015610c805780601f10610c5557610100808354040283529160200191610c80565b820191906000526020600020905b815481529060010190602001808311610c6357829003601f168201915b505050918352505060018201546020808301919091526002928301546001600160a01b031660409283015290519293509091610cc0918a918a910161469e565b60408051601f1981840301815290829052610cda91614660565b602060405180830381855afa158015610cf7573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d1a91906141e7565b816020015114610d625760405162461bcd60e51b8152602060048201526013602482015272086dec8ca40c8decae640dcdee840dac2e8c6d606b1b6044820152606401610b38565b60408082015190516323b872dd60e01b81526001600160a01b038416916323b872dd91610d96919089908d906004016146f1565b600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b5050506000898152600f602052604081209150610de18282613c6b565b50600060018201819055600290910180546001600160a01b031916905588815260106020908152604080832060118352818420548452909152812090610e278282613c6b565b5060006001828101829055600290920180546001600160a01b031916905589815260116020526040902054610e5b9161357d565b6000988952601160209081526040808b20929092559489526017909452505050909320805460ff19166001179055505050565b6004546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601560205260409020805460ff19811660ff90911615179055565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610b3890614862565b600654604051632fb102cf60e01b81526101009091046001600160a01b0316908190632fb102cf90610f4b908a908a908a908a908a908a90600401614772565b600060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b5050505050505050505050565b6004546000906001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b3890614862565b610fbe8484846135c6565b949350505050565b6004546001600160a01b03163314610ff05760405162461bcd60e51b8152600401610b3890614862565b60015460405163f2fde38b60e01b81526001600160a01b0390911690819063f2fde38b906110229085906004016146dd565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b505050505050565b611060613ca8565b6000828152600f60205260409081902081516060810190925280548290829061108890614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b490614bc1565b80156111015780601f106110d657610100808354040283529160200191611101565b820191906000526020600020905b8154815290600101906020018083116110e457829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b031660409091015292915050565b6005805461113b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461116790614bc1565b80156111b45780601f10611189576101008083540402835291602001916111b4565b820191906000526020600020905b81548152906001019060200180831161119757829003601f168201915b505050505081565b6004546001600160a01b031633146111e65760405162461bcd60e51b8152600401610b3890614862565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492611227926101009004169087908790600401614715565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127991906141af565b156112965760405162461bcd60e51b8152600401610b38906148de565b600654604051630852cd8d60e31b8152600481018590526101009091046001600160a01b03169081906342966c6890602401600060405180830381600087803b1580156112e257600080fd5b505af11580156112f6573d6000803e3d6000fd5b5050505050505050565b6000806000806002866040516020016113199190614660565b60408051601f198184030181529082905261133391614660565b602060405180830381855afa158015611350573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061137391906141e7565b96949550505083851492915050565b60008481526017602052604081205460ff161561139e57600080fd5b60006113e86113ac8861373d565b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b905060006113fe826113f98961373d565b613856565b60405160200161140e9190614660565b60405160208183030381529060405280519060200120905060006114328286613882565b9998505050505050505050565b6004546001600160a01b031633146114695760405162461bcd60e51b8152600401610b3890614862565b60065460405163f2fde38b60e01b81526101009091046001600160a01b031690819063f2fde38b906110229085906004016146dd565b6114a882613962565b156114ed5760405162461bcd60e51b8152602060048201526015602482015274223ab83634b1b0ba3290283932aa3930b739b332b960591b6044820152606401610b38565b600082815260116020526040902054611507906001613a2c565b600083815260116020908152604080832093909355825160a081018452600760608201908152661c185e5b1bd85960ca1b608083015281528082018590523381850152858352600f82529290912082518051919261156a92849290910190613cc8565b506020828101516001830155604092830151600290920180546001600160a01b0319166001600160a01b03909316929092179091556000848152600f82528281206010835283822060118452848320548352909252919091208154819083906115d290614bc1565b6115dd929190613d4c565b5060018281015490820155600291820154910180546001600160a01b0319166001600160a01b039092169190911790555050565b60008581526017602052604081205460ff161561162d57600080fd5b600061168361167a61163e8a61373d565b88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061385692505050565b6113f98661373d565b90506000611694826113f98a61373d565b6040516020016116a49190614660565b60405160208183030381529060405280519060200120905060006116c88286613882565b9a9950505050505050505050565b604051606082811b6001600160601b03191660208301529061170a906034015b604051602081830303815290604052611ac0565b92915050565b6004546000906001600160a01b0316331461173d5760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff1916600190811790915561170a565b6004546001600160a01b031633146117885760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6004546001600160a01b031633146117d65760405162461bcd60e51b8152600401610b3890614862565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080838360405160200161180e92919061469e565b60408051808303601f190181529190528051602090910120949350505050565b60008281526002602052604081205460ff1661185c5760405162461bcd60e51b8152600401610b3890614838565b6001546001600160a01b0316828163dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906141e7565b10156119365760405162461bcd60e51b815260206004820152601860248201527702430b7323632b9103ab730b13632903a379039b832b732160451b6044820152606401610b38565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90611966903390309088906004016146f1565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906141af565b6119d45760405162461bcd60e51b8152600401610b38906148b6565b600154604051630852cd8d60e31b8152600481018590526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050600085815260036020526040902054611a4b915084613a2c565b60008581526003602052604090205582336001600160a01b03167fed2432d91de9329ae454049df81fd5d6b856c4470096ca37a29c1fe111f57f0c86604051611a9691815260200190565b60405180910390a35060019392505050565b606061170a826040516020016116f691815260200190565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090611afb906002614b5b565b611b06906002614a1f565b6001600160401b03811115611b2b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b55576020820181803683370190505b509050600360fc1b81600081518110611b7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611bbb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b8451811015611d4e57826004868381518110611c0157634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110611c3757634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611c52836002614b5b565b611c5d906002614a1f565b81518110611c7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535082858281518110611cb357634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f16908110611ce157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611cfc836002614b5b565b611d07906003614a1f565b81518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535080611d4681614bfc565b915050611bd5565b509392505050565b6004546001600160a01b03163314611d805760405162461bcd60e51b8152600401610b3890614862565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080611de58585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061388292505050565b95945050505050565b6004546001600160a01b03163314611e185760405162461bcd60e51b8152600401610b3890614862565b6006546040516302195d7960e61b81526101009091046001600160a01b03169081906386575e4090611e549088908890889088906004016147f3565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505050505050565b6004546001600160a01b03163314611eb75760405162461bcd60e51b8152600401610b3890614862565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6004546001600160a01b03163314611f095760405162461bcd60e51b8152600401610b3890614862565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611f33613ca8565b600083815260106020908152604080832085845290915290819020815160608101909252805482908290611f6690614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290614bc1565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050509183525050600182015460208201526002909101546001600160a01b03166040909101529392505050565b60008060005b6020811015612095576000612029826008614b5b565b8560001c901c60ff16905080603011158015612046575060398111155b1561207c5761205682600a614ab3565b612061603083614b7a565b61206b9190614b5b565b6120759084614a1f565b9250612082565b50612095565b508061208d81614bfc565b915050612013565b5092915050565b6004546001600160a01b031633146120c65760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b0382166000908152600d60209081526040808320600e83528184205484529091528120906120fb8282613c6b565b50600060019182018190556001600160a01b0384168152600e60205260409020546121259161357d565b6001600160a01b0383166000908152600e6020908152604080832093909355600c815282822084835290529081209061215e8282613c6b565b600182016000905550505050565b3360009081526015602052604090205460ff161561219c5760405162461bcd60e51b8152600401610b3890614907565b6060436121b4600b5486613a2c90919063ffffffff16565b116121f55760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610b38565b6008546006546040516305fbdf1560e21b81526001600160a01b03928316926317ef7c549261223492610100909104909116908c908690600401614715565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906141af565b1580156122a2575060008881526018602052604090205460ff16155b6122e05760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610b38565b600654600a546101009091046001600160a01b03169060ff161561240d576001546009546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161233391339130916004016146f1565b602060405180830381600087803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238591906141af565b6123a15760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916123d69160040190815260200190565b600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b505050506124b6565b6001546007546009546040516323b872dd60e01b81526001600160a01b03938416936323b872dd9361244893339392909116916004016146f1565b602060405180830381600087803b15801561246257600080fd5b505af1158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a91906141af565b6124b65760405162461bcd60e51b8152600401610b38906148b6565b60006124fc8a888b8b8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161192505050565b6001600160a01b03811660009081526016602052604090205490915060ff166125375760405162461bcd60e51b8152600401610b389061488f565b6000878152601760205260408120805460ff19166001179055600580546125e9919061256290614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461258e90614bc1565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050506113f98d61373d565b9050826001600160a01b0316632fb102cf8d8d848e8e6040518663ffffffff1660e01b815260040161261f9594939291906147ad565b600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b50505060009b8c525050601860205250506040909720805460ff191660011790555050505050505050565b60008281526017602052604081205460ff161561269457600080fd5b60006126a261167a8661373d565b6040516020016126b29190614660565b60405160208183030381529060405280519060200120905060006126d68285613882565b9695505050505050565b6004546001600160a01b0316331461270a5760405162461bcd60e51b8152600401610b3890614862565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278791906145ea565b60ff16905061279781600a614ab3565b6127a19083614b5b565b6009555050565b600260005414156127fb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b38565b600260009081553381526015602052604090205460ff161561282f5760405162461bcd60e51b8152600401610b3890614907565b6008546006546040516305fbdf1560e21b81526060926001600160a01b039081169283926317ef7c5492612870926101009004169087908790600401614715565b602060405180830381600087803b15801561288a57600080fd5b505af115801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c291906141af565b156128df5760405162461bcd60e51b8152600401610b38906148de565b60065461010090046001600160a01b0316336040516331a9108f60e11b8152600481018690526001600160a01b0391821691831690636352211e90602401602060405180830381600087803b15801561293757600080fd5b505af115801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190613f1b565b6001600160a01b0316146129b75760405162461bcd60e51b815260206004820152600f60248201526e2737ba102a37b5b2b71027bbb732b960891b6044820152606401610b38565b604051630852cd8d60e31b8152600481018590526001600160a01b038216906342966c6890602401600060405180830381600087803b1580156129f957600080fd5b505af1158015612a0d573d6000803e3d6000fd5b5050600654604080516304f4b51360e51b81526101009092046001600160a01b0390811660048401526024830189905233604484015290519086169350639e96a2609250606480830192600092919082900301818387803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b50506001600055505050505050565b6004546001600160a01b03163314612abe5760405162461bcd60e51b8152600401610b3890614862565b600b55565b612acb613dc7565b6001600160a01b0383166000908152600d60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3390614bc1565b8015612b805780601f10612b5557610100808354040283529160200191612b80565b820191906000526020600020905b815481529060010190602001808311612b6357829003601f168201915b50505050508152602001600182015481525050905092915050565b6004546001600160a01b03163314612bc55760405162461bcd60e51b8152600401610b3890614862565b612bd160058383613ddf565b505050565b6004546000906001600160a01b03163314612c035760405162461bcd60e51b8152600401610b3890614862565b6000828152600260205260409020805460ff19169055600161170a565b6004546001600160a01b03163314612c4a5760405162461bcd60e51b8152600401610b3890614862565b600654604051634d6ca91960e11b8152600481018490526101009091046001600160a01b031690639ad952329060240160006040518083038186803b158015612c9257600080fd5b505afa925050508015612cc757506040513d6000823e601f3d908101601f19168201604052612cc49190810190614321565b60015b612e3d57612cd58583613a89565b15612d165760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948141c99535a5b9d607a1b6044820152606401610b38565b6001600160a01b0385166000908152600e6020526040902054612d3a906001613a2c565b6001600160a01b0386166000908152600e6020908152604091829020929092558051601f860183900490920282016060908101825290820185815282918790879081908501838280828437600092018290525093855250505060209182018490526001600160a01b0388168152600c8252604080822086835283529020825180519192612dcc92849290910190613cc8565b506020918201516001909101556001600160a01b0386166000818152600c835260408082208683528452808220928252600d8452808220600e855281832054835290935291909120815481908390612e2390614bc1565b612e2e929190613d4c565b50600191820154910155612e7f565b60405162461bcd60e51b815260206004820152601760248201527613919508115e1a5cdd1cc81dda5d1a081d1a1a5cc81251604a1b6044820152606401610b38565b5050505050565b6001546040805163313ce56760e01b815290516000926001600160a01b031691829163313ce56791600480820192602092909190829003018186803b158015612ece57600080fd5b505afa158015612ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0691906145ea565b91505090565b6004546001600160a01b03163314612f365760405162461bcd60e51b8152600401610b3890614862565b6006546040516334c6bd2160e21b81526101009091046001600160a01b031690819063d31af48490612f6e90869086906004016149af565b600060405180830381600087803b158015612f8857600080fd5b505af1158015612f9c573d6000803e3d6000fd5b50505050505050565b6000818152600f60205260409020600201546001600160a01b0316331461301c5760405162461bcd60e51b815260206004820152602560248201527f5072655472616e7366657220646f6573206e6f742062656c6f6e6720746f207360448201526432b73232b960d91b6064820152608401610b38565b6000818152601060209081526040808320601183528184205484529091528120906130478282613c6b565b5060006001828101829055600290920180546001600160a01b03191690558281526011602052604090205461307b9161357d565b600082815260116020908152604080832093909355600f9052908120906130a28282613c6b565b506000600182015560020180546001600160a01b031916905550565b6004546001600160a01b031633146130e85760405162461bcd60e51b8152600401610b3890614862565b600154600654600a546001600160a01b03928316926101009092049091169060ff161561321b576009546040516323b872dd60e01b81526001600160a01b038416916323b872dd916131419133913091906004016146f1565b602060405180830381600087803b15801561315b57600080fd5b505af115801561316f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319391906141af565b6131af5760405162461bcd60e51b8152600401610b38906148b6565b600154600954604051630852cd8d60e31b81526001600160a01b03909216916342966c68916131e49160040190815260200190565b600060405180830381600087803b1580156131fe57600080fd5b505af1158015613212573d6000803e3d6000fd5b505050506132c0565b6007546009546040516323b872dd60e01b81526001600160a01b03858116936323b872dd93613252933393909216916004016146f1565b602060405180830381600087803b15801561326c57600080fd5b505af1158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141af565b6132c05760405162461bcd60e51b8152600401610b38906148b6565b600061330589878a8a89898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138292505050565b6001600160a01b03811660009081526016602052604090205490915060ff166133405760405162461bcd60e51b8152600401610b389061488f565b6000868152601760205260408120805460ff19166001179055600580546133f2919061336b90614bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461339790614bc1565b80156133e45780601f106133b9576101008083540402835291602001916133e4565b820191906000526020600020905b8154815290600101906020018083116133c757829003601f168201915b50505050506113f98c61373d565b604051632fb102cf60e01b81529091506001600160a01b03841690632fb102cf90613429908e908e9086908f908f906004016147ad565b600060405180830381600087803b15801561344357600080fd5b505af1158015613457573d6000803e3d6000fd5b505050505050505050505050505050565b6004546001600160a01b031633146134925760405162461bcd60e51b8152600401610b3890614862565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6004546001600160a01b031633146134dd5760405162461bcd60e51b8152600401610b3890614862565b6004546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b613541613dc7565b6001600160a01b0383166000908152600c60209081526040808320858452909152908190208151808301909252805482908290612b0790614bc1565b60006135bf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b69565b9392505050565b6000828152600360205260408120548211156136305760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e73666572206d6f7265207468616e206465706f736044820152631a5d195960e21b6064820152608401610b38565b60008381526002602052604090205460ff1661365e5760405162461bcd60e51b8152600401610b3890614838565b6001546040516340c10f1960e01b81526001600160a01b038681166004830152602482018590529091169081906340c10f1990604401600060405180830381600087803b1580156136ae57600080fd5b505af11580156136c2573d6000803e3d6000fd5b5050506000858152600360205260409020546136df91508461357d565b60008581526003602052604090205582336001600160a01b03167fdfb36617677d4721feefea07d11b2d1aca3d4ea49facf2bae87fbc8db4ecc9138660405161372a91815260200190565b60405180910390a3506001949350505050565b6060816137615750506040805180820190915260018152600360fc1b602082015290565b8160005b811561378b578061377581614bfc565b91506137849050600a83614a5c565b9150613765565b6000816001600160401b038111156137b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137dd576020820181803683370190505b5090505b8415610fbe576137f2600183614b7a565b91506137ff600a86614c17565b61380a906030614a1f565b60f81b81838151811061382d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061384f600a86614a5c565b94506137e1565b6060828260405160200161386b9291906146ae565b604051602081830303815290604052905092915050565b600081516041146138ce5760405162461bcd60e51b81526020600482015260166024820152750a4cae2ead2e4ca40c6dee4e4cac6e840d8cadccee8d60531b6044820152606401610b38565b60208201516040830151606084015160001a601b8110156138f7576138f4601b82614a37565b90505b8060ff16601b148061390c57508060ff16601c145b6139565760405162461bcd60e51b815260206004820152601b60248201527a0a6d2cedcc2e8eae4ca40eccae4e6d2dedc40dcdee840dac2e8c6d602b1b6044820152606401610b38565b6126d686828585613b9a565b6000818152600f60205260408120805482919061397e90614bc1565b80601f01602080910402602001604051908101604052809291908181526020018280546139aa90614bc1565b80156139f75780601f106139cc576101008083540402835291602001916139f7565b820191906000526020600020905b8154815290600101906020018083116139da57829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c8383398151915214159695505050505050565b600080613a398385614a1f565b9050838110156135bf5760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610b38565b6001600160a01b0382166000908152600c6020908152604080832084845290915281208054829190613aba90614bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054613ae690614bc1565b8015613b335780601f10613b0857610100808354040283529160200191613b33565b820191906000526020600020905b815481529060010190602001808311613b1657829003601f168201915b5050604080516020808201909252600090528451940193909320600080516020614c838339815191521415979650505050505050565b60008184841115613b8d5760405162461bcd60e51b8152600401610b389190614825565b506000611de58486614b7a565b6000806040518060400160405280601c81526020017b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b815250905060008187604051602001613be992919061467c565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015613c54573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b508054613c7790614bc1565b6000825580601f10613c87575050565b601f016020900490600052602060002090810190613ca59190613e53565b50565b604080516060808201835281526000602082018190529181019190915290565b828054613cd490614bc1565b90600052602060002090601f016020900481019282613cf65760008555613d3c565b82601f10613d0f57805160ff1916838001178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578251825591602001919060010190613d21565b50613d48929150613e53565b5090565b828054613d5890614bc1565b90600052602060002090601f016020900481019282613d7a5760008555613d3c565b82601f10613d8b5780548555613d3c565b82800160010185558215613d3c57600052602060002091601f016020900482015b82811115613d3c578254825591600101919060010190613dac565b60408051808201909152606081526000602082015290565b828054613deb90614bc1565b90600052602060002090601f016020900481019282613e0d5760008555613d3c565b82601f10613e265782800160ff19823516178555613d3c565b82800160010185558215613d3c579182015b82811115613d3c578235825591602001919060010190613e38565b5b80821115613d485760008155600101613e54565b60008083601f840112613e79578182fd5b5081356001600160401b03811115613e8f578182fd5b602083019150836020828501011115613ea757600080fd5b9250929050565b600082601f830112613ebe578081fd5b8135613ed1613ecc826149f8565b6149c8565b818152846020838601011115613ee5578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613f10578081fd5b81356135bf81614c6d565b600060208284031215613f2c578081fd5b81516135bf81614c6d565b600080600080600060808688031215613f4e578081fd5b8535613f5981614c6d565b945060208601356001600160401b03811115613f73578182fd5b613f7f88828901613e68565b9699909850959660408101359660609091013595509350505050565b60008060408385031215613fad578182fd5b8235613fb881614c6d565b946020939093013593505050565b60008060008060008060808789031215613fde578081fd5b8635613fe981614c6d565b95506020870135945060408701356001600160401b038082111561400b578283fd5b6140178a838b01613e68565b9096509450606089013591508082111561402f578283fd5b5061403c89828a01613e68565b979a9699509497509295939492505050565b600080600080600080600060a0888a031215614068578081fd5b873561407381614c6d565b96506020880135955060408801356001600160401b0380821115614095578283fd5b6140a18b838c01613e68565b909750955060608a0135945060808a01359150808211156140c0578283fd5b506140cd8a828b01613e68565b989b979a50959850939692959293505050565b60008060008060008060008060c0898b0312156140fb578182fd5b883561410681614c6d565b97506020890135965060408901356001600160401b0380821115614128578384fd5b6141348c838d01613e68565b909850965060608b0135955060808b0135945060a08b013591508082111561415a578384fd5b506141678b828c01613e68565b999c989b5096995094979396929594505050565b60008060006060848603121561418f578081fd5b833561419a81614c6d565b95602085013595506040909401359392505050565b6000602082840312156141c0578081fd5b815180151581146135bf578182fd5b6000602082840312156141e0578081fd5b5035919050565b6000602082840312156141f8578081fd5b5051919050565b600080600060408486031215614213578081fd5b8335925060208401356001600160401b0381111561422f578182fd5b61423b86828701613e68565b9497909650939450505050565b600060208284031215614259578081fd5b81356001600160401b0381111561426e578182fd5b610fbe84828501613eae565b6000806020838503121561428c578182fd5b82356001600160401b038111156142a1578283fd5b6142ad85828601613e68565b90969095509350505050565b600080600080604085870312156142ce578182fd5b84356001600160401b03808211156142e4578384fd5b6142f088838901613e68565b90965094506020870135915080821115614308578384fd5b5061431587828801613e68565b95989497509550505050565b600060208284031215614332578081fd5b81516001600160401b03811115614347578182fd5b8201601f81018413614357578182fd5b8051614365613ecc826149f8565b818152856020838501011115614379578384fd5b611de5826020830160208601614b91565b6000806040838503121561439c578182fd5b82356001600160401b038111156143b1578283fd5b6143bd85828601613eae565b95602094909401359450505050565b600080604083850312156143de578182fd5b50508035926020909101359150565b60008060008060008060a08789031215614405578384fd5b8635955060208701356001600160401b0380821115614422578586fd5b61442e8a838b01613e68565b90975095506040890135915061444382614c6d565b909350606088013592506080880135908082111561445f578283fd5b5061446c89828a01613eae565b9150509295509295509295565b6000806040838503121561448b578182fd5b8235915060208301356001600160401b038111156144a7578182fd5b6144b385828601613eae565b9150509250929050565b6000806000606084860312156144d1578081fd5b833592506020840135915060408401356001600160401b038111156144f4578182fd5b61450086828701613eae565b9150509250925092565b600080600080600060808688031215614521578283fd5b853594506020860135935060408601356001600160401b0380821115614545578485fd5b61455189838a01613e68565b90955093506060880135915080821115614569578283fd5b5061457688828901613eae565b9150509295509295909350565b60008060008060008060a0878903121561459b578384fd5b863595506020870135945060408701356001600160401b03808211156145bf578586fd5b6145cb8a838b01613e68565b909650945060608901359350608089013591508082111561445f578283fd5b6000602082840312156145fb578081fd5b815160ff811681146135bf578182fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261464c816020860160208601614b91565b601f01601f19169290920160200192915050565b60008251614672818460208701614b91565b9190910192915050565b6000835161468e818460208801614b91565b9190910191825250602001919050565b8183823760009101908152919050565b600083516146c0818460208801614b91565b8351908301906146d4818360208801614b91565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038416815260208082018490526060604083018190528351908301819052600091848101916080850190845b8181101561476457845183529383019391830191600101614748565b509098975050505050505050565b60018060a01b038716815285602082015260806040820152600061479a60808301868861460b565b828103606084015261143281858761460b565b60018060a01b03861681528460208201526080604082015260006147d46080830186614634565b82810360608401526147e781858761460b565b98975050505050505050565b60408152600061480760408301868861460b565b828103602084015261481a81858761460b565b979650505050505050565b6020815260006135bf6020830184614634565b60208082526010908201526f125b9d985b1a590810da185a5b88125160821b604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252600d908201526c139bdd0815da5d1b995cdcd959609a1b604082015260600190565b6020808252600e908201526d2a3930b739b332b91022a92927a960911b604082015260600190565b6020808252600f908201526e105b1c9958591e4810db185a5b5959608a1b604082015260600190565b60208082526015908201527410d85b1b195c881a5cc8189b1858dadb1a5cdd1959605a1b604082015260600190565b6020815260008251604060208401526149526060840182614634565b9050602084015160408401528091505092915050565b6020815260008251606060208401526149846080840182614634565b6020850151604085810191909152909401516001600160a01b03166060909301929092525090919050565b828152604060208201526000610fbe6040830184614634565b604051601f8201601f191681016001600160401b03811182821017156149f0576149f0614c57565b604052919050565b60006001600160401b03821115614a1157614a11614c57565b50601f01601f191660200190565b60008219821115614a3257614a32614c2b565b500190565b600060ff821660ff84168060ff03821115614a5457614a54614c2b565b019392505050565b600082614a6b57614a6b614c41565b500490565b600181815b80851115614aab578160001904821115614a9157614a91614c2b565b80851615614a9e57918102915b93841c9390800290614a75565b509250929050565b60006135bf8383600082614ac95750600161170a565b81614ad65750600061170a565b8160018114614aec5760028114614af657614b12565b600191505061170a565b60ff841115614b0757614b07614c2b565b50506001821b61170a565b5060208310610133831016604e8410600b8410161715614b35575081810a61170a565b614b3f8383614a70565b8060001904821115614b5357614b53614c2b565b029392505050565b6000816000190483118215151615614b7557614b75614c2b565b500290565b600082821015614b8c57614b8c614c2b565b500390565b60005b83811015614bac578181015183820152602001614b94565b83811115614bbb576000848401525b50505050565b600181811c90821680614bd557607f821691505b60208210811415614bf657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614c1057614c10614c2b565b5060010190565b600082614c2657614c26614c41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613ca557600080fdfec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470a2646970667358221220b7d58c8a4a6eea7b845d2c030aa15aaefdc9acd05d931347dafcea1bc2b4db1f64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a3190100000000000000000000000000000000000000000000000000000000000000fa

-----Decoded View---------------
Arg [0] : _nftAddress (address): 0x82C7a8f707110f5FBb16184A5933E9F78a34c6ab
Arg [1] : _paymentAddress (address): 0x3D658390460295FB963f54dC0899cfb1c30776Df
Arg [2] : _recipientAddress (address): 0x2272ECf43A7481088FA2d4Ba9109804ED5A31901
Arg [3] : _price (uint256): 250

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000082c7a8f707110f5fbb16184a5933e9f78a34c6ab
Arg [1] : 0000000000000000000000003d658390460295fb963f54dc0899cfb1c30776df
Arg [2] : 0000000000000000000000002272ecf43a7481088fa2d4ba9109804ed5a31901
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa


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.