{"file_path":"KeyMinter2.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: https://github.com/lendroidproject/protocol.2.0/blob/master/LICENSE.md\r\n\r\n\r\n// File: @openzeppelin/contracts/math/SafeMath.sol\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/**\r\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\r\n * checks.\r\n *\r\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\r\n * in bugs, because programmers usually assume that an overflow raises an\r\n * error, which is the standard behavior in high level programming languages.\r\n * `SafeMath` restores this intuition by reverting the transaction when an\r\n * operation overflows.\r\n *\r\n * Using this library instead of the unchecked operations eliminates an entire\r\n * class of bugs, so it's recommended to use it always.\r\n */\r\nlibrary SafeMath {\r\n    /**\r\n     * @dev Returns the addition of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `+` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Addition cannot overflow.\r\n     */\r\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        uint256 c = a + b;\r\n        require(c >= a, \"SafeMath: addition overflow\");\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return sub(a, b, \"SafeMath: subtraction overflow\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b <= a, errorMessage);\r\n        uint256 c = a - b;\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the multiplication of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `*` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Multiplication cannot overflow.\r\n     */\r\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\r\n        // benefit is lost if 'b' is also tested.\r\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\r\n        if (a == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 c = a * b;\r\n        require(c / a == b, \"SafeMath: multiplication overflow\");\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers. Reverts on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return div(a, b, \"SafeMath: division by zero\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b > 0, errorMessage);\r\n        uint256 c = a / b;\r\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * Reverts when dividing by zero.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return mod(a, b, \"SafeMath: modulo by zero\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * Reverts with custom message when dividing by zero.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b != 0, errorMessage);\r\n        return a % b;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/GSN/Context.sol\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/*\r\n * @dev Provides information about the current execution context, including the\r\n * sender of the transaction and its data. While these are generally available\r\n * via msg.sender and msg.data, they should not be accessed in such a direct\r\n * manner, since when dealing with GSN meta-transactions the account sending and\r\n * paying for execution may not be the actual sender (as far as an application\r\n * is concerned).\r\n *\r\n * This contract is only required for intermediate, library-like contracts.\r\n */\r\nabstract contract Context {\r\n    function _msgSender() internal view virtual returns (address payable) {\r\n        return msg.sender;\r\n    }\r\n\r\n    function _msgData() internal view virtual returns (bytes memory) {\r\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\r\n        return msg.data;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/access/Ownable.sol\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/**\r\n * @dev Contract module which provides a basic access control mechanism, where\r\n * there is an account (an owner) that can be granted exclusive access to\r\n * specific functions.\r\n *\r\n * By default, the owner account will be the one that deploys the contract. This\r\n * can later be changed with {transferOwnership}.\r\n *\r\n * This module is used through inheritance. It will make available the modifier\r\n * `onlyOwner`, which can be applied to your functions to restrict their use to\r\n * the owner.\r\n */\r\ncontract Ownable is Context {\r\n    address private _owner;\r\n\r\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r\n\r\n    /**\r\n     * @dev Initializes the contract setting the deployer as the initial owner.\r\n     */\r\n    constructor () {\r\n        address msgSender = _msgSender();\r\n        _owner = msgSender;\r\n        emit OwnershipTransferred(address(0), msgSender);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the address of the current owner.\r\n     */\r\n    function owner() public view returns (address) {\r\n        return _owner;\r\n    }\r\n\r\n    /**\r\n     * @dev Throws if called by any account other than the owner.\r\n     */\r\n    modifier onlyOwner() {\r\n        require(_owner == _msgSender(), \"Ownable: caller is not the owner\");\r\n        _;\r\n    }\r\n\r\n    /**\r\n     * @dev Leaves the contract without owner. It will not be possible to call\r\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\r\n     *\r\n     * NOTE: Renouncing ownership will leave the contract without an owner,\r\n     * thereby removing any functionality that is only available to the owner.\r\n     */\r\n    function renounceOwnership() public virtual onlyOwner {\r\n        emit OwnershipTransferred(_owner, address(0));\r\n        _owner = address(0);\r\n    }\r\n\r\n    /**\r\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\r\n     * Can only be called by the current owner.\r\n     */\r\n    function transferOwnership(address newOwner) public virtual onlyOwner {\r\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\r\n        emit OwnershipTransferred(_owner, newOwner);\r\n        _owner = newOwner;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/utils/Address.sol\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/**\r\n * @dev Collection of functions related to the address type\r\n */\r\nlibrary Address {\r\n    /**\r\n     * @dev Returns true if `account` is a contract.\r\n     *\r\n     * [IMPORTANT]\r\n     * ====\r\n     * It is unsafe to assume that an address for which this function returns\r\n     * false is an externally-owned account (EOA) and not a contract.\r\n     *\r\n     * Among others, `isContract` will return false for the following\r\n     * types of addresses:\r\n     *\r\n     *  - an externally-owned account\r\n     *  - a contract in construction\r\n     *  - an address where a contract will be created\r\n     *  - an address where a contract lived, but was destroyed\r\n     * ====\r\n     */\r\n    function isContract(address account) internal view returns (bool) {\r\n        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts\r\n        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned\r\n        // for accounts without code, i.e. `keccak256('')`\r\n        bytes32 codehash;\r\n        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\r\n        // solhint-disable-next-line no-inline-assembly\r\n        assembly { codehash := extcodehash(account) }\r\n        return (codehash != accountHash && codehash != 0x0);\r\n    }\r\n\r\n    /**\r\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\r\n     * `recipient`, forwarding all available gas and reverting on errors.\r\n     *\r\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\r\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\r\n     * imposed by `transfer`, making them unable to receive funds via\r\n     * `transfer`. {sendValue} removes this limitation.\r\n     *\r\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\r\n     *\r\n     * IMPORTANT: because control is transferred to `recipient`, care must be\r\n     * taken to not create reentrancy vulnerabilities. Consider using\r\n     * {ReentrancyGuard} or the\r\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\r\n     */\r\n    function sendValue(address payable recipient, uint256 amount) internal {\r\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\r\n        (bool success, ) = recipient.call{ value: amount }(\"\");\r\n        require(success, \"Address: unable to send value, recipient may have reverted\");\r\n    }\r\n\r\n    /**\r\n     * @dev Performs a Solidity function call using a low level `call`. A\r\n     * plain`call` is an unsafe replacement for a function call: use this\r\n     * function instead.\r\n     *\r\n     * If `target` reverts with a revert reason, it is bubbled up by this\r\n     * function (like regular Solidity function calls).\r\n     *\r\n     * Returns the raw returned data. To convert to the expected return value,\r\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `target` must be a contract.\r\n     * - calling `target` with `data` must not revert.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\r\n      return functionCall(target, data, \"Address: low-level call failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\r\n     * `errorMessage` as a fallback revert reason when `target` reverts.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\r\n        return _functionCallWithValue(target, data, 0, errorMessage);\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\r\n     * but also transferring `value` wei to `target`.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - the calling contract must have an ETH balance of at least `value`.\r\n     * - the called Solidity function must be `payable`.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\r\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\r\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\r\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\r\n        return _functionCallWithValue(target, data, value, errorMessage);\r\n    }\r\n\r\n    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {\r\n        require(isContract(target), \"Address: call to non-contract\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls\r\n        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);\r\n        if (success) {\r\n            return returndata;\r\n        } else {\r\n            // Look for revert reason and bubble it up if present\r\n            if (returndata.length > 0) {\r\n                // The easiest way to bubble the revert reason is using memory via assembly\r\n\r\n                // solhint-disable-next-line no-inline-assembly\r\n                assembly {\r\n                    let returndata_size := mload(returndata)\r\n                    revert(add(32, returndata), returndata_size)\r\n                }\r\n            } else {\r\n                revert(errorMessage);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// File: contracts/heartbeat/Pacemaker.sol\r\n\r\npragma solidity 0.7.5;\r\n\r\n\r\n\r\n/** @title Pacemaker\r\n    @author Lendroid Foundation\r\n    @notice Smart contract based on which various events in the Protocol take place\r\n    @dev Audit certificate : Pending\r\n*/\r\n\r\n\r\n// solhint-disable-next-line\r\nabstract contract Pacemaker {\r\n\r\n    using SafeMath for uint256;\r\n    uint256 constant public HEART_BEAT_START_TIME = 1607212800;// 2020-12-06 00:00:00 UTC (UTC +00:00)\r\n    uint256 constant public EPOCH_PERIOD = 8 hours;\r\n\r\n    /**\r\n        @notice Displays the epoch which contains the given timestamp\r\n        @return uint256 : Epoch value\r\n    */\r\n    function epochFromTimestamp(uint256 timestamp) public pure virtual returns (uint256) {\r\n        if (timestamp > HEART_BEAT_START_TIME) {\r\n            return timestamp.sub(HEART_BEAT_START_TIME).div(EPOCH_PERIOD).add(1);\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    /**\r\n        @notice Displays timestamp when a given epoch began\r\n        @return uint256 : Epoch start time\r\n    */\r\n    function epochStartTimeFromTimestamp(uint256 timestamp) public pure virtual returns (uint256) {\r\n        if (timestamp <= HEART_BEAT_START_TIME) {\r\n            return HEART_BEAT_START_TIME;\r\n        } else {\r\n            return HEART_BEAT_START_TIME.add((epochFromTimestamp(timestamp).sub(1)).mul(EPOCH_PERIOD));\r\n        }\r\n    }\r\n\r\n    /**\r\n        @notice Displays timestamp when a given epoch will end\r\n        @return uint256 : Epoch end time\r\n    */\r\n    function epochEndTimeFromTimestamp(uint256 timestamp) public pure virtual returns (uint256) {\r\n        if (timestamp < HEART_BEAT_START_TIME) {\r\n            return HEART_BEAT_START_TIME;\r\n        } else if (timestamp == HEART_BEAT_START_TIME) {\r\n            return HEART_BEAT_START_TIME.add(EPOCH_PERIOD);\r\n        } else {\r\n            return epochStartTimeFromTimestamp(timestamp).add(EPOCH_PERIOD);\r\n        }\r\n    }\r\n\r\n    /**\r\n        @notice Calculates current epoch value from the block timestamp\r\n        @dev Calculates the nth 8-hour window frame since the heartbeat's start time\r\n        @return uint256 : Current epoch value\r\n    */\r\n    function currentEpoch() public view virtual returns (uint256) {\r\n        return epochFromTimestamp(block.timestamp);// solhint-disable-line not-rely-on-time\r\n    }\r\n\r\n}\r\n\r\n// File: contracts/auctions/IRandomMinter.sol\r\n\r\npragma solidity 0.7.5;\r\n\r\n\r\n/**\r\n * @dev Required interface of an AuctionTokenProbabilityDistribution compliant contract.\r\n */\r\ninterface IRandomMinter {\r\n    function mintWithRandomness(uint256 randomResult, address to) external returns(\r\n        address newTokenAddress, uint256 newTokenId, uint256 feePercentage);\r\n\r\n    function transferOwnership(address newOwner) external;\r\n\r\n    function currentOwner() external view returns (address);\r\n}\r\n\r\n// File: contracts/auctions/season2/IERC721WhaleStreetSeason2.sol\r\n\r\npragma solidity 0.7.5;\r\n\r\n\r\n/**\r\n * @dev Required interface of an ERC721WhaleStreet compliant contract.\r\n */\r\ninterface IERC721WhaleStreetSeason2 {\r\n    function setBaseURI(string memory baseURI_) external;\r\n    function mint(address to) external;\r\n    function transferOwnership(address newOwner) external;\r\n    function getNextTokenId() external view returns (uint256);\r\n    function currentTokenId() external view returns (uint256);\r\n}\r\n\r\n// File: contracts/auctions/season2/KeyMinter2.sol\r\n\r\npragma solidity 0.7.5;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\ncontract KeyMinter2 is IRandomMinter, Pacemaker, Ownable {\r\n\r\n    using SafeMath for uint256;\r\n    using Address for address;\r\n\r\n    enum Rarity { REGULAR, UNIQUE, LEGENDARY }\r\n\r\n    mapping(Rarity => uint256) public daoTreasuryFeePercentages;\r\n\r\n    mapping(uint256 => address) public artists;\r\n\r\n    mapping(address => IERC721WhaleStreetSeason2[]) public artistAuctionTokens;\r\n\r\n    uint256 public constant SEASON_START_EPOCH = 823;\r\n    uint256 public constant EPOCHS_PER_WEEK = 21;\r\n\r\n    // solhint-disable-next-line func-visibility\r\n    constructor() {\r\n        daoTreasuryFeePercentages[Rarity.REGULAR] = 50;\r\n        daoTreasuryFeePercentages[Rarity.UNIQUE] = 25;\r\n        daoTreasuryFeePercentages[Rarity.LEGENDARY] = 5;\r\n    }\r\n\r\n    function setArtistAndAuctionTokens(uint256 artistIndex, address[4] memory addresses) external onlyOwner {\r\n        require(addresses[0] != address(0), \"{setArtistAndAuctionTokens} : invalid artist address\");\r\n        require(addresses[1].isContract(), \"{setArtistAndAuctionTokens} : invalid common auctionTokenAddress\");\r\n        require(addresses[2].isContract(), \"{setArtistAndAuctionTokens} : invalid rare auctionTokenAddress\");\r\n        require(addresses[3].isContract(), \"{setArtistAndAuctionTokens} : invalid legendary auctionTokenAddress\");\r\n        artists[artistIndex] = addresses[0];\r\n        artistAuctionTokens[addresses[0]] = [IERC721WhaleStreetSeason2(addresses[1]),\r\n            IERC721WhaleStreetSeason2(addresses[2]),\r\n            IERC721WhaleStreetSeason2(addresses[3])\r\n        ];\r\n    }\r\n\r\n    function transferERC721Ownership(address tokenAddress, address newOwner) external onlyOwner {\r\n        require(tokenAddress.isContract(), \"{transferERC721Ownership} : invalid tokenAddress\");\r\n        require(newOwner != address(0), \"{transferERC721Ownership} : invalid newOwner\");\r\n        // transfer ownership of ERC721 token to newOwner\r\n        IERC721WhaleStreetSeason2(tokenAddress).transferOwnership(newOwner);\r\n    }\r\n\r\n    function currentOwner() external view override returns (address) {\r\n        return owner();\r\n    }\r\n\r\n    function mintWithRandomness(uint256 randomResult, address to) public onlyOwner override returns (\r\n        address newTokenAddress, uint256 newTokenId, uint256 feePercentage) {\r\n        require((randomResult > 0) && (randomResult <= 100), \"Invalid randomResult\");\r\n        address artistAddress;\r\n        IERC721WhaleStreetSeason2 auctionToken;\r\n        // get artist\r\n        uint256 epochInCurrentWeek = currentEpoch().sub(SEASON_START_EPOCH).mod(EPOCHS_PER_WEEK);\r\n        if (epochInCurrentWeek < 6) {\r\n            artistAddress = artists[0];// Pxlq\r\n        } else if (epochInCurrentWeek >= 6 && randomResult < 15) {\r\n            artistAddress = artists[1];// Arturo Sandoval\r\n        } else {\r\n            artistAddress = artists[2];// 38 per Mille\r\n        }\r\n        require(artistAddress != address(0), \"artistAddress is zero\");\r\n        require(artistAuctionTokens[artistAddress].length == 3, \"invalid artistAuctionTokens count for artistAddress\");\r\n        if (randomResult < 15) {\r\n            auctionToken = artistAuctionTokens[artistAddress][2];\r\n            feePercentage = daoTreasuryFeePercentages[Rarity.LEGENDARY];\r\n        } else if (randomResult >= 15 && randomResult < 50) {\r\n            auctionToken = artistAuctionTokens[artistAddress][1];\r\n            feePercentage = daoTreasuryFeePercentages[Rarity.UNIQUE];\r\n        } else {\r\n            auctionToken = artistAuctionTokens[artistAddress][0];\r\n            feePercentage = daoTreasuryFeePercentages[Rarity.REGULAR];\r\n        }\r\n        newTokenAddress = address(auctionToken);\r\n        require(newTokenAddress != address(0), \"auctionToken address is zero\");\r\n        newTokenId = auctionToken.getNextTokenId();\r\n        auctionToken.mint(to);\r\n    }\r\n\r\n    function transferOwnership(address newOwner) public override(IRandomMinter, Ownable) onlyOwner {\r\n        require(newOwner != address(0), \"{transferOwnership} : invalid new owner\");\r\n        super.transferOwnership(newOwner);\r\n    }\r\n\r\n}","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063b387ef92116100a2578063d883786111610071578063d883786114610467578063e0febffa146104d6578063f2fde38b146104f4578063f96368d414610538578063fccc933e1461057d57610116565b8063b387ef92146102dd578063c4044d9414610311578063c48b6ed214610389578063cd7e10c11461040f57610116565b806387b94210116100e957806387b94210146101c75780638da5cb5b146101e55780639c511ad4146102195780639c683c6814610237578063a60a04811461029b57610116565b80631607aee71461011b578063715018a61461015d578063766718081461016757806378cc6cc514610185575b600080fd5b6101476004803603602081101561013157600080fd5b810190808035906020019092919050505061059b565b6040518082815260200191505060405180910390f35b6101656105f8565b005b61016f61077e565b6040518082815260200191505060405180910390f35b6101b16004803603602081101561019b57600080fd5b810190808035906020019092919050505061078e565b6040518082815260200191505060405180910390f35b6101cf6107f9565b6040518082815260200191505060405180910390f35b6101ed6107ff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610221610828565b6040518082815260200191505060405180910390f35b6102996004803603604081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061082e565b005b6102c7600480360360208110156102b157600080fd5b8101908080359060200190929190505050610a75565b6040518082815260200191505060405180910390f35b6102e5610adc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61035d6004803603604081101561032757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610aeb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d56004803603604081101561039f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b39565b604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b61043b6004803603602081101561042557600080fd5b8101908080359060200190929190505050611297565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104d4600480360360a081101561047d57600080fd5b810190808035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192905050506112ca565b005b6104de611750565b6040518082815260200191505060405180910390f35b6105366004803603602081101561050a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611758565b005b6105676004803603602081101561054e57600080fd5b81019080803560ff1690602001909291905050506118b2565b6040518082815260200191505060405180910390f35b6105856118ca565b6040518082815260200191505060405180910390f35b6000635fcc1f008211156105ee576105e760016105d96170806105cb635fcc1f00876118cf90919063ffffffff16565b61191990919063ffffffff16565b61196390919063ffffffff16565b90506105f3565b600090505b919050565b6106006119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006107894261059b565b905090565b6000635fcc1f008210156107a857635fcc1f0090506107f4565b635fcc1f008214156107d4576107cd617080635fcc1f0061196390919063ffffffff16565b90506107f4565b6107f16170806107e384610a75565b61196390919063ffffffff16565b90505b919050565b61033781565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61708081565b6108366119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109158273ffffffffffffffffffffffffffffffffffffffff166119f3565b61096a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806120ef6030913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061219b602c913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663f2fde38b826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050505050565b6000635fcc1f008211610a8e57635fcc1f009050610ad7565b610ad4610ac1617080610ab36001610aa58761059b565b6118cf90919063ffffffff16565b611a3e90919063ffffffff16565b635fcc1f0061196390919063ffffffff16565b90505b919050565b6000610ae66107ff565b905090565b60036020528160005260406000208181548110610b0757600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000610b466119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600085118015610c17575060648511155b610c89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642072616e646f6d526573756c7400000000000000000000000081525060200191505060405180910390fd5b6000806000610cbd6015610caf610337610ca161077e565b6118cf90919063ffffffff16565b611ac490919063ffffffff16565b90506006811015610d03576002600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250610d8e565b60068110158015610d145750600f88105b15610d5557600260006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250610d8d565b600260006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f61727469737441646472657373206973207a65726f000000000000000000000081525060200191505060405180910390fd5b60038060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014610ecb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806121c76033913960400191505060405180910390fd5b600f881015610f7d57600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600281548110610f1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060016000600280811115610f5c57fe5b6002811115610f6757fe5b81526020019081526020016000205493506110e3565b600f8810158015610f8e5750603288105b1561103d57600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600181548110610fde57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600160006001600281111561101c57fe5b600281111561102757fe5b81526020019081526020016000205493506110e2565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154811061108857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600160008060028111156110c557fe5b60028111156110d057fe5b81526020019081526020016000205493505b5b819550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f61756374696f6e546f6b656e2061646472657373206973207a65726f0000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663caa0f92a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d60208110156111f957600080fd5b810190808051906020019092919050505094508173ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561127557600080fd5b505af1158015611289573d6000803e3d6000fd5b505050505050509250925092565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112d26119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16816000600481106113b757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061211f6034913960400191505060405180910390fd5b6114598160016004811061143957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806120466040913960400191505060405180910390fd5b6114de816002600481106114be57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180612008603e913960400191505060405180910390fd5b6115638160036004811061154357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806120ac6043913960600191505060405180910390fd5b806000600481106115c557fe5b60200201516002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180606001604052808260016004811061163357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260026004811061167657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826003600481106116b957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060036000836000600481106116fe57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600361174b929190611f60565b505050565b635fcc1f0081565b6117606119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806121746027913960400191505060405180910390fd5b6118af81611b0e565b50565b60016020528060005260406000206000915090505481565b601581565b600061191183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d19565b905092915050565b600061195b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611dd9565b905092915050565b6000808284019050838110156119e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015611a3557506000801b8214155b92505050919050565b600080831415611a515760009050611abe565b6000828402905082848281611a6257fe5b0414611ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121536021913960400191505060405180910390fd5b809150505b92915050565b6000611b0683836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250611e9f565b905092915050565b611b166119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806120866026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000838311158290611dc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d8b578082015181840152602081019050611d70565b50505050905090810190601f168015611db85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290611e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e4a578082015181840152602081019050611e2f565b50505050905090810190601f168015611e775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611e9157fe5b049050809150509392505050565b6000808314158290611f4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f11578082015181840152602081019050611ef6565b50505050905090810190601f168015611f3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50828481611f5657fe5b0690509392505050565b828054828255906000526020600020908101928215611fd9579160200282015b82811115611fd85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611f80565b5b509050611fe69190611fea565b5090565b5b80821115612003576000816000905550600101611feb565b509056fe7b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c696420726172652061756374696f6e546f6b656e416464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c696420636f6d6d6f6e2061756374696f6e546f6b656e416464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c6964206c6567656e646172792061756374696f6e546f6b656e416464726573737b7472616e736665724552433732314f776e6572736869707d203a20696e76616c696420746f6b656e416464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c6964206172746973742061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777b7472616e736665724f776e6572736869707d203a20696e76616c6964206e6577206f776e65727b7472616e736665724552433732314f776e6572736869707d203a20696e76616c6964206e65774f776e6572696e76616c69642061727469737441756374696f6e546f6b656e7320636f756e7420666f722061727469737441646472657373a2646970667358221220c1c3d0ca279ff17e17f0b4945f36322b996d685e710a69506ffdf4ea09fb865564736f6c63430007050033","optimization_enabled":false,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"libraries":{},"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":null,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.7.5+commit.eb77ed08","is_verified_via_verifier_alliance":false,"verified_at":"2026-01-09T09:28:55.328028Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60806040523480156200001157600080fd5b506000620000246200015c60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350603260016000806002811115620000d557fe5b6002811115620000e157fe5b815260200190815260200160002081905550601960016000600160028111156200010757fe5b60028111156200011357fe5b8152602001908152602001600020819055506005600160006002808111156200013857fe5b60028111156200014457fe5b81526020019081526020016000208190555062000164565b600033905090565b61222f80620001746000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063b387ef92116100a2578063d883786111610071578063d883786114610467578063e0febffa146104d6578063f2fde38b146104f4578063f96368d414610538578063fccc933e1461057d57610116565b8063b387ef92146102dd578063c4044d9414610311578063c48b6ed214610389578063cd7e10c11461040f57610116565b806387b94210116100e957806387b94210146101c75780638da5cb5b146101e55780639c511ad4146102195780639c683c6814610237578063a60a04811461029b57610116565b80631607aee71461011b578063715018a61461015d578063766718081461016757806378cc6cc514610185575b600080fd5b6101476004803603602081101561013157600080fd5b810190808035906020019092919050505061059b565b6040518082815260200191505060405180910390f35b6101656105f8565b005b61016f61077e565b6040518082815260200191505060405180910390f35b6101b16004803603602081101561019b57600080fd5b810190808035906020019092919050505061078e565b6040518082815260200191505060405180910390f35b6101cf6107f9565b6040518082815260200191505060405180910390f35b6101ed6107ff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610221610828565b6040518082815260200191505060405180910390f35b6102996004803603604081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061082e565b005b6102c7600480360360208110156102b157600080fd5b8101908080359060200190929190505050610a75565b6040518082815260200191505060405180910390f35b6102e5610adc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61035d6004803603604081101561032757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610aeb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d56004803603604081101561039f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b39565b604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b61043b6004803603602081101561042557600080fd5b8101908080359060200190929190505050611297565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104d4600480360360a081101561047d57600080fd5b810190808035906020019092919080608001906004806020026040519081016040528092919082600460200280828437600081840152601f19601f82011690508083019250505050505091929192905050506112ca565b005b6104de611750565b6040518082815260200191505060405180910390f35b6105366004803603602081101561050a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611758565b005b6105676004803603602081101561054e57600080fd5b81019080803560ff1690602001909291905050506118b2565b6040518082815260200191505060405180910390f35b6105856118ca565b6040518082815260200191505060405180910390f35b6000635fcc1f008211156105ee576105e760016105d96170806105cb635fcc1f00876118cf90919063ffffffff16565b61191990919063ffffffff16565b61196390919063ffffffff16565b90506105f3565b600090505b919050565b6106006119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006107894261059b565b905090565b6000635fcc1f008210156107a857635fcc1f0090506107f4565b635fcc1f008214156107d4576107cd617080635fcc1f0061196390919063ffffffff16565b90506107f4565b6107f16170806107e384610a75565b61196390919063ffffffff16565b90505b919050565b61033781565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61708081565b6108366119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109158273ffffffffffffffffffffffffffffffffffffffff166119f3565b61096a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806120ef6030913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061219b602c913960400191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663f2fde38b826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b505050505050565b6000635fcc1f008211610a8e57635fcc1f009050610ad7565b610ad4610ac1617080610ab36001610aa58761059b565b6118cf90919063ffffffff16565b611a3e90919063ffffffff16565b635fcc1f0061196390919063ffffffff16565b90505b919050565b6000610ae66107ff565b905090565b60036020528160005260406000208181548110610b0757600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000610b466119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600085118015610c17575060648511155b610c89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c69642072616e646f6d526573756c7400000000000000000000000081525060200191505060405180910390fd5b6000806000610cbd6015610caf610337610ca161077e565b6118cf90919063ffffffff16565b611ac490919063ffffffff16565b90506006811015610d03576002600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250610d8e565b60068110158015610d145750600f88105b15610d5557600260006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250610d8d565b600260006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f61727469737441646472657373206973207a65726f000000000000000000000081525060200191505060405180910390fd5b60038060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014610ecb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806121c76033913960400191505060405180910390fd5b600f881015610f7d57600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600281548110610f1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060016000600280811115610f5c57fe5b6002811115610f6757fe5b81526020019081526020016000205493506110e3565b600f8810158015610f8e5750603288105b1561103d57600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600181548110610fde57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600160006001600281111561101c57fe5b600281111561102757fe5b81526020019081526020016000205493506110e2565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154811061108857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600160008060028111156110c557fe5b60028111156110d057fe5b81526020019081526020016000205493505b5b819550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f61756374696f6e546f6b656e2061646472657373206973207a65726f0000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663caa0f92a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111cf57600080fd5b505afa1580156111e3573d6000803e3d6000fd5b505050506040513d60208110156111f957600080fd5b810190808051906020019092919050505094508173ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561127557600080fd5b505af1158015611289573d6000803e3d6000fd5b505050505050509250925092565b60026020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112d26119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16816000600481106113b757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff161415611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061211f6034913960400191505060405180910390fd5b6114598160016004811061143957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001806120466040913960400191505060405180910390fd5b6114de816002600481106114be57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180612008603e913960400191505060405180910390fd5b6115638160036004811061154357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff166119f3565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806120ac6043913960600191505060405180910390fd5b806000600481106115c557fe5b60200201516002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180606001604052808260016004811061163357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260026004811061167657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001826003600481106116b957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060036000836000600481106116fe57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600361174b929190611f60565b505050565b635fcc1f0081565b6117606119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806121746027913960400191505060405180910390fd5b6118af81611b0e565b50565b60016020528060005260406000206000915090505481565b601581565b600061191183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d19565b905092915050565b600061195b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611dd9565b905092915050565b6000808284019050838110156119e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015611a3557506000801b8214155b92505050919050565b600080831415611a515760009050611abe565b6000828402905082848281611a6257fe5b0414611ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121536021913960400191505060405180910390fd5b809150505b92915050565b6000611b0683836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250611e9f565b905092915050565b611b166119eb565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806120866026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000838311158290611dc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d8b578082015181840152602081019050611d70565b50505050905090810190601f168015611db85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290611e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e4a578082015181840152602081019050611e2f565b50505050905090810190601f168015611e775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611e9157fe5b049050809150509392505050565b6000808314158290611f4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f11578082015181840152602081019050611ef6565b50505050905090810190601f168015611f3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50828481611f5657fe5b0690509392505050565b828054828255906000526020600020908101928215611fd9579160200282015b82811115611fd85782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611f80565b5b509050611fe69190611fea565b5090565b5b80821115612003576000816000905550600101611feb565b509056fe7b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c696420726172652061756374696f6e546f6b656e416464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c696420636f6d6d6f6e2061756374696f6e546f6b656e416464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c6964206c6567656e646172792061756374696f6e546f6b656e416464726573737b7472616e736665724552433732314f776e6572736869707d203a20696e76616c696420746f6b656e416464726573737b736574417274697374416e6441756374696f6e546f6b656e737d203a20696e76616c6964206172746973742061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777b7472616e736665724f776e6572736869707d203a20696e76616c6964206e6577206f776e65727b7472616e736665724552433732314f776e6572736869707d203a20696e76616c6964206e65774f776e6572696e76616c69642061727469737441756374696f6e546f6b656e7320636f756e7420666f722061727469737441646472657373a2646970667358221220c1c3d0ca279ff17e17f0b4945f36322b996d685e710a69506ffdf4ea09fb865564736f6c63430007050033","name":"KeyMinter2","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"default","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"EPOCHS_PER_WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPOCH_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEART_BEAT_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEASON_START_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistAuctionTokens","outputs":[{"internalType":"contract IERC721WhaleStreetSeason2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artists","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KeyMinter2.Rarity","name":"","type":"uint8"}],"name":"daoTreasuryFeePercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"epochEndTimeFromTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"epochFromTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"epochStartTimeFromTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomResult","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintWithRandomness","outputs":[{"internalType":"address","name":"newTokenAddress","type":"address"},{"internalType":"uint256","name":"newTokenId","type":"uint256"},{"internalType":"uint256","name":"feePercentage","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"artistIndex","type":"uint256"},{"internalType":"address[4]","name":"addresses","type":"address[4]"}],"name":"setArtistAndAuctionTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferERC721Ownership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}