Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| Transfer* | 1604800 | 29 hrs ago | 0 ETH | ||||
| Create EVM Scrip... | 1604800 | 29 hrs ago | 0 ETH | ||||
| Transfer* | 1554107 | 8 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1554107 | 8 days ago | 0 ETH | ||||
| Transfer* | 1554047 | 8 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1554047 | 8 days ago | 0 ETH | ||||
| Transfer* | 1546548 | 10 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1546548 | 10 days ago | 0 ETH | ||||
| Transfer* | 1546500 | 10 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1546500 | 10 days ago | 0 ETH | ||||
| Transfer* | 1497306 | 17 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1497306 | 17 days ago | 0 ETH | ||||
| Transfer* | 1473659 | 20 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1473659 | 20 days ago | 0 ETH | ||||
| Transfer* | 1472165 | 21 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1472165 | 21 days ago | 0 ETH | ||||
| Transfer* | 1469251 | 21 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1469251 | 21 days ago | 0 ETH | ||||
| Transfer* | 1371913 | 36 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1371913 | 36 days ago | 0 ETH | ||||
| Transfer* | 1191109 | 63 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1191109 | 63 days ago | 0 ETH | ||||
| Transfer* | 1176534 | 65 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1176534 | 65 days ago | 0 ETH | ||||
| Transfer* | 1090944 | 78 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Contract Name:
IncreaseNodeOperatorStakingLimit
Compiler Version
v0.8.6+commit.11564f7e
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); }
{
"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"}]Contract Creation Code
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
Loading...
Loading
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.