Contract 0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf8908c9fd43b69ecef1f7485fcee6cc94c974c976a8cbbd404963ed57eae0cdfMelt218691592021-11-27 17:52:481 day 11 hrs ago0xbf91459018a2526c745979466b09dbd1d239a41d IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0x8731fc0af0204e633948e8110fa86145b519ba044f5dc64d933927b504a4aa0dMelt218691412021-11-27 17:51:361 day 11 hrs ago0xbf91459018a2526c745979466b09dbd1d239a41d IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0xe9b5969d1f2fb3193c82b2f91107bd251be92427c556587752a041d29f7386bbMelt218691332021-11-27 17:51:041 day 11 hrs ago0xbf91459018a2526c745979466b09dbd1d239a41d IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0xdcfca3d3dcc2d6bd709f090cf34edc3488e0079ab3c9c71e756e89c897ced1bbMelt218580722021-11-27 11:07:161 day 18 hrs ago0x98a53abca01a91b5e09a260720692cad6852ce4e IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.0004182048
0xd3c59a48629aeda90f2a43194edd6c40984bb24e013b19b6080927822f393b18Melt218564992021-11-27 10:11:021 day 19 hrs ago0x98a53abca01a91b5e09a260720692cad6852ce4e IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.000522756
0xb461ee8bedb2129d5eefc455097fba10aca521ef91bd73bb52b43092e05b2548Melt218560952021-11-27 9:54:571 day 19 hrs ago0x98a53abca01a91b5e09a260720692cad6852ce4e IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0x4a61437d1c658e89ab1b7e9a7f1ec2a8293b2ebdf4f831061a0e5b57640a7375Melt218560732021-11-27 9:54:131 day 19 hrs ago0x98a53abca01a91b5e09a260720692cad6852ce4e IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00560256
0x9d8f4238a93515dcd76718b90eaf279cde67db7dd66448d4eeb5a4575d8d2392Melt218254812021-11-26 14:53:112 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00958386
0xa3ae6a2fac5d0918145f8c16d099dfa022c1f17d9613559c778e070501e7f422Melt218254652021-11-26 14:51:512 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00958386
0xbb76fb1f09e7c169f2debfcc48a0d8167ed28fb5155eff8933ec5d531a3ba1fcMelt218254572021-11-26 14:51:032 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00958386
0x3ef861c2513386855199b5130df1d5dbfaa098def49d60f50c9a79ccfaba9e98Melt218254512021-11-26 14:50:272 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00958386
0x2f54e5cd0735afea638a1216651565a3161f26384b3f909b055a9d243e927c4cMelt218254362021-11-26 14:48:572 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.0261378
0x2a84b23110ba06efaf190f3fbf72e7bfc1c6f8296eaa950cf844e374a1a94572Melt218252882021-11-26 14:41:572 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.01219764
0x329d04813066df54bd23b33d9982be80f383b600aea83dc3b98f83816987582bMelt218252302021-11-26 14:39:572 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0xd0fd9f3ef6b51f8cecbe18d4bad6ca9b73308a0fb466d04c3574fb719233aa69Melt218247952021-11-26 14:24:222 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.01219764
0xd0dec50780b2593543c8905109f412785749ebaa961496417d601b194825ec61Melt218247612021-11-26 14:23:102 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.02265276
0x1099b7301ddc258f6204e6abd8257feeb24a42e83ff5615bdd9c8234a2d6efbcMelt218247442021-11-26 14:22:362 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.02427776
0x4132ad2a83097705d41921823132ced77e98cf3e487e9dab25f2b8ab9f18fa4fMelt218247032021-11-26 14:21:102 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.0203961966
0x55e18ee1c85c421c8227593afc03fcf0bcb9602a14e8c3f42a6807b9f66c6576Melt218245662021-11-26 14:14:202 days 14 hrs ago0x6dba7f95386e4129f92b59482fa356bc74f29c5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.000896507082
0x21e4186c9b21489babb69440aa37636d7a3971d8aa8343095a8d3dc467d32508Melt217819712021-11-25 11:09:493 days 18 hrs ago0x532555f457ab88d3d436dc8658e9b4eae31297bf IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0x32575a292e0dba56a08ca5f17bd9e67d11afa83362b05fde87f207d9c94253c1Melt217819562021-11-25 11:09:193 days 18 hrs ago0x532555f457ab88d3d436dc8658e9b4eae31297bf IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0x6a2175c650c47cd4daa710e9e47cf74027d60adec1632190979c653e31c52539Melt217819402021-11-25 11:08:433 days 18 hrs ago0x532555f457ab88d3d436dc8658e9b4eae31297bf IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.0058025916
0x79ce827ba12f26eafb53853eac3cd3cb6f10b23fdf26a6b2d0e335d162342433Melt217745112021-11-25 6:40:113 days 22 hrs ago0x8b075da4f5e2f9ffa27303a7b1752df619fcaa5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00581811
0xa961e76e80fae7215ac93510cddf754e1ce147fbaaa3f033bf44c7f6e6eee1baMelt217744312021-11-25 6:37:273 days 22 hrs ago0x8b075da4f5e2f9ffa27303a7b1752df619fcaa5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.00522756
0x36eb01967e3cdb4e48ba9bc10ddb3359683fe3003d6bc8fc23edf07cd62071e0Melt217744202021-11-25 6:37:053 days 22 hrs ago0x8b075da4f5e2f9ffa27303a7b1752df619fcaa5b IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.005750316
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainbindersMelt

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-30
*/

pragma solidity ^0.7.6;


/**
 * @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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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;
    }
}


/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}



/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}


/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    constructor() internal {
        _registerInterface(
            ERC1155Receiver(address(0)).onERC1155Received.selector ^
            ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
        );
    }
}


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}


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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}




library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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

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

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

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

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

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

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

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


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// interface of momiji token.
interface IMomijiToken {
    function tokenQuantityWithId(uint256 tokenId) view external returns(uint256);
    function tokenMaxQuantityWithId(uint256 tokenId) view external returns(uint256);
    function mintManuallyQuantityWithId(uint256 tokenId) view external returns(uint256);
    function creators(uint256 tokenId) view external returns(address);
    function removeMintManuallyQuantity(uint256 tokenId, uint256 amount) external;
    function addMintManuallyQuantity(uint256 tokenId, uint256 amount) external;
    function mint(uint256 tokenId, address to, uint256 quantity, bytes memory data) external;
    function balanceOf(address account, uint256 id) external view returns (uint256);
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external;
}

contract ChainbindersMelt is Ownable, ERC1155Holder {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;

    // Level enum of chainbinders NFTs total 7
    enum NftLevel {
        Legendary,
        Ethereal,
        Mythic,
        Rare,
        Common,
        Secret,
        Failed
    }

    // What rate of ETH does each level have.
    mapping(NftLevel => uint256) public nftRatio;
    // How many cards does each level of NFT have.
    mapping(NftLevel => uint256) public nftCardAmountOfLevel;
    // How much ETH does each level NFT levl have.
    mapping(NftLevel => uint256) public ethAmountOfLevel;
    // Which cards exist
    mapping(uint256 => bool) public cardExists;
    // Which level the current card belongs to
    mapping(uint256 => NftLevel) public cardLevelWithId;
    // Supply of current card with a specify tokenId
    mapping(uint256 => uint256) public cardAmounWithId;
    // How much azuki need to burn fo per token.
    mapping(NftLevel => uint256) public azukiBurnAmountOfLevel;

    IERC20 public immutable weth;
    IERC20 public immutable azuki;
    IMomijiToken public immutable momiji;
    bool public isStarted;
    address public dokiBuybackAccount;
    address public auzkiBurnAccount;

    event Melt(address indexed burner, uint256 indexed cardId, uint256 count, uint256 azukiBurned, uint256 forUserAmount, uint256 forDokibuybackAmount);
    event ChangeAzukiPriceForMelt(uint256 forLegendary, uint256 forEthereal, uint256 forMythic, uint256 forRare, uint256 forCommon, uint256 forSecret);
    event CardAdded(uint256 indexed cardId, uint256 additionalSupply, NftLevel indexed nftLevel);
    event CardRemoved(uint256 indexed cardId, uint256 removedAmount);
    event SetupRarityLevel(NftLevel indexed nftLevel, uint256 ethAmountOfLevel, uint256 poolRatio, uint256 azukiRequiredForMelt);

    constructor(IERC20 _weth, IERC20 _azuki, IMomijiToken _momiji) {
        isStarted = false;
        weth = _weth;
        azuki = _azuki;
        momiji = _momiji;
        dokiBuybackAccount = 0xc91ca8DC020F0135Df86c1D88d4CDC9caF9982Da;
        auzkiBurnAccount = 0x6dC9950905BAcA54Ccc97e4A0D0F24D9611B46ef;
        _setupRarityLevel();
        _setupAzukiBurnAmountOfLevel();
    }

    // set the percentage of ETH in the pool of every level.
    function _setupRarityLevel() private {
        nftRatio[NftLevel.Legendary] = 28; // 28% ETH in the pool
        nftRatio[NftLevel.Ethereal] = 26; // 26% ETH in the pool
        nftRatio[NftLevel.Mythic] = 20; // 20% ETH in the pool
        nftRatio[NftLevel.Rare] = 15; // 15% ETH in the pool
        nftRatio[NftLevel.Common] = 10; // 10% ETH in the pool
        nftRatio[NftLevel.Secret] = 1; // 1% ETH in the pool
        nftRatio[NftLevel.Failed] = 0;
    }

    // set the burn amount if AZUKI when unbind NFTs
    function _setupAzukiBurnAmountOfLevel() private {
        uint256 forLegendary = 100; // For Legendary it should burn 100 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Legendary] = forLegendary.mul(1e18);
        uint256 forEthereal = 25; // For Ethereal it should burn 25 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Ethereal] = forEthereal.mul(1e18);
        uint256 forMythic = 6; // For Mythic it should burn 6 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Mythic] = forMythic.mul(1e18);
        uint256 forRare = 3; // For Rare it should burn 3 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Rare] = forRare.mul(1e18);
        uint256 forCommon = 1; // For Common it should burn 1 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Common] = forCommon.mul(1e18);
        uint256 forSecret = 500; // For Secret it should burn 500 AZUKI
        azukiBurnAmountOfLevel[NftLevel.Secret] = forSecret.mul(1e18);
        azukiBurnAmountOfLevel[NftLevel.Failed] = 0;
    }

    // Add card into pool, this function is for setting up pool.
    function addCard(uint256 cardId, uint256 additionalSupply, NftLevel nftLevel) external onlyOwner {
        require(!cardExists[cardId] || cardLevelWithId[cardId] == nftLevel, "Card lvl different than ones added");
        cardExists[cardId] = true;
        cardAmounWithId[cardId] = cardAmounWithId[cardId].add(additionalSupply); // card of ID
        nftCardAmountOfLevel[nftLevel] = nftCardAmountOfLevel[nftLevel].add(additionalSupply); // card of Level.
        cardLevelWithId[cardId] = nftLevel; // setup card of level
        emit CardAdded(cardId, additionalSupply, nftLevel);
    }

    // Remove card from this pool. for sometime do a mistake
    function removeCard(uint256 cardId) external onlyOwner {
        require(cardExists[cardId], "Card with ID doesn't exist");
        NftLevel nftLevel = cardLevelWithId[cardId];
        uint256 removedAmount = cardAmounWithId[cardId];
        nftCardAmountOfLevel[nftLevel] = nftCardAmountOfLevel[nftLevel].sub(removedAmount);
        delete cardExists[cardId];
        delete cardAmounWithId[cardId];
        cardLevelWithId[cardId] = NftLevel.Failed; // set this cardId be failed level
        emit CardRemoved(cardId, removedAmount);
    }

    // Setup ETH amount for every Level.
    function updateETHAmountOfLevel() public onlyOwner {
        uint256 balance = weth.balanceOf(address(this));
        // We need to account for the leftover dust amount
        uint256 balanceLeftover = balance;

        for (int256 i = 6; i >= 0; i--) {
            NftLevel level = NftLevel(i);
            if (i != 0) {
                uint256 amountForLevel = balance.mul(nftRatio[level]).div(100);
                ethAmountOfLevel[level] = amountForLevel;
                balanceLeftover = balanceLeftover.sub(amountForLevel);
            } else {
                // Add leftover balance (amountForLevel[0] + dust) to the highest level NFT
                ethAmountOfLevel[level] = balanceLeftover;
            }
            emit SetupRarityLevel(level, ethAmountOfLevel[level], nftRatio[level], azukiBurnAmountOfLevel[level]);
        }
    }

    // Get rarity of every card.
    function rarity(uint256 cardId) view public returns(uint256) {
        NftLevel nftLevel = cardLevelWithId[cardId];
        uint256 cardAmountOfLevel = nftCardAmountOfLevel[nftLevel];
        if (cardAmountOfLevel == 0) {
            return 0;
        }
        return ethAmountOfLevel[nftLevel].div(cardAmountOfLevel);
    }

    // unbind cards.
    function melt(uint256 cardId, uint256 count) external onlyHuman returns(bool) {
        require(isStarted, "Not started");
        require(count <= 10, "Melting too many cards");
        require(cardAmounWithId[cardId] >= count, "Not enough cards available");

        // 1. first transfer cards to this pool.
        momiji.safeTransferFrom(msg.sender, address(this), cardId, count, "nfts melt");

        // 2. Get level of this cardId
        NftLevel level = cardLevelWithId[cardId];
        if (level == NftLevel.Failed) {
            // (1) update card amounf of this Level.
            nftCardAmountOfLevel[level] = nftCardAmountOfLevel[level].sub(count);
            // (2) update card amounf of this tokenId.
            cardAmounWithId[cardId] = cardAmounWithId[cardId].sub(count);
            emit Melt(msg.sender, cardId, count, azukiBurnAmountOfLevel[NftLevel.Failed], 0, 0);
            return false;
        }

        // 3.Get azuki total burn amount of these cards
        uint256 azukiBurnAmountOfPerToken = azukiBurnAmountOfLevel[level];
        uint256 totalAmountOfAzukiNeedToBurn = count.mul(azukiBurnAmountOfPerToken);
        // 4. transfer AZUKI token to azuki burn account.
        azuki.safeTransferFrom(msg.sender, auzkiBurnAccount, totalAmountOfAzukiNeedToBurn);

        uint256 forUserAmount = 0;
        uint256 forDokibuybackAmount = 0;

        // 4. Start to calculate the amount of ETH which user can get.
        for (uint256 i = 0; i < count; i ++) {
            // (1) get rarity of this card. after every round the rarity will be changed
            uint256 rarityOfThisCard = rarity(cardId);
            // (2) update eth amount of this level.
            ethAmountOfLevel[level] = ethAmountOfLevel[level].sub(rarityOfThisCard);
            // (3) update card amounf of this Level.
            nftCardAmountOfLevel[level] = nftCardAmountOfLevel[level].sub(1);
            // (4) update card amounf of this tokenId.
            cardAmounWithId[cardId] = cardAmounWithId[cardId].sub(1);

            // 85% of rarity of this card will go to User.
            uint256 forUserAmountRound = rarityOfThisCard.mul(85).div(100);
            forUserAmount = forUserAmount.add(forUserAmountRound);
            // 5% will go to doki buyback account.
            uint256 forDokibuybackAmountRound = rarityOfThisCard.mul(5).div(100);
            forDokibuybackAmount = forDokibuybackAmount.add(forDokibuybackAmountRound);
            // 10% (+ dust) will go back to this pool.
            uint256 backAmount = rarityOfThisCard.sub(forUserAmountRound).sub(forDokibuybackAmountRound);
            // (5) update the rarity of cards in this pool.
            _updateETHAmountOfLevel(backAmount);
        }

        weth.safeTransfer(msg.sender, forUserAmount);
        weth.safeTransfer(dokiBuybackAccount, forDokibuybackAmount);
        emit Melt(msg.sender, cardId, count, totalAmountOfAzukiNeedToBurn, forUserAmount, forDokibuybackAmount);
        return true;
    }

    //  update the rarity of cards in this pool with back amount
    function _updateETHAmountOfLevel(uint256 amount) private {
        // All ETH needs to be accounted for.
        uint256 recycleETHAmount = amount;
        // check if there is cardAmount = 0 of every level.
        uint256 cardAmountNotEqual0LevelCount = 6;
        // round 6 times and we don't need to update Failed level.
        for (uint256 i = 0; i < 6; i++) {
            NftLevel level = NftLevel(i);
            // Re-add ETH to each level in Ratio
            uint256 amountForLevel = amount.mul(nftRatio[level]).div(100);
            // Check if any amount left
            if (nftCardAmountOfLevel[level] == 0) {
                // recycle any leftover ETH
                recycleETHAmount = recycleETHAmount.add(ethAmountOfLevel[level]);
                // set the eth amounf of this level to be 0.
                ethAmountOfLevel[level] = 0;
                // cardAmountNotEqual0LevelCount - 1
                cardAmountNotEqual0LevelCount = cardAmountNotEqual0LevelCount.sub(1);
            } else {
                 recycleETHAmount = recycleETHAmount.sub(amountForLevel);
                 ethAmountOfLevel[level] = ethAmountOfLevel[level].add(amountForLevel);
            }
        }

        // Exit if we don't need to recycle
        if (recycleETHAmount == 0) {
            return;
        }

        // if card amount of every level is 0. send all of ETH to user.
        if (cardAmountNotEqual0LevelCount == 0) {
            weth.safeTransfer(msg.sender, recycleETHAmount);
        } else {
            // if there is some levels with 0 card. re-add the recycle ETH amount to other levels.
            uint256 averageETHAmount = recycleETHAmount.div(cardAmountNotEqual0LevelCount);
            // This dust ETH needs to be accounted for.
            uint256 recycleETHAmountDust = recycleETHAmount.sub(averageETHAmount.mul(cardAmountNotEqual0LevelCount));
            for (uint256 i = 0; i < 6; i++) {
                NftLevel level = NftLevel(i);
                if (nftCardAmountOfLevel[level] != 0) {
                    ethAmountOfLevel[level] = ethAmountOfLevel[level].add(averageETHAmount);
                    // We recycle the dustETHAmount to the first applicable level
                    if (recycleETHAmountDust > 0) {
                        ethAmountOfLevel[level] = ethAmountOfLevel[level].add(recycleETHAmountDust);
                        recycleETHAmountDust = 0;
                    }
                }
            }
        }
    }

    function emergencyWithdraw() external onlyOwner {
        uint256 balance = weth.balanceOf(address(this));
        weth.safeTransfer(owner(), balance);
        updateETHAmountOfLevel();
    }

    function changeBuybackAccount(address account) external onlyOwner {
        require(account != address(0), "Account is zero address");
        dokiBuybackAccount = account;
    }

    function changeAzukiBurnAccount(address account) external onlyOwner {
        require(account != address(0), "Account is zero address");
        auzkiBurnAccount = account;
    }

    // change the ratio of every Level. maybe we don't need to call this function.
    function changeAzukiBurnAmountOfLevel(
        uint256 _forLegendary,
        uint256 _forEthereal,
        uint256 _forMythic,
        uint256 _forRare,
        uint256 _forCommon,
        uint256 _forSecret
        ) external onlyOwner {
        azukiBurnAmountOfLevel[NftLevel.Legendary] = _forLegendary;
        azukiBurnAmountOfLevel[NftLevel.Ethereal] = _forEthereal;
        azukiBurnAmountOfLevel[NftLevel.Mythic] = _forMythic;
        azukiBurnAmountOfLevel[NftLevel.Rare] = _forRare;
        azukiBurnAmountOfLevel[NftLevel.Common] = _forCommon;
        azukiBurnAmountOfLevel[NftLevel.Secret] = _forSecret;
        emit ChangeAzukiPriceForMelt(_forLegendary, _forEthereal, _forMythic, _forRare, _forCommon, _forSecret);
    }

    function start() external onlyOwner {
        require(!isStarted, "Already started");
        isStarted = true;
    }

    function emergencyStop() external onlyOwner {
        require(isStarted, "Not started");
        isStarted = false;
    }

    modifier onlyHuman() {
        require(tx.origin == msg.sender, "Sender not human");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_weth","type":"address"},{"internalType":"contract IERC20","name":"_azuki","type":"address"},{"internalType":"contract IMomijiToken","name":"_momiji","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"additionalSupply","type":"uint256"},{"indexed":true,"internalType":"enum ChainbindersMelt.NftLevel","name":"nftLevel","type":"uint8"}],"name":"CardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"removedAmount","type":"uint256"}],"name":"CardRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"forLegendary","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forEthereal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forMythic","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forRare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forCommon","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forSecret","type":"uint256"}],"name":"ChangeAzukiPriceForMelt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":true,"internalType":"uint256","name":"cardId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"azukiBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forUserAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forDokibuybackAmount","type":"uint256"}],"name":"Melt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum ChainbindersMelt.NftLevel","name":"nftLevel","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"ethAmountOfLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"azukiRequiredForMelt","type":"uint256"}],"name":"SetupRarityLevel","type":"event"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"additionalSupply","type":"uint256"},{"internalType":"enum ChainbindersMelt.NftLevel","name":"nftLevel","type":"uint8"}],"name":"addCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auzkiBurnAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"azuki","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ChainbindersMelt.NftLevel","name":"","type":"uint8"}],"name":"azukiBurnAmountOfLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardAmounWithId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardLevelWithId","outputs":[{"internalType":"enum ChainbindersMelt.NftLevel","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"changeAzukiBurnAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_forLegendary","type":"uint256"},{"internalType":"uint256","name":"_forEthereal","type":"uint256"},{"internalType":"uint256","name":"_forMythic","type":"uint256"},{"internalType":"uint256","name":"_forRare","type":"uint256"},{"internalType":"uint256","name":"_forCommon","type":"uint256"},{"internalType":"uint256","name":"_forSecret","type":"uint256"}],"name":"changeAzukiBurnAmountOfLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"changeBuybackAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dokiBuybackAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ChainbindersMelt.NftLevel","name":"","type":"uint8"}],"name":"ethAmountOfLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"melt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"momiji","outputs":[{"internalType":"contract IMomijiToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ChainbindersMelt.NftLevel","name":"","type":"uint8"}],"name":"nftCardAmountOfLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ChainbindersMelt.NftLevel","name":"","type":"uint8"}],"name":"nftRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"rarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"removeCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateETHAmountOfLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b50604051620040f7380380620040f7833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060006200006e620002d860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001246301ffc9a760e01b620002e060201b60201c565b6200014563bc197c8160e01b63f23a6e6160e01b18620002e060201b60201c565b6000600960006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505073c91ca8dc020f0135df86c1d88d4cdc9caf9982da600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736dc9950905baca54ccc97e4a0d0f24d9611b46ef600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002bf620003e960201b60201c565b620002cf6200054760201b60201c565b5050506200081b565b600033905090565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200037d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601c60026000806006811115620003fc57fe5b60068111156200040857fe5b815260200190815260200160002081905550601a60026000600160068111156200042e57fe5b60068111156200043a57fe5b815260200190815260200160002081905550601460026000600260068111156200046057fe5b60068111156200046c57fe5b815260200190815260200160002081905550600f60026000600360068111156200049257fe5b60068111156200049e57fe5b815260200190815260200160002081905550600a6002600060046006811115620004c457fe5b6006811115620004d057fe5b81526020019081526020016000208190555060016002600060056006811115620004f657fe5b60068111156200050257fe5b8152602001908152602001600020819055506000600260006006808111156200052757fe5b60068111156200053357fe5b815260200190815260200160002081905550565b6000606490506200056f670de0b6b3a7640000826200079060201b62002ca91790919060201c565b600860008060068111156200058057fe5b60068111156200058c57fe5b815260200190815260200160002081905550600060199050620005c6670de0b6b3a7640000826200079060201b62002ca91790919060201c565b6008600060016006811115620005d857fe5b6006811115620005e457fe5b8152602001908152602001600020819055506000600690506200061e670de0b6b3a7640000826200079060201b62002ca91790919060201c565b60086000600260068111156200063057fe5b60068111156200063c57fe5b81526020019081526020016000208190555060006003905062000676670de0b6b3a7640000826200079060201b62002ca91790919060201c565b60086000600360068111156200068857fe5b60068111156200069457fe5b815260200190815260200160002081905550600060019050620006ce670de0b6b3a7640000826200079060201b62002ca91790919060201c565b6008600060046006811115620006e057fe5b6006811115620006ec57fe5b81526020019081526020016000208190555060006101f4905062000727670de0b6b3a7640000826200079060201b62002ca91790919060201c565b60086000600560068111156200073957fe5b60068111156200074557fe5b8152602001908152602001600020819055506000600860006006808111156200076a57fe5b60068111156200077657fe5b815260200190815260200160002081905550505050505050565b600080831415620007a5576000905062000815565b6000828402905082848281620007b757fe5b041462000810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180620040d66021913960400191505060405180910390fd5b809150505b92915050565b60805160601c60a05160601c60c05160601c61385d6200087960003980611fcd528061264c52508061172b5280612945525080610c2a52806113215280611eac5280611f7c5280612b815280612bee5280613211525061385d6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637a61733711610104578063be9a6555116100a2578063e4be2d8411610071578063e4be2d8414610946578063f23a6e61146109a6578063f2fde38b14610ae8578063f559250f14610b2c576101da565b8063be9a6555146108b9578063c2946f78146108c3578063db2e21bc14610908578063e285091314610912576101da565b8063ada56e09116100de578063ada56e09146105ac578063b2e5ae86146105f1578063bc197c8114610635578063bca04b061461088b576101da565b80637a617337146104f15780638b58c569146105365780638da5cb5b14610578576101da565b806350e5565b1161017c57806363a599a41161014b57806363a599a41461049f5780636de1ff19146104a9578063715018a6146104b3578063738ca607146104bd576101da565b806350e5565b146103c4578063544736e61461040957806355cd87731461042957806360ad594e1461046b576101da565b80633fc8cef3116101b85780633fc8cef3146102c357806341fb5807146102f75780634a030ba21461033b5780634ae3540e14610380576101da565b806301ffc9a7146101df578063135d337e146102425780631982427b14610276575b600080fd5b61022a600480360360208110156101f557600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610b7a565b60405180821515815260200191505060405180910390f35b61024a610be2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a26004803603602081101561028c57600080fd5b8101908080359060200190929190505050610c08565b604051808260068111156102b257fe5b815260200191505060405180910390f35b6102cb610c28565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103396004803603602081101561030d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c4c565b005b61037e6004803603606081101561035157600080fd5b810190808035906020019092919080359060200190929190803560ff169060200190929190505050610de2565b005b6103ac6004803603602081101561039657600080fd5b8101908080359060200190929190505050611097565b60405180821515815260200191505060405180910390f35b6103f3600480360360208110156103da57600080fd5b81019080803560ff1690602001909291905050506110b7565b6040518082815260200191505060405180910390f35b6104116110cf565b60405180821515815260200191505060405180910390f35b6104556004803603602081101561043f57600080fd5b81019080803590602001909291905050506110e2565b6040518082815260200191505060405180910390f35b6104736110fa565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104a7611120565b005b6104b161126e565b005b6104bb6115bc565b005b6104c5611729565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105206004803603602081101561050757600080fd5b81019080803560ff16906020019092919050505061174d565b6040518082815260200191505060405180910390f35b6105626004803603602081101561054c57600080fd5b8101908080359060200190929190505050611765565b6040518082815260200191505060405180910390f35b610580611813565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105db600480360360208110156105c257600080fd5b81019080803560ff16906020019092919050505061183c565b6040518082815260200191505060405180910390f35b6106336004803603602081101561060757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611854565b005b610856600480360360a081101561064b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156106a857600080fd5b8201836020820111156106ba57600080fd5b803590602001918460208302840111640100000000831117156106dc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561073c57600080fd5b82018360208201111561074e57600080fd5b8035906020019184602083028401116401000000008311171561077057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107d057600080fd5b8201836020820111156107e257600080fd5b8035906020019184600183028401116401000000008311171561080457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506119ea565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6108b7600480360360208110156108a157600080fd5b81019080803590602001909291905050506119ff565b005b6108c1611c92565b005b6108f2600480360360208110156108d957600080fd5b81019080803560ff169060200190929190505050611de1565b6040518082815260200191505060405180910390f35b610910611df9565b005b61091a611fcb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a4600480360360c081101561095c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611fef565b005b610ab3600480360360a08110156109bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610a2d57600080fd5b820183602082011115610a3f57600080fd5b80359060200191846001830284011164010000000083111715610a6157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061221e565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610b2a60048036036020811015610afe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612233565b005b610b6260048036036040811015610b4257600080fd5b810190808035906020019092919080359060200190929190505050612425565b60405180821515815260200191505060405180910390f35b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c54612d2f565b73ffffffffffffffffffffffffffffffffffffffff16610c72611813565b73ffffffffffffffffffffffffffffffffffffffff1614610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973207a65726f206164647265737300000000000000000081525060200191505060405180910390fd5b80600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610dea612d2f565b73ffffffffffffffffffffffffffffffffffffffff16610e08611813565b73ffffffffffffffffffffffffffffffffffffffff1614610e91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6005600084815260200190815260200160002060009054906101000a900460ff161580610ef35750806006811115610ec557fe5b6006600085815260200190815260200160002060009054906101000a900460ff166006811115610ef157fe5b145b610f48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137956022913960400191505060405180910390fd5b60016005600085815260200190815260200160002060006101000a81548160ff021916908315150217905550610f9a826007600086815260200190815260200160002054612d3790919063ffffffff16565b6007600085815260200190815260200160002081905550610fed8260036000846006811115610fc557fe5b6006811115610fd057fe5b815260200190815260200160002054612d3790919063ffffffff16565b60036000836006811115610ffd57fe5b600681111561100857fe5b815260200190815260200160002081905550806006600085815260200190815260200160002060006101000a81548160ff0219169083600681111561104957fe5b021790555080600681111561105a57fe5b837fc43c275ef4f08ae8e6d8283f41a6d2a02cc8b4b4593309df91ba517f806d914c846040518082815260200191505060405180910390a3505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090505481565b600960009054906101000a900460ff1681565b60076020528060005260406000206000915090505481565b600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611128612d2f565b73ffffffffffffffffffffffffffffffffffffffff16611146611813565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600960009054906101000a900460ff16611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f74207374617274656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600960006101000a81548160ff021916908315150217905550565b611276612d2f565b73ffffffffffffffffffffffffffffffffffffffff16611294611813565b73ffffffffffffffffffffffffffffffffffffffff161461131d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113a657600080fd5b505afa1580156113ba573d6000803e3d6000fd5b505050506040513d60208110156113d057600080fd5b8101908080519060200190929190505050905060008190506000600690505b600081126115b757600081600681111561140557fe5b9050600082146114ab57600061146060646114526002600086600681111561142957fe5b600681111561143457fe5b81526020019081526020016000205488612ca990919063ffffffff16565b612dbf90919063ffffffff16565b9050806004600084600681111561147357fe5b600681111561147e57fe5b8152602001908152602001600020819055506114a38185612e4890919063ffffffff16565b9350506114da565b82600460008360068111156114bc57fe5b60068111156114c757fe5b8152602001908152602001600020819055505b8060068111156114e657fe5b7f2cbe1509e10e77eb6e776e2153e191facd71e75b274e0ca6bdfe8bbc9093acf06004600084600681111561151757fe5b600681111561152257fe5b8152602001908152602001600020546002600085600681111561154157fe5b600681111561154c57fe5b8152602001908152602001600020546008600086600681111561156b57fe5b600681111561157657fe5b81526020019081526020016000205460405180848152602001838152602001828152602001935050505060405180910390a2508080600190039150506113ef565b505050565b6115c4612d2f565b73ffffffffffffffffffffffffffffffffffffffff166115e2611813565b73ffffffffffffffffffffffffffffffffffffffff161461166b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60046020528060005260406000206000915090505481565b6000806006600084815260200190815260200160002060009054906101000a900460ff16905060006003600083600681111561179d57fe5b60068111156117a857fe5b815260200190815260200160002054905060008114156117cd5760009250505061180e565b61180981600460008560068111156117e157fe5b60068111156117ec57fe5b815260200190815260200160002054612dbf90919063ffffffff16565b925050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026020528060005260406000206000915090505481565b61185c612d2f565b73ffffffffffffffffffffffffffffffffffffffff1661187a611813565b73ffffffffffffffffffffffffffffffffffffffff1614611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973207a65726f206164647265737300000000000000000081525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600063bc197c8160e01b905095945050505050565b611a07612d2f565b73ffffffffffffffffffffffffffffffffffffffff16611a25611813565b73ffffffffffffffffffffffffffffffffffffffff1614611aae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6005600082815260200190815260200160002060009054906101000a900460ff16611b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43617264207769746820494420646f65736e277420657869737400000000000081525060200191505060405180910390fd5b60006006600083815260200190815260200160002060009054906101000a900460ff169050600060076000848152602001908152602001600020549050611bba8160036000856006811115611b9257fe5b6006811115611b9d57fe5b815260200190815260200160002054612e4890919063ffffffff16565b60036000846006811115611bca57fe5b6006811115611bd557fe5b8152602001908152602001600020819055506005600084815260200190815260200160002060006101000a81549060ff02191690556007600084815260200190815260200160002060009055600680600085815260200190815260200160002060006101000a81548160ff02191690836006811115611c5057fe5b0217905550827f05474591d5ef1c6e3c13c0677afa10b5428b8ad8b0ce8327eebbc94b7b520d17826040518082815260200191505060405180910390a2505050565b611c9a612d2f565b73ffffffffffffffffffffffffffffffffffffffff16611cb8611813565b73ffffffffffffffffffffffffffffffffffffffff1614611d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600960009054906101000a900460ff1615611dc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f416c72656164792073746172746564000000000000000000000000000000000081525060200191505060405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b60036020528060005260406000206000915090505481565b611e01612d2f565b73ffffffffffffffffffffffffffffffffffffffff16611e1f611813565b73ffffffffffffffffffffffffffffffffffffffff1614611ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d6020811015611f5b57600080fd5b81019080805190602001909291905050509050611fc0611f79611813565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ecb9092919063ffffffff16565b611fc861126e565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b611ff7612d2f565b73ffffffffffffffffffffffffffffffffffffffff16612015611813565b73ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b85600860008060068111156120af57fe5b60068111156120ba57fe5b8152602001908152602001600020819055508460086000600160068111156120de57fe5b60068111156120e957fe5b81526020019081526020016000208190555083600860006002600681111561210d57fe5b600681111561211857fe5b81526020019081526020016000208190555082600860006003600681111561213c57fe5b600681111561214757fe5b81526020019081526020016000208190555081600860006004600681111561216b57fe5b600681111561217657fe5b81526020019081526020016000208190555080600860006005600681111561219a57fe5b60068111156121a557fe5b8152602001908152602001600020819055507fadaa6363536f50a1e431cbbe538959e367d0d7c4ef9ac868e8e9abba3f3478ab86868686868660405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a1505050505050565b600063f23a6e6160e01b905095945050505050565b61223b612d2f565b73ffffffffffffffffffffffffffffffffffffffff16612259611813565b73ffffffffffffffffffffffffffffffffffffffff16146122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061376f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f53656e646572206e6f742068756d616e0000000000000000000000000000000081525060200191505060405180910390fd5b600960009054906101000a900460ff1661254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f74207374617274656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b600a8211156125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d656c74696e6720746f6f206d616e792063617264730000000000000000000081525060200191505060405180910390fd5b816007600085815260200190815260200160002054101561264a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f7420656e6f75676820636172647320617661696c61626c6500000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f242432a333086866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200180602001828103825260098152602001807f6e667473206d656c74000000000000000000000000000000000000000000000081525060200195505050505050600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b5050505060006006600085815260200190815260200160002060009054906101000a900460ff16905060068081111561278357fe5b81600681111561278f57fe5b14156128d6576127d183600360008460068111156127a957fe5b60068111156127b457fe5b815260200190815260200160002054612e4890919063ffffffff16565b600360008360068111156127e157fe5b60068111156127ec57fe5b815260200190815260200160002081905550612824836007600087815260200190815260200160002054612e4890919063ffffffff16565b6007600086815260200190815260200160002081905550833373ffffffffffffffffffffffffffffffffffffffff167f14235fd081efc8bdf0ade58a28ef1038a3b12c4696c3dbe36e7b9d03d8697806856008600060068081111561288557fe5b600681111561289057fe5b8152602001908152602001600020546000806040518085815260200184815260200183815260200182815260200194505050505060405180910390a36000915050612ca3565b6000600860008360068111156128e857fe5b60068111156128f357fe5b815260200190815260200160002054905060006129198286612ca990919063ffffffff16565b905061298a33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612f6d909392919063ffffffff16565b60008060005b87811015612b795760006129a38a611765565b90506129e181600460008a60068111156129b957fe5b60068111156129c457fe5b815260200190815260200160002054612e4890919063ffffffff16565b600460008960068111156129f157fe5b60068111156129fc57fe5b815260200190815260200160002081905550612a4b6001600360008a6006811115612a2357fe5b6006811115612a2e57fe5b815260200190815260200160002054612e4890919063ffffffff16565b60036000896006811115612a5b57fe5b6006811115612a6657fe5b815260200190815260200160002081905550612a9f6001600760008d815260200190815260200160002054612e4890919063ffffffff16565b600760008c8152602001908152602001600020819055506000612adf6064612ad1605585612ca990919063ffffffff16565b612dbf90919063ffffffff16565b9050612af48186612d3790919063ffffffff16565b94506000612b1f6064612b11600586612ca990919063ffffffff16565b612dbf90919063ffffffff16565b9050612b348186612d3790919063ffffffff16565b94506000612b5d82612b4f8587612e4890919063ffffffff16565b612e4890919063ffffffff16565b9050612b688161302e565b505050508080600101915050612990565b50612bc533837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ecb9092919063ffffffff16565b612c32600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ecb9092919063ffffffff16565b873373ffffffffffffffffffffffffffffffffffffffff167f14235fd081efc8bdf0ade58a28ef1038a3b12c4696c3dbe36e7b9d03d8697806898686866040518085815260200184815260200183815260200182815260200194505050505060405180910390a36001955050505050505b92915050565b600080831415612cbc5760009050612d29565b6000828402905082848281612ccd57fe5b0414612d24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137dd6021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b600080828401905083811015612db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808211612e36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b818381612e3f57fe5b04905092915050565b600082821115612ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b612f688363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e0565b505050565b613028846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e0565b50505050565b600081905060006006905060005b60068110156131f057600081600681111561305357fe5b905060006130a660646130986002600086600681111561306f57fe5b600681111561307a57fe5b81526020019081526020016000205489612ca990919063ffffffff16565b612dbf90919063ffffffff16565b90506000600360008460068111156130ba57fe5b60068111156130c557fe5b815260200190815260200160002054141561316257613116600460008460068111156130ed57fe5b60068111156130f857fe5b81526020019081526020016000205486612d3790919063ffffffff16565b945060006004600084600681111561312a57fe5b600681111561313557fe5b81526020019081526020016000208190555061315b600185612e4890919063ffffffff16565b93506131e1565b6131758186612e4890919063ffffffff16565b94506131b3816004600085600681111561318b57fe5b600681111561319657fe5b815260200190815260200160002054612d3790919063ffffffff16565b600460008460068111156131c357fe5b60068111156131ce57fe5b8152602001908152602001600020819055505b5050808060010191505061303c565b5060008214156132015750506133dd565b600081141561325a5761325533837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ecb9092919063ffffffff16565b6133da565b600061326f8284612dbf90919063ffffffff16565b905060006132986132898484612ca990919063ffffffff16565b85612e4890919063ffffffff16565b905060005b60068110156133d65760008160068111156132b457fe5b90506000600360008360068111156132c857fe5b60068111156132d357fe5b815260200190815260200160002054146133c85761332384600460008460068111156132fb57fe5b600681111561330657fe5b815260200190815260200160002054612d3790919063ffffffff16565b6004600083600681111561333357fe5b600681111561333e57fe5b81526020019081526020016000208190555060008311156133c757613395836004600084600681111561336d57fe5b600681111561337857fe5b815260200190815260200160002054612d3790919063ffffffff16565b600460008360068111156133a557fe5b60068111156133b057fe5b815260200190815260200160002081905550600092505b5b50808060010191505061329d565b5050505b50505b50565b6000613442826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134cf9092919063ffffffff16565b90506000815111156134ca5780806020019051602081101561346357600080fd5b81019080805190602001909291905050506134c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806137fe602a913960400191505060405180910390fd5b5b505050565b60606134de84846000856134e7565b90509392505050565b606082471015613542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137b76026913960400191505060405180910390fd5b61354b8561368f565b6135bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061360c57805182526020820191506020810190506020830392506135e9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461366e576040519150601f19603f3d011682016040523d82523d6000602084013e613673565b606091505b50915091506136838282866136a2565b92505050949350505050565b600080823b905060008111915050919050565b606083156136b257829050613767565b6000835111156136c55782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561372c578082015181840152602081019050613711565b50505050905090810190601f1680156137595780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343617264206c766c20646966666572656e74207468616e206f6e6573206164646564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ebb2d2114e88b6aa0ab04b3cea2677d1a0b759cca355a2fea31f41eb71196f8364736f6c63430007060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f770000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6190000000000000000000000007cdc0421469398e0f3aa8890693d86c840ac89310000000000000000000000002d0d9b4075e231bff33141d69df49ffcf3be7642

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

0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6190000000000000000000000007cdc0421469398e0f3aa8890693d86c840ac89310000000000000000000000002d0d9b4075e231bff33141d69df49ffcf3be7642

-----Decoded View---------------
Arg [0] : _weth (address): 0x7ceb23fd6bc0add59e62ac25578270cff1b9f619
Arg [1] : _azuki (address): 0x7cdc0421469398e0f3aa8890693d86c840ac8931
Arg [2] : _momiji (address): 0x2d0d9b4075e231bff33141d69df49ffcf3be7642

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619
Arg [1] : 0000000000000000000000007cdc0421469398e0f3aa8890693d86c840ac8931
Arg [2] : 0000000000000000000000002d0d9b4075e231bff33141d69df49ffcf3be7642


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.