Contract 0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e 4

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xf46055e79a0bcfc6f0ee5556659dfffd5de3f694bd31126d4193b90b145d830fMelt407453702023-03-25 8:47:271 day 3 hrs ago0xc6641daf8c5896dc75a6aa845dc3717a738c02d7 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.021420397842 106.277277537
0x486567521b0f4450164b465c68a2029792dbabc0afd2aa8dfb49c803e5acc3d5Melt407450402023-03-25 8:35:471 day 3 hrs ago0xc6641daf8c5896dc75a6aa845dc3717a738c02d7 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.023926973205 118.713648118
0x697dfed6eea6b30cd02cfae2002be407456d54dc604806a9d60ec10d92d552aaMelt405557292023-03-20 6:33:446 days 5 hrs ago0x0524c91701fcc461c90b3120769b5f295f706a16 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.018369684912 99.590597624
0x0a89251d72200d7b7a3d6bf3e4dccb84a34dbe383b15f3676ee49ff704763ab2Melt402447212023-03-12 3:09:1214 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.019849618009 107.614002608
0x9d3e601295c29df0e064ce5f3188447a6fc32b4723a9bba91364eb32bfb24c09Melt402446632023-03-12 3:07:0814 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.021170747277 114.776458252
0x06bfa45bf534fdd318d83a1692501d7b074b3ec060d7c09177c6893ee5b63402Melt402446522023-03-12 3:06:4414 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.022257359032 120.667485485
0x9c42ffa8a0e4987e0db3576e1ec55f0648d6a87a746aadaacb7ed77642f6e3e9Melt402446412023-03-12 3:06:2214 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.024455898361 132.586788764
0x270437ef079244a2ea3285c99adb7c093f9f91edb572fedcfdab572bd9dd799fMelt402446292023-03-12 3:05:5614 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.023781529589 128.930722299
0xd8758403fd146e876b40c0b9b1acc6e7326b6330a9016d7774060738104db8d0Melt402446132023-03-12 3:05:2214 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.024838226986 134.659569898
0x85c2db7d9514e9ced4468befd961fe6a09c915942ad397295ddecdea0e056358Melt402446022023-03-12 3:04:5814 days 8 hrs ago0xcb01f3d84f125667f87ed21a6c3854021c9d90db IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.028974768348 143.758277509
0xaea12e7bf370679a3da0ed653463c3c76f21015877930e541abe614f133f0c96Melt402047992023-03-11 2:26:0015 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.032657844718 172.56274554
0x2baa8ebcdfca8ceae80be63a297333f5346be5a889b39f89bb434cc8b5a86e6eMelt402047382023-03-11 2:23:2615 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.03349203943 176.970597036
0xea1bad41799bcb4c7fc24b2370e027ce8f337602ce08643489a6bfbd0c8a75b9Melt402046512023-03-11 2:20:1415 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.054439527961 287.656288765
0x1bb115f038b2ca6fa6f5bdbeb24c3f81f8bb922781949489c3dbb0a29ab12578Melt402046272023-03-11 2:19:2415 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.0639869879 338.104685289
0x4b197899401cda7c449937867d4b5bd548c1075f6ce7f6f4ec2680de47216fadMelt402045932023-03-11 2:18:1215 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.078446736839 414.509420455
0x1e083f8ed63b4c2c7fc5792edfd6040e8770a28d1e83a38adf1e5f4eb2ca8a35Melt402045742023-03-11 2:17:2815 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.098247851191 470.227155511
0x215eadda4e9282e22f0c23833beb178394358cdddac512ee5917ffe1371fe3c7Melt402045262023-03-11 2:15:1415 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.078779677484 344.584849596
0x0a0fc74844d36a4a37fa688fd9e1178d31477d3c30de3174b7f9d1631b18f88aMelt402045062023-03-11 2:14:0215 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.066298542059 267.002307865
0x8cf2fa4b4a0d5b26c6d6d242de45b4650b4383cddc4f79064e8311da454fedeaMelt402044452023-03-11 2:11:4815 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.099531810708 435.35534948
0x4cbb285f53cf564a46e6f1378d2a648c4715c2fb0638d0aafe51693c95a465daMelt402044222023-03-11 2:10:3215 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.064837280543 283.600355797
0xdec44799593f76b616c1aea0e760228c9838f4bec6a446cf57a7c852c609d3baMelt402043842023-03-11 2:09:1215 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.089287594094 390.546815679
0xc76fc2462d434043053bd58d010885df57c793c1d349e9279c8e82fa4574802bMelt402043362023-03-11 2:07:3015 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.107506581775 568.06047902
0xe2b6a19e08fb9d50993f479ed5e75b5c662e57ebf3d3c6070f2d570471ad565fMelt402042912023-03-11 2:05:3015 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.176983988946 935.176320181
0x98b90a7fe3fd65aaa6c481d2fc5469356d1491467bca1582ad4ea7ea19ddda14Melt402042352023-03-11 2:03:1415 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.146337488079 773.24143512
0xec5b058a18ff38d8c245c3f932945087298922f27103c67e6230060a851ca7c1Melt402041912023-03-11 2:01:1615 days 9 hrs ago0x71ed64148f128c3f3b5de1c69d0738f92f64a698 IN  0x36be28fd7ba9a610b1ff3866f2dc9b7807c6ee4e0 MATIC0.082052523785 433.562254483
[ 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.