ETH Price: $3,350.02 (+1.84%)

Contract

0xba33Aa06901B7662e17869f588b77c04fb0Cd872
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw216505182025-01-18 9:37:113 days ago1737193031IN
0xba33Aa06...4fb0Cd872
0 ETH0.0010180212.98522607
Withdraw216339922025-01-16 2:14:235 days ago1736993663IN
0xba33Aa06...4fb0Cd872
0 ETH0.000348653.65083879
Withdraw215892742025-01-09 20:21:3511 days ago1736454095IN
0xba33Aa06...4fb0Cd872
0 ETH0.0015641916.37918326
Withdraw215892312025-01-09 20:12:5911 days ago1736453579IN
0xba33Aa06...4fb0Cd872
0 ETH0.001221412.78968638
Withdraw215869342025-01-09 12:30:5912 days ago1736425859IN
0xba33Aa06...4fb0Cd872
0 ETH0.000477556.09137012
Withdraw215585872025-01-05 13:30:4716 days ago1736083847IN
0xba33Aa06...4fb0Cd872
0 ETH0.0008126110.36515817
Withdraw215500532025-01-04 8:55:2317 days ago1735980923IN
0xba33Aa06...4fb0Cd872
0 ETH0.000686697.19059926
Withdraw215398192025-01-02 22:37:2318 days ago1735857443IN
0xba33Aa06...4fb0Cd872
0 ETH0.00092019.63465649
Withdraw215384222025-01-02 17:56:3519 days ago1735840595IN
0xba33Aa06...4fb0Cd872
0 ETH0.0012799813.40313061
Withdraw215058532024-12-29 4:51:1123 days ago1735447871IN
0xba33Aa06...4fb0Cd872
0 ETH0.0003223.37179068
Withdraw215058022024-12-29 4:40:5923 days ago1735447259IN
0xba33Aa06...4fb0Cd872
0 ETH0.000260933.32825597
Withdraw214940542024-12-27 13:20:2325 days ago1735305623IN
0xba33Aa06...4fb0Cd872
0 ETH0.000693487.26170555
Withdraw214916122024-12-27 5:08:4725 days ago1735276127IN
0xba33Aa06...4fb0Cd872
0 ETH0.000351873.68459357
Withdraw214585712024-12-22 14:15:4730 days ago1734876947IN
0xba33Aa06...4fb0Cd872
0 ETH0.000720477.54429318
Withdraw214492942024-12-21 7:08:4731 days ago1734764927IN
0xba33Aa06...4fb0Cd872
0 ETH0.00062828.01295415
Withdraw214270512024-12-18 4:32:1134 days ago1734496331IN
0xba33Aa06...4fb0Cd872
0 ETH0.0008771811.18877257
Withdraw214150412024-12-16 12:20:4736 days ago1734351647IN
0xba33Aa06...4fb0Cd872
0 ETH0.0011554712.51472187
Withdraw214044532024-12-15 0:51:2337 days ago1734223883IN
0xba33Aa06...4fb0Cd872
0 ETH0.000728317.62643242
Withdraw213952022024-12-13 17:52:1139 days ago1734112331IN
0xba33Aa06...4fb0Cd872
0 ETH0.0017608522.46015122
Withdraw213926112024-12-13 9:11:3539 days ago1734081095IN
0xba33Aa06...4fb0Cd872
0 ETH0.001636217.1332312
Withdraw213920832024-12-13 7:25:2339 days ago1734074723IN
0xba33Aa06...4fb0Cd872
0 ETH0.0010428310.91989267
Withdraw213905292024-12-13 2:13:1139 days ago1734055991IN
0xba33Aa06...4fb0Cd872
0 ETH0.0012526613.11706319
Withdraw213901432024-12-13 0:55:3539 days ago1734051335IN
0xba33Aa06...4fb0Cd872
0 ETH0.000933111.9019764
Withdraw213891222024-12-12 21:29:4739 days ago1734038987IN
0xba33Aa06...4fb0Cd872
0 ETH0.001714117.94891839
Withdraw213866572024-12-12 13:15:1140 days ago1734009311IN
0xba33Aa06...4fb0Cd872
0 ETH0.0022544223.60680972
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.