Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- walletRouletteSpin
- Optimization enabled
- true
- Compiler version
- v0.8.28+commit.7893614a
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2024-11-21T13:14:11.837877Z
Constructor Arguments
0x000000000000000000000000e447ae32294575fa356861858d545373c04d6942
Arg [0] (address) : 0xe447ae32294575fa356861858d545373c04d6942
Contract source code
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract walletRouletteSpin is Ownable, ReentrancyGuard { using SafeMath for uint256; bytes32 private signKey10Spins; bytes32 private signKey20Spins; bytes32 private signKey50Spins; bytes32 private signKey100Spins; bytes32 private signKey250Spins; uint256 private usdTransfered = 0; uint256 private RLTSold = 0; uint256 public fumaInUSD = 2000000000000000; event keyGenerated(address indexed buyer, uint256 amountFUMA); event FUMAReceived(address indexed from, uint256 value); mapping(address => bytes32) private signatures; mapping(address => bool) public authorizedAddresses; modifier onlyAuthorized() { require( authorizedAddresses[msg.sender], "You are not authorized to do that!" ); _; } constructor(address initialOwner) Ownable(initialOwner) { signKey10Spins = generateSignKey(0); signKey20Spins = generateSignKey(signKey10Spins); signKey50Spins = generateSignKey(signKey20Spins); signKey100Spins = generateSignKey(signKey50Spins); signKey250Spins = generateSignKey(signKey100Spins); } function PayableFunction( string memory apiKey ) external payable nonReentrant { require(msg.value != 0, "Amount must be greater than zero"); generateAPIkey(msg.value, apiKey); transferFUMA(owner(), msg.value); // Transfer FUMA to the owner } function generateSignKey(bytes32 key) internal view returns (bytes32) { bytes32 randomness = keccak256( abi.encodePacked( block.timestamp, block.difficulty, block.coinbase, blockhash(block.number), key ) ); return randomness; } function generateAPIkey(uint256 FUMAAmount, string memory apiKey) internal { require(FUMAAmount > 0, "Amount must be greater than zero"); require(bytes(apiKey).length > 0, "API key should not be empty"); // Get FUMA/USD price from Chainlink Price Feed // Calculate the number of RLTs based on sent FUMAs and their current price (calculated in Cents because solidity doesnt support float nums) uint256 sentFUMACents = FUMAAmount.mul(uint256(fumaInUSD)).div( 10 ** 34 ); // FUMAAmount.mul(uint256(1)).div(10**16) for test require(sentFUMACents > 0, "Invalid price"); require(sentFUMACents < 1050, "Invalid price"); bytes32 signature; // Prices are just examples if (sentFUMACents > 80 && sentFUMACents <= 120) { // around 1$ = 10 Spins signature = keccak256(abi.encodePacked(apiKey, signKey10Spins)); RLTSold = RLTSold.add(10); } else if (sentFUMACents > 130 && sentFUMACents <= 170) { // around 1.5$ = 20 signature = keccak256(abi.encode(apiKey, signKey20Spins)); RLTSold = RLTSold.add(20); } else if (sentFUMACents > 280 && sentFUMACents <= 320) { // around 3$ = 50 signature = keccak256(abi.encodePacked(apiKey, signKey50Spins)); RLTSold = RLTSold.add(50); } else if (sentFUMACents > 480 && sentFUMACents <= 520) { // around 5$ = 100 signature = keccak256(abi.encodePacked(apiKey, signKey100Spins)); RLTSold = RLTSold.add(100); } else if (sentFUMACents > 980 && sentFUMACents <= 1020) { // around 10$ = 250 signature = keccak256(abi.encodePacked(apiKey, signKey250Spins)); RLTSold = RLTSold.add(250); } else { revert("Invalid number of tokens to buy"); } usdTransfered = usdTransfered.add(sentFUMACents); // Emit event emit keyGenerated(msg.sender, FUMAAmount); signatures[msg.sender] = signature; } function showSignKeys() public view onlyAuthorized returns (bytes32[] memory) { bytes32[] memory keys = new bytes32[](5); keys[0] = signKey10Spins; keys[1] = signKey20Spins; keys[2] = signKey50Spins; keys[3] = signKey100Spins; keys[4] = signKey250Spins; return keys; } function showCoinsTransfered() external view onlyAuthorized returns (uint256 amount) { return usdTransfered; } function showSoldSpins() external view onlyAuthorized returns (uint256 amount) { return RLTSold; } function showSignature(address _owner) external view returns (bytes32) { require(_owner == msg.sender, "You are not the owner of this address!"); return signatures[msg.sender]; } function generateNewSignKeys() external onlyAuthorized { signKey10Spins = generateSignKey(0); signKey20Spins = generateSignKey(signKey10Spins); signKey50Spins = generateSignKey(signKey20Spins); signKey100Spins = generateSignKey(signKey50Spins); signKey250Spins = generateSignKey(signKey100Spins); } function authorizeAddress(address _authorized) external onlyOwner { authorizedAddresses[_authorized] = true; } function revokeAuthorizarion(address _authorized) external onlyOwner { authorizedAddresses[_authorized] = false; } function transferFUMA(address to, uint256 amount) internal { require(to != address(0), "Invalid recipient address"); require(address(this).balance >= amount, "Insufficient FUMA balance"); (bool success, ) = payable(to).call{value: amount}(""); require(success, "FUMA transfer failed"); } function changePrice(uint256 _newPrice) public onlyAuthorized { require(_newPrice > 0, "Invalid Price"); fumaInUSD = _newPrice; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"initialOwner","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"FUMAReceived","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"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":"keyGenerated","inputs":[{"type":"address","name":"buyer","internalType":"address","indexed":true},{"type":"uint256","name":"amountFUMA","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[],"name":"PayableFunction","inputs":[{"type":"string","name":"apiKey","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"authorizeAddress","inputs":[{"type":"address","name":"_authorized","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"authorizedAddresses","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changePrice","inputs":[{"type":"uint256","name":"_newPrice","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fumaInUSD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"generateNewSignKeys","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":"nonpayable","outputs":[],"name":"revokeAuthorizarion","inputs":[{"type":"address","name":"_authorized","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"showCoinsTransfered","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"showSignKeys","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"showSignature","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"showSoldSpins","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x60806040526000600755600060085566071afd498d000060095534801561002557600080fd5b5060405161125538038061125583398101604081905261004491610243565b806001600160a01b03811661007357604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61007c816101f3565b505060018055604080514260208083018290524483850181905241606090811b6001600160601b03191690850181905243406074860181905260006094808801919091528751808803909101815260b487018852805190850120600281905560d4870186905260f4870184905261011487018390526101288701829052610148808801919091528751808803909101815261016887018852805190850120600381905561018887018690526101a887018490526101c887018390526101dc87018290526101fc808801919091528751808803909101815261021c87018852805190850120600481905561023c870186905261025c870184905261027c870183905261029087018290526102b080880191909152875180880390910181526102d08701885280519085012060058190556102f087019590955261031086019290925261033085015261034484015261036480840192909252835180840390920182526103849092019092528151910120600655610273565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561025557600080fd5b81516001600160a01b038116811461026c57600080fd5b9392505050565b610fd3806102826000396000f3fe6080604052600436106100dd5760003560e01c8063a2b40d191161007f578063cb12c1aa11610059578063cb12c1aa14610207578063d2b08a9a1461021c578063f19e207e1461023e578063f2fde38b1461027e57600080fd5b8063a2b40d19146101b4578063c1c08e70146101d4578063c5334e0d146101e757600080fd5b8063723228a8116100bb578063723228a814610141578063795f78f1146101575780637e275943146101775780638da5cb5b1461018c57600080fd5b80634a5db3b5146100e257806363c85b1214610104578063715018a61461012c575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610d07565b61029e565b005b34801561011057600080fd5b506101196102ca565b6040519081526020015b60405180910390f35b34801561013857600080fd5b50610102610309565b34801561014d57600080fd5b5061011960095481565b34801561016357600080fd5b50610102610172366004610d07565b61031d565b34801561018357600080fd5b50610119610346565b34801561019857600080fd5b506000546040516001600160a01b039091168152602001610123565b3480156101c057600080fd5b506101026101cf366004610d37565b61037c565b6101026101e2366004610d66565b6103f0565b3480156101f357600080fd5b50610119610202366004610d07565b610479565b34801561021357600080fd5b506101026104f7565b34801561022857600080fd5b5061023161056d565b6040516101239190610e1f565b34801561024a57600080fd5b5061026e610259366004610d07565b600b6020526000908152604090205460ff1681565b6040519015158152602001610123565b34801561028a57600080fd5b50610102610299366004610d07565b610670565b6102a66106ab565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b336000908152600b602052604081205460ff166103025760405162461bcd60e51b81526004016102f990610e62565b60405180910390fd5b5060075490565b6103116106ab565b61031b60006106d8565b565b6103256106ab565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b336000908152600b602052604081205460ff166103755760405162461bcd60e51b81526004016102f990610e62565b5060085490565b336000908152600b602052604090205460ff166103ab5760405162461bcd60e51b81526004016102f990610e62565b600081116103eb5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420507269636560981b60448201526064016102f9565b600955565b6103f8610728565b346000036104485760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b6104523482610781565b61046d6104676000546001600160a01b031690565b34610b3f565b61047660018055565b50565b60006001600160a01b03821633146104e25760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320616460448201526564726573732160d01b60648201526084016102f9565b5050336000908152600a602052604090205490565b336000908152600b602052604090205460ff166105265760405162461bcd60e51b81526004016102f990610e62565b6105306000610c84565b600281905561053e90610c84565b600381905561054c90610c84565b600481905561055a90610c84565b600581905561056890610c84565b600655565b336000908152600b602052604090205460609060ff1661059f5760405162461bcd60e51b81526004016102f990610e62565b60408051600580825260c082019092526000916020820160a080368337019050509050600254816000815181106105d8576105d8610ea4565b602002602001018181525050600354816001815181106105fa576105fa610ea4565b6020026020010181815250506004548160028151811061061c5761061c610ea4565b6020026020010181815250506005548160038151811061063e5761063e610ea4565b6020026020010181815250506006548160048151811061066057610660610ea4565b6020908102919091010152905090565b6106786106ab565b6001600160a01b0381166106a257604051631e4fbdf760e01b8152600060048201526024016102f9565b610476816106d8565b6000546001600160a01b0316331461031b5760405163118cdaa760e01b81523360048201526024016102f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60026001540361077a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016102f9565b6002600155565b600082116107d15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b60008151116108225760405162461bcd60e51b815260206004820152601b60248201527f415049206b65792073686f756c64206e6f7420626520656d707479000000000060448201526064016102f9565b60006108526e01ed09bead87c0378d8e640000000061084c60095486610cda90919063ffffffff16565b90610cef565b9050600081116108945760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b61041a81106108d55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b60006050821180156108e8575060788211155b1561093757600254604051610901918591602001610ede565b60405160208183030381529060405280519060200120905061092f600a600854610cfb90919063ffffffff16565b600855610ae5565b608282118015610948575060aa8211155b1561098f57600354604051610961918591602001610f00565b60405160208183030381529060405280519060200120905061092f6014600854610cfb90919063ffffffff16565b610118821180156109a257506101408211155b156109e9576004546040516109bb918591602001610ede565b60405160208183030381529060405280519060200120905061092f6032600854610cfb90919063ffffffff16565b6101e0821180156109fc57506102088211155b15610a4357600554604051610a15918591602001610ede565b60405160208183030381529060405280519060200120905061092f6064600854610cfb90919063ffffffff16565b6103d482118015610a5657506103fc8211155b15610a9d57600654604051610a6f918591602001610ede565b60405160208183030381529060405280519060200120905061092f60fa600854610cfb90919063ffffffff16565b60405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206e756d626572206f6620746f6b656e7320746f206275790060448201526064016102f9565b600754610af29083610cfb565b60075560405184815233907f092522d744884d151f21752e3dad30682f9f9aad71a5c8727156b7d013dfe2ba9060200160405180910390a2336000908152600a6020526040902055505050565b6001600160a01b038216610b955760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e7420616464726573730000000000000060448201526064016102f9565b80471015610be55760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742046554d412062616c616e63650000000000000060448201526064016102f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5050905080610c7f5760405162461bcd60e51b815260206004820152601460248201527311955350481d1c985b9cd9995c8819985a5b195960621b60448201526064016102f9565b505050565b6040805142602080830191909152448284015241606090811b6bffffffffffffffffffffffff191690830152434060748301526094808301949094528251808303909401845260b4909101909152815191012090565b6000610ce68284610f51565b90505b92915050565b6000610ce68284610f68565b6000610ce68284610f8a565b600060208284031215610d1957600080fd5b81356001600160a01b0381168114610d3057600080fd5b9392505050565b600060208284031215610d4957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610d7857600080fd5b813567ffffffffffffffff811115610d8f57600080fd5b8201601f81018413610da057600080fd5b803567ffffffffffffffff811115610dba57610dba610d50565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610de957610de9610d50565b604052818152828201602001861015610e0157600080fd5b81602084016020830137600091810160200191909152949350505050565b602080825282518282018190526000918401906040840190835b81811015610e57578351835260209384019390920191600101610e39565b509095945050505050565b60208082526022908201527f596f7520617265206e6f7420617574686f72697a656420746f20646f20746861604082015261742160f01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610ed5578181015183820152602001610ebd565b50506000910152565b60008351610ef0818460208801610eba565b9190910191825250602001919050565b6040815260008351806040840152610f1f816060850160208801610eba565b602083019390935250601f91909101601f191601606001919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9610f3b565b600082610f8557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ce957610ce9610f3b56fea26469706673582212200a42d569edd77a0809f0cb44e396a4f3170b9f072399d12a6de9c2fbc3338a1564736f6c634300081c0033000000000000000000000000e447ae32294575fa356861858d545373c04d6942
Deployed ByteCode
0x6080604052600436106100dd5760003560e01c8063a2b40d191161007f578063cb12c1aa11610059578063cb12c1aa14610207578063d2b08a9a1461021c578063f19e207e1461023e578063f2fde38b1461027e57600080fd5b8063a2b40d19146101b4578063c1c08e70146101d4578063c5334e0d146101e757600080fd5b8063723228a8116100bb578063723228a814610141578063795f78f1146101575780637e275943146101775780638da5cb5b1461018c57600080fd5b80634a5db3b5146100e257806363c85b1214610104578063715018a61461012c575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610d07565b61029e565b005b34801561011057600080fd5b506101196102ca565b6040519081526020015b60405180910390f35b34801561013857600080fd5b50610102610309565b34801561014d57600080fd5b5061011960095481565b34801561016357600080fd5b50610102610172366004610d07565b61031d565b34801561018357600080fd5b50610119610346565b34801561019857600080fd5b506000546040516001600160a01b039091168152602001610123565b3480156101c057600080fd5b506101026101cf366004610d37565b61037c565b6101026101e2366004610d66565b6103f0565b3480156101f357600080fd5b50610119610202366004610d07565b610479565b34801561021357600080fd5b506101026104f7565b34801561022857600080fd5b5061023161056d565b6040516101239190610e1f565b34801561024a57600080fd5b5061026e610259366004610d07565b600b6020526000908152604090205460ff1681565b6040519015158152602001610123565b34801561028a57600080fd5b50610102610299366004610d07565b610670565b6102a66106ab565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b336000908152600b602052604081205460ff166103025760405162461bcd60e51b81526004016102f990610e62565b60405180910390fd5b5060075490565b6103116106ab565b61031b60006106d8565b565b6103256106ab565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b336000908152600b602052604081205460ff166103755760405162461bcd60e51b81526004016102f990610e62565b5060085490565b336000908152600b602052604090205460ff166103ab5760405162461bcd60e51b81526004016102f990610e62565b600081116103eb5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420507269636560981b60448201526064016102f9565b600955565b6103f8610728565b346000036104485760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b6104523482610781565b61046d6104676000546001600160a01b031690565b34610b3f565b61047660018055565b50565b60006001600160a01b03821633146104e25760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320616460448201526564726573732160d01b60648201526084016102f9565b5050336000908152600a602052604090205490565b336000908152600b602052604090205460ff166105265760405162461bcd60e51b81526004016102f990610e62565b6105306000610c84565b600281905561053e90610c84565b600381905561054c90610c84565b600481905561055a90610c84565b600581905561056890610c84565b600655565b336000908152600b602052604090205460609060ff1661059f5760405162461bcd60e51b81526004016102f990610e62565b60408051600580825260c082019092526000916020820160a080368337019050509050600254816000815181106105d8576105d8610ea4565b602002602001018181525050600354816001815181106105fa576105fa610ea4565b6020026020010181815250506004548160028151811061061c5761061c610ea4565b6020026020010181815250506005548160038151811061063e5761063e610ea4565b6020026020010181815250506006548160048151811061066057610660610ea4565b6020908102919091010152905090565b6106786106ab565b6001600160a01b0381166106a257604051631e4fbdf760e01b8152600060048201526024016102f9565b610476816106d8565b6000546001600160a01b0316331461031b5760405163118cdaa760e01b81523360048201526024016102f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60026001540361077a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016102f9565b6002600155565b600082116107d15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b60008151116108225760405162461bcd60e51b815260206004820152601b60248201527f415049206b65792073686f756c64206e6f7420626520656d707479000000000060448201526064016102f9565b60006108526e01ed09bead87c0378d8e640000000061084c60095486610cda90919063ffffffff16565b90610cef565b9050600081116108945760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b61041a81106108d55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b60006050821180156108e8575060788211155b1561093757600254604051610901918591602001610ede565b60405160208183030381529060405280519060200120905061092f600a600854610cfb90919063ffffffff16565b600855610ae5565b608282118015610948575060aa8211155b1561098f57600354604051610961918591602001610f00565b60405160208183030381529060405280519060200120905061092f6014600854610cfb90919063ffffffff16565b610118821180156109a257506101408211155b156109e9576004546040516109bb918591602001610ede565b60405160208183030381529060405280519060200120905061092f6032600854610cfb90919063ffffffff16565b6101e0821180156109fc57506102088211155b15610a4357600554604051610a15918591602001610ede565b60405160208183030381529060405280519060200120905061092f6064600854610cfb90919063ffffffff16565b6103d482118015610a5657506103fc8211155b15610a9d57600654604051610a6f918591602001610ede565b60405160208183030381529060405280519060200120905061092f60fa600854610cfb90919063ffffffff16565b60405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206e756d626572206f6620746f6b656e7320746f206275790060448201526064016102f9565b600754610af29083610cfb565b60075560405184815233907f092522d744884d151f21752e3dad30682f9f9aad71a5c8727156b7d013dfe2ba9060200160405180910390a2336000908152600a6020526040902055505050565b6001600160a01b038216610b955760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e7420616464726573730000000000000060448201526064016102f9565b80471015610be55760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742046554d412062616c616e63650000000000000060448201526064016102f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5050905080610c7f5760405162461bcd60e51b815260206004820152601460248201527311955350481d1c985b9cd9995c8819985a5b195960621b60448201526064016102f9565b505050565b6040805142602080830191909152448284015241606090811b6bffffffffffffffffffffffff191690830152434060748301526094808301949094528251808303909401845260b4909101909152815191012090565b6000610ce68284610f51565b90505b92915050565b6000610ce68284610f68565b6000610ce68284610f8a565b600060208284031215610d1957600080fd5b81356001600160a01b0381168114610d3057600080fd5b9392505050565b600060208284031215610d4957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610d7857600080fd5b813567ffffffffffffffff811115610d8f57600080fd5b8201601f81018413610da057600080fd5b803567ffffffffffffffff811115610dba57610dba610d50565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610de957610de9610d50565b604052818152828201602001861015610e0157600080fd5b81602084016020830137600091810160200191909152949350505050565b602080825282518282018190526000918401906040840190835b81811015610e57578351835260209384019390920191600101610e39565b509095945050505050565b60208082526022908201527f596f7520617265206e6f7420617574686f72697a656420746f20646f20746861604082015261742160f01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610ed5578181015183820152602001610ebd565b50506000910152565b60008351610ef0818460208801610eba565b9190910191825250602001919050565b6040815260008351806040840152610f1f816060850160208801610eba565b602083019390935250601f91909101601f191601606001919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9610f3b565b600082610f8557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ce957610ce9610f3b56fea26469706673582212200a42d569edd77a0809f0cb44e396a4f3170b9f072399d12a6de9c2fbc3338a1564736f6c634300081c0033