ETH Price: $3,349.41 (+0.42%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Burn Keys168140872023-03-12 19:40:47660 days ago1678650047IN
0xb6DC89FE...60aB86DdF
0 ETH0.0051232331.88114334
Burn Keys168109192023-03-12 9:01:11660 days ago1678611671IN
0xb6DC89FE...60aB86DdF
0 ETH0.0021440919.1868372
Admin_withdraw_c...168109032023-03-12 8:57:59660 days ago1678611479IN
0xb6DC89FE...60aB86DdF
0 ETH0.0012500520.55847637
Burn Keys168107202023-03-12 8:21:23660 days ago1678609283IN
0xb6DC89FE...60aB86DdF
0 ETH0.0020295718.16203161
Burn Keys168103572023-03-12 7:07:59660 days ago1678604879IN
0xb6DC89FE...60aB86DdF
0 ETH0.0018576816.62385142
Admin_withdraw_c...168078382023-03-11 22:35:35661 days ago1678574135IN
0xb6DC89FE...60aB86DdF
0 ETH0.0015520725.52553135
Burn Keys168077412023-03-11 22:16:11661 days ago1678572971IN
0xb6DC89FE...60aB86DdF
0 ETH0.0030225127.04755707
Admin_withdraw_c...168069552023-03-11 19:36:47661 days ago1678563407IN
0xb6DC89FE...60aB86DdF
0 ETH0.0022615537.32685199
Admin_withdraw_c...168009712023-03-10 23:24:35662 days ago1678490675IN
0xb6DC89FE...60aB86DdF
0 ETH0.0045648841.44134846
Admin_withdraw_c...167992452023-03-10 17:35:47662 days ago1678469747IN
0xb6DC89FE...60aB86DdF
0 ETH0.0047758178.82440729
Admin_withdraw_c...167988962023-03-10 16:25:11662 days ago1678465511IN
0xb6DC89FE...60aB86DdF
0 ETH0.002114634.90134041
Admin_withdraw_c...167976072023-03-10 12:03:47662 days ago1678449827IN
0xb6DC89FE...60aB86DdF
0 ETH0.0025713242.43955081
Admin_withdraw_c...167934562023-03-09 21:57:23663 days ago1678399043IN
0xb6DC89FE...60aB86DdF
0 ETH0.0030036449.57486242
Admin_withdraw_c...167911362023-03-09 14:07:11663 days ago1678370831IN
0xb6DC89FE...60aB86DdF
0 ETH0.0021047134.73821363
Burn Keys167904592023-03-09 11:49:35663 days ago1678362575IN
0xb6DC89FE...60aB86DdF
0 ETH0.0026562223.76977986
Burn Keys167904102023-03-09 11:39:35663 days ago1678361975IN
0xb6DC89FE...60aB86DdF
0 ETH0.002323520.79239466
Admin_withdraw_c...167900412023-03-09 10:25:11663 days ago1678357511IN
0xb6DC89FE...60aB86DdF
0 ETH0.0014573124.05287908
Admin_withdraw_c...167900362023-03-09 10:24:11663 days ago1678357451IN
0xb6DC89FE...60aB86DdF
0 ETH0.0017690924.28203029
Admin_withdraw_c...167871922023-03-09 0:49:11664 days ago1678322951IN
0xb6DC89FE...60aB86DdF
0 ETH0.0019630232.3995609
Admin_withdraw_c...167871852023-03-09 0:47:47664 days ago1678322867IN
0xb6DC89FE...60aB86DdF
0 ETH0.0019947727.46146553
Admin_withdraw_c...167859642023-03-08 20:39:59664 days ago1678307999IN
0xb6DC89FE...60aB86DdF
0 ETH0.0036062441.79413795
Burn Keys167845302023-03-08 15:48:47664 days ago1678290527IN
0xb6DC89FE...60aB86DdF
0 ETH0.0035213531.51154097
Admin_withdraw_c...167829002023-03-08 10:18:35664 days ago1678270715IN
0xb6DC89FE...60aB86DdF
0 ETH0.0011388718.73001051
Admin_withdraw_c...167824382023-03-08 8:45:23664 days ago1678265123IN
0xb6DC89FE...60aB86DdF
0 ETH0.0013553422.36981442
Admin_withdraw_c...167763382023-03-07 12:10:59665 days ago1678191059IN
0xb6DC89FE...60aB86DdF
0 ETH0.0018154629.96417618
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
165083012023-01-28 22:28:11703 days ago1674944891
0xb6DC89FE...60aB86DdF
1.25 ETH
165081642023-01-28 22:00:47703 days ago1674943247
0xb6DC89FE...60aB86DdF
2.5 ETH
165079342023-01-28 21:14:35703 days ago1674940475
0xb6DC89FE...60aB86DdF
12.4 ETH
165074202023-01-28 19:31:11703 days ago1674934271
0xb6DC89FE...60aB86DdF
3.4 ETH
165073342023-01-28 19:13:47703 days ago1674933227
0xb6DC89FE...60aB86DdF
5 ETH
165073032023-01-28 19:07:35703 days ago1674932855
0xb6DC89FE...60aB86DdF
4.09999999 ETH
165067422023-01-28 17:14:59703 days ago1674926099
0xb6DC89FE...60aB86DdF
5 ETH
165061262023-01-28 15:11:23703 days ago1674918683
0xb6DC89FE...60aB86DdF
2.2 ETH
165059392023-01-28 14:33:47703 days ago1674916427
0xb6DC89FE...60aB86DdF
5 ETH
165044612023-01-28 9:36:35703 days ago1674898595
0xb6DC89FE...60aB86DdF
5 ETH
165044602023-01-28 9:36:23703 days ago1674898583
0xb6DC89FE...60aB86DdF
5 ETH
165041282023-01-28 8:29:59703 days ago1674894599
0xb6DC89FE...60aB86DdF
2.15 ETH
165004862023-01-27 20:18:35704 days ago1674850715
0xb6DC89FE...60aB86DdF
3 ETH
164999162023-01-27 18:23:35704 days ago1674843815
0xb6DC89FE...60aB86DdF
25 ETH
164998082023-01-27 18:01:59704 days ago1674842519
0xb6DC89FE...60aB86DdF
30 ETH
164997222023-01-27 17:44:23704 days ago1674841463
0xb6DC89FE...60aB86DdF
1.25 ETH
164997012023-01-27 17:40:11704 days ago1674841211
0xb6DC89FE...60aB86DdF
30 ETH
164991742023-01-27 15:54:23704 days ago1674834863
0xb6DC89FE...60aB86DdF
5 ETH
164990682023-01-27 15:32:47704 days ago1674833567
0xb6DC89FE...60aB86DdF
1.5 ETH
164988292023-01-27 14:44:47704 days ago1674830687
0xb6DC89FE...60aB86DdF
5 ETH
164987382023-01-27 14:26:35704 days ago1674829595
0xb6DC89FE...60aB86DdF
5 ETH
164982962023-01-27 12:57:35704 days ago1674824255
0xb6DC89FE...60aB86DdF
3.75 ETH
164982092023-01-27 12:40:11704 days ago1674823211
0xb6DC89FE...60aB86DdF
5 ETH
164981772023-01-27 12:33:47704 days ago1674822827
0xb6DC89FE...60aB86DdF
5 ETH
164981392023-01-27 12:26:11704 days ago1674822371
0xb6DC89FE...60aB86DdF
5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlippingClubStakingContract

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : StakingContract.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Flipping Club - flippingclub.xyz
/**
 *  ______ _ _             _                _____ _       _
 * |  ____| (_)           (_)              / ____| |     | |
 * | |__  | |_ _ __  _ __  _ _ __   __ _  | |    | |_   _| |__
 * |  __| | | | '_ \| '_ \| | '_ \ / _` | | |    | | | | | '_ \
 * | |    | | | |_) | |_) | | | | | (_| | | |____| | |_| | |_) |
 * |_|    |_|_| .__/| .__/|_|_| |_|\__, |  \_____|_|\__,_|_.__/
 *            | |   | |             __/ |
 *   _____ _  |_|   |_|  _         |___/  _____            _                  _
 *  / ____| |      | |  (_)              / ____|          | |                | |
 * | (___ | |_ __ _| | ___ _ __   __ _  | |     ___  _ __ | |_ _ __ __ _  ___| |_
 *  \___ \| __/ _` | |/ / | '_ \ / _` | | |    / _ \| '_ \| __| '__/ _` |/ __| __|
 *  ____) | || (_| |   <| | | | | (_| | | |___| (_) | | | | |_| | | (_| | (__| |_
 * |_____/ \__\__,_|_|\_\_|_| |_|\__, |  \_____\___/|_| |_|\__|_|  \__,_|\___|\__|
 *                                __/ |
 *                               |___/
 *
 * @title Flipping Club Staking Contract v3.1 - flippingclub.xyz
 * @author Flipping Club Team
 * @dev Using v1 contract for burn function so a new Approval is not required. This version includes Minor improvements.
 * @notice Direct interaction with this contract not recommended. Always use the frontend provided.
 * @notice We don't use proxies to update our contracts as this contradicts the transparency of the contract.
 */

pragma solidity 0.8.15;

import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./stakeable.sol";
import "./NFTContractFunctions.sol";
import "./burnFunctions.sol";

contract FlippingClubStakingContract is Stakeable, Pausable, Ownable {
    using SafeMath for uint256;
    uint256 private maxAllowancePerKey = 5000000000000000000;
    bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
    bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
    bytes32 private constant CLAIM = keccak256(abi.encodePacked("CLAIM"));
    bool private delegateBurn = true;
    address private __checkKeys;
    address private __burnKeys;
    event LogDepositReceived(address indexed payee);
    event Claimed(uint256 indexed amount, address indexed payee);
    NFTContractFunctions private ERC721KeyCards;
    burnFunctions private ERC721KeyBurn;
    struct StakePackage {
        uint256 duration;
        uint256 reward;
        uint256 min;
        uint256 max;
    }
    mapping(uint256 => StakePackage[]) private Packages;

    constructor(address payable _newAdmin) {
        _grantRole(ADMIN, _newAdmin);
        _grantRole(ADMIN, msg.sender);
        _grantRole(EXEC, _newAdmin);
    }

    receive() external payable {
        emit LogDepositReceived(msg.sender);
    }

    function addPackage(
        uint256 _name,
        uint256 duration,
        uint256 reward,
        uint256 min,
        uint256 max
    ) public {
        Packages[_name].push(StakePackage(duration, reward, min, max));
    }

    function getPackage(uint256 packageName)
        private
        view
        returns (StakePackage memory)
    {
        require(Packages[packageName].length > 0, "No Package");
        StakePackage memory package = Packages[packageName][0];
        return package;
    }

    function beginStake(
        uint256 _amount,
        uint256 _package,
        uint256[] memory _keysToBeUsed
    ) external payable nonReentrant whenNotPaused {
        _beginStake(_amount, _package, _keysToBeUsed, msg.sender);
    }

    function exec_beginStake(
        uint256 _amount,
        uint256 _package,
        uint256 _startTime,
        address _spender,
        uint256 _numKeys,
        uint256 rewards
    ) external nonReentrant onlyRole(EXEC) whenNotPaused {
        StakePackage memory package = getPackage(_package);
        uint256 _reward = package.reward;
        uint256 _timePeriodInSeconds = package.duration;
        uint256 _minStakeValue = package.min;
        uint256 _maxStakeValue = package.max;
        require(
            _amount >= _minStakeValue && _amount <= _maxStakeValue,
            "Value not in range"
        );
        require(enoughKeys(_amount, _reward, _numKeys), "Not enough Keys.");
        _admin_stake(
            _amount,
            _reward,
            _timePeriodInSeconds,
            _spender,
            _startTime,
            _numKeys,
            rewards
        );
    }

    function _beginStake(
        uint256 _amount,
        uint256 _package,
        uint256[] memory _keysToBeUsed,
        address _spender
    ) private {
        StakePackage memory package = getPackage(_package);
        uint256 _reward = package.reward;
        uint256 _timePeriodInSeconds = package.duration;
        uint256 _minStakeValue = package.min;
        uint256 _maxStakeValue = package.max;

        require(
            _amount >= _minStakeValue && _amount <= _maxStakeValue,
            "Stake value not in range"
        );
        require(msg.value == _amount, "Invalid amount sent.");
        require(
            checkTokens(_keysToBeUsed, _spender) == true,
            "Not all Keys owned by address."
        );
        require(checkKey() >= 1, "Address have no Key.");
        require(
            enoughKeys(_amount, _reward, _keysToBeUsed.length),
            "Not enough Keys."
        );
        delegateBurn
            ? burnKeys(_keysToBeUsed, _spender)
            : _burnKeys(_keysToBeUsed, _spender);

        _stake(
            _amount,
            _reward,
            _timePeriodInSeconds,
            _spender,
            _keysToBeUsed.length
        );
    }

    function enoughKeys(
        uint256 _amount,
        uint256 _reward,
        uint256 _numKeys
    ) private view returns (bool) {
        if (_amount.mul(_reward).div(100) <= _numKeys.mul(maxAllowancePerKey)) {
            return true;
        }
        return false;
    }

    function withdrawStake(uint256 index) external nonReentrant whenNotPaused {
        require(_hasStake(msg.sender, index), "No active positions.");
        _withdrawStake(index);
    }

    function withdrawReturn(uint256 index) external nonReentrant whenNotPaused {
        require(_hasStake(msg.sender, index), "No active positions.");
        _withdrawReturn(index);
    }

    function admin_withdraw_close(
        uint256 stake_index,
        address payable _spender,
        bool refund
    ) external onlyRole(ADMIN) {
        require(_hasStake(_spender, stake_index), "Nothing available.");
        _admin_withdraw_close(stake_index, _spender, refund);
    }

    function checkTokens(uint256[] memory _tokenList, address _msgSender)
        private
        view
        returns (bool)
    {
        require(__checkKeys != address(0), "Key Contract not set.");
        for (uint256 i = 0; i < _tokenList.length; i++) {
            if (ERC721KeyCards.ownerOf(_tokenList[i]) != _msgSender) {
                return false;
            }
        }
        return true;
    }

    function burnKeys(uint256[] memory _keysToBeUsed, address _spender) public {
        require(__burnKeys != address(0), "Delegated Burn not set.");
        ERC721KeyBurn.burnKeys(_keysToBeUsed, _spender);
    }

    function _burnKeys(uint256[] memory _keysToBeUsed, address _spender)
        public
    {
        address burnAddress = 0x000000000000000000000000000000000000dEaD;
        for (uint256 i = 0; i < _keysToBeUsed.length; i++) {
            require(
                ERC721KeyCards.isApprovedForAll(_spender, address(this)) ==
                    true,
                "BurnKeys: Contract is not approved to spend Keys."
            );
            ERC721KeyCards.safeTransferFrom(
                _spender,
                burnAddress,
                _keysToBeUsed[i]
            );
        }
    }

    function checkKey() private view returns (uint256) {
        require(__checkKeys != address(0), "Key Contract not set.");
        return ERC721KeyCards.balanceOf(msg.sender);
    }

    function initPool(uint256 _amount, address _payee)
        external
        nonReentrant
        onlyRole(ADMIN)
    {
        payable(_payee).transfer(_amount);
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function setCheckKeysContractAddress(address KeysContract)
        external
        onlyRole(ADMIN)
    {
        __checkKeys = KeysContract;
        ERC721KeyCards = NFTContractFunctions(__checkKeys);
    }

    function setBurnContractAddress(address BurnContract)
        external
        onlyRole(ADMIN)
    {
        __burnKeys = BurnContract;
        ERC721KeyBurn = burnFunctions(__burnKeys);
    }

    function setMaxAllowancePerKey(uint256 _maxAllowancePerKey)
        external
        onlyRole(ADMIN)
    {
        maxAllowancePerKey = _maxAllowancePerKey;
    }

    function pause() external whenNotPaused onlyRole(ADMIN) {
        _pause();
    }

    function unPause() external whenPaused onlyRole(ADMIN) {
        _unpause();
    }

    function setDelegateBurn(bool status) external {
        delegateBurn = status;
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external pure returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

File 2 of 10 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 3 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 4 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
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;
        }
    }
}

File 6 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 7 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

File 8 of 10 : stakeable.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Flipping Club - flippingclub.xyz
/**
 *  ______ _ _             _                _____ _       _
 * |  ____| (_)           (_)              / ____| |     | |
 * | |__  | |_ _ __  _ __  _ _ __   __ _  | |    | |_   _| |__
 * |  __| | | | '_ \| '_ \| | '_ \ / _` | | |    | | | | | '_ \
 * | |    | | | |_) | |_) | | | | | (_| | | |____| | |_| | |_) |
 * |_|    |_|_| .__/| .__/|_|_| |_|\__, |  \_____|_|\__,_|_.__/
 *            | |   | |             __/ |
 *   _____ _  |_|   |_|  _         |___/  _____            _                  _
 *  / ____| |      | |  (_)              / ____|          | |                | |
 * | (___ | |_ __ _| | ___ _ __   __ _  | |     ___  _ __ | |_ _ __ __ _  ___| |_
 *  \___ \| __/ _` | |/ / | '_ \ / _` | | |    / _ \| '_ \| __| '__/ _` |/ __| __|
 *  ____) | || (_| |   <| | | | | (_| | | |___| (_) | | | | |_| | | (_| | (__| |_
 * |_____/ \__\__,_|_|\_\_|_| |_|\__, |  \_____\___/|_| |_|\__|_|  \__,_|\___|\__|
 *                                __/ |
 *                               |___/
 *
 * @title Flipping Club Staking Contract - Dependency v3.1 - flippingclub.xyz
 * @author Flipping Club Team
 * @notice Direct interaction with this contract not recommended. Always use the frontend provided.
 * @notice We don't use proxies to update our contracts as this contradicts the transparency of the contract.
 */
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

pragma solidity 0.8.15;

contract Stakeable is ReentrancyGuard {
    using SafeMath for uint256;
    uint256 private initialTimestamp;
    uint256 private _maxAllowancePerKey = 5000000000000000000;
    uint256 private timePeriod;
    uint256 private maxPositions = 4;
    uint256 private MinStakeValueToClosePosition = 100000000000000000;
    uint256 private MovePercentageBasisNumber = 30;
    uint256 private minWithdraw = 100000000000000000;
    address private StakingAccount;
    bool private MoveFundsUponReceipt;
    bool private partialWithdraw = true;
    bool private MovePercentageOfFundsUponReceipt = true;
    bytes32 private constant ADMIN = keccak256(abi.encodePacked("ADMIN"));
    bytes32 private constant EXEC = keccak256(abi.encodePacked("EXEC"));
    bytes32 private constant CLAIM = keccak256(abi.encodePacked("CLAIM"));
    Stakeholder[] internal stakeholders;
    mapping(bytes32 => mapping(address => bool)) public roles;
    mapping(address => uint256) internal stakes;
    event GrantRole(bytes32 indexed role, address indexed account);
    event RevokeRole(bytes32 indexed role, address indexed account);
    event Withdrawn(address indexed, uint256 amount, uint256 timestamp);
    event Extended(
        address user,
        uint256 amount,
        uint256 since,
        uint256 reward,
        uint256 timePeriod,
        uint256 usedKeys
    );
    event Staked(
        address indexed user,
        uint256 amount,
        uint256 index,
        uint256 timestamp,
        uint256 _plan,
        uint256 timePeriod,
        uint256 usedKeys
    );

    struct Stake {
        address user;
        uint256 amount;
        uint256 since;
        uint256 totalReturn;
        uint256 timePeriod;
        uint256 reward;
        uint256 usedKeys;
    }
    struct Stakeholder {
        address user;
        Stake[] address_stakes;
    }

    struct StakingSummary {
        Stake[] stakes;
    }

    constructor() {
        stakeholders.push();
    }

    function _addStakeholder(address staker) private returns (uint256) {
        stakeholders.push();
        uint256 userIndex = stakeholders.length - 1;
        stakeholders[userIndex].user = staker;
        stakes[staker] = userIndex;
        return userIndex;
    }

    function _stake(
        uint256 _amount,
        uint256 _totalReturn,
        uint256 _timePeriodInSeconds,
        address _Sender,
        uint256 usedKeys
    ) internal {
        require(StakingAccount != address(0), "Staking account not set.");
        require(canStake(_Sender), "Max open positions.");
        if (MoveFundsUponReceipt) {
            payable(StakingAccount).transfer(_amount);
        }
        if (MovePercentageOfFundsUponReceipt) {
            payable(StakingAccount).transfer(
                (_amount.mul(MovePercentageBasisNumber)).div(100)
            );
        }
        uint256 index = stakes[_Sender];
        uint256 timestamp = block.timestamp;
        if (index == 0) {
            index = _addStakeholder(_Sender);
        }
        initialTimestamp = block.timestamp;
        timePeriod = initialTimestamp.add(_timePeriodInSeconds);
        stakeholders[index].address_stakes.push(
            Stake(
                payable(_Sender),
                _amount,
                timestamp,
                _totalReturn,
                timePeriod,
                0,
                usedKeys
            )
        );
        emit Staked(
            _Sender,
            _amount,
            index,
            timestamp,
            _totalReturn,
            timePeriod,
            usedKeys
        );
    }

    function _admin_stake(
        uint256 _amount,
        uint256 _totalReturn,
        uint256 _timePeriodInSeconds,
        address _Sender,
        uint256 _startTime,
        uint256 usedKeys,
        uint256 rewards
    ) internal {
        require(canStake(_Sender), "Max open positions.");

        uint256 index = stakes[_Sender];
        uint256 timestamp = _startTime;
        if (index == 0) {
            index = _addStakeholder(_Sender);
        }
        initialTimestamp = _startTime;
        timePeriod = initialTimestamp.add(_timePeriodInSeconds);
        stakeholders[index].address_stakes.push(
            Stake(
                payable(_Sender),
                _amount,
                timestamp,
                _totalReturn,
                timePeriod,
                rewards,
                usedKeys
            )
        );
        emit Staked(
            _Sender,
            _amount,
            index,
            timestamp,
            _totalReturn,
            timePeriod,
            usedKeys
        );
    }

    function calculateStakeReward(Stake memory _current_stake)
        private
        view
        returns (uint256)
    {
        if (block.timestamp > _current_stake.timePeriod) {
            return
                (_current_stake.amount.mul(_current_stake.totalReturn)).div(
                    100
                );
        }
        return 0;
    }

    function _withdrawStake(uint256 index) internal {
        uint256 user_index = stakes[msg.sender];
        require(user_index > 0, "Address not registered.");
        require(index <= maxPositions - 1, "Index out of range.");
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        require(current_stake.amount > 0, "No active positions.");
        require(
            block.timestamp >= current_stake.timePeriod,
            "Not matured yet."
        );
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        require(reward > 0, "Claim not ready.");
        uint256 _amount = current_stake.amount.add(reward);
        require(_amount >= minWithdraw, "Amount is less than minimum");
        require(address(this).balance > _amount, "Not enough balance.");
        delete stakeholders[user_index].address_stakes[index];
        stakeholders[user_index].address_stakes[index] = stakeholders[
            user_index
        ].address_stakes[stakeholders[user_index].address_stakes.length - 1];
        stakeholders[user_index].address_stakes.pop();
        payable(msg.sender).transfer(_amount);
        emit Withdrawn(msg.sender, _amount, block.timestamp);
    }

    function _withdrawReturn(uint256 index) internal {
        uint256 user_index = stakes[msg.sender];
        require(user_index > 0, "Address not registered.");
        require(partialWithdraw, "Partial withdraw is not enabled.");
        require(index <= maxPositions - 1, "Index out of range.");
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        require(current_stake.amount > 0, "No active positions.");

        require(
            block.timestamp >= current_stake.timePeriod,
            "Not matured yet."
        );
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        require(reward > 0, "Claim not ready.");
        uint256 _amount = reward;
        require(_amount >= minWithdraw, "Amount is less than minimum");
        require(address(this).balance > _amount, "Not enough balance.");

        if (
            _enoughKeys(
                stakeholders[user_index].address_stakes[index].amount,
                stakeholders[user_index].address_stakes[index].totalReturn,
                reward,
                stakeholders[user_index].address_stakes[index].usedKeys
            )
        ) {
            uint256 timeDiff = (
                stakeholders[user_index].address_stakes[index].timePeriod
            ).sub(stakeholders[user_index].address_stakes[index].since);
            stakeholders[user_index].address_stakes[index].since = block
                .timestamp;
            stakeholders[user_index].address_stakes[index].timePeriod = block
                .timestamp
                .add(timeDiff);
            stakeholders[user_index].address_stakes[index].reward = 0;
            payable(msg.sender).transfer(_amount);
            emit Withdrawn(msg.sender, _amount, block.timestamp);
            emit Extended(
                stakeholders[user_index].address_stakes[index].user,
                stakeholders[user_index].address_stakes[index].amount,
                stakeholders[user_index].address_stakes[index].since,
                stakeholders[user_index].address_stakes[index].reward,
                stakeholders[user_index].address_stakes[index].timePeriod,
                stakeholders[user_index].address_stakes[index].usedKeys
            );
        } else {
            _amount = current_stake.amount.add(reward);
            delete stakeholders[user_index].address_stakes[index];
            stakeholders[user_index].address_stakes[index] = stakeholders[
                user_index
            ].address_stakes[
                    stakeholders[user_index].address_stakes.length - 1
                ];
            stakeholders[user_index].address_stakes.pop();
            payable(msg.sender).transfer(_amount);
            emit Withdrawn(msg.sender, _amount, block.timestamp);
        }
    }

    function _admin_withdraw_close(
        uint256 index,
        address payable _spender,
        bool refund
    ) internal {
        uint256 user_index = stakes[_spender];
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        uint256 claimable = current_stake.amount.add(reward);
        delete stakeholders[user_index].address_stakes[index];
        stakeholders[user_index].address_stakes[index] = stakeholders[
            user_index
        ].address_stakes[stakeholders[user_index].address_stakes.length - 1];
        stakeholders[user_index].address_stakes.pop();
        if (refund) {
            require(address(this).balance >= claimable, "Not enough balance.");
            payable(_spender).transfer(claimable);
        }
    }

    function _extendStake(uint256 index) public {
        uint256 user_index = stakes[msg.sender];
        require(user_index > 0, "Address not registered.");
        require(index <= maxPositions - 1, "Index out of range.");
        Stake memory current_stake = stakeholders[user_index].address_stakes[
            index
        ];
        require(current_stake.amount > 0, "No active positions.");
        uint256 reward = current_stake.reward.add(
            calculateStakeReward(current_stake)
        );
        require(reward > 0, "Extend not Possible.");
        require(
            _enoughKeys(
                stakeholders[user_index].address_stakes[index].amount,
                stakeholders[user_index].address_stakes[index].totalReturn,
                reward,
                stakeholders[user_index].address_stakes[index].usedKeys
            ),
            "Not enough allowance left."
        );
        uint256 timeDiff = (
            stakeholders[user_index].address_stakes[index].timePeriod
        ).sub(stakeholders[user_index].address_stakes[index].since);
        stakeholders[user_index].address_stakes[index].since = block.timestamp;
        stakeholders[user_index].address_stakes[index].timePeriod = block
            .timestamp
            .add(timeDiff);
        stakeholders[user_index].address_stakes[index].reward = reward;
        emit Extended(
            stakeholders[user_index].address_stakes[index].user,
            stakeholders[user_index].address_stakes[index].amount,
            stakeholders[user_index].address_stakes[index].since,
            stakeholders[user_index].address_stakes[index].reward,
            stakeholders[user_index].address_stakes[index].timePeriod,
            stakeholders[user_index].address_stakes[index].usedKeys
        );
    }

    function _enoughKeys(
        uint256 _amount,
        uint256 _PlanReward,
        uint256 _FutReward,
        uint256 _numKeys
    ) internal view returns (bool) {
        if (
            _amount.mul(_PlanReward).div(100).add(_FutReward) <=
            _numKeys.mul(_maxAllowancePerKey)
        ) {
            return true;
        }
        return false;
    }

    function _stakeLength(address _staker) external view returns (uint256) {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        return summary.stakes.length;
    }

    function getAllStakes(address _staker)
        external
        view
        returns (StakingSummary memory)
    {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        for (uint256 s = 0; s < summary.stakes.length; s += 1) {
            uint256 availableReward = calculateStakeReward(summary.stakes[s]);
            summary.stakes[s].reward = summary.stakes[s].reward.add(
                availableReward
            );
        }
        return summary;
    }

    function getSingleStake(address _staker, uint256 index)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        require(index <= maxPositions - 1, "Index out of range.");
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        require(summary.stakes.length > 0, "No active positions.");
        require(summary.stakes.length > index, "Index not valid.");

        for (uint256 s = 0; s < summary.stakes.length; s += 1) {
            uint256 availableReward = calculateStakeReward(summary.stakes[s]);
            summary.stakes[s].reward = summary.stakes[s].reward.add(
                availableReward
            );
        }
        return (
            summary.stakes[index].amount,
            summary.stakes[index].since,
            summary.stakes[index].totalReturn,
            summary.stakes[index].timePeriod,
            summary.stakes[index].reward,
            summary.stakes[index].usedKeys
        );
    }

    function _hasStake(address _staker, uint256 index)
        internal
        view
        returns (bool)
    {
        require(index <= maxPositions - 1, "Index out of range.");
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        if (summary.stakes.length > 0 && summary.stakes.length > index) {
            return true;
        }
        return false;
    }

    function canStake(address _staker) private view returns (bool result) {
        StakingSummary memory summary = StakingSummary(
            stakeholders[stakes[_staker]].address_stakes
        );
        if (summary.stakes.length >= maxPositions) {
            return false;
        }
        return true;
    }

    function setMaxPositions(uint256 _maxPositions) external onlyRole(ADMIN) {
        maxPositions = _maxPositions;
    }

    function setMinStakeValueToClosePosition(
        uint256 _MinStakeValueToClosePosition
    ) external onlyRole(ADMIN) {
        MinStakeValueToClosePosition = _MinStakeValueToClosePosition;
    }

    function setStakingAccount(address _StakingAccount)
        external
        onlyRole(ADMIN)
    {
        StakingAccount = _StakingAccount;
    }

    function setMoveFundsUponReceipt(bool _MoveFundsUponReceipt)
        external
        onlyRole(ADMIN)
    {
        MoveFundsUponReceipt = _MoveFundsUponReceipt;
    }

    function setMovePercentageBasisNumber(uint256 _MovePercentageBasisNumber)
        external
        onlyRole(ADMIN)
    {
        MovePercentageBasisNumber = _MovePercentageBasisNumber;
    }

    function setPartialWithdraw(bool _partialWithdraw)
        external
        onlyRole(ADMIN)
    {
        partialWithdraw = _partialWithdraw;
    }

    function setMovePercentageOfFundsUponReceipt(
        bool _MovePercentageOfFundsUponReceipt
    ) external onlyRole(ADMIN) {
        MovePercentageOfFundsUponReceipt = _MovePercentageOfFundsUponReceipt;
    }

    modifier onlyRole(bytes32 _role) {
        require(roles[_role][msg.sender], "Not authorized.");
        _;
    }

    function _grantRole(bytes32 _role, address _account) internal {
        roles[_role][_account] = true;
        emit GrantRole(_role, _account);
    }

    function grantRole(bytes32 _role, address _account)
        external
        onlyRole(ADMIN)
    {
        _grantRole(_role, _account);
    }

    function _revokeRole(bytes32 _role, address _account) internal {
        roles[_role][_account] = false;
        emit RevokeRole(_role, _account);
    }

    function revokeRole(bytes32 _role, address _account)
        external
        onlyRole(ADMIN)
    {
        _revokeRole(_role, _account);
    }

    function set_maxAllowancePerKey(uint256 __maxAllowancePerKey)
        external
        onlyRole(ADMIN)
    {
        _maxAllowancePerKey = __maxAllowancePerKey;
    }

    function setMinWithdraw(uint256 _minWithdraw) external onlyRole(ADMIN) {
        minWithdraw = _minWithdraw;
    }
}

File 9 of 10 : NFTContractFunctions.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

interface NFTContractFunctions {
    function balanceOf(address owner) external view returns (uint256);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function approve(address to, uint256 tokenId) external;
}

File 10 of 10 : burnFunctions.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

interface burnFunctions {
    function burnKeys(uint256[] memory _keysToBeUsed, address _spender)
        external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_newAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"since","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedKeys","type":"uint256"}],"name":"Extended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payee","type":"address"}],"name":"LogDepositReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RevokeRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_plan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedKeys","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"_burnKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"_extendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"_stakeLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_name","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"addPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stake_index","type":"uint256"},{"internalType":"address payable","name":"_spender","type":"address"},{"internalType":"bool","name":"refund","type":"bool"}],"name":"admin_withdraw_close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"}],"name":"beginStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_keysToBeUsed","type":"uint256[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"burnKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_package","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_numKeys","type":"uint256"},{"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"exec_beginStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getAllStakes","outputs":[{"components":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"since","type":"uint256"},{"internalType":"uint256","name":"totalReturn","type":"uint256"},{"internalType":"uint256","name":"timePeriod","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"usedKeys","type":"uint256"}],"internalType":"struct Stakeable.Stake[]","name":"stakes","type":"tuple[]"}],"internalType":"struct Stakeable.StakingSummary","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getSingleStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_payee","type":"address"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"BurnContract","type":"address"}],"name":"setBurnContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"KeysContract","type":"address"}],"name":"setCheckKeysContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setDelegateBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAllowancePerKey","type":"uint256"}],"name":"setMaxAllowancePerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPositions","type":"uint256"}],"name":"setMaxPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MinStakeValueToClosePosition","type":"uint256"}],"name":"setMinStakeValueToClosePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minWithdraw","type":"uint256"}],"name":"setMinWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MoveFundsUponReceipt","type":"bool"}],"name":"setMoveFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MovePercentageBasisNumber","type":"uint256"}],"name":"setMovePercentageBasisNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_MovePercentageOfFundsUponReceipt","type":"bool"}],"name":"setMovePercentageOfFundsUponReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_partialWithdraw","type":"bool"}],"name":"setPartialWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_StakingAccount","type":"address"}],"name":"setStakingAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__maxAllowancePerKey","type":"uint256"}],"name":"set_maxAllowancePerKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdrawReturn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052674563918244f4000060028190556004805567016345785d8a00006005819055601e6006556007556008805461ffff60a81b191661010160a81b179055600d55600e805460ff191660011790553480156200005e57600080fd5b5060405162004a5638038062004a568339810160408190526200008191620001fa565b6001600081815560098054909201825552600c805460ff19169055620000a73362000145565b6040516420a226a4a760d91b6020820152620000e4906025015b60405160208183030381529060405280519060200120826200019f60201b60201c565b6040516420a226a4a760d91b6020820152620001209060250160405160208183030381529060405280519060200120336200019f60201b60201c565b604051634558454360e01b60208201526200013e90602401620000c1565b506200022c565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b6000602082840312156200020d57600080fd5b81516001600160a01b03811681146200022557600080fd5b9392505050565b61481a806200023c6000396000f3fe60806040526004361061021e5760003560e01c80638da5cb5b11610123578063b453a187116100ab578063eff350641161006f578063eff350641461072f578063f2fde38b14610742578063f606598314610762578063f7b188a514610782578063f8fc08b91461079757600080fd5b8063b453a1871461068f578063b6ab6f56146106af578063d0c4cab6146106cf578063d547741f146106ef578063ec5a82e41461070f57600080fd5b8063a2e30f15116100f2578063a2e30f151461058e578063a4ca8c7a1461060f578063a865e8ce1461062f578063a93e05231461064f578063b06113fe1461066f57600080fd5b80638da5cb5b146104f85780638e699bc81461052e57806399b1d9581461054e57806399d9af521461056e57600080fd5b806350690fc0116101a657806368888dc31161017557806368888dc31461046e578063715018a61461048e57806378174ec5146104a357806381cdf766146104c35780638456cb59146104e357600080fd5b806350690fc0146103dc5780635c975abb146103fc578063654a3c7c146104205780636721aa221461044057600080fd5b80631c8050c7116101ed5780631c8050c71461033a57806325d5971f1461035c5780632f2ff15d1461037c57806335aa134a1461039c5780633b289665146103bc57600080fd5b8063042389941461025557806312065fe01461028b578063150b7a02146102a857806315914247146102ed57600080fd5b366102505760405133907f15382559391789f1865e10e9c8b51327a9cb0381eae89973ada229e7a78c08f390600090a2005b600080fd5b34801561026157600080fd5b50610275610270366004614137565b6107d2565b6040516102829190614154565b60405180910390f35b34801561029757600080fd5b50475b604051908152602001610282565b3480156102b457600080fd5b506102d46102c33660046141eb565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610282565b3480156102f957600080fd5b5061030d61030836600461428a565b610975565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610282565b34801561034657600080fd5b5061035a610355366004614137565b610c61565b005b34801561036857600080fd5b5061035a6103773660046142b6565b610cdf565b34801561038857600080fd5b5061035a6103973660046142cf565b610d45565b3480156103a857600080fd5b5061035a6103b73660046142b6565b610daf565b3480156103c857600080fd5b5061035a6103d7366004614137565b610e10565b3480156103e857600080fd5b5061035a6103f73660046143b0565b610eb2565b34801561040857600080fd5b50600c5460ff165b6040519015158152602001610282565b34801561042c57600080fd5b5061035a61043b3660046142b6565b610f72565b34801561044c57600080fd5b5061035a61045b366004614405565b600e805460ff1916911515919091179055565b34801561047a57600080fd5b5061035a6104893660046142b6565b610fd0565b34801561049a57600080fd5b5061035a611031565b3480156104af57600080fd5b5061035a6104be3660046143b0565b611045565b3480156104cf57600080fd5b5061035a6104de366004614137565b6111eb565b3480156104ef57600080fd5b5061035a611273565b34801561050457600080fd5b50600c5461010090046001600160a01b03166040516001600160a01b039091168152602001610282565b34801561053a57600080fd5b5061035a6105493660046142b6565b6112e1565b34801561055a57600080fd5b5061035a6105693660046142b6565b61192a565b34801561057a57600080fd5b5061035a610589366004614405565b61198b565b34801561059a57600080fd5b5061035a6105a9366004614422565b60009485526012602090815260408087208151608081018352968752868301958652908601938452606086019283528054600181810183559188529190962094516004909102909401938455915193830193909355915160028201559051600390910155565b34801561061b57600080fd5b5061035a61062a366004614405565b611a05565b34801561063b57600080fd5b5061035a61064a3660046142b6565b611a7f565b34801561065b57600080fd5b5061035a61066a3660046142cf565b611ae0565b34801561067b57600080fd5b5061035a61068a366004614405565b611ba3565b34801561069b57600080fd5b5061035a6106aa36600461445d565b611c1d565b3480156106bb57600080fd5b5061035a6106ca36600461449f565b611cce565b3480156106db57600080fd5b5061029a6106ea366004614137565b611e3d565b3480156106fb57600080fd5b5061035a61070a3660046142cf565b611f3e565b34801561071b57600080fd5b5061035a61072a3660046142b6565b611fa3565b61035a61073d3660046144f2565b612004565b34801561074e57600080fd5b5061035a61075d366004614137565b612049565b34801561076e57600080fd5b5061035a61077d3660046142b6565b6120bf565b34801561078e57600080fd5b5061035a612120565b3480156107a357600080fd5b506104106107b23660046142cf565b600a60209081526000928352604080842090915290825290205460ff1681565b60408051602081019091526060815260408051602080820183526001600160a01b0385166000908152600b9091529182205460098054839290811061081957610819614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b828210156108c55760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c0830152908352909201910161084a565b505050915250905060005b81515181101561096e576000610902836000015183815181106108f5576108f5614542565b602002602001015161218b565b9050610938818460000151848151811061091e5761091e614542565b602002602001015160a001516121cd90919063ffffffff16565b835180518490811061094c5761094c614542565b602090810291909101015160a001525061096760018261456e565b90506108d0565b5092915050565b600080600080600080600160045461098d9190614586565b8711156109b55760405162461bcd60e51b81526004016109ac9061459d565b60405180910390fd5b60408051602080820183526001600160a01b038b166000908152600b909152918220546009805483929081106109ed576109ed614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610a995760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610a1e565b505050915250805151909150610ac15760405162461bcd60e51b81526004016109ac906145ca565b8051518810610b055760405162461bcd60e51b815260206004820152601060248201526f24b73232bc103737ba103b30b634b21760811b60448201526064016109ac565b60005b815151811015610b7f576000610b2d836000015183815181106108f5576108f5614542565b9050610b49818460000151848151811061091e5761091e614542565b8351805184908110610b5d57610b5d614542565b602090810291909101015160a0015250610b7860018261456e565b9050610b08565b508051805189908110610b9457610b94614542565b60200260200101516020015181600001518981518110610bb657610bb6614542565b60200260200101516040015182600001518a81518110610bd857610bd8614542565b60200260200101516060015183600001518b81518110610bfa57610bfa614542565b60200260200101516080015184600001518c81518110610c1c57610c1c614542565b602002602001015160a0015185600001518d81518110610c3e57610c3e614542565b602002602001015160c00151965096509650965096509650509295509295509295565b604051602001610c70906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610cbc5760405162461bcd60e51b81526004016109ac90614609565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b600260005403610d015760405162461bcd60e51b81526004016109ac90614632565b6002600055610d0e6121e0565b610d183382612226565b610d345760405162461bcd60e51b81526004016109ac906145ca565b610d3d8161236e565b506001600055565b604051602001610d54906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610da05760405162461bcd60e51b81526004016109ac90614609565b610daa8383612823565b505050565b604051602001610dbe906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610e0a5760405162461bcd60e51b81526004016109ac90614609565b50600755565b604051602001610e1f906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610e6b5760405162461bcd60e51b81526004016109ac90614609565b50600e8054610100600160a81b0319166101006001600160a01b039384168102919091179182905560108054919092049092166001600160a01b0319909216919091179055565b600f546001600160a01b0316610f0a5760405162461bcd60e51b815260206004820152601760248201527f44656c656761746564204275726e206e6f74207365742e00000000000000000060448201526064016109ac565b601154604051630141a43f60e61b81526001600160a01b03909116906350690fc090610f3c9085908590600401614669565b600060405180830381600087803b158015610f5657600080fd5b505af1158015610f6a573d6000803e3d6000fd5b505050505050565b600260005403610f945760405162461bcd60e51b81526004016109ac90614632565b6002600055610fa16121e0565b610fab3382612226565b610fc75760405162461bcd60e51b81526004016109ac906145ca565b610d3d8161287e565b604051602001610fdf906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661102b5760405162461bcd60e51b81526004016109ac90614609565b50600455565b611039612fdf565b611043600061303f565b565b61dead60005b83518110156111e55760105460405163e985e9c560e01b81526001600160a01b0385811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906146bd565b15156001146111335760405162461bcd60e51b815260206004820152603160248201527f4275726e4b6579733a20436f6e7472616374206973206e6f7420617070726f7660448201527032b2103a379039b832b7321025b2bcb99760791b60648201526084016109ac565b60105484516001600160a01b03909116906342842e0e908590859088908690811061116057611160614542565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505080806111dd906146da565b91505061104b565b50505050565b6040516020016111fa906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112465760405162461bcd60e51b81526004016109ac90614609565b50600f80546001600160a01b039092166001600160a01b0319928316811790915560118054909216179055565b61127b6121e0565b60405160200161128a906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112d65760405162461bcd60e51b81526004016109ac90614609565b6112de613099565b50565b336000908152600b60205260409020548061130e5760405162461bcd60e51b81526004016109ac906146f3565b600160045461131d9190614586565b82111561133c5760405162461bcd60e51b81526004016109ac9061459d565b60006009828154811061135157611351614542565b9060005260206000209060020201600101838154811061137357611373614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506113f95760405162461bcd60e51b81526004016109ac906145ca565b60006114126114078361218b565b60a0840151906121cd565b90506000811161145b5760405162461bcd60e51b815260206004820152601460248201527322bc3a32b732103737ba102837b9b9b4b136329760611b60448201526064016109ac565b6115396009848154811061147157611471614542565b9060005260206000209060020201600101858154811061149357611493614542565b906000526020600020906007020160010154600985815481106114b8576114b8614542565b906000526020600020906002020160010186815481106114da576114da614542565b906000526020600020906007020160030154836009878154811061150057611500614542565b9060005260206000209060020201600101888154811061152257611522614542565b9060005260206000209060070201600601546130f3565b6115855760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820616c6c6f77616e6365206c6566742e00000000000060448201526064016109ac565b60006116266009858154811061159d5761159d614542565b906000526020600020906002020160010186815481106115bf576115bf614542565b906000526020600020906007020160020154600986815481106115e4576115e4614542565b9060005260206000209060020201600101878154811061160657611606614542565b90600052602060002090600702016004015461313c90919063ffffffff16565b9050426009858154811061163c5761163c614542565b9060005260206000209060020201600101868154811061165e5761165e614542565b600091825260209091206002600790920201015561167c42826121cd565b6009858154811061168f5761168f614542565b906000526020600020906002020160010186815481106116b1576116b1614542565b90600052602060002090600702016004018190555081600985815481106116da576116da614542565b906000526020600020906002020160010186815481106116fc576116fc614542565b9060005260206000209060070201600501819055507fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe276009858154811061174557611745614542565b9060005260206000209060020201600101868154811061176757611767614542565b6000918252602090912060079091020154600980546001600160a01b03909216918790811061179857611798614542565b906000526020600020906002020160010187815481106117ba576117ba614542565b906000526020600020906007020160010154600987815481106117df576117df614542565b9060005260206000209060020201600101888154811061180157611801614542565b9060005260206000209060070201600201546009888154811061182657611826614542565b9060005260206000209060020201600101898154811061184857611848614542565b9060005260206000209060070201600501546009898154811061186d5761186d614542565b90600052602060002090600202016001018a8154811061188f5761188f614542565b90600052602060002090600702016004015460098a815481106118b4576118b4614542565b90600052602060002090600202016001018b815481106118d6576118d6614542565b600091825260209182902060066007909202010154604080516001600160a01b039098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a15050505050565b604051602001611939906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166119855760405162461bcd60e51b81526004016109ac90614609565b50600255565b60405160200161199a906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166119e65760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160b01b0260ff60b01b19909216919091179055565b604051602001611a14906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611a605760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160a81b0260ff60a81b19909216919091179055565b604051602001611a8e906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611ada5760405162461bcd60e51b81526004016109ac90614609565b50600555565b600260005403611b025760405162461bcd60e51b81526004016109ac90614632565b6002600055604051611b16906020016145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611b625760405162461bcd60e51b81526004016109ac90614609565b6040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015611b98573d6000803e3d6000fd5b505060016000555050565b604051602001611bb2906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611bfe5760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160a01b0260ff60a01b19909216919091179055565b604051602001611c2c906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611c785760405162461bcd60e51b81526004016109ac90614609565b611c828385612226565b611cc35760405162461bcd60e51b81526020600482015260126024820152712737ba3434b7339030bb30b4b630b136329760711b60448201526064016109ac565b6111e5848484613148565b600260005403611cf05760405162461bcd60e51b81526004016109ac90614632565b6002600055604051634558454360e01b602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611d545760405162461bcd60e51b81526004016109ac90614609565b611d5c6121e0565b6000611d67876134a0565b60208101518151604083015160608401519394509192909190818c10801590611d905750808c11155b611dd15760405162461bcd60e51b815260206004820152601260248201527156616c7565206e6f7420696e2072616e676560701b60448201526064016109ac565b611ddc8c858a61357d565b611e1b5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41025b2bcb99760811b60448201526064016109ac565b611e2a8c85858c8e8d8d6135b2565b5050600160005550505050505050505050565b60008060405180602001604052806009600b6000876001600160a01b03166001600160a01b031681526020019081526020016000205481548110611e8357611e83614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015611f2f5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101611eb4565b50505091525051519392505050565b604051602001611f4d906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611f995760405162461bcd60e51b81526004016109ac90614609565b610daa83836137b0565b604051602001611fb2906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611ffe5760405162461bcd60e51b81526004016109ac90614609565b50600655565b6002600054036120265760405162461bcd60e51b81526004016109ac90614632565b60026000556120336121e0565b61203f83838333613808565b5050600160005550565b612051612fdf565b6001600160a01b0381166120b65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ac565b6112de8161303f565b6040516020016120ce906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661211a5760405162461bcd60e51b81526004016109ac90614609565b50600d55565b6121286139ff565b604051602001612137906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166121835760405162461bcd60e51b81526004016109ac90614609565b6112de613a48565b600081608001514211156121c5576121bf60646121b984606001518560200151613a8190919063ffffffff16565b90613a8d565b92915050565b506000919050565b60006121d9828461456e565b9392505050565b600c5460ff16156110435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109ac565b600060016004546122379190614586565b8211156122565760405162461bcd60e51b81526004016109ac9061459d565b60408051602080820183526001600160a01b0386166000908152600b9091529182205460098054839290811061228e5761228e614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b8282101561233a5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c083015290835290920191016122bf565b50505091525080515190915015801590612355575080515183105b156123645760019150506121bf565b5060009392505050565b336000908152600b60205260409020548061239b5760405162461bcd60e51b81526004016109ac906146f3565b60016004546123aa9190614586565b8211156123c95760405162461bcd60e51b81526004016109ac9061459d565b6000600982815481106123de576123de614542565b9060005260206000209060020201600101838154811061240057612400614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506124865760405162461bcd60e51b81526004016109ac906145ca565b80608001514210156124cd5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0ba3ab932b2103cb2ba1760811b60448201526064016109ac565b60006124db6114078361218b565b9050600081116125205760405162461bcd60e51b815260206004820152601060248201526f21b630b4b6903737ba103932b0b23c9760811b60448201526064016109ac565b602082015160009061253290836121cd565b90506007548110156125865760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d000000000060448201526064016109ac565b8047116125a55760405162461bcd60e51b81526004016109ac9061472a565b600984815481106125b8576125b8614542565b906000526020600020906002020160010185815481106125da576125da614542565b60009182526020822060079091020180546001600160a01b0319168155600181018290556002810182905560038101829055600481018290556005810182905560060155600980548590811061263257612632614542565b906000526020600020906002020160010160016009868154811061265857612658614542565b9060005260206000209060020201600101805490506126779190614586565b8154811061268757612687614542565b9060005260206000209060070201600985815481106126a8576126a8614542565b906000526020600020906002020160010186815481106126ca576126ca614542565b60009182526020909120825460079092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600691820154910155600980548590811061274857612748614542565b906000526020600020906002020160010180548061276857612768614757565b60008281526020812060076000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006018190559155604051339183156108fc02918491818181858888f193505050501580156127e1573d6000803e3d6000fd5b506040805182815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a25050505050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b336000908152600b6020526040902054806128ab5760405162461bcd60e51b81526004016109ac906146f3565b600854600160a81b900460ff166129045760405162461bcd60e51b815260206004820181905260248201527f5061727469616c207769746864726177206973206e6f7420656e61626c65642e60448201526064016109ac565b60016004546129139190614586565b8211156129325760405162461bcd60e51b81526004016109ac9061459d565b60006009828154811061294757612947614542565b9060005260206000209060020201600101838154811061296957612969614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506129ef5760405162461bcd60e51b81526004016109ac906145ca565b8060800151421015612a365760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0ba3ab932b2103cb2ba1760811b60448201526064016109ac565b6000612a446114078361218b565b905060008111612a895760405162461bcd60e51b815260206004820152601060248201526f21b630b4b6903737ba103932b0b23c9760811b60448201526064016109ac565b6007548190811015612add5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d000000000060448201526064016109ac565b804711612afc5760405162461bcd60e51b81526004016109ac9061472a565b612bc360098581548110612b1257612b12614542565b90600052602060002090600202016001018681548110612b3457612b34614542565b90600052602060002090600702016001015460098681548110612b5957612b59614542565b90600052602060002090600202016001018781548110612b7b57612b7b614542565b9060005260206000209060070201600301548460098881548110612ba157612ba1614542565b9060005260206000209060020201600101898154811061152257611522614542565b15612fb4576000612c4960098681548110612be057612be0614542565b90600052602060002090600202016001018781548110612c0257612c02614542565b90600052602060002090600702016002015460098781548110612c2757612c27614542565b9060005260206000209060020201600101888154811061160657611606614542565b90504260098681548110612c5f57612c5f614542565b90600052602060002090600202016001018781548110612c8157612c81614542565b6000918252602090912060026007909202010155612c9f42826121cd565b60098681548110612cb257612cb2614542565b90600052602060002090600202016001018781548110612cd457612cd4614542565b906000526020600020906007020160040181905550600060098681548110612cfe57612cfe614542565b90600052602060002090600202016001018781548110612d2057612d20614542565b60009182526020822060056007909202010191909155604051339184156108fc02918591818181858888f19350505050158015612d61573d6000803e3d6000fd5b506040805183815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a27fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe2760098681548110612dd057612dd0614542565b90600052602060002090600202016001018781548110612df257612df2614542565b6000918252602090912060079091020154600980546001600160a01b039092169188908110612e2357612e23614542565b90600052602060002090600202016001018881548110612e4557612e45614542565b90600052602060002090600702016001015460098881548110612e6a57612e6a614542565b90600052602060002090600202016001018981548110612e8c57612e8c614542565b90600052602060002090600702016002015460098981548110612eb157612eb1614542565b90600052602060002090600202016001018a81548110612ed357612ed3614542565b90600052602060002090600702016005015460098a81548110612ef857612ef8614542565b90600052602060002090600202016001018b81548110612f1a57612f1a614542565b90600052602060002090600702016004015460098b81548110612f3f57612f3f614542565b90600052602060002090600202016001018c81548110612f6157612f61614542565b600091825260209182902060066007909202010154604080516001600160a01b039098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a150612fd8565b6020830151612fc390836121cd565b9050600984815481106125b8576125b8614542565b5050505050565b600c546001600160a01b036101009091041633146110435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ac565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6130a16121e0565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130d63390565b6040516001600160a01b03909116815260200160405180910390a1565b600061310a60025483613a8190919063ffffffff16565b6131238461311d60646121b98a8a613a81565b906121cd565b1161313057506001613134565b5060005b949350505050565b60006121d98284614586565b6001600160a01b0382166000908152600b6020526040812054600980549192918390811061317857613178614542565b9060005260206000209060020201600101858154811061319a5761319a614542565b600091825260208083206040805160e081018252600790940290910180546001600160a01b031684526001810154928401929092526002820154908301526003810154606083015260048101546080830152600581015460a08301526006015460c0820152915061320d6114078361218b565b905060006132288284602001516121cd90919063ffffffff16565b90506009848154811061323d5761323d614542565b9060005260206000209060020201600101878154811061325f5761325f614542565b60009182526020822060079091020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006015560098054859081106132b7576132b7614542565b90600052602060002090600202016001016001600986815481106132dd576132dd614542565b9060005260206000209060020201600101805490506132fc9190614586565b8154811061330c5761330c614542565b90600052602060002090600702016009858154811061332d5761332d614542565b9060005260206000209060020201600101888154811061334f5761334f614542565b60009182526020909120825460079092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560069182015491015560098054859081106133cd576133cd614542565b90600052602060002090600202016001018054806133ed576133ed614757565b60008281526020812060076000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006015590558415613497578047101561345f5760405162461bcd60e51b81526004016109ac9061472a565b6040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015613495573d6000803e3d6000fd5b505b50505050505050565b6134cb6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000828152601260205260409020546135135760405162461bcd60e51b815260206004820152600a6024820152694e6f205061636b61676560b01b60448201526064016109ac565b60008281526012602052604081208054829061353157613531614542565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080915050919050565b6000613594600d5483613a8190919063ffffffff16565b6135a360646121b98787613a81565b11612364575060019392505050565b6135bb84613a99565b6135fd5760405162461bcd60e51b815260206004820152601360248201527226b0bc1037b832b7103837b9b4ba34b7b7399760691b60448201526064016109ac565b6001600160a01b0384166000908152600b602052604081205490849082900361362c5761362986613bb1565b91505b600185905561363b85886121cd565b600355600980548390811061365257613652614542565b90600052602060002090600202016001016040518060e00160405280886001600160a01b031681526020018b81526020018381526020018a8152602001600354815260200185815260200186815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050856001600160a01b03167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558a84848c6003548a60405161379d96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a2505050505050505050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000613813846134a0565b6020810151815160408301516060840151939450919290919081891080159061383c5750808911155b6138885760405162461bcd60e51b815260206004820152601860248201527f5374616b652076616c7565206e6f7420696e2072616e6765000000000000000060448201526064016109ac565b8834146138ce5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21030b6b7bab73a1039b2b73a1760611b60448201526064016109ac565b6138d88787613c27565b15156001146139295760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c204b657973206f776e656420627920616464726573732e000060448201526064016109ac565b6001613933613d51565b10156139785760405162461bcd60e51b815260206004820152601460248201527320b2323932b9b9903430bb329037379025b2bc9760611b60448201526064016109ac565b6139848985895161357d565b6139c35760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41025b2bcb99760811b60448201526064016109ac565b600e5460ff166139dc576139d78787611045565b6139e6565b6139e68787610eb2565b6139f4898585898b51613e1a565b505050505050505050565b600c5460ff166110435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109ac565b613a506139ff565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336130d6565b60006121d9828461476d565b60006121d9828461478c565b60008060405180602001604052806009600b6000876001600160a01b03166001600160a01b031681526020019081526020016000205481548110613adf57613adf614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015613b8b5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101613b10565b50505091525060045481515191925011613ba85750600092915050565b50600192915050565b60098054600190810180835560009283528291613bcd91614586565b90508260098281548110613be357613be3614542565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03948516179055949091168152600b90935260409092208290555090565b600e5460009061010090046001600160a01b0316613c7f5760405162461bcd60e51b815260206004820152601560248201527425b2bc9021b7b73a3930b1ba103737ba1039b2ba1760591b60448201526064016109ac565b60005b8351811015613d475760105484516001600160a01b03808616921690636352211e90879085908110613cb657613cb6614542565b60200260200101516040518263ffffffff1660e01b8152600401613cdc91815260200190565b602060405180830381865afa158015613cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1d91906147ae565b6001600160a01b031614613d355760009150506121bf565b80613d3f816146da565b915050613c82565b5060019392505050565b600e5460009061010090046001600160a01b0316613da95760405162461bcd60e51b815260206004820152601560248201527425b2bc9021b7b73a3930b1ba103737ba1039b2ba1760591b60448201526064016109ac565b6010546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1591906147cb565b905090565b6008546001600160a01b0316613e725760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67206163636f756e74206e6f74207365742e000000000000000060448201526064016109ac565b613e7b82613a99565b613ebd5760405162461bcd60e51b815260206004820152601360248201527226b0bc1037b832b7103837b9b4ba34b7b7399760691b60448201526064016109ac565b600854600160a01b900460ff1615613f0b576008546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015613f09573d6000803e3d6000fd5b505b600854600160b01b900460ff1615613f6f576008546006546001600160a01b03909116906108fc90613f45906064906121b9908a90613a81565b6040518115909202916000818181858888f19350505050158015613f6d573d6000803e3d6000fd5b505b6001600160a01b0382166000908152600b6020526040812054904290829003613f9e57613f9b84613bb1565b91505b426001819055613fae90866121cd565b6003556009805483908110613fc557613fc5614542565b90600052602060002090600202016001016040518060e00160405280866001600160a01b0316815260200189815260200183815260200188815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050836001600160a01b03167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558884848a6003548960405161411196959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a250505050505050565b6001600160a01b03811681146112de57600080fd5b60006020828403121561414957600080fd5b81356121d981614122565b60006020808352604080840185518384870152818151808452606093508388019150858301925060005b818110156141dd57835180516001600160a01b031684528781015188850152868101518785015285810151868501526080808201519085015260a0808201519085015260c090810151908401529286019260e09092019160010161417e565b509098975050505050505050565b60008060008060006080868803121561420357600080fd5b853561420e81614122565b9450602086013561421e81614122565b935060408601359250606086013567ffffffffffffffff8082111561424257600080fd5b818801915088601f83011261425657600080fd5b81358181111561426557600080fd5b89602082850101111561427757600080fd5b9699959850939650602001949392505050565b6000806040838503121561429d57600080fd5b82356142a881614122565b946020939093013593505050565b6000602082840312156142c857600080fd5b5035919050565b600080604083850312156142e257600080fd5b8235915060208301356142f481614122565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261432657600080fd5b8135602067ffffffffffffffff80831115614343576143436142ff565b8260051b604051601f19603f83011681018181108482111715614368576143686142ff565b60405293845285810183019383810192508785111561438657600080fd5b83870191505b848210156143a55781358352918301919083019061438c565b979650505050505050565b600080604083850312156143c357600080fd5b823567ffffffffffffffff8111156143da57600080fd5b6143e685828601614315565b92505060208301356142f481614122565b80151581146112de57600080fd5b60006020828403121561441757600080fd5b81356121d9816143f7565b600080600080600060a0868803121561443a57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060006060848603121561447257600080fd5b83359250602084013561448481614122565b91506040840135614494816143f7565b809150509250925092565b60008060008060008060c087890312156144b857600080fd5b86359550602087013594506040870135935060608701356144d881614122565b9598949750929560808101359460a0909101359350915050565b60008060006060848603121561450757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561452c57600080fd5b61453886828701614315565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561458157614581614558565b500190565b60008282101561459857614598614558565b500390565b60208082526013908201527224b73232bc1037baba1037b3103930b733b29760691b604082015260600190565b60208082526014908201527327379030b1ba34bb32903837b9b4ba34b7b7399760611b604082015260600190565b6420a226a4a760d91b815260050190565b6020808252600f908201526e2737ba1030baba3437b934bd32b21760891b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604080825283519082018190526000906020906060840190828701845b828110156146a257815184529284019290840190600101614686565b5050506001600160a01b039490941692019190915250919050565b6000602082840312156146cf57600080fd5b81516121d9816143f7565b6000600182016146ec576146ec614558565b5060010190565b60208082526017908201527f41646472657373206e6f7420726567697374657265642e000000000000000000604082015260600190565b6020808252601390820152722737ba1032b737bab3b4103130b630b731b29760691b604082015260600190565b634e487b7160e01b600052603160045260246000fd5b600081600019048311821515161561478757614787614558565b500290565b6000826147a957634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156147c057600080fd5b81516121d981614122565b6000602082840312156147dd57600080fd5b505191905056fea264697066735822122068b4daf2cedb404e5d378eaff6f1b76bfa13c3a4243750ed77c19be18837578a64736f6c634300080f00330000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13

Deployed Bytecode

0x60806040526004361061021e5760003560e01c80638da5cb5b11610123578063b453a187116100ab578063eff350641161006f578063eff350641461072f578063f2fde38b14610742578063f606598314610762578063f7b188a514610782578063f8fc08b91461079757600080fd5b8063b453a1871461068f578063b6ab6f56146106af578063d0c4cab6146106cf578063d547741f146106ef578063ec5a82e41461070f57600080fd5b8063a2e30f15116100f2578063a2e30f151461058e578063a4ca8c7a1461060f578063a865e8ce1461062f578063a93e05231461064f578063b06113fe1461066f57600080fd5b80638da5cb5b146104f85780638e699bc81461052e57806399b1d9581461054e57806399d9af521461056e57600080fd5b806350690fc0116101a657806368888dc31161017557806368888dc31461046e578063715018a61461048e57806378174ec5146104a357806381cdf766146104c35780638456cb59146104e357600080fd5b806350690fc0146103dc5780635c975abb146103fc578063654a3c7c146104205780636721aa221461044057600080fd5b80631c8050c7116101ed5780631c8050c71461033a57806325d5971f1461035c5780632f2ff15d1461037c57806335aa134a1461039c5780633b289665146103bc57600080fd5b8063042389941461025557806312065fe01461028b578063150b7a02146102a857806315914247146102ed57600080fd5b366102505760405133907f15382559391789f1865e10e9c8b51327a9cb0381eae89973ada229e7a78c08f390600090a2005b600080fd5b34801561026157600080fd5b50610275610270366004614137565b6107d2565b6040516102829190614154565b60405180910390f35b34801561029757600080fd5b50475b604051908152602001610282565b3480156102b457600080fd5b506102d46102c33660046141eb565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610282565b3480156102f957600080fd5b5061030d61030836600461428a565b610975565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610282565b34801561034657600080fd5b5061035a610355366004614137565b610c61565b005b34801561036857600080fd5b5061035a6103773660046142b6565b610cdf565b34801561038857600080fd5b5061035a6103973660046142cf565b610d45565b3480156103a857600080fd5b5061035a6103b73660046142b6565b610daf565b3480156103c857600080fd5b5061035a6103d7366004614137565b610e10565b3480156103e857600080fd5b5061035a6103f73660046143b0565b610eb2565b34801561040857600080fd5b50600c5460ff165b6040519015158152602001610282565b34801561042c57600080fd5b5061035a61043b3660046142b6565b610f72565b34801561044c57600080fd5b5061035a61045b366004614405565b600e805460ff1916911515919091179055565b34801561047a57600080fd5b5061035a6104893660046142b6565b610fd0565b34801561049a57600080fd5b5061035a611031565b3480156104af57600080fd5b5061035a6104be3660046143b0565b611045565b3480156104cf57600080fd5b5061035a6104de366004614137565b6111eb565b3480156104ef57600080fd5b5061035a611273565b34801561050457600080fd5b50600c5461010090046001600160a01b03166040516001600160a01b039091168152602001610282565b34801561053a57600080fd5b5061035a6105493660046142b6565b6112e1565b34801561055a57600080fd5b5061035a6105693660046142b6565b61192a565b34801561057a57600080fd5b5061035a610589366004614405565b61198b565b34801561059a57600080fd5b5061035a6105a9366004614422565b60009485526012602090815260408087208151608081018352968752868301958652908601938452606086019283528054600181810183559188529190962094516004909102909401938455915193830193909355915160028201559051600390910155565b34801561061b57600080fd5b5061035a61062a366004614405565b611a05565b34801561063b57600080fd5b5061035a61064a3660046142b6565b611a7f565b34801561065b57600080fd5b5061035a61066a3660046142cf565b611ae0565b34801561067b57600080fd5b5061035a61068a366004614405565b611ba3565b34801561069b57600080fd5b5061035a6106aa36600461445d565b611c1d565b3480156106bb57600080fd5b5061035a6106ca36600461449f565b611cce565b3480156106db57600080fd5b5061029a6106ea366004614137565b611e3d565b3480156106fb57600080fd5b5061035a61070a3660046142cf565b611f3e565b34801561071b57600080fd5b5061035a61072a3660046142b6565b611fa3565b61035a61073d3660046144f2565b612004565b34801561074e57600080fd5b5061035a61075d366004614137565b612049565b34801561076e57600080fd5b5061035a61077d3660046142b6565b6120bf565b34801561078e57600080fd5b5061035a612120565b3480156107a357600080fd5b506104106107b23660046142cf565b600a60209081526000928352604080842090915290825290205460ff1681565b60408051602081019091526060815260408051602080820183526001600160a01b0385166000908152600b9091529182205460098054839290811061081957610819614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b828210156108c55760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c0830152908352909201910161084a565b505050915250905060005b81515181101561096e576000610902836000015183815181106108f5576108f5614542565b602002602001015161218b565b9050610938818460000151848151811061091e5761091e614542565b602002602001015160a001516121cd90919063ffffffff16565b835180518490811061094c5761094c614542565b602090810291909101015160a001525061096760018261456e565b90506108d0565b5092915050565b600080600080600080600160045461098d9190614586565b8711156109b55760405162461bcd60e51b81526004016109ac9061459d565b60405180910390fd5b60408051602080820183526001600160a01b038b166000908152600b909152918220546009805483929081106109ed576109ed614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610a995760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101610a1e565b505050915250805151909150610ac15760405162461bcd60e51b81526004016109ac906145ca565b8051518810610b055760405162461bcd60e51b815260206004820152601060248201526f24b73232bc103737ba103b30b634b21760811b60448201526064016109ac565b60005b815151811015610b7f576000610b2d836000015183815181106108f5576108f5614542565b9050610b49818460000151848151811061091e5761091e614542565b8351805184908110610b5d57610b5d614542565b602090810291909101015160a0015250610b7860018261456e565b9050610b08565b508051805189908110610b9457610b94614542565b60200260200101516020015181600001518981518110610bb657610bb6614542565b60200260200101516040015182600001518a81518110610bd857610bd8614542565b60200260200101516060015183600001518b81518110610bfa57610bfa614542565b60200260200101516080015184600001518c81518110610c1c57610c1c614542565b602002602001015160a0015185600001518d81518110610c3e57610c3e614542565b602002602001015160c00151965096509650965096509650509295509295509295565b604051602001610c70906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610cbc5760405162461bcd60e51b81526004016109ac90614609565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b600260005403610d015760405162461bcd60e51b81526004016109ac90614632565b6002600055610d0e6121e0565b610d183382612226565b610d345760405162461bcd60e51b81526004016109ac906145ca565b610d3d8161236e565b506001600055565b604051602001610d54906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610da05760405162461bcd60e51b81526004016109ac90614609565b610daa8383612823565b505050565b604051602001610dbe906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610e0a5760405162461bcd60e51b81526004016109ac90614609565b50600755565b604051602001610e1f906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16610e6b5760405162461bcd60e51b81526004016109ac90614609565b50600e8054610100600160a81b0319166101006001600160a01b039384168102919091179182905560108054919092049092166001600160a01b0319909216919091179055565b600f546001600160a01b0316610f0a5760405162461bcd60e51b815260206004820152601760248201527f44656c656761746564204275726e206e6f74207365742e00000000000000000060448201526064016109ac565b601154604051630141a43f60e61b81526001600160a01b03909116906350690fc090610f3c9085908590600401614669565b600060405180830381600087803b158015610f5657600080fd5b505af1158015610f6a573d6000803e3d6000fd5b505050505050565b600260005403610f945760405162461bcd60e51b81526004016109ac90614632565b6002600055610fa16121e0565b610fab3382612226565b610fc75760405162461bcd60e51b81526004016109ac906145ca565b610d3d8161287e565b604051602001610fdf906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661102b5760405162461bcd60e51b81526004016109ac90614609565b50600455565b611039612fdf565b611043600061303f565b565b61dead60005b83518110156111e55760105460405163e985e9c560e01b81526001600160a01b0385811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906146bd565b15156001146111335760405162461bcd60e51b815260206004820152603160248201527f4275726e4b6579733a20436f6e7472616374206973206e6f7420617070726f7660448201527032b2103a379039b832b7321025b2bcb99760791b60648201526084016109ac565b60105484516001600160a01b03909116906342842e0e908590859088908690811061116057611160614542565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505080806111dd906146da565b91505061104b565b50505050565b6040516020016111fa906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112465760405162461bcd60e51b81526004016109ac90614609565b50600f80546001600160a01b039092166001600160a01b0319928316811790915560118054909216179055565b61127b6121e0565b60405160200161128a906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166112d65760405162461bcd60e51b81526004016109ac90614609565b6112de613099565b50565b336000908152600b60205260409020548061130e5760405162461bcd60e51b81526004016109ac906146f3565b600160045461131d9190614586565b82111561133c5760405162461bcd60e51b81526004016109ac9061459d565b60006009828154811061135157611351614542565b9060005260206000209060020201600101838154811061137357611373614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506113f95760405162461bcd60e51b81526004016109ac906145ca565b60006114126114078361218b565b60a0840151906121cd565b90506000811161145b5760405162461bcd60e51b815260206004820152601460248201527322bc3a32b732103737ba102837b9b9b4b136329760611b60448201526064016109ac565b6115396009848154811061147157611471614542565b9060005260206000209060020201600101858154811061149357611493614542565b906000526020600020906007020160010154600985815481106114b8576114b8614542565b906000526020600020906002020160010186815481106114da576114da614542565b906000526020600020906007020160030154836009878154811061150057611500614542565b9060005260206000209060020201600101888154811061152257611522614542565b9060005260206000209060070201600601546130f3565b6115855760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820616c6c6f77616e6365206c6566742e00000000000060448201526064016109ac565b60006116266009858154811061159d5761159d614542565b906000526020600020906002020160010186815481106115bf576115bf614542565b906000526020600020906007020160020154600986815481106115e4576115e4614542565b9060005260206000209060020201600101878154811061160657611606614542565b90600052602060002090600702016004015461313c90919063ffffffff16565b9050426009858154811061163c5761163c614542565b9060005260206000209060020201600101868154811061165e5761165e614542565b600091825260209091206002600790920201015561167c42826121cd565b6009858154811061168f5761168f614542565b906000526020600020906002020160010186815481106116b1576116b1614542565b90600052602060002090600702016004018190555081600985815481106116da576116da614542565b906000526020600020906002020160010186815481106116fc576116fc614542565b9060005260206000209060070201600501819055507fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe276009858154811061174557611745614542565b9060005260206000209060020201600101868154811061176757611767614542565b6000918252602090912060079091020154600980546001600160a01b03909216918790811061179857611798614542565b906000526020600020906002020160010187815481106117ba576117ba614542565b906000526020600020906007020160010154600987815481106117df576117df614542565b9060005260206000209060020201600101888154811061180157611801614542565b9060005260206000209060070201600201546009888154811061182657611826614542565b9060005260206000209060020201600101898154811061184857611848614542565b9060005260206000209060070201600501546009898154811061186d5761186d614542565b90600052602060002090600202016001018a8154811061188f5761188f614542565b90600052602060002090600702016004015460098a815481106118b4576118b4614542565b90600052602060002090600202016001018b815481106118d6576118d6614542565b600091825260209182902060066007909202010154604080516001600160a01b039098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a15050505050565b604051602001611939906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166119855760405162461bcd60e51b81526004016109ac90614609565b50600255565b60405160200161199a906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166119e65760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160b01b0260ff60b01b19909216919091179055565b604051602001611a14906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611a605760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160a81b0260ff60a81b19909216919091179055565b604051602001611a8e906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611ada5760405162461bcd60e51b81526004016109ac90614609565b50600555565b600260005403611b025760405162461bcd60e51b81526004016109ac90614632565b6002600055604051611b16906020016145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611b625760405162461bcd60e51b81526004016109ac90614609565b6040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015611b98573d6000803e3d6000fd5b505060016000555050565b604051602001611bb2906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611bfe5760405162461bcd60e51b81526004016109ac90614609565b5060088054911515600160a01b0260ff60a01b19909216919091179055565b604051602001611c2c906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611c785760405162461bcd60e51b81526004016109ac90614609565b611c828385612226565b611cc35760405162461bcd60e51b81526020600482015260126024820152712737ba3434b7339030bb30b4b630b136329760711b60448201526064016109ac565b6111e5848484613148565b600260005403611cf05760405162461bcd60e51b81526004016109ac90614632565b6002600055604051634558454360e01b602082015260240160408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611d545760405162461bcd60e51b81526004016109ac90614609565b611d5c6121e0565b6000611d67876134a0565b60208101518151604083015160608401519394509192909190818c10801590611d905750808c11155b611dd15760405162461bcd60e51b815260206004820152601260248201527156616c7565206e6f7420696e2072616e676560701b60448201526064016109ac565b611ddc8c858a61357d565b611e1b5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41025b2bcb99760811b60448201526064016109ac565b611e2a8c85858c8e8d8d6135b2565b5050600160005550505050505050505050565b60008060405180602001604052806009600b6000876001600160a01b03166001600160a01b031681526020019081526020016000205481548110611e8357611e83614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015611f2f5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101611eb4565b50505091525051519392505050565b604051602001611f4d906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611f995760405162461bcd60e51b81526004016109ac90614609565b610daa83836137b0565b604051602001611fb2906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff16611ffe5760405162461bcd60e51b81526004016109ac90614609565b50600655565b6002600054036120265760405162461bcd60e51b81526004016109ac90614632565b60026000556120336121e0565b61203f83838333613808565b5050600160005550565b612051612fdf565b6001600160a01b0381166120b65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ac565b6112de8161303f565b6040516020016120ce906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff1661211a5760405162461bcd60e51b81526004016109ac90614609565b50600d55565b6121286139ff565b604051602001612137906145f8565b60408051601f1981840301815291815281516020928301206000818152600a845282812033825290935291205460ff166121835760405162461bcd60e51b81526004016109ac90614609565b6112de613a48565b600081608001514211156121c5576121bf60646121b984606001518560200151613a8190919063ffffffff16565b90613a8d565b92915050565b506000919050565b60006121d9828461456e565b9392505050565b600c5460ff16156110435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109ac565b600060016004546122379190614586565b8211156122565760405162461bcd60e51b81526004016109ac9061459d565b60408051602080820183526001600160a01b0386166000908152600b9091529182205460098054839290811061228e5761228e614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b8282101561233a5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c083015290835290920191016122bf565b50505091525080515190915015801590612355575080515183105b156123645760019150506121bf565b5060009392505050565b336000908152600b60205260409020548061239b5760405162461bcd60e51b81526004016109ac906146f3565b60016004546123aa9190614586565b8211156123c95760405162461bcd60e51b81526004016109ac9061459d565b6000600982815481106123de576123de614542565b9060005260206000209060020201600101838154811061240057612400614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506124865760405162461bcd60e51b81526004016109ac906145ca565b80608001514210156124cd5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0ba3ab932b2103cb2ba1760811b60448201526064016109ac565b60006124db6114078361218b565b9050600081116125205760405162461bcd60e51b815260206004820152601060248201526f21b630b4b6903737ba103932b0b23c9760811b60448201526064016109ac565b602082015160009061253290836121cd565b90506007548110156125865760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d000000000060448201526064016109ac565b8047116125a55760405162461bcd60e51b81526004016109ac9061472a565b600984815481106125b8576125b8614542565b906000526020600020906002020160010185815481106125da576125da614542565b60009182526020822060079091020180546001600160a01b0319168155600181018290556002810182905560038101829055600481018290556005810182905560060155600980548590811061263257612632614542565b906000526020600020906002020160010160016009868154811061265857612658614542565b9060005260206000209060020201600101805490506126779190614586565b8154811061268757612687614542565b9060005260206000209060070201600985815481106126a8576126a8614542565b906000526020600020906002020160010186815481106126ca576126ca614542565b60009182526020909120825460079092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004808301549082015560058083015490820155600691820154910155600980548590811061274857612748614542565b906000526020600020906002020160010180548061276857612768614757565b60008281526020812060076000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006018190559155604051339183156108fc02918491818181858888f193505050501580156127e1573d6000803e3d6000fd5b506040805182815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a25050505050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f5a06360d65acf95e98445dc834f205063424c636e65418d928cdfabc33a953999190a35050565b336000908152600b6020526040902054806128ab5760405162461bcd60e51b81526004016109ac906146f3565b600854600160a81b900460ff166129045760405162461bcd60e51b815260206004820181905260248201527f5061727469616c207769746864726177206973206e6f7420656e61626c65642e60448201526064016109ac565b60016004546129139190614586565b8211156129325760405162461bcd60e51b81526004016109ac9061459d565b60006009828154811061294757612947614542565b9060005260206000209060020201600101838154811061296957612969614542565b60009182526020918290206040805160e081018252600790930290910180546001600160a01b0316835260018101549383018490526002810154918301919091526003810154606083015260048101546080830152600581015460a08301526006015460c082015291506129ef5760405162461bcd60e51b81526004016109ac906145ca565b8060800151421015612a365760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0ba3ab932b2103cb2ba1760811b60448201526064016109ac565b6000612a446114078361218b565b905060008111612a895760405162461bcd60e51b815260206004820152601060248201526f21b630b4b6903737ba103932b0b23c9760811b60448201526064016109ac565b6007548190811015612add5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e74206973206c657373207468616e206d696e696d756d000000000060448201526064016109ac565b804711612afc5760405162461bcd60e51b81526004016109ac9061472a565b612bc360098581548110612b1257612b12614542565b90600052602060002090600202016001018681548110612b3457612b34614542565b90600052602060002090600702016001015460098681548110612b5957612b59614542565b90600052602060002090600202016001018781548110612b7b57612b7b614542565b9060005260206000209060070201600301548460098881548110612ba157612ba1614542565b9060005260206000209060020201600101898154811061152257611522614542565b15612fb4576000612c4960098681548110612be057612be0614542565b90600052602060002090600202016001018781548110612c0257612c02614542565b90600052602060002090600702016002015460098781548110612c2757612c27614542565b9060005260206000209060020201600101888154811061160657611606614542565b90504260098681548110612c5f57612c5f614542565b90600052602060002090600202016001018781548110612c8157612c81614542565b6000918252602090912060026007909202010155612c9f42826121cd565b60098681548110612cb257612cb2614542565b90600052602060002090600202016001018781548110612cd457612cd4614542565b906000526020600020906007020160040181905550600060098681548110612cfe57612cfe614542565b90600052602060002090600202016001018781548110612d2057612d20614542565b60009182526020822060056007909202010191909155604051339184156108fc02918591818181858888f19350505050158015612d61573d6000803e3d6000fd5b506040805183815242602082015233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a27fd0dbdf5a9c6f6230b05ec9279bf9c69ad874fceb6c427e3a79ad9d08951abe2760098681548110612dd057612dd0614542565b90600052602060002090600202016001018781548110612df257612df2614542565b6000918252602090912060079091020154600980546001600160a01b039092169188908110612e2357612e23614542565b90600052602060002090600202016001018881548110612e4557612e45614542565b90600052602060002090600702016001015460098881548110612e6a57612e6a614542565b90600052602060002090600202016001018981548110612e8c57612e8c614542565b90600052602060002090600702016002015460098981548110612eb157612eb1614542565b90600052602060002090600202016001018a81548110612ed357612ed3614542565b90600052602060002090600702016005015460098a81548110612ef857612ef8614542565b90600052602060002090600202016001018b81548110612f1a57612f1a614542565b90600052602060002090600702016004015460098b81548110612f3f57612f3f614542565b90600052602060002090600202016001018c81548110612f6157612f61614542565b600091825260209182902060066007909202010154604080516001600160a01b039098168852918701959095528501929092526060840152608083015260a082015260c00160405180910390a150612fd8565b6020830151612fc390836121cd565b9050600984815481106125b8576125b8614542565b5050505050565b600c546001600160a01b036101009091041633146110435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ac565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6130a16121e0565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130d63390565b6040516001600160a01b03909116815260200160405180910390a1565b600061310a60025483613a8190919063ffffffff16565b6131238461311d60646121b98a8a613a81565b906121cd565b1161313057506001613134565b5060005b949350505050565b60006121d98284614586565b6001600160a01b0382166000908152600b6020526040812054600980549192918390811061317857613178614542565b9060005260206000209060020201600101858154811061319a5761319a614542565b600091825260208083206040805160e081018252600790940290910180546001600160a01b031684526001810154928401929092526002820154908301526003810154606083015260048101546080830152600581015460a08301526006015460c0820152915061320d6114078361218b565b905060006132288284602001516121cd90919063ffffffff16565b90506009848154811061323d5761323d614542565b9060005260206000209060020201600101878154811061325f5761325f614542565b60009182526020822060079091020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006015560098054859081106132b7576132b7614542565b90600052602060002090600202016001016001600986815481106132dd576132dd614542565b9060005260206000209060020201600101805490506132fc9190614586565b8154811061330c5761330c614542565b90600052602060002090600702016009858154811061332d5761332d614542565b9060005260206000209060020201600101888154811061334f5761334f614542565b60009182526020909120825460079092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560069182015491015560098054859081106133cd576133cd614542565b90600052602060002090600202016001018054806133ed576133ed614757565b60008281526020812060076000199093019283020180546001600160a01b031916815560018101829055600281018290556003810182905560048101829055600581018290556006015590558415613497578047101561345f5760405162461bcd60e51b81526004016109ac9061472a565b6040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015613495573d6000803e3d6000fd5b505b50505050505050565b6134cb6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000828152601260205260409020546135135760405162461bcd60e51b815260206004820152600a6024820152694e6f205061636b61676560b01b60448201526064016109ac565b60008281526012602052604081208054829061353157613531614542565b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905080915050919050565b6000613594600d5483613a8190919063ffffffff16565b6135a360646121b98787613a81565b11612364575060019392505050565b6135bb84613a99565b6135fd5760405162461bcd60e51b815260206004820152601360248201527226b0bc1037b832b7103837b9b4ba34b7b7399760691b60448201526064016109ac565b6001600160a01b0384166000908152600b602052604081205490849082900361362c5761362986613bb1565b91505b600185905561363b85886121cd565b600355600980548390811061365257613652614542565b90600052602060002090600202016001016040518060e00160405280886001600160a01b031681526020018b81526020018381526020018a8152602001600354815260200185815260200186815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050856001600160a01b03167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558a84848c6003548a60405161379d96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a2505050505050505050565b6000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917f76e6093c136cd7faa5a6d92b2b633f3b4595abd4a529b7a13917398355fea6949190a35050565b6000613813846134a0565b6020810151815160408301516060840151939450919290919081891080159061383c5750808911155b6138885760405162461bcd60e51b815260206004820152601860248201527f5374616b652076616c7565206e6f7420696e2072616e6765000000000000000060448201526064016109ac565b8834146138ce5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21030b6b7bab73a1039b2b73a1760611b60448201526064016109ac565b6138d88787613c27565b15156001146139295760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c204b657973206f776e656420627920616464726573732e000060448201526064016109ac565b6001613933613d51565b10156139785760405162461bcd60e51b815260206004820152601460248201527320b2323932b9b9903430bb329037379025b2bc9760611b60448201526064016109ac565b6139848985895161357d565b6139c35760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41025b2bcb99760811b60448201526064016109ac565b600e5460ff166139dc576139d78787611045565b6139e6565b6139e68787610eb2565b6139f4898585898b51613e1a565b505050505050505050565b600c5460ff166110435760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109ac565b613a506139ff565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336130d6565b60006121d9828461476d565b60006121d9828461478c565b60008060405180602001604052806009600b6000876001600160a01b03166001600160a01b031681526020019081526020016000205481548110613adf57613adf614542565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015613b8b5760008481526020908190206040805160e0810182526007860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260048101546080840152600581015460a08401526006015460c08301529083529092019101613b10565b50505091525060045481515191925011613ba85750600092915050565b50600192915050565b60098054600190810180835560009283528291613bcd91614586565b90508260098281548110613be357613be3614542565b6000918252602080832060029290920290910180546001600160a01b0319166001600160a01b03948516179055949091168152600b90935260409092208290555090565b600e5460009061010090046001600160a01b0316613c7f5760405162461bcd60e51b815260206004820152601560248201527425b2bc9021b7b73a3930b1ba103737ba1039b2ba1760591b60448201526064016109ac565b60005b8351811015613d475760105484516001600160a01b03808616921690636352211e90879085908110613cb657613cb6614542565b60200260200101516040518263ffffffff1660e01b8152600401613cdc91815260200190565b602060405180830381865afa158015613cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1d91906147ae565b6001600160a01b031614613d355760009150506121bf565b80613d3f816146da565b915050613c82565b5060019392505050565b600e5460009061010090046001600160a01b0316613da95760405162461bcd60e51b815260206004820152601560248201527425b2bc9021b7b73a3930b1ba103737ba1039b2ba1760591b60448201526064016109ac565b6010546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1591906147cb565b905090565b6008546001600160a01b0316613e725760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67206163636f756e74206e6f74207365742e000000000000000060448201526064016109ac565b613e7b82613a99565b613ebd5760405162461bcd60e51b815260206004820152601360248201527226b0bc1037b832b7103837b9b4ba34b7b7399760691b60448201526064016109ac565b600854600160a01b900460ff1615613f0b576008546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015613f09573d6000803e3d6000fd5b505b600854600160b01b900460ff1615613f6f576008546006546001600160a01b03909116906108fc90613f45906064906121b9908a90613a81565b6040518115909202916000818181858888f19350505050158015613f6d573d6000803e3d6000fd5b505b6001600160a01b0382166000908152600b6020526040812054904290829003613f9e57613f9b84613bb1565b91505b426001819055613fae90866121cd565b6003556009805483908110613fc557613fc5614542565b90600052602060002090600202016001016040518060e00160405280866001600160a01b0316815260200189815260200183815260200188815260200160035481526020016000815260200185815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601555050836001600160a01b03167fc16be9a586414a157dd46b4d023aa9997a025dd1cbbaa67ac0c1b8273a5eaf558884848a6003548960405161411196959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a250505050505050565b6001600160a01b03811681146112de57600080fd5b60006020828403121561414957600080fd5b81356121d981614122565b60006020808352604080840185518384870152818151808452606093508388019150858301925060005b818110156141dd57835180516001600160a01b031684528781015188850152868101518785015285810151868501526080808201519085015260a0808201519085015260c090810151908401529286019260e09092019160010161417e565b509098975050505050505050565b60008060008060006080868803121561420357600080fd5b853561420e81614122565b9450602086013561421e81614122565b935060408601359250606086013567ffffffffffffffff8082111561424257600080fd5b818801915088601f83011261425657600080fd5b81358181111561426557600080fd5b89602082850101111561427757600080fd5b9699959850939650602001949392505050565b6000806040838503121561429d57600080fd5b82356142a881614122565b946020939093013593505050565b6000602082840312156142c857600080fd5b5035919050565b600080604083850312156142e257600080fd5b8235915060208301356142f481614122565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261432657600080fd5b8135602067ffffffffffffffff80831115614343576143436142ff565b8260051b604051601f19603f83011681018181108482111715614368576143686142ff565b60405293845285810183019383810192508785111561438657600080fd5b83870191505b848210156143a55781358352918301919083019061438c565b979650505050505050565b600080604083850312156143c357600080fd5b823567ffffffffffffffff8111156143da57600080fd5b6143e685828601614315565b92505060208301356142f481614122565b80151581146112de57600080fd5b60006020828403121561441757600080fd5b81356121d9816143f7565b600080600080600060a0868803121561443a57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060006060848603121561447257600080fd5b83359250602084013561448481614122565b91506040840135614494816143f7565b809150509250925092565b60008060008060008060c087890312156144b857600080fd5b86359550602087013594506040870135935060608701356144d881614122565b9598949750929560808101359460a0909101359350915050565b60008060006060848603121561450757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561452c57600080fd5b61453886828701614315565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561458157614581614558565b500190565b60008282101561459857614598614558565b500390565b60208082526013908201527224b73232bc1037baba1037b3103930b733b29760691b604082015260600190565b60208082526014908201527327379030b1ba34bb32903837b9b4ba34b7b7399760611b604082015260600190565b6420a226a4a760d91b815260050190565b6020808252600f908201526e2737ba1030baba3437b934bd32b21760891b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604080825283519082018190526000906020906060840190828701845b828110156146a257815184529284019290840190600101614686565b5050506001600160a01b039490941692019190915250919050565b6000602082840312156146cf57600080fd5b81516121d9816143f7565b6000600182016146ec576146ec614558565b5060010190565b60208082526017908201527f41646472657373206e6f7420726567697374657265642e000000000000000000604082015260600190565b6020808252601390820152722737ba1032b737bab3b4103130b630b731b29760691b604082015260600190565b634e487b7160e01b600052603160045260246000fd5b600081600019048311821515161561478757614787614558565b500290565b6000826147a957634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156147c057600080fd5b81516121d981614122565b6000602082840312156147dd57600080fd5b505191905056fea264697066735822122068b4daf2cedb404e5d378eaff6f1b76bfa13c3a4243750ed77c19be18837578a64736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13

-----Decoded View---------------
Arg [0] : _newAdmin (address): 0x5C76Eb054B1b06A725be1715fbED9560cE5DbA13

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c76eb054b1b06a725be1715fbed9560ce5dba13


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.