Skip to content

Commit

Permalink
allow adding multiple node operators in one transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
cds95 committed Apr 24, 2024
1 parent ffd96ef commit 92990b9
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 47 deletions.
23 changes: 11 additions & 12 deletions contracts/src/v0.8/keystone/CapabilityRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol";

contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface {
struct NodeOperator {
/// @notice Unique identifier for the node operator
uint256 id;
/// @notice The address of the admin that can manage a node
/// operator
address admin;
Expand Down Expand Up @@ -53,16 +51,17 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface {
return "CapabilityRegistry 1.0.0";
}

/// @notice Adds a new node operator
/// @param admin The address of the admin that can manage the node
/// operator
/// @param name The human readable name of the node operator
function addNodeOperator(address admin, string calldata name) external onlyOwner {
if (admin == address(0)) revert InvalidNodeOperatorAdmin();
uint256 nodeOperatorId = s_nodeOperatorId;
s_nodeOperators[nodeOperatorId] = NodeOperator({id: nodeOperatorId, admin: admin, name: name});
++s_nodeOperatorId;
emit NodeOperatorAdded(nodeOperatorId, admin, name);
/// @notice Adds a list of node operators
/// @param nodeOperators List of node operators to add
function addNodeOperators(NodeOperator[] calldata nodeOperators) external onlyOwner {
for (uint256 i; i < nodeOperators.length; ++i) {
NodeOperator memory nodeOperator = nodeOperators[i];
if (nodeOperator.admin == address(0)) revert InvalidNodeOperatorAdmin();
uint256 nodeOperatorId = s_nodeOperatorId;
s_nodeOperators[nodeOperatorId] = NodeOperator({admin: nodeOperator.admin, name: nodeOperator.name});
++s_nodeOperatorId;
emit NodeOperatorAdded(nodeOperatorId, nodeOperator.admin, nodeOperator.name);
}
}

/// @notice Gets a node operator's data
Expand Down
9 changes: 9 additions & 0 deletions contracts/src/v0.8/keystone/test/BaseTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,13 @@ contract BaseTest is Test, Constants {
vm.startPrank(ADMIN);
s_capabilityRegistry = new CapabilityRegistry();
}

function _getNodeOperators() internal view returns (CapabilityRegistry.NodeOperator[] memory) {
CapabilityRegistry.NodeOperator[] memory nodeOperators = new CapabilityRegistry.NodeOperator[](2);
nodeOperators[0] =
CapabilityRegistry.NodeOperator({admin: NODE_OPERATOR_ONE_ADMIN, name: NODE_OPERATOR_ONE_NAME});
nodeOperators[1] =
CapabilityRegistry.NodeOperator({admin: NODE_OPERATOR_TWO_ADMIN, name: NODE_OPERATOR_TWO_NAME});
return nodeOperators;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {BaseTest} from "./BaseTest.t.sol";
import {CapabilityRegistry} from "../CapabilityRegistry.sol";

contract CapabilityRegistry_AddNodeOperatorsTest is BaseTest {
event NodeOperatorAdded(uint256 nodeOperatorId, address indexed admin, string name);

function test_RevertWhen_CalledByNonAdmin() public {
changePrank(STRANGER);
vm.expectRevert("Only callable by owner");
s_capabilityRegistry.addNodeOperators(_getNodeOperators());
}

function test_RevertWhen_NodeOperatorAdminAddressZero() public {
changePrank(ADMIN);
CapabilityRegistry.NodeOperator[] memory nodeOperators = _getNodeOperators();
nodeOperators[0].admin = address(0);
vm.expectRevert(CapabilityRegistry.InvalidNodeOperatorAdmin.selector);
s_capabilityRegistry.addNodeOperators(nodeOperators);
}

function test_AddNodeOperators() public {
changePrank(ADMIN);

vm.expectEmit(true, true, true, true, address(s_capabilityRegistry));
emit NodeOperatorAdded(0, NODE_OPERATOR_ONE_ADMIN, NODE_OPERATOR_ONE_NAME);
vm.expectEmit(true, true, true, true, address(s_capabilityRegistry));
emit NodeOperatorAdded(1, NODE_OPERATOR_TWO_ADMIN, NODE_OPERATOR_TWO_NAME);
s_capabilityRegistry.addNodeOperators(_getNodeOperators());

CapabilityRegistry.NodeOperator memory nodeOperatorOne = s_capabilityRegistry.getNodeOperator(0);
assertEq(nodeOperatorOne.admin, NODE_OPERATOR_ONE_ADMIN);
assertEq(nodeOperatorOne.name, NODE_OPERATOR_ONE_NAME);

CapabilityRegistry.NodeOperator memory nodeOperatorTwo = s_capabilityRegistry.getNodeOperator(1);
assertEq(nodeOperatorTwo.admin, NODE_OPERATOR_TWO_ADMIN);
assertEq(nodeOperatorTwo.name, NODE_OPERATOR_TWO_NAME);
}
}
2 changes: 2 additions & 0 deletions contracts/src/v0.8/keystone/test/Constants.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ contract Constants {
address internal STRANGER = address(2);
address internal NODE_OPERATOR_ONE_ADMIN = address(3);
string internal NODE_OPERATOR_ONE_NAME = "node-operator-one";
address internal NODE_OPERATOR_TWO_ADMIN = address(4);
string internal NODE_OPERATOR_TWO_NAME = "node-operator-two";
}

0 comments on commit 92990b9

Please sign in to comment.