Skip to content

Commit

Permalink
remove capability registry interface
Browse files Browse the repository at this point in the history
  • Loading branch information
cds95 committed Apr 23, 2024
1 parent 4fd319a commit 71e2bda
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 79 deletions.
50 changes: 45 additions & 5 deletions contracts/src/v0.8/keystone/CapabilityRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,43 @@ pragma solidity ^0.8.0;

import {TypeAndVersionInterface} from "../interfaces/TypeAndVersionInterface.sol";
import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol";
import {ICapabilityRegistry} from "./interfaces/ICapabilityRegistry.sol";

contract CapabilityRegistry is ICapabilityRegistry, OwnerIsCreator, TypeAndVersionInterface {
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;
/// @notice Human readable name of a Node Operator managing the node
string name;
}

struct Capability {
// Capability type, e.g. "data-streams-reports"
// bytes32(string); validation regex: ^[a-z0-9_\-:]{1,32}$
// Not "type" because that's a reserved keyword in Solidity.
bytes32 capabilityType;
// Semver, e.g., "1.2.3"
// bytes32(string); must be valid Semver + max 32 characters.
bytes32 version;
}

/// @notice This error is thrown when trying to set a node operator's
/// admin address to the zero address
error InvalidNodeOperatorAdmin();

/// @notice This event is emitted when a new node operator is added
/// @param nodeOperatorId The ID of the newly added 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
event NodeOperatorAdded(uint256 nodeOperatorId, address indexed admin, string name);

/// @notice This event is emitted when a new capability is added
/// @param capabilityId The ID of the newly added capability
event CapabilityAdded(bytes32 indexed capabilityId);

mapping(bytes32 => Capability) private s_capabilities;

/// @notice Mapping of node operators
Expand All @@ -19,7 +53,10 @@ contract CapabilityRegistry is ICapabilityRegistry, OwnerIsCreator, TypeAndVersi
return "CapabilityRegistry 1.0.0";
}

/// @inheritdoc ICapabilityRegistry
/// @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;
Expand All @@ -28,7 +65,9 @@ contract CapabilityRegistry is ICapabilityRegistry, OwnerIsCreator, TypeAndVersi
emit NodeOperatorAdded(nodeOperatorId, admin, name);
}

/// @inheritdoc ICapabilityRegistry
/// @notice Gets a node operator's data
/// @param nodeOperatorId The ID of the node operator to query for
/// @return NodeOperator The node operator data
function getNodeOperator(uint256 nodeOperatorId) external view returns (NodeOperator memory) {
return s_nodeOperators[nodeOperatorId];
}
Expand All @@ -43,7 +82,8 @@ contract CapabilityRegistry is ICapabilityRegistry, OwnerIsCreator, TypeAndVersi
return s_capabilities[capabilityID];
}

/// @inheritdoc ICapabilityRegistry
/// @notice This functions returns a Capability ID packed into a bytes32 for cheaper access
/// @return bytes32 A unique identifier for the capability
function getCapabilityID(bytes32 capabilityType, bytes32 version) public pure returns (bytes32) {
return keccak256(abi.encodePacked(capabilityType, version));
}
Expand Down
61 changes: 0 additions & 61 deletions contracts/src/v0.8/keystone/interfaces/ICapabilityRegistry.sol

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
pragma solidity ^0.8.19;

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

contract CapabilityRegistry_AddCapabilityTest is BaseTest {
function test_AddCapability() public {
s_capabilityRegistry.addCapability(ICapabilityRegistry.Capability("data-streams-reports", "1.0.0"));
s_capabilityRegistry.addCapability(CapabilityRegistry.Capability("data-streams-reports", "1.0.0"));

bytes32 capabilityId = s_capabilityRegistry.getCapabilityID(bytes32("data-streams-reports"), bytes32("1.0.0"));
ICapabilityRegistry.Capability memory capability = s_capabilityRegistry.getCapability(capabilityId);
CapabilityRegistry.Capability memory capability = s_capabilityRegistry.getCapability(capabilityId);

assertEq(capability.capabilityType, "data-streams-reports");
assertEq(capability.version, "1.0.0");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.19;

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

contract CapabilityRegistry_AddNodeOperatorTest is BaseTest {
event NodeOperatorAdded(uint256 nodeOperatorId, address indexed admin, string name);
Expand All @@ -15,25 +15,21 @@ contract CapabilityRegistry_AddNodeOperatorTest is BaseTest {

function test_RevertWhen_NodeOperatorAdminAddressZero() public {
changePrank(ADMIN);
vm.expectRevert(ICapabilityRegistry.InvalidNodeOperatorAdmin.selector);
vm.expectRevert(CapabilityRegistry.InvalidNodeOperatorAdmin.selector);
s_capabilityRegistry.addNodeOperator(address(0), NODE_OPERATOR_ONE_NAME);
}

function test_AddNodeOperator() public {
changePrank(ADMIN);

vm.expectEmit(true, true, true, true, address(s_capabilityRegistry));
emit NodeOperatorAdded(0, NODE_OPERATOR_ONE_ADMIN, NODE_OPERATOR_ONE_NAME);
s_capabilityRegistry.addNodeOperator(NODE_OPERATOR_ONE_ADMIN, NODE_OPERATOR_ONE_NAME);

ICapabilityRegistry.NodeOperator memory nodeOperator = s_capabilityRegistry.getNodeOperator(0);
CapabilityRegistry.NodeOperator memory nodeOperator = s_capabilityRegistry.getNodeOperator(0);

assertEq(nodeOperator.id, 0);
assertEq(nodeOperator.admin, NODE_OPERATOR_ONE_ADMIN);
assertEq(nodeOperator.name, NODE_OPERATOR_ONE_NAME);
}

function test_EmitsEvent() public {
changePrank(ADMIN);
vm.expectEmit(true, true, true, true, address(s_capabilityRegistry));
emit NodeOperatorAdded(0, NODE_OPERATOR_ONE_ADMIN, NODE_OPERATOR_ONE_NAME);
s_capabilityRegistry.addNodeOperator(NODE_OPERATOR_ONE_ADMIN, NODE_OPERATOR_ONE_NAME);
}
}

0 comments on commit 71e2bda

Please sign in to comment.