Address Details
contract
0x9ff4EA9BebB124455cA0af44aDB92Fefb651E65A
- Contract Name
- MorpheusICO
- Creator
- 0x0fc039–a608ee at 0x62b1b4–f68343
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- 9 Transactions
- Transfers
- 12 Transfers
- Gas Used
- 612,344
- Last Balance Update
- 7895679
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- MorpheusICO
- Optimization enabled
- false
- Compiler version
- v0.8.6+commit.11564f7e
- EVM Version
- berlin
- Verified at
- 2023-02-06T10:34:11.251623Z
project:/contracts/MorpheusICO.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.6; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /** * @title DiceRoll Contract */ contract MorpheusICO is Ownable { using SafeERC20 for IERC20; /// @notice Event emitted when contract is deployed. event MorpheusICODeployed(); /// @notice Event emitted when the user bought the MORPHEUS token. event Bought(address user, uint256 amount); /// @notice Event emitted when withdrew any ERC20 tokens. event ERC20TokensWithdrew(address tokenAddress, uint256 amount); /// @notice Event emitted when buy token address is changed. event BuyTokenAddressChanged(address tokenAddress); /// @notice Event emitted when buy token price is changed. event TokenPriceChanged(uint256 tokenPrice); /// @notice Event emitted when ICO is closed. event ICOClosed(bool closed); /// @notice Event emitted when max token amount is changed. event MaxTokenAmountsChanged(uint256 newAmount); IERC20 MORPHEUS; address public buyTokenAddr; uint256 public tokenPrice = 15 * 10**16; uint256 public maxTokenAmountPerUser = 3 * 10**6; bool public isOpend; /** * @dev Constructor function * @param _MORPHEUS Interface of MORPHEUS * @param _buyTokenAddr Buy token address */ constructor(IERC20 _MORPHEUS, address _buyTokenAddr) { buyTokenAddr = _buyTokenAddr; MORPHEUS = _MORPHEUS; isOpend = true; emit MorpheusICODeployed(); } /** * @dev External function to buy the MORPHEUS token with cUSD. Current price is 0.15 * @param _amount Token amount */ function buy(uint256 _amount) external { require( _amount <= maxTokenAmountPerUser, "MorpheusICO: Out of token amounts" ); require(isOpend, "MorpheusICO: ICO is closed"); IERC20(buyTokenAddr).safeTransferFrom( msg.sender, address(this), _amount * tokenPrice ); MORPHEUS.safeTransfer(msg.sender, _amount); emit Bought(msg.sender, _amount); } /** * @dev External function to withdraw any ERC20 tokens. This function can be called by only owner. * @param _devWallet Address of developer. * @param _tokenContract Address of ERC20 token. */ function withdrawERC20Tokens(address _devWallet, address _tokenContract) external onlyOwner { IERC20 token = IERC20(_tokenContract); uint256 amount = token.balanceOf(address(this)); token.safeTransfer(_devWallet, amount); emit ERC20TokensWithdrew(_tokenContract, amount); } /** * @dev External function to change buy token address. This function can be called by only owner. * @param _tokenAddr New buy token address */ function changeBuyTokenAddress(address _tokenAddr) external onlyOwner { buyTokenAddr = _tokenAddr; emit BuyTokenAddressChanged(_tokenAddr); } /** * @dev External function to change token price. This function can be called by only owner. * @param _newPrice New price */ function changeTokenPrice(uint256 _newPrice) external onlyOwner { tokenPrice = _newPrice; emit TokenPriceChanged(_newPrice); } /** * @dev External function to close the ICO. This function can be called by only owner. */ function closeICO() external onlyOwner { isOpend = false; emit ICOClosed(isOpend); } /** * @dev External function to change max token amount per user. This function can be called by only owner. * @param _newAmount New token amount */ function changeMaxTokenAmount(uint256 _newAmount) external onlyOwner { maxTokenAmountPerUser = _newAmount; emit MaxTokenAmountsChanged(_newAmount); } }
/_openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
/_openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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); }
/_openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
/_openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ 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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
/_openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_MORPHEUS","internalType":"contract IERC20"},{"type":"address","name":"_buyTokenAddr","internalType":"address"}]},{"type":"event","name":"Bought","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuyTokenAddressChanged","inputs":[{"type":"address","name":"tokenAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ERC20TokensWithdrew","inputs":[{"type":"address","name":"tokenAddress","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ICOClosed","inputs":[{"type":"bool","name":"closed","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"MaxTokenAmountsChanged","inputs":[{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MorpheusICODeployed","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TokenPriceChanged","inputs":[{"type":"uint256","name":"tokenPrice","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buy","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"buyTokenAddr","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeBuyTokenAddress","inputs":[{"type":"address","name":"_tokenAddr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeMaxTokenAmount","inputs":[{"type":"uint256","name":"_newAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenPrice","inputs":[{"type":"uint256","name":"_newPrice","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeICO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOpend","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTokenAmountPerUser","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenPrice","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawERC20Tokens","inputs":[{"type":"address","name":"_devWallet","internalType":"address"},{"type":"address","name":"_tokenContract","internalType":"address"}]}]
Contract Creation Code
0x6080604052670214e8348c4f0000600355622dc6c06004553480156200002457600080fd5b50604051620019c6380380620019c683398181016040528101906200004a919062000235565b6200006a6200005e6200013b60201b60201c565b6200014360201b60201c565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600560006101000a81548160ff0219169083151502179055507f1a0ae285d7857b71784f2393966bd6698c56d9451d006d38b9855250ff9deeb760405160405180910390a15050620002fd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200021881620002c9565b92915050565b6000815190506200022f81620002e3565b92915050565b600080604083850312156200024f576200024e620002c4565b5b60006200025f858286016200021e565b9250506020620002728582860162000207565b9150509250929050565b60006200028982620002a4565b9050919050565b60006200029d826200027c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002d4816200027c565b8114620002e057600080fd5b50565b620002ee8162000290565b8114620002fa57600080fd5b50565b6116b9806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638098c2d11161008c578063b6e1f63211610066578063b6e1f632146101b4578063d96a094a146101d2578063f2fde38b146101ee578063fbc94f241461020a576100cf565b80638098c2d11461015c5780638da5cb5b1461017a5780639c6293d514610198576100cf565b80631308d9f4146100d457806338ad2e55146100f0578063542386451461010c57806361ebf53114610116578063715018a6146101345780637ff9b5961461013e575b600080fd5b6100ee60048036038101906100e99190610f8b565b610226565b005b61010a60048036038101906101059190610f1e565b6102e3565b005b61011461045b565b005b61011e61053a565b60405161012b9190611320565b60405180910390f35b61013c610540565b005b6101466105c8565b6040516101539190611320565b60405180910390f35b6101646105ce565b6040516101719190611203565b60405180910390f35b6101826105e1565b60405161018f9190611188565b60405180910390f35b6101b260048036038101906101ad9190610ef1565b61060a565b005b6101bc610701565b6040516101c99190611188565b60405180910390f35b6101ec60048036038101906101e79190610f8b565b610727565b005b61020860048036038101906102039190610ef1565b6108a0565b005b610224600480360381019061021f9190610f8b565b610998565b005b61022e610a55565b73ffffffffffffffffffffffffffffffffffffffff1661024c6105e1565b73ffffffffffffffffffffffffffffffffffffffff16146102a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610299906112c0565b60405180910390fd5b806004819055507f0f87594bf9b95df8745c9a0293c381fab28736c2cf29959552e8231931b30452816040516102d89190611320565b60405180910390a150565b6102eb610a55565b73ffffffffffffffffffffffffffffffffffffffff166103096105e1565b73ffffffffffffffffffffffffffffffffffffffff161461035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610356906112c0565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161039f9190611188565b60206040518083038186803b1580156103b757600080fd5b505afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190610fb8565b905061041c84828473ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fbea80160556933fefc2dc7c94fc4fb00066e4fb00d4de1bb17e4a8fcd14218c2838260405161044d9291906111da565b60405180910390a150505050565b610463610a55565b73ffffffffffffffffffffffffffffffffffffffff166104816105e1565b73ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ce906112c0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f9b8b56b38290aada0e4d2635f5153bc3f13aae2416937576aa2e9809e6333c06600560009054906101000a900460ff166040516105309190611203565b60405180910390a1565b60045481565b610548610a55565b73ffffffffffffffffffffffffffffffffffffffff166105666105e1565b73ffffffffffffffffffffffffffffffffffffffff16146105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906112c0565b60405180910390fd5b6105c66000610ae3565b565b60035481565b600560009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610612610a55565b73ffffffffffffffffffffffffffffffffffffffff166106306105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d906112c0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffc42e75628f57fbb516578285f391c3f1763e9674e40b81dfa29f540e15aca77816040516106f69190611188565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481111561076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390611260565b60405180910390fd5b600560009054906101000a900460ff166107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906112a0565b60405180910390fd5b6108173330600354846107ce919061136d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ba7909392919063ffffffff16565b6108643382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fc55650ccda1011e1cdc769b1fbf546ebb8c97800b6072b49e06cd560305b1d6733826040516108959291906111da565b60405180910390a150565b6108a8610a55565b73ffffffffffffffffffffffffffffffffffffffff166108c66105e1565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610913906112c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390611240565b60405180910390fd5b61099581610ae3565b50565b6109a0610a55565b73ffffffffffffffffffffffffffffffffffffffff166109be6105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906112c0565b60405180910390fd5b806003819055507fac21bacd333b316c6640fca5086322638b0a7aa4367179afd5dfcbe0a5427bc781604051610a4a9190611320565b60405180910390a150565b600033905090565b610ade8363a9059cbb60e01b8484604051602401610a7c9291906111da565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c2a846323b872dd60e01b858585604051602401610bc8939291906111a3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b50505050565b6000610c92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610cf79092919063ffffffff16565b9050600081511115610cf25780806020019051810190610cb29190610f5e565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890611300565b60405180910390fd5b5b505050565b6060610d068484600085610d0f565b90509392505050565b606082471015610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90611280565b60405180910390fd5b610d5d85610e23565b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93906112e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dc59190611171565b60006040518083038185875af1925050503d8060008114610e02576040519150601f19603f3d011682016040523d82523d6000602084013e610e07565b606091505b5091509150610e17828286610e36565b92505050949350505050565b600080823b905060008111915050919050565b60608315610e4657829050610e96565b600083511115610e595782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d919061121e565b60405180910390fd5b9392505050565b600081359050610eac8161163e565b92915050565b600081519050610ec181611655565b92915050565b600081359050610ed68161166c565b92915050565b600081519050610eeb8161166c565b92915050565b600060208284031215610f0757610f06611471565b5b6000610f1584828501610e9d565b91505092915050565b60008060408385031215610f3557610f34611471565b5b6000610f4385828601610e9d565b9250506020610f5485828601610e9d565b9150509250929050565b600060208284031215610f7457610f73611471565b5b6000610f8284828501610eb2565b91505092915050565b600060208284031215610fa157610fa0611471565b5b6000610faf84828501610ec7565b91505092915050565b600060208284031215610fce57610fcd611471565b5b6000610fdc84828501610edc565b91505092915050565b610fee816113c7565b82525050565b610ffd816113d9565b82525050565b600061100e8261133b565b6110188185611351565b935061102881856020860161140f565b80840191505092915050565b600061103f82611346565b611049818561135c565b935061105981856020860161140f565b61106281611476565b840191505092915050565b600061107a60268361135c565b915061108582611487565b604082019050919050565b600061109d60218361135c565b91506110a8826114d6565b604082019050919050565b60006110c060268361135c565b91506110cb82611525565b604082019050919050565b60006110e3601a8361135c565b91506110ee82611574565b602082019050919050565b600061110660208361135c565b91506111118261159d565b602082019050919050565b6000611129601d8361135c565b9150611134826115c6565b602082019050919050565b600061114c602a8361135c565b9150611157826115ef565b604082019050919050565b61116b81611405565b82525050565b600061117d8284611003565b915081905092915050565b600060208201905061119d6000830184610fe5565b92915050565b60006060820190506111b86000830186610fe5565b6111c56020830185610fe5565b6111d26040830184611162565b949350505050565b60006040820190506111ef6000830185610fe5565b6111fc6020830184611162565b9392505050565b60006020820190506112186000830184610ff4565b92915050565b600060208201905081810360008301526112388184611034565b905092915050565b600060208201905081810360008301526112598161106d565b9050919050565b6000602082019050818103600083015261127981611090565b9050919050565b60006020820190508181036000830152611299816110b3565b9050919050565b600060208201905081810360008301526112b9816110d6565b9050919050565b600060208201905081810360008301526112d9816110f9565b9050919050565b600060208201905081810360008301526112f98161111c565b9050919050565b600060208201905081810360008301526113198161113f565b9050919050565b60006020820190506113356000830184611162565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061137882611405565b915061138383611405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156113bc576113bb611442565b5b828202905092915050565b60006113d2826113e5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561142d578082015181840152602081019050611412565b8381111561143c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a204f7574206f6620746f6b656e20616d6f756e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a2049434f20697320636c6f736564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b611647816113c7565b811461165257600080fd5b50565b61165e816113d9565b811461166957600080fd5b50565b61167581611405565b811461168057600080fd5b5056fea264697066735822122039b7353c80ba8f76d57ea04544aacd70ba9d5d826c4ebfb8043bc95cb51bd4e464736f6c6343000806003300000000000000000000000027f1b217dbc57ecdbdb346d20fb57fa34cbbb3ac000000000000000000000000874069fa1eb16d44d622f2e0ca25eea172369bc1
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638098c2d11161008c578063b6e1f63211610066578063b6e1f632146101b4578063d96a094a146101d2578063f2fde38b146101ee578063fbc94f241461020a576100cf565b80638098c2d11461015c5780638da5cb5b1461017a5780639c6293d514610198576100cf565b80631308d9f4146100d457806338ad2e55146100f0578063542386451461010c57806361ebf53114610116578063715018a6146101345780637ff9b5961461013e575b600080fd5b6100ee60048036038101906100e99190610f8b565b610226565b005b61010a60048036038101906101059190610f1e565b6102e3565b005b61011461045b565b005b61011e61053a565b60405161012b9190611320565b60405180910390f35b61013c610540565b005b6101466105c8565b6040516101539190611320565b60405180910390f35b6101646105ce565b6040516101719190611203565b60405180910390f35b6101826105e1565b60405161018f9190611188565b60405180910390f35b6101b260048036038101906101ad9190610ef1565b61060a565b005b6101bc610701565b6040516101c99190611188565b60405180910390f35b6101ec60048036038101906101e79190610f8b565b610727565b005b61020860048036038101906102039190610ef1565b6108a0565b005b610224600480360381019061021f9190610f8b565b610998565b005b61022e610a55565b73ffffffffffffffffffffffffffffffffffffffff1661024c6105e1565b73ffffffffffffffffffffffffffffffffffffffff16146102a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610299906112c0565b60405180910390fd5b806004819055507f0f87594bf9b95df8745c9a0293c381fab28736c2cf29959552e8231931b30452816040516102d89190611320565b60405180910390a150565b6102eb610a55565b73ffffffffffffffffffffffffffffffffffffffff166103096105e1565b73ffffffffffffffffffffffffffffffffffffffff161461035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610356906112c0565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161039f9190611188565b60206040518083038186803b1580156103b757600080fd5b505afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190610fb8565b905061041c84828473ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fbea80160556933fefc2dc7c94fc4fb00066e4fb00d4de1bb17e4a8fcd14218c2838260405161044d9291906111da565b60405180910390a150505050565b610463610a55565b73ffffffffffffffffffffffffffffffffffffffff166104816105e1565b73ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ce906112c0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f9b8b56b38290aada0e4d2635f5153bc3f13aae2416937576aa2e9809e6333c06600560009054906101000a900460ff166040516105309190611203565b60405180910390a1565b60045481565b610548610a55565b73ffffffffffffffffffffffffffffffffffffffff166105666105e1565b73ffffffffffffffffffffffffffffffffffffffff16146105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906112c0565b60405180910390fd5b6105c66000610ae3565b565b60035481565b600560009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610612610a55565b73ffffffffffffffffffffffffffffffffffffffff166106306105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d906112c0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffc42e75628f57fbb516578285f391c3f1763e9674e40b81dfa29f540e15aca77816040516106f69190611188565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481111561076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390611260565b60405180910390fd5b600560009054906101000a900460ff166107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906112a0565b60405180910390fd5b6108173330600354846107ce919061136d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ba7909392919063ffffffff16565b6108643382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fc55650ccda1011e1cdc769b1fbf546ebb8c97800b6072b49e06cd560305b1d6733826040516108959291906111da565b60405180910390a150565b6108a8610a55565b73ffffffffffffffffffffffffffffffffffffffff166108c66105e1565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610913906112c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390611240565b60405180910390fd5b61099581610ae3565b50565b6109a0610a55565b73ffffffffffffffffffffffffffffffffffffffff166109be6105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906112c0565b60405180910390fd5b806003819055507fac21bacd333b316c6640fca5086322638b0a7aa4367179afd5dfcbe0a5427bc781604051610a4a9190611320565b60405180910390a150565b600033905090565b610ade8363a9059cbb60e01b8484604051602401610a7c9291906111da565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c2a846323b872dd60e01b858585604051602401610bc8939291906111a3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b50505050565b6000610c92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610cf79092919063ffffffff16565b9050600081511115610cf25780806020019051810190610cb29190610f5e565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890611300565b60405180910390fd5b5b505050565b6060610d068484600085610d0f565b90509392505050565b606082471015610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90611280565b60405180910390fd5b610d5d85610e23565b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93906112e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dc59190611171565b60006040518083038185875af1925050503d8060008114610e02576040519150601f19603f3d011682016040523d82523d6000602084013e610e07565b606091505b5091509150610e17828286610e36565b92505050949350505050565b600080823b905060008111915050919050565b60608315610e4657829050610e96565b600083511115610e595782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d919061121e565b60405180910390fd5b9392505050565b600081359050610eac8161163e565b92915050565b600081519050610ec181611655565b92915050565b600081359050610ed68161166c565b92915050565b600081519050610eeb8161166c565b92915050565b600060208284031215610f0757610f06611471565b5b6000610f1584828501610e9d565b91505092915050565b60008060408385031215610f3557610f34611471565b5b6000610f4385828601610e9d565b9250506020610f5485828601610e9d565b9150509250929050565b600060208284031215610f7457610f73611471565b5b6000610f8284828501610eb2565b91505092915050565b600060208284031215610fa157610fa0611471565b5b6000610faf84828501610ec7565b91505092915050565b600060208284031215610fce57610fcd611471565b5b6000610fdc84828501610edc565b91505092915050565b610fee816113c7565b82525050565b610ffd816113d9565b82525050565b600061100e8261133b565b6110188185611351565b935061102881856020860161140f565b80840191505092915050565b600061103f82611346565b611049818561135c565b935061105981856020860161140f565b61106281611476565b840191505092915050565b600061107a60268361135c565b915061108582611487565b604082019050919050565b600061109d60218361135c565b91506110a8826114d6565b604082019050919050565b60006110c060268361135c565b91506110cb82611525565b604082019050919050565b60006110e3601a8361135c565b91506110ee82611574565b602082019050919050565b600061110660208361135c565b91506111118261159d565b602082019050919050565b6000611129601d8361135c565b9150611134826115c6565b602082019050919050565b600061114c602a8361135c565b9150611157826115ef565b604082019050919050565b61116b81611405565b82525050565b600061117d8284611003565b915081905092915050565b600060208201905061119d6000830184610fe5565b92915050565b60006060820190506111b86000830186610fe5565b6111c56020830185610fe5565b6111d26040830184611162565b949350505050565b60006040820190506111ef6000830185610fe5565b6111fc6020830184611162565b9392505050565b60006020820190506112186000830184610ff4565b92915050565b600060208201905081810360008301526112388184611034565b905092915050565b600060208201905081810360008301526112598161106d565b9050919050565b6000602082019050818103600083015261127981611090565b9050919050565b60006020820190508181036000830152611299816110b3565b9050919050565b600060208201905081810360008301526112b9816110d6565b9050919050565b600060208201905081810360008301526112d9816110f9565b9050919050565b600060208201905081810360008301526112f98161111c565b9050919050565b600060208201905081810360008301526113198161113f565b9050919050565b60006020820190506113356000830184611162565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061137882611405565b915061138383611405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156113bc576113bb611442565b5b828202905092915050565b60006113d2826113e5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561142d578082015181840152602081019050611412565b8381111561143c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a204f7574206f6620746f6b656e20616d6f756e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a2049434f20697320636c6f736564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b611647816113c7565b811461165257600080fd5b50565b61165e816113d9565b811461166957600080fd5b50565b61167581611405565b811461168057600080fd5b5056fea264697066735822122039b7353c80ba8f76d57ea04544aacd70ba9d5d826c4ebfb8043bc95cb51bd4e464736f6c63430008060033