Hoodi Testnet

Contract

0x0f121e4069e17a2Dc5bAbF39d769313a1e20f323

Overview

ETH Balance

0 ETH

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Amount
Transfer*16048002025-11-12 8:49:3629 hrs ago1762937376
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...16048002025-11-12 8:49:3629 hrs ago1762937376
0x0f121e40...a1e20f323
0 ETH
Transfer*15541072025-11-04 16:12:368 days ago1762272756
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...15541072025-11-04 16:12:368 days ago1762272756
0x0f121e40...a1e20f323
0 ETH
Transfer*15540472025-11-04 15:59:248 days ago1762271964
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...15540472025-11-04 15:59:248 days ago1762271964
0x0f121e40...a1e20f323
0 ETH
Transfer*15465482025-11-03 13:53:0010 days ago1762177980
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...15465482025-11-03 13:53:0010 days ago1762177980
0x0f121e40...a1e20f323
0 ETH
Transfer*15465002025-11-03 13:42:1210 days ago1762177332
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...15465002025-11-03 13:42:1210 days ago1762177332
0x0f121e40...a1e20f323
0 ETH
Transfer*14973062025-10-27 7:00:1217 days ago1761548412
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...14973062025-10-27 7:00:1217 days ago1761548412
0x0f121e40...a1e20f323
0 ETH
Transfer*14736592025-10-23 14:30:3620 days ago1761229836
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...14736592025-10-23 14:30:3620 days ago1761229836
0x0f121e40...a1e20f323
0 ETH
Transfer*14721652025-10-23 8:58:2421 days ago1761209904
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...14721652025-10-23 8:58:2421 days ago1761209904
0x0f121e40...a1e20f323
0 ETH
Transfer*14692512025-10-22 22:11:3621 days ago1761171096
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...14692512025-10-22 22:11:3621 days ago1761171096
0x0f121e40...a1e20f323
0 ETH
Transfer*13719132025-10-08 11:02:1236 days ago1759921332
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...13719132025-10-08 11:02:1236 days ago1759921332
0x0f121e40...a1e20f323
0 ETH
Transfer*11911092025-09-11 13:37:1263 days ago1757597832
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...11911092025-09-11 13:37:1263 days ago1757597832
0x0f121e40...a1e20f323
0 ETH
Transfer*11765342025-09-09 8:59:0065 days ago1757408340
0x0f121e40...a1e20f323
0 ETH
Create EVM Scrip...11765342025-09-09 8:59:0065 days ago1757408340
0x0f121e40...a1e20f323
0 ETH
Transfer*10909442025-08-27 10:13:3678 days ago1756289616
0x0f121e40...a1e20f323
0 ETH
View All Internal Transactions
Loading...
Loading

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
IncreaseNodeOperatorStakingLimit

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: 2021 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;

import "contracts/libraries/EVMScriptCreator.sol";
import "contracts/interfaces/IEVMScriptFactory.sol";

interface INodeOperatorsRegistry {
    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 setNodeOperatorStakingLimit(uint256 _id, uint64 _stakingLimit) external;
}

/// @author psirex
/// @notice Creates EVMScript to increase staking limit for node operator
contract IncreaseNodeOperatorStakingLimit is IEVMScriptFactory {
    struct NodeOperatorData {
        uint256 id;
        bool active;
        address rewardAddress;
        uint256 stakingLimit;
        uint256 totalSigningKeys;
    }

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

    string private constant ERROR_NODE_OPERATOR_DISABLED = "NODE_OPERATOR_DISABLED";
    string private constant ERROR_CALLER_IS_NOT_NODE_OPERATOR = "CALLER_IS_NOT_NODE_OPERATOR";
    string private constant ERROR_STAKING_LIMIT_TOO_LOW = "STAKING_LIMIT_TOO_LOW";
    string private constant ERROR_NOT_ENOUGH_SIGNING_KEYS = "NOT_ENOUGH_SIGNING_KEYS";

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

    /// @notice Address of NodeOperatorsRegistry contract
    INodeOperatorsRegistry public immutable nodeOperatorsRegistry;

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

    constructor(address _nodeOperatorsRegistry) {
        nodeOperatorsRegistry = INodeOperatorsRegistry(_nodeOperatorsRegistry);
    }

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

    /// @notice Creates EVMScript to increase staking limit for node operator
    /// @param _creator Address who creates EVMScript
    /// @param _evmScriptCallData Encoded tuple: (uint256 _nodeOperatorId, uint256 _stakingLimit) where
    /// _nodeOperatorId - id of node operator in NodeOperatorsRegistry
    /// _stakingLimit - new staking limit
    function createEVMScript(address _creator, bytes memory _evmScriptCallData)
        external
        view
        override
        returns (bytes memory)
    {
        _validateCreatorAndEVMScriptCallData(_creator, _evmScriptCallData);
        return
            EVMScriptCreator.createEVMScript(
                address(nodeOperatorsRegistry),
                nodeOperatorsRegistry.setNodeOperatorStakingLimit.selector,
                _evmScriptCallData
            );
    }

    /// @notice Decodes call data used by createEVMScript method
    /// @param _evmScriptCallData Encoded tuple: (uint256 _nodeOperatorId, uint256 _stakingLimit) where
    /// _nodeOperatorId - id of node operator in NodeOperatorsRegistry
    /// _stakingLimit - new staking limit
    /// @return _nodeOperatorId Id of node operator in NodeOperatorsRegistry
    /// @return _stakingLimit New staking limit
    function decodeEVMScriptCallData(bytes memory _evmScriptCallData)
        external
        pure
        returns (uint256 _nodeOperatorId, uint256 _stakingLimit)
    {
        return _decodeEVMScriptCallData(_evmScriptCallData);
    }

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

    function _decodeEVMScriptCallData(bytes memory _evmScriptCallData)
        private
        pure
        returns (uint256 _nodeOperatorId, uint256 _stakingLimit)
    {
        (_nodeOperatorId, _stakingLimit) = abi.decode(_evmScriptCallData, (uint256, uint256));
    }

    function _validateCreatorAndEVMScriptCallData(address _creator, bytes memory _evmScriptCallData)
        private
        view
    {
        (uint256 _nodeOperatorId, uint256 _stakingLimit) =
            _decodeEVMScriptCallData(_evmScriptCallData);
        NodeOperatorData memory nodeOperatorData = _getNodeOperatorData(_nodeOperatorId);
        require(nodeOperatorData.rewardAddress == _creator, ERROR_CALLER_IS_NOT_NODE_OPERATOR);
        require(nodeOperatorData.active, ERROR_NODE_OPERATOR_DISABLED);
        require(nodeOperatorData.stakingLimit < _stakingLimit, ERROR_STAKING_LIMIT_TOO_LOW);
        require(nodeOperatorData.totalSigningKeys >= _stakingLimit, ERROR_NOT_ENOUGH_SIGNING_KEYS);
    }

    function _getNodeOperatorData(uint256 _nodeOperatorId)
        private
        view
        returns (NodeOperatorData memory _nodeOperatorData)
    {
        (bool active, , address rewardAddress, uint64 stakingLimit, , uint64 totalSigningKeys, ) =
            nodeOperatorsRegistry.getNodeOperator(_nodeOperatorId, false);

        _nodeOperatorData.id = _nodeOperatorId;
        _nodeOperatorData.active = active;
        _nodeOperatorData.rewardAddress = rewardAddress;
        _nodeOperatorData.stakingLimit = stakingLimit;
        _nodeOperatorData.totalSigningKeys = totalSigningKeys;
    }
}

// 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);
}

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

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_nodeOperatorsRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[{"internalType":"uint256","name":"_nodeOperatorId","type":"uint256"},{"internalType":"uint256","name":"_stakingLimit","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nodeOperatorsRegistry","outputs":[{"internalType":"contract INodeOperatorsRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b506040516108cb3803806108cb83398101604081905261002f91610044565b60601b6001600160601b031916608052610074565b60006020828403121561005657600080fd5b81516001600160a01b038116811461006d57600080fd5b9392505050565b60805160601c61082d61009e60003960008181604b0152818160f8015261039b015261082d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063227242b514610046578063ecf7c6901461008a578063fea21c9c146100b2575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61009d610098366004610609565b6100d2565b60408051928352602083019190915201610081565b6100c56100c03660046104d5565b6100e7565b60405161008191906106f7565b6000806100de8361012c565b91509150915091565b60606100f3838361014d565b6101257f000000000000000000000000000000000000000000000000000000000000000063ae962acf60e01b846102ec565b9392505050565b600080828060200190518101906101439190610646565b9094909350915050565b6000806101598361012c565b91509150600061016883610330565b9050846001600160a01b031681604001516001600160a01b0316146040518060400160405280601b81526020017f43414c4c45525f49535f4e4f545f4e4f44455f4f50455241544f520000000000815250906101e05760405162461bcd60e51b81526004016101d791906106f7565b60405180910390fd5b508060200151604051806040016040528060168152602001751393d11157d3d41154905513d497d11254d05093115160521b815250906102335760405162461bcd60e51b81526004016101d791906106f7565b5081816060015110604051806040016040528060158152602001745354414b494e475f4c494d49545f544f4f5f4c4f5760581b815250906102875760405162461bcd60e51b81526004016101d791906106f7565b5081816080015110156040518060400160405280601781526020017f4e4f545f454e4f5547485f5349474e494e475f4b455953000000000000000000815250906102e45760405162461bcd60e51b81526004016101d791906106f7565b505050505050565b6060600160e01b84835160046103029190610763565b8585604051602001610318959493929190610696565b60405160208183030381529060405290509392505050565b61036d6040518060a001604052806000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081525090565b604051632695a60f60e21b815260048101839052600060248201819052908190819081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a56983c9060440160006040518083038186803b1580156103dd57600080fd5b505afa1580156103f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104199190810190610525565b509a8a525092151560208901526001600160a01b031660408801525067ffffffffffffffff9081166060870152909516608085015250919392505050565b8051610462816107df565b919050565b600082601f83011261047857600080fd5b813561048b6104868261073b565b61070a565b8181528460208386010111156104a057600080fd5b816020850160208301376000918101602001919091529392505050565b805167ffffffffffffffff8116811461046257600080fd5b600080604083850312156104e857600080fd5b82356104f3816107df565b9150602083013567ffffffffffffffff81111561050f57600080fd5b61051b85828601610467565b9150509250929050565b600080600080600080600060e0888a03121561054057600080fd5b8751801515811461055057600080fd5b602089015190975067ffffffffffffffff81111561056d57600080fd5b8801601f81018a1361057e57600080fd5b805161058c6104868261073b565b8181528b60208385010111156105a157600080fd5b6105b2826020830160208601610799565b97506105c391505060408901610457565b94506105d1606089016104bd565b93506105df608089016104bd565b92506105ed60a089016104bd565b91506105fb60c089016104bd565b905092959891949750929550565b60006020828403121561061b57600080fd5b813567ffffffffffffffff81111561063257600080fd5b61063e84828501610467565b949350505050565b6000806040838503121561065957600080fd5b505080516020909101519092909150565b60008151808452610682816020860160208601610799565b601f01601f19169290920160200192915050565b6001600160e01b03198681168252606086901b6bffffffffffffffffffffffff1916600483015260e085901b811660188301528316601c82015281516000906106e6816020808601908701610799565b919091016020019695505050505050565b602081526000610125602083018461066a565b604051601f8201601f1916810167ffffffffffffffff81118282101715610733576107336107c9565b604052919050565b600067ffffffffffffffff821115610755576107556107c9565b50601f01601f191660200190565b600063ffffffff80831681851680830382111561079057634e487b7160e01b600052601160045260246000fd5b01949350505050565b60005b838110156107b457818101518382015260200161079c565b838111156107c3576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107f457600080fd5b5056fea264697066735822122046f088f8e541765c5c0c4a9eba3794cbc6fa1aeaefc5d70a05dd12a6f76321c064736f6c634300080600330000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb5

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063227242b514610046578063ecf7c6901461008a578063fea21c9c146100b2575b600080fd5b61006d7f0000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb581565b6040516001600160a01b0390911681526020015b60405180910390f35b61009d610098366004610609565b6100d2565b60408051928352602083019190915201610081565b6100c56100c03660046104d5565b6100e7565b60405161008191906106f7565b6000806100de8361012c565b91509150915091565b60606100f3838361014d565b6101257f0000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb563ae962acf60e01b846102ec565b9392505050565b600080828060200190518101906101439190610646565b9094909350915050565b6000806101598361012c565b91509150600061016883610330565b9050846001600160a01b031681604001516001600160a01b0316146040518060400160405280601b81526020017f43414c4c45525f49535f4e4f545f4e4f44455f4f50455241544f520000000000815250906101e05760405162461bcd60e51b81526004016101d791906106f7565b60405180910390fd5b508060200151604051806040016040528060168152602001751393d11157d3d41154905513d497d11254d05093115160521b815250906102335760405162461bcd60e51b81526004016101d791906106f7565b5081816060015110604051806040016040528060158152602001745354414b494e475f4c494d49545f544f4f5f4c4f5760581b815250906102875760405162461bcd60e51b81526004016101d791906106f7565b5081816080015110156040518060400160405280601781526020017f4e4f545f454e4f5547485f5349474e494e475f4b455953000000000000000000815250906102e45760405162461bcd60e51b81526004016101d791906106f7565b505050505050565b6060600160e01b84835160046103029190610763565b8585604051602001610318959493929190610696565b60405160208183030381529060405290509392505050565b61036d6040518060a001604052806000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081525090565b604051632695a60f60e21b815260048101839052600060248201819052908190819081906001600160a01b037f0000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb51690639a56983c9060440160006040518083038186803b1580156103dd57600080fd5b505afa1580156103f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104199190810190610525565b509a8a525092151560208901526001600160a01b031660408801525067ffffffffffffffff9081166060870152909516608085015250919392505050565b8051610462816107df565b919050565b600082601f83011261047857600080fd5b813561048b6104868261073b565b61070a565b8181528460208386010111156104a057600080fd5b816020850160208301376000918101602001919091529392505050565b805167ffffffffffffffff8116811461046257600080fd5b600080604083850312156104e857600080fd5b82356104f3816107df565b9150602083013567ffffffffffffffff81111561050f57600080fd5b61051b85828601610467565b9150509250929050565b600080600080600080600060e0888a03121561054057600080fd5b8751801515811461055057600080fd5b602089015190975067ffffffffffffffff81111561056d57600080fd5b8801601f81018a1361057e57600080fd5b805161058c6104868261073b565b8181528b60208385010111156105a157600080fd5b6105b2826020830160208601610799565b97506105c391505060408901610457565b94506105d1606089016104bd565b93506105df608089016104bd565b92506105ed60a089016104bd565b91506105fb60c089016104bd565b905092959891949750929550565b60006020828403121561061b57600080fd5b813567ffffffffffffffff81111561063257600080fd5b61063e84828501610467565b949350505050565b6000806040838503121561065957600080fd5b505080516020909101519092909150565b60008151808452610682816020860160208601610799565b601f01601f19169290920160200192915050565b6001600160e01b03198681168252606086901b6bffffffffffffffffffffffff1916600483015260e085901b811660188301528316601c82015281516000906106e6816020808601908701610799565b919091016020019695505050505050565b602081526000610125602083018461066a565b604051601f8201601f1916810167ffffffffffffffff81118282101715610733576107336107c9565b604052919050565b600067ffffffffffffffff821115610755576107556107c9565b50601f01601f191660200190565b600063ffffffff80831681851680830382111561079057634e487b7160e01b600052601160045260246000fd5b01949350505050565b60005b838110156107b457818101518382015260200161079c565b838111156107c3576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107f457600080fd5b5056fea264697066735822122046f088f8e541765c5c0c4a9eba3794cbc6fa1aeaefc5d70a05dd12a6f76321c064736f6c63430008060033

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

0000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb5

-----Decoded View---------------
Arg [0] : _nodeOperatorsRegistry (address): 0x5cDbE1590c083b5A2A64427fAA63A7cfDB91FbB5

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005cdbe1590c083b5a2a64427faa63a7cfdb91fbb5


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
0x0f121e4069e17a2Dc5bAbF39d769313a1e20f323
Loading...
Loading
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.