ETH Price: $2,584.74 (-2.00%)

Contract

0xba33Aa06901B7662e17869f588b77c04fb0Cd872
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x21ba36d02e27ffd91ffb5d3ea75f6b4abfd6c64b62dde8f38b89d8177d4ae18c Withdraw(pending)2024-08-18 8:29:502 days ago1723969790IN
0xba33Aa06...4fb0Cd872
0 ETH(Pending)(Pending)
Withdraw205726272024-08-20 21:50:472 hrs ago1724190647IN
0xba33Aa06...4fb0Cd872
0 ETH0.000073370.93586819
Withdraw205726112024-08-20 21:47:353 hrs ago1724190455IN
0xba33Aa06...4fb0Cd872
0 ETH0.000089641.1434305
Unlock Stake205545892024-08-18 9:22:592 days ago1723972979IN
0xba33Aa06...4fb0Cd872
0 ETH0.000203671.46589378
Withdraw205447612024-08-17 0:27:114 days ago1723854431IN
0xba33Aa06...4fb0Cd872
0 ETH0.000122471.2824312
Unlock Stake205224322024-08-13 21:36:477 days ago1723585007IN
0xba33Aa06...4fb0Cd872
0 ETH0.000372612.68173625
Unlock Stake205223482024-08-13 21:19:597 days ago1723583999IN
0xba33Aa06...4fb0Cd872
0 ETH0.000208841.50297799
Unlock Stake205223352024-08-13 21:17:237 days ago1723583843IN
0xba33Aa06...4fb0Cd872
0 ETH0.000214121.54092723
Withdraw205108992024-08-12 6:59:358 days ago1723445975IN
0xba33Aa06...4fb0Cd872
0 ETH0.000120111.25772082
Unlock Stake204909482024-08-09 12:09:2311 days ago1723205363IN
0xba33Aa06...4fb0Cd872
0 ETH0.000389722.80463261
Withdraw204850102024-08-08 16:17:4712 days ago1723133867IN
0xba33Aa06...4fb0Cd872
0 ETH0.0022880223.95867374
Withdraw204666432024-08-06 2:48:1114 days ago1722912491IN
0xba33Aa06...4fb0Cd872
0 ETH0.000331253.46867152
Unlock Stake204591752024-08-05 1:47:5915 days ago1722822479IN
0xba33Aa06...4fb0Cd872
0 ETH0.04339569312.32506772
Withdraw204582272024-08-04 22:37:4716 days ago1722811067IN
0xba33Aa06...4fb0Cd872
0 ETH0.000244352.55866812
Withdraw204552342024-08-04 12:36:4716 days ago1722775007IN
0xba33Aa06...4fb0Cd872
0 ETH0.00014881.64740979
Withdraw204383392024-08-02 4:01:1118 days ago1722571271IN
0xba33Aa06...4fb0Cd872
0 ETH0.000266282.78839711
Unlock Stake204275562024-07-31 15:53:3520 days ago1722441215IN
0xba33Aa06...4fb0Cd872
0 ETH0.002526418.18292569
Unlock Stake204115802024-07-29 10:20:1122 days ago1722248411IN
0xba33Aa06...4fb0Cd872
0 ETH0.00030882.22230675
Unlock Stake204078612024-07-28 21:52:3523 days ago1722203555IN
0xba33Aa06...4fb0Cd872
0 ETH0.000152451.0972649
Withdraw204033802024-07-28 6:53:5923 days ago1722149639IN
0xba33Aa06...4fb0Cd872
0 ETH0.000127131.62170391
Unlock Stake204005542024-07-27 21:24:5924 days ago1722115499IN
0xba33Aa06...4fb0Cd872
0 ETH0.0046583433.52674757
Unlock Stake203822262024-07-25 7:59:2326 days ago1721894363IN
0xba33Aa06...4fb0Cd872
0 ETH0.000637924.59086515
Deposit203624802024-07-22 13:50:5929 days ago1721656259IN
0xba33Aa06...4fb0Cd872
0 ETH0.0027493910.11398526
Withdraw203624062024-07-22 13:36:1129 days ago1721655371IN
0xba33Aa06...4fb0Cd872
0 ETH0.000868659.40826376
Unlock Stake203390592024-07-19 7:23:3532 days ago1721373815IN
0xba33Aa06...4fb0Cd872
0 ETH0.000961066.916953
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingContractV1

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 14: StakingContractV1.sol
// SPDX-License-Identifier: UNLICENCED
pragma solidity ^0.8.11;

import { IUniswapV2Pair } from "./IUniswapV2Pair.sol";
import { IERC20 } from "./IERC20.sol";
import { IStakingContractV1 } from "./IStakingContractV1.sol";
import { Pausable } from "./Pausable.sol";
import { StakeStructs } from "./StakeStructs.sol";
import { StakeOpsController } from "./StakeOpsController.sol";
import { Context } from "./Context.sol";

contract StakingContractV1 is StakeStructs, IStakingContractV1, StakeOpsController, Pausable {

    IERC20 public immutable powrToken;

    // Same decimal precision as the POWR ERC20 Token
    uint256 public constant unit = 1000000;

    StakeStructs.StakingOpsInfo public stkOpsData;

    mapping(address => StakeStructs.StakeInfo) public stkData;

    mapping(string => uint256) public validatorTotalStake;

    mapping (string =>  address) public stakeAddressToEthAddress;

    /// @dev Verifies the following conditions:
    /// 1) The amount being deposited must be > 0
    /// 2) The amount being deposited must be > minimum POWR tokens deposit limit
    /// 3) The amount being deposited will not cause the chosen validator to exceed the maximum allowed stake
    /// 4) The address has not been used for staking before
    modifier checkDepositConditions(
        address _addr,
        uint256 _amount,
        string memory _stakerPubKey,
        string memory _validatorPubKey) {
        require(_amount > 0, "StakingContractV1:checkDepositConditions: Amount must be > 0");
        require(_amount >= stkOpsData.minPowrDeposit, "StakingContractV1:checkDepositConditions: Amount must be at least the min deposit requirement");
        require(validatorTotalStake[_validatorPubKey] + _amount <= stkOpsData.maxPowrPerValidator, "StakingContractV1:checkDepositConditions: Total stake cannot exceed max stake per validator");
        require(stkData[_addr].stakeStatus == StakeStatus.NeverStaked, "StakingContractV1:checkDepositConditions: Address can only stake once");
        require(stakeAddressToEthAddress[_stakerPubKey] == address(0), "StakingContractV1:checkDepositConditions: Solana wallet can only stake once");
        _;
    }

    /// @dev Verifies the following conditions:
    /// 1) Stake has not already been withdrawn
    /// 2) stakeStatus is equal to Unstaked
    /// 3) Stake + rewards > 0
    /// 4) Require 7 days have passed since undelegating/unlocking stake
    modifier checkWithdrawalConditions(address _addr) {
        require(stkData[_addr].stakeStatus != StakeStatus.Withdrawn, "StakingContractV1:checkWithdrawalConditions: Stake already withdrawn");
        require(stkData[_addr].stakeStatus == StakeStatus.Unstaked, "StakingContractV1:checkWithdrawalConditions: Stake has not been unstaked or cannot be found");
        require(stkData[_addr].stake + stkData[_addr].stakeRewards > 0, "StakingContractV1:checkWithdrawalConditions: No stake to withdraw");
        require(block.timestamp >= (stkData[_addr].unstakeTimestamp + (7*24*60*60)), "StakingContractV1:checkWithdrawalConditions: 7 days need to pass before you can withdraw");
        _;
    }

    /// @dev Setting initial parameters.
    /// @param _powrToken The address of the POWR ERC20 token. Mainnet address: 0x595832F8FC6BF59c85C527fEC3740A1b7a361269
    /// @param _minPowrDeposit The minimum amount of POWR tokens that are going to be required in order to become a Staker.
    /// @param _maxPowrPerValidator The maxinum POWR that can be delegated to each validator
    /// @param _stakeOpsAdmin The account that is going to be granted the STAKE_OPS_ADMIN_ROLE.
    /// @param _balanceUpdater The account that is going to be granted the BALANCE_UPDATER_ROLE.
    /// @param _pauser The account that is going to be granted the PAUSER_ROLE.
    /// @param _powrEthPoolAddress The POWR-ETH uniswap v2 pool
    /// @param _rewardWallet The wallet the POWR rewards will be paid from
    constructor(
        address _powrToken,
        uint256 _minPowrDeposit,
        uint256 _maxPowrPerValidator,
        address _stakeOpsAdmin,
        address _balanceUpdater,
        address _pauser,
        address _powrEthPoolAddress,
        uint256 _unlockGasCost,
        address _rewardWallet)
            StakeOpsController(
                _stakeOpsAdmin,
                _balanceUpdater,
                _pauser){

        require(_powrToken != address(0), "StakingContractV1: _powrToken address is incorrect");

        powrToken = IERC20(_powrToken);
        stkOpsData.minPowrDeposit = _minPowrDeposit * unit;
        stkOpsData.maxPowrPerValidator = _maxPowrPerValidator * unit;
        stkOpsData.powrRatio = 10000; //initial ratio set to 100.00%
        stkOpsData.powrEthPool = _powrEthPoolAddress;
        stkOpsData.unlockGasCost = _unlockGasCost;
        stkOpsData.rewardWallet = _rewardWallet;
    }

    /// @dev The First step into staking, wanna-be staker must sent POWR tokens to this contract using this deposit function.
    /// @param _amount The amount of POWR tokens to stake. If the amount to stake is 1 POWR token then the value of this parameter should be 1x10^6
    /// @param _stakerPubKey The solana public key of the user
    /// @param _validatorPubKey The public key from the PLChain Node
    function deposit(
        uint256 _amount, 
        string memory _stakerPubKey,
        string memory _validatorPubKey)
            external
            whenNotPaused
            checkDepositConditions(_msgSender(), _amount, _stakerPubKey, _validatorPubKey)
            {
                address stakerEthAddress = _msgSender();
                /// require amount of tokens in account ready to deposit
                require(powrToken.transferFrom(stakerEthAddress, address(this), _amount), "StakingContractV1:deposit: Can't transfer the POWR tokens");

                // First deposit
                stkData[stakerEthAddress] = StakeStructs.StakeInfo({
                    stake: _amount,
                    stakeRewards: 0,
                    registeredStaker: _stakerPubKey,
                    registeredStakerValidatorPubKey: _validatorPubKey,
                    stakeStatus: StakeStatus.Deposited,
                    ethFee: 0,
                    unstakeTimestamp: 0
                });
                stakeAddressToEthAddress[_stakerPubKey] = stakerEthAddress;
                validatorTotalStake[_validatorPubKey] = validatorTotalStake[_validatorPubKey] + _amount;
                stkOpsData.stakeCount = stkOpsData.stakeCount + 1;
                stkOpsData.totalStaked = stkOpsData.totalStaked + _amount;
                emit StakeDeposited(stakerEthAddress, _amount, _stakerPubKey, _validatorPubKey);
    }

    /// @dev This function is called after the user has requested an unstake. This is called by the BALANCE_UPDATER_ROLE and updates the reward amounts
    /// @dev This function sets the rewards + stake to be withdrawn by the user using the withdraw() function
    /// @param _stakerPubKey The solana pubkey of the staker that has unstaked their POWR and it has finished unstaking on the plchain
    /// @param _rewardAmount The amount of rewards accrued (in base units i.e. 1 POWR = 10^6)
    function unlockStake(
        string memory _stakerPubKey, 
        uint256 _rewardAmount)
            external
            whenNotPaused
            onlyRole(BALANCE_UPDATER_ROLE)
            {
                // get eth address from sol address
                address stakerEthAddress = stakeAddressToEthAddress[_stakerPubKey];
                require(stkData[stakerEthAddress].stakeStatus == StakeStatus.Deposited, "StakingContractV1:unlockStake Stake must be in 'deposited' state");
                //set status to unstaked, set reward amount
                stkData[stakerEthAddress].stakeStatus = StakeStatus.Unstaked;
                stkData[stakerEthAddress].stakeRewards = _rewardAmount;
                stkData[stakerEthAddress].ethFee = stkOpsData.unlockGasCost*tx.gasprice;
                stkData[stakerEthAddress].unstakeTimestamp = block.timestamp;


                //update contract stats
                stkOpsData.stakeCount = stkOpsData.stakeCount - 1;
                stkOpsData.totalStaked = stkOpsData.totalStaked - stkData[stakerEthAddress].stake;
                validatorTotalStake[stkData[stakerEthAddress].registeredStakerValidatorPubKey] = validatorTotalStake[stkData[stakerEthAddress].registeredStakerValidatorPubKey] - stkData[stakerEthAddress].stake;

                //emit event
                emit UnlockStake(stakerEthAddress, stkData[stakerEthAddress].stake, stkData[stakerEthAddress].registeredStaker);
    }

    /// @dev This function can be called after the unlockStake transaction has been sent by the bridge
    /// @dev This function ensures that the fee collection is not greater than withdrawal amount
    /// @dev if the fee is greater than reward amount, we transfer no rewards from the admin account 
    /// @dev If the fee is greater than rewards we subtract the remaining fee from the principal stake and transfer it back from the contract
    /// @dev If the rewards are enough to cover the fee, this function tranfers the stake from the contract and the rewards from the admin account
    function withdraw()
        external
        whenNotPaused
        checkWithdrawalConditions(_msgSender()){
            address stakerEthAddress = _msgSender();
            uint256 stakeAmount = stkData[stakerEthAddress].stake;
            uint256 rewardAmount = stkData[stakerEthAddress].stakeRewards * stkOpsData.powrRatio / 10000;
            uint256 powrFee = uint(convertEthToPOWR(stkData[stakerEthAddress].ethFee));
            // sets stake and reward to 0 and updates status
            stkData[stakerEthAddress].stake = 0;
            stkData[stakerEthAddress].stakeRewards = 0;
            stkData[stakerEthAddress].stakeStatus = StakeStatus.Withdrawn;

            // Checks if the fee will cover the rewarded amount, if not, the rewards are zeroed out and the remaining fee subtracted from principal
            // If the fee does cover the reward amount, transfer full stake from staking contract, and rewards are transferred from admin account
            if(powrFee >= rewardAmount) {
                uint256 remainingFee = powrFee - rewardAmount;
                require(stakeAmount >= remainingFee, "StakingContractV1:withdraw Not enough POWR in stake to cover withdrawal fee");
                uint256 remainingStake = stakeAmount - remainingFee;
                require(powrToken.transfer(stakerEthAddress, remainingStake), "StakingContractV1:withdraw Can't transfer remaining POWR tokens staking contract");
                require(powrToken.transfer(stkOpsData.rewardWallet, stakeAmount - remainingStake), "StakingContractV1:withdraw Can't transfer POWR fee from staking contract");

            } else {
                require(powrToken.transfer(stakerEthAddress, stakeAmount), "StakingContractV1:withdraw Can't transfer POWR tokens from staking contract");
                require(powrToken.transferFrom(stkOpsData.rewardWallet, stakerEthAddress, rewardAmount - powrFee), "StakingContractV1:withdraw Can't transfer POWR tokens from admin account");
            }

           // emit event
            emit StakeWithdrawn(stakerEthAddress, stakeAmount, rewardAmount);
    }

    /// @dev This function is called in an emergency to force a user to unstake their POWR. This is called by the STAKE_OPS_ADMIN_ROLE and updates the reward amounts
    /// @dev This function sets the rewards + stake minus the fee to be withdrawn by the user using the withdraw() function
    /// @param _stakerPubKey The sol address of the staker that has unstaked their POWR and it has finished unstaking on the plchain
    /// @param _rewardAmount The amount of rewards accrued (in base units i.e. 1 POWR = 10^6)
    function forceUnlockStake(
        string memory _stakerPubKey, 
        uint256 _rewardAmount)
            external
            onlyRole(STAKE_OPS_ADMIN_ROLE) 
            {
                // get eth address from sol address
                address stakerEthAddress = stakeAddressToEthAddress[_stakerPubKey];
                require(stkData[stakerEthAddress].stakeStatus == StakeStatus.Deposited || stkData[stakerEthAddress].stakeStatus == StakeStatus.Unstaked, "StakingContractV1:forceUnlockStake: Stake must be in 'deposited' or 'unstaked' state");
                //set status to unstaked, set reward amount
                stkData[stakerEthAddress].stakeStatus = StakeStatus.Unstaked;
                stkData[stakerEthAddress].stakeRewards = _rewardAmount;
                stkData[stakerEthAddress].ethFee = stkOpsData.unlockGasCost*tx.gasprice;
                stkData[stakerEthAddress].unstakeTimestamp = block.timestamp;

                //update internal contract status
                stkOpsData.stakeCount = stkOpsData.stakeCount - 1;
                stkOpsData.totalStaked = stkOpsData.totalStaked - stkData[stakerEthAddress].stake;
                validatorTotalStake[stkData[stakerEthAddress].registeredStakerValidatorPubKey] = validatorTotalStake[stkData[stakerEthAddress].registeredStakerValidatorPubKey] - stkData[stakerEthAddress].stake;

                //emit event
                emit ForceUnlockStake(stakerEthAddress, stkData[stakerEthAddress].stake, stkData[stakerEthAddress].registeredStaker);
    }

    /// @dev Getter function to return the status of a stake
    /// @param _stakerEthAddress The eth address of the staker 
    /// @return currentStatus The current status of the staker
    function getStatus(address _stakerEthAddress)
        external
        view
        returns(uint currentStatus)
        {
            currentStatus = uint(stkData[_stakerEthAddress].stakeStatus);
            return(currentStatus);
        }


    /// @dev This function takes an amount of eth and using the current uniswap pool rate, returns a powr amount
    /// @param _ethAmount The amount of ether (in wei) to convert to powr
    /// @return powrAmount the amount of powr in base units (6 decimals)
    function convertEthToPOWR(uint256 _ethAmount) 
        public 
        view 
        returns(uint256 powrAmount)
        {
            IUniswapV2Pair pair = IUniswapV2Pair(stkOpsData.powrEthPool);
            (uint112 powrReserves, uint112 ethReserves,) = pair.getReserves();
            powrAmount = (_ethAmount*powrReserves)/(ethReserves); // return amount of POWR needed to buy _ethAmount in base unit (i.e. 1 POWR = 10^6)
            return(powrAmount);
        }

    /// @dev This function takes an integer between 0 and 100000 and updates the powrRatio for reward distribution.
    /// @dev This function can only be called by STAKE_OPS_ADMIN_ROLE
    /// @param _newRatio an integer between 0 and 100000 that represents between 0 and 1000.00% of powr conversion ratio
    function setRatio(
        uint256 _newRatio)
        external
        onlyRole(STAKE_OPS_ADMIN_ROLE)
            {
                require(_newRatio <= 100000, "New Ratio must be <= 100000");
                stkOpsData.powrRatio = _newRatio;
            }

    /// @dev This function returns the current vavlue of stkOpsData.powrRatio
    /// @return currentRatio an integer between 0 and 100000 that represents between 0 and 100.00% of powr conversion ratio
    function getRatio()
        external
        view
        returns (uint256 currentRatio)
            {
                currentRatio = stkOpsData.powrRatio;
                return(currentRatio);
            }

    /// @dev This function allows the admin role to change the minimum deposit required to stake from the initial amount set
    /// @param _newAmount new minimum amount of POWR to deposit. in POWR units (i.e. enter 5000 POWR for 5000000000 base units)
    function changeMinDeposit(uint256 _newAmount)
        external
        onlyRole(STAKE_OPS_ADMIN_ROLE){
            stkOpsData.minPowrDeposit = _newAmount * unit;
        }

    /// @dev This function allows the admin role to change the gas cost of an unlock transaction from 130000
    /// @param _newGasCost new gas cost of the unlock transactions
    function changeUnlockGasCost(uint256 _newGasCost)
        external
        onlyRole(STAKE_OPS_ADMIN_ROLE){
            stkOpsData.unlockGasCost = _newGasCost;
        }

    /// @dev This function allows the admin role to change the reward wallet
    /// @param _newRewardWallet address of new reward wallet
    function changeRewardWallet(address _newRewardWallet)
        external
        onlyRole(STAKE_OPS_ADMIN_ROLE){
            stkOpsData.rewardWallet = _newRewardWallet;
        }

    /// @dev Pauses the contract. Can only be called by user with PAUSER_ROLE
    function pause()
        external
        onlyRole(PAUSER_ROLE) {
        _pause();
    }

    /// @dev If the contract is Paused, it unpauses it, only called by user with PAUSER_ROLE
    function unPause()
        external
        onlyRole(PAUSER_ROLE) {
        _unpause();
    }
}

File 2 of 14: AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (access/AccessControl.sol)

pragma solidity ^0.8.10;

import { IAccessControl } from "./IAccessControl.sol";
import { Context } from "./Context.sol";
import { Strings } from "./Strings.sol";
import { ERC165 } from "./ERC165.sol";
import { Ownable } from "./Ownable.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) virtual {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @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) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @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) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @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 revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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

pragma solidity ^0.8.10;

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

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

File 4 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 14: IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @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 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 14: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.10;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 8 of 14: IStakingContractV1.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.11;


interface IStakingContractV1 {

    event StakeDeposited(
        address indexed staker,
        uint256 amount,
        string stakerPubKey,
        string validatorPubKey);

    event UnlockStake(
        address indexed staker,
        uint256 amount,
        string validatorPubKey);

    event ForceUnlockStake(
        address indexed staker,
        uint256 amount,
        string validatorPubKey);

    event StakeWithdrawn(
        address indexed staker,
        uint256 stake,
        uint256 rewards);

    function deposit(
        uint256 _amount, 
        string memory _stakerPubKey,
        string memory _validatorPubKey)
            external;

    function unlockStake(
        string memory _stakerPubKey, 
        uint256 _rewardAmount)
            external;

    function forceUnlockStake(
        string memory _stakerPubKey, 
        uint256 _rewardAmount)
            external;

    function withdraw()
            external;

    function getStatus(
        address _stakerEthAddress)
            external
            returns(uint currentStatus);

    function setRatio(
        uint256 _newRatio)
        external;

    function getRatio()
        external
        view
        returns (uint256 newRatio);

    function changeMinDeposit(
        uint256 _newAmount)
        external;

    function changeUnlockGasCost(
        uint256 _newGasCost)
        external;

    function changeRewardWallet(
        address _newRewardWallet)
        external;

    function pause()
        external;

    function unPause()
        external;
}

File 9 of 14: IUniswapV2Pair.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 10 of 14: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import { Context } from "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 11 of 14: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import { Context } from "./Context.sol";

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

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

    bool private _paused;

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

    /**
     * @dev 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());
    }
}

File 12 of 14: StakeOpsController.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.11;

import { AccessControl } from "./AccessControl.sol";

/// @title StakeOpsController
/// 3 roles are defined:
/// STAKE_OPS_ADMIN_ROLE: Accounts with this role have unrestricted execution permissions to all protected functions.
/// BALANCE_UPDATER_ROLE:  Accounts with this role have execution permissions over unlockStake function which applies rewards
/// PAUSER_ROLE: Accounts with this role can Pause or UnPause (see Pausable.sol) the PowerLedgerStakingV1 contract
/// STAKE_OPS_ADMIN_ROLE can be PAUSER_ROLE, but not BALANCE_UPDATER_ROLE
/// PAUSER_ROLE and BALANCE_UPDATER_ROLE must be different
contract StakeOpsController is AccessControl {

    bytes32 public constant STAKE_OPS_ADMIN_ROLE = keccak256("STAKE_OPS_ADMIN_ROLE");
    bytes32 public constant BALANCE_UPDATER_ROLE = keccak256("BALANCE_UPDATER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    /// @dev Construction of this contract requires the .
    /// @param _stakeOpsAdmin Admin account. Has all 3 permissions.
    /// @param _balanceUpdater Updater account. Can only execute stats update functionality
    /// @param _pauser Pauser account. Can only pause / unpause the contract.
    constructor(
        address _stakeOpsAdmin,
        address _balanceUpdater,
        address _pauser) {

        require(_stakeOpsAdmin != _balanceUpdater, "StakeOpsController: Accounts must be different");
        require(_balanceUpdater != _pauser, "StakeOpsController: Accounts must be different");

        _setRoleAdmin(STAKE_OPS_ADMIN_ROLE, STAKE_OPS_ADMIN_ROLE);
        _setRoleAdmin(BALANCE_UPDATER_ROLE, STAKE_OPS_ADMIN_ROLE);
        _setRoleAdmin(PAUSER_ROLE, STAKE_OPS_ADMIN_ROLE);

        _setupRole(STAKE_OPS_ADMIN_ROLE, _stakeOpsAdmin);
        _setupRole(BALANCE_UPDATER_ROLE, _stakeOpsAdmin);
        _setupRole(PAUSER_ROLE, _stakeOpsAdmin);

        _setupRole(BALANCE_UPDATER_ROLE, _balanceUpdater);
        _setupRole(PAUSER_ROLE, _pauser);
    }

    /// @dev Modifier to make a function callable only by a certain role. In
    /// addition to checking the sender's role, `address(0)` 's role is also
    /// considered. Granting a role to `address(0)` is equivalent to enabling
    /// this role for everyone.
    modifier onlyRole(bytes32 role) override {
        require(hasRole(role, _msgSender()) || hasRole(role, address(0)), "StakeOpsController: sender requires permission");
        _;
    }
}

File 13 of 14: StakeStructs.sol
// SPDX-License-Identifier: UNLICENCED
pragma solidity ^0.8.11;

/// GENERAL STAKING DATA
///     └─ StakingOpsInfo
/// STAKER
///     └─ StakeInfo

contract StakeStructs {

    enum StakeStatus { NeverStaked, Deposited, Unstaked, Withdrawn }

    /// General Staking Info & Parameters
    struct StakingOpsInfo {
        uint256 stakeCount;             // Total number of stakers, activated and not activated
        uint256 totalStaked;            // The total amount of POWR tokens staked regardless of the status
        uint256 minPowrDeposit;         // The min amount of POWR tokens required for staking
        uint256 maxPowrPerValidator;     // The max amount of POWR to be delegated to each validator
        uint256 powrRatio;              // From 0 to 100000, respresenting a mulplier of 0.00% - 1000.00%
        address powrEthPool;            // address of the uniswap v2 POWR-ETH pool
        uint256 unlockGasCost;         // gas price of unlock transaction
        address rewardWallet;          // wallet POWR rewards are paid from
    }

    /// Stake information. Per Staker.
    struct StakeInfo {
        uint256 stake;                              // The amount of POWR tokens staked
        uint256 stakeRewards;                       // Amount of POWR tokens rewards
        string registeredStaker;                   // Address of the wallet used for staking
        string registeredStakerValidatorPubKey;    // The public key of the PLChain Node to delegate to
        StakeStatus stakeStatus;                     // Enum storing status of stake Stake
        uint256 ethFee;                                   // eth fee charged to subsidize unlock stake tx
        uint256 unstakeTimestamp;                    //timestamp for storing when the user requested an unstake
    }
}

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_powrToken","type":"address"},{"internalType":"uint256","name":"_minPowrDeposit","type":"uint256"},{"internalType":"uint256","name":"_maxPowrPerValidator","type":"uint256"},{"internalType":"address","name":"_stakeOpsAdmin","type":"address"},{"internalType":"address","name":"_balanceUpdater","type":"address"},{"internalType":"address","name":"_pauser","type":"address"},{"internalType":"address","name":"_powrEthPoolAddress","type":"address"},{"internalType":"uint256","name":"_unlockGasCost","type":"uint256"},{"internalType":"address","name":"_rewardWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"validatorPubKey","type":"string"}],"name":"ForceUnlockStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"stakerPubKey","type":"string"},{"indexed":false,"internalType":"string","name":"validatorPubKey","type":"string"}],"name":"StakeDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"validatorPubKey","type":"string"}],"name":"UnlockStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BALANCE_UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"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":"STAKE_OPS_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"changeMinDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRewardWallet","type":"address"}],"name":"changeRewardWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newGasCost","type":"uint256"}],"name":"changeUnlockGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"convertEthToPOWR","outputs":[{"internalType":"uint256","name":"powrAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_stakerPubKey","type":"string"},{"internalType":"string","name":"_validatorPubKey","type":"string"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_stakerPubKey","type":"string"},{"internalType":"uint256","name":"_rewardAmount","type":"uint256"}],"name":"forceUnlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRatio","outputs":[{"internalType":"uint256","name":"currentRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakerEthAddress","type":"address"}],"name":"getStatus","outputs":[{"internalType":"uint256","name":"currentStatus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"powrToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRatio","type":"uint256"}],"name":"setRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"stakeAddressToEthAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stkData","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"stakeRewards","type":"uint256"},{"internalType":"string","name":"registeredStaker","type":"string"},{"internalType":"string","name":"registeredStakerValidatorPubKey","type":"string"},{"internalType":"enum StakeStructs.StakeStatus","name":"stakeStatus","type":"uint8"},{"internalType":"uint256","name":"ethFee","type":"uint256"},{"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stkOpsData","outputs":[{"internalType":"uint256","name":"stakeCount","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"minPowrDeposit","type":"uint256"},{"internalType":"uint256","name":"maxPowrPerValidator","type":"uint256"},{"internalType":"uint256","name":"powrRatio","type":"uint256"},{"internalType":"address","name":"powrEthPool","type":"address"},{"internalType":"uint256","name":"unlockGasCost","type":"uint256"},{"internalType":"address","name":"rewardWallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_stakerPubKey","type":"string"},{"internalType":"uint256","name":"_rewardAmount","type":"uint256"}],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"validatorTotalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162002e9c38038062002e9c833981016040819052620000349162000413565b858585816001600160a01b0316836001600160a01b03161415620000a55760405162461bcd60e51b815260206004820152602e602482015260008051602062002e1c83398151915260448201526d1d08189948191a5999995c995b9d60921b60648201526084015b60405180910390fd5b806001600160a01b0316826001600160a01b031614156200010f5760405162461bcd60e51b815260206004820152602e602482015260008051602062002e1c83398151915260448201526d1d08189948191a5999995c995b9d60921b60648201526084016200009c565b6200012a60008051602062002e3c83398151915280620002fb565b6200015460008051602062002e5c83398151915260008051602062002e3c833981519152620002fb565b6200017e60008051602062002e7c83398151915260008051602062002e3c833981519152620002fb565b6200019960008051602062002e3c8339815191528462000346565b620001b460008051602062002e5c8339815191528462000346565b620001cf60008051602062002e7c8339815191528462000346565b620001ea60008051602062002e5c8339815191528362000346565b6200020560008051602062002e7c8339815191528262000346565b50506001805460ff19169055506001600160a01b038916620002855760405162461bcd60e51b815260206004820152603260248201527f5374616b696e67436f6e747261637456313a205f706f7772546f6b656e206164604482015271191c995cdcc81a5cc81a5b98dbdc9c9958dd60721b60648201526084016200009c565b6001600160a01b038916608052620002a1620f424089620004b3565b600455620002b3620f424088620004b3565b600555612710600655600780546001600160a01b039485166001600160a01b0319918216179091556008929092556009805491909316911617905550620004e1945050505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b62000352828262000356565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000352576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620003b23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b03811681146200040e57600080fd5b919050565b60008060008060008060008060006101208a8c0312156200043357600080fd5b6200043e8a620003f6565b985060208a0151975060408a015196506200045c60608b01620003f6565b95506200046c60808b01620003f6565b94506200047c60a08b01620003f6565b93506200048c60c08b01620003f6565b925060e08a01519150620004a46101008b01620003f6565b90509295985092959850929598565b6000816000190483118215151615620004dc57634e487b7160e01b600052601160045260246000fd5b500290565b6080516128fc62000520600039600081816102c401528181610a7701528181610b6c01528181610cac01528181610d9a015261194101526128fc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063907af6c011610104578063b2237ba3116100a2578063eaacbf6311610071578063eaacbf631461045e578063ec1ebd7a146104da578063ed0693ff146104e2578063f7b188a51461050957600080fd5b8063b2237ba3146103eb578063d547741f146103fe578063e5f0c4b814610411578063e63ab1e91461043757600080fd5b806397695d93116100de57806397695d93146103aa578063a217fddf146103bd578063abe110b6146103c5578063b1d36894146103d857600080fd5b8063907af6c01461037a57806391d148541461038457806397498a9a1461039757600080fd5b80633c2fc4cc1161017c5780635c975abb1161014b5780635c975abb1461032957806375b8c97b146103345780637e229f3d146103475780638456cb591461037257600080fd5b80633c2fc4cc146102e65780633ccfd60b146102fb5780634b2a12da146103035780635305f1821461031657600080fd5b80632f2ff15d116101b85780632f2ff15d1461028457806330ccebb51461029957806336568abe146102ac578063384f3475146102bf57600080fd5b806301ffc9a7146101df578063248a9ca3146102075780632d5fcddf14610238575b600080fd5b6101f26101ed366004612213565b610511565b60405190151581526020015b60405180910390f35b61022a610215366004612244565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61026c610246366004612300565b8051602081830181018051600c825292820191909301209152546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b610297610292366004612359565b610548565b005b61022a6102a7366004612385565b6105a9565b6102976102ba366004612359565b6105d9565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b61022a60008051602061284783398151915281565b610297610657565b610297610311366004612244565b610f02565b6102976103243660046123a0565b610f5c565b60015460ff166101f2565b6102976103423660046123a0565b611255565b61022a610355366004612300565b8051602081830181018051600b8252928201919093012091525481565b610297611520565b61022a620f424081565b6101f2610392366004612359565b611583565b6102976103a5366004612244565b6115ac565b6102976103b83660046123e5565b6115f8565b61022a600081565b6102976103d3366004612385565b611bf0565b61022a6103e6366004612244565b611c59565b6102976103f9366004612244565b611d05565b61029761040c366004612359565b611da4565b61042461041f366004612385565b611df7565b6040516101fe97969594939291906124c4565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6002546003546004546005546006546007546008546009546104909796959493926001600160a01b0390811692911688565b60408051988952602089019790975295870194909452606086019290925260808501526001600160a01b0390811660a085015260c08401919091521660e0820152610100016101fe565b60065461022a565b61022a7f319a6c97bbc775b79a48583aa64d94a9ff20e69fb7d2fce8f81b40110d07a77781565b610297611f48565b60006001600160e01b03198216637965db0b60e01b148061054257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152602081905260409020600101546105648133611583565b806105755750610575816000611583565b61059a5760405162461bcd60e51b815260040161059190612534565b60405180910390fd5b6105a48383611fa8565b505050565b6001600160a01b0381166000908152600a602052604081206004015460ff166003811115610542576105426124ae565b6001600160a01b03811633146106495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610591565b610653828261202c565b5050565b60015460ff161561067a5760405162461bcd60e51b815260040161059190612582565b336000818152600a602052604090206004015460039060ff16818111156106a3576106a36124ae565b14156107135760405162461bcd60e51b815260206004820152604460248201819052600080516020612887833981519152908201527f6c436f6e646974696f6e733a205374616b6520616c72656164792077697468646064820152633930bbb760e11b608482015260a401610591565b60026001600160a01b0382166000908152600a602052604090206004015460ff166003811115610745576107456124ae565b146107cc5760405162461bcd60e51b815260206004820152605b602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a205374616b6520686173206e6f74206265656e2060648201527f756e7374616b6564206f722063616e6e6f7420626520666f756e640000000000608482015260a401610591565b6001600160a01b0381166000908152600a60205260408120600181015490546107f591906125c2565b116108605760405162461bcd60e51b8152602060048201526041602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a204e6f207374616b6520746f20776974686472616064820152607760f81b608482015260a401610591565b6001600160a01b0381166000908152600a60205260409020600601546108899062093a806125c2565b4210156109125760405162461bcd60e51b8152602060048201526058602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a20372064617973206e65656420746f207061737360648201527f206265666f726520796f752063616e2077697468647261770000000000000000608482015260a401610591565b336000818152600a6020526040812080546006546001909201549092916127109161093d91906125da565b61094791906125f9565b6001600160a01b0384166000908152600a60205260408120600501549192509061097090611c59565b6001600160a01b0385166000908152600a602052604081208181556001810191909155600401805460ff191660031790559050818110610c865760006109b6838361261b565b905080841015610a425760405162461bcd60e51b815260206004820152604b60248201527f5374616b696e67436f6e747261637456313a7769746864726177204e6f74206560448201527f6e6f75676820504f575220696e207374616b6520746f20636f7665722077697460648201526a6864726177616c2066656560a81b608482015260a401610591565b6000610a4e828661261b565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190612632565b610b5f5760405162461bcd60e51b815260206004820152605060248201526000805160206128a783398151915260448201527f207472616e736665722072656d61696e696e6720504f575220746f6b656e732060648201526f1cdd185ada5b99c818dbdb9d1c9858dd60821b608482015260a401610591565b6009546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163a9059cbb9116610b9f848961261b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0e9190612632565b610c7f5760405162461bcd60e51b815260206004820152604860248201526000805160206128a783398151915260448201527f207472616e7366657220504f5752206665652066726f6d207374616b696e672060648201526718dbdb9d1c9858dd60c21b608482015260a401610591565b5050610eb7565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d199190612632565b610d8d5760405162461bcd60e51b815260206004820152604b60248201526000805160206128a783398151915260448201527f207472616e7366657220504f575220746f6b656e732066726f6d207374616b6960648201526a1b99c818dbdb9d1c9858dd60aa1b608482015260a401610591565b6009546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916323b872dd911686610dce858761261b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e469190612632565b610eb75760405162461bcd60e51b815260206004820152604860248201526000805160206128a783398151915260448201527f207472616e7366657220504f575220746f6b656e732066726f6d2061646d696e606482015267081858d8dbdd5b9d60c21b608482015260a401610591565b60408051848152602081018490526001600160a01b038616917f933735aa8de6d7547d0126171b2f31b9c34dd00f3ecd4be85a0ba047db4fafef910160405180910390a25050505050565b600080516020612847833981519152610f1b8133611583565b80610f2c5750610f2c816000611583565b610f485760405162461bcd60e51b815260040161059190612534565b610f55620f4240836125da565b6004555050565b600080516020612847833981519152610f758133611583565b80610f865750610f86816000611583565b610fa25760405162461bcd60e51b815260040161059190612534565b6000600c84604051610fb49190612654565b908152604051908190036020019020546001600160a01b0316905060016001600160a01b0382166000908152600a602052604090206004015460ff166003811115611001576110016124ae565b148061103c575060026001600160a01b0382166000908152600a602052604090206004015460ff16600381111561103a5761103a6124ae565b145b6110cb5760405162461bcd60e51b815260206004820152605460248201527f5374616b696e67436f6e747261637456313a666f726365556e6c6f636b53746160448201527f6b653a205374616b65206d75737420626520696e20276465706f736974656427606482015273206f722027756e7374616b65642720737461746560601b608482015260a401610591565b6001600160a01b0381166000908152600a6020526040902060048101805460ff19166002179055600101839055600854611106903a906125da565b6001600160a01b0382166000908152600a6020526040902060058101919091554260069091015560025461113c9060019061261b565b6002556001600160a01b0381166000908152600a6020526040902054600354611165919061261b565b60039081556001600160a01b0382166000908152600a602052604090819020805491519192600b9261119a92909101906126ab565b9081526020016040518091039020546111b3919061261b565b600b600a6000846001600160a01b03166001600160a01b031681526020019081526020016000206003016040516111ea91906126ab565b908152604080519182900360209081018320939093556001600160a01b0384166000818152600a909452922080547f1ffb42f2d7426eea82a58c305d92c45622b4e604d19e5332e91f79d0d3c815cc92611247926002019061271d565b60405180910390a250505050565b60015460ff16156112785760405162461bcd60e51b815260040161059190612582565b7f319a6c97bbc775b79a48583aa64d94a9ff20e69fb7d2fce8f81b40110d07a7776112a38133611583565b806112b457506112b4816000611583565b6112d05760405162461bcd60e51b815260040161059190612534565b6000600c846040516112e29190612654565b908152604051908190036020019020546001600160a01b0316905060016001600160a01b0382166000908152600a602052604090206004015460ff16600381111561132f5761132f6124ae565b146113a4576040805162461bcd60e51b81526020600482015260248101919091527f5374616b696e67436f6e747261637456313a756e6c6f636b5374616b6520537460448201527f616b65206d75737420626520696e20276465706f7369746564272073746174656064820152608401610591565b6001600160a01b0381166000908152600a6020526040902060048101805460ff191660021790556001018390556008546113df903a906125da565b6001600160a01b0382166000908152600a602052604090206005810191909155426006909101556002546114159060019061261b565b6002556001600160a01b0381166000908152600a602052604090205460035461143e919061261b565b60039081556001600160a01b0382166000908152600a602052604090819020805491519192600b9261147392909101906126ab565b90815260200160405180910390205461148c919061261b565b600b600a6000846001600160a01b03166001600160a01b031681526020019081526020016000206003016040516114c391906126ab565b908152604080519182900360209081018320939093556001600160a01b0384166000818152600a909452922080547fc811f8947c7b68292b8fe0dddc194669b2a7daa45020b60fa7e4dd44704dd2c392611247926002019061271d565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61154b8133611583565b8061155c575061155c816000611583565b6115785760405162461bcd60e51b815260040161059190612534565b611580612091565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000805160206128478339815191526115c58133611583565b806115d657506115d6816000611583565b6115f25760405162461bcd60e51b815260040161059190612534565b50600855565b60015460ff161561161b5760405162461bcd60e51b815260040161059190612582565b33838383600083116116835760405162461bcd60e51b815260206004820152603c602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416d6f756e74206d757374206265203e2030000000006064820152608401610591565b60045483101561170f5760405162461bcd60e51b815260206004820152605d602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416d6f756e74206d757374206265206174206c65617360648201527f7420746865206d696e206465706f73697420726571756972656d656e74000000608482015260a401610591565b60026003015483600b836040516117269190612654565b90815260200160405180910390205461173f91906125c2565b11156117c75760405162461bcd60e51b815260206004820152605b602482015260008051602061286783398151915260448201527f6e646974696f6e733a20546f74616c207374616b652063616e6e6f742065786360648201527f656564206d6178207374616b65207065722076616c696461746f720000000000608482015260a401610591565b6001600160a01b0384166000908152600a602052604081206004015460ff1660038111156117f7576117f76124ae565b146118665760405162461bcd60e51b8152602060048201526045602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416464726573732063616e206f6e6c79207374616b65606482015264206f6e636560d81b608482015260a401610591565b60006001600160a01b0316600c836040516118819190612654565b908152604051908190036020019020546001600160a01b03161461190f5760405162461bcd60e51b815260206004820152604b602482015260008051602061286783398151915260448201527f6e646974696f6e733a20536f6c616e612077616c6c65742063616e206f6e6c7960648201526a207374616b65206f6e636560a81b608482015260a401610591565b6000336040516323b872dd60e01b81526001600160a01b038083166004830152306024830152604482018b90529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af115801561198c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b09190612632565b611a225760405162461bcd60e51b815260206004820152603960248201527f5374616b696e67436f6e747261637456313a6465706f7369743a2043616e277460448201527f207472616e736665722074686520504f575220746f6b656e73000000000000006064820152608401610591565b6040805160e081018252898152600060208201529081018890526060810187905260808101600181526000602080830182905260409283018290526001600160a01b0385168252600a81529082902083518155838201516001820155918301518051611a94926002850192019061217a565b5060608201518051611ab091600384019160209091019061217a565b50608082015160048201805460ff19166001836003811115611ad457611ad46124ae565b021790555060a0820151816005015560c0820151816006015590505080600c88604051611b019190612654565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087600b87604051611b449190612654565b908152602001604051809103902054611b5d91906125c2565b600b87604051611b6d9190612654565b90815260405190819003602001902055600254611b8b9060016125c2565b600255600354611b9c9089906125c2565b6003556040516001600160a01b038216907fc70b95b0cd89bd53787d5cc0ee525046970ce79e0e869221a333b9085dcc326290611bde908b908b908b906127aa565b60405180910390a25050505050505050565b600080516020612847833981519152611c098133611583565b80611c1a5750611c1a816000611583565b611c365760405162461bcd60e51b815260040161059190612534565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60075460408051630240bc6b60e21b815290516000926001600160a01b031691839182918491630902f1ac916004808201926060929091908290030181865afa158015611caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cce91906127f6565b5091509150806001600160701b0316826001600160701b031686611cf291906125da565b611cfc91906125f9565b95945050505050565b600080516020612847833981519152611d1e8133611583565b80611d2f5750611d2f816000611583565b611d4b5760405162461bcd60e51b815260040161059190612534565b620186a0821115611d9e5760405162461bcd60e51b815260206004820152601b60248201527f4e657720526174696f206d757374206265203c3d2031303030303000000000006044820152606401610591565b50600655565b600082815260208190526040902060010154611dc08133611583565b80611dd15750611dd1816000611583565b611ded5760405162461bcd60e51b815260040161059190612534565b6105a4838361202c565b600a6020526000908152604090208054600182015460028301805492939192611e1f90612670565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4b90612670565b8015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b505050505090806003018054611ead90612670565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed990612670565b8015611f265780601f10611efb57610100808354040283529160200191611f26565b820191906000526020600020905b815481529060010190602001808311611f0957829003601f168201915b5050505060048301546005840154600690940154929360ff9091169290915087565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611f738133611583565b80611f845750611f84816000611583565b611fa05760405162461bcd60e51b815260040161059190612534565b611580612100565b611fb28282611583565b610653576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611fe83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120368282611583565b15610653576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60015460ff16156120b45760405162461bcd60e51b815260040161059190612582565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff166121495760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610591565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336120e3565b82805461218690612670565b90600052602060002090601f0160209004810192826121a857600085556121ee565b82601f106121c157805160ff19168380011785556121ee565b828001600101855582156121ee579182015b828111156121ee5782518255916020019190600101906121d3565b506121fa9291506121fe565b5090565b5b808211156121fa57600081556001016121ff565b60006020828403121561222557600080fd5b81356001600160e01b03198116811461223d57600080fd5b9392505050565b60006020828403121561225657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261228457600080fd5b813567ffffffffffffffff8082111561229f5761229f61225d565b604051601f8301601f19908116603f011681019082821181831017156122c7576122c761225d565b816040528381528660208588010111156122e057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561231257600080fd5b813567ffffffffffffffff81111561232957600080fd5b61233584828501612273565b949350505050565b80356001600160a01b038116811461235457600080fd5b919050565b6000806040838503121561236c57600080fd5b8235915061237c6020840161233d565b90509250929050565b60006020828403121561239757600080fd5b61223d8261233d565b600080604083850312156123b357600080fd5b823567ffffffffffffffff8111156123ca57600080fd5b6123d685828601612273565b95602094909401359450505050565b6000806000606084860312156123fa57600080fd5b83359250602084013567ffffffffffffffff8082111561241957600080fd5b61242587838801612273565b9350604086013591508082111561243b57600080fd5b5061244886828701612273565b9150509250925092565b60005b8381101561246d578181015183820152602001612455565b8381111561247c576000848401525b50505050565b6000815180845261249a816020860160208601612452565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b87815286602082015260e0604082015260006124e360e0830188612482565b82810360608401526124f58188612482565b9150506004851061251657634e487b7160e01b600052602160045260246000fd5b8460808301528360a08301528260c083015298975050505050505050565b6020808252602e908201527f5374616b654f7073436f6e74726f6c6c65723a2073656e64657220726571756960408201526d3932b9903832b936b4b9b9b4b7b760911b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125d5576125d56125ac565b500190565b60008160001904831182151516156125f4576125f46125ac565b500290565b60008261261657634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561262d5761262d6125ac565b500390565b60006020828403121561264457600080fd5b8151801515811461223d57600080fd5b60008251612666818460208701612452565b9190910192915050565b600181811c9082168061268457607f821691505b602082108114156126a557634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546126b981612670565b600182811680156126d157600181146126e257612711565b60ff19841687528287019450612711565b8760005260208060002060005b858110156127085781548a8201529084019082016126ef565b50505082870194505b50929695505050505050565b828152600060206040818401526000845461273781612670565b8060408701526060600180841660008114612759576001811461276d5761279b565b60ff1985168984015260808901955061279b565b896000528660002060005b858110156127935781548b8201860152908301908801612778565b8a0184019650505b50939998505050505050505050565b8381526060602082015260006127c36060830185612482565b82810360408401526127d58185612482565b9695505050505050565b80516001600160701b038116811461235457600080fd5b60008060006060848603121561280b57600080fd5b612814846127df565b9250612822602085016127df565b9150604084015163ffffffff8116811461283b57600080fd5b80915050925092509256fefe65bb5037f1b7be63451ff7f3ebaf4e64f4590b40ecaa29dcba1ae5fea515815374616b696e67436f6e747261637456313a636865636b4465706f736974436f5374616b696e67436f6e747261637456313a636865636b5769746864726177615374616b696e67436f6e747261637456313a77697468647261772043616e2774a264697066735822122003e1aa8b46affd464c2c923f9eb444ca925ad8c61545177d88c9c5175c37d8c664736f6c634300080b00335374616b654f7073436f6e74726f6c6c65723a204163636f756e7473206d7573fe65bb5037f1b7be63451ff7f3ebaf4e64f4590b40ecaa29dcba1ae5fea51581319a6c97bbc775b79a48583aa64d94a9ff20e69fb7d2fce8f81b40110d07a77765d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000292e662c822585778031ad6ac9f1d15bd45dcdc0000000000000000000000000cc4368a368144e405417e633aac88ad0cbae7bb70000000000000000000000009ba9b8db5b61029a0d6717c3d21e052e323ac1a60000000000000000000000003c442bab170f19dd40d0b1a405c9d93b088b9332000000000000000000000000000000000000000000000000000000000001fbd00000000000000000000000007ae39790f6dc6ddb27e2cab06ccd7b0bad6fe4a0

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063907af6c011610104578063b2237ba3116100a2578063eaacbf6311610071578063eaacbf631461045e578063ec1ebd7a146104da578063ed0693ff146104e2578063f7b188a51461050957600080fd5b8063b2237ba3146103eb578063d547741f146103fe578063e5f0c4b814610411578063e63ab1e91461043757600080fd5b806397695d93116100de57806397695d93146103aa578063a217fddf146103bd578063abe110b6146103c5578063b1d36894146103d857600080fd5b8063907af6c01461037a57806391d148541461038457806397498a9a1461039757600080fd5b80633c2fc4cc1161017c5780635c975abb1161014b5780635c975abb1461032957806375b8c97b146103345780637e229f3d146103475780638456cb591461037257600080fd5b80633c2fc4cc146102e65780633ccfd60b146102fb5780634b2a12da146103035780635305f1821461031657600080fd5b80632f2ff15d116101b85780632f2ff15d1461028457806330ccebb51461029957806336568abe146102ac578063384f3475146102bf57600080fd5b806301ffc9a7146101df578063248a9ca3146102075780632d5fcddf14610238575b600080fd5b6101f26101ed366004612213565b610511565b60405190151581526020015b60405180910390f35b61022a610215366004612244565b60009081526020819052604090206001015490565b6040519081526020016101fe565b61026c610246366004612300565b8051602081830181018051600c825292820191909301209152546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b610297610292366004612359565b610548565b005b61022a6102a7366004612385565b6105a9565b6102976102ba366004612359565b6105d9565b61026c7f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a36126981565b61022a60008051602061284783398151915281565b610297610657565b610297610311366004612244565b610f02565b6102976103243660046123a0565b610f5c565b60015460ff166101f2565b6102976103423660046123a0565b611255565b61022a610355366004612300565b8051602081830181018051600b8252928201919093012091525481565b610297611520565b61022a620f424081565b6101f2610392366004612359565b611583565b6102976103a5366004612244565b6115ac565b6102976103b83660046123e5565b6115f8565b61022a600081565b6102976103d3366004612385565b611bf0565b61022a6103e6366004612244565b611c59565b6102976103f9366004612244565b611d05565b61029761040c366004612359565b611da4565b61042461041f366004612385565b611df7565b6040516101fe97969594939291906124c4565b61022a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6002546003546004546005546006546007546008546009546104909796959493926001600160a01b0390811692911688565b60408051988952602089019790975295870194909452606086019290925260808501526001600160a01b0390811660a085015260c08401919091521660e0820152610100016101fe565b60065461022a565b61022a7f319a6c97bbc775b79a48583aa64d94a9ff20e69fb7d2fce8f81b40110d07a77781565b610297611f48565b60006001600160e01b03198216637965db0b60e01b148061054257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152602081905260409020600101546105648133611583565b806105755750610575816000611583565b61059a5760405162461bcd60e51b815260040161059190612534565b60405180910390fd5b6105a48383611fa8565b505050565b6001600160a01b0381166000908152600a602052604081206004015460ff166003811115610542576105426124ae565b6001600160a01b03811633146106495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610591565b610653828261202c565b5050565b60015460ff161561067a5760405162461bcd60e51b815260040161059190612582565b336000818152600a602052604090206004015460039060ff16818111156106a3576106a36124ae565b14156107135760405162461bcd60e51b815260206004820152604460248201819052600080516020612887833981519152908201527f6c436f6e646974696f6e733a205374616b6520616c72656164792077697468646064820152633930bbb760e11b608482015260a401610591565b60026001600160a01b0382166000908152600a602052604090206004015460ff166003811115610745576107456124ae565b146107cc5760405162461bcd60e51b815260206004820152605b602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a205374616b6520686173206e6f74206265656e2060648201527f756e7374616b6564206f722063616e6e6f7420626520666f756e640000000000608482015260a401610591565b6001600160a01b0381166000908152600a60205260408120600181015490546107f591906125c2565b116108605760405162461bcd60e51b8152602060048201526041602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a204e6f207374616b6520746f20776974686472616064820152607760f81b608482015260a401610591565b6001600160a01b0381166000908152600a60205260409020600601546108899062093a806125c2565b4210156109125760405162461bcd60e51b8152602060048201526058602482015260008051602061288783398151915260448201527f6c436f6e646974696f6e733a20372064617973206e65656420746f207061737360648201527f206265666f726520796f752063616e2077697468647261770000000000000000608482015260a401610591565b336000818152600a6020526040812080546006546001909201549092916127109161093d91906125da565b61094791906125f9565b6001600160a01b0384166000908152600a60205260408120600501549192509061097090611c59565b6001600160a01b0385166000908152600a602052604081208181556001810191909155600401805460ff191660031790559050818110610c865760006109b6838361261b565b905080841015610a425760405162461bcd60e51b815260206004820152604b60248201527f5374616b696e67436f6e747261637456313a7769746864726177204e6f74206560448201527f6e6f75676820504f575220696e207374616b6520746f20636f7665722077697460648201526a6864726177616c2066656560a81b608482015260a401610591565b6000610a4e828661261b565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a3612699091169063a9059cbb906044016020604051808303816000875af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae69190612632565b610b5f5760405162461bcd60e51b815260206004820152605060248201526000805160206128a783398151915260448201527f207472616e736665722072656d61696e696e6720504f575220746f6b656e732060648201526f1cdd185ada5b99c818dbdb9d1c9858dd60821b608482015260a401610591565b6009546001600160a01b037f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a36126981169163a9059cbb9116610b9f848961261b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0e9190612632565b610c7f5760405162461bcd60e51b815260206004820152604860248201526000805160206128a783398151915260448201527f207472616e7366657220504f5752206665652066726f6d207374616b696e672060648201526718dbdb9d1c9858dd60c21b608482015260a401610591565b5050610eb7565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590527f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269169063a9059cbb906044016020604051808303816000875af1158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d199190612632565b610d8d5760405162461bcd60e51b815260206004820152604b60248201526000805160206128a783398151915260448201527f207472616e7366657220504f575220746f6b656e732066726f6d207374616b6960648201526a1b99c818dbdb9d1c9858dd60aa1b608482015260a401610591565b6009546001600160a01b037f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a3612698116916323b872dd911686610dce858761261b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e469190612632565b610eb75760405162461bcd60e51b815260206004820152604860248201526000805160206128a783398151915260448201527f207472616e7366657220504f575220746f6b656e732066726f6d2061646d696e606482015267081858d8dbdd5b9d60c21b608482015260a401610591565b60408051848152602081018490526001600160a01b038616917f933735aa8de6d7547d0126171b2f31b9c34dd00f3ecd4be85a0ba047db4fafef910160405180910390a25050505050565b600080516020612847833981519152610f1b8133611583565b80610f2c5750610f2c816000611583565b610f485760405162461bcd60e51b815260040161059190612534565b610f55620f4240836125da565b6004555050565b600080516020612847833981519152610f758133611583565b80610f865750610f86816000611583565b610fa25760405162461bcd60e51b815260040161059190612534565b6000600c84604051610fb49190612654565b908152604051908190036020019020546001600160a01b0316905060016001600160a01b0382166000908152600a602052604090206004015460ff166003811115611001576110016124ae565b148061103c575060026001600160a01b0382166000908152600a602052604090206004015460ff16600381111561103a5761103a6124ae565b145b6110cb5760405162461bcd60e51b815260206004820152605460248201527f5374616b696e67436f6e747261637456313a666f726365556e6c6f636b53746160448201527f6b653a205374616b65206d75737420626520696e20276465706f736974656427606482015273206f722027756e7374616b65642720737461746560601b608482015260a401610591565b6001600160a01b0381166000908152600a6020526040902060048101805460ff19166002179055600101839055600854611106903a906125da565b6001600160a01b0382166000908152600a6020526040902060058101919091554260069091015560025461113c9060019061261b565b6002556001600160a01b0381166000908152600a6020526040902054600354611165919061261b565b60039081556001600160a01b0382166000908152600a602052604090819020805491519192600b9261119a92909101906126ab565b9081526020016040518091039020546111b3919061261b565b600b600a6000846001600160a01b03166001600160a01b031681526020019081526020016000206003016040516111ea91906126ab565b908152604080519182900360209081018320939093556001600160a01b0384166000818152600a909452922080547f1ffb42f2d7426eea82a58c305d92c45622b4e604d19e5332e91f79d0d3c815cc92611247926002019061271d565b60405180910390a250505050565b60015460ff16156112785760405162461bcd60e51b815260040161059190612582565b7f319a6c97bbc775b79a48583aa64d94a9ff20e69fb7d2fce8f81b40110d07a7776112a38133611583565b806112b457506112b4816000611583565b6112d05760405162461bcd60e51b815260040161059190612534565b6000600c846040516112e29190612654565b908152604051908190036020019020546001600160a01b0316905060016001600160a01b0382166000908152600a602052604090206004015460ff16600381111561132f5761132f6124ae565b146113a4576040805162461bcd60e51b81526020600482015260248101919091527f5374616b696e67436f6e747261637456313a756e6c6f636b5374616b6520537460448201527f616b65206d75737420626520696e20276465706f7369746564272073746174656064820152608401610591565b6001600160a01b0381166000908152600a6020526040902060048101805460ff191660021790556001018390556008546113df903a906125da565b6001600160a01b0382166000908152600a602052604090206005810191909155426006909101556002546114159060019061261b565b6002556001600160a01b0381166000908152600a602052604090205460035461143e919061261b565b60039081556001600160a01b0382166000908152600a602052604090819020805491519192600b9261147392909101906126ab565b90815260200160405180910390205461148c919061261b565b600b600a6000846001600160a01b03166001600160a01b031681526020019081526020016000206003016040516114c391906126ab565b908152604080519182900360209081018320939093556001600160a01b0384166000818152600a909452922080547fc811f8947c7b68292b8fe0dddc194669b2a7daa45020b60fa7e4dd44704dd2c392611247926002019061271d565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61154b8133611583565b8061155c575061155c816000611583565b6115785760405162461bcd60e51b815260040161059190612534565b611580612091565b50565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000805160206128478339815191526115c58133611583565b806115d657506115d6816000611583565b6115f25760405162461bcd60e51b815260040161059190612534565b50600855565b60015460ff161561161b5760405162461bcd60e51b815260040161059190612582565b33838383600083116116835760405162461bcd60e51b815260206004820152603c602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416d6f756e74206d757374206265203e2030000000006064820152608401610591565b60045483101561170f5760405162461bcd60e51b815260206004820152605d602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416d6f756e74206d757374206265206174206c65617360648201527f7420746865206d696e206465706f73697420726571756972656d656e74000000608482015260a401610591565b60026003015483600b836040516117269190612654565b90815260200160405180910390205461173f91906125c2565b11156117c75760405162461bcd60e51b815260206004820152605b602482015260008051602061286783398151915260448201527f6e646974696f6e733a20546f74616c207374616b652063616e6e6f742065786360648201527f656564206d6178207374616b65207065722076616c696461746f720000000000608482015260a401610591565b6001600160a01b0384166000908152600a602052604081206004015460ff1660038111156117f7576117f76124ae565b146118665760405162461bcd60e51b8152602060048201526045602482015260008051602061286783398151915260448201527f6e646974696f6e733a20416464726573732063616e206f6e6c79207374616b65606482015264206f6e636560d81b608482015260a401610591565b60006001600160a01b0316600c836040516118819190612654565b908152604051908190036020019020546001600160a01b03161461190f5760405162461bcd60e51b815260206004820152604b602482015260008051602061286783398151915260448201527f6e646974696f6e733a20536f6c616e612077616c6c65742063616e206f6e6c7960648201526a207374616b65206f6e636560a81b608482015260a401610591565b6000336040516323b872dd60e01b81526001600160a01b038083166004830152306024830152604482018b90529192507f000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269909116906323b872dd906064016020604051808303816000875af115801561198c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b09190612632565b611a225760405162461bcd60e51b815260206004820152603960248201527f5374616b696e67436f6e747261637456313a6465706f7369743a2043616e277460448201527f207472616e736665722074686520504f575220746f6b656e73000000000000006064820152608401610591565b6040805160e081018252898152600060208201529081018890526060810187905260808101600181526000602080830182905260409283018290526001600160a01b0385168252600a81529082902083518155838201516001820155918301518051611a94926002850192019061217a565b5060608201518051611ab091600384019160209091019061217a565b50608082015160048201805460ff19166001836003811115611ad457611ad46124ae565b021790555060a0820151816005015560c0820151816006015590505080600c88604051611b019190612654565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087600b87604051611b449190612654565b908152602001604051809103902054611b5d91906125c2565b600b87604051611b6d9190612654565b90815260405190819003602001902055600254611b8b9060016125c2565b600255600354611b9c9089906125c2565b6003556040516001600160a01b038216907fc70b95b0cd89bd53787d5cc0ee525046970ce79e0e869221a333b9085dcc326290611bde908b908b908b906127aa565b60405180910390a25050505050505050565b600080516020612847833981519152611c098133611583565b80611c1a5750611c1a816000611583565b611c365760405162461bcd60e51b815260040161059190612534565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60075460408051630240bc6b60e21b815290516000926001600160a01b031691839182918491630902f1ac916004808201926060929091908290030181865afa158015611caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cce91906127f6565b5091509150806001600160701b0316826001600160701b031686611cf291906125da565b611cfc91906125f9565b95945050505050565b600080516020612847833981519152611d1e8133611583565b80611d2f5750611d2f816000611583565b611d4b5760405162461bcd60e51b815260040161059190612534565b620186a0821115611d9e5760405162461bcd60e51b815260206004820152601b60248201527f4e657720526174696f206d757374206265203c3d2031303030303000000000006044820152606401610591565b50600655565b600082815260208190526040902060010154611dc08133611583565b80611dd15750611dd1816000611583565b611ded5760405162461bcd60e51b815260040161059190612534565b6105a4838361202c565b600a6020526000908152604090208054600182015460028301805492939192611e1f90612670565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4b90612670565b8015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b505050505090806003018054611ead90612670565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed990612670565b8015611f265780601f10611efb57610100808354040283529160200191611f26565b820191906000526020600020905b815481529060010190602001808311611f0957829003601f168201915b5050505060048301546005840154600690940154929360ff9091169290915087565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611f738133611583565b80611f845750611f84816000611583565b611fa05760405162461bcd60e51b815260040161059190612534565b611580612100565b611fb28282611583565b610653576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611fe83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120368282611583565b15610653576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60015460ff16156120b45760405162461bcd60e51b815260040161059190612582565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a1565b60015460ff166121495760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610591565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336120e3565b82805461218690612670565b90600052602060002090601f0160209004810192826121a857600085556121ee565b82601f106121c157805160ff19168380011785556121ee565b828001600101855582156121ee579182015b828111156121ee5782518255916020019190600101906121d3565b506121fa9291506121fe565b5090565b5b808211156121fa57600081556001016121ff565b60006020828403121561222557600080fd5b81356001600160e01b03198116811461223d57600080fd5b9392505050565b60006020828403121561225657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261228457600080fd5b813567ffffffffffffffff8082111561229f5761229f61225d565b604051601f8301601f19908116603f011681019082821181831017156122c7576122c761225d565b816040528381528660208588010111156122e057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561231257600080fd5b813567ffffffffffffffff81111561232957600080fd5b61233584828501612273565b949350505050565b80356001600160a01b038116811461235457600080fd5b919050565b6000806040838503121561236c57600080fd5b8235915061237c6020840161233d565b90509250929050565b60006020828403121561239757600080fd5b61223d8261233d565b600080604083850312156123b357600080fd5b823567ffffffffffffffff8111156123ca57600080fd5b6123d685828601612273565b95602094909401359450505050565b6000806000606084860312156123fa57600080fd5b83359250602084013567ffffffffffffffff8082111561241957600080fd5b61242587838801612273565b9350604086013591508082111561243b57600080fd5b5061244886828701612273565b9150509250925092565b60005b8381101561246d578181015183820152602001612455565b8381111561247c576000848401525b50505050565b6000815180845261249a816020860160208601612452565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b87815286602082015260e0604082015260006124e360e0830188612482565b82810360608401526124f58188612482565b9150506004851061251657634e487b7160e01b600052602160045260246000fd5b8460808301528360a08301528260c083015298975050505050505050565b6020808252602e908201527f5374616b654f7073436f6e74726f6c6c65723a2073656e64657220726571756960408201526d3932b9903832b936b4b9b9b4b7b760911b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125d5576125d56125ac565b500190565b60008160001904831182151516156125f4576125f46125ac565b500290565b60008261261657634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561262d5761262d6125ac565b500390565b60006020828403121561264457600080fd5b8151801515811461223d57600080fd5b60008251612666818460208701612452565b9190910192915050565b600181811c9082168061268457607f821691505b602082108114156126a557634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546126b981612670565b600182811680156126d157600181146126e257612711565b60ff19841687528287019450612711565b8760005260208060002060005b858110156127085781548a8201529084019082016126ef565b50505082870194505b50929695505050505050565b828152600060206040818401526000845461273781612670565b8060408701526060600180841660008114612759576001811461276d5761279b565b60ff1985168984015260808901955061279b565b896000528660002060005b858110156127935781548b8201860152908301908801612778565b8a0184019650505b50939998505050505050505050565b8381526060602082015260006127c36060830185612482565b82810360408401526127d58185612482565b9695505050505050565b80516001600160701b038116811461235457600080fd5b60008060006060848603121561280b57600080fd5b612814846127df565b9250612822602085016127df565b9150604084015163ffffffff8116811461283b57600080fd5b80915050925092509256fefe65bb5037f1b7be63451ff7f3ebaf4e64f4590b40ecaa29dcba1ae5fea515815374616b696e67436f6e747261637456313a636865636b4465706f736974436f5374616b696e67436f6e747261637456313a636865636b5769746864726177615374616b696e67436f6e747261637456313a77697468647261772043616e2774a264697066735822122003e1aa8b46affd464c2c923f9eb444ca925ad8c61545177d88c9c5175c37d8c664736f6c634300080b0033

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

000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000292e662c822585778031ad6ac9f1d15bd45dcdc0000000000000000000000000cc4368a368144e405417e633aac88ad0cbae7bb70000000000000000000000009ba9b8db5b61029a0d6717c3d21e052e323ac1a60000000000000000000000003c442bab170f19dd40d0b1a405c9d93b088b9332000000000000000000000000000000000000000000000000000000000001fbd00000000000000000000000007ae39790f6dc6ddb27e2cab06ccd7b0bad6fe4a0

-----Decoded View---------------
Arg [0] : _powrToken (address): 0x595832F8FC6BF59c85C527fEC3740A1b7a361269
Arg [1] : _minPowrDeposit (uint256): 100
Arg [2] : _maxPowrPerValidator (uint256): 5000000
Arg [3] : _stakeOpsAdmin (address): 0x292E662C822585778031ad6Ac9F1d15bD45DCdc0
Arg [4] : _balanceUpdater (address): 0xCC4368a368144E405417e633aAc88AD0cbAe7BB7
Arg [5] : _pauser (address): 0x9ba9b8DB5b61029A0D6717C3d21E052e323ac1A6
Arg [6] : _powrEthPoolAddress (address): 0x3C442baB170F19Dd40D0b1a405C9d93b088B9332
Arg [7] : _unlockGasCost (uint256): 130000
Arg [8] : _rewardWallet (address): 0x7ae39790F6Dc6DdB27e2CAb06CCd7b0bAD6FE4A0

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000595832f8fc6bf59c85c527fec3740a1b7a361269
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [2] : 00000000000000000000000000000000000000000000000000000000004c4b40
Arg [3] : 000000000000000000000000292e662c822585778031ad6ac9f1d15bd45dcdc0
Arg [4] : 000000000000000000000000cc4368a368144e405417e633aac88ad0cbae7bb7
Arg [5] : 0000000000000000000000009ba9b8db5b61029a0d6717c3d21e052e323ac1a6
Arg [6] : 0000000000000000000000003c442bab170f19dd40d0b1a405c9d93b088b9332
Arg [7] : 000000000000000000000000000000000000000000000000000000000001fbd0
Arg [8] : 0000000000000000000000007ae39790f6dc6ddb27e2cab06ccd7b0bad6fe4a0


Deployed Bytecode Sourcemap

432:16851:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2771:204:0;;;;;;:::i;:::-;;:::i;:::-;;;470:14:14;;463:22;445:41;;433:2;418:18;2771:204:0;;;;;;;;4182:123;;;;;;:::i;:::-;4248:7;4275:12;;;;;;;;;;:22;;;;4182:123;;;;828:25:14;;;816:2;801:18;4182:123:0;682:177:14;860:60:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;860:60:12;;;;;;-1:-1:-1;;;;;2211:32:14;;;2193:51;;2181:2;2166:18;860:60:12;2047:203:14;4567:147:0;;;;;;:::i;:::-;;:::i;:::-;;13774:247:12;;;;;;:::i;:::-;;:::i;5615:218:0:-;;;;;;:::i;:::-;;:::i;534:33:12:-;;;;;734:80:10;;-1:-1:-1;;;;;;;;;;;734:80:10;;9372:2125:12;;;:::i;16040:175::-;;;;;;:::i;:::-;;:::i;12026:1549::-;;;;;;:::i;:::-;;:::i;1091:86:9:-;1162:7;;;;1091:86;;7296:1472:12;;;;;;:::i;:::-;;:::i;798:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16988:93;;;:::i;631:38::-;;662:7;631:38;;3067:139:0;;;;;;:::i;:::-;;:::i;16401:172:12:-;;;;;;:::i;:::-;;:::i;5339:1454::-;;;;;;:::i;:::-;;:::i;2150:49:0:-;;2195:4;2150:49;;16721:180:12;;;;;;:::i;:::-;;:::i;14294:476::-;;;;;;:::i;:::-;;:::i;15088:263::-;;;;;;:::i;:::-;;:::i;4959:149:0:-;;;;;;:::i;:::-;;:::i;732:57:12:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;908:62:10:-;;946:24;908:62;;678:45:12;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;678:45:12;;;;;;;;;;;;6399:25:14;;;6455:2;6440:18;;6433:34;;;;6483:18;;;6476:34;;;;6541:2;6526:18;;6519:34;;;;6584:3;6569:19;;6562:35;-1:-1:-1;;;;;6672:15:14;;;6624:3;6651:19;;6644:44;6719:3;6704:19;;6697:35;;;;6769:15;6763:3;6748:19;;6741:44;6386:3;6371:19;678:45:12;6056:735:14;15563:214:12;15702:20;;15563:214;;821:80:10;;868:33;821:80;;17183:97:12;;;:::i;2771:204:0:-;2856:4;-1:-1:-1;;;;;;2880:47:0;;-1:-1:-1;;;2880:47:0;;:87;;-1:-1:-1;;;;;;;;;;963:40:2;;;2931:36:0;2873:94;2771:204;-1:-1:-1;;2771:204:0:o;4567:147::-;4248:7;4275:12;;;;;;;;;;:22;;;2402:27:10;2410:4;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;;;;;;;;;4681:25:0::1;4692:4;4698:7;4681:10;:25::i;:::-;4567:147:::0;;;:::o;13774:247:12:-;-1:-1:-1;;;;;13934:26:12;;13869:18;13934:26;;;:7;:26;;;;;:38;;;;;13929:44;;;;;;;;:::i;5615:218:0:-;-1:-1:-1;;;;;5711:23:0;;737:10:1;5711:23:0;5703:83;;;;-1:-1:-1;;;5703:83:0;;7413:2:14;5703:83:0;;;7395:21:14;7452:2;7432:18;;;7425:30;7491:34;7471:18;;;7464:62;-1:-1:-1;;;7542:18:14;;;7535:45;7597:19;;5703:83:0;7211:411:14;5703:83:0;5799:26;5811:4;5817:7;5799:11;:26::i;:::-;5615:218;;:::o;9372:2125:12:-;1162:7:9;;;;1416:9;1408:38;;;;-1:-1:-1;;;1408:38:9;;;;;;;:::i;:::-;737:10:1;2534:14:12::1;::::0;;;:7:::1;:14;::::0;;;;:26:::1;;::::0;2564:21:::1;::::0;2534:26:::1;;:51:::0;;::::1;;;;;;:::i;:::-;;;2526:132;;;::::0;-1:-1:-1;;;2526:132:12;;8174:2:14;2526:132:12::1;::::0;::::1;8156:21:14::0;8213:2;8193:18;;;8186:30;;;-1:-1:-1;;;;;;;;;;;8232:18:14;;;8225:62;8323:34;8303:18;;;8296:62;-1:-1:-1;;;8374:19:14;;;8367:35;8419:19;;2526:132:12::1;7972:472:14::0;2526:132:12::1;2707:20;-1:-1:-1::0;;;;;2677:14:12;::::1;;::::0;;;:7:::1;:14;::::0;;;;:26:::1;;::::0;::::1;;:50;::::0;::::1;;;;;;:::i;:::-;;2669:154;;;::::0;-1:-1:-1;;;2669:154:12;;8651:2:14;2669:154:12::1;::::0;::::1;8633:21:14::0;8690:2;8670:18;;;8663:30;-1:-1:-1;;;;;;;;;;;8709:18:14;;;8702:62;8800:34;8780:18;;;8773:62;8872:29;8851:19;;;8844:58;8919:19;;2669:154:12::1;8449:495:14::0;2669:154:12::1;-1:-1:-1::0;;;;;2865:14:12;::::1;2895:1;2865:14:::0;;;:7:::1;:14;::::0;;;;:27:::1;::::0;::::1;::::0;2842:20;;:50:::1;::::0;2865:27;2842:50:::1;:::i;:::-;:54;2834:132;;;::::0;-1:-1:-1;;;2834:132:12;;9416:2:14;2834:132:12::1;::::0;::::1;9398:21:14::0;9455:2;9435:18;;;9428:30;-1:-1:-1;;;;;;;;;;;9474:18:14;;;9467:62;9565:34;9545:18;;;9538:62;-1:-1:-1;;;9616:19:14;;;9609:32;9658:19;;2834:132:12::1;9214:469:14::0;2834:132:12::1;-1:-1:-1::0;;;;;3005:14:12;::::1;;::::0;;;:7:::1;:14;::::0;;;;:31:::1;;::::0;:46:::1;::::0;3040:10:::1;3005:46;:::i;:::-;2985:15;:67;;2977:168;;;::::0;-1:-1:-1;;;2977:168:12;;9890:2:14;2977:168:12::1;::::0;::::1;9872:21:14::0;9929:2;9909:18;;;9902:30;-1:-1:-1;;;;;;;;;;;9948:18:14;;;9941:62;10039:34;10019:18;;;10012:62;10111:26;10090:19;;;10083:55;10155:19;;2977:168:12::1;9688:492:14::0;2977:168:12::1;737:10:1::0;9496:24:12::2;9572:25:::0;;;:7:::2;:25;::::0;;;;:31;;9682:20;;9641:38:::2;::::0;;::::2;::::0;9572:31;;9496:24;9705:5:::2;::::0;9641:61:::2;::::0;9682:20;9641:61:::2;:::i;:::-;:69;;;;:::i;:::-;-1:-1:-1::0;;;;;9765:25:12;::::2;9725:15;9765:25:::0;;;:7:::2;:25;::::0;;;;:32:::2;;::::0;9618:92;;-1:-1:-1;9725:15:12;9748:50:::2;::::0;:16:::2;:50::i;:::-;-1:-1:-1::0;;;;;9876:25:12;::::2;9910:1;9876:25:::0;;;:7:::2;:25;::::0;;;;:35;;;9926:38:::2;::::0;::::2;:42:::0;;;;9983:37:::2;;:61:::0;;-1:-1:-1;;9983:61:12::2;10023:21;9983:61;::::0;;9725:74;-1:-1:-1;10360:23:12;;::::2;10357:1026;;10404:20;10427:22;10437:12:::0;10427:7;:22:::2;:::i;:::-;10404:45;;10491:12;10476:11;:27;;10468:115;;;::::0;-1:-1:-1;;;10468:115:12;;10912:2:14;10468:115:12::2;::::0;::::2;10894:21:14::0;10951:2;10931:18;;;10924:30;10990:34;10970:18;;;10963:62;11061:34;11041:18;;;11034:62;-1:-1:-1;;;11112:19:14;;;11105:42;11164:19;;10468:115:12::2;10710:479:14::0;10468:115:12::2;10602:22;10627:26;10641:12:::0;10627:11;:26:::2;:::i;:::-;10680:52;::::0;-1:-1:-1;;;10680:52:12;;-1:-1:-1;;;;;11386:32:14;;;10680:52:12::2;::::0;::::2;11368:51:14::0;11435:18;;;11428:34;;;10602:51:12;;-1:-1:-1;10680:9:12::2;:18:::0;;::::2;::::0;::::2;::::0;11341::14;;10680:52:12::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10672:145;;;::::0;-1:-1:-1;;;10672:145:12;;11957:2:14;10672:145:12::2;::::0;::::2;11939:21:14::0;11996:2;11976:18;;;11969:30;-1:-1:-1;;;;;;;;;;;12015:18:14;;;12008:62;12106:34;12086:18;;;12079:62;-1:-1:-1;;;12157:19:14;;;12150:47;12214:19;;10672:145:12::2;11755:484:14::0;10672:145:12::2;10863:23:::0;;-1:-1:-1;;;;;10844:9:12::2;:18:::0;::::2;::::0;::::2;::::0;10863:23:::2;10888:28;10902:14:::0;10888:11;:28:::2;:::i;:::-;10844:73;::::0;-1:-1:-1;;;;;;10844:73:12::2;::::0;;;;;;-1:-1:-1;;;;;11386:32:14;;;10844:73:12::2;::::0;::::2;11368:51:14::0;11435:18;;;11428:34;11341:18;;10844:73:12::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10836:158;;;::::0;-1:-1:-1;;;10836:158:12;;12446:2:14;10836:158:12::2;::::0;::::2;12428:21:14::0;12485:2;12465:18;;;12458:30;-1:-1:-1;;;;;;;;;;;12504:18:14;;;12497:62;12595:34;12575:18;;;12568:62;-1:-1:-1;;;12646:19:14;;;12639:39;12695:19;;10836:158:12::2;12244:476:14::0;10836:158:12::2;10385:627;;10357:1026;;;11045:49;::::0;-1:-1:-1;;;11045:49:12;;-1:-1:-1;;;;;11386:32:14;;;11045:49:12::2;::::0;::::2;11368:51:14::0;11435:18;;;11428:34;;;11045:9:12::2;:18;::::0;::::2;::::0;11341::14;;11045:49:12::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11037:137;;;::::0;-1:-1:-1;;;11037:137:12;;12927:2:14;11037:137:12::2;::::0;::::2;12909:21:14::0;12966:2;12946:18;;;12939:30;-1:-1:-1;;;;;;;;;;;12985:18:14;;;12978:62;13076:34;13056:18;;;13049:62;-1:-1:-1;;;13127:19:14;;;13120:42;13179:19;;11037:137:12::2;12725:479:14::0;11037:137:12::2;11224:23:::0;;-1:-1:-1;;;;;11201:9:12::2;:22:::0;::::2;::::0;::::2;::::0;11224:23:::2;11249:16:::0;11267:22:::2;11282:7:::0;11267:12;:22:::2;:::i;:::-;11201:89;::::0;-1:-1:-1;;;;;;11201:89:12::2;::::0;;;;;;-1:-1:-1;;;;;13467:15:14;;;11201:89:12::2;::::0;::::2;13449:34:14::0;13519:15;;;;13499:18;;;13492:43;13551:18;;;13544:34;13384:18;;11201:89:12::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11193:174;;;::::0;-1:-1:-1;;;11193:174:12;;13791:2:14;11193:174:12::2;::::0;::::2;13773:21:14::0;13830:2;13810:18;;;13803:30;-1:-1:-1;;;;;;;;;;;13849:18:14;;;13842:62;13940:34;13920:18;;;13913:62;-1:-1:-1;;;13991:19:14;;;13984:39;14040:19;;11193:174:12::2;13589:476:14::0;11193:174:12::2;11430:59;::::0;;14244:25:14;;;14300:2;14285:18;;14278:34;;;-1:-1:-1;;;;;11430:59:12;::::2;::::0;::::2;::::0;14217:18:14;11430:59:12::2;;;;;;;9481:2016;;;;1457:1:9::1;9372:2125:12:o:0;16040:175::-;-1:-1:-1;;;;;;;;;;;2402:27:10;781:33;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;16186:17:12::1;662:7;16186:10:::0;:17:::1;:::i;:::-;16158:25:::0;:45;-1:-1:-1;;16040:175:12:o;12026:1549::-;-1:-1:-1;;;;;;;;;;;2402:27:10;781:33;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;12276:24:12::1;12303;12328:13;12303:39;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;12303:39:12::1;::::0;-1:-1:-1;12303:39:12;-1:-1:-1;;;;;12369:25:12;::::1;;::::0;;;:7:::1;:25;::::0;;;;:37:::1;;::::0;::::1;;:62;::::0;::::1;;;;;;:::i;:::-;;:127;;;-1:-1:-1::0;12476:20:12::1;-1:-1:-1::0;;;;;12435:25:12;::::1;;::::0;;;:7:::1;:25;::::0;;;;:37:::1;;::::0;::::1;;:61;::::0;::::1;;;;;;:::i;:::-;;12369:127;12361:224;;;::::0;-1:-1:-1;;;12361:224:12;;14806:2:14;12361:224:12::1;::::0;::::1;14788:21:14::0;14845:2;14825:18;;;14818:30;14884:34;14864:18;;;14857:62;14955:34;14935:18;;;14928:62;-1:-1:-1;;;15006:19:14;;;14999:51;15067:19;;12361:224:12::1;14604:488:14::0;12361:224:12::1;-1:-1:-1::0;;;;;12665:25:12;::::1;;::::0;;;:7:::1;:25;::::0;;;;:37:::1;::::0;::::1;:60:::0;;-1:-1:-1;;12665:60:12::1;12705:20;12665:60;::::0;;;12744:38:::1;:54:::0;;;12852:24;;:36:::1;::::0;12877:11:::1;::::0;12852:36:::1;:::i;:::-;-1:-1:-1::0;;;;;12817:25:12;::::1;;::::0;;;:7:::1;:25;::::0;;;;:32:::1;::::0;::::1;:71:::0;;;;12952:15:::1;12907:42;::::0;;::::1;:60:::0;13063:10:::1;:21:::0;:25:::1;::::0;13087:1:::1;::::0;13063:25:::1;:::i;:::-;13039:10;:49:::0;-1:-1:-1;;;;;13157:25:12;::::1;13039:21;13157:25:::0;;;:7:::1;:25;::::0;;;;:31;13132:22;;:56:::1;::::0;13157:31;13132:56:::1;:::i;:::-;13107:22:::0;:81;;;-1:-1:-1;;;;;13369:25:12;::::1;;::::0;;;:7:::1;:25;::::0;;;;;;:31;;13288:78;;13369:31;;13288:19:::1;::::0;:78:::1;::::0;13308:57;;::::1;::::0;13288:78:::1;:::i;:::-;;;;;;;;;;;;;;:112;;;;:::i;:::-;13207:19;13227:7;:25;13235:16;-1:-1:-1::0;;;;;13227:25:12::1;-1:-1:-1::0;;;;;13227:25:12::1;;;;;;;;;;;;:57;;13207:78;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:193;;;;-1:-1:-1;;;;;13456:111:12;::::1;13491:25;::::0;;;:7:::1;:25:::0;;;;;:31;;13456:111:::1;::::0;::::1;::::0;13524:42:::1;;::::0;13456:111:::1;:::i;:::-;;;;;;;;12204:1371;12026:1549:::0;;;:::o;7296:1472::-;1162:7:9;;;;1416:9;1408:38;;;;-1:-1:-1;;;1408:38:9;;;;;;;:::i;:::-;868:33:10::1;2402:27;868:33:::0;737:10:1;3067:139:0;:::i;2402:27:10:-:1;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1::0;;;2394:115:10::1;;;;;;;:::i;:::-;7567:24:12::2;7594;7619:13;7594:39;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;-1:-1:-1;;;;;7594:39:12::2;::::0;-1:-1:-1;7594:39:12;-1:-1:-1;;;;;7660:25:12;::::2;;::::0;;;:7:::2;:25;::::0;;;;:37:::2;;::::0;::::2;;:62;::::0;::::2;;;;;;:::i;:::-;;7652:139;;;::::0;;-1:-1:-1;;;7652:139:12;;17505:2:14;7652:139:12::2;::::0;::::2;17487:21:14::0;17524:18;;;17517:30;;;;17583:34;17563:18;;;17556:62;17654:34;17634:18;;;17627:62;17706:19;;7652:139:12::2;17303:428:14::0;7652:139:12::2;-1:-1:-1::0;;;;;7871:25:12;::::2;;::::0;;;:7:::2;:25;::::0;;;;:37:::2;::::0;::::2;:60:::0;;-1:-1:-1;;7871:60:12::2;7911:20;7871:60;::::0;;;7950:38:::2;:54:::0;;;8058:24;;:36:::2;::::0;8083:11:::2;::::0;8058:36:::2;:::i;:::-;-1:-1:-1::0;;;;;8023:25:12;::::2;;::::0;;;:7:::2;:25;::::0;;;;:32:::2;::::0;::::2;:71:::0;;;;8158:15:::2;8113:42;::::0;;::::2;:60:::0;8261:10:::2;:21:::0;:25:::2;::::0;8285:1:::2;::::0;8261:25:::2;:::i;:::-;8237:10;:49:::0;-1:-1:-1;;;;;8355:25:12;::::2;8237:21;8355:25:::0;;;:7:::2;:25;::::0;;;;:31;8330:22;;:56:::2;::::0;8355:31;8330:56:::2;:::i;:::-;8305:22:::0;:81;;;-1:-1:-1;;;;;8567:25:12;::::2;;::::0;;;:7:::2;:25;::::0;;;;;;:31;;8486:78;;8567:31;;8486:19:::2;::::0;:78:::2;::::0;8506:57;;::::2;::::0;8486:78:::2;:::i;:::-;;;;;;;;;;;;;;:112;;;;:::i;:::-;8405:19;8425:7;:25;8433:16;-1:-1:-1::0;;;;;8425:25:12::2;-1:-1:-1::0;;;;;8425:25:12::2;;;;;;;;;;;;:57;;8405:78;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;:193;;;;-1:-1:-1;;;;;8654:106:12;::::2;8684:25;::::0;;;:7:::2;:25:::0;;;;;:31;;8654:106:::2;::::0;::::2;::::0;8717:42:::2;;::::0;8654:106:::2;:::i;16988:93::-:0;946:24:10;2402:27;946:24;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;17065:8:12::1;:6;:8::i;:::-;16988:93:::0;:::o;3067:139:0:-;3145:4;3169:12;;;;;;;;;;;-1:-1:-1;;;;;3169:29:0;;;;;;;;;;;;;;;3067:139::o;16401:172:12:-;-1:-1:-1;;;;;;;;;;;2402:27:10;781:33;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;-1:-1:-1;16523:24:12;:38;16401:172::o;5339:1454::-;1162:7:9;;;;1416:9;1408:38;;;;-1:-1:-1;;;1408:38:9;;;;;;;:::i;:::-;737:10:1;5562:7:12::1;5571:13;5586:16;1475:1;1465:7;:11;1457:84;;;::::0;-1:-1:-1;;;1457:84:12;;17938:2:14;1457:84:12::1;::::0;::::1;17920:21:14::0;17977:2;17957:18;;;17950:30;-1:-1:-1;;;;;;;;;;;17996:18:14;;;17989:62;18087:30;18067:18;;;18060:58;18135:19;;1457:84:12::1;17736:424:14::0;1457:84:12::1;1571:25:::0;;1560:36;::::1;;1552:142;;;::::0;-1:-1:-1;;;1552:142:12;;18367:2:14;1552:142:12::1;::::0;::::1;18349:21:14::0;18406:2;18386:18;;;18379:30;-1:-1:-1;;;;;;;;;;;18425:18:14;;;18418:62;18516:34;18496:18;;;18489:62;18588:31;18567:19;;;18560:60;18637:19;;1552:142:12::1;18165:497:14::0;1552:142:12::1;1764:10;:30;;;1753:7;1713:19;1733:16;1713:37;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;:::i;:::-;:81;;1705:185;;;::::0;-1:-1:-1;;;1705:185:12;;18869:2:14;1705:185:12::1;::::0;::::1;18851:21:14::0;18908:2;18888:18;;;18881:30;-1:-1:-1;;;;;;;;;;;18927:18:14;;;18920:62;19018:34;18998:18;;;18991:62;19090:29;19069:19;;;19062:58;19137:19;;1705:185:12::1;18667:495:14::0;1705:185:12::1;-1:-1:-1::0;;;;;1909:14:12;::::1;1939:23;1909:14:::0;;;:7:::1;:14;::::0;;;;:26:::1;;::::0;::::1;;:53;::::0;::::1;;;;;;:::i;:::-;;1901:135;;;::::0;-1:-1:-1;;;1901:135:12;;19369:2:14;1901:135:12::1;::::0;::::1;19351:21:14::0;19408:2;19388:18;;;19381:30;-1:-1:-1;;;;;;;;;;;19427:18:14;;;19420:62;19518:34;19498:18;;;19491:62;-1:-1:-1;;;19569:19:14;;;19562:36;19615:19;;1901:135:12::1;19167:473:14::0;1901:135:12::1;2106:1;-1:-1:-1::0;;;;;2055:53:12::1;:24;2080:13;2055:39;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;2055:39:12::1;:53;2047:141;;;::::0;-1:-1:-1;;;2047:141:12;;19847:2:14;2047:141:12::1;::::0;::::1;19829:21:14::0;19886:2;19866:18;;;19859:30;-1:-1:-1;;;;;;;;;;;19905:18:14;;;19898:62;19996:34;19976:18;;;19969:62;-1:-1:-1;;;20047:19:14;;;20040:42;20099:19;;2047:141:12::1;19645:479:14::0;2047:141:12::1;5636:24:::2;737:10:1::0;5776:64:12::2;::::0;-1:-1:-1;;;5776:64:12;;-1:-1:-1;;;;;13467:15:14;;;5776:64:12::2;::::0;::::2;13449:34:14::0;5825:4:12::2;13499:18:14::0;;;13492:43;13551:18;;;13544:34;;;5636:39:12;;-1:-1:-1;5776:9:12::2;:22:::0;;::::2;::::0;::::2;::::0;13384:18:14;;5776:64:12::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5768:134;;;::::0;-1:-1:-1;;;5768:134:12;;20331:2:14;5768:134:12::2;::::0;::::2;20313:21:14::0;20370:2;20350:18;;;20343:30;20409:34;20389:18;;;20382:62;20480:27;20460:18;;;20453:55;20525:19;;5768:134:12::2;20129:421:14::0;5768:134:12::2;5985:375;::::0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;5985:375:12::2;::::0;::::2;::::0;;;;;;;;;;;;;;;;6245:21:::2;5985:375:::0;;6297:1:::2;5985:375;::::0;;::::2;::::0;;;;;;;;;;-1:-1:-1;;;;;5957:25:12;::::2;::::0;;:7:::2;:25:::0;;;;;;:403;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;5957:403:12::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;5957:403:12::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;-1:-1:-1;;5957:403:12::2;::::0;;::::2;::::0;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6421:16;6379:24;6404:13;6379:39;;;;;;:::i;:::-;;;;;;;;;;;;;;:58;;;;;-1:-1:-1::0;;;;;6379:58:12::2;;;;;-1:-1:-1::0;;;;;6379:58:12::2;;;;;;6536:7;6496:19;6516:16;6496:37;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;:::i;:::-;6456:19;6476:16;6456:37;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:87;6586:10:::2;:21:::0;:25:::2;::::0;6610:1:::2;6586:25;:::i;:::-;6562:10;:49:::0;6655:22;;:32:::2;::::0;6680:7;;6655:32:::2;:::i;:::-;6630:22:::0;:57;6711:74:::2;::::0;-1:-1:-1;;;;;6711:74:12;::::2;::::0;::::2;::::0;::::2;::::0;6744:7;;6753:13;;6768:16;;6711:74:::2;:::i;:::-;;;;;;;;5617:1176;1457:1:9::1;;;;5339:1454:12::0;;;:::o;16721:180::-;-1:-1:-1;;;;;;;;;;;2402:27:10;781:33;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;-1:-1:-1;16847:23:12;:42;;-1:-1:-1;;;;;;16847:42:12::1;-1:-1:-1::0;;;;;16847:42:12;;;::::1;::::0;;;::::1;::::0;;16721:180::o;14294:476::-;14471:22;;14556:18;;;-1:-1:-1;;;14556:18:12;;;;14390;;-1:-1:-1;;;;;14471:22:12;;14390:18;;;;14471:22;;14556:16;;:18;;;;;;;;;;;;;;;14471:22;14556:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14509:65;;;;;14629:11;-1:-1:-1;;;;;14602:39:12;14614:12;-1:-1:-1;;;;;14603:23:12;:10;:23;;;;:::i;:::-;14602:39;;;;:::i;:::-;14589:52;14294:476;-1:-1:-1;;;;;14294:476:12:o;15088:263::-;-1:-1:-1;;;;;;;;;;;2402:27:10;781:33;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;15246:6:12::1;15233:9;:19;;15225:59;;;::::0;-1:-1:-1;;;15225:59:12;;21864:2:14;15225:59:12::1;::::0;::::1;21846:21:14::0;21903:2;21883:18;;;21876:30;21942:29;21922:18;;;21915:57;21989:18;;15225:59:12::1;21662:351:14::0;15225:59:12::1;-1:-1:-1::0;15303:20:12;:32;15088:263::o;4959:149:0:-;4248:7;4275:12;;;;;;;;;;:22;;;2402:27:10;2410:4;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;5074:26:0::1;5086:4;5092:7;5074:11;:26::i;732:57:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;732:57:12;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;732:57:12;:::o;17183:97::-;946:24:10;2402:27;946:24;737:10:1;3067:139:0;:::i;2402:27:10:-;:56;;;;2433:25;2441:4;2455:1;2433:7;:25::i;:::-;2394:115;;;;-1:-1:-1;;;2394:115:10;;;;;;;:::i;:::-;17262:10:12::1;:8;:10::i;7116:238:0:-:0;7200:22;7208:4;7214:7;7200;:22::i;:::-;7195:152;;7239:6;:12;;;;;;;;;;;-1:-1:-1;;;;;7239:29:0;;;;;;;;;:36;;-1:-1:-1;;7239:36:0;7271:4;7239:36;;;7322:12;737:10:1;;657:98;7322:12:0;-1:-1:-1;;;;;7295:40:0;7313:7;-1:-1:-1;;;;;7295:40:0;7307:4;7295:40;;;;;;;;;;7116:238;;:::o;7486:239::-;7570:22;7578:4;7584:7;7570;:22::i;:::-;7566:152;;;7641:5;7609:12;;;;;;;;;;;-1:-1:-1;;;;;7609:29:0;;;;;;;;;;:37;;-1:-1:-1;;7609:37:0;;;7666:40;737:10:1;;7609:12:0;;7666:40;;7641:5;7666:40;7486:239;;:::o;1891:118:9:-;1162:7;;;;1416:9;1408:38;;;;-1:-1:-1;;;1408:38:9;;;;;;;:::i;:::-;1961:4:::1;1951:14:::0;;-1:-1:-1;;1951:14:9::1;::::0;::::1;::::0;;1981:20:::1;737:10:1::0;1988:12:9::1;1981:20;::::0;-1:-1:-1;;;;;2211:32:14;;;2193:51;;2181:2;2166:18;1981:20:9::1;;;;;;;1891:118::o:0;2150:120::-;1162:7;;;;1686:41;;;;-1:-1:-1;;;1686:41:9;;22220:2:14;1686:41:9;;;22202:21:14;22259:2;22239:18;;;22232:30;-1:-1:-1;;;22278:18:14;;;22271:50;22338:18;;1686:41:9;22018:344:14;1686:41:9;2209:7:::1;:15:::0;;-1:-1:-1;;2209:15:9::1;::::0;;2240:22:::1;737:10:1::0;2249:12:9::1;657:98:1::0;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:14;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:14;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:14:o;497:180::-;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;-1:-1:-1;648:23:14;;497:180;-1:-1:-1;497:180:14:o;864:127::-;925:10;920:3;916:20;913:1;906:31;956:4;953:1;946:15;980:4;977:1;970:15;996:719;1039:5;1092:3;1085:4;1077:6;1073:17;1069:27;1059:55;;1110:1;1107;1100:12;1059:55;1146:6;1133:20;1172:18;1209:2;1205;1202:10;1199:36;;;1215:18;;:::i;:::-;1290:2;1284:9;1258:2;1344:13;;-1:-1:-1;;1340:22:14;;;1364:2;1336:31;1332:40;1320:53;;;1388:18;;;1408:22;;;1385:46;1382:72;;;1434:18;;:::i;:::-;1474:10;1470:2;1463:22;1509:2;1501:6;1494:18;1555:3;1548:4;1543:2;1535:6;1531:15;1527:26;1524:35;1521:55;;;1572:1;1569;1562:12;1521:55;1636:2;1629:4;1621:6;1617:17;1610:4;1602:6;1598:17;1585:54;1683:1;1676:4;1671:2;1663:6;1659:15;1655:26;1648:37;1703:6;1694:15;;;;;;996:719;;;;:::o;1720:322::-;1789:6;1842:2;1830:9;1821:7;1817:23;1813:32;1810:52;;;1858:1;1855;1848:12;1810:52;1898:9;1885:23;1931:18;1923:6;1920:30;1917:50;;;1963:1;1960;1953:12;1917:50;1986;2028:7;2019:6;2008:9;2004:22;1986:50;:::i;:::-;1976:60;1720:322;-1:-1:-1;;;;1720:322:14:o;2255:173::-;2323:20;;-1:-1:-1;;;;;2372:31:14;;2362:42;;2352:70;;2418:1;2415;2408:12;2352:70;2255:173;;;:::o;2433:254::-;2501:6;2509;2562:2;2550:9;2541:7;2537:23;2533:32;2530:52;;;2578:1;2575;2568:12;2530:52;2614:9;2601:23;2591:33;;2643:38;2677:2;2666:9;2662:18;2643:38;:::i;:::-;2633:48;;2433:254;;;;;:::o;2692:186::-;2751:6;2804:2;2792:9;2783:7;2779:23;2775:32;2772:52;;;2820:1;2817;2810:12;2772:52;2843:29;2862:9;2843:29;:::i;3472:390::-;3550:6;3558;3611:2;3599:9;3590:7;3586:23;3582:32;3579:52;;;3627:1;3624;3617:12;3579:52;3667:9;3654:23;3700:18;3692:6;3689:30;3686:50;;;3732:1;3729;3722:12;3686:50;3755;3797:7;3788:6;3777:9;3773:22;3755:50;:::i;:::-;3745:60;3852:2;3837:18;;;;3824:32;;-1:-1:-1;;;;3472:390:14:o;3867:611::-;3964:6;3972;3980;4033:2;4021:9;4012:7;4008:23;4004:32;4001:52;;;4049:1;4046;4039:12;4001:52;4085:9;4072:23;4062:33;;4146:2;4135:9;4131:18;4118:32;4169:18;4210:2;4202:6;4199:14;4196:34;;;4226:1;4223;4216:12;4196:34;4249:50;4291:7;4282:6;4271:9;4267:22;4249:50;:::i;:::-;4239:60;;4352:2;4341:9;4337:18;4324:32;4308:48;;4381:2;4371:8;4368:16;4365:36;;;4397:1;4394;4387:12;4365:36;;4420:52;4464:7;4453:8;4442:9;4438:24;4420:52;:::i;:::-;4410:62;;;3867:611;;;;;:::o;4483:258::-;4555:1;4565:113;4579:6;4576:1;4573:13;4565:113;;;4655:11;;;4649:18;4636:11;;;4629:39;4601:2;4594:10;4565:113;;;4696:6;4693:1;4690:13;4687:48;;;4731:1;4722:6;4717:3;4713:16;4706:27;4687:48;;4483:258;;;:::o;4746:::-;4788:3;4826:5;4820:12;4853:6;4848:3;4841:19;4869:63;4925:6;4918:4;4913:3;4909:14;4902:4;4895:5;4891:16;4869:63;:::i;:::-;4986:2;4965:15;-1:-1:-1;;4961:29:14;4952:39;;;;4993:4;4948:50;;4746:258;-1:-1:-1;;4746:258:14:o;5009:127::-;5070:10;5065:3;5061:20;5058:1;5051:31;5101:4;5098:1;5091:15;5125:4;5122:1;5115:15;5141:910;5492:6;5481:9;5474:25;5535:6;5530:2;5519:9;5515:18;5508:34;5578:3;5573:2;5562:9;5558:18;5551:31;5455:4;5605:46;5646:3;5635:9;5631:19;5623:6;5605:46;:::i;:::-;5699:9;5691:6;5687:22;5682:2;5671:9;5667:18;5660:50;5727:33;5753:6;5745;5727:33;:::i;:::-;5719:41;;;5790:1;5782:6;5779:13;5769:144;;5835:10;5830:3;5826:20;5823:1;5816:31;5870:4;5867:1;5860:15;5898:4;5895:1;5888:15;5769:144;5950:6;5944:3;5933:9;5929:19;5922:35;5994:6;5988:3;5977:9;5973:19;5966:35;6038:6;6032:3;6021:9;6017:19;6010:35;5141:910;;;;;;;;;;:::o;6796:410::-;6998:2;6980:21;;;7037:2;7017:18;;;7010:30;7076:34;7071:2;7056:18;;7049:62;-1:-1:-1;;;7142:2:14;7127:18;;7120:44;7196:3;7181:19;;6796:410::o;7627:340::-;7829:2;7811:21;;;7868:2;7848:18;;;7841:30;-1:-1:-1;;;7902:2:14;7887:18;;7880:46;7958:2;7943:18;;7627:340::o;8949:127::-;9010:10;9005:3;9001:20;8998:1;8991:31;9041:4;9038:1;9031:15;9065:4;9062:1;9055:15;9081:128;9121:3;9152:1;9148:6;9145:1;9142:13;9139:39;;;9158:18;;:::i;:::-;-1:-1:-1;9194:9:14;;9081:128::o;10185:168::-;10225:7;10291:1;10287;10283:6;10279:14;10276:1;10273:21;10268:1;10261:9;10254:17;10250:45;10247:71;;;10298:18;;:::i;:::-;-1:-1:-1;10338:9:14;;10185:168::o;10358:217::-;10398:1;10424;10414:132;;10468:10;10463:3;10459:20;10456:1;10449:31;10503:4;10500:1;10493:15;10531:4;10528:1;10521:15;10414:132;-1:-1:-1;10560:9:14;;10358:217::o;10580:125::-;10620:4;10648:1;10645;10642:8;10639:34;;;10653:18;;:::i;:::-;-1:-1:-1;10690:9:14;;10580:125::o;11473:277::-;11540:6;11593:2;11581:9;11572:7;11568:23;11564:32;11561:52;;;11609:1;11606;11599:12;11561:52;11641:9;11635:16;11694:5;11687:13;11680:21;11673:5;11670:32;11660:60;;11716:1;11713;11706:12;14323:276;14454:3;14492:6;14486:13;14508:53;14554:6;14549:3;14542:4;14534:6;14530:17;14508:53;:::i;:::-;14577:16;;;;;14323:276;-1:-1:-1;;14323:276:14:o;15097:380::-;15176:1;15172:12;;;;15219;;;15240:61;;15294:4;15286:6;15282:17;15272:27;;15240:61;15347:2;15339:6;15336:14;15316:18;15313:38;15310:161;;;15393:10;15388:3;15384:20;15381:1;15374:31;15428:4;15425:1;15418:15;15456:4;15453:1;15446:15;15310:161;;15097:380;;;:::o;15482:813::-;15610:3;15639:1;15672:6;15666:13;15702:36;15728:9;15702:36;:::i;:::-;15757:1;15774:18;;;15801:104;;;;15919:1;15914:356;;;;15767:503;;15801:104;-1:-1:-1;;15834:24:14;;15822:37;;15879:16;;;;-1:-1:-1;15801:104:14;;15914:356;15945:6;15942:1;15935:17;15975:4;16020:2;16017:1;16007:16;16045:1;16059:165;16073:6;16070:1;16067:13;16059:165;;;16151:14;;16138:11;;;16131:35;16194:16;;;;16088:10;;16059:165;;;16063:3;;;16253:6;16248:3;16244:16;16237:23;;15767:503;-1:-1:-1;16286:3:14;;15482:813;-1:-1:-1;;;;;;15482:813:14:o;16300:998::-;16474:6;16463:9;16456:25;16437:4;16500:2;16538;16533;16522:9;16518:18;16511:30;16561:1;16594:6;16588:13;16624:36;16650:9;16624:36;:::i;:::-;16696:6;16691:2;16680:9;16676:18;16669:34;16722:2;16743:1;16775:2;16764:9;16760:18;16792:1;16787:122;;;;16923:1;16918:354;;;;16753:519;;16787:122;-1:-1:-1;;16835:24:14;;16815:18;;;16808:52;16895:3;16880:19;;;-1:-1:-1;16787:122:14;;16918:354;16949:6;16946:1;16939:17;16997:2;16994:1;16984:16;17022:1;17036:180;17050:6;17047:1;17044:13;17036:180;;;17143:14;;17119:17;;;17115:26;;17108:50;17186:16;;;;17065:10;;17036:180;;;17240:17;;17236:26;;;-1:-1:-1;;16753:519:14;-1:-1:-1;17289:3:14;;16300:998;-1:-1:-1;;;;;;;;;16300:998:14:o;20555:454::-;20780:6;20769:9;20762:25;20823:2;20818;20807:9;20803:18;20796:30;20743:4;20849:45;20890:2;20879:9;20875:18;20867:6;20849:45;:::i;:::-;20942:9;20934:6;20930:22;20925:2;20914:9;20910:18;20903:50;20970:33;20996:6;20988;20970:33;:::i;:::-;20962:41;20555:454;-1:-1:-1;;;;;;20555:454:14:o;21014:188::-;21093:13;;-1:-1:-1;;;;;21135:42:14;;21125:53;;21115:81;;21192:1;21189;21182:12;21207:450;21294:6;21302;21310;21363:2;21351:9;21342:7;21338:23;21334:32;21331:52;;;21379:1;21376;21369:12;21331:52;21402:40;21432:9;21402:40;:::i;:::-;21392:50;;21461:49;21506:2;21495:9;21491:18;21461:49;:::i;:::-;21451:59;;21553:2;21542:9;21538:18;21532:25;21597:10;21590:5;21586:22;21579:5;21576:33;21566:61;;21623:1;21620;21613:12;21566:61;21646:5;21636:15;;;21207:450;;;;;:::o

Swarm Source

ipfs://03e1aa8b46affd464c2c923f9eb444ca925ad8c61545177d88c9c5175c37d8c6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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