false
false
0

Contract Address Details

0x8165824fbD57AE68475729663Aa5094Aa820C62e

Contract Name
walletRouletteSpin
Creator
0xe447ae–4d6942 at 0xddf90f–db865a
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
27 Transactions
Transfers
0 Transfers
Gas Used
1,564,660
Last Balance Update
16285755
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

Verify & Publish
0x60806040526000600755600060085566071afd498d000060095534801561002557600080fd5b5060405161125538038061125583398101604081905261004491610243565b806001600160a01b03811661007357604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61007c816101f3565b505060018055604080514260208083018290524483850181905241606090811b6001600160601b03191690850181905243406074860181905260006094808801919091528751808803909101815260b487018852805190850120600281905560d4870186905260f4870184905261011487018390526101288701829052610148808801919091528751808803909101815261016887018852805190850120600381905561018887018690526101a887018490526101c887018390526101dc87018290526101fc808801919091528751808803909101815261021c87018852805190850120600481905561023c870186905261025c870184905261027c870183905261029087018290526102b080880191909152875180880390910181526102d08701885280519085012060058190556102f087019590955261031086019290925261033085015261034484015261036480840192909252835180840390920182526103849092019092528151910120600655610273565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561025557600080fd5b81516001600160a01b038116811461026c57600080fd5b9392505050565b610fd3806102826000396000f3fe6080604052600436106100dd5760003560e01c8063a2b40d191161007f578063cb12c1aa11610059578063cb12c1aa14610207578063d2b08a9a1461021c578063f19e207e1461023e578063f2fde38b1461027e57600080fd5b8063a2b40d19146101b4578063c1c08e70146101d4578063c5334e0d146101e757600080fd5b8063723228a8116100bb578063723228a814610141578063795f78f1146101575780637e275943146101775780638da5cb5b1461018c57600080fd5b80634a5db3b5146100e257806363c85b1214610104578063715018a61461012c575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610d07565b61029e565b005b34801561011057600080fd5b506101196102ca565b6040519081526020015b60405180910390f35b34801561013857600080fd5b50610102610309565b34801561014d57600080fd5b5061011960095481565b34801561016357600080fd5b50610102610172366004610d07565b61031d565b34801561018357600080fd5b50610119610346565b34801561019857600080fd5b506000546040516001600160a01b039091168152602001610123565b3480156101c057600080fd5b506101026101cf366004610d37565b61037c565b6101026101e2366004610d66565b6103f0565b3480156101f357600080fd5b50610119610202366004610d07565b610479565b34801561021357600080fd5b506101026104f7565b34801561022857600080fd5b5061023161056d565b6040516101239190610e1f565b34801561024a57600080fd5b5061026e610259366004610d07565b600b6020526000908152604090205460ff1681565b6040519015158152602001610123565b34801561028a57600080fd5b50610102610299366004610d07565b610670565b6102a66106ab565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b336000908152600b602052604081205460ff166103025760405162461bcd60e51b81526004016102f990610e62565b60405180910390fd5b5060075490565b6103116106ab565b61031b60006106d8565b565b6103256106ab565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b336000908152600b602052604081205460ff166103755760405162461bcd60e51b81526004016102f990610e62565b5060085490565b336000908152600b602052604090205460ff166103ab5760405162461bcd60e51b81526004016102f990610e62565b600081116103eb5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420507269636560981b60448201526064016102f9565b600955565b6103f8610728565b346000036104485760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b6104523482610781565b61046d6104676000546001600160a01b031690565b34610b3f565b61047660018055565b50565b60006001600160a01b03821633146104e25760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320616460448201526564726573732160d01b60648201526084016102f9565b5050336000908152600a602052604090205490565b336000908152600b602052604090205460ff166105265760405162461bcd60e51b81526004016102f990610e62565b6105306000610c84565b600281905561053e90610c84565b600381905561054c90610c84565b600481905561055a90610c84565b600581905561056890610c84565b600655565b336000908152600b602052604090205460609060ff1661059f5760405162461bcd60e51b81526004016102f990610e62565b60408051600580825260c082019092526000916020820160a080368337019050509050600254816000815181106105d8576105d8610ea4565b602002602001018181525050600354816001815181106105fa576105fa610ea4565b6020026020010181815250506004548160028151811061061c5761061c610ea4565b6020026020010181815250506005548160038151811061063e5761063e610ea4565b6020026020010181815250506006548160048151811061066057610660610ea4565b6020908102919091010152905090565b6106786106ab565b6001600160a01b0381166106a257604051631e4fbdf760e01b8152600060048201526024016102f9565b610476816106d8565b6000546001600160a01b0316331461031b5760405163118cdaa760e01b81523360048201526024016102f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60026001540361077a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016102f9565b6002600155565b600082116107d15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b60008151116108225760405162461bcd60e51b815260206004820152601b60248201527f415049206b65792073686f756c64206e6f7420626520656d707479000000000060448201526064016102f9565b60006108526e01ed09bead87c0378d8e640000000061084c60095486610cda90919063ffffffff16565b90610cef565b9050600081116108945760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b61041a81106108d55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b60006050821180156108e8575060788211155b1561093757600254604051610901918591602001610ede565b60405160208183030381529060405280519060200120905061092f600a600854610cfb90919063ffffffff16565b600855610ae5565b608282118015610948575060aa8211155b1561098f57600354604051610961918591602001610f00565b60405160208183030381529060405280519060200120905061092f6014600854610cfb90919063ffffffff16565b610118821180156109a257506101408211155b156109e9576004546040516109bb918591602001610ede565b60405160208183030381529060405280519060200120905061092f6032600854610cfb90919063ffffffff16565b6101e0821180156109fc57506102088211155b15610a4357600554604051610a15918591602001610ede565b60405160208183030381529060405280519060200120905061092f6064600854610cfb90919063ffffffff16565b6103d482118015610a5657506103fc8211155b15610a9d57600654604051610a6f918591602001610ede565b60405160208183030381529060405280519060200120905061092f60fa600854610cfb90919063ffffffff16565b60405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206e756d626572206f6620746f6b656e7320746f206275790060448201526064016102f9565b600754610af29083610cfb565b60075560405184815233907f092522d744884d151f21752e3dad30682f9f9aad71a5c8727156b7d013dfe2ba9060200160405180910390a2336000908152600a6020526040902055505050565b6001600160a01b038216610b955760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e7420616464726573730000000000000060448201526064016102f9565b80471015610be55760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742046554d412062616c616e63650000000000000060448201526064016102f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5050905080610c7f5760405162461bcd60e51b815260206004820152601460248201527311955350481d1c985b9cd9995c8819985a5b195960621b60448201526064016102f9565b505050565b6040805142602080830191909152448284015241606090811b6bffffffffffffffffffffffff191690830152434060748301526094808301949094528251808303909401845260b4909101909152815191012090565b6000610ce68284610f51565b90505b92915050565b6000610ce68284610f68565b6000610ce68284610f8a565b600060208284031215610d1957600080fd5b81356001600160a01b0381168114610d3057600080fd5b9392505050565b600060208284031215610d4957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610d7857600080fd5b813567ffffffffffffffff811115610d8f57600080fd5b8201601f81018413610da057600080fd5b803567ffffffffffffffff811115610dba57610dba610d50565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610de957610de9610d50565b604052818152828201602001861015610e0157600080fd5b81602084016020830137600091810160200191909152949350505050565b602080825282518282018190526000918401906040840190835b81811015610e57578351835260209384019390920191600101610e39565b509095945050505050565b60208082526022908201527f596f7520617265206e6f7420617574686f72697a656420746f20646f20746861604082015261742160f01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610ed5578181015183820152602001610ebd565b50506000910152565b60008351610ef0818460208801610eba565b9190910191825250602001919050565b6040815260008351806040840152610f1f816060850160208801610eba565b602083019390935250601f91909101601f191601606001919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9610f3b565b600082610f8557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ce957610ce9610f3b56fea26469706673582212200a42d569edd77a0809f0cb44e396a4f3170b9f072399d12a6de9c2fbc3338a1564736f6c634300081c0033000000000000000000000000e447ae32294575fa356861858d545373c04d6942

Deployed ByteCode

0x6080604052600436106100dd5760003560e01c8063a2b40d191161007f578063cb12c1aa11610059578063cb12c1aa14610207578063d2b08a9a1461021c578063f19e207e1461023e578063f2fde38b1461027e57600080fd5b8063a2b40d19146101b4578063c1c08e70146101d4578063c5334e0d146101e757600080fd5b8063723228a8116100bb578063723228a814610141578063795f78f1146101575780637e275943146101775780638da5cb5b1461018c57600080fd5b80634a5db3b5146100e257806363c85b1214610104578063715018a61461012c575b600080fd5b3480156100ee57600080fd5b506101026100fd366004610d07565b61029e565b005b34801561011057600080fd5b506101196102ca565b6040519081526020015b60405180910390f35b34801561013857600080fd5b50610102610309565b34801561014d57600080fd5b5061011960095481565b34801561016357600080fd5b50610102610172366004610d07565b61031d565b34801561018357600080fd5b50610119610346565b34801561019857600080fd5b506000546040516001600160a01b039091168152602001610123565b3480156101c057600080fd5b506101026101cf366004610d37565b61037c565b6101026101e2366004610d66565b6103f0565b3480156101f357600080fd5b50610119610202366004610d07565b610479565b34801561021357600080fd5b506101026104f7565b34801561022857600080fd5b5061023161056d565b6040516101239190610e1f565b34801561024a57600080fd5b5061026e610259366004610d07565b600b6020526000908152604090205460ff1681565b6040519015158152602001610123565b34801561028a57600080fd5b50610102610299366004610d07565b610670565b6102a66106ab565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b336000908152600b602052604081205460ff166103025760405162461bcd60e51b81526004016102f990610e62565b60405180910390fd5b5060075490565b6103116106ab565b61031b60006106d8565b565b6103256106ab565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b336000908152600b602052604081205460ff166103755760405162461bcd60e51b81526004016102f990610e62565b5060085490565b336000908152600b602052604090205460ff166103ab5760405162461bcd60e51b81526004016102f990610e62565b600081116103eb5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420507269636560981b60448201526064016102f9565b600955565b6103f8610728565b346000036104485760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b6104523482610781565b61046d6104676000546001600160a01b031690565b34610b3f565b61047660018055565b50565b60006001600160a01b03821633146104e25760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320616460448201526564726573732160d01b60648201526084016102f9565b5050336000908152600a602052604090205490565b336000908152600b602052604090205460ff166105265760405162461bcd60e51b81526004016102f990610e62565b6105306000610c84565b600281905561053e90610c84565b600381905561054c90610c84565b600481905561055a90610c84565b600581905561056890610c84565b600655565b336000908152600b602052604090205460609060ff1661059f5760405162461bcd60e51b81526004016102f990610e62565b60408051600580825260c082019092526000916020820160a080368337019050509050600254816000815181106105d8576105d8610ea4565b602002602001018181525050600354816001815181106105fa576105fa610ea4565b6020026020010181815250506004548160028151811061061c5761061c610ea4565b6020026020010181815250506005548160038151811061063e5761063e610ea4565b6020026020010181815250506006548160048151811061066057610660610ea4565b6020908102919091010152905090565b6106786106ab565b6001600160a01b0381166106a257604051631e4fbdf760e01b8152600060048201526024016102f9565b610476816106d8565b6000546001600160a01b0316331461031b5760405163118cdaa760e01b81523360048201526024016102f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60026001540361077a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016102f9565b6002600155565b600082116107d15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f60448201526064016102f9565b60008151116108225760405162461bcd60e51b815260206004820152601b60248201527f415049206b65792073686f756c64206e6f7420626520656d707479000000000060448201526064016102f9565b60006108526e01ed09bead87c0378d8e640000000061084c60095486610cda90919063ffffffff16565b90610cef565b9050600081116108945760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b61041a81106108d55760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b60448201526064016102f9565b60006050821180156108e8575060788211155b1561093757600254604051610901918591602001610ede565b60405160208183030381529060405280519060200120905061092f600a600854610cfb90919063ffffffff16565b600855610ae5565b608282118015610948575060aa8211155b1561098f57600354604051610961918591602001610f00565b60405160208183030381529060405280519060200120905061092f6014600854610cfb90919063ffffffff16565b610118821180156109a257506101408211155b156109e9576004546040516109bb918591602001610ede565b60405160208183030381529060405280519060200120905061092f6032600854610cfb90919063ffffffff16565b6101e0821180156109fc57506102088211155b15610a4357600554604051610a15918591602001610ede565b60405160208183030381529060405280519060200120905061092f6064600854610cfb90919063ffffffff16565b6103d482118015610a5657506103fc8211155b15610a9d57600654604051610a6f918591602001610ede565b60405160208183030381529060405280519060200120905061092f60fa600854610cfb90919063ffffffff16565b60405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964206e756d626572206f6620746f6b656e7320746f206275790060448201526064016102f9565b600754610af29083610cfb565b60075560405184815233907f092522d744884d151f21752e3dad30682f9f9aad71a5c8727156b7d013dfe2ba9060200160405180910390a2336000908152600a6020526040902055505050565b6001600160a01b038216610b955760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e7420616464726573730000000000000060448201526064016102f9565b80471015610be55760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e742046554d412062616c616e63650000000000000060448201526064016102f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5050905080610c7f5760405162461bcd60e51b815260206004820152601460248201527311955350481d1c985b9cd9995c8819985a5b195960621b60448201526064016102f9565b505050565b6040805142602080830191909152448284015241606090811b6bffffffffffffffffffffffff191690830152434060748301526094808301949094528251808303909401845260b4909101909152815191012090565b6000610ce68284610f51565b90505b92915050565b6000610ce68284610f68565b6000610ce68284610f8a565b600060208284031215610d1957600080fd5b81356001600160a01b0381168114610d3057600080fd5b9392505050565b600060208284031215610d4957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610d7857600080fd5b813567ffffffffffffffff811115610d8f57600080fd5b8201601f81018413610da057600080fd5b803567ffffffffffffffff811115610dba57610dba610d50565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610de957610de9610d50565b604052818152828201602001861015610e0157600080fd5b81602084016020830137600091810160200191909152949350505050565b602080825282518282018190526000918401906040840190835b81811015610e57578351835260209384019390920191600101610e39565b509095945050505050565b60208082526022908201527f596f7520617265206e6f7420617574686f72697a656420746f20646f20746861604082015261742160f01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60005b83811015610ed5578181015183820152602001610ebd565b50506000910152565b60008351610ef0818460208801610eba565b9190910191825250602001919050565b6040815260008351806040840152610f1f816060850160208801610eba565b602083019390935250601f91909101601f191601606001919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9610f3b565b600082610f8557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ce957610ce9610f3b56fea26469706673582212200a42d569edd77a0809f0cb44e396a4f3170b9f072399d12a6de9c2fbc3338a1564736f6c634300081c0033