Contract 0x28Caa843cB577d892A8B6eC3F24Aa682ED22Be68

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xab9393146ec5f231b06e918880cdd64bbe33b4deb364c73d6d516222823f0308Withdraw287098632022-05-24 11:29:241 hr 20 mins ago0xd0234aaff9a01c103f82924e522b8560b92dacd3 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005408453691 33.077002105
0x9c00c8795f08ff9b77139f96c68aecdf2b993d18b12ba34e4587b0db609e5350Deposit From287096822022-05-24 11:23:101 hr 26 mins ago0xcaa67cb622475c328be6a77e034096c6a67c3cfb IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607907441 33.076998731
0xc65abaa320cf43b22f9e595328c14ec14e14bda17130018112e3d3158301e7eaClaim287096502022-05-24 11:22:061 hr 27 mins ago0xcaa67cb622475c328be6a77e034096c6a67c3cfb IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909176 33.076998731
0x3f61879aa1f5851759338459dd0580f06d49708aa93d166e847902f381a521bdClaim287096332022-05-24 11:21:321 hr 28 mins ago0xcaa67cb622475c328be6a77e034096c6a67c3cfb IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909183 33.076998792
0xd9e9cd84706899c93790680a46327d7a8e3c215f1b0f7d0397cad716cf493cd6Deposit From287092132022-05-24 11:06:501 hr 43 mins ago0x06410ffda716b7c0951823f4194db32ae55d631e IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607113587 33.076998692
0x09c33b48dd76eb5b85e70a17225cf6ddeedc324e627d318d899a18a39b9512f2Deposit From287063142022-05-24 9:27:043 hrs 22 mins ago0xe56815ddddfcc733b83cf4b9fd156b50cc4dd43d IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005614745959 33.1196784
0xc6b90fb7d2c074c3e09ccac0ceec7e6bd413c3c56bd5753dc0110e7b35161868Deposit From287062562022-05-24 9:25:023 hrs 25 mins ago0x5b2daa876cfbb4fe17a7b06795730423aa4717ca IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005614745961 33.119678411
0xb4faded08944560da14eb07b38c8a7f14fbc3db7a08739373c08cfa05a27bc60Deposit From287062352022-05-24 9:24:163 hrs 25 mins ago0x870656e3f0e07545c398af6c7816cecc7c376c93 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005614745965 33.119678433
0xaef15990289a3e7bea73b94fd4cd6abae95c37a4b660f981c36ad9b2ac74804fClaim287062272022-05-24 9:24:003 hrs 26 mins ago0x5b2daa876cfbb4fe17a7b06795730423aa4717ca IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004017085795 33.119678422
0xbead6bab31287cb4e03b8e203f1f54d296bf75c00037731a0a8e608756bbbb08Claim287061732022-05-24 9:22:083 hrs 27 mins ago0x870656e3f0e07545c398af6c7816cecc7c376c93 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004017085834 33.119678739
0x6828e35f0cb62814432cf1c16b8d9816eb410b2113279515346c0d09dfaee794Claim287058832022-05-24 9:12:093 hrs 37 mins ago0xe56815ddddfcc733b83cf4b9fd156b50cc4dd43d IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004059767541 33.47157673
0xcbadbf9ed214e9db72388965a5d716e29ecc976cdcc0f181b3d206ae86fdf275Deposit From287055792022-05-24 9:01:413 hrs 48 mins ago0x5f11864bb09acb465489cfc35ffa880edb40a882 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607509709 33.076993964
0x85d51fb64cf4c60e10ae3bf754ed1fd14ab77471d57fe0f44abf5f0c1bdf5709Claim287055612022-05-24 9:01:053 hrs 48 mins ago0x5f11864bb09acb465489cfc35ffa880edb40a882 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011908599 33.076993977
0x2aa290694dc63d40b97c6078aa2e46ee7186def6fce865824f210bde303411c3Deposit From287043202022-05-24 8:18:274 hrs 31 mins ago0x8f11902d6ddd254a1034ac2ff64a42d00a8226b0 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607509914 33.076995172
0xda504a7dbd8523a50c7af1b50e2767be08d5fc4890fa955e04b672dac16a5c53Claim287042862022-05-24 8:17:154 hrs 32 mins ago0x8f11902d6ddd254a1034ac2ff64a42d00a8226b0 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011908974 33.076997068
0x7907610194452147fba30946fcfcba4a07309ee38e5b29bfcbba911497a4d8aaClaim287014352022-05-24 6:36:586 hrs 13 mins ago0xfc5723d6bc8da7cadde437fe7cea54219ce97a67 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909305 33.0769998
0xd4ff05d165052a4411c813bc726e2af42fb36c2e959f6ff1e73f435186e7eec3Deposit From287004712022-05-24 6:03:496 hrs 46 mins ago0x1d1b104cd940f16830b180eef2d207a18a897f12 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607510714 33.07699989
0xbe5672a5211e644e5f1717aced58dcbd597ec3ae81f34fc385837a1ea6a7a6f2Claim287004632022-05-24 6:03:336 hrs 46 mins ago0x26e6be5815b428cb287ae7edb1456c0492bf2b7f IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909318 33.076999905
0x662c19c92153700a2d27011fff5dc6686a4abdb98258eb01603df675ea8fb87fClaim287004022022-05-24 6:01:276 hrs 48 mins ago0x1d1b104cd940f16830b180eef2d207a18a897f12 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909332 33.077000019
0x90949f5ea4c30c89bac66eb4958e65907238f172d3193adb2028973cad8e2c05Deposit From286996652022-05-24 5:34:017 hrs 16 mins ago0x2a960a9b4fabaca80b9624f7d18e33a9276cedb5 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607907657 33.077000004
0x8d14613ff9aa8c70b73c3bfc17b5ec16399607782b48181ca63f7302f4b79433Claim286996232022-05-24 5:32:337 hrs 17 mins ago0x2a960a9b4fabaca80b9624f7d18e33a9276cedb5 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.00401190933 33.077000001
0x8041c92ceb8c70561554c9d5aa5695fd209b31e205c4b51064e3923df6d3e77eDeposit From286996202022-05-24 5:32:277 hrs 17 mins ago0x4f51e30992b6b1260acde4e33f3ec2e97abe5f9b IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607510733 33.077000001
0xd368b84551f4c0be00e0ea1c36c88fcb5ac1129ff395828895442d4f3497ace6Deposit From286981642022-05-24 4:42:118 hrs 7 mins ago0x0d91573db8e3901f660b33149eaaa8ca91c13754 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.005607113575 33.076998625
0xdcdc4fe0f6db5619cb1a1a9c4cfd7ca38ea86db79cd060a49a0d2273a8eedc18Claim286981462022-05-24 4:41:358 hrs 8 mins ago0x0d91573db8e3901f660b33149eaaa8ca91c13754 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909163 33.076998625
0x75f8da34f1c9cdb1edd91521731c3eb4593f35721e7e0a752588b408f3b7b0d8Claim286912732022-05-24 0:30:1212 hrs 19 mins ago0x19644d7cd558dbc07b4dd96c0080692f7e86d4b8 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.004011909327 33.076999979
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x65b77FDF8b55057794a5399918ad2A55d27fa395

Contract Name:
TutellusStaking

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : TutellusStaking.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./utils/AccessControlProxyPausable.sol";
import "./interfaces/ITutellusERC20.sol";
import "./interfaces/ITutellusRewardsVault.sol";

contract TutellusStaking is AccessControlProxyPausable {

    address public token;
    address public vault;

    bool public autoreward;

    uint256 public balance;
    uint256 public minFee;
    uint256 public maxFee;
    uint256 public accRewardsPerShare;
    uint256 private _released;

    uint public lastUpdate;
    uint public feeInterval;
    uint public stakers;

    struct UserInfo {
      uint256 amount;
      uint256 rewardDebt;
      uint256 notClaimed;
      uint endInterval;
      uint256 minFee;
      uint256 maxFee;
      uint256 feeInterval;
    }

    mapping(address=>UserInfo) private _userInfo;

    event Claim(address account);
    event Deposit(address account, uint256 amount);
    event Withdraw(address account, uint256 amount, uint256 burned);
    event Rewards(address account, uint256 amount);

    event SyncBalance(address account, uint256 amount);
    event ToggleAutoreward(bool autoreward);
    event Update(uint256 balance, uint256 accRewardsPerShare, uint lastUpdate, uint stakers);
    event UpdateUserInfo(address account, uint256 amount, uint256 rewardDebt, uint256 notClaimed, uint endInterval);
    event SetFees(uint256 minFee, uint256 maxFee);
    event SetFeeInterval(uint feeInterval);
    event Migrate(address from, address to, address account, uint256 amount, bytes response);

    function _update() internal {
      if (block.number <= lastUpdate) {
        return;
      }
      ITutellusRewardsVault rewardsInterface = ITutellusRewardsVault(vault);
      uint256 released = rewardsInterface.releasedId(address(this)) - _released;
      _released += released;
      if(balance > 0) {
        accRewardsPerShare += (released * 1e18 / balance);
      }
      lastUpdate = block.number;
    }

    // Sets maximum and minimum fees
    function setFees(uint256 minFee_, uint256 maxFee_) public onlyRole(DEFAULT_ADMIN_ROLE) {
      require(minFee_ <= maxFee_, "TutellusStaking: mininum fee must be greater or equal than maximum fee");
      require(minFee_ <= 1e20 && maxFee_ <= 1e20, "TutellusStaking: fees must be less than 100e18");
      minFee = minFee_;
      maxFee = maxFee_;
      emit SetFees(minFee, maxFee);
    }

    // Sets fee interval (blocks) for staking
    function setFeeInterval(uint feeInterval_) public onlyRole(DEFAULT_ADMIN_ROLE) {
      feeInterval = feeInterval_;
      emit SetFeeInterval(feeInterval);
    }

    // Updates rewards for an account
    function _updateRewards(address account) internal {
      UserInfo storage user = _userInfo[account];
      uint256 diff = accRewardsPerShare - user.rewardDebt;
      user.notClaimed = diff * user.amount / 1e18;
      user.rewardDebt = accRewardsPerShare;
    }

    // Deposits tokens for staking
    function depositFrom(address account, uint256 amount) public whenNotPaused {
      require(amount > 0, "TutellusStaking: amount must be over zero");

      UserInfo storage user = _userInfo[account];

      _update();
      _updateRewards(account);

      if(user.amount == 0) {
        stakers += 1;
      }

      user.endInterval = block.number + feeInterval;
      user.minFee = minFee;
      user.maxFee = maxFee;
      user.feeInterval = feeInterval;
      user.amount += amount;
      balance += amount;

      ITutellusERC20 tokenInterface = ITutellusERC20(token);

      require(tokenInterface.balanceOf(account) >= amount, "TutellusStaking: user has not enough balance");
      require(tokenInterface.allowance(account, address(this)) >= amount, "TutellusStaking: amount exceeds allowance");

      if(autoreward) {
        _reward(account);
      }

      require(tokenInterface.transferFrom(account, address(this), amount), "TutellusStaking: deposit transfer failed");

      emit Update(balance, accRewardsPerShare, lastUpdate, stakers);
      emit UpdateUserInfo(account, user.amount, user.rewardDebt, user.notClaimed, user.endInterval);
      emit Deposit(account, amount);
    }

    // Withdraws tokens from staking
    function withdraw(uint256 amount) public whenNotPaused returns (uint256) {
      require(amount > 0, "TutellusStaking: amount must be over zero");

      address account = msg.sender;
      UserInfo storage user = _userInfo[account];

      require(amount <= user.amount, "TutellusStaking: user has not enough staking balance");

      _update();
      _updateRewards(account);

      user.rewardDebt = accRewardsPerShare;
      user.amount -= amount;
      balance -= amount;

      if(user.amount == 0) {
        stakers -= 1;
      }

      ITutellusERC20 tokenInterface = ITutellusERC20(token);

      uint256 burned = amount * getFee(account) / 1e20;
      amount -= burned;

      if(autoreward) {
        _reward(account);
      }
      if(burned > 0){
        tokenInterface.burn(burned);
      }
      require(tokenInterface.transfer(account, amount), "TutellusStaking: withdraw transfer failed");

      emit Update(balance, accRewardsPerShare, lastUpdate, stakers);
      emit UpdateUserInfo(account, user.amount, user.rewardDebt, user.notClaimed, user.endInterval);
      emit Withdraw(account, amount, burned);
      return amount;
    }

    // Claims rewards
    function claim() public whenNotPaused {
      address account = msg.sender;
      UserInfo storage user = _userInfo[account];

      _update();
      _updateRewards(account);

      require(user.notClaimed > 0, "TutellusStaking: nothing to claim");

      _reward(account);

      emit Update(balance, accRewardsPerShare, lastUpdate, stakers);
      emit UpdateUserInfo(account, user.amount, user.rewardDebt, user.notClaimed, user.endInterval);
      emit Claim(account);
    }

    // Toggles autoreward
    function toggleAutoreward() public onlyRole(DEFAULT_ADMIN_ROLE) {
      autoreward = !autoreward;
      emit ToggleAutoreward(autoreward);
    }

    function _reward(address account) internal {
      ITutellusRewardsVault rewardsInterface = ITutellusRewardsVault(vault);
      uint256 amount = _userInfo[account].notClaimed;
      if(amount > 0) {
        _userInfo[account].notClaimed = 0;
        rewardsInterface.distributeTokens(account, amount);
        emit Rewards(account, amount);
      }
    }

    // Gets current fee for a user
    function getFee(address account) public view returns(uint256) {
      UserInfo memory user = _userInfo[account];
      uint256 fee = block.number < user.endInterval ? user.feeInterval > 0 ? user.maxFee * (user.endInterval - block.number) / user.feeInterval : user.minFee : user.minFee;
      return fee > user.minFee ? fee : user.minFee;
    }

    // Gets blocks until endInverval
    function getBlocksLeft(address account) public view returns (uint) {
      if(block.number > _userInfo[account].endInterval) {
        return 0;
      } else {
        return _userInfo[account].endInterval - block.number;
      }
    }

    // Gets user pending rewards
    function pendingRewards(address user_) public view returns(uint256) {
        UserInfo memory user = _userInfo[user_];
        uint256 rewards = user.notClaimed;
        if(balance > 0){
          ITutellusRewardsVault rewardsInterface = ITutellusRewardsVault(vault);
          uint256 released = rewardsInterface.releasedId(address(this)) - _released;
          uint256 total = (released * 1e18 / balance);
          rewards += (accRewardsPerShare - user.rewardDebt + total) * user.amount / 1e18;
        }
        return rewards;
    }

    constructor (address token_, address rolemanager, address vault_, uint256 minFee_, uint256 maxFee_, uint feeInterval_) {
      __TutellusStaking_init(token_, rolemanager, vault_, minFee_, maxFee_, feeInterval_);
    }

    function __TutellusStaking_init(address token_, address rolemanager, address vault_, uint256 minFee_, uint256 maxFee_, uint feeInterval_) internal initializer {
      __AccessControlProxyPausable_init(rolemanager);
      __TutellusStaking_init_unchained(token_, vault_, minFee_, maxFee_, feeInterval_);
    }

    function __TutellusStaking_init_unchained(address token_, address vault_, uint256 minFee_, uint256 maxFee_, uint feeInterval_) internal initializer {
      token = token_;
      vault = vault_;
      setFees(minFee_, maxFee_);
      setFeeInterval(feeInterval_);
      autoreward = true;
      lastUpdate = block.number;
    }

        // Gets token gap
    function getTokenGap() public view returns (uint256) {
      ITutellusERC20 tokenInterface = ITutellusERC20(token);
      uint256 tokenBalance = tokenInterface.balanceOf(address(this));
      return tokenBalance - balance;
    }

        // Synchronizes balance, transfering the gap to an external account
    function syncBalance(address account) public onlyRole(DEFAULT_ADMIN_ROLE) {
      ITutellusERC20 tokenInterface = ITutellusERC20(token);
      uint256 gap = getTokenGap();
      require(gap > 0, "TutellusStaking: there is no gap");
      tokenInterface.transfer(account, gap);
      emit SyncBalance(account, gap);
    }

        // Gets user staking balance
    function getUserBalance(address user_) public view returns(uint256){
      UserInfo memory user = _userInfo[user_];
      return user.amount;
    }

    function migrate(address to) public returns (bytes memory){
      address account = msg.sender;
      uint256 amount = withdraw(_userInfo[account].amount);
      (bool success, bytes memory response) = to.call(
            abi.encodeWithSignature("depositFrom(address,uint256)", account, amount)
        );
      require(success, 'TutellusStaking: migration failed');
      emit Migrate(address(this), to, account, amount, response);
      return response;
    }
}

File 2 of 9 : AccessControlProxyPausable.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";

abstract contract AccessControlProxyPausable is PausableUpgradeable {

    address private _manager;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    modifier onlyRole(bytes32 role) {
        address account = msg.sender;
        require(hasRole(role, account), string(
                    abi.encodePacked(
                        "AccessControlProxyPausable: account ",
                        StringsUpgradeable.toHexString(uint160(account), 20),
                        " is missing role ",
                        StringsUpgradeable.toHexString(uint256(role), 32)
                    )
                ));
        _;
    }

    function hasRole(bytes32 role, address account) public view returns (bool) {
        IAccessControlUpgradeable manager = IAccessControlUpgradeable(_manager);
        return manager.hasRole(role, account);
    }

    function __AccessControlProxyPausable_init(address manager) internal initializer {
        __Pausable_init();
        __AccessControlProxyPausable_init_unchained(manager);
    }

    function __AccessControlProxyPausable_init_unchained(address manager) internal initializer {
        _manager = manager;
    }

    function pause() public onlyRole(PAUSER_ROLE){
        _pause();
    }
    
    function unpause() public onlyRole(PAUSER_ROLE){
        _unpause();
    }

    function updateManager(address manager) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _manager = manager;
    }
}

File 3 of 9 : ITutellusERC20.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface ITutellusERC20 {

    /**
     * @dev Returns the amount of tokens burned.
     */
    function burned() external view returns (uint256);
    
    /**
     * @dev Mints `amount` tokens to `account`.
     */
    function mint(address account, uint256 amount) external;

    /**
     * @dev Burns `amount` tokens.
     */
    function burn(uint256 amount) external;

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 9 : ITutellusRewardsVault.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface ITutellusRewardsVault {

    function add(address account, uint256[] memory allocation) external;

    function updateAllocation(uint256[] memory allocation) external;

    function released() external view returns (uint256);

    function availableId(address account) external view returns (uint256);

    function releasedRange(uint from, uint to) external view returns (uint256);

    function releasedId(address account) external view returns (uint256);

    function distributeTokens(address account, uint256 amount) external;

    function info(address account) external view;
}

File 5 of 9 : IAccessControlUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControlUpgradeable {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 6 of 9 : PausableUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.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 PausableUpgradeable is Initializable, ContextUpgradeable {
    /**
     * @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.
     */
    function __Pausable_init() internal initializer {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal initializer {
        _paused = false;
    }

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

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

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        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());
    }
    uint256[49] private __gap;
}

File 7 of 9 : StringsUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library StringsUpgradeable {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 8 of 9 : ContextUpgradeable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

File 9 of 9 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"rolemanager","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"uint256","name":"minFee_","type":"uint256"},{"internalType":"uint256","name":"maxFee_","type":"uint256"},{"internalType":"uint256","name":"feeInterval_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"response","type":"bytes"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Rewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeInterval","type":"uint256"}],"name":"SetFeeInterval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxFee","type":"uint256"}],"name":"SetFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SyncBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"autoreward","type":"bool"}],"name":"ToggleAutoreward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardsPerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakers","type":"uint256"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"notClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endInterval","type":"uint256"}],"name":"UpdateUserInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accRewardsPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoreward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getBlocksLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenGap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getUserBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"migrate","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"user_","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeInterval_","type":"uint256"}],"name":"setFeeInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minFee_","type":"uint256"},{"internalType":"uint256","name":"maxFee_","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"syncBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleAutoreward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"updateManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200503e3803806200503e833981810160405281019062000037919062000efa565b6200004d8686868686866200005960201b60201c565b50505050505062001696565b600060019054906101000a900460ff168062000080575060008054906101000a900460ff16155b620000c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000b99062001228565b60405180910390fd5b60008060019054906101000a900460ff16159050801562000113576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b62000124866200016460201b60201c565b6200013987868686866200026560201b60201c565b80156200015b5760008060016101000a81548160ff0219169083151502179055505b50505050505050565b600060019054906101000a900460ff16806200018b575060008054906101000a900460ff16155b620001cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c49062001228565b60405180910390fd5b60008060019054906101000a900460ff1615905080156200021e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6200022e6200041060201b60201c565b6200023f826200050f60201b60201c565b8015620002615760008060016101000a81548160ff0219169083151502179055505b5050565b600060019054906101000a900460ff16806200028c575060008054906101000a900460ff16155b620002ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c59062001228565b60405180910390fd5b60008060019054906101000a900460ff1615905080156200031f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b85606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003b384846200063060201b60201c565b620003c482620007f960201b60201c565b6001606760146101000a81548160ff02191690831515021790555043606d819055508015620004085760008060016101000a81548160ff0219169083151502179055505b505050505050565b600060019054906101000a900460ff168062000437575060008054906101000a900460ff16155b62000479576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004709062001228565b60405180910390fd5b60008060019054906101000a900460ff161590508015620004ca576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b620004da6200090b60201b60201c565b620004ea620009ea60201b60201c565b80156200050c5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168062000536575060008054906101000a900460ff16155b62000578576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056f9062001228565b60405180910390fd5b60008060019054906101000a900460ff161590508015620005c9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b81606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156200062c5760008060016101000a81548160ff0219169083151502179055505b5050565b6000801b60003390506200064b828262000ae460201b60201c565b620006798273ffffffffffffffffffffffffffffffffffffffff16601462000ba660201b620020e81760201c565b620006948460001c602062000ba660201b620020e81760201c565b604051602001620006a792919062001151565b60405160208183030381529060405290620006fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f19190620011c0565b60405180910390fd5b508284111562000741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007389062001206565b60405180910390fd5b68056bc75e2d63100000841115801562000764575068056bc75e2d631000008311155b620007a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079d906200124a565b60405180910390fd5b8360698190555082606a819055507f3be6e637f54f081a2dd12982cfd58481304fc98b604b18fa8ed4aa4e4a9d1532606954606a54604051620007eb92919062001289565b60405180910390a150505050565b6000801b600033905062000814828262000ae460201b60201c565b620008428273ffffffffffffffffffffffffffffffffffffffff16601462000ba660201b620020e81760201c565b6200085d8460001c602062000ba660201b620020e81760201c565b6040516020016200087092919062001151565b60405160208183030381529060405290620008c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ba9190620011c0565b60405180910390fd5b5082606e819055507f3c4855c88fd8a474116d68903d5709038a6f57f15646d976d5abdbbc5818ca0d606e54604051620008fe91906200126c565b60405180910390a1505050565b600060019054906101000a900460ff168062000932575060008054906101000a900460ff16155b62000974576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096b9062001228565b60405180910390fd5b60008060019054906101000a900460ff161590508015620009c5576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b8015620009e75760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168062000a11575060008054906101000a900460ff16155b62000a53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a4a9062001228565b60405180910390fd5b60008060019054906101000a900460ff16159050801562000aa4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000603360006101000a81548160ff021916908315150217905550801562000ae15760008060016101000a81548160ff0219169083151502179055505b50565b600080606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166391d1485485856040518363ffffffff1660e01b815260040162000b4992919062001193565b60206040518083038186803b15801562000b6257600080fd5b505afa15801562000b77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b9d919062000f90565b91505092915050565b60606000600283600262000bbb91906200133a565b62000bc79190620012dd565b67ffffffffffffffff81111562000c07577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562000c3a5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000c99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600262000d6691906200133a565b62000d729190620012dd565b90505b600181111562000e64577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062000ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811062000e1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508062000e5c9062001425565b905062000d75565b506000841462000eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ea290620011e4565b60405180910390fd5b8091505092915050565b60008151905062000ec68162001648565b92915050565b60008151905062000edd8162001662565b92915050565b60008151905062000ef4816200167c565b92915050565b60008060008060008060c0878903121562000f1457600080fd5b600062000f2489828a0162000eb5565b965050602062000f3789828a0162000eb5565b955050604062000f4a89828a0162000eb5565b945050606062000f5d89828a0162000ee3565b935050608062000f7089828a0162000ee3565b92505060a062000f8389828a0162000ee3565b9150509295509295509295565b60006020828403121562000fa357600080fd5b600062000fb38482850162000ecc565b91505092915050565b62000fc7816200139b565b82525050565b62000fd881620013bb565b82525050565b600062000feb82620012b6565b62000ff78185620012c1565b935062001009818560208601620013ef565b620010148162001483565b840191505092915050565b60006200102c82620012b6565b620010388185620012d2565b93506200104a818560208601620013ef565b80840191505092915050565b600062001065602083620012c1565b9150620010728262001494565b602082019050919050565b60006200108c602483620012d2565b91506200109982620014bd565b602482019050919050565b6000620010b3604683620012c1565b9150620010c0826200150c565b606082019050919050565b6000620010da602e83620012c1565b9150620010e78262001581565b604082019050919050565b600062001101602e83620012c1565b91506200110e82620015d0565b604082019050919050565b600062001128601183620012d2565b915062001135826200161f565b601182019050919050565b6200114b81620013e5565b82525050565b60006200115e826200107d565b91506200116c82856200101f565b9150620011798262001119565b91506200118782846200101f565b91508190509392505050565b6000604082019050620011aa600083018562000fcd565b620011b9602083018462000fbc565b9392505050565b60006020820190508181036000830152620011dc818462000fde565b905092915050565b60006020820190508181036000830152620011ff8162001056565b9050919050565b600060208201905081810360008301526200122181620010a4565b9050919050565b600060208201905081810360008301526200124381620010cb565b9050919050565b600060208201905081810360008301526200126581620010f2565b9050919050565b600060208201905062001283600083018462001140565b92915050565b6000604082019050620012a0600083018562001140565b620012af602083018462001140565b9392505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000620012ea82620013e5565b9150620012f783620013e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200132f576200132e62001454565b5b828201905092915050565b60006200134782620013e5565b91506200135483620013e5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001390576200138f62001454565b5b828202905092915050565b6000620013a882620013c5565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200140f578082015181840152602081019050620013f2565b838111156200141f576000848401525b50505050565b60006200143282620013e5565b9150600082141562001449576200144862001454565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416363657373436f6e74726f6c50726f78795061757361626c653a206163636f60008201527f756e742000000000000000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a206d696e696e756d20666565206d757360008201527f742062652067726561746572206f7220657175616c207468616e206d6178696d60208201527f756d206665650000000000000000000000000000000000000000000000000000604082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a2066656573206d757374206265206c6560008201527f7373207468616e20313030653138000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b62001653816200139b565b81146200165f57600080fd5b50565b6200166d81620013af565b81146200167957600080fd5b50565b6200168781620013e5565b81146200169357600080fd5b50565b61399880620016a66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637cbaccd511610104578063b88c9148116100a2578063e63ab1e911610071578063e63ab1e91461050f578063fbfa77cf1461052d578063fc0c546a1461054b578063fed1252a14610569576101da565b8063b88c914814610475578063c0463711146104a5578063ce5494bb146104c3578063e0adaca2146104f3576101da565b80638d048056116100de5780638d048056146103d957806391d1485414610409578063a217fddf14610439578063b69ef8a814610457576101da565b80637cbaccd51461039557806381fb5cfb146103b35780638456cb59146103cf576101da565b8063477348921161017c5780635a3c978b1161014b5780635a3c978b146103315780635c975abb1461034f57806366b0bebc1461036d5780636ca569c11461038b576101da565b806347734892146102bd5780634e71d92d146102ed5780635129338c146102f757806358aba00f14610315576101da565b806324ec7590116101b857806324ec7590146102355780632e1a7d4d1461025357806331d7a262146102835780633f4ba83a146102b3576101da565b806301f59d16146101df5780630b78f9c0146101fd57806315cc36f214610219575b600080fd5b6101e7610587565b6040516101f491906131a4565b60405180910390f35b610217600480360381019061021291906129ec565b61058d565b005b610233600480360381019061022e91906128f9565b610726565b005b61023d610c17565b60405161024a91906131a4565b60405180910390f35b61026d6004803603810190610268919061299a565b610c1d565b60405161027a91906131a4565b60405180910390f35b61029d600480360381019061029891906128d0565b61104d565b6040516102aa91906131a4565b60405180910390f35b6102bb611236565b005b6102d760048036038101906102d291906128d0565b611303565b6040516102e491906131a4565b60405180910390f35b6102f56113a5565b005b6102ff611565565b60405161030c91906131a4565b60405180910390f35b61032f600480360381019061032a91906128d0565b61162f565b005b610339611719565b6040516103469190612f41565b60405180910390f35b61035761172c565b6040516103649190612f41565b60405180910390f35b610375611743565b60405161038291906131a4565b60405180910390f35b610393611749565b005b61039d611861565b6040516103aa91906131a4565b60405180910390f35b6103cd60048036038101906103c8919061299a565b611867565b005b6103d7611950565b005b6103f360048036038101906103ee91906128d0565b611a1d565b60405161040091906131a4565b60405180910390f35b610423600480360381019061041e919061295e565b611ac8565b6040516104309190612f41565b60405180910390f35b610441611b84565b60405161044e9190612f5c565b60405180910390f35b61045f611b8b565b60405161046c91906131a4565b60405180910390f35b61048f600480360381019061048a91906128d0565b611b91565b60405161049c91906131a4565b60405180910390f35b6104ad611ca5565b6040516104ba91906131a4565b60405180910390f35b6104dd60048036038101906104d891906128d0565b611cab565b6040516104ea9190612fa0565b60405180910390f35b61050d600480360381019061050891906128d0565b611e8a565b005b610517612072565b6040516105249190612f5c565b60405180910390f35b610535612096565b6040516105429190612db9565b60405180910390f35b6105536120bc565b6040516105609190612db9565b60405180910390f35b6105716120e2565b60405161057e91906131a4565b60405180910390f35b606a5481565b6000801b60003390506105a08282611ac8565b6105c18273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b6105cf8460001c60206120e8565b6040516020016105e0929190612d7f565b60405160208183030381529060405290610630576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106279190612fc2565b60405180910390fd5b5082841115610674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066b90613024565b60405180910390fd5b68056bc75e2d631000008411158015610696575068056bc75e2d631000008311155b6106d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cc90613104565b60405180910390fd5b8360698190555082606a819055507f3be6e637f54f081a2dd12982cfd58481304fc98b604b18fa8ed4aa4e4a9d1532606954606a546040516107189291906131bf565b60405180910390a150505050565b61072e61172c565b1561076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076590613044565b60405180910390fd5b600081116107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a890613064565b60405180910390fd5b6000607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107fc6123e2565b6108058361251b565b60008160000154141561082d576001606f6000828254610825919061327b565b925050819055505b606e544361083b919061327b565b81600301819055506069548160040181905550606a548160050181905550606e54816006018190555081816000016000828254610878919061327b565b925050819055508160686000828254610891919061327b565b925050819055506000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016108f99190612db9565b60206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094991906129c3565b101561098a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098190613084565b60405180910390fd5b828173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e86306040518363ffffffff1660e01b81526004016109c6929190612dd4565b60206040518083038186803b1580156109de57600080fd5b505afa1580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1691906129c3565b1015610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e906130c4565b60405180910390fd5b606760149054906101000a900460ff1615610a7657610a75846125af565b5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd8530866040518463ffffffff1660e01b8152600401610ab393929190612e57565b602060405180830381600087803b158015610acd57600080fd5b505af1158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190612935565b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613124565b60405180910390fd5b7fce49b138f2621300a7043a61f472ccfd643162bdf3efb11354e22d5273b77a71606854606b54606d54606f54604051610b8194939291906131e8565b60405180910390a17fda0c5744e922c38dc93f40ffd95d1e27696bee87f5cbd024bd5df1d168caa5a8848360000154846001015485600201548660030154604051610bd0959493929190612eee565b60405180910390a17fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8484604051610c09929190612e8e565b60405180910390a150505050565b60695481565b6000610c2761172c565b15610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613044565b60405180910390fd5b60008211610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190613064565b60405180910390fd5b60003390506000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000154841115610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d30906130a4565b60405180910390fd5b610d416123e2565b610d4a8261251b565b606b54816001018190555083816000016000828254610d69919061335c565b925050819055508360686000828254610d82919061335c565b92505081905550600081600001541415610db1576001606f6000828254610da9919061335c565b925050819055505b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600068056bc75e2d63100000610ded85611b91565b87610df89190613302565b610e0291906132d1565b90508086610e10919061335c565b9550606760149054906101000a900460ff1615610e3157610e30846125af565b5b6000811115610ea6578173ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b8152600401610e7391906131a4565b600060405180830381600087803b158015610e8d57600080fd5b505af1158015610ea1573d6000803e3d6000fd5b505050505b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85886040518363ffffffff1660e01b8152600401610ee1929190612e8e565b602060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f339190612935565b610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f69906130e4565b60405180910390fd5b7fce49b138f2621300a7043a61f472ccfd643162bdf3efb11354e22d5273b77a71606854606b54606d54606f54604051610faf94939291906131e8565b60405180910390a17fda0c5744e922c38dc93f40ffd95d1e27696bee87f5cbd024bd5df1d168caa5a8848460000154856001015486600201548760030154604051610ffe959493929190612eee565b60405180910390a17ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56884878360405161103993929190612eb7565b60405180910390a185945050505050919050565b600080607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090506000816040015190506000606854111561122c576000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000606c548273ffffffffffffffffffffffffffffffffffffffff1663ae7928bf306040518263ffffffff1660e01b815260040161115b9190612db9565b60206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab91906129c3565b6111b5919061335c565b90506000606854670de0b6b3a7640000836111d09190613302565b6111da91906132d1565b9050670de0b6b3a76400008560000151828760200151606b546111fd919061335c565b611207919061327b565b6112119190613302565b61121b91906132d1565b84611226919061327b565b93505050505b8092505050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60003390506112668282611ac8565b6112878273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b6112958460001c60206120e8565b6040516020016112a6929190612d7f565b604051602081830303815290604052906112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed9190612fc2565b60405180910390fd5b506112ff61271a565b5050565b600080607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505090508060000151915050919050565b6113ad61172c565b156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490613044565b60405180910390fd5b60003390506000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061143d6123e2565b6114468261251b565b600081600201541161148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490613164565b60405180910390fd5b611496826125af565b7fce49b138f2621300a7043a61f472ccfd643162bdf3efb11354e22d5273b77a71606854606b54606d54606f546040516114d394939291906131e8565b60405180910390a17fda0c5744e922c38dc93f40ffd95d1e27696bee87f5cbd024bd5df1d168caa5a8828260000154836001015484600201548560030154604051611522959493929190612eee565b60405180910390a17f0c7ef932d3b91976772937f18d5ef9b39a9930bef486b576c374f047c4b512dc826040516115599190612db9565b60405180910390a15050565b600080606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115c89190612db9565b60206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161891906129c3565b905060685481611628919061335c565b9250505090565b6000801b60003390506116428282611ac8565b6116638273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b6116718460001c60206120e8565b604051602001611682929190612d7f565b604051602081830303815290604052906116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c99190612fc2565b60405180910390fd5b5082606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b606760149054906101000a900460ff1681565b6000603360009054906101000a900460ff16905090565b606e5481565b6000801b600033905061175c8282611ac8565b61177d8273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b61178b8460001c60206120e8565b60405160200161179c929190612d7f565b604051602081830303815290604052906117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e39190612fc2565b60405180910390fd5b50606760149054906101000a900460ff1615606760146101000a81548160ff0219169083151502179055507fbab7db190deaf2eccaf17b4e82ea10dce1e26f8a605ec9681ca8183b2de399fe606760149054906101000a900460ff166040516118559190612f41565b60405180910390a15050565b606b5481565b6000801b600033905061187a8282611ac8565b61189b8273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b6118a98460001c60206120e8565b6040516020016118ba929190612d7f565b6040516020818303038152906040529061190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119019190612fc2565b60405180910390fd5b5082606e819055507f3c4855c88fd8a474116d68903d5709038a6f57f15646d976d5abdbbc5818ca0d606e5460405161194391906131a4565b60405180910390a1505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a60003390506119808282611ac8565b6119a18273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b6119af8460001c60206120e8565b6040516020016119c0929190612d7f565b60405160208183030381529060405290611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a079190612fc2565b60405180910390fd5b50611a196127bc565b5050565b6000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154431115611a725760009050611ac3565b43607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154611ac0919061335c565b90505b919050565b600080606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166391d1485485856040518363ffffffff1660e01b8152600401611b2b929190612f77565b60206040518083038186803b158015611b4357600080fd5b505afa158015611b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7b9190612935565b91505092915050565b6000801b81565b60685481565b600080607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060e00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509050600081606001514310611c3d578160800151611c83565b60008260c0015111611c53578160800151611c82565b8160c00151438360600151611c68919061335c565b8360a00151611c779190613302565b611c8191906132d1565b5b5b905081608001518111611c9a578160800151611c9c565b805b92505050919050565b606d5481565b606060003390506000611cff607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610c1d565b90506000808573ffffffffffffffffffffffffffffffffffffffff168484604051602401611d2e929190612e8e565b6040516020818303038152906040527f15cc36f2000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611db89190612d68565b6000604051808303816000865af19150503d8060008114611df5576040519150601f19603f3d011682016040523d82523d6000602084013e611dfa565b606091505b509150915081611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690613144565b60405180910390fd5b7f6e05dc9f1838831eddd36138c9d51903718a470d488ca366c8469614074a97bd3087868685604051611e76959493929190612dfd565b60405180910390a180945050505050919050565b6000801b6000339050611e9d8282611ac8565b611ebe8273ffffffffffffffffffffffffffffffffffffffff1660146120e8565b611ecc8460001c60206120e8565b604051602001611edd929190612d7f565b60405160208183030381529060405290611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f249190612fc2565b60405180910390fd5b506000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611f5f611565565b905060008111611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613184565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611fdf929190612e8e565b602060405180830381600087803b158015611ff957600080fd5b505af115801561200d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120319190612935565b507fd43c97094d4b3522923f3751f896fb88ef95d5e1d310aea58b936625fd7c5d0c8582604051612063929190612e8e565b60405180910390a15050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606f5481565b6060600060028360026120fb9190613302565b612105919061327b565b67ffffffffffffffff811115612144577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121765781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106121d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061225e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261229e9190613302565b6122a8919061327b565b90505b6001811115612394577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612310577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82828151811061234d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061238d90613415565b90506122ab565b50600084146123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf90612fe4565b60405180910390fd5b8091505092915050565b606d5443116123f057612519565b6000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000606c548273ffffffffffffffffffffffffffffffffffffffff1663ae7928bf306040518263ffffffff1660e01b81526004016124559190612db9565b60206040518083038186803b15801561246d57600080fd5b505afa158015612481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a591906129c3565b6124af919061335c565b905080606c60008282546124c3919061327b565b925050819055506000606854111561250f57606854670de0b6b3a7640000826124ec9190613302565b6124f691906132d1565b606b6000828254612507919061327b565b925050819055505b43606d8190555050505b565b6000607060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010154606b54612572919061335c565b9050670de0b6b3a764000082600001548261258d9190613302565b61259791906132d1565b8260020181905550606b548260010181905550505050565b6000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000607060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000811115612715576000607060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff1663158a498884836040518363ffffffff1660e01b81526004016126a9929190612e8e565b600060405180830381600087803b1580156126c357600080fd5b505af11580156126d7573d6000803e3d6000fd5b505050507fc083a1647e3ee591bf42b82564ffb4d16fdbb26068f0080da911c8d8300fd84a838260405161270c929190612e8e565b60405180910390a15b505050565b61272261172c565b612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275890613004565b60405180910390fd5b6000603360006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127a561285f565b6040516127b29190612db9565b60405180910390a1565b6127c461172c565b15612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb90613044565b60405180910390fd5b6001603360006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861284861285f565b6040516128559190612db9565b60405180910390a1565b600033905090565b60008135905061287681613906565b92915050565b60008151905061288b8161391d565b92915050565b6000813590506128a081613934565b92915050565b6000813590506128b58161394b565b92915050565b6000815190506128ca8161394b565b92915050565b6000602082840312156128e257600080fd5b60006128f084828501612867565b91505092915050565b6000806040838503121561290c57600080fd5b600061291a85828601612867565b925050602061292b858286016128a6565b9150509250929050565b60006020828403121561294757600080fd5b60006129558482850161287c565b91505092915050565b6000806040838503121561297157600080fd5b600061297f85828601612891565b925050602061299085828601612867565b9150509250929050565b6000602082840312156129ac57600080fd5b60006129ba848285016128a6565b91505092915050565b6000602082840312156129d557600080fd5b60006129e3848285016128bb565b91505092915050565b600080604083850312156129ff57600080fd5b6000612a0d858286016128a6565b9250506020612a1e858286016128a6565b9150509250929050565b612a3181613390565b82525050565b612a40816133a2565b82525050565b612a4f816133ae565b82525050565b6000612a608261322d565b612a6a8185613243565b9350612a7a8185602086016133e2565b612a838161349d565b840191505092915050565b6000612a998261322d565b612aa38185613254565b9350612ab38185602086016133e2565b80840191505092915050565b6000612aca82613238565b612ad4818561325f565b9350612ae48185602086016133e2565b612aed8161349d565b840191505092915050565b6000612b0382613238565b612b0d8185613270565b9350612b1d8185602086016133e2565b80840191505092915050565b6000612b3660208361325f565b9150612b41826134ae565b602082019050919050565b6000612b59602483613270565b9150612b64826134d7565b602482019050919050565b6000612b7c60148361325f565b9150612b8782613526565b602082019050919050565b6000612b9f60468361325f565b9150612baa8261354f565b606082019050919050565b6000612bc260108361325f565b9150612bcd826135c4565b602082019050919050565b6000612be560298361325f565b9150612bf0826135ed565b604082019050919050565b6000612c08602c8361325f565b9150612c138261363c565b604082019050919050565b6000612c2b60348361325f565b9150612c368261368b565b604082019050919050565b6000612c4e60298361325f565b9150612c59826136da565b604082019050919050565b6000612c7160298361325f565b9150612c7c82613729565b604082019050919050565b6000612c94602e8361325f565b9150612c9f82613778565b604082019050919050565b6000612cb760288361325f565b9150612cc2826137c7565b604082019050919050565b6000612cda60218361325f565b9150612ce582613816565b604082019050919050565b6000612cfd60218361325f565b9150612d0882613865565b604082019050919050565b6000612d20601183613270565b9150612d2b826138b4565b601182019050919050565b6000612d4360208361325f565b9150612d4e826138dd565b602082019050919050565b612d62816133d8565b82525050565b6000612d748284612a8e565b915081905092915050565b6000612d8a82612b4c565b9150612d968285612af8565b9150612da182612d13565b9150612dad8284612af8565b91508190509392505050565b6000602082019050612dce6000830184612a28565b92915050565b6000604082019050612de96000830185612a28565b612df66020830184612a28565b9392505050565b600060a082019050612e126000830188612a28565b612e1f6020830187612a28565b612e2c6040830186612a28565b612e396060830185612d59565b8181036080830152612e4b8184612a55565b90509695505050505050565b6000606082019050612e6c6000830186612a28565b612e796020830185612a28565b612e866040830184612d59565b949350505050565b6000604082019050612ea36000830185612a28565b612eb06020830184612d59565b9392505050565b6000606082019050612ecc6000830186612a28565b612ed96020830185612d59565b612ee66040830184612d59565b949350505050565b600060a082019050612f036000830188612a28565b612f106020830187612d59565b612f1d6040830186612d59565b612f2a6060830185612d59565b612f376080830184612d59565b9695505050505050565b6000602082019050612f566000830184612a37565b92915050565b6000602082019050612f716000830184612a46565b92915050565b6000604082019050612f8c6000830185612a46565b612f996020830184612a28565b9392505050565b60006020820190508181036000830152612fba8184612a55565b905092915050565b60006020820190508181036000830152612fdc8184612abf565b905092915050565b60006020820190508181036000830152612ffd81612b29565b9050919050565b6000602082019050818103600083015261301d81612b6f565b9050919050565b6000602082019050818103600083015261303d81612b92565b9050919050565b6000602082019050818103600083015261305d81612bb5565b9050919050565b6000602082019050818103600083015261307d81612bd8565b9050919050565b6000602082019050818103600083015261309d81612bfb565b9050919050565b600060208201905081810360008301526130bd81612c1e565b9050919050565b600060208201905081810360008301526130dd81612c41565b9050919050565b600060208201905081810360008301526130fd81612c64565b9050919050565b6000602082019050818103600083015261311d81612c87565b9050919050565b6000602082019050818103600083015261313d81612caa565b9050919050565b6000602082019050818103600083015261315d81612ccd565b9050919050565b6000602082019050818103600083015261317d81612cf0565b9050919050565b6000602082019050818103600083015261319d81612d36565b9050919050565b60006020820190506131b96000830184612d59565b92915050565b60006040820190506131d46000830185612d59565b6131e16020830184612d59565b9392505050565b60006080820190506131fd6000830187612d59565b61320a6020830186612d59565b6132176040830185612d59565b6132246060830184612d59565b95945050505050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613286826133d8565b9150613291836133d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132c6576132c561343f565b5b828201905092915050565b60006132dc826133d8565b91506132e7836133d8565b9250826132f7576132f661346e565b5b828204905092915050565b600061330d826133d8565b9150613318836133d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133515761335061343f565b5b828202905092915050565b6000613367826133d8565b9150613372836133d8565b9250828210156133855761338461343f565b5b828203905092915050565b600061339b826133b8565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156134005780820151818401526020810190506133e5565b8381111561340f576000848401525b50505050565b6000613420826133d8565b915060008214156134345761343361343f565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416363657373436f6e74726f6c50726f78795061757361626c653a206163636f60008201527f756e742000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f547574656c6c75735374616b696e673a206d696e696e756d20666565206d757360008201527f742062652067726561746572206f7220657175616c207468616e206d6178696d60208201527f756d206665650000000000000000000000000000000000000000000000000000604082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f547574656c6c75735374616b696e673a20616d6f756e74206d7573742062652060008201527f6f766572207a65726f0000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a207573657220686173206e6f7420656e60008201527f6f7567682062616c616e63650000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a207573657220686173206e6f7420656e60008201527f6f756768207374616b696e672062616c616e6365000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a20616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a207769746864726177207472616e736660008201527f6572206661696c65640000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a2066656573206d757374206265206c6560008201527f7373207468616e20313030653138000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a206465706f736974207472616e73666560008201527f72206661696c6564000000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a206d6967726174696f6e206661696c6560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f547574656c6c75735374616b696e673a206e6f7468696e6720746f20636c616960008201527f6d00000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f547574656c6c75735374616b696e673a207468657265206973206e6f20676170600082015250565b61390f81613390565b811461391a57600080fd5b50565b613926816133a2565b811461393157600080fd5b50565b61393d816133ae565b811461394857600080fd5b50565b613954816133d8565b811461395f57600080fd5b5056fea26469706673582212206eda215e79f7d5fc3ec94f1a4c3342f25b920c5413191e6ad84acbdd7025efe764736f6c63430008020033000000000000000000000000ce9a30c3b300d1c0c06d0c1ef2f5e7ae0e474cf9000000000000000000000000edfb8b686903c6eb56b069e9d42d40c918a093a100000000000000000000000014cb53cfa6c7fe6a3d84dad8882df25aa997fef7000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000013c680

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.