More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,826 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21650518 | 3 days ago | IN | 0 ETH | 0.00101802 | ||||
Withdraw | 21633992 | 5 days ago | IN | 0 ETH | 0.00034865 | ||||
Withdraw | 21589274 | 11 days ago | IN | 0 ETH | 0.00156419 | ||||
Withdraw | 21589231 | 11 days ago | IN | 0 ETH | 0.0012214 | ||||
Withdraw | 21586934 | 12 days ago | IN | 0 ETH | 0.00047755 | ||||
Withdraw | 21558587 | 16 days ago | IN | 0 ETH | 0.00081261 | ||||
Withdraw | 21550053 | 17 days ago | IN | 0 ETH | 0.00068669 | ||||
Withdraw | 21539819 | 18 days ago | IN | 0 ETH | 0.0009201 | ||||
Withdraw | 21538422 | 19 days ago | IN | 0 ETH | 0.00127998 | ||||
Withdraw | 21505853 | 23 days ago | IN | 0 ETH | 0.000322 | ||||
Withdraw | 21505802 | 23 days ago | IN | 0 ETH | 0.00026093 | ||||
Withdraw | 21494054 | 25 days ago | IN | 0 ETH | 0.00069348 | ||||
Withdraw | 21491612 | 25 days ago | IN | 0 ETH | 0.00035187 | ||||
Withdraw | 21458571 | 30 days ago | IN | 0 ETH | 0.00072047 | ||||
Withdraw | 21449294 | 31 days ago | IN | 0 ETH | 0.0006282 | ||||
Withdraw | 21427051 | 34 days ago | IN | 0 ETH | 0.00087718 | ||||
Withdraw | 21415041 | 36 days ago | IN | 0 ETH | 0.00115547 | ||||
Withdraw | 21404453 | 37 days ago | IN | 0 ETH | 0.00072831 | ||||
Withdraw | 21395202 | 39 days ago | IN | 0 ETH | 0.00176085 | ||||
Withdraw | 21392611 | 39 days ago | IN | 0 ETH | 0.0016362 | ||||
Withdraw | 21392083 | 39 days ago | IN | 0 ETH | 0.00104283 | ||||
Withdraw | 21390529 | 39 days ago | IN | 0 ETH | 0.00125266 | ||||
Withdraw | 21390143 | 39 days ago | IN | 0 ETH | 0.0009331 | ||||
Withdraw | 21389122 | 39 days ago | IN | 0 ETH | 0.0017141 | ||||
Withdraw | 21386657 | 40 days ago | IN | 0 ETH | 0.00225442 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingContractV1
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// 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(); } }
// 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()); } } }
// 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; } }
// 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; } }
// 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; }
// 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); }
// 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); }
// 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; }
// 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; }
// 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; } }
// 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()); } }
// 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"); _; } }
// 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 } }
// 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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.270005 | 1,899,398.0079 | $512,846.96 |
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.