Contract 0x28Caa843cB577d892A8B6eC3F24Aa682ED22Be68 1

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x7f269ef43e546db4faf2f1f396add13b2f064d2b8150951db2585e296fca6c02Claim435703022023-06-05 20:29:0327 mins ago0x1df8eea1e7969d6a2f0d37388f47f476678a859d IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.023368496904 192.666311357
0xc589b1305fbc42ad8c47b11a2635d17b0a59ce7bc9195b3b8c6f4ef894ffa5e1Claim435646932023-06-05 16:56:004 hrs ago0x72d4f3bd845f96f99037873ebb1d0dc15c08ef0b IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.020601849878 169.856128937
0x6f9dad52589e1ab3fab4d62cedd3cee5bbbba3b7cb747053e32ef95d45c1ef6dDeposit From435603192023-06-05 14:20:456 hrs 35 mins ago0xdc73e1d5f2ac8233d128ff7cee0a43a6863145cd IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.037413289781 220.689615239
0xb9adc0b2f142d9a38ff8680d5a64e25779d05c0e5ce89f95e72831b2483e75ceClaim435602982023-06-05 14:20:016 hrs 36 mins ago0xdc73e1d5f2ac8233d128ff7cee0a43a6863145cd IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.02264538334 186.704454943
0xd1c65167b62c692d7fdcec31637c1f040b48d8c2aae450c9c2397b60bb9a9b1fWithdraw435530292023-06-05 9:55:2511 hrs ago0x4483326668c7e63116b51bcd282c230706ebedc2 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.027267706119 166.788222427
0x616b131dd44006101fd60ff98109c259dab737f5e9fb357167d6a0928a357b7cClaim435190052023-06-04 12:30:371 day 8 hrs ago0x5453b447f98680dd9139d448b6dadbfaf9021915 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.020751839451 171.092748384
0x494d9fdc25dfb9478c27393427ff652bdbcdc5009a20205c519f2a31818d1129Claim435138412023-06-04 9:10:071 day 11 hrs ago0xa1fe1483e7acb717db240e5990457d2c3c61fefd IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.022036630875 181.685471804
0x058f696f6c25232fafb9b498435bdebf5047b0d2138fbe7336eebeaa735f5463Deposit From435101052023-06-04 6:48:401 day 14 hrs ago0x0d91573db8e3901f660b33149eaaa8ca91c13754 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.027713239075 163.483538972
0xbe032ff8d4358e8617fbc6a3578bfe4f51d5088b59ba3da994417309ee5bffc8Claim435100942023-06-04 6:48:161 day 14 hrs ago0x0d91573db8e3901f660b33149eaaa8ca91c13754 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.019894945103 164.027909172
0xe0c7310887bfc767e1c9a5932ece0f1ed44660a65f8f17748d02bed2a1c7cba8Deposit From434775782023-06-03 10:32:392 days 10 hrs ago0x75769d9231939f2e73e90052539117c40e455dae IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.038882045152 157.62330964
0xf1b525241e7e3bfc8d0d5c33e73d33806c61aee3c5ee4a70bbeeebffd6c78bc0Claim434731482023-06-03 7:41:332 days 13 hrs ago0x63bb872b4878324d5767767ede3f74717d9256c8 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.023078067942 190.271810885
0xafae98b2787848f4964b4adcfcdc846ebb290031c880294ba38a9d4b1cd2bd2cDeposit From434717082023-06-03 6:41:332 days 14 hrs ago0x7f5e4fff700c617d77774296fdd4fc5dbd0e1a11 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.027927901875 164.738197452
0x8cb950d147778aaa740983bf681f359e242cb1d903f3c98b76129196b1a4e0c2Claim434716832023-06-03 6:40:412 days 14 hrs ago0x7f5e4fff700c617d77774296fdd4fc5dbd0e1a11 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.022543632005 185.865545431
0xae67cd8fa8e6aa7b9d4ba414093b3eb4b9b24a048658a4c691e42c0d42ba8f7fClaim434691332023-06-03 4:59:262 days 15 hrs ago0x5f6d71cd8404e661cb4736e368564c01a7ff9852 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.01993216786 164.334799741
0xb3f789814df471308138e1e7bc49482a77a272a21d53c05e374969727409c722Deposit From434486202023-06-02 14:00:053 days 6 hrs ago0x5dcdc3f0fed4bb900707e88c76c2acc29ae80579 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.032796493544 208.098257908
0x610f2c6f4544183e4bf61759860570d7e9ba4626429ce6cd7f905d17300fbe54Withdraw434457162023-06-02 12:12:483 days 8 hrs ago0x6316b4a2fc13edfd36197248304ebfa6e5a4cae2 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.029861977282 182.62977587
0x68fbbe3286e6f1dddc6b88e60fb558cb0ce39eb8eaa703a325a712fc281a43dbClaim434456302023-06-02 12:09:443 days 8 hrs ago0x6316b4a2fc13edfd36197248304ebfa6e5a4cae2 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.020194655851 166.498935213
0x48e3df026047d5ba19f1a7ad937a52921ccac8d767b98aeefa736fe048571e0cDeposit From434389682023-06-02 8:04:433 days 12 hrs ago0xe7338d734397bfcc345b83600525f074af0e3ab6 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.029441750014 173.667927107
0xf532f2bb34fdc8b9226c1e87759a119bffa23f6c7a85fdfe5b369c5da0eae927Claim434389062023-06-02 8:02:313 days 12 hrs ago0xe7338d734397bfcc345b83600525f074af0e3ab6 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.020353195228 167.806045247
0x3a19016554352130cf2785a8e1bbad0a50ab7f0b942c2b8adc1bbd33a88ed4a7Withdraw434181072023-06-01 19:12:254 days 1 hr ago0xe4622ec52177b48d2c748a95c3ce34a779840ae6 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.028659455761172.98913372
0xbf4f967c1548ceda238379221426d3b40867b924c8b464137af700bac876224bDeposit From434162532023-06-01 18:00:494 days 2 hrs ago0x56c76cd934eeb96cd1e126f7914fa7f6808bd40d IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.042693600265 169.755190897
0xad122c45394d262b658f5b0c6c6aebab2bdfb0e7d8fe8949ce4e8a15607fb336Withdraw434147192023-06-01 17:00:424 days 3 hrs ago0x5dcdc3f0fed4bb900707e88c76c2acc29ae80579 IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.029454342225 180.163207016
0x68851c3c6595538c608c1a0b5ea804b5cce0cf7d4ca66e1fa3032e801287a394Claim434085862023-06-01 13:13:264 days 7 hrs ago0x1df8eea1e7969d6a2f0d37388f47f476678a859d IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.019160645743 157.973829195
0xeaee6adcc3a3016f363ad356c12ed2f9fcf598aab2c4d915bda4a15f5f8859f3Deposit From434063952023-06-01 11:52:554 days 9 hrs ago0x45d88d81bb0d18158744db80f3082ee34cbb15ad IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.028555862265 168.478121607
0x048bc07ff3c2d37618134ea99aa1a093f732edcc5fcbfe9cba1dfdf4d2314ec0Claim434063562023-06-01 11:51:334 days 9 hrs ago0x45d88d81bb0d18158744db80f3082ee34cbb15ad IN  0x28caa843cb577d892a8b6ec3f24aa682ed22be680 MATIC0.023854574491 172.372096913
[ 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
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.