From 54f7c9c8f5508d0d0a063eb435404b4164723300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deividas=20Kar=C5=BEinauskas?= Date: Mon, 13 May 2024 13:40:47 +0300 Subject: [PATCH] CapabilityRegistry: addDON (#13103) * Add CapabilityConfiguration struct * Add CapabilityConfiguration and DON structs * --wip-- [skip CI] * implement add don on capability registry * verify DON nodes unique * add check for whether or not a node supports a capability * update check for nodes supporting capability * fix tests * address PR feedback * pack node struct * check that capability is not deprecated when adding dons * update node struct * address nits * add notice tag --------- Co-authored-by: Christopher Dimitri Sastropranoto --- .changeset/tame-rules-whisper.md | 5 + contracts/.changeset/silly-bags-applaud.md | 5 + .../src/v0.8/keystone/CapabilityRegistry.sol | 240 ++++++++++++++--- .../test/CapabilityRegistry_AddDONTest.t.sol | 179 +++++++++++++ .../CapabilityRegistry_AddNodesTest.t.sol | 72 ++--- ...pabilityRegistry_DeprecateCapability.t.sol | 6 +- ...abilityRegistry_GetCapabilitiesTest.t.sol} | 0 .../CapabilityRegistry_GetCapabilityIds.t.sol | 29 --- ...lityRegistry_RemoveNodeOperatorsTest.t.sol | 2 +- .../CapabilityRegistry_RemoveNodesTest.t.sol | 18 +- .../CapabilityRegistry_UpdateNodesTest.t.sol | 73 +++--- .../src/v0.8/keystone/test/Constants.t.sol | 1 + .../keystone_capability_registry.go | 245 ++++++++++++++++-- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 14 files changed, 708 insertions(+), 169 deletions(-) create mode 100644 .changeset/tame-rules-whisper.md create mode 100644 contracts/.changeset/silly-bags-applaud.md create mode 100644 contracts/src/v0.8/keystone/test/CapabilityRegistry_AddDONTest.t.sol rename contracts/src/v0.8/keystone/test/{CapabilityRegistry_GetCapabilities.t.sol => CapabilityRegistry_GetCapabilitiesTest.t.sol} (100%) delete mode 100644 contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilityIds.t.sol diff --git a/.changeset/tame-rules-whisper.md b/.changeset/tame-rules-whisper.md new file mode 100644 index 00000000000..8f3c66311f9 --- /dev/null +++ b/.changeset/tame-rules-whisper.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal regen geth wrappers for capability registry diff --git a/contracts/.changeset/silly-bags-applaud.md b/contracts/.changeset/silly-bags-applaud.md new file mode 100644 index 00000000000..e2ec0c2e408 --- /dev/null +++ b/contracts/.changeset/silly-bags-applaud.md @@ -0,0 +1,5 @@ +--- +"@chainlink/contracts": patch +--- + +implement add don for capability regsitry diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index 60989fce61a..bb4871c20c5 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -7,6 +7,9 @@ import {IERC165} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfac import {EnumerableSet} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; import {ICapabilityConfiguration} from "./interfaces/ICapabilityConfiguration.sol"; +/// @notice CapabilityRegistry is used to manage Nodes (including their links to Node +/// Operators), Capabilities, and DONs (Decentralized Oracle Networks) which are +/// sets of nodes that support those Capabilities. contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { // Add the library methods using EnumerableSet for EnumerableSet.Bytes32Set; @@ -19,19 +22,36 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { string name; } - struct Node { + struct NodeParams { /// @notice The id of the node operator that manages this node - uint256 nodeOperatorId; + uint32 nodeOperatorId; + /// @notice The signer address for application-layer message verification. + address signer; /// @notice This is an Ed25519 public key that is used to identify a node. /// This key is guaranteed to be unique in the CapabilityRegistry. It is /// used to identify a node in the the P2P network. bytes32 p2pId; + /// @notice The list of hashed capability IDs supported by the node + bytes32[] hashedCapabilityIds; + } + + struct Node { + /// @notice The node's parameters + /// @notice The id of the node operator that manages this node + uint32 nodeOperatorId; + /// @notice The number of times the node's capability has been updated + uint32 configCount; /// @notice The signer address for application-layer message verification. address signer; - /// @notice The list of hashed capability IDs this node supports. This list is - /// never empty and all capabilities are guaranteed to exist in the - /// CapabilityRegistry. - bytes32[] supportedHashedCapabilityIds; + /// @notice This is an Ed25519 public key that is used to identify a node. + /// This key is guaranteed to be unique in the CapabilityRegistry. It is + /// used to identify a node in the the P2P network. + bytes32 p2pId; + /// @notice The node's supported capabilities + /// @dev This is stored as a map so that we can easily update to a set of + /// new capabilities by incrementing the configCount and creating a + /// new set of supported capability IDs + mapping(uint32 configCount => EnumerableSet.Bytes32Set capabilityId) supportedCapabilityIds; } // CapabilityResponseType indicates whether remote response requires @@ -77,6 +97,33 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { address configurationContract; } + /// @notice CapabilityConfiguration is a struct that holds the capability configuration + /// for a specific DON + struct CapabilityConfiguration { + /// @notice The capability Id + bytes32 capabilityId; + /// @notice The capability config specific to a DON. This will be decoded + /// offchain + bytes config; + } + + /// @notice DON (Decentralized Oracle Network) is a grouping of nodes that support + // the same capabilities. + struct DON { + /// @notice Computed. Auto-increment. + uint32 id; + /// @notice True if the DON is public. A public DON means that it accepts + /// external capability requests + bool isPublic; + /// @notice The set of p2pIds of nodes that belong to this DON. A node (the same + // p2pId) can belong to multiple DONs. + EnumerableSet.Bytes32Set nodes; + /// @notice The set of capabilityIds + EnumerableSet.Bytes32Set capabilityIds; + /// @notice Mapping from hashed capability IDs to configs + mapping(bytes32 capabilityId => bytes config) capabilityConfigs; + } + /// @notice This error is thrown when a caller is not allowed /// to execute the transaction error AccessForbidden(); @@ -116,6 +163,11 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param signer The node's signer address event NodeUpdated(bytes32 p2pId, uint256 nodeOperatorId, address signer); + /// @notice This event is emitted when a new DON is created + /// @param donId The ID of the newly created DON + /// @param isPublic True if the newly created DON is public + event DONAdded(uint256 donId, bool isPublic); + /// @notice This error is thrown when trying to set the node's /// signer address to zero error InvalidNodeSigner(); @@ -124,15 +176,32 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// exists. error CapabilityAlreadyExists(); + /// @notice This error is thrown when trying to add a node to a DON where + /// the node does not support the capability + /// @param nodeP2PId The P2P ID of the node + /// @param capabilityId The ID of the capability + error NodeDoesNotSupportCapability(bytes32 nodeP2PId, bytes32 capabilityId); + + /// @notice This error is thrown when trying to add a capability configuration + /// for a capability that was already configured on a DON + /// @param donId The ID of the DON that the capability was configured for + /// @param capabilityId The ID of the capability that was configured + error DuplicateDONCapability(uint32 donId, bytes32 capabilityId); + + /// @notice This error is thrown when trying to add a duplicate node to a DON + /// @param donId The ID of the DON that the node was added for + /// @param nodeP2PId The P2P ID of the node + error DuplicateDONNode(uint32 donId, bytes32 nodeP2PId); + /// @notice This error is thrown when a capability with the provided hashed ID is /// not found. /// @param hashedCapabilityId The hashed ID used for the lookup. error CapabilityDoesNotExist(bytes32 hashedCapabilityId); /// @notice This error is thrown when trying to deprecate a capability that - /// is already deprecated. - /// @param hashedCapabilityId The hashed ID of the capability that is already deprecated. - error CapabilityAlreadyDeprecated(bytes32 hashedCapabilityId); + /// is deprecated. + /// @param hashedCapabilityId The hashed ID of the capability that is deprecated. + error CapabilityIsDeprecated(bytes32 hashedCapabilityId); /// @notice This error is thrown when trying to add a capability with a /// configuration contract that does not implement the required interface. @@ -181,10 +250,17 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Mapping of nodes mapping(bytes32 p2pId => Node node) private s_nodes; + /// @notice Mapping of DON IDs to DONs + mapping(uint32 donId => DON don) private s_dons; + /// @notice The latest node operator ID /// @dev No getter for this as this is an implementation detail uint256 private s_nodeOperatorId; + /// @notice Starting with 1 to avoid confusion with the zero value. + /// @dev No getter for this as this is an implementation detail + uint32 private s_donId = 1; + function typeAndVersion() external pure override returns (string memory) { return "CapabilityRegistry 1.0.0"; } @@ -246,29 +322,34 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Adds nodes. Nodes can be added with deprecated capabilities to /// avoid breaking changes when deprecating capabilities. /// @param nodes The nodes to add - function addNodes(Node[] calldata nodes) external { + function addNodes(NodeParams[] calldata nodes) external { for (uint256 i; i < nodes.length; ++i) { - Node memory node = nodes[i]; + NodeParams memory node = nodes[i]; bool isOwner = msg.sender == owner(); NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); - bool nodeExists = s_nodes[node.p2pId].supportedHashedCapabilityIds.length > 0; + bool nodeExists = s_nodes[node.p2pId].signer != address(0); if (nodeExists || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); if (node.signer == address(0)) revert InvalidNodeSigner(); - if (node.supportedHashedCapabilityIds.length == 0) - revert InvalidNodeCapabilities(node.supportedHashedCapabilityIds); + bytes32[] memory capabilityIds = node.hashedCapabilityIds; + if (capabilityIds.length == 0) revert InvalidNodeCapabilities(capabilityIds); + + ++s_nodes[node.p2pId].configCount; - for (uint256 j; j < node.supportedHashedCapabilityIds.length; ++j) { - if (!s_hashedCapabilityIds.contains(node.supportedHashedCapabilityIds[j])) - revert InvalidNodeCapabilities(node.supportedHashedCapabilityIds); + uint32 capabilityConfigCount = s_nodes[node.p2pId].configCount; + for (uint256 j; j < capabilityIds.length; ++j) { + if (!s_hashedCapabilityIds.contains(capabilityIds[j])) revert InvalidNodeCapabilities(capabilityIds); + s_nodes[node.p2pId].supportedCapabilityIds[capabilityConfigCount].add(capabilityIds[j]); } - s_nodes[node.p2pId] = node; + s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; + s_nodes[node.p2pId].p2pId = node.p2pId; + s_nodes[node.p2pId].signer = node.signer; emit NodeAdded(node.p2pId, node.nodeOperatorId); } } @@ -280,12 +361,11 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { bool isOwner = msg.sender == owner(); for (uint256 i; i < removedNodeP2PIds.length; ++i) { bytes32 p2pId = removedNodeP2PIds[i]; - Node memory node = s_nodes[p2pId]; - bool nodeExists = s_nodes[p2pId].supportedHashedCapabilityIds.length > 0; + bool nodeExists = s_nodes[p2pId].signer != address(0); if (!nodeExists) revert InvalidNodeP2PId(p2pId); - NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; + NodeOperator memory nodeOperator = s_nodeOperators[s_nodes[p2pId].nodeOperatorId]; if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); delete s_nodes[p2pId]; @@ -296,38 +376,52 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Updates nodes. The node admin can update the node's signer address /// and reconfigure its supported capabilities /// @param nodes The nodes to update - function updateNodes(Node[] calldata nodes) external { + function updateNodes(NodeParams[] calldata nodes) external { for (uint256 i; i < nodes.length; ++i) { - Node memory node = nodes[i]; + NodeParams memory node = nodes[i]; bool isOwner = msg.sender == owner(); NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); - bool nodeExists = s_nodes[node.p2pId].supportedHashedCapabilityIds.length > 0; + bool nodeExists = s_nodes[node.p2pId].signer != address(0); if (!nodeExists) revert InvalidNodeP2PId(node.p2pId); if (node.signer == address(0)) revert InvalidNodeSigner(); - if (node.supportedHashedCapabilityIds.length == 0) - revert InvalidNodeCapabilities(node.supportedHashedCapabilityIds); + bytes32[] memory supportedCapabilityIds = node.hashedCapabilityIds; + if (supportedCapabilityIds.length == 0) revert InvalidNodeCapabilities(supportedCapabilityIds); - for (uint256 j; j < node.supportedHashedCapabilityIds.length; ++j) { - if (!s_hashedCapabilityIds.contains(node.supportedHashedCapabilityIds[j])) - revert InvalidNodeCapabilities(node.supportedHashedCapabilityIds); + s_nodes[node.p2pId].configCount++; + uint32 capabilityConfigCount = s_nodes[node.p2pId].configCount; + for (uint256 j; j < supportedCapabilityIds.length; ++j) { + if (!s_hashedCapabilityIds.contains(supportedCapabilityIds[j])) + revert InvalidNodeCapabilities(supportedCapabilityIds); + s_nodes[node.p2pId].supportedCapabilityIds[capabilityConfigCount].add(supportedCapabilityIds[j]); } - s_nodes[node.p2pId] = node; + s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; + s_nodes[node.p2pId].p2pId = node.p2pId; + s_nodes[node.p2pId].signer = node.signer; emit NodeUpdated(node.p2pId, node.nodeOperatorId, node.signer); } } /// @notice Gets a node's data /// @param p2pId The P2P ID of the node to query for - /// @return Node The node data - function getNode(bytes32 p2pId) external view returns (Node memory) { - return s_nodes[p2pId]; + /// @return NodeParams The node data + /// @return configCount The number of times the node has been configured + function getNode(bytes32 p2pId) external view returns (NodeParams memory, uint32 configCount) { + return ( + NodeParams({ + nodeOperatorId: s_nodes[p2pId].nodeOperatorId, + p2pId: s_nodes[p2pId].p2pId, + signer: s_nodes[p2pId].signer, + hashedCapabilityIds: s_nodes[p2pId].supportedCapabilityIds[s_nodes[p2pId].configCount].values() + }), + s_nodes[p2pId].configCount + ); } function addCapability(Capability calldata capability) external onlyOwner { @@ -353,8 +447,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param hashedCapabilityId The ID of the capability to deprecate function deprecateCapability(bytes32 hashedCapabilityId) external onlyOwner { if (!s_hashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityDoesNotExist(hashedCapabilityId); - if (s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId)) - revert CapabilityAlreadyDeprecated(hashedCapabilityId); + if (s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityIsDeprecated(hashedCapabilityId); s_deprecatedHashedCapabilityIds.add(hashedCapabilityId); emit CapabilityDeprecated(hashedCapabilityId); @@ -406,4 +499,81 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { function isCapabilityDeprecated(bytes32 hashedCapabilityId) external view returns (bool) { return s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId); } + + /// @notice Adds a DON made up by a group of nodes that support a list + /// of capability configurations + /// @param nodes The nodes making up the DON + /// @param capabilityConfigurations The list of configurations for the + /// capabilities supported by the DON + /// @param isPublic True if the DON is public + function addDON( + bytes32[] calldata nodes, + CapabilityConfiguration[] calldata capabilityConfigurations, + bool isPublic + ) external onlyOwner { + uint32 id = s_donId; + + s_dons[id].id = id; + s_dons[id].isPublic = isPublic; + + for (uint256 i; i < nodes.length; ++i) { + bytes32 nodeP2PId = nodes[i]; + if (s_dons[id].nodes.contains(nodeP2PId)) revert DuplicateDONNode(id, nodeP2PId); + + s_dons[id].nodes.add(nodeP2PId); + } + + for (uint256 i; i < capabilityConfigurations.length; ++i) { + CapabilityConfiguration calldata configuration = capabilityConfigurations[i]; + bytes32 capabilityId = configuration.capabilityId; + + if (!s_hashedCapabilityIds.contains(capabilityId)) revert CapabilityDoesNotExist(capabilityId); + if (s_deprecatedHashedCapabilityIds.contains(capabilityId)) revert CapabilityIsDeprecated(capabilityId); + + if (s_dons[id].capabilityIds.contains(capabilityId)) revert DuplicateDONCapability(id, capabilityId); + + for (uint256 j; j < nodes.length; ++j) { + bytes32 nodeP2PId = nodes[j]; + if (!s_nodes[nodeP2PId].supportedCapabilityIds[s_nodes[nodeP2PId].configCount].contains(capabilityId)) + revert NodeDoesNotSupportCapability(nodeP2PId, capabilityId); + } + + s_dons[id].capabilityIds.add(capabilityId); + s_dons[id].capabilityConfigs[capabilityId] = configuration.config; + } + + ++s_donId; + + emit DONAdded(id, isPublic); + } + + /// @notice Gets DON's data + /// @param donId The DON ID + /// @return uint32 The DON ID + /// @return bool True if the DON is public + /// @return bytes32[] The list of node P2P IDs that are in the DON + /// @return CapabilityConfiguration[] The list of capability configurations supported by the DON + function getDON( + uint32 donId + ) external view returns (uint32, bool, bytes32[] memory, CapabilityConfiguration[] memory) { + bytes32[] memory capabilityIds = s_dons[donId].capabilityIds.values(); + CapabilityConfiguration[] memory capabilityConfigurations = new CapabilityConfiguration[](capabilityIds.length); + + for (uint256 i; i < capabilityConfigurations.length; ++i) { + capabilityConfigurations[i] = CapabilityConfiguration({ + capabilityId: capabilityIds[i], + config: s_dons[donId].capabilityConfigs[capabilityIds[i]] + }); + } + + return (s_dons[donId].id, s_dons[donId].isPublic, s_dons[donId].nodes.values(), capabilityConfigurations); + } + + /// @notice Returns the DON specific configuration for a capability + /// @param donId The DON's ID + /// @param capabilityId The Capability ID + /// @return bytes The DON specific configuration for the capability + function getDONCapabilityConfig(uint32 donId, bytes32 capabilityId) external view returns (bytes memory) { + return s_dons[donId].capabilityConfigs[capabilityId]; + } } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddDONTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddDONTest.t.sol new file mode 100644 index 00000000000..9b215edccdc --- /dev/null +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddDONTest.t.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {BaseTest} from "./BaseTest.t.sol"; + +import {CapabilityRegistry} from "../CapabilityRegistry.sol"; + +contract CapabilityRegistry_AddDONTest is BaseTest { + event DONAdded(uint256 donId, bool isPublic); + + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; + bytes32 private constant INVALID_P2P_ID = bytes32("fake-p2p"); + bytes private constant CONFIG = bytes("onchain-config"); + + function setUp() public override { + BaseTest.setUp(); + + s_capabilityRegistry.addNodeOperators(_getNodeOperators()); + s_capabilityRegistry.addCapability(s_basicCapability); + s_capabilityRegistry.addCapability(s_capabilityWithConfigurationContract); + + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](2); + bytes32[] memory capabilityIds = new bytes32[](2); + capabilityIds[0] = s_basicHashedCapabilityId; + capabilityIds[1] = s_capabilityWithConfigurationContractId; + + nodes[0] = CapabilityRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID, + signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, + hashedCapabilityIds: capabilityIds + }); + + bytes32[] memory nodeTwoCapabilityIds = new bytes32[](1); + nodeTwoCapabilityIds[0] = s_basicHashedCapabilityId; + + nodes[1] = CapabilityRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID_TWO, + signer: NODE_OPERATOR_TWO_SIGNER_ADDRESS, + hashedCapabilityIds: nodeTwoCapabilityIds + }); + + changePrank(NODE_OPERATOR_ONE_ADMIN); + s_capabilityRegistry.addNodes(nodes); + + changePrank(ADMIN); + } + + function test_RevertWhen_CalledByNonAdmin() public { + changePrank(STRANGER); + vm.expectRevert("Only callable by owner"); + bytes32[] memory nodes = new bytes32[](1); + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_RevertWhen_NodeDoesNotSupportCapability() public { + bytes32[] memory nodes = new bytes32[](1); + nodes[0] = P2P_ID_TWO; + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_capabilityWithConfigurationContractId, + config: CONFIG + }); + vm.expectRevert( + abi.encodeWithSelector( + CapabilityRegistry.NodeDoesNotSupportCapability.selector, + P2P_ID_TWO, + s_capabilityWithConfigurationContractId + ) + ); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_RevertWhen_CapabilityDoesNotExist() public { + bytes32[] memory nodes = new bytes32[](1); + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_nonExistentHashedCapabilityId, + config: CONFIG + }); + vm.expectRevert( + abi.encodeWithSelector(CapabilityRegistry.CapabilityDoesNotExist.selector, s_nonExistentHashedCapabilityId) + ); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_RevertWhen_DuplicateCapabilityAdded() public { + bytes32[] memory nodes = new bytes32[](1); + nodes[0] = P2P_ID; + + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](2); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + capabilityConfigs[1] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + + vm.expectRevert( + abi.encodeWithSelector(CapabilityRegistry.DuplicateDONCapability.selector, 1, s_basicHashedCapabilityId) + ); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_RevertWhen_DeprecatedCapabilityAdded() public { + bytes32 capabilityId = s_basicHashedCapabilityId; + s_capabilityRegistry.deprecateCapability(capabilityId); + + bytes32[] memory nodes = new bytes32[](1); + nodes[0] = P2P_ID; + + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({capabilityId: capabilityId, config: CONFIG}); + + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.CapabilityIsDeprecated.selector, capabilityId)); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_RevertWhen_DuplicateNodeAdded() public { + bytes32[] memory nodes = new bytes32[](2); + nodes[0] = P2P_ID; + nodes[1] = P2P_ID; + + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.DuplicateDONNode.selector, 1, P2P_ID)); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + } + + function test_AddDON() public { + bytes32[] memory nodes = new bytes32[](1); + nodes[0] = P2P_ID; + + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + + vm.expectEmit(true, true, true, true, address(s_capabilityRegistry)); + emit DONAdded(1, true); + s_capabilityRegistry.addDON(nodes, capabilityConfigs, true); + + ( + uint32 id, + bool isPublic, + bytes32[] memory donNodes, + CapabilityRegistry.CapabilityConfiguration[] memory donCapabilityConfigs + ) = s_capabilityRegistry.getDON(1); + assertEq(id, 1); + assertEq(isPublic, true); + assertEq(donCapabilityConfigs.length, 1); + assertEq(donCapabilityConfigs[0].capabilityId, s_basicHashedCapabilityId); + assertEq(s_capabilityRegistry.getDONCapabilityConfig(1, s_basicHashedCapabilityId), CONFIG); + + assertEq(donNodes.length, 1); + assertEq(donNodes[0], P2P_ID); + } +} diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol index 9174e4ed0d3..116f97e441e 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol @@ -7,7 +7,7 @@ import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_AddNodesTest is BaseTest { event NodeAdded(bytes32 p2pId, uint256 nodeOperatorId); - uint256 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; function setUp() public override { @@ -20,16 +20,16 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { function test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() public { changePrank(STRANGER); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); @@ -38,16 +38,16 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { function test_RevertWhen_SignerAddressEmpty() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: address(0), - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeSigner.selector)); @@ -56,17 +56,18 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { function test_RevertWhen_AddingDuplicateP2PId() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); + s_capabilityRegistry.addNodes(nodes); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, P2P_ID)); @@ -75,16 +76,16 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { function test_RevertWhen_P2PIDEmpty() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: bytes32(""), signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, bytes32(""))); @@ -93,89 +94,92 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { function test_RevertWhen_AddingNodeWithoutCapabilities() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](0); - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeCapabilities.selector, hashedCapabilityIds)); s_capabilityRegistry.addNodes(nodes); } function test_RevertWhen_AddingNodeWithInvalidCapability() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_nonExistentHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeCapabilities.selector, hashedCapabilityIds)); s_capabilityRegistry.addNodes(nodes); } - function test_AddsNode() public { + function test_AddsNodeParams() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](2); hashedCapabilityIds[0] = s_basicHashedCapabilityId; hashedCapabilityIds[1] = s_capabilityWithConfigurationContractId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectEmit(address(s_capabilityRegistry)); emit NodeAdded(P2P_ID, TEST_NODE_OPERATOR_ONE_ID); s_capabilityRegistry.addNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, TEST_NODE_OPERATOR_ONE_ID); assertEq(node.p2pId, P2P_ID); - assertEq(node.supportedHashedCapabilityIds.length, 2); - assertEq(node.supportedHashedCapabilityIds[0], s_basicHashedCapabilityId); - assertEq(node.supportedHashedCapabilityIds[1], s_capabilityWithConfigurationContractId); + assertEq(node.hashedCapabilityIds.length, 2); + assertEq(node.hashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(node.hashedCapabilityIds[1], s_capabilityWithConfigurationContractId); + assertEq(configCount, 1); } function test_OwnerCanAddNodes() public { changePrank(ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](2); hashedCapabilityIds[0] = s_basicHashedCapabilityId; hashedCapabilityIds[1] = s_capabilityWithConfigurationContractId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectEmit(address(s_capabilityRegistry)); emit NodeAdded(P2P_ID, TEST_NODE_OPERATOR_ONE_ID); s_capabilityRegistry.addNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, TEST_NODE_OPERATOR_ONE_ID); assertEq(node.p2pId, P2P_ID); - assertEq(node.supportedHashedCapabilityIds.length, 2); - assertEq(node.supportedHashedCapabilityIds[0], s_basicHashedCapabilityId); - assertEq(node.supportedHashedCapabilityIds[1], s_capabilityWithConfigurationContractId); + assertEq(node.hashedCapabilityIds.length, 2); + assertEq(node.hashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(node.hashedCapabilityIds[1], s_capabilityWithConfigurationContractId); + assertEq(configCount, 1); } } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_DeprecateCapability.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_DeprecateCapability.t.sol index b2f67339767..0ae5507de45 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_DeprecateCapability.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_DeprecateCapability.t.sol @@ -33,7 +33,7 @@ contract CapabilityRegistry_AddCapabilityTest is BaseTest { s_capabilityRegistry.deprecateCapability(s_nonExistentHashedCapabilityId); } - function test_RevertWhen_CapabilityAlreadyDeprecated() public { + function test_RevertWhen_CapabilityIsDeprecated() public { bytes32 hashedCapabilityId = s_capabilityRegistry.getHashedCapabilityId( s_basicCapability.labelledName, s_basicCapability.version @@ -41,9 +41,7 @@ contract CapabilityRegistry_AddCapabilityTest is BaseTest { s_capabilityRegistry.deprecateCapability(hashedCapabilityId); - vm.expectRevert( - abi.encodeWithSelector(CapabilityRegistry.CapabilityAlreadyDeprecated.selector, hashedCapabilityId) - ); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.CapabilityIsDeprecated.selector, hashedCapabilityId)); s_capabilityRegistry.deprecateCapability(hashedCapabilityId); } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilities.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol similarity index 100% rename from contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilities.t.sol rename to contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilityIds.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilityIds.t.sol deleted file mode 100644 index b3dc333f5c3..00000000000 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilityIds.t.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -import {BaseTest} from "./BaseTest.t.sol"; -import {CapabilityRegistry} from "../CapabilityRegistry.sol"; - -contract CapabilityRegistry_GetCapabilitiesTest is BaseTest { - function test_ReturnsCapabilities() public { - s_capabilityRegistry.addCapability(s_basicCapability); - s_capabilityRegistry.addCapability(s_capabilityWithConfigurationContract); - - CapabilityRegistry.Capability[] memory capabilities = s_capabilityRegistry.getCapabilities(); - - assertEq(capabilities.length, 2); - - assertEq(capabilities[0].labelledName, "data-streams-reports"); - assertEq(capabilities[0].version, "1.0.0"); - assertEq(uint256(capabilities[0].responseType), uint256(CapabilityRegistry.CapabilityResponseType.REPORT)); - assertEq(capabilities[0].configurationContract, address(0)); - - assertEq(capabilities[1].labelledName, "read-ethereum-mainnet-gas-price"); - assertEq(capabilities[1].version, "1.0.2"); - assertEq( - uint256(capabilities[1].responseType), - uint256(CapabilityRegistry.CapabilityResponseType.OBSERVATION_IDENTICAL) - ); - assertEq(capabilities[1].configurationContract, address(s_capabilityConfigurationContract)); - } -} diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol index 31b043fab3e..18b0ed6e2ac 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol @@ -7,7 +7,7 @@ import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_RemoveNodeOperatorsTest is BaseTest { event NodeOperatorRemoved(uint256 nodeOperatorId); - uint256 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; function setUp() public override { diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol index d432a8aed04..8e3542c8825 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol @@ -7,7 +7,7 @@ import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_RemoveNodesTest is BaseTest { event NodeRemoved(bytes32 p2pId); - uint256 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; bytes32 private constant INVALID_P2P_ID = bytes32("fake-p2p"); @@ -18,16 +18,16 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { s_capabilityRegistry.addCapability(s_basicCapability); s_capabilityRegistry.addCapability(s_capabilityWithConfigurationContract); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](2); hashedCapabilityIds[0] = s_basicHashedCapabilityId; hashedCapabilityIds[1] = s_capabilityWithConfigurationContractId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); changePrank(NODE_OPERATOR_ONE_ADMIN); @@ -72,11 +72,12 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { emit NodeRemoved(P2P_ID); s_capabilityRegistry.removeNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, 0); assertEq(node.p2pId, bytes32("")); assertEq(node.signer, address(0)); - assertEq(node.supportedHashedCapabilityIds.length, 0); + assertEq(node.hashedCapabilityIds.length, 0); + assertEq(configCount, 0); } function test_OwnerCanRemoveNodes() public { @@ -89,10 +90,11 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { emit NodeRemoved(P2P_ID); s_capabilityRegistry.removeNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, 0); assertEq(node.p2pId, bytes32("")); assertEq(node.signer, address(0)); - assertEq(node.supportedHashedCapabilityIds.length, 0); + assertEq(node.hashedCapabilityIds.length, 0); + assertEq(configCount, 0); } } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol index 7ccbd14dbf2..e97fde01209 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol @@ -7,7 +7,7 @@ import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_UpdateNodesTest is BaseTest { event NodeUpdated(bytes32 p2pId, uint256 nodeOperatorId, address signer); - uint256 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; bytes32 private constant INVALID_P2P_ID = bytes32("fake-p2p"); @@ -18,16 +18,16 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { s_capabilityRegistry.addCapability(s_basicCapability); s_capabilityRegistry.addCapability(s_capabilityWithConfigurationContract); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](2); hashedCapabilityIds[0] = s_basicHashedCapabilityId; hashedCapabilityIds[1] = s_capabilityWithConfigurationContractId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); changePrank(NODE_OPERATOR_ONE_ADMIN); @@ -37,16 +37,16 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { function test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() public { changePrank(STRANGER); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_TWO_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); @@ -55,16 +55,16 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { function test_RevertWhen_NodeDoesNotExist() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: INVALID_P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, INVALID_P2P_ID)); @@ -73,16 +73,16 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { function test_RevertWhen_P2PIDEmpty() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: bytes32(""), signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, bytes32(""))); @@ -91,16 +91,16 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { function test_RevertWhen_SignerAddressEmpty() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: address(0), - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeSigner.selector)); @@ -109,87 +109,90 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { function test_RevertWhen_UpdatingNodeWithoutCapabilities() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](0); - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeCapabilities.selector, hashedCapabilityIds)); s_capabilityRegistry.updateNodes(nodes); } function test_RevertWhen_AddingNodeWithInvalidCapability() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_nonExistentHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeCapabilities.selector, hashedCapabilityIds)); s_capabilityRegistry.updateNodes(nodes); } - function test_UpdatesNode() public { + function test_UpdatesNodeParams() public { changePrank(NODE_OPERATOR_ONE_ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_TWO_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectEmit(address(s_capabilityRegistry)); emit NodeUpdated(P2P_ID, TEST_NODE_OPERATOR_ONE_ID, NODE_OPERATOR_TWO_SIGNER_ADDRESS); s_capabilityRegistry.updateNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, TEST_NODE_OPERATOR_ONE_ID); assertEq(node.p2pId, P2P_ID); assertEq(node.signer, NODE_OPERATOR_TWO_SIGNER_ADDRESS); - assertEq(node.supportedHashedCapabilityIds.length, 1); - assertEq(node.supportedHashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(node.hashedCapabilityIds.length, 1); + assertEq(node.hashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(configCount, 2); } function test_OwnerCanUpdateNodes() public { changePrank(ADMIN); - CapabilityRegistry.Node[] memory nodes = new CapabilityRegistry.Node[](1); + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](1); bytes32[] memory hashedCapabilityIds = new bytes32[](1); hashedCapabilityIds[0] = s_basicHashedCapabilityId; - nodes[0] = CapabilityRegistry.Node({ + nodes[0] = CapabilityRegistry.NodeParams({ nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, p2pId: P2P_ID, signer: NODE_OPERATOR_TWO_SIGNER_ADDRESS, - supportedHashedCapabilityIds: hashedCapabilityIds + hashedCapabilityIds: hashedCapabilityIds }); vm.expectEmit(address(s_capabilityRegistry)); emit NodeUpdated(P2P_ID, TEST_NODE_OPERATOR_ONE_ID, NODE_OPERATOR_TWO_SIGNER_ADDRESS); s_capabilityRegistry.updateNodes(nodes); - CapabilityRegistry.Node memory node = s_capabilityRegistry.getNode(P2P_ID); + (CapabilityRegistry.NodeParams memory node, uint32 configCount) = s_capabilityRegistry.getNode(P2P_ID); assertEq(node.nodeOperatorId, TEST_NODE_OPERATOR_ONE_ID); assertEq(node.p2pId, P2P_ID); assertEq(node.signer, NODE_OPERATOR_TWO_SIGNER_ADDRESS); - assertEq(node.supportedHashedCapabilityIds.length, 1); - assertEq(node.supportedHashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(node.hashedCapabilityIds.length, 1); + assertEq(node.hashedCapabilityIds[0], s_basicHashedCapabilityId); + assertEq(configCount, 2); } } diff --git a/contracts/src/v0.8/keystone/test/Constants.t.sol b/contracts/src/v0.8/keystone/test/Constants.t.sol index 0ef99f4f477..48308c6fbf5 100644 --- a/contracts/src/v0.8/keystone/test/Constants.t.sol +++ b/contracts/src/v0.8/keystone/test/Constants.t.sol @@ -12,4 +12,5 @@ contract Constants { address internal NODE_OPERATOR_TWO_SIGNER_ADDRESS = address(4444); bytes32 internal P2P_ID = hex"e42415859707d90ed4dc534ad730f187a17b0c368e1beec2e9b995587c4b0a05"; + bytes32 internal P2P_ID_TWO = hex"f53415859707d90ed4dc534ad730f187a17b0c368e1beec2e9b995587c4b0a05"; } diff --git a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go index afa4dd13812..3357bf8f5fe 100644 --- a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go +++ b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go @@ -37,11 +37,9 @@ type CapabilityRegistryCapability struct { ConfigurationContract common.Address } -type CapabilityRegistryNode struct { - NodeOperatorId *big.Int - P2pId [32]byte - Signer common.Address - SupportedHashedCapabilityIds [][32]byte +type CapabilityRegistryCapabilityConfiguration struct { + CapabilityId [32]byte + Config []byte } type CapabilityRegistryNodeOperator struct { @@ -49,9 +47,16 @@ type CapabilityRegistryNodeOperator struct { Name string } +type CapabilityRegistryNodeParams struct { + NodeOperatorId uint32 + Signer common.Address + P2pId [32]byte + HashedCapabilityIds [][32]byte +} + var CapabilityRegistryMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAlreadyDeprecated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"capability\",\"type\":\"tuple\"}],\"name\":\"addCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"supportedHashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"deprecateCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"supportedHashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.Node\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"supportedHashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000a5565b50505062000150565b336001600160a01b03821603620000ff5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61293380620001606000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806365c14dc7116100b2578063ae3c241c11610081578063c2d483a111610066578063c2d483a114610301578063ddbe4f8214610314578063f2fde38b1461032957600080fd5b8063ae3c241c146102db578063b38e51f6146102ee57600080fd5b806365c14dc71461026b57806379ba50971461028b5780638da5cb5b146102935780639cb7c5f4146102bb57600080fd5b80631cdf63431161010957806336b402fb116100ee57806336b402fb146101f0578063398f37731461023857806350c946fe1461024b57600080fd5b80631cdf6343146101ca5780632c01a1e8146101dd57600080fd5b80630c5801e31461013b578063117392ce146101505780631257001114610163578063181f5a771461018b575b600080fd5b61014e610149366004611eda565b61033c565b005b61014e61015e366004611f46565b61064d565b610176610171366004611f5e565b610898565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101829190611fdb565b61014e6101d8366004611fee565b6108ab565b61014e6101eb366004611fee565b61096e565b61022a6101fe366004612030565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b604051908152602001610182565b61014e610246366004611fee565b610c6f565b61025e610259366004611f5e565b610e08565b6040516101829190612052565b61027e610279366004611f5e565b610ed0565b60405161018291906120d8565b61014e610fad565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610182565b6102ce6102c9366004611f5e565b6110aa565b60405161018291906121ba565b61014e6102e9366004611f5e565b611154565b61014e6102fc366004611fee565b61121f565b61014e61030f366004611fee565b61163b565b61031c611a1c565b60405161018291906121c8565b61014e610337366004612238565b611b61565b828114610384576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156106455760008686838181106103bc576103bc612255565b90506020020135905060008585848181106103d9576103d9612255565b90506020028101906103eb9190612284565b6103f49061238c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610445576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061048257503373ffffffffffffffffffffffffffffffffffffffff851614155b156104b9576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614158061056b57506020808201516040516104ff9201611fdb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000868152600783529290922091926105529260010191016124a5565b6040516020818303038152906040528051906020012014155b15610632578051600083815260076020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921782558201516001909101906105d89082612594565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f14c8f513e8a6d86d2d16b0cb64976de4e72386c4f8068eca3b7354373f8fe97a8383602001516040516106299291906126ae565b60405180910390a25b50508061063e906126f6565b90506103a0565b505050505050565b610655611b75565b60408051823560208281019190915280840135828401528251808303840181526060909201909252805191012061068d600382611bf8565b156106c4576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106d66080840160608501612238565b73ffffffffffffffffffffffffffffffffffffffff1614610841576107016080830160608401612238565b73ffffffffffffffffffffffffffffffffffffffff163b15806107e1575061072f6080830160608401612238565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f884efe6100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff91909116906301ffc9a790602401602060405180830381865afa1580156107bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107df919061272e565b155b15610841576107f66080830160608401612238565b6040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161037b565b61084c600382611c13565b50600081815260026020526040902082906108678282612750565b505060405181907f65610e5677eedff94555572640e442f89848a109ef8593fa927ac30b2565ff0690600090a25050565b60006108a5600583611bf8565b92915050565b6108b3611b75565b60005b818110156109695760008383838181106108d2576108d2612255565b60209081029290920135600081815260079093526040832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559093509190506109236001830182611dd6565b50506040518181527f1e5877d7b3001d1569bf733b76c7eceda58bd6c031e5b8d0b7042308ba2e9d4f9060200160405180910390a150610962816126f6565b90506108b6565b505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c695760008484838181106109a8576109a8612255565b602090810292909201356000818152600884526040808220815160808101835281548152600182015481880152600282015473ffffffffffffffffffffffffffffffffffffffff16818401526003820180548451818a0281018a0190955280855295985093969095509093606086019391830182828015610a4857602002820191906000526020600020905b815481526020019060010190808311610a34575b50505091909252505050600083815260086020526040902060030154909150151580610aa3576040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004810184905260240161037b565b815160009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610aef90612458565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1b90612458565b8015610b685780601f10610b3d57610100808354040283529160200191610b68565b820191906000526020600020905b815481529060010190602001808311610b4b57829003601f168201915b505050505081525050905085158015610b985750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610bcf576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600860205260408120818155600181018290556002810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590610c1f6003830182611e10565b50506040518481527f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb97532059060200160405180910390a15050505080610c62906126f6565b905061098c565b50505050565b610c77611b75565b60005b81811015610969576000838383818110610c9657610c96612255565b9050602002810190610ca89190612284565b610cb19061238c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d02576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815260008681526007909252939020825181547fffffffffffffffffffffffff000000000000000000000000000000000000000016921691909117815591519091906001820190610d859082612594565b50905050600960008154610d98906126f6565b909155508151602083015160405173ffffffffffffffffffffffffffffffffffffffff909216917fda6697b182650034bd205cdc2dbfabb06bdb3a0a83a2b45bfefa3c4881284e0b91610ded918591906126ae565b60405180910390a2505080610e01906126f6565b9050610c7a565b6040805160808101825260008082526020820181905291810191909152606080820152600082815260086020908152604091829020825160808101845281548152600182015481840152600282015473ffffffffffffffffffffffffffffffffffffffff16818501526003820180548551818602810186019096528086529194929360608601939290830182828015610ec057602002820191906000526020600020905b815481526020019060010190808311610eac575b5050505050815250509050919050565b6040805180820190915260008152606060208201526000828152600760209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191610f2d90612458565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990612458565b8015610ec05780601f10610f7b57610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610f8957505050919092525091949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461102e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161037b565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff16908111156111135761111361211b565b60018111156111245761112461211b565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61115c611b75565b611167600382611bf8565b6111a0576040517fe181733f0000000000000000000000000000000000000000000000000000000081526004810182905260240161037b565b6111ab600582611bf8565b156111e5576040517f16950d1d0000000000000000000000000000000000000000000000000000000081526004810182905260240161037b565b6111f0600582611c13565b5060405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250565b60005b8181101561096957600083838381811061123e5761123e612255565b905060200281019061125091906127d2565b61125990612806565b9050600061127c60005473ffffffffffffffffffffffffffffffffffffffff1690565b825160009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916112d390612458565b80601f01602080910402602001604051908101604052809291908181526020018280546112ff90612458565b801561134c5780601f106113215761010080835404028352916020019161134c565b820191906000526020600020905b81548152906001019060200180831161132f57829003601f168201915b50505050508152505090508115801561137c5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113b3576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208084015160009081526008909152604090206003015415158061140c5783602001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161037b91815260200190565b604084015173ffffffffffffffffffffffffffffffffffffffff1661145d576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360600151516000036114a25783606001516040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161037b91906128db565b60005b84606001515181101561152f576114e3856060015182815181106114cb576114cb612255565b60200260200101516003611bf890919063ffffffff16565b61151f5784606001516040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161037b91906128db565b611528816126f6565b90506114a5565b506020848101805160009081526008835260409081902087518155915160018301558601516002820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790556060860151805187936115b4926003850192910190611e2e565b509050507f6bbba867c646be512c2f3241e65fdffdefd5528d7e7939649e06e10ee5addc3e84602001518560000151866040015160405161161e93929190928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b60405180910390a15050505080611634906126f6565b9050611222565b60005b8181101561096957600083838381811061165a5761165a612255565b905060200281019061166c91906127d2565b61167590612806565b9050600061169860005473ffffffffffffffffffffffffffffffffffffffff1690565b825160009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916116ef90612458565b80601f016020809104026020016040519081016040528092919081815260200182805461171b90612458565b80156117685780601f1061173d57610100808354040283529160200191611768565b820191906000526020600020905b81548152906001019060200180831161174b57829003601f168201915b5050505050815250509050811580156117985750805173ffffffffffffffffffffffffffffffffffffffff163314155b156117cf576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602080840151600090815260089091526040902060030154151580806117f757506020840151155b156118365783602001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161037b91815260200190565b604084015173ffffffffffffffffffffffffffffffffffffffff16611887576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360600151516000036118cc5783606001516040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161037b91906128db565b60005b846060015151811015611941576118f5856060015182815181106114cb576114cb612255565b6119315784606001516040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161037b91906128db565b61193a816126f6565b90506118cf565b506020848101805160009081526008835260409081902087518155915160018301558601516002820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790556060860151805187936119c6926003850192910190611e2e565b505050602084810151855160408051928352928201527f5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f910160405180910390a15050505080611a15906126f6565b905061163e565b60606000611a2a6003611c1f565b90506000611a386005611c2c565b8251611a449190612913565b67ffffffffffffffff811115611a5c57611a5c6122c2565b604051908082528060200260200182016040528015611acc57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611a7a5790505b5090506000805b8351811015611b58576000848281518110611af057611af0612255565b60200260200101519050611b0e816005611bf890919063ffffffff16565b611b4757611b1b816110aa565b848481518110611b2d57611b2d612255565b60200260200101819052508280611b43906126f6565b9350505b50611b51816126f6565b9050611ad3565b50909392505050565b611b69611b75565b611b7281611c36565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161037b565b565b600081815260018301602052604081205415155b9392505050565b6000611c0c8383611d2b565b60606000611c0c83611d7a565b60006108a5825490565b3373ffffffffffffffffffffffffffffffffffffffff821603611cb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161037b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600183016020526040812054611d72575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108a5565b5060006108a5565b606081600001805480602002602001604051908101604052809291908181526020018280548015611dca57602002820191906000526020600020905b815481526020019060010190808311611db6575b50505050509050919050565b508054611de290612458565b6000825580601f10611df2575050565b601f016020900490600052602060002090810190611b729190611e79565b5080546000825590600052602060002090810190611b729190611e79565b828054828255906000526020600020908101928215611e69579160200282015b82811115611e69578251825591602001919060010190611e4e565b50611e75929150611e79565b5090565b5b80821115611e755760008155600101611e7a565b60008083601f840112611ea057600080fd5b50813567ffffffffffffffff811115611eb857600080fd5b6020830191508360208260051b8501011115611ed357600080fd5b9250929050565b60008060008060408587031215611ef057600080fd5b843567ffffffffffffffff80821115611f0857600080fd5b611f1488838901611e8e565b90965094506020870135915080821115611f2d57600080fd5b50611f3a87828801611e8e565b95989497509550505050565b600060808284031215611f5857600080fd5b50919050565b600060208284031215611f7057600080fd5b5035919050565b6000815180845260005b81811015611f9d57602081850181015186830182015201611f81565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000611c0c6020830184611f77565b6000806020838503121561200157600080fd5b823567ffffffffffffffff81111561201857600080fd5b61202485828601611e8e565b90969095509350505050565b6000806040838503121561204357600080fd5b50508035926020909101359150565b6000602080835260a0830184518285015281850151604085015273ffffffffffffffffffffffffffffffffffffffff6040860151166060850152606085015160808086015281815180845260c0870191508483019350600092505b808310156120cd57835182529284019260019290920191908401906120ad565b509695505050505050565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152600060208301516040808401526121136060840182611f77565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110612194577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b608081016108a5828461214a565b6020808252825182820181905260009190848201906040850190845b8181101561220a576121f783855161214a565b92840192608092909201916001016121e4565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7257600080fd5b60006020828403121561224a57600080fd5b8135611c0c81612216565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126122b857600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612314576123146122c2565b60405290565b6040516080810167ffffffffffffffff81118282101715612314576123146122c2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612384576123846122c2565b604052919050565b60006040823603121561239e57600080fd5b6123a66122f1565b82356123b181612216565b815260208381013567ffffffffffffffff808211156123cf57600080fd5b9085019036601f8301126123e257600080fd5b8135818111156123f4576123f46122c2565b612424847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161233d565b9150808252368482850101111561243a57600080fd5b80848401858401376000908201840152918301919091525092915050565b600181811c9082168061246c57607f821691505b602082108103611f58577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006020808352600084546124b981612458565b808487015260406001808416600081146124da576001811461251257612540565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612540565b896000528660002060005b858110156125385781548b820186015290830190880161251d565b8a0184019650505b509398975050505050505050565b601f82111561096957600081815260208120601f850160051c810160208610156125755750805b601f850160051c820191505b8181101561064557828155600101612581565b815167ffffffffffffffff8111156125ae576125ae6122c2565b6125c2816125bc8454612458565b8461254e565b602080601f83116001811461261557600084156125df5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610645565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561266257888601518255948401946001909101908401612643565b508582101561269e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8281526040602082015260006121136040830184611f77565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612727576127276126c7565b5060010190565b60006020828403121561274057600080fd5b81518015158114611c0c57600080fd5b81358155602082013560018201556002810160408301356002811061277457600080fd5b8154606085013561278481612216565b74ffffffffffffffffffffffffffffffffffffffff008160081b1660ff84167fffffffffffffffffffffff000000000000000000000000000000000000000000841617178455505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126122b857600080fd5b60006080823603121561281857600080fd5b61282061231a565b8235815260208084013581830152604084013561283c81612216565b6040830152606084013567ffffffffffffffff8082111561285c57600080fd5b9085019036601f83011261286f57600080fd5b813581811115612881576128816122c2565b8060051b915061289284830161233d565b81815291830184019184810190368411156128ac57600080fd5b938501935b838510156128ca578435825293850193908501906128b1565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561220a578351835292840192918401916001016128f7565b818103818111156108a5576108a56126c756fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"donId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"DONAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"capability\",\"type\":\"tuple\"}],\"name\":\"addCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"deprecateCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getDONCapabilityConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052600b805463ffffffff191660011790553480156200002157600080fd5b503380600081620000795760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ac57620000ac81620000b5565b50505062000160565b336001600160a01b038216036200010f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000070565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6134b380620001706000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806350e03b16116100d85780638da5cb5b1161008c578063b06e07a711610066578063b06e07a71461038f578063ddbe4f82146103a2578063f2fde38b146103b757600080fd5b80638da5cb5b146103345780639cb7c5f41461035c578063ae3c241c1461037c57600080fd5b806365c14dc7116100bd57806365c14dc7146102f95780636ae5c5911461031957806379ba50971461032c57600080fd5b806350e03b16146102d35780635840cd45146102e657600080fd5b8063235374051161012f57806336b402fb1161011457806336b402fb14610257578063398f37731461029f57806350c946fe146102b257600080fd5b806323537405146102215780632c01a1e81461024457600080fd5b8063125700111161016057806312570011146101a4578063181f5a77146101cc5780631cdf63431461020e57600080fd5b80630c5801e31461017c578063117392ce14610191575b600080fd5b61018f61018a3660046126db565b6103ca565b005b61018f61019f366004612747565b6106db565b6101b76101b236600461275f565b610926565b60405190151581526020015b60405180910390f35b60408051808201909152601881527f4361706162696c697479526567697374727920312e302e30000000000000000060208201525b6040516101c391906127dc565b61018f61021c3660046127ef565b610939565b61023461022f36600461284a565b6109fc565b6040516101c394939291906128a0565b61018f6102523660046127ef565b610c0f565b610291610265366004612958565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101c3565b61018f6102ad3660046127ef565b610e8d565b6102c56102c036600461275f565b611026565b6040516101c392919061297a565b61018f6102e13660046127ef565b6110e8565b61018f6102f43660046127ef565b6115c9565b61030c61030736600461275f565b611a63565b6040516101c39190612a1c565b61018f610327366004612a6d565b611b49565b61018f611f5d565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b61036f61036a36600461275f565b61205a565b6040516101c39190612b90565b61018f61038a36600461275f565b612104565b61020161039d366004612b9e565b6121cf565b6103aa612287565b6040516101c39190612bc8565b61018f6103c5366004612c38565b6123cc565b828114610412576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156106d357600086868381811061044a5761044a612c55565b905060200201359050600085858481811061046757610467612c55565b90506020028101906104799190612c84565b61048290612d8c565b805190915073ffffffffffffffffffffffffffffffffffffffff166104d3576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061051057503373ffffffffffffffffffffffffffffffffffffffff851614155b15610547576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff90811691161415806105f9575060208082015160405161058d92016127dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000868152600783529290922091926105e0926001019101612ea5565b6040516020818303038152906040528051906020012014155b156106c0578051600083815260076020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921782558201516001909101906106669082612f94565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f14c8f513e8a6d86d2d16b0cb64976de4e72386c4f8068eca3b7354373f8fe97a8383602001516040516106b79291906130ae565b60405180910390a25b5050806106cc906130f6565b905061042e565b505050505050565b6106e36123e0565b60408051823560208281019190915280840135828401528251808303840181526060909201909252805191012061071b600382612463565b15610752576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107646080840160608501612c38565b73ffffffffffffffffffffffffffffffffffffffff16146108cf5761078f6080830160608401612c38565b73ffffffffffffffffffffffffffffffffffffffff163b158061086f57506107bd6080830160608401612c38565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f884efe6100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff91909116906301ffc9a790602401602060405180830381865afa158015610849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086d919061312e565b155b156108cf576108846080830160608401612c38565b6040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610409565b6108da60038261247e565b50600081815260026020526040902082906108f5828261314b565b505060405181907f65610e5677eedff94555572640e442f89848a109ef8593fa927ac30b2565ff0690600090a25050565b6000610933600583612463565b92915050565b6109416123e0565b60005b818110156109f757600083838381811061096057610960612c55565b60209081029290920135600081815260079093526040832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559093509190506109b16001830182612641565b50506040518181527f1e5877d7b3001d1569bf733b76c7eceda58bd6c031e5b8d0b7042308ba2e9d4f9060200160405180910390a1506109f0816130f6565b9050610944565b505050565b63ffffffff81166000908152600960205260408120819060609081908390610a269060030161248a565b90506000815167ffffffffffffffff811115610a4457610a44612cc2565b604051908082528060200260200182016040528015610a8a57816020015b604080518082019091526000815260606020820152815260200190600190039081610a625790505b50905060005b8151811015610bc9576040518060400160405280848381518110610ab657610ab6612c55565b60200260200101518152602001600960008b63ffffffff1663ffffffff1681526020019081526020016000206005016000868581518110610af957610af9612c55565b602002602001015181526020019081526020016000208054610b1a90612e58565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690612e58565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b5050505050815250828281518110610bad57610bad612c55565b602002602001018190525080610bc2906130f6565b9050610a90565b5063ffffffff8781166000908152600960205260409020805491821691640100000000900460ff1690610bfe9060010161248a565b919750955093509150509193509193565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610e87576000848483818110610c4957610c49612c55565b60209081029290920135600081815260089093526040909220549192505068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16151580610cc5576040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260048101839052602401610409565b60008281526008602090815260408083205463ffffffff168352600782528083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610d1f90612e58565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4b90612e58565b8015610d985780601f10610d6d57610100808354040283529160200191610d98565b820191906000526020600020905b815481529060010190602001808311610d7b57829003601f168201915b505050505081525050905084158015610dc85750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610dff576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602052604080822080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010191909155517f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320590610e6b9085815260200190565b60405180910390a150505080610e80906130f6565b9050610c2d565b50505050565b610e956123e0565b60005b818110156109f7576000838383818110610eb457610eb4612c55565b9050602002810190610ec69190612c84565b610ecf90612d8c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610f20576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815260008681526007909252939020825181547fffffffffffffffffffffffff000000000000000000000000000000000000000016921691909117815591519091906001820190610fa39082612f94565b50905050600a60008154610fb6906130f6565b909155508151602083015160405173ffffffffffffffffffffffffffffffffffffffff909216917fda6697b182650034bd205cdc2dbfabb06bdb3a0a83a2b45bfefa3c4881284e0b9161100b918591906130ae565b60405180910390a250508061101f906130f6565b9050610e98565b604080516080810182526000808252602082018190529181019190915260608082015260408051608081018252600084815260086020908152838220805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6801000000000000000083041684870152600183015486880152640100000000909104168352600201905291822060608201906110bf9061248a565b905260009384526008602052604090932054929364010000000090930463ffffffff1692915050565b60005b818110156109f757600083838381811061110757611107612c55565b905060200281019061111991906131cd565b61112290613201565b9050600061114560005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916111a290612e58565b80601f01602080910402602001604051908101604052809291908181526020018280546111ce90612e58565b801561121b5780601f106111f05761010080835404028352916020019161121b565b820191906000526020600020905b8154815290600101906020018083116111fe57829003601f168201915b50505050508152505090508115801561124b5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611282576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161515806112f75783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161040991815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff16611348576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060840151805160000361138a57806040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161040991906132dd565b60408581015160009081526008602052208054640100000000900463ffffffff169060046113b7836132f0565b82546101009290920a63ffffffff8181021990931691831602179091556040878101516000908152600860205290812054640100000000900490911691505b82518110156114c25761142c83828151811061141457611414612c55565b6020026020010151600361246390919063ffffffff16565b61146457826040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161040991906132dd565b6114b183828151811061147957611479612c55565b6020908102919091018101516040808b015160009081526008845281812063ffffffff80891683526002909101909452209161247e16565b506114bb816130f6565b90506113f6565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b018051845184529285902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9586160217905592518b5193518551918252939095169085015216908201527f6bbba867c646be512c2f3241e65fdffdefd5528d7e7939649e06e10ee5addc3e9060600160405180910390a1505050505050806115c2906130f6565b90506110eb565b60005b818110156109f75760008383838181106115e8576115e8612c55565b90506020028101906115fa91906131cd565b61160390613201565b9050600061162660005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff9081168352600182018054969091163314965093949193909284019161168390612e58565b80601f01602080910402602001604051908101604052809291908181526020018280546116af90612e58565b80156116fc5780601f106116d1576101008083540402835291602001916116fc565b820191906000526020600020905b8154815290600101906020018083116116df57829003601f168201915b50505050508152505090508115801561172c5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611763576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16151580806117a757506040840151155b156117e65783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161040991815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff16611837576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060840151805160000361187957806040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161040991906132dd565b604085810151600090815260086020522080546004906118a690640100000000900463ffffffff166132f0565b82546101009290920a63ffffffff81810219909316918316021790915560408681015160009081526008602052908120546401000000009004909116905b82518110156119605761190283828151811061141457611414612c55565b61193a57826040517f3748d4c600000000000000000000000000000000000000000000000000000000815260040161040991906132dd565b61194f83828151811061147957611479612c55565b50611959816130f6565b90506118e4565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b0151835183529184902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9094169390930292909217909155905189518351918252909316908301527f5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f910160405180910390a150505050505080611a5c906130f6565b90506115cc565b6040805180820190915260008152606060208201526000828152600760209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611ac090612e58565b80601f0160208091040260200160405190810160405280929190818152602001828054611aec90612e58565b8015611b395780601f10611b0e57610100808354040283529160200191611b39565b820191906000526020600020905b815481529060010190602001808311611b1c57829003601f168201915b5050505050815250509050919050565b611b516123e0565b600b5463ffffffff16600081815260096020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000168317640100000000851515021790555b85811015611c76576000878783818110611bb857611bb8612c55565b905060200201359050611bf581600960008663ffffffff1663ffffffff16815260200190815260200160002060010161246390919063ffffffff16565b15611c3b576040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff8416600482015260248101829052604401610409565b63ffffffff8084166000908152600960205260409020611c6391600190910190839061247e16565b505080611c6f906130f6565b9050611b9c565b5060005b83811015611ed45736858583818110611c9557611c95612c55565b9050602002810190611ca79190612c84565b90508035611cb6600382612463565b611cef576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b611cfa600582612463565b15611d34576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b63ffffffff8085166000908152600960205260409020611d5c91600390910190839061246316565b15611da2576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8516600482015260248101829052604401610409565b60005b88811015611e5a5760008a8a83818110611dc157611dc1612c55565b602090810292909201356000818152600884526040808220805463ffffffff6401000000009091048116845260029091019095529020909350611e0992909150859061246316565b611e49576040517fa7e792500000000000000000000000000000000000000000000000000000000081526004810182905260248101849052604401610409565b50611e53816130f6565b9050611da5565b5063ffffffff8085166000908152600960205260409020611e8391600390910190839061247e16565b50611e916020830183613313565b63ffffffff86166000908152600960209081526040808320868452600501909152902091611ec0919083613378565b50505080611ecd906130f6565b9050611c7a565b50600b8054600090611eeb9063ffffffff166132f0565b91906101000a81548163ffffffff021916908363ffffffff1602179055507fab55f4c8fb4335a586285ae209d1f1e17a7ccb22e1131963624434d98c8546a58183604051611f4d92919063ffffffff9290921682521515602082015260400190565b60405180910390a1505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610409565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff16908111156120c3576120c3612af1565b60018111156120d4576120d4612af1565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61210c6123e0565b612117600382612463565b612150576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b61215b600582612463565b15612195576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b6121a060058261247e565b5060405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250565b63ffffffff82166000908152600960209081526040808320848452600501909152902080546060919061220190612e58565b80601f016020809104026020016040519081016040528092919081815260200182805461222d90612e58565b801561227a5780601f1061224f5761010080835404028352916020019161227a565b820191906000526020600020905b81548152906001019060200180831161225d57829003601f168201915b5050505050905092915050565b60606000612295600361248a565b905060006122a36005612497565b82516122af9190613493565b67ffffffffffffffff8111156122c7576122c7612cc2565b60405190808252806020026020018201604052801561233757816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816122e55790505b5090506000805b83518110156123c357600084828151811061235b5761235b612c55565b6020026020010151905061237981600561246390919063ffffffff16565b6123b2576123868161205a565b84848151811061239857612398612c55565b602002602001018190525082806123ae906130f6565b9350505b506123bc816130f6565b905061233e565b50909392505050565b6123d46123e0565b6123dd816124a1565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610409565b565b600081815260018301602052604081205415155b9392505050565b60006124778383612596565b60606000612477836125e5565b6000610933825490565b3373ffffffffffffffffffffffffffffffffffffffff821603612520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610409565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120546125dd57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610933565b506000610933565b60608160000180548060200260200160405190810160405280929190818152602001828054801561263557602002820191906000526020600020905b815481526020019060010190808311612621575b50505050509050919050565b50805461264d90612e58565b6000825580601f1061265d575050565b601f0160209004906000526020600020908101906123dd91905b8082111561268b5760008155600101612677565b5090565b60008083601f8401126126a157600080fd5b50813567ffffffffffffffff8111156126b957600080fd5b6020830191508360208260051b85010111156126d457600080fd5b9250929050565b600080600080604085870312156126f157600080fd5b843567ffffffffffffffff8082111561270957600080fd5b6127158883890161268f565b9096509450602087013591508082111561272e57600080fd5b5061273b8782880161268f565b95989497509550505050565b60006080828403121561275957600080fd5b50919050565b60006020828403121561277157600080fd5b5035919050565b6000815180845260005b8181101561279e57602081850181015186830182015201612782565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006124776020830184612778565b6000806020838503121561280257600080fd5b823567ffffffffffffffff81111561281957600080fd5b6128258582860161268f565b90969095509350505050565b803563ffffffff8116811461284557600080fd5b919050565b60006020828403121561285c57600080fd5b61247782612831565b600081518084526020808501945080840160005b8381101561289557815187529582019590820190600101612879565b509495945050505050565b63ffffffff85168152600060208515158184015260406080818501526128c96080850187612865565b8481036060860152855180825283820190600581901b8301850185890160005b83811015612946578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001855281518051845288015188840188905261293388850182612778565b95890195935050908701906001016128e9565b50909c9b505050505050505050505050565b6000806040838503121561296b57600080fd5b50508035926020909101359150565b60408152600060c0820163ffffffff8551166040840152602073ffffffffffffffffffffffffffffffffffffffff81870151166060850152604086015160808501526060860151608060a086015282815180855260e0870191508383019450600092505b808310156129fe57845182529383019360019290920191908301906129de565b5063ffffffff8716838701529350612a139050565b50509392505050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260006020830151604080840152612a576060840182612778565b949350505050565b80151581146123dd57600080fd5b600080600080600060608688031215612a8557600080fd5b853567ffffffffffffffff80821115612a9d57600080fd5b612aa989838a0161268f565b90975095506020880135915080821115612ac257600080fd5b50612acf8882890161268f565b9094509250506040860135612ae381612a5f565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110612b6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b608081016109338284612b20565b60008060408385031215612bb157600080fd5b612bba83612831565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612c0a57612bf7838551612b20565b9284019260809290920191600101612be4565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146123dd57600080fd5b600060208284031215612c4a57600080fd5b813561247781612c16565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112612cb857600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612d1457612d14612cc2565b60405290565b6040516080810167ffffffffffffffff81118282101715612d1457612d14612cc2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612d8457612d84612cc2565b604052919050565b600060408236031215612d9e57600080fd5b612da6612cf1565b8235612db181612c16565b815260208381013567ffffffffffffffff80821115612dcf57600080fd5b9085019036601f830112612de257600080fd5b813581811115612df457612df4612cc2565b612e24847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612d3d565b91508082523684828501011115612e3a57600080fd5b80848401858401376000908201840152918301919091525092915050565b600181811c90821680612e6c57607f821691505b602082108103612759577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454612eb981612e58565b80848701526040600180841660008114612eda5760018114612f1257612f40565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612f40565b896000528660002060005b85811015612f385781548b8201860152908301908801612f1d565b8a0184019650505b509398975050505050505050565b601f8211156109f757600081815260208120601f850160051c81016020861015612f755750805b601f850160051c820191505b818110156106d357828155600101612f81565b815167ffffffffffffffff811115612fae57612fae612cc2565b612fc281612fbc8454612e58565b84612f4e565b602080601f8311600181146130155760008415612fdf5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106d3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561306257888601518255948401946001909101908401613043565b508582101561309e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000612a576040830184612778565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613127576131276130c7565b5060010190565b60006020828403121561314057600080fd5b815161247781612a5f565b81358155602082013560018201556002810160408301356002811061316f57600080fd5b8154606085013561317f81612c16565b74ffffffffffffffffffffffffffffffffffffffff008160081b1660ff84167fffffffffffffffffffffff000000000000000000000000000000000000000000841617178455505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612cb857600080fd5b60006080823603121561321357600080fd5b61321b612d1a565b61322483612831565b815260208084013561323581612c16565b8282015260408481013590830152606084013567ffffffffffffffff8082111561325e57600080fd5b9085019036601f83011261327157600080fd5b81358181111561328357613283612cc2565b8060051b9150613294848301612d3d565b81815291830184019184810190368411156132ae57600080fd5b938501935b838510156132cc578435825293850193908501906132b3565b606087015250939695505050505050565b6020815260006124776020830184612865565b600063ffffffff808316818103613309576133096130c7565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261334857600080fd5b83018035915067ffffffffffffffff82111561336357600080fd5b6020019150368190038213156126d457600080fd5b67ffffffffffffffff83111561339057613390612cc2565b6133a48361339e8354612e58565b83612f4e565b6000601f8411600181146133f657600085156133c05750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561348c565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156134455786850135825560209485019460019092019101613425565b5086821015613480577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81810381811115610933576109336130c756fea164736f6c6343000813000a", } var CapabilityRegistryABI = CapabilityRegistryMetaData.ABI @@ -234,6 +239,53 @@ func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetCapability(hashed return _CapabilityRegistry.Contract.GetCapability(&_CapabilityRegistry.CallOpts, hashedId) } +func (_CapabilityRegistry *CapabilityRegistryCaller) GetDON(opts *bind.CallOpts, donId uint32) (uint32, bool, [][32]byte, []CapabilityRegistryCapabilityConfiguration, error) { + var out []interface{} + err := _CapabilityRegistry.contract.Call(opts, &out, "getDON", donId) + + if err != nil { + return *new(uint32), *new(bool), *new([][32]byte), *new([]CapabilityRegistryCapabilityConfiguration), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + out1 := *abi.ConvertType(out[1], new(bool)).(*bool) + out2 := *abi.ConvertType(out[2], new([][32]byte)).(*[][32]byte) + out3 := *abi.ConvertType(out[3], new([]CapabilityRegistryCapabilityConfiguration)).(*[]CapabilityRegistryCapabilityConfiguration) + + return out0, out1, out2, out3, err + +} + +func (_CapabilityRegistry *CapabilityRegistrySession) GetDON(donId uint32) (uint32, bool, [][32]byte, []CapabilityRegistryCapabilityConfiguration, error) { + return _CapabilityRegistry.Contract.GetDON(&_CapabilityRegistry.CallOpts, donId) +} + +func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetDON(donId uint32) (uint32, bool, [][32]byte, []CapabilityRegistryCapabilityConfiguration, error) { + return _CapabilityRegistry.Contract.GetDON(&_CapabilityRegistry.CallOpts, donId) +} + +func (_CapabilityRegistry *CapabilityRegistryCaller) GetDONCapabilityConfig(opts *bind.CallOpts, donId uint32, capabilityId [32]byte) ([]byte, error) { + var out []interface{} + err := _CapabilityRegistry.contract.Call(opts, &out, "getDONCapabilityConfig", donId, capabilityId) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_CapabilityRegistry *CapabilityRegistrySession) GetDONCapabilityConfig(donId uint32, capabilityId [32]byte) ([]byte, error) { + return _CapabilityRegistry.Contract.GetDONCapabilityConfig(&_CapabilityRegistry.CallOpts, donId, capabilityId) +} + +func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetDONCapabilityConfig(donId uint32, capabilityId [32]byte) ([]byte, error) { + return _CapabilityRegistry.Contract.GetDONCapabilityConfig(&_CapabilityRegistry.CallOpts, donId, capabilityId) +} + func (_CapabilityRegistry *CapabilityRegistryCaller) GetHashedCapabilityId(opts *bind.CallOpts, labelledName [32]byte, version [32]byte) ([32]byte, error) { var out []interface{} err := _CapabilityRegistry.contract.Call(opts, &out, "getHashedCapabilityId", labelledName, version) @@ -256,25 +308,26 @@ func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetHashedCapabilityI return _CapabilityRegistry.Contract.GetHashedCapabilityId(&_CapabilityRegistry.CallOpts, labelledName, version) } -func (_CapabilityRegistry *CapabilityRegistryCaller) GetNode(opts *bind.CallOpts, p2pId [32]byte) (CapabilityRegistryNode, error) { +func (_CapabilityRegistry *CapabilityRegistryCaller) GetNode(opts *bind.CallOpts, p2pId [32]byte) (CapabilityRegistryNodeParams, uint32, error) { var out []interface{} err := _CapabilityRegistry.contract.Call(opts, &out, "getNode", p2pId) if err != nil { - return *new(CapabilityRegistryNode), err + return *new(CapabilityRegistryNodeParams), *new(uint32), err } - out0 := *abi.ConvertType(out[0], new(CapabilityRegistryNode)).(*CapabilityRegistryNode) + out0 := *abi.ConvertType(out[0], new(CapabilityRegistryNodeParams)).(*CapabilityRegistryNodeParams) + out1 := *abi.ConvertType(out[1], new(uint32)).(*uint32) - return out0, err + return out0, out1, err } -func (_CapabilityRegistry *CapabilityRegistrySession) GetNode(p2pId [32]byte) (CapabilityRegistryNode, error) { +func (_CapabilityRegistry *CapabilityRegistrySession) GetNode(p2pId [32]byte) (CapabilityRegistryNodeParams, uint32, error) { return _CapabilityRegistry.Contract.GetNode(&_CapabilityRegistry.CallOpts, p2pId) } -func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetNode(p2pId [32]byte) (CapabilityRegistryNode, error) { +func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetNode(p2pId [32]byte) (CapabilityRegistryNodeParams, uint32, error) { return _CapabilityRegistry.Contract.GetNode(&_CapabilityRegistry.CallOpts, p2pId) } @@ -390,6 +443,18 @@ func (_CapabilityRegistry *CapabilityRegistryTransactorSession) AddCapability(ca return _CapabilityRegistry.Contract.AddCapability(&_CapabilityRegistry.TransactOpts, capability) } +func (_CapabilityRegistry *CapabilityRegistryTransactor) AddDON(opts *bind.TransactOpts, nodes [][32]byte, capabilityConfigurations []CapabilityRegistryCapabilityConfiguration, isPublic bool) (*types.Transaction, error) { + return _CapabilityRegistry.contract.Transact(opts, "addDON", nodes, capabilityConfigurations, isPublic) +} + +func (_CapabilityRegistry *CapabilityRegistrySession) AddDON(nodes [][32]byte, capabilityConfigurations []CapabilityRegistryCapabilityConfiguration, isPublic bool) (*types.Transaction, error) { + return _CapabilityRegistry.Contract.AddDON(&_CapabilityRegistry.TransactOpts, nodes, capabilityConfigurations, isPublic) +} + +func (_CapabilityRegistry *CapabilityRegistryTransactorSession) AddDON(nodes [][32]byte, capabilityConfigurations []CapabilityRegistryCapabilityConfiguration, isPublic bool) (*types.Transaction, error) { + return _CapabilityRegistry.Contract.AddDON(&_CapabilityRegistry.TransactOpts, nodes, capabilityConfigurations, isPublic) +} + func (_CapabilityRegistry *CapabilityRegistryTransactor) AddNodeOperators(opts *bind.TransactOpts, nodeOperators []CapabilityRegistryNodeOperator) (*types.Transaction, error) { return _CapabilityRegistry.contract.Transact(opts, "addNodeOperators", nodeOperators) } @@ -402,15 +467,15 @@ func (_CapabilityRegistry *CapabilityRegistryTransactorSession) AddNodeOperators return _CapabilityRegistry.Contract.AddNodeOperators(&_CapabilityRegistry.TransactOpts, nodeOperators) } -func (_CapabilityRegistry *CapabilityRegistryTransactor) AddNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistryTransactor) AddNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.contract.Transact(opts, "addNodes", nodes) } -func (_CapabilityRegistry *CapabilityRegistrySession) AddNodes(nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistrySession) AddNodes(nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.Contract.AddNodes(&_CapabilityRegistry.TransactOpts, nodes) } -func (_CapabilityRegistry *CapabilityRegistryTransactorSession) AddNodes(nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistryTransactorSession) AddNodes(nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.Contract.AddNodes(&_CapabilityRegistry.TransactOpts, nodes) } @@ -474,15 +539,15 @@ func (_CapabilityRegistry *CapabilityRegistryTransactorSession) UpdateNodeOperat return _CapabilityRegistry.Contract.UpdateNodeOperators(&_CapabilityRegistry.TransactOpts, nodeOperatorIds, nodeOperators) } -func (_CapabilityRegistry *CapabilityRegistryTransactor) UpdateNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistryTransactor) UpdateNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.contract.Transact(opts, "updateNodes", nodes) } -func (_CapabilityRegistry *CapabilityRegistrySession) UpdateNodes(nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistrySession) UpdateNodes(nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.Contract.UpdateNodes(&_CapabilityRegistry.TransactOpts, nodes) } -func (_CapabilityRegistry *CapabilityRegistryTransactorSession) UpdateNodes(nodes []CapabilityRegistryNode) (*types.Transaction, error) { +func (_CapabilityRegistry *CapabilityRegistryTransactorSession) UpdateNodes(nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) { return _CapabilityRegistry.Contract.UpdateNodes(&_CapabilityRegistry.TransactOpts, nodes) } @@ -740,6 +805,124 @@ func (_CapabilityRegistry *CapabilityRegistryFilterer) ParseCapabilityDeprecated return event, nil } +type CapabilityRegistryDONAddedIterator struct { + Event *CapabilityRegistryDONAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CapabilityRegistryDONAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CapabilityRegistryDONAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CapabilityRegistryDONAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CapabilityRegistryDONAddedIterator) Error() error { + return it.fail +} + +func (it *CapabilityRegistryDONAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CapabilityRegistryDONAdded struct { + DonId *big.Int + IsPublic bool + Raw types.Log +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterDONAdded(opts *bind.FilterOpts) (*CapabilityRegistryDONAddedIterator, error) { + + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "DONAdded") + if err != nil { + return nil, err + } + return &CapabilityRegistryDONAddedIterator{contract: _CapabilityRegistry.contract, event: "DONAdded", logs: logs, sub: sub}, nil +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchDONAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryDONAdded) (event.Subscription, error) { + + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "DONAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CapabilityRegistryDONAdded) + if err := _CapabilityRegistry.contract.UnpackLog(event, "DONAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) ParseDONAdded(log types.Log) (*CapabilityRegistryDONAdded, error) { + event := new(CapabilityRegistryDONAdded) + if err := _CapabilityRegistry.contract.UnpackLog(event, "DONAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CapabilityRegistryNodeAddedIterator struct { Event *CapabilityRegistryNodeAdded @@ -1747,6 +1930,8 @@ func (_CapabilityRegistry *CapabilityRegistry) ParseLog(log types.Log) (generate return _CapabilityRegistry.ParseCapabilityAdded(log) case _CapabilityRegistry.abi.Events["CapabilityDeprecated"].ID: return _CapabilityRegistry.ParseCapabilityDeprecated(log) + case _CapabilityRegistry.abi.Events["DONAdded"].ID: + return _CapabilityRegistry.ParseDONAdded(log) case _CapabilityRegistry.abi.Events["NodeAdded"].ID: return _CapabilityRegistry.ParseNodeAdded(log) case _CapabilityRegistry.abi.Events["NodeOperatorAdded"].ID: @@ -1777,6 +1962,10 @@ func (CapabilityRegistryCapabilityDeprecated) Topic() common.Hash { return common.HexToHash("0xdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf21") } +func (CapabilityRegistryDONAdded) Topic() common.Hash { + return common.HexToHash("0xab55f4c8fb4335a586285ae209d1f1e17a7ccb22e1131963624434d98c8546a5") +} + func (CapabilityRegistryNodeAdded) Topic() common.Hash { return common.HexToHash("0x5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f") } @@ -1818,9 +2007,13 @@ type CapabilityRegistryInterface interface { GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilityRegistryCapability, error) + GetDON(opts *bind.CallOpts, donId uint32) (uint32, bool, [][32]byte, []CapabilityRegistryCapabilityConfiguration, error) + + GetDONCapabilityConfig(opts *bind.CallOpts, donId uint32, capabilityId [32]byte) ([]byte, error) + GetHashedCapabilityId(opts *bind.CallOpts, labelledName [32]byte, version [32]byte) ([32]byte, error) - GetNode(opts *bind.CallOpts, p2pId [32]byte) (CapabilityRegistryNode, error) + GetNode(opts *bind.CallOpts, p2pId [32]byte) (CapabilityRegistryNodeParams, uint32, error) GetNodeOperator(opts *bind.CallOpts, nodeOperatorId *big.Int) (CapabilityRegistryNodeOperator, error) @@ -1834,9 +2027,11 @@ type CapabilityRegistryInterface interface { AddCapability(opts *bind.TransactOpts, capability CapabilityRegistryCapability) (*types.Transaction, error) + AddDON(opts *bind.TransactOpts, nodes [][32]byte, capabilityConfigurations []CapabilityRegistryCapabilityConfiguration, isPublic bool) (*types.Transaction, error) + AddNodeOperators(opts *bind.TransactOpts, nodeOperators []CapabilityRegistryNodeOperator) (*types.Transaction, error) - AddNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNode) (*types.Transaction, error) + AddNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) DeprecateCapability(opts *bind.TransactOpts, hashedCapabilityId [32]byte) (*types.Transaction, error) @@ -1848,7 +2043,7 @@ type CapabilityRegistryInterface interface { UpdateNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []*big.Int, nodeOperators []CapabilityRegistryNodeOperator) (*types.Transaction, error) - UpdateNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNode) (*types.Transaction, error) + UpdateNodes(opts *bind.TransactOpts, nodes []CapabilityRegistryNodeParams) (*types.Transaction, error) FilterCapabilityAdded(opts *bind.FilterOpts, hashedCapabilityId [][32]byte) (*CapabilityRegistryCapabilityAddedIterator, error) @@ -1862,6 +2057,12 @@ type CapabilityRegistryInterface interface { ParseCapabilityDeprecated(log types.Log) (*CapabilityRegistryCapabilityDeprecated, error) + FilterDONAdded(opts *bind.FilterOpts) (*CapabilityRegistryDONAddedIterator, error) + + WatchDONAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryDONAdded) (event.Subscription, error) + + ParseDONAdded(log types.Log) (*CapabilityRegistryDONAdded, error) + FilterNodeAdded(opts *bind.FilterOpts) (*CapabilityRegistryNodeAddedIterator, error) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded) (event.Subscription, error) diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt index f5b47e58913..9b49710b546 100644 --- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ GETH_VERSION: 1.13.8 forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin b4c900aae9e022f01abbac7993d41f93912247613ac6270b0c4da4ef6f2016e3 -keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin 878d2b539e07962af90e8c283fa5a90a15b5b59ddbc0854a137a3be621f0afcd +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin d4e0661491c2adc7f0d7553287c938fb32664b9f07770f6d57ae6511ce9884cd ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2