Description:
Smart contract deployed on Ethereum with Factory features.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"contracts/EVMScriptFactories/CSMSetVettedGateTree.sol": {
"content": "// SPDX-FileCopyrightText: 2025 Lido <info@lido.fi>
// 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/IVettedGate.sol";
/// @author vgorkavenko
/// @notice Creates EVMScript to set tree for CSM's VettedGate
contract CSMSetVettedGateTree is TrustedCaller, IEVMScriptFactory {
// -------------
// ERRORS
// -------------
string private constant ERROR_EMPTY_TREE_ROOT =
"EMPTY_TREE_ROOT";
string private constant ERROR_EMPTY_TREE_CID =
"EMPTY_TREE_CID";
string private constant ERROR_SAME_TREE_CID =
"SAME_TREE_CID";
string private constant ERROR_SAME_TREE_ROOT =
"SAME_TREE_ROOT";
// -------------
// VARIABLES
// -------------
/// @notice Alias for factory (e.g. "IdentifiedCommunityStakerSetTreeParams")
string public name;
/// @notice Address of VettedGate
IVettedGate public immutable vettedGate;
// -------------
// CONSTRUCTOR
// -------------
constructor(address _trustedCaller, string memory _name, address _vettedGate)
TrustedCaller(_trustedCaller)
{
name = _name;
vettedGate = IVettedGate(_vettedGate);
}
// -------------
// EXTERNAL METHODS
// -------------
/// @notice Creates EVMScript to set treeRoot and treeCid for CSM's VettedGate
/// @param _creator Address who creates EVMScript
/// @param _evmScriptCallData Encoded: bytes32 treeRoot and string treeCid
function createEVMScript(address _creator, bytes calldata _evmScriptCallData)
external
view
override
onlyTrustedCaller(_creator)
returns (bytes memory)
{
(bytes32 treeRoot, string memory treeCid) = _decodeEVMScriptCallData(_evmScriptCallData);
_validateInputData(treeRoot, treeCid);
return
EVMScriptCreator.createEVMScript(
address(vettedGate),
IVettedGate.setTreeParams.selector,
_evmScriptCallData
);
}
/// @notice Decodes call data used by createEVMScript method
/// @param _evmScriptCallData Encoded: bytes32 treeRoot and string treeCid
/// @return treeRoot The root of the tree
/// @return treeCid The CID of the tree
function decodeEVMScriptCallData(bytes calldata _evmScriptCallData)
external
pure
returns (bytes32, string memory)
{
return _decodeEVMScriptCallData(_evmScriptCallData);
}
// ------------------
// PRIVATE METHODS
// ------------------
function _decodeEVMScriptCallData(bytes calldata _evmScriptCallData)
private
pure
returns (bytes32, string memory)
{
return abi.decode(_evmScriptCallData, (bytes32, string));
}
function _validateInputData(
bytes32 treeRoot,
string memory treeCid
) private view {
require(treeRoot != bytes32(0), ERROR_EMPTY_TREE_ROOT);
require(bytes(treeCid).length > 0, ERROR_EMPTY_TREE_CID);
require(treeRoot != vettedGate.treeRoot(), ERROR_SAME_TREE_ROOT);
require(keccak256(bytes(treeCid)) != keccak256(bytes(vettedGate.treeCid())), ERROR_SAME_TREE_CID);
}
}
"
},
"contracts/TrustedCaller.sol": {
"content": "// SPDX-FileCopyrightText: 2021 Lido <info@lido.fi>
// 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);
_;
}
}
"
},
"contracts/libraries/EVMScriptCreator.sol": {
"content": "// SPDX-FileCopyrightText: 2021 Lido <info@lido.fi>
// 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);
}
}
"
},
"contracts/interfaces/IEVMScriptFactory.sol": {
"content": "// SPDX-FileCopyrightText: 2021 Lido <info@lido.fi>
// 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);
}
"
},
"contracts/interfaces/IVettedGate.sol": {
"content": "// SPDX-FileCopyrightText: 2025 Lido <info@lido.fi>
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.6;
/// @title Lido's Community Staking Module Vetted Gate interface
interface IVettedGate {
function treeRoot() external view returns (bytes32);
function treeCid() external view returns (string memory);
/// @notice Set the root of the eligible members Merkle Tree
/// @param _treeRoot New root of the Merkle Tree
/// @param _treeCid New CID of the Merkle Tree
function setTreeParams(
bytes32 _treeRoot,
string calldata _treeCid
) external;
}
"
}
},
"settings": {
"evmVersion": "istanbul",
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}
Submitted on: 2025-09-18 16:22:29
Comments
Log in to comment.
No comments yet.