ETH Price: $3,475.55 (+0.20%)
Gas: 13 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
Claim On Chain203167362024-07-16 4:39:112 days ago1721104751IN
0xD0C73041...2Ec66E8ba
0 ETH0.000722593.84377493
Claim On Chain203064542024-07-14 18:11:593 days ago1720980719IN
0xD0C73041...2Ec66E8ba
0 ETH0.000608583.39132254
Claim On Chain203064172024-07-14 18:04:353 days ago1720980275IN
0xD0C73041...2Ec66E8ba
0 ETH0.000512533.09178582
Claim On Chain203064092024-07-14 18:02:593 days ago1720980179IN
0xD0C73041...2Ec66E8ba
0 ETH0.00060473.21667979
Claim On Chain203006262024-07-13 22:40:114 days ago1720910411IN
0xD0C73041...2Ec66E8ba
0 ETH0.00148718.28688185
Claim On Chain202941252024-07-13 0:51:355 days ago1720831895IN
0xD0C73041...2Ec66E8ba
0 ETH0.000183791.00550718
Claim On Chain202588122024-07-08 2:28:3510 days ago1720405715IN
0xD0C73041...2Ec66E8ba
0 ETH0.000525653.17095391
Claim On Chain202587902024-07-08 2:24:1110 days ago1720405451IN
0xD0C73041...2Ec66E8ba
0 ETH0.000610413.50188802
Claim On Chain202587722024-07-08 2:20:3510 days ago1720405235IN
0xD0C73041...2Ec66E8ba
0 ETH0.000466072.81150633
Claim On Chain202587632024-07-08 2:18:4710 days ago1720405127IN
0xD0C73041...2Ec66E8ba
0 ETH0.000554343.18023854
Claim On Chain202587392024-07-08 2:13:5910 days ago1720404839IN
0xD0C73041...2Ec66E8ba
0 ETH0.000627963.60238414
Claim On Chain202587212024-07-08 2:10:2310 days ago1720404623IN
0xD0C73041...2Ec66E8ba
0 ETH0.000764214.38423713
Claim On Chain202586802024-07-08 2:02:1110 days ago1720404131IN
0xD0C73041...2Ec66E8ba
0 ETH0.000669583.84134294
Claim On Chain202586532024-07-08 1:56:4710 days ago1720403807IN
0xD0C73041...2Ec66E8ba
0 ETH0.000699714.01419443
Claim On Chain202464102024-07-06 8:55:1112 days ago1720256111IN
0xD0C73041...2Ec66E8ba
0 ETH0.000315481.90311883
Claim On Chain202432102024-07-05 22:11:4712 days ago1720217507IN
0xD0C73041...2Ec66E8ba
0 ETH0.000469482.69338361
Claim On Chain202419702024-07-05 18:02:4712 days ago1720202567IN
0xD0C73041...2Ec66E8ba
0 ETH0.001245936.62764444
Claim On Chain202328942024-07-04 11:36:4714 days ago1720093007IN
0xD0C73041...2Ec66E8ba
0 ETH0.001762819.82274148
Claim On Chain202259392024-07-03 12:19:5915 days ago1720009199IN
0xD0C73041...2Ec66E8ba
0 ETH0.0019781811.93235693
Claim On Chain202254572024-07-03 10:42:2315 days ago1720003343IN
0xD0C73041...2Ec66E8ba
0 ETH0.00154419.31457685
Claim On Chain202205312024-07-02 18:10:4715 days ago1719943847IN
0xD0C73041...2Ec66E8ba
0 ETH0.001336367.10871036
Claim On Chain202181442024-07-02 10:09:5916 days ago1719914999IN
0xD0C73041...2Ec66E8ba
0 ETH0.000938854.9941783
Claim On Chain202179742024-07-02 9:35:4716 days ago1719912947IN
0xD0C73041...2Ec66E8ba
0 ETH0.001015645.4026593
Claim On Chain202151432024-07-02 0:06:1116 days ago1719878771IN
0xD0C73041...2Ec66E8ba
0 ETH0.000522183.15
Claim On Chain201931182024-06-28 22:17:4719 days ago1719613067IN
0xD0C73041...2Ec66E8ba
0 ETH0.000552332.93809784
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
203006262024-07-13 22:40:114 days ago1720910411
0xD0C73041...2Ec66E8ba
0 ETH
203006262024-07-13 22:40:114 days ago1720910411
0xD0C73041...2Ec66E8ba
0 ETH
203006262024-07-13 22:40:114 days ago1720910411
0xD0C73041...2Ec66E8ba
0 ETH
203006262024-07-13 22:40:114 days ago1720910411
0xD0C73041...2Ec66E8ba
0 ETH
202941252024-07-13 0:51:355 days ago1720831895
0xD0C73041...2Ec66E8ba
0 ETH
202941252024-07-13 0:51:355 days ago1720831895
0xD0C73041...2Ec66E8ba
0 ETH
202941252024-07-13 0:51:355 days ago1720831895
0xD0C73041...2Ec66E8ba
0 ETH
202941252024-07-13 0:51:355 days ago1720831895
0xD0C73041...2Ec66E8ba
0 ETH
202588122024-07-08 2:28:3510 days ago1720405715
0xD0C73041...2Ec66E8ba
0 ETH
202588122024-07-08 2:28:3510 days ago1720405715
0xD0C73041...2Ec66E8ba
0 ETH
202588122024-07-08 2:28:3510 days ago1720405715
0xD0C73041...2Ec66E8ba
0 ETH
202588122024-07-08 2:28:3510 days ago1720405715
0xD0C73041...2Ec66E8ba
0 ETH
202587902024-07-08 2:24:1110 days ago1720405451
0xD0C73041...2Ec66E8ba
0 ETH
202587902024-07-08 2:24:1110 days ago1720405451
0xD0C73041...2Ec66E8ba
0 ETH
202587902024-07-08 2:24:1110 days ago1720405451
0xD0C73041...2Ec66E8ba
0 ETH
202587902024-07-08 2:24:1110 days ago1720405451
0xD0C73041...2Ec66E8ba
0 ETH
202587722024-07-08 2:20:3510 days ago1720405235
0xD0C73041...2Ec66E8ba
0 ETH
202587722024-07-08 2:20:3510 days ago1720405235
0xD0C73041...2Ec66E8ba
0 ETH
202587722024-07-08 2:20:3510 days ago1720405235
0xD0C73041...2Ec66E8ba
0 ETH
202587722024-07-08 2:20:3510 days ago1720405235
0xD0C73041...2Ec66E8ba
0 ETH
202587632024-07-08 2:18:4710 days ago1720405127
0xD0C73041...2Ec66E8ba
0 ETH
202587632024-07-08 2:18:4710 days ago1720405127
0xD0C73041...2Ec66E8ba
0 ETH
202587632024-07-08 2:18:4710 days ago1720405127
0xD0C73041...2Ec66E8ba
0 ETH
202587632024-07-08 2:18:4710 days ago1720405127
0xD0C73041...2Ec66E8ba
0 ETH
202587392024-07-08 2:13:5910 days ago1720404839
0xD0C73041...2Ec66E8ba
0 ETH
View All Internal Transactions
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  ]

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.