Hoodi Testnet

Contract

0x3114bEbC222Faec27DF8AB7f9bD8dF2063d7fc77

Overview

ETH Balance

0 ETH

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Method Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DeactivateNodeOperators

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-FileCopyrightText: 2023 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.6;

import "contracts/TrustedCaller.sol";
import "contracts/libraries/EVMScriptCreator.sol";
import "contracts/interfaces/IEVMScriptFactory.sol";
import "contracts/interfaces/INodeOperatorsRegistry.sol";
import "contracts/interfaces/IACL.sol";

/// @notice Creates EVMScript to deactivate several node operators
contract DeactivateNodeOperators is TrustedCaller, IEVMScriptFactory {
    struct DeactivateNodeOperatorInput {
        uint256 nodeOperatorId;
        address managerAddress;
    }

    // -------------
    // CONSTANTS
    // -------------

    bytes4 private constant DEACTIVATE_NODE_OPERATOR_SELECTOR =
        bytes4(keccak256("deactivateNodeOperator(uint256)"));
    bytes4 private constant REVOKE_PERMISSION_SELECTOR =
        bytes4(keccak256("revokePermission(address,address,bytes32)"));
    bytes32 private constant MANAGE_SIGNING_KEYS_ROLE = keccak256("MANAGE_SIGNING_KEYS");

    // -------------
    // VARIABLES
    // -------------

    /// @notice Address of NodeOperatorsRegistry contract
    INodeOperatorsRegistry public immutable nodeOperatorsRegistry;
    /// @notice Address of Aragon ACL contract
    IACL public immutable acl;

    // -------------
    // ERRORS
    // -------------

    string private constant ERROR_WRONG_OPERATOR_ACTIVE_STATE = "WRONG_OPERATOR_ACTIVE_STATE";
    string private constant ERROR_NODE_OPERATOR_INDEX_OUT_OF_RANGE =
        "NODE_OPERATOR_INDEX_OUT_OF_RANGE";
    string private constant ERROR_MANAGER_HAS_NO_ROLE = "MANAGER_HAS_NO_ROLE";
    string private constant ERROR_NODE_OPERATORS_IS_NOT_SORTED = "NODE_OPERATORS_IS_NOT_SORTED";
    string private constant ERROR_EMPTY_CALLDATA = "EMPTY_CALLDATA";

    // -------------
    // CONSTRUCTOR
    // -------------

    constructor(
        address _trustedCaller,
        address _nodeOperatorsRegistry,
        address _acl
    ) TrustedCaller(_trustedCaller) {
        nodeOperatorsRegistry = INodeOperatorsRegistry(_nodeOperatorsRegistry);
        acl = IACL(_acl);
    }

    // -------------
    // EXTERNAL METHODS
    // -------------

    /// @notice Creates EVMScript to deactivate batch of node operators
    /// @param _creator Address who creates EVMScript
    /// @param _evmScriptCallData Encoded (DeactivateNodeOperatorInput[])
    function createEVMScript(
        address _creator,
        bytes memory _evmScriptCallData
    ) external view override onlyTrustedCaller(_creator) returns (bytes memory) {
        DeactivateNodeOperatorInput[] memory decodedCallData = _decodeEVMScriptCallData(
            _evmScriptCallData
        );

        _validateInputData(decodedCallData);

        address[] memory toAddresses = new address[](decodedCallData.length * 2);
        bytes4[] memory methodIds = new bytes4[](decodedCallData.length * 2);
        bytes[] memory encodedCalldata = new bytes[](decodedCallData.length * 2);

        for (uint256 i = 0; i < decodedCallData.length; ++i) {
            toAddresses[i * 2] = address(nodeOperatorsRegistry);
            methodIds[i * 2] = DEACTIVATE_NODE_OPERATOR_SELECTOR;
            encodedCalldata[i * 2] = abi.encode(decodedCallData[i].nodeOperatorId);

            toAddresses[i * 2 + 1] = address(acl);
            methodIds[i * 2 + 1] = REVOKE_PERMISSION_SELECTOR;
            encodedCalldata[i * 2 + 1] = abi.encode(
                decodedCallData[i].managerAddress,
                address(nodeOperatorsRegistry),
                MANAGE_SIGNING_KEYS_ROLE
            );
        }

        return EVMScriptCreator.createEVMScript(toAddresses, methodIds, encodedCalldata);
    }

    /// @notice Decodes call data used by createEVMScript method
    /// @param _evmScriptCallData Encoded (DeactivateNodeOperatorInput[])
    /// @return DeactivateNodeOperatorInput[]
    function decodeEVMScriptCallData(
        bytes memory _evmScriptCallData
    ) external pure returns (DeactivateNodeOperatorInput[] memory) {
        return _decodeEVMScriptCallData(_evmScriptCallData);
    }

    // ------------------
    // PRIVATE METHODS
    // ------------------

    function _decodeEVMScriptCallData(
        bytes memory _evmScriptCallData
    ) private pure returns (DeactivateNodeOperatorInput[] memory) {
        return abi.decode(_evmScriptCallData, (DeactivateNodeOperatorInput[]));
    }

    function _validateInputData(
        DeactivateNodeOperatorInput[] memory _decodedCallData
    ) private view {
        uint256 nodeOperatorsCount = nodeOperatorsRegistry.getNodeOperatorsCount();
        require(_decodedCallData.length > 0, ERROR_EMPTY_CALLDATA);
        require(
            _decodedCallData[_decodedCallData.length - 1].nodeOperatorId < nodeOperatorsCount,
            ERROR_NODE_OPERATOR_INDEX_OUT_OF_RANGE
        );

        for (uint256 i = 0; i < _decodedCallData.length; ++i) {
            require(
                i == 0 ||
                    _decodedCallData[i].nodeOperatorId > _decodedCallData[i - 1].nodeOperatorId,
                ERROR_NODE_OPERATORS_IS_NOT_SORTED
            );
            require(
                nodeOperatorsRegistry.getNodeOperatorIsActive(_decodedCallData[i].nodeOperatorId) ==
                    true,
                ERROR_WRONG_OPERATOR_ACTIVE_STATE
            );

            require(
                acl.getPermissionParamsLength(
                    _decodedCallData[i].managerAddress,
                    address(nodeOperatorsRegistry),
                    MANAGE_SIGNING_KEYS_ROLE
                ) == 1,
                ERROR_MANAGER_HAS_NO_ROLE
            );

            // See https://legacy-docs.aragon.org/developers/tools/aragonos/reference-aragonos-3#parameter-interpretation for details
            (uint8 paramIndex, uint8 paramOp, uint240 param) = acl.getPermissionParam(
                _decodedCallData[i].managerAddress,
                address(nodeOperatorsRegistry),
                MANAGE_SIGNING_KEYS_ROLE,
                0
            );

            require(paramIndex == 0, ERROR_MANAGER_HAS_NO_ROLE);
            require(paramOp == 1, ERROR_MANAGER_HAS_NO_ROLE);
            require(param == _decodedCallData[i].nodeOperatorId, ERROR_MANAGER_HAS_NO_ROLE);
        }
    }
}

File 2 of 6 : TrustedCaller.sol
// SPDX-FileCopyrightText: 2021 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

/// @author psirex
/// @notice A helper contract contains logic to validate that only a trusted caller has access to certain methods.
/// @dev Trusted caller set once on deployment and can't be changed.
contract TrustedCaller {
    string private constant ERROR_TRUSTED_CALLER_IS_ZERO_ADDRESS = "TRUSTED_CALLER_IS_ZERO_ADDRESS";
    string private constant ERROR_CALLER_IS_FORBIDDEN = "CALLER_IS_FORBIDDEN";

    address public immutable trustedCaller;

    constructor(address _trustedCaller) {
        require(_trustedCaller != address(0), ERROR_TRUSTED_CALLER_IS_ZERO_ADDRESS);
        trustedCaller = _trustedCaller;
    }

    modifier onlyTrustedCaller(address _caller) {
        require(_caller == trustedCaller, ERROR_CALLER_IS_FORBIDDEN);
        _;
    }
}

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

/// @author psirex
/// @notice Contains methods for convenient creation
/// of EVMScripts in EVMScript factories contracts
library EVMScriptCreator {
    // Id of default CallsScript Aragon's executor.
    bytes4 private constant SPEC_ID = hex"00000001";

    /// @notice Encodes one method call as EVMScript
    function createEVMScript(
        address _to,
        bytes4 _methodId,
        bytes memory _evmScriptCallData
    ) internal pure returns (bytes memory _commands) {
        return
            abi.encodePacked(
                SPEC_ID,
                _to,
                uint32(_evmScriptCallData.length) + 4,
                _methodId,
                _evmScriptCallData
            );
    }

    /// @notice Encodes multiple calls of the same method on one contract as EVMScript
    function createEVMScript(
        address _to,
        bytes4 _methodId,
        bytes[] memory _evmScriptCallData
    ) internal pure returns (bytes memory _evmScript) {
        for (uint256 i = 0; i < _evmScriptCallData.length; ++i) {
            _evmScript = bytes.concat(
                _evmScript,
                abi.encodePacked(
                    _to,
                    uint32(_evmScriptCallData[i].length) + 4,
                    _methodId,
                    _evmScriptCallData[i]
                )
            );
        }
        _evmScript = bytes.concat(SPEC_ID, _evmScript);
    }

    /// @notice Encodes multiple calls to different methods within the same contract as EVMScript
    function createEVMScript(
        address _to,
        bytes4[] memory _methodIds,
        bytes[] memory _evmScriptCallData
    ) internal pure returns (bytes memory _evmScript) {
        require(_methodIds.length == _evmScriptCallData.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < _methodIds.length; ++i) {
            _evmScript = bytes.concat(
                _evmScript,
                abi.encodePacked(
                    _to,
                    uint32(_evmScriptCallData[i].length) + 4,
                    _methodIds[i],
                    _evmScriptCallData[i]
                )
            );
        }
        _evmScript = bytes.concat(SPEC_ID, _evmScript);
    }

    /// @notice Encodes multiple calls to different contracts as EVMScript
    function createEVMScript(
        address[] memory _to,
        bytes4[] memory _methodIds,
        bytes[] memory _evmScriptCallData
    ) internal pure returns (bytes memory _evmScript) {
        require(_to.length == _methodIds.length, "LENGTH_MISMATCH");
        require(_to.length == _evmScriptCallData.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < _to.length; ++i) {
            _evmScript = bytes.concat(
                _evmScript,
                abi.encodePacked(
                    _to[i],
                    uint32(_evmScriptCallData[i].length) + 4,
                    _methodIds[i],
                    _evmScriptCallData[i]
                )
            );
        }
        _evmScript = bytes.concat(SPEC_ID, _evmScript);
    }
}

// SPDX-FileCopyrightText: 2021 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

/// @author psirex
/// @notice Interface which every EVMScript factory used in EasyTrack contract has to implement
interface IEVMScriptFactory {
    function createEVMScript(address _creator, bytes memory _evmScriptCallData)
        external
        returns (bytes memory);
}

// SPDX-FileCopyrightText: 2023 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

/// @author bulbozaur
interface INodeOperatorsRegistry {
    function activateNodeOperator(uint256 _nodeOperatorId) external;

    function deactivateNodeOperator(uint256 _nodeOperatorId) external;

    function getNodeOperatorIsActive(uint256 _nodeOperatorId) external view returns (bool);

    function getNodeOperatorsCount() external view returns (uint256);

    function addNodeOperator(
        string memory _name,
        address _rewardAddress
    ) external returns (uint256 id);

    function MAX_NODE_OPERATOR_NAME_LENGTH() external view returns (uint256);

    function MAX_NODE_OPERATORS_COUNT() external view returns (uint256);

    function setNodeOperatorRewardAddress(uint256 _nodeOperatorId, address _rewardAddress) external;

    function setNodeOperatorName(uint256 _nodeOperatorId, string memory _name) external;

    function getNodeOperator(
        uint256 _id,
        bool _fullInfo
    )
        external
        view
        returns (
            bool active,
            string memory name,
            address rewardAddress,
            uint64 stakingLimit,
            uint64 stoppedValidators,
            uint64 totalSigningKeys,
            uint64 usedSigningKeys
        );

    function canPerform(
        address _sender,
        bytes32 _role,
        uint256[] memory _params
    ) external view returns (bool);

    function setNodeOperatorStakingLimit(uint256 _id, uint64 _stakingLimit) external;

    function updateTargetValidatorsLimits(
        uint256 _nodeOperatorId,
        uint256 _targetLimitMode,
        uint256 _targetLimit
    ) external;
}

// SPDX-FileCopyrightText: 2023 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

interface IACL {
    function grantPermissionP(
        address _entity,
        address _app,
        bytes32 _role,
        uint256[] memory _params
    ) external;

    function revokePermission(address _entity, address _app, bytes32 _role) external;

    function hasPermission(
        address _entity,
        address _app,
        bytes32 _role
    ) external view returns (bool);

    function hasPermission(
        address _entity,
        address _app,
        bytes32 _role,
        uint256[] memory _params
    ) external view returns (bool);

    function getPermissionParamsLength(
        address _entity,
        address _app,
        bytes32 _role
    ) external view returns (uint256);

    function getPermissionParam(
        address _entity,
        address _app,
        bytes32 _role,
        uint256 _index
    ) external view returns (uint8, uint8, uint240);

    function getPermissionManager(address _app, bytes32 _role) external view returns (address);

    function removePermissionManager(address _app, bytes32 _role) external;
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "DeactivateNodeOperators.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_trustedCaller","type":"address"},{"internalType":"address","name":"_nodeOperatorsRegistry","type":"address"},{"internalType":"address","name":"_acl","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"acl","outputs":[{"internalType":"contract IACL","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"createEVMScript","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"decodeEVMScriptCallData","outputs":[{"components":[{"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"internalType":"address","name":"managerAddress","type":"address"}],"internalType":"struct DeactivateNodeOperators.DeactivateNodeOperatorInput[]","name":"","type":"tuple[]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nodeOperatorsRegistry","outputs":[{"internalType":"contract INodeOperatorsRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedCaller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b50604051620015ca380380620015ca8339810160408190526200003491620000e2565b60408051808201909152601e81527f545255535445445f43414c4c45525f49535f5a45524f5f414444524553530000602082015283906001600160a01b0382166200009d5760405162461bcd60e51b81526004016200009491906200012c565b60405180910390fd5b506001600160601b0319606091821b811660805292811b831660a0521b1660c0525062000184565b80516001600160a01b0381168114620000dd57600080fd5b919050565b600080600060608486031215620000f857600080fd5b6200010384620000c5565b92506200011360208501620000c5565b91506200012360408501620000c5565b90509250925092565b600060208083528351808285015260005b818110156200015b578581018301518582016040015282016200013d565b818111156200016e576000604083870101525b50601f01601f1916929092016040019392505050565b60805160601c60a05160601c60c05160601c6113ca620002006000396000818160cc01528181610410015281816109120152610a7a0152600081816061015281816102f5015281816104f8015281816105ee015281816107ff015281816109850152610aed01526000818160a5015261014401526113ca6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063227242b51461005c578063268f0760146100a0578063de287359146100c7578063ecf7c690146100ee578063fea21c9c1461010e575b600080fd5b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6100837f000000000000000000000000000000000000000000000000000000000000000081565b6101016100fc36600461102f565b61012e565b60405161009791906111bd565b61012161011c366004610edb565b61013f565b6040516100979190611215565b6060610139826105d4565b92915050565b6060827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146040518060400160405280601381526020017221a0a62622a92fa4a9afa327a92124a22222a760691b815250906101ca5760405162461bcd60e51b81526004016101c19190611215565b60405180910390fd5b5060006101d6846105d4565b90506101e1816105ea565b6000815160026101f191906112b9565b67ffffffffffffffff81111561020957610209611366565b604051908082528060200260200182016040528015610232578160200160208202803683370190505b50905060008251600261024591906112b9565b67ffffffffffffffff81111561025d5761025d611366565b604051908082528060200260200182016040528015610286578160200160208202803683370190505b50905060008351600261029991906112b9565b67ffffffffffffffff8111156102b1576102b1611366565b6040519080825280602002602001820160405280156102e457816020015b60608152602001906001900390816102cf5790505b50905060005b84518110156105bc577f0000000000000000000000000000000000000000000000000000000000000000846103208360026112b9565b8151811061033057610330611350565b6001600160a01b03909216602092830291909101909101527f75a080d5a977c28e7c6f2710274d4932ee732cd469d736e965259fa5595bffbf836103758360026112b9565b8151811061038557610385611350565b60200260200101906001600160e01b03191690816001600160e01b031916815250508481815181106103b9576103b9611350565b6020026020010151600001516040516020016103d791815260200190565b60408051601f19818403018152919052826103f38360026112b9565b8151811061040357610403611350565b60209081029190910101527f00000000000000000000000000000000000000000000000000000000000000008461043b8360026112b9565b610446906001611282565b8151811061045657610456611350565b6001600160a01b03909216602092830291909101909101527f9d0effdb70cfc78561b926c15125dc0b3872ab042845fe2f01b4e4285852ecc78361049b8360026112b9565b6104a6906001611282565b815181106104b6576104b6611350565b60200260200101906001600160e01b03191690816001600160e01b031916815250508481815181106104ea576104ea611350565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000007f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee604051602001610569939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60408051601f19818403018152919052826105858360026112b9565b610590906001611282565b815181106105a0576105a0611350565b6020026020010181905250806105b59061131f565b90506102ea565b506105c8838383610cc8565b98975050505050505050565b6060818060200190518101906101399190610f2b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a70c70e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067d919061106c565b905060008251116040518060400160405280600e81526020016d454d5054595f43414c4c4441544160901b815250906106c95760405162461bcd60e51b81526004016101c19190611215565b508082600184516106da91906112d8565b815181106106ea576106ea611350565b602002602001015160000151106040518060400160405280602081526020017f4e4f44455f4f50455241544f525f494e4445585f4f55545f4f465f52414e47458152509061074b5760405162461bcd60e51b81526004016101c19190611215565b5060005b8251811015610cc3578015806107a857508261076c6001836112d8565b8151811061077c5761077c611350565b60200260200101516000015183828151811061079a5761079a611350565b602002602001015160000151115b6040518060400160405280601c81526020017f4e4f44455f4f50455241544f52535f49535f4e4f545f534f5254454400000000815250906107fc5760405162461bcd60e51b81526004016101c19190611215565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635e2fb90884838151811061083e5761083e611350565b6020026020010151600001516040518263ffffffff1660e01b815260040161086891815260200190565b60206040518083038186803b15801561088057600080fd5b505afa158015610894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b89190611006565b60408051808201909152601b81527f57524f4e475f4f50455241544f525f4143544956455f53544154450000000000602082015290151560011461090f5760405162461bcd60e51b81526004016101c19190611215565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315949ed784838151811061095157610951611350565b602090810291909101810151015160405160e083901b6001600160e01b03191681526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000090911660248201527f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee604482015260640160206040518083038186803b1580156109ed57600080fd5b505afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a25919061106c565b600114604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610a725760405162461bcd60e51b81526004016101c19190611215565b5060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a03c5832878681518110610ab957610ab9611350565b602090810291909101810151015160405160e083901b6001600160e01b03191681526001600160a01b0391821660048201527f000000000000000000000000000000000000000000000000000000000000000090911660248201527f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee60448201526000606482015260840160606040518083038186803b158015610b5c57600080fd5b505afa158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b949190611085565b9250925092508260ff16600014604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610beb5760405162461bcd60e51b81526004016101c19190611215565b506040805180820190915260138152724d414e414745525f4841535f4e4f5f524f4c4560681b6020820152600160ff841614610c3a5760405162461bcd60e51b81526004016101c19190611215565b50858481518110610c4d57610c4d611350565b602002602001015160000151816001600160f01b031614604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610cae5760405162461bcd60e51b81526004016101c19190611215565b5050505080610cbc9061131f565b905061074f565b505050565b60608251845114610d0d5760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016101c1565b8151845114610d505760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016101c1565b60005b8451811015610e255781858281518110610d6f57610d6f611350565b6020026020010151848381518110610d8957610d89611350565b6020026020010151516004610d9e919061129a565b868481518110610db057610db0611350565b6020026020010151868581518110610dca57610dca611350565b6020026020010151604051602001610de59493929190611105565b60408051601f1981840301815290829052610e03929160200161118e565b604051602081830303815290604052915080610e1e9061131f565b9050610d53565b50600160e01b81604051602001610e3d92919061115d565b60405160208183030381529060405290509392505050565b600082601f830112610e6657600080fd5b813567ffffffffffffffff811115610e8057610e80611366565b610e93601f8201601f1916602001611251565b818152846020838601011115610ea857600080fd5b816020850160208301376000918101602001919091529392505050565b805160ff81168114610ed657600080fd5b919050565b60008060408385031215610eee57600080fd5b8235610ef98161137c565b9150602083013567ffffffffffffffff811115610f1557600080fd5b610f2185828601610e55565b9150509250929050565b60006020808385031215610f3e57600080fd5b825167ffffffffffffffff80821115610f5657600080fd5b818501915085601f830112610f6a57600080fd5b815181811115610f7c57610f7c611366565b610f8a848260051b01611251565b8181528481019250838501600683901b85018601891015610faa57600080fd5b60009450845b83811015610ff857604080838c031215610fc8578687fd5b610fd0611228565b8351815288840151610fe18161137c565b818a01528652948701949190910190600101610fb0565b509098975050505050505050565b60006020828403121561101857600080fd5b8151801515811461102857600080fd5b9392505050565b60006020828403121561104157600080fd5b813567ffffffffffffffff81111561105857600080fd5b61106484828501610e55565b949350505050565b60006020828403121561107e57600080fd5b5051919050565b60008060006060848603121561109a57600080fd5b6110a384610ec5565b92506110b160208501610ec5565b60408501519092506001600160f01b03811681146110ce57600080fd5b809150509250925092565b600081518084526110f18160208601602086016112ef565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606086901b1681526001600160e01b031960e085901b8116601483015283166018820152815160009061114d81601c8501602087016112ef565b91909101601c0195945050505050565b6001600160e01b03198316815281516000906111808160048501602087016112ef565b919091016004019392505050565b600083516111a08184602088016112ef565b8351908301906111b48183602088016112ef565b01949350505050565b602080825282518282018190526000919060409081850190868401855b82811015611208578151805185528601516001600160a01b03168685015292840192908501906001016111da565b5091979650505050505050565b60208152600061102860208301846110d9565b6040805190810167ffffffffffffffff8111828210171561124b5761124b611366565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561127a5761127a611366565b604052919050565b600082198211156112955761129561133a565b500190565b600063ffffffff8083168185168083038211156111b4576111b461133a565b60008160001904831182151516156112d3576112d361133a565b500290565b6000828210156112ea576112ea61133a565b500390565b60005b8381101561130a5781810151838201526020016112f2565b83811115611319576000848401525b50505050565b60006000198214156113335761133361133a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461139157600080fd5b5056fea26469706673582212207586fd8d71e19edcd2e1b7997249b338d84f5588f7607f0abf98c5663344931364736f6c63430008060033000000000000000000000000bb958292042c604855d23f8db458855d20e169960000000000000000000000000b5236beca68004db89434462dfc3bb074d2c83000000000000000000000000078780e70eae33e2935814a327f7db6c01136cc62

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100575760003560e01c8063227242b51461005c578063268f0760146100a0578063de287359146100c7578063ecf7c690146100ee578063fea21c9c1461010e575b600080fd5b6100837f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c83081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100837f000000000000000000000000bb958292042c604855d23f8db458855d20e1699681565b6100837f00000000000000000000000078780e70eae33e2935814a327f7db6c01136cc6281565b6101016100fc36600461102f565b61012e565b60405161009791906111bd565b61012161011c366004610edb565b61013f565b6040516100979190611215565b6060610139826105d4565b92915050565b6060827f000000000000000000000000bb958292042c604855d23f8db458855d20e169966001600160a01b0316816001600160a01b0316146040518060400160405280601381526020017221a0a62622a92fa4a9afa327a92124a22222a760691b815250906101ca5760405162461bcd60e51b81526004016101c19190611215565b60405180910390fd5b5060006101d6846105d4565b90506101e1816105ea565b6000815160026101f191906112b9565b67ffffffffffffffff81111561020957610209611366565b604051908082528060200260200182016040528015610232578160200160208202803683370190505b50905060008251600261024591906112b9565b67ffffffffffffffff81111561025d5761025d611366565b604051908082528060200260200182016040528015610286578160200160208202803683370190505b50905060008351600261029991906112b9565b67ffffffffffffffff8111156102b1576102b1611366565b6040519080825280602002602001820160405280156102e457816020015b60608152602001906001900390816102cf5790505b50905060005b84518110156105bc577f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c830846103208360026112b9565b8151811061033057610330611350565b6001600160a01b03909216602092830291909101909101527f75a080d5a977c28e7c6f2710274d4932ee732cd469d736e965259fa5595bffbf836103758360026112b9565b8151811061038557610385611350565b60200260200101906001600160e01b03191690816001600160e01b031916815250508481815181106103b9576103b9611350565b6020026020010151600001516040516020016103d791815260200190565b60408051601f19818403018152919052826103f38360026112b9565b8151811061040357610403611350565b60209081029190910101527f00000000000000000000000078780e70eae33e2935814a327f7db6c01136cc628461043b8360026112b9565b610446906001611282565b8151811061045657610456611350565b6001600160a01b03909216602092830291909101909101527f9d0effdb70cfc78561b926c15125dc0b3872ab042845fe2f01b4e4285852ecc78361049b8360026112b9565b6104a6906001611282565b815181106104b6576104b6611350565b60200260200101906001600160e01b03191690816001600160e01b031916815250508481815181106104ea576104ea611350565b6020026020010151602001517f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c8307f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee604051602001610569939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60408051601f19818403018152919052826105858360026112b9565b610590906001611282565b815181106105a0576105a0611350565b6020026020010181905250806105b59061131f565b90506102ea565b506105c8838383610cc8565b98975050505050505050565b6060818060200190518101906101399190610f2b565b60007f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c8306001600160a01b031663a70c70e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067d919061106c565b905060008251116040518060400160405280600e81526020016d454d5054595f43414c4c4441544160901b815250906106c95760405162461bcd60e51b81526004016101c19190611215565b508082600184516106da91906112d8565b815181106106ea576106ea611350565b602002602001015160000151106040518060400160405280602081526020017f4e4f44455f4f50455241544f525f494e4445585f4f55545f4f465f52414e47458152509061074b5760405162461bcd60e51b81526004016101c19190611215565b5060005b8251811015610cc3578015806107a857508261076c6001836112d8565b8151811061077c5761077c611350565b60200260200101516000015183828151811061079a5761079a611350565b602002602001015160000151115b6040518060400160405280601c81526020017f4e4f44455f4f50455241544f52535f49535f4e4f545f534f5254454400000000815250906107fc5760405162461bcd60e51b81526004016101c19190611215565b507f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c8306001600160a01b0316635e2fb90884838151811061083e5761083e611350565b6020026020010151600001516040518263ffffffff1660e01b815260040161086891815260200190565b60206040518083038186803b15801561088057600080fd5b505afa158015610894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b89190611006565b60408051808201909152601b81527f57524f4e475f4f50455241544f525f4143544956455f53544154450000000000602082015290151560011461090f5760405162461bcd60e51b81526004016101c19190611215565b507f00000000000000000000000078780e70eae33e2935814a327f7db6c01136cc626001600160a01b03166315949ed784838151811061095157610951611350565b602090810291909101810151015160405160e083901b6001600160e01b03191681526001600160a01b0391821660048201527f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c83090911660248201527f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee604482015260640160206040518083038186803b1580156109ed57600080fd5b505afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a25919061106c565b600114604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610a725760405162461bcd60e51b81526004016101c19190611215565b5060008060007f00000000000000000000000078780e70eae33e2935814a327f7db6c01136cc626001600160a01b031663a03c5832878681518110610ab957610ab9611350565b602090810291909101810151015160405160e083901b6001600160e01b03191681526001600160a01b0391821660048201527f0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c83090911660248201527f75abc64490e17b40ea1e66691c3eb493647b24430b358bd87ec3e5127f1621ee60448201526000606482015260840160606040518083038186803b158015610b5c57600080fd5b505afa158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b949190611085565b9250925092508260ff16600014604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610beb5760405162461bcd60e51b81526004016101c19190611215565b506040805180820190915260138152724d414e414745525f4841535f4e4f5f524f4c4560681b6020820152600160ff841614610c3a5760405162461bcd60e51b81526004016101c19190611215565b50858481518110610c4d57610c4d611350565b602002602001015160000151816001600160f01b031614604051806040016040528060138152602001724d414e414745525f4841535f4e4f5f524f4c4560681b81525090610cae5760405162461bcd60e51b81526004016101c19190611215565b5050505080610cbc9061131f565b905061074f565b505050565b60608251845114610d0d5760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016101c1565b8151845114610d505760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016101c1565b60005b8451811015610e255781858281518110610d6f57610d6f611350565b6020026020010151848381518110610d8957610d89611350565b6020026020010151516004610d9e919061129a565b868481518110610db057610db0611350565b6020026020010151868581518110610dca57610dca611350565b6020026020010151604051602001610de59493929190611105565b60408051601f1981840301815290829052610e03929160200161118e565b604051602081830303815290604052915080610e1e9061131f565b9050610d53565b50600160e01b81604051602001610e3d92919061115d565b60405160208183030381529060405290509392505050565b600082601f830112610e6657600080fd5b813567ffffffffffffffff811115610e8057610e80611366565b610e93601f8201601f1916602001611251565b818152846020838601011115610ea857600080fd5b816020850160208301376000918101602001919091529392505050565b805160ff81168114610ed657600080fd5b919050565b60008060408385031215610eee57600080fd5b8235610ef98161137c565b9150602083013567ffffffffffffffff811115610f1557600080fd5b610f2185828601610e55565b9150509250929050565b60006020808385031215610f3e57600080fd5b825167ffffffffffffffff80821115610f5657600080fd5b818501915085601f830112610f6a57600080fd5b815181811115610f7c57610f7c611366565b610f8a848260051b01611251565b8181528481019250838501600683901b85018601891015610faa57600080fd5b60009450845b83811015610ff857604080838c031215610fc8578687fd5b610fd0611228565b8351815288840151610fe18161137c565b818a01528652948701949190910190600101610fb0565b509098975050505050505050565b60006020828403121561101857600080fd5b8151801515811461102857600080fd5b9392505050565b60006020828403121561104157600080fd5b813567ffffffffffffffff81111561105857600080fd5b61106484828501610e55565b949350505050565b60006020828403121561107e57600080fd5b5051919050565b60008060006060848603121561109a57600080fd5b6110a384610ec5565b92506110b160208501610ec5565b60408501519092506001600160f01b03811681146110ce57600080fd5b809150509250925092565b600081518084526110f18160208601602086016112ef565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606086901b1681526001600160e01b031960e085901b8116601483015283166018820152815160009061114d81601c8501602087016112ef565b91909101601c0195945050505050565b6001600160e01b03198316815281516000906111808160048501602087016112ef565b919091016004019392505050565b600083516111a08184602088016112ef565b8351908301906111b48183602088016112ef565b01949350505050565b602080825282518282018190526000919060409081850190868401855b82811015611208578151805185528601516001600160a01b03168685015292840192908501906001016111da565b5091979650505050505050565b60208152600061102860208301846110d9565b6040805190810167ffffffffffffffff8111828210171561124b5761124b611366565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561127a5761127a611366565b604052919050565b600082198211156112955761129561133a565b500190565b600063ffffffff8083168185168083038211156111b4576111b461133a565b60008160001904831182151516156112d3576112d361133a565b500290565b6000828210156112ea576112ea61133a565b500390565b60005b8381101561130a5781810151838201526020016112f2565b83811115611319576000848401525b50505050565b60006000198214156113335761133361133a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461139157600080fd5b5056fea26469706673582212207586fd8d71e19edcd2e1b7997249b338d84f5588f7607f0abf98c5663344931364736f6c63430008060033

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

000000000000000000000000bb958292042c604855d23f8db458855d20e169960000000000000000000000000b5236beca68004db89434462dfc3bb074d2c83000000000000000000000000078780e70eae33e2935814a327f7db6c01136cc62

-----Decoded View---------------
Arg [0] : _trustedCaller (address): 0xbB958292042c604855d23F8db458855d20e16996
Arg [1] : _nodeOperatorsRegistry (address): 0x0B5236BECA68004DB89434462DfC3BB074d2c830
Arg [2] : _acl (address): 0x78780e70Eae33e2935814a327f7dB6c01136cc62

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bb958292042c604855d23f8db458855d20e16996
Arg [1] : 0000000000000000000000000b5236beca68004db89434462dfc3bb074d2c830
Arg [2] : 00000000000000000000000078780e70eae33e2935814a327f7db6c01136cc62


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
Loading...
Loading

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.