Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
ChainbindersMelt
Compiler Version
v0.7.6+commit.7338295f
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.