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