diff --git a/.changeset/empty-dryers-fold.md b/.changeset/empty-dryers-fold.md new file mode 100644 index 00000000000..76cc3f8d71e --- /dev/null +++ b/.changeset/empty-dryers-fold.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal capability registry informational findings diff --git a/contracts/.changeset/dull-phones-retire.md b/contracts/.changeset/dull-phones-retire.md new file mode 100644 index 00000000000..be65a31fac4 --- /dev/null +++ b/contracts/.changeset/dull-phones-retire.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts': patch +--- + +capability registry informational findings diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 34ad3bed7a7..f10caa485b1 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -1,84 +1,88 @@ -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 140145) -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 163638) +CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 139938) +CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 163431) CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 24523) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CapabilityExists() (gas: 136050) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 90873) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractNotDeployed() (gas: 89273) -CapabilityRegistry_AddDONTest:test_AddDON() (gas: 345809) -CapabilityRegistry_AddDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 21183) -CapabilityRegistry_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 156379) -CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 251492) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 257552) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 176737) -CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 188103) -CapabilityRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 147674) +CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CapabilityExists() (gas: 138529) +CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 90644) +CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractNotDeployed() (gas: 89044) +CapabilityRegistry_AddDONTest:test_AddDON() (gas: 378398) +CapabilityRegistry_AddDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 21138) +CapabilityRegistry_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 159287) +CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 254106) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 260460) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 179709) +CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 191011) +CapabilityRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 148169) CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_CalledByNonAdmin() (gas: 28654) -CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_NodeOperatorAdminAddressZero() (gas: 29526) -CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 362187) -CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362186) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 307942) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61464) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33795) -CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30707) -CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31440) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31273) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320375) -CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90723) -CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90884) -CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 23004) -CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 16223) -CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 92149) -CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 112586) +CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_NodeOperatorAdminAddressZero() (gas: 29539) +CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 361816) +CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 361815) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 307672) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61337) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31100) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33827) +CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31370) +CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31472) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31302) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320108) +CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90429) +CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90590) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 22939) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 16158) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 91854) +CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 112292) CapabilityRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 43926) -CapabilityRegistry_GetDONsTest:test_CorrectlyFetchesDONs() (gas: 63740) -CapabilityRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 86969) +CapabilityRegistry_GetDONsTest:test_CorrectlyFetchesDONs() (gas: 63784) +CapabilityRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 86991) CapabilityRegistry_GetHashedCapabilityTest:test_CorrectlyGeneratesHashedCapabilityId() (gas: 8751) CapabilityRegistry_GetHashedCapabilityTest:test_DoesNotCauseIncorrectClashes() (gas: 9510) -CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 37814) -CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37327) -CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67928) -CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 82281) -CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 57276) +CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 37880) +CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37463) +CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67838) +CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 78144) +CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 60370) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_CalledByNonAdmin() (gas: 17801) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_DONDoesNotExist() (gas: 16561) -CapabilityRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 37404) +CapabilityRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 37762) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 17898) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 89793) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 266586) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 719288) -CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 63376) -CapabilityRegistry_RemoveNodesTest:test_RemovesNode() (gas: 63384) -CapabilityRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31489) -CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 20578) -CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodePartOfDON() (gas: 271277) -CapabilityRegistry_RemoveNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 20590) +CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 88440) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 262049) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 717200) +CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 59174) +CapabilityRegistry_RemoveNodesTest:test_RemovesNode() (gas: 61000) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 29291) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 20569) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodePartOfDON() (gas: 270858) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 20581) +CapabilityRegistry_TypeAndVersionTest:test_TypeAndVersion() (gas: 9712) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 32669) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExists() (gas: 33956) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 69052) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_ConfigurationContractNotDeployed() (gas: 67430) -CapabilityRegistry_UpdateCapabilitiesTest:test_UpdateCapabilities_NoConfigurationContract() (gas: 87788) -CapabilityRegistry_UpdateCapabilitiesTest:test_UpdateCapabilities_WithConfiguration() (gas: 87966) +CapabilityRegistry_UpdateCapabilitiesTest:test_UpdateCapabilities_NoConfigurationContract() (gas: 87810) +CapabilityRegistry_UpdateCapabilitiesTest:test_UpdateCapabilities_WithConfiguration() (gas: 87988) CapabilityRegistry_UpdateDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 21302) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 141051) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 140765) CapabilityRegistry_UpdateDONTest:test_RevertWhen_DONDoesNotExist() (gas: 17397) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 176387) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 182460) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 101590) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 172820) -CapabilityRegistry_UpdateDONTest:test_UpdatesDON() (gas: 283909) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNonOwner() (gas: 20047) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 19982) -CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 74798) -CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262774) -CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164222) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42407) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30762) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31432) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35494) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31420) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31294) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31815) -CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164200) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 175807) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 182174) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 101368) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 172534) +CapabilityRegistry_UpdateDONTest:test_UpdatesDON() (gas: 308133) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNonOwner() (gas: 22859) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22173) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21942) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorIdAndParamLengthsMismatch() (gas: 17582) +CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 39111) +CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 261220) +CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 163489) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42139) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31398) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31413) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35388) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31401) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31275) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31709) +CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 163467) KeystoneForwarder_ReportTest:test_Report_SuccessfulDelivery() (gas: 133714) KeystoneForwarder_ReportTest:test_RevertWhen_AnySignatureIsInvalid() (gas: 97790) KeystoneForwarder_ReportTest:test_RevertWhen_AnySignerIsInvalid() (gas: 110159) diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index a45bcdf2a29..3822700db0b 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -10,6 +10,11 @@ import {ICapabilityConfiguration} from "./interfaces/ICapabilityConfiguration.so /// @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. +/// @dev The contract currently stores the entire state of Node Operators, Nodes, +/// Capabilities and DONs in the contract and requires a full state migration +/// if an upgrade is ever required. The team acknowledges this and is fine +/// reconfiguring the upgraded contract in the future so as to not add extra +/// complexity to this current version. contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { // Add the library methods using EnumerableSet for EnumerableSet.Bytes32Set; @@ -40,7 +45,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @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 + /// @notice The number of times the node's configuration has been updated uint32 configCount; /// @notice The signer address for application-layer message verification. /// @dev This key is guaranteed to be unique in the CapabilityRegistry @@ -58,7 +63,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @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; + mapping(uint32 configCount => EnumerableSet.Bytes32Set capabilityId) supportedHashedCapabilityIds; /// @notice The list of DON Ids supported by the node. EnumerableSet.UintSet supportedDONIds; } @@ -66,6 +71,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice CapabilityResponseType indicates whether remote response requires // aggregation or is an already aggregated report. There are multiple // possible ways to aggregate. + /// @dev REPORT response type receives signatures together with the response that + /// is used to verify the data. OBSERVATION_IDENTICAL just receives data without + /// signatures and waits for some number of observations before proceeeding to + /// the next step enum CapabilityResponseType { // No additional aggregation is needed on the remote response. REPORT, @@ -84,8 +93,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// /// bytes32(string); validation regex: ^[a-z0-9_\-:]{1,32}$ bytes32 labelledName; - /// @notice Semver, e.g., "1.2.3" - /// @dev must be valid Semver + max 32 characters. + /// @notice The capability's version number + /// @dev Derived by converting the semantic version to bytes32 + /// i.e bytes32("1.2.3") + /// @dev Limited to 32 characters bytes32 version; /// @notice Indicates whether remote response requires // aggregation or is an OCR report. There are multiple possible @@ -156,7 +167,8 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice This error is thrown when a caller is not allowed /// to execute the transaction - error AccessForbidden(); + /// @param sender The address that tried to execute the transaction + error AccessForbidden(address sender); /// @notice This error is thrown when there is a mismatch between /// array arguments @@ -189,7 +201,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice This error is thrown when trying add a capability that already /// exists. - error CapabilityAlreadyExists(); + /// @param hashedCapabilityId The hashed capability ID of the capability + /// that already exists + error CapabilityAlreadyExists(bytes32 hashedCapabilityId); /// @notice This error is thrown when trying to add a node to a DON where /// the node does not support the capability @@ -237,7 +251,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param p2pId The P2P ID of the node /// @param nodeOperatorId The ID of the node operator that manages this node /// @param signer The encoded node's signer address - event NodeAdded(bytes32 p2pId, uint32 nodeOperatorId, bytes32 signer); + event NodeAdded(bytes32 p2pId, uint32 indexed nodeOperatorId, bytes32 signer); /// @notice This event is emitted when a node is removed /// @param p2pId The P2P ID of the node that was removed @@ -247,7 +261,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param p2pId The P2P ID of the node /// @param nodeOperatorId The ID of the node operator that manages this node /// @param signer The node's signer address - event NodeUpdated(bytes32 p2pId, uint32 nodeOperatorId, bytes32 signer); + event NodeUpdated(bytes32 p2pId, uint32 indexed nodeOperatorId, bytes32 signer); /// @notice This event is emitted when a DON's config is set /// @param donId The ID of the DON the config was set for @@ -260,17 +274,17 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param admin The address of the admin that can manage the node /// operator /// @param name The human readable name of the node operator - event NodeOperatorAdded(uint32 nodeOperatorId, address indexed admin, string name); + event NodeOperatorAdded(uint32 indexed nodeOperatorId, address indexed admin, string name); /// @notice This event is emitted when a node operator is removed /// @param nodeOperatorId The ID of the node operator that was removed - event NodeOperatorRemoved(uint32 nodeOperatorId); + event NodeOperatorRemoved(uint32 indexed nodeOperatorId); /// @notice This event is emitted when a node operator is updated /// @param nodeOperatorId The ID of the node operator that was updated /// @param admin The address of the node operator's admin /// @param name The node operator's human readable name - event NodeOperatorUpdated(uint32 nodeOperatorId, address indexed admin, string name); + event NodeOperatorUpdated(uint32 indexed nodeOperatorId, address indexed admin, string name); /// @notice This event is emitted when a new capability is added /// @param hashedCapabilityId The hashed ID of the newly added capability @@ -308,15 +322,15 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Mapping of DON IDs to DONs mapping(uint32 donId => DON don) private s_dons; - /// @notice The latest node operator ID - // @dev Starting with 1 to avoid confusion with the zero value + /// @notice The next ID to assign a new node operator to + /// @dev Starting with 1 to avoid confusion with the zero value /// @dev No getter for this as this is an implementation detail - uint32 private s_nodeOperatorId = 1; + uint32 private s_nextNodeOperatorId = 1; - /// @notice The latest DON ID + /// @notice The next ID to assign a new DON to /// @dev 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; + uint32 private s_nextDONId = 1; function typeAndVersion() external pure override returns (string memory) { return "CapabilityRegistry 1.0.0"; @@ -328,9 +342,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { for (uint256 i; i < nodeOperators.length; ++i) { NodeOperator memory nodeOperator = nodeOperators[i]; if (nodeOperator.admin == address(0)) revert InvalidNodeOperatorAdmin(); - uint32 nodeOperatorId = s_nodeOperatorId; + uint32 nodeOperatorId = s_nextNodeOperatorId; s_nodeOperators[nodeOperatorId] = NodeOperator({admin: nodeOperator.admin, name: nodeOperator.name}); - ++s_nodeOperatorId; + ++s_nextNodeOperatorId; emit NodeOperatorAdded(nodeOperatorId, nodeOperator.admin, nodeOperator.name); } } @@ -347,6 +361,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Updates a node operator /// @param nodeOperatorIds The ID of the node operator being updated + /// @param nodeOperators The updated node operator params function updateNodeOperators(uint32[] calldata nodeOperatorIds, NodeOperator[] calldata nodeOperators) external { if (nodeOperatorIds.length != nodeOperators.length) revert LengthMismatch(nodeOperatorIds.length, nodeOperators.length); @@ -354,18 +369,20 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { address owner = owner(); for (uint256 i; i < nodeOperatorIds.length; ++i) { uint32 nodeOperatorId = nodeOperatorIds[i]; - if (s_nodeOperators[nodeOperatorId].admin == address(0)) revert NodeOperatorDoesNotExist(nodeOperatorId); + + NodeOperator storage currentNodeOperator = s_nodeOperators[nodeOperatorId]; + if (currentNodeOperator.admin == address(0)) revert NodeOperatorDoesNotExist(nodeOperatorId); NodeOperator memory nodeOperator = nodeOperators[i]; if (nodeOperator.admin == address(0)) revert InvalidNodeOperatorAdmin(); - if (msg.sender != nodeOperator.admin && msg.sender != owner) revert AccessForbidden(); + if (msg.sender != nodeOperator.admin && msg.sender != owner) revert AccessForbidden(msg.sender); if ( - s_nodeOperators[nodeOperatorId].admin != nodeOperator.admin || - keccak256(abi.encode(s_nodeOperators[nodeOperatorId].name)) != keccak256(abi.encode(nodeOperator.name)) + currentNodeOperator.admin != nodeOperator.admin || + keccak256(abi.encode(currentNodeOperator.name)) != keccak256(abi.encode(nodeOperator.name)) ) { - s_nodeOperators[nodeOperatorId].admin = nodeOperator.admin; - s_nodeOperators[nodeOperatorId].name = nodeOperator.name; + currentNodeOperator.admin = nodeOperator.admin; + currentNodeOperator.name = nodeOperator.name; emit NodeOperatorUpdated(nodeOperatorId, nodeOperator.admin, nodeOperator.name); } } @@ -381,9 +398,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Gets all node operators /// @return NodeOperator[] All node operators function getNodeOperators() external view returns (NodeOperator[] memory) { - uint32 nodeOperatorId = s_nodeOperatorId; - /// Minus one to account for s_nodeOperatorId starting at index 1 - NodeOperator[] memory nodeOperators = new NodeOperator[](s_nodeOperatorId - 1); + uint32 nodeOperatorId = s_nextNodeOperatorId; + /// Minus one to account for s_nextNodeOperatorId starting at index 1 + NodeOperator[] memory nodeOperators = new NodeOperator[](s_nextNodeOperatorId - 1); uint256 idx; for (uint32 i = 1; i < nodeOperatorId; ++i) { if (s_nodeOperators[i].admin != address(0)) { @@ -391,7 +408,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { ++idx; } } - if (idx != s_nodeOperatorId - 1) { + if (idx != s_nextNodeOperatorId - 1) { assembly { mstore(nodeOperators, idx) } @@ -403,34 +420,33 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// avoid breaking changes when deprecating capabilities. /// @param nodes The nodes to add function addNodes(NodeInfo[] calldata nodes) external { + bool isOwner = msg.sender == owner(); for (uint256 i; i < nodes.length; ++i) { NodeInfo memory node = nodes[i]; - bool isOwner = msg.sender == owner(); - NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; if (nodeOperator.admin == address(0)) revert NodeOperatorDoesNotExist(node.nodeOperatorId); - if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); + if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); - bool nodeExists = s_nodes[node.p2pId].signer != bytes32(""); - if (nodeExists || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); + Node storage storedNode = s_nodes[node.p2pId]; + if (storedNode.signer != bytes32("") || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); if (bytes32(node.signer) == bytes32("") || s_nodeSigners.contains(node.signer)) revert InvalidNodeSigner(); bytes32[] memory capabilityIds = node.hashedCapabilityIds; if (capabilityIds.length == 0) revert InvalidNodeCapabilities(capabilityIds); - ++s_nodes[node.p2pId].configCount; + ++storedNode.configCount; - uint32 capabilityConfigCount = s_nodes[node.p2pId].configCount; + uint32 capabilityConfigCount = storedNode.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]); + storedNode.supportedHashedCapabilityIds[capabilityConfigCount].add(capabilityIds[j]); } - s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; - s_nodes[node.p2pId].p2pId = node.p2pId; - s_nodes[node.p2pId].signer = node.signer; + storedNode.nodeOperatorId = node.nodeOperatorId; + storedNode.p2pId = node.p2pId; + storedNode.signer = node.signer; s_nodeSigners.add(node.signer); s_nodeP2PIds.add(node.p2pId); emit NodeAdded(node.p2pId, node.nodeOperatorId, node.signer); @@ -447,13 +463,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { Node storage node = s_nodes[p2pId]; - bool nodeExists = bytes32(node.signer) != bytes32(""); - if (!nodeExists) revert InvalidNodeP2PId(p2pId); + if (bytes32(node.signer) == bytes32("")) revert InvalidNodeP2PId(p2pId); if (node.supportedDONIds.length() > 0) revert NodePartOfDON(p2pId); - NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; - - if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); + if (!isOwner && msg.sender != s_nodeOperators[node.nodeOperatorId].admin) revert AccessForbidden(msg.sender); s_nodeSigners.remove(node.signer); s_nodeP2PIds.remove(node.p2pId); delete s_nodes[p2pId]; @@ -465,41 +478,39 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// and reconfigure its supported capabilities /// @param nodes The nodes to update function updateNodes(NodeInfo[] calldata nodes) external { + bool isOwner = msg.sender == owner(); for (uint256 i; i < nodes.length; ++i) { NodeInfo memory node = nodes[i]; - bool isOwner = msg.sender == owner(); - NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; - if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(); + if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); - bool nodeExists = s_nodes[node.p2pId].signer != bytes32(""); - if (!nodeExists) revert InvalidNodeP2PId(node.p2pId); + Node storage storedNode = s_nodes[node.p2pId]; + if (storedNode.signer == bytes32("")) revert InvalidNodeP2PId(node.p2pId); if ( - bytes32(node.signer) == bytes32("") || - (s_nodes[node.p2pId].signer != node.signer && s_nodeSigners.contains(node.signer)) + bytes32(node.signer) == bytes32("") || (storedNode.signer != node.signer && s_nodeSigners.contains(node.signer)) ) revert InvalidNodeSigner(); - bytes32[] memory supportedCapabilityIds = node.hashedCapabilityIds; - if (supportedCapabilityIds.length == 0) revert InvalidNodeCapabilities(supportedCapabilityIds); + bytes32[] memory supportedHashedCapabilityIds = node.hashedCapabilityIds; + if (supportedHashedCapabilityIds.length == 0) revert InvalidNodeCapabilities(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]); + storedNode.configCount++; + uint32 capabilityConfigCount = storedNode.configCount; + for (uint256 j; j < supportedHashedCapabilityIds.length; ++j) { + if (!s_hashedCapabilityIds.contains(supportedHashedCapabilityIds[j])) + revert InvalidNodeCapabilities(supportedHashedCapabilityIds); + storedNode.supportedHashedCapabilityIds[capabilityConfigCount].add(supportedHashedCapabilityIds[j]); } - s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; - s_nodes[node.p2pId].p2pId = node.p2pId; + storedNode.nodeOperatorId = node.nodeOperatorId; + storedNode.p2pId = node.p2pId; - bytes32 previousSigner = s_nodes[node.p2pId].signer; + bytes32 previousSigner = storedNode.signer; - if (s_nodes[node.p2pId].signer != node.signer) { + if (storedNode.signer != node.signer) { s_nodeSigners.remove(previousSigner); - s_nodes[node.p2pId].signer = node.signer; + storedNode.signer = node.signer; s_nodeSigners.add(node.signer); } emit NodeUpdated(node.p2pId, node.nodeOperatorId, node.signer); @@ -510,8 +521,16 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param p2pId The P2P ID of the node to query for /// @return NodeInfo The node data /// @return configCount The number of times the node has been configured - function getNode(bytes32 p2pId) external view returns (NodeInfo memory, uint32 configCount) { - return _getNode(p2pId); + function getNode(bytes32 p2pId) public view returns (NodeInfo memory, uint32 configCount) { + return ( + NodeInfo({ + nodeOperatorId: s_nodes[p2pId].nodeOperatorId, + p2pId: s_nodes[p2pId].p2pId, + signer: s_nodes[p2pId].signer, + hashedCapabilityIds: s_nodes[p2pId].supportedHashedCapabilityIds[s_nodes[p2pId].configCount].values() + }), + s_nodes[p2pId].configCount + ); } /// @notice Gets all nodes @@ -523,10 +542,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { uint32[] memory configCounts = new uint32[](p2pIds.length); for (uint256 i; i < p2pIds.length; ++i) { - bytes32 p2pId = p2pIds[i]; - (NodeInfo memory node, uint32 configCount) = _getNode(p2pId); - nodeInfo[i] = node; - configCounts[i] = configCount; + (nodeInfo[i], configCounts[i]) = getNode(p2pIds[i]); } return (nodeInfo, configCounts); } @@ -540,28 +556,26 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { for (uint256 i; i < capabilities.length; ++i) { Capability memory capability = capabilities[i]; bytes32 hashedCapabilityId = getHashedCapabilityId(capability.labelledName, capability.version); - if (s_hashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityAlreadyExists(); - s_hashedCapabilityIds.add(hashedCapabilityId); + if (!s_hashedCapabilityIds.add(hashedCapabilityId)) revert CapabilityAlreadyExists(hashedCapabilityId); _setCapability(hashedCapabilityId, capability); } } - /// @notice Deprecates a capability by adding it to the deprecated list + /// @notice Deprecates a capability /// @param hashedCapabilityIds[] The IDs of the capabilities to deprecate function deprecateCapabilities(bytes32[] calldata hashedCapabilityIds) external onlyOwner { for (uint256 i; i < hashedCapabilityIds.length; ++i) { bytes32 hashedCapabilityId = hashedCapabilityIds[i]; if (!s_hashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityDoesNotExist(hashedCapabilityId); - if (s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId)) - revert CapabilityIsDeprecated(hashedCapabilityId); + if (!s_deprecatedHashedCapabilityIds.add(hashedCapabilityId)) revert CapabilityIsDeprecated(hashedCapabilityId); - s_deprecatedHashedCapabilityIds.add(hashedCapabilityId); delete s_capabilities[hashedCapabilityId]; emit CapabilityDeprecated(hashedCapabilityId); } } - /// @notice This function returns a Capability by its hashed ID. Use `getHashedCapabilityId` to get the hashed ID. + /// @notice Returns a Capability by its hashed ID. + /// @dev Use `getHashedCapabilityId` to get the hashed ID. function getCapability(bytes32 hashedId) external view returns (Capability memory) { return s_capabilities[hashedId]; } @@ -622,10 +636,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { CapabilityConfiguration[] calldata capabilityConfigurations, bool isPublic ) external onlyOwner { - uint32 id = s_donId; + uint32 id = s_nextDONId++; s_dons[id].id = id; _setDONConfig(id, 1, nodes, capabilityConfigurations, isPublic); - ++s_donId; } /// @notice Updates a DON's configuration. This allows @@ -678,8 +691,8 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Returns the list of configured DONs /// @return DONInfo[] The list of configured DONs function getDONs() external view returns (DONInfo[] memory) { - /// Minus one to account for s_donId starting at index 1 - uint32 donId = s_donId; + /// Minus one to account for s_nextDONId starting at index 1 + uint32 donId = s_nextDONId; DONInfo[] memory dons = new DONInfo[](donId - 1); uint256 idx; /// @@ -749,8 +762,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { } for (uint256 i; i < nodes.length; ++i) { - if (donCapabilityConfig.nodes.contains(nodes[i])) revert DuplicateDONNode(donId, nodes[i]); - donCapabilityConfig.nodes.add(nodes[i]); + if (!donCapabilityConfig.nodes.add(nodes[i])) revert DuplicateDONNode(donId, nodes[i]); + + /// Fine to add a duplicate DON ID to the set of supported DON IDs again as the set + /// will only store unique DON IDs s_nodes[nodes[i]].supportedDONIds.add(donId); } @@ -767,7 +782,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { for (uint256 j; j < nodes.length; ++j) { if ( - !s_nodes[nodes[j]].supportedCapabilityIds[s_nodes[nodes[j]].configCount].contains(configuration.capabilityId) + !s_nodes[nodes[j]].supportedHashedCapabilityIds[s_nodes[nodes[j]].configCount].contains( + configuration.capabilityId + ) ) revert NodeDoesNotSupportCapability(nodes[j], configuration.capabilityId); } @@ -805,27 +822,15 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { } } - /// @notice Gets a node's data - /// @param p2pId The P2P ID of the node to query for - /// @return NodeInfo The node data - /// @return configCount The number of times the node has been configured - function _getNode(bytes32 p2pId) internal view returns (NodeInfo memory, uint32 configCount) { - return ( - NodeInfo({ - 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 - ); - } - /// @notice Sets a capability's data /// @param hashedCapabilityId The ID of the capability being set /// @param capability The capability's data function _setCapability(bytes32 hashedCapabilityId, Capability memory capability) internal { if (capability.configurationContract != address(0)) { + /// Check that the configuration contract being assigned + /// correctly supports the ICapabilityConfiguration interface + /// by implementing both getCapabilityConfiguration and + /// beforeCapabilityConfigSet if ( capability.configurationContract.code.length == 0 || !IERC165(capability.configurationContract).supportsInterface( diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddCapabilitiesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddCapabilitiesTest.t.sol index e9c8a67e59e..4e0642c39e0 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddCapabilitiesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddCapabilitiesTest.t.sol @@ -28,7 +28,9 @@ contract CapabilityRegistry_AddCapabilitiesTest is BaseTest { s_capabilityRegistry.addCapabilities(capabilities); // Try to add the same capability again - vm.expectRevert(CapabilityRegistry.CapabilityAlreadyExists.selector); + vm.expectRevert( + abi.encodeWithSelector(CapabilityRegistry.CapabilityAlreadyExists.selector, s_basicHashedCapabilityId) + ); s_capabilityRegistry.addCapabilities(capabilities); } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodeOperatorsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodeOperatorsTest.t.sol index 43c5d2fe2da..43156a88ae8 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodeOperatorsTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodeOperatorsTest.t.sol @@ -5,7 +5,7 @@ import {BaseTest} from "./BaseTest.t.sol"; import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_AddNodeOperatorsTest is BaseTest { - event NodeOperatorAdded(uint32 nodeOperatorId, address indexed admin, string name); + event NodeOperatorAdded(uint32 indexed nodeOperatorId, address indexed admin, string name); uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 1; uint32 private constant TEST_NODE_OPERATOR_TWO_ID = 2; 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 8c54d3b62d9..b3898656e92 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol @@ -5,7 +5,7 @@ import {BaseTest} from "./BaseTest.t.sol"; import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_AddNodesTest is BaseTest { - event NodeAdded(bytes32 p2pId, uint32 nodeOperatorId, bytes32 signer); + event NodeAdded(bytes32 p2pId, uint32 indexed nodeOperatorId, bytes32 signer); uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 1; uint32 private constant TEST_NODE_OPERATOR_TWO_ID = 2; @@ -35,7 +35,7 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { hashedCapabilityIds: hashedCapabilityIds }); - vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.AccessForbidden.selector, STRANGER)); s_capabilityRegistry.addNodes(nodes); } 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 b39bdc73717..6164fff4559 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodeOperatorsTest.t.sol @@ -5,7 +5,7 @@ import {BaseTest} from "./BaseTest.t.sol"; import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_RemoveNodeOperatorsTest is BaseTest { - event NodeOperatorRemoved(uint32 nodeOperatorId); + event NodeOperatorRemoved(uint32 indexed nodeOperatorId); uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 1; uint32 private constant TEST_NODE_OPERATOR_TWO_ID = 2; 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 d027cd7ee6f..b6b62bf8575 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol @@ -45,7 +45,7 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { bytes32[] memory nodes = new bytes32[](1); nodes[0] = P2P_ID; - vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.AccessForbidden.selector, STRANGER)); s_capabilityRegistry.removeNodes(nodes); } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol index a853f435ff3..77d180a784a 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol @@ -5,7 +5,7 @@ import {BaseTest} from "./BaseTest.t.sol"; import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_UpdateNodeOperatorTest is BaseTest { - event NodeOperatorUpdated(uint32 nodeOperatorId, address indexed admin, string name); + event NodeOperatorUpdated(uint32 indexed nodeOperatorId, address indexed admin, string name); uint32 private constant TEST_NODE_OPERATOR_ID = 1; address private constant NEW_NODE_OPERATOR_ADMIN = address(3); @@ -26,7 +26,7 @@ contract CapabilityRegistry_UpdateNodeOperatorTest is BaseTest { uint32[] memory nodeOperatorIds = new uint32[](1); nodeOperatorIds[0] = TEST_NODE_OPERATOR_ID; - vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.AccessForbidden.selector, STRANGER)); s_capabilityRegistry.updateNodeOperators(nodeOperatorIds, nodeOperators); } 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 2156a6384cb..edc17b960c2 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol @@ -5,7 +5,7 @@ import {BaseTest} from "./BaseTest.t.sol"; import {CapabilityRegistry} from "../CapabilityRegistry.sol"; contract CapabilityRegistry_UpdateNodesTest is BaseTest { - event NodeUpdated(bytes32 p2pId, uint32 nodeOperatorId, bytes32 signer); + event NodeUpdated(bytes32 p2pId, uint32 indexed nodeOperatorId, bytes32 signer); uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 1; uint32 private constant TEST_NODE_OPERATOR_TWO_ID = 2; @@ -62,7 +62,7 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { hashedCapabilityIds: hashedCapabilityIds }); - vm.expectRevert(CapabilityRegistry.AccessForbidden.selector); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.AccessForbidden.selector, STRANGER)); s_capabilityRegistry.updateNodes(nodes); } 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 a5d93258be0..2781cf2236c 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 @@ -63,8 +63,8 @@ type CapabilityRegistryNodeOperator struct { } var CapabilityRegistryMetaData = &bind.MetaData{ - 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\"}],\"name\":\"DONDoesNotExist\",\"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\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"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\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"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\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"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\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"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\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"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\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo[]\",\"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\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"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\":[],\"name\":\"getNodeOperators\",\"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\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"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\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"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\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"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\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"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\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6149f880620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063caef831d11610071578063caef831d1461041e578063ddbe4f8214610431578063e29581aa14610446578063f2fde38b1461045c57600080fd5b80638da5cb5b146103c35780639cb7c5f4146103eb578063c63239c51461040b57600080fd5b806373ac22b4116100c857806373ac22b41461039557806379ba5097146103a857806386fa4246146103b057600080fd5b80635e65e3091461035a57806366acaa331461036d5780636ae5c5911461038257600080fd5b8063275459f21161015b578063398f377311610135578063398f3773146102f25780633f2a13c91461030557806350c946fe146103265780635d83d9671461034757600080fd5b8063275459f2146102845780632c01a1e81461029757806336b402fb146102aa57600080fd5b8063214502431161018c578063214502431461022f57806322bdbcbc14610244578063235374051461026457600080fd5b806312570011146101b3578063181f5a77146101db5780631d05394c1461021a575b600080fd5b6101c66101c13660046137c0565b61046f565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101d29190613847565b61022d61022836600461389f565b610482565b005b61023761063e565b6040516101d291906139f1565b610257610252366004613a8a565b610792565b6040516101d29190613ae2565b610277610272366004613a8a565b61087f565b6040516101d29190613af5565b61022d61029236600461389f565b6108b2565b61022d6102a536600461389f565b610991565b6102e46102b8366004613b08565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101d2565b61022d61030036600461389f565b610c78565b610318610313366004613b2a565b610e3b565b6040516101d2929190613b54565b6103396103343660046137c0565b611025565b6040516101d2929190613bbb565b61022d61035536600461389f565b61105a565b61022d61036836600461389f565b6111a3565b6103756116a6565b6040516101d29190613be3565b61022d610390366004613c64565b611891565b61022d6103a336600461389f565b611934565b61022d611df5565b61022d6103be366004613ce8565b611ef2565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6103fe6103f93660046137c0565b61228c565b6040516101d29190613df3565b61022d610419366004613e01565b612336565b61022d61042c366004613e94565b6123c5565b61043961249f565b6040516101d29190613f09565b61044e61266e565b6040516101d2929190613f57565b61022d61046a36600461403a565b6127f9565b600061047c60058361280d565b92915050565b61048a612828565b60005b818110156106395760008383838181106104a9576104a9614055565b90506020020160208101906104be9190613a8a565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b610500826128ab565b811015610558576105478563ffffffff16600c600061052885876128b590919063ffffffff16565b81526020019081526020016000206004016128c190919063ffffffff16565b50610551816140b3565b90506104f7565b508254640100000000900463ffffffff166000036105af576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505080610632906140b3565b905061048d565b505050565b600e54606090640100000000900463ffffffff16600061065f6001836140eb565b63ffffffff1667ffffffffffffffff81111561067d5761067d614108565b6040519080825280602002602001820160405280156106f357816020015b6040805160a08101825260008082526020808301829052928201526060808201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161069b5790505b509050600060015b8363ffffffff168163ffffffff16101561076f5763ffffffff8082166000908152600d6020526040902054161561075f57610735816128cd565b83838151811061074757610747614055565b60200260200101819052508161075c906140b3565b91505b61076881614137565b90506106fb565b5061077b6001846140eb565b63ffffffff16811461078b578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916107f69061415a565b80601f01602080910402602001604051908101604052809291908181526020018280546108229061415a565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050815250509050919050565b6040805160a081018252600080825260208201819052918101919091526060808201819052608082015261047c826128cd565b6108ba612828565b60005b63ffffffff811682111561063957600083838363ffffffff168181106108e5576108e5614055565b90506020020160208101906108fa9190613a8a565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109456001830182613753565b505060405163ffffffff821681527fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a9060200160405180910390a15061098a81614137565b90506108bd565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c725760008484838181106109cb576109cb614055565b602090810292909201356000818152600c90935260409092206001810154929350911515905080610a2b576040517f64e2ee92000000000000000000000000000000000000000000000000000000008152600481018490526024016105a6565b6000610a39836004016128ab565b1115610a74576040517f34a4a3f6000000000000000000000000000000000000000000000000000000008152600481018490526024016105a6565b815463ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610ac69061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054610af29061415a565b8015610b3f5780601f10610b1457610100808354040283529160200191610b3f565b820191906000526020600020905b815481529060010190602001808311610b2257829003601f168201915b505050505081525050905085158015610b6f5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610ba6576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001830154610bb7906007906128c1565b506002830154610bc9906009906128c1565b506000848152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610c1e828261378d565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320584604051610c5591815260200190565b60405180910390a15050505080610c6b906140b3565b90506109af565b50505050565b610c80612828565b60005b81811015610639576000838383818110610c9f57610c9f614055565b9050602002810190610cb191906141ad565b610cba906142a9565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d0b576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610d9790826143a4565b5050600e8054909150600090610db29063ffffffff16614137565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e828460200151604051610e209291906144be565b60405180910390a2505080610e34906140b3565b9050610c83565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610e8d9061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb99061415a565b8015610f065780601f10610edb57610100808354040283529160200191610f06565b820191906000526020600020905b815481529060010190602001808311610ee957829003601f168201915b50505060008881526002602081905260409091200154929350606092610100900473ffffffffffffffffffffffffffffffffffffffff16159150611017905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015261010090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610fce573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261101491908101906144dd565b90505b9093509150505b9250929050565b604080516080810182526000808252602082018190529181018290526060808201529061105183612b66565b91509150915091565b611062612828565b60005b8181101561063957600083838381811061108157611081614055565b90506020020135905061109e81600361280d90919063ffffffff16565b6110d7576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105a6565b6110e260058261280d565b1561111c576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152600481018290526024016105a6565b611127600582612c0b565b5060008181526002602081905260408083208381556001810184905590910180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690555182917fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2191a25061119c816140b3565b9050611065565b60005b818110156106395760008383838181106111c2576111c2614055565b90506020028101906111d4919061454b565b6111dd9061457f565b9050600061120060005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff9081168352600182018054969091163314965093949193909284019161125d9061415a565b80601f01602080910402602001604051908101604052809291908181526020018280546112899061415a565b80156112d65780601f106112ab576101008083540402835291602001916112d6565b820191906000526020600020905b8154815290600101906020018083116112b957829003601f168201915b5050505050815250509050811580156113065750805173ffffffffffffffffffffffffffffffffffffffff163314155b1561133d576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040808401516000908152600c60205220600101541515806113935783604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105a691815260200190565b602084015115806113d957508360200151600c60008660400151815260200190815260200160002060010154141580156113d9575060208401516113d99060079061280d565b15611410576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060840151805160000361145257806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a69190614652565b6040858101516000908152600c602052208054640100000000900463ffffffff1690600461147f83614137565b82546101009290920a63ffffffff8181021990931691831602179091556040878101516000908152600c60205290812054640100000000900490911691505b825181101561158a576114f48382815181106114dc576114dc614055565b6020026020010151600361280d90919063ffffffff16565b61152c57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a69190614652565b61157983828151811061154157611541614055565b6020908102919091018101516040808b01516000908152600c845281812063ffffffff808916835260039091019094522091612c0b16565b50611583816140b3565b90506114be565b508551604080880180516000908152600c602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9096169590951790945581518082528382206002015581518152828120600190810154948b015192518252929020909101541461163f5761160e6007826128c1565b50602080880180516040808b01516000908152600c909452909220600101919091555161163d90600790612c0b565b505b60408781015188516020808b0151845193845263ffffffff909216908301528183015290517f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b9181900360600190a1505050505050508061169f906140b3565b90506111a6565b600e5460609063ffffffff1660006116bf6001836140eb565b63ffffffff1667ffffffffffffffff8111156116dd576116dd614108565b60405190808252806020026020018201604052801561172357816020015b6040805180820190915260008152606060208201528152602001906001900390816116fb5790505b509050600060015b8363ffffffff168163ffffffff16101561187b5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff161561186b5763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916117bf9061415a565b80601f01602080910402602001604051908101604052809291908181526020018280546117eb9061415a565b80156118385780601f1061180d57610100808354040283529160200191611838565b820191906000526020600020905b81548152906001019060200180831161181b57829003601f168201915b50505050508152505083838151811061185357611853614055565b602002602001018190525081611868906140b3565b91505b61187481614137565b905061172b565b50600e5461077b9060019063ffffffff166140eb565b611899612828565b600e54640100000000900463ffffffff166000818152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016821790556118f08160018888888888612c17565b600e805460049061190e90640100000000900463ffffffff16614137565b91906101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b60005b8181101561063957600083838381811061195357611953614055565b9050602002810190611965919061454b565b61196e9061457f565b9050600061199160005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916119ee9061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1a9061415a565b8015611a675780601f10611a3c57610100808354040283529160200191611a67565b820191906000526020600020905b815481529060010190602001808311611a4a57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611acd5782516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024016105a6565b81158015611af25750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611b29576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040808401516000908152600c602052206001015415158080611b4e57506040840151155b15611b8d5783604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105a691815260200190565b60208401511580611baa57506020840151611baa9060079061280d565b15611be1576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608401518051600003611c2357806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a69190614652565b6040858101516000908152600c602052208054600490611c5090640100000000900463ffffffff16614137565b82546101009290920a63ffffffff8181021990931691831602179091556040868101516000908152600c602052908120546401000000009004909116905b8251811015611d0a57611cac8382815181106114dc576114dc614055565b611ce457826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a69190614652565b611cf983828151811061154157611541614055565b50611d03816140b3565b9050611c8e565b508551604080880180516000908152600c602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9687161790558251808352848320600201558a018051925182529290206001015551611d7c9160079190612c0b16565b506040860151611d8e90600990612c0b565b5060408681015187516020808a0151845193845263ffffffff909216908301528183015290517f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f059181900360600190a150505050505080611dee906140b3565b9050611937565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105a6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611f35576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105a6565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b84811015612284576000868683818110611f6d57611f6d614055565b9050602002016020810190611f829190613a8a565b63ffffffff81166000908152600b602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16611fef576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526024016105a6565b600085858481811061200357612003614055565b905060200281019061201591906141ad565b61201e906142a9565b805190915073ffffffffffffffffffffffffffffffffffffffff1661206f576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1633148015906120ac57503373ffffffffffffffffffffffffffffffffffffffff851614155b156120e3576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805163ffffffff83166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff90811691161415806121a357506020808201516040516121309201613847565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012063ffffffff86166000908152600b835292909220919261218a92600101910161468a565b6040516020818303038152906040528051906020012014155b1561227157805163ffffffff83166000908152600b6020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217825582015160019091019061221790826143a4565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a288383602001516040516122689291906144be565b60405180910390a25b50508061227d906140b3565b9050611f51565b505050505050565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff16908111156122f5576122f5613d54565b600181111561230657612306613d54565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61233e612828565b63ffffffff8087166000908152600d60205260408120546401000000009004909116908190036123a2576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526024016105a6565b6123bc876123af83614137565b9250828888888888612c17565b50505050505050565b6123cd612828565b60005b818110156106395760008383838181106123ec576123ec614055565b9050608002018036038101906124029190614733565b805160208083015160408051808401949094528381019190915280518084038201815260609093019052815191012090915061243f60038261280d565b15612476576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612481600382612c0b565b5061248c8183613182565b505080612498906140b3565b90506123d0565b606060006124ad60036133aa565b905060006124bb60056128ab565b82516124c7919061478a565b67ffffffffffffffff8111156124df576124df614108565b60405190808252806020026020018201604052801561254f57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816124fd5790505b5090506000805b835181101561266557600084828151811061257357612573614055565b6020026020010151905061259181600561280d90919063ffffffff16565b612654576002600082815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1660018111156125eb576125eb613d54565b60018111156125fc576125fc613d54565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff16602090910152845185908590811061263a5761263a614055565b60200260200101819052508280612650906140b3565b9350505b5061265e816140b3565b9050612556565b50909392505050565b606080600061267d60096133aa565b90506000815167ffffffffffffffff81111561269b5761269b614108565b60405190808252806020026020018201604052801561270a57816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816126b95790505b5090506000825167ffffffffffffffff81111561272957612729614108565b604051908082528060200260200182016040528015612752578160200160208202803683370190505b50905060005b83518110156127ee57600084828151811061277557612775614055565b6020026020010151905060008061278b83612b66565b91509150818685815181106127a2576127a2614055565b6020026020010181905250808585815181106127c0576127c0614055565b602002602001019063ffffffff16908163ffffffff1681525050505050806127e7906140b3565b9050612758565b509094909350915050565b612801612828565b61280a816133b7565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146128a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105a6565b565b600061047c825490565b600061282183836134ac565b600061282183836134d6565b6040805160a081018252600080825260208083018290528284018290526060808401819052608084015263ffffffff8581168352600d825284832080546401000000009004909116808452600190910182528483206002810180548751818602810186019098528088529596929591949390919083018282801561297057602002820191906000526020600020905b81548152602001906001019080831161295c575b505050505090506000815167ffffffffffffffff81111561299357612993614108565b6040519080825280602002602001820160405280156129d957816020015b6040805180820190915260008152606060208201528152602001906001900390816129b15790505b50905060005b8151811015612afa576040518060400160405280848381518110612a0557612a05614055565b60200260200101518152602001856003016000868581518110612a2a57612a2a614055565b602002602001015181526020019081526020016000208054612a4b9061415a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a779061415a565b8015612ac45780601f10612a9957610100808354040283529160200191612ac4565b820191906000526020600020905b815481529060010190602001808311612aa757829003601f168201915b5050505050815250828281518110612ade57612ade614055565b602002602001018190525080612af3906140b3565b90506129df565b506040805160a08101825263ffffffff8881166000818152600d6020818152868320548086168752948b168187015292909152905268010000000000000000900460ff1615159181019190915260608101612b54856133aa565b81526020019190915295945050505050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff808216865260018301548487015260028301548688015264010000000090910416835260030190529182206060820190612be2906133aa565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b600061282183836135c9565b63ffffffff8088166000908152600d60209081526040808320938a168084526001948501909252909120911015612cd65763ffffffff88166000908152600d602052604081206001908101908290612c6f908b6140eb565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612c97826128ab565b811015612cd357612cc28a63ffffffff16600c600061052885876000016128b590919063ffffffff16565b50612ccc816140b3565b9050612c8e565b50505b60005b85811015612de457612d06878783818110612cf657612cf6614055565b859260209091020135905061280d565b15612d675788878783818110612d1e57612d1e614055565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff909416600485015260200291909101356024830152506044016105a6565b612d8c878783818110612d7c57612d7c614055565b8592602090910201359050612c0b565b50612dd38963ffffffff16600c60008a8a86818110612dad57612dad614055565b905060200201358152602001908152602001600020600401612c0b90919063ffffffff16565b50612ddd816140b3565b9050612cd9565b5060005b838110156130c35736858583818110612e0357612e03614055565b9050602002810190612e1591906141ad565b9050612e236003823561280d565b612e5c576040517fe181733f000000000000000000000000000000000000000000000000000000008152813560048201526024016105a6565b612e686005823561280d565b15612ea2576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152813560048201526024016105a6565b8035600090815260038401602052604081208054612ebf9061415a565b90501115612f08576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8b166004820152813560248201526044016105a6565b60005b8781101561301a57612faf8235600c60008c8c86818110612f2e57612f2e614055565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110612f5e57612f5e614055565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002061280d90919063ffffffff16565b61300a57888882818110612fc557612fc5614055565b6040517fa7e7925000000000000000000000000000000000000000000000000000000000815260209091029290920135600483015250823560248201526044016105a6565b613013816140b3565b9050612f0b565b50600283018054600181018255600091825260209182902083359101556130439082018261479d565b82356000908152600386016020526040902091613061919083614802565b506130b28a8a83358b8b613078602088018861479d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061361892505050565b506130bc816140b3565b9050612de8565b5063ffffffff8881166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff1668010000000000000000881515027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1617640100000000958d1695860217905581519283528201929092527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050505050565b606081015173ffffffffffffffffffffffffffffffffffffffff16156132d057606081015173ffffffffffffffffffffffffffffffffffffffff163b158061327b575060608101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613279919061491d565b155b156132d05760608101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016105a6565b8060026000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff0219169083600181111561332257613322613d54565b0217905550606091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b60606000612821836136f7565b3373ffffffffffffffffffffffffffffffffffffffff821603613436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105a6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008260000182815481106134c3576134c3614055565b9060005260206000200154905092915050565b600081815260018301602052604081205480156135bf5760006134fa60018361478a565b855490915060009061350e9060019061478a565b905081811461357357600086600001828154811061352e5761352e614055565b906000526020600020015490508087600001848154811061355157613551614055565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806135845761358461493a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061047c565b600091505061047c565b60008181526001830160205260408120546136105750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561047c565b50600061047c565b60008481526002602081905260409091200154610100900473ffffffffffffffffffffffffffffffffffffffff161561228457600084815260026020819052604091829020015490517ffba64a7c00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c906136bd908690869086908b908d90600401614969565b600060405180830381600087803b1580156136d757600080fd5b505af11580156136eb573d6000803e3d6000fd5b50505050505050505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561374757602002820191906000526020600020905b815481526020019060010190808311613733575b50505050509050919050565b50805461375f9061415a565b6000825580601f1061376f575050565b601f01602090049060005260206000209081019061280a91906137a7565b508054600082559060005260206000209081019061280a91905b5b808211156137bc57600081556001016137a8565b5090565b6000602082840312156137d257600080fd5b5035919050565b60005b838110156137f45781810151838201526020016137dc565b50506000910152565b600081518084526138158160208601602086016137d9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061282160208301846137fd565b60008083601f84011261386c57600080fd5b50813567ffffffffffffffff81111561388457600080fd5b6020830191508360208260051b850101111561101e57600080fd5b600080602083850312156138b257600080fd5b823567ffffffffffffffff8111156138c957600080fd5b6138d58582860161385a565b90969095509350505050565b600081518084526020808501945080840160005b83811015613911578151875295820195908201906001016138f5565b509495945050505050565b600063ffffffff8083511684526020818185015116818601526040915081840151151582860152606084015160a0606087015261395c60a08701826138e1565b9050608085015186820360808801528181518084528484019150848160051b850101858401935060005b828110156139e3578582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00184528451805183528701518783018990526139d0898401826137fd565b9588019594880194925050600101613986565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613a64577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613a5285835161391c565b94509285019290850190600101613a18565b5092979650505050505050565b803563ffffffff81168114613a8557600080fd5b919050565b600060208284031215613a9c57600080fd5b61282182613a71565b73ffffffffffffffffffffffffffffffffffffffff81511682526000602082015160406020850152613ada60408501826137fd565b949350505050565b6020815260006128216020830184613aa5565b602081526000612821602083018461391c565b60008060408385031215613b1b57600080fd5b50508035926020909101359150565b60008060408385031215613b3d57600080fd5b613b4683613a71565b946020939093013593505050565b604081526000613b6760408301856137fd565b8281036020840152613b7981856137fd565b95945050505050565b63ffffffff815116825260208101516020830152604081015160408301526000606082015160806060850152613ada60808501826138e1565b604081526000613bce6040830185613b82565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613a64577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613c44858351613aa5565b94509285019290850190600101613c0a565b801515811461280a57600080fd5b600080600080600060608688031215613c7c57600080fd5b853567ffffffffffffffff80821115613c9457600080fd5b613ca089838a0161385a565b90975095506020880135915080821115613cb957600080fd5b50613cc68882890161385a565b9094509250506040860135613cda81613c56565b809150509295509295909350565b60008060008060408587031215613cfe57600080fd5b843567ffffffffffffffff80821115613d1657600080fd5b613d228883890161385a565b90965094506020870135915080821115613d3b57600080fd5b50613d488782880161385a565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110613dcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b6080810161047c8284613d83565b60008060008060008060808789031215613e1a57600080fd5b613e2387613a71565b9550602087013567ffffffffffffffff80821115613e4057600080fd5b613e4c8a838b0161385a565b90975095506040890135915080821115613e6557600080fd5b50613e7289828a0161385a565b9094509250506060870135613e8681613c56565b809150509295509295509295565b60008060208385031215613ea757600080fd5b823567ffffffffffffffff80821115613ebf57600080fd5b818501915085601f830112613ed357600080fd5b813581811115613ee257600080fd5b8660208260071b8501011115613ef757600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613f4b57613f38838551613d83565b9284019260809290920191600101613f25565b50909695505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015613fcc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018552613fba868351613b82565b95509382019390820190600101613f80565b50508584038187015286518085528782019482019350915060005b8281101561400957845163ffffffff1684529381019392810192600101613fe7565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613a8557600080fd5b60006020828403121561404c57600080fd5b61282182614016565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140e4576140e4614084565b5060010190565b63ffffffff82811682821603908082111561078b5761078b614084565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600063ffffffff80831681810361415057614150614084565b6001019392505050565b600181811c9082168061416e57607f821691505b6020821081036141a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126141e157600080fd5b9190910192915050565b6040516080810167ffffffffffffffff8111828210171561420e5761420e614108565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561425b5761425b614108565b604052919050565b600067ffffffffffffffff82111561427d5761427d614108565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000604082360312156142bb57600080fd5b6040516040810167ffffffffffffffff82821081831117156142df576142df614108565b816040526142ec85614016565b835260209150818501358181111561430357600080fd5b8501905036601f82011261431657600080fd5b803561432961432482614263565b614214565b818152368483850101111561433d57600080fd5b81848401858301376000918101840191909152918301919091525092915050565b601f82111561063957600081815260208120601f850160051c810160208610156143855750805b601f850160051c820191505b8181101561228457828155600101614391565b815167ffffffffffffffff8111156143be576143be614108565b6143d2816143cc845461415a565b8461435e565b602080601f83116001811461442557600084156143ef5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612284565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561447257888601518255948401946001909101908401614453565b50858210156144ae57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b63ffffffff83168152604060208201526000613ada60408301846137fd565b6000602082840312156144ef57600080fd5b815167ffffffffffffffff81111561450657600080fd5b8201601f8101841361451757600080fd5b805161452561432482614263565b81815285602083850101111561453a57600080fd5b613b798260208301602086016137d9565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141e157600080fd5b60006080823603121561459157600080fd5b6145996141eb565b6145a283613a71565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff808211156145d357600080fd5b9085019036601f8301126145e657600080fd5b8135818111156145f8576145f8614108565b8060051b9150614609848301614214565b818152918301840191848101903684111561462357600080fd5b938501935b8385101561464157843582529385019390850190614628565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613f4b5783518352928401929184019160010161466e565b600060208083526000845461469e8161415a565b808487015260406001808416600081146146bf57600181146146f757614725565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614725565b896000528660002060005b8581101561471d5781548b8201860152908301908801614702565b8a0184019650505b509398975050505050505050565b60006080828403121561474557600080fd5b61474d6141eb565b823581526020830135602082015260408301356002811061476d57600080fd5b604082015261477e60608401614016565b60608201529392505050565b8181038181111561047c5761047c614084565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126147d257600080fd5b83018035915067ffffffffffffffff8211156147ed57600080fd5b60200191503681900382131561101e57600080fd5b67ffffffffffffffff83111561481a5761481a614108565b61482e83614828835461415a565b8361435e565b6000601f841160018114614880576000851561484a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614916565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156148cf57868501358255602094850194600190920191016148af565b508682101561490a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561492f57600080fd5b815161282181613c56565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156149a257600080fd5b8560051b808860a0850137820182810360a090810160208501526149c8908201876137fd565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"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\"}],\"name\":\"DONDoesNotExist\",\"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\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"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\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"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\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"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\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"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\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo[]\",\"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\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"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\":[],\"name\":\"getNodeOperators\",\"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\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"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\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"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\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"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\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"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\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61474680620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063caef831d11610071578063caef831d1461041e578063ddbe4f8214610431578063e29581aa14610446578063f2fde38b1461045c57600080fd5b80638da5cb5b146103c35780639cb7c5f4146103eb578063c63239c51461040b57600080fd5b806373ac22b4116100c857806373ac22b41461039557806379ba5097146103a857806386fa4246146103b057600080fd5b80635e65e3091461035a57806366acaa331461036d5780636ae5c5911461038257600080fd5b8063275459f21161015b578063398f377311610135578063398f3773146102f25780633f2a13c91461030557806350c946fe146103265780635d83d9671461034757600080fd5b8063275459f2146102845780632c01a1e81461029757806336b402fb146102aa57600080fd5b8063214502431161018c578063214502431461022f57806322bdbcbc14610244578063235374051461026457600080fd5b806312570011146101b3578063181f5a77146101db5780631d05394c1461021a575b600080fd5b6101c66101c136600461352d565b61046f565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101d291906135b4565b61022d61022836600461360c565b610482565b005b61023761063e565b6040516101d2919061375e565b6102576102523660046137f7565b610792565b6040516101d2919061384f565b6102776102723660046137f7565b61087f565b6040516101d29190613862565b61022d61029236600461360c565b6108b2565b61022d6102a536600461360c565b610989565b6102e46102b8366004613875565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101d2565b61022d61030036600461360c565b610bac565b610318610313366004613897565b610d74565b6040516101d29291906138c1565b61033961033436600461352d565b610f5e565b6040516101d2929190613928565b61022d61035536600461360c565b611003565b61022d61036836600461360c565b61113f565b6103756115b1565b6040516101d29190613950565b61022d6103903660046139d1565b61179c565b61022d6103a336600461360c565b611836565b61022d611ca7565b61022d6103be366004613a55565b611da4565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6103fe6103f936600461352d565b6120e2565b6040516101d29190613b60565b61022d610419366004613b6e565b61218c565b61022d61042c366004613c01565b61221b565b6104396122eb565b6040516101d29190613c76565b61044e6124ba565b6040516101d2929190613cc4565b61022d61046a366004613da7565b612632565b600061047c600583612646565b92915050565b61048a612661565b60005b818110156106395760008383838181106104a9576104a9613dc2565b90506020020160208101906104be91906137f7565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b610500826126e4565b811015610558576105478563ffffffff16600c600061052885876126ee90919063ffffffff16565b81526020019081526020016000206004016126fa90919063ffffffff16565b5061055181613e20565b90506104f7565b508254640100000000900463ffffffff166000036105af576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a1505050508061063290613e20565b905061048d565b505050565b600e54606090640100000000900463ffffffff16600061065f600183613e58565b63ffffffff1667ffffffffffffffff81111561067d5761067d613e75565b6040519080825280602002602001820160405280156106f357816020015b6040805160a08101825260008082526020808301829052928201526060808201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161069b5790505b509050600060015b8363ffffffff168163ffffffff16101561076f5763ffffffff8082166000908152600d6020526040902054161561075f5761073581612706565b83838151811061074757610747613dc2565b60200260200101819052508161075c90613e20565b91505b61076881613ea4565b90506106fb565b5061077b600184613e58565b63ffffffff16811461078b578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916107f690613ec7565b80601f016020809104026020016040519081016040528092919081815260200182805461082290613ec7565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050815250509050919050565b6040805160a081018252600080825260208201819052918101919091526060808201819052608082015261047c82612706565b6108ba612661565b60005b63ffffffff811682111561063957600083838363ffffffff168181106108e5576108e5613dc2565b90506020020160208101906108fa91906137f7565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815591925061094560018301826134c0565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a25061098281613ea4565b90506108bd565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610ba65760008484838181106109c3576109c3613dc2565b602090810292909201356000818152600c90935260409092206001810154929350919050610a20576040517f64e2ee92000000000000000000000000000000000000000000000000000000008152600481018390526024016105a6565b6000610a2e826004016126e4565b1115610a69576040517f34a4a3f6000000000000000000000000000000000000000000000000000000008152600481018390526024016105a6565b83158015610aa35750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610adc576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105a6565b6001810154610aed906007906126fa565b506002810154610aff906009906126fa565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610b5482826134fa565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610b8b91815260200190565b60405180910390a1505080610b9f90613e20565b90506109a7565b50505050565b610bb4612661565b60005b81811015610639576000838383818110610bd357610bd3613dc2565b9050602002810190610be59190613f1a565b610bee90614016565b805190915073ffffffffffffffffffffffffffffffffffffffff16610c3f576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610ccb9082614111565b5050600e8054909150600090610ce69063ffffffff16613ea4565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610d5991906135b4565b60405180910390a3505080610d6d90613e20565b9050610bb7565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610dc690613ec7565b80601f0160208091040260200160405190810160405280929190818152602001828054610df290613ec7565b8015610e3f5780601f10610e1457610100808354040283529160200191610e3f565b820191906000526020600020905b815481529060010190602001808311610e2257829003601f168201915b50505060008881526002602081905260409091200154929350606092610100900473ffffffffffffffffffffffffffffffffffffffff16159150610f50905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015261010090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f4d919081019061422b565b90505b9093509150505b9250929050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff808216865260018301548487015260028301548688015264010000000090910416835260030190529182206060820190610fda9061299f565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b61100b612661565b60005b8181101561063957600083838381811061102a5761102a613dc2565b90506020020135905061104781600361264690919063ffffffff16565b611080576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105a6565b61108b6005826129ac565b6110c4576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152600481018290526024016105a6565b60008181526002602081905260408083208381556001810184905590910180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690555182917fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2191a25061113881613e20565b905061100e565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610ba657600084848381811061117957611179613dc2565b905060200281019061118b9190614299565b611194906142cd565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916111ea90613ec7565b80601f016020809104026020016040519081016040528092919081815260200182805461121690613ec7565b80156112635780601f1061123857610100808354040283529160200191611263565b820191906000526020600020905b81548152906001019060200180831161124657829003601f168201915b5050505050815250509050831580156112935750805173ffffffffffffffffffffffffffffffffffffffff163314155b156112cc576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105a6565b6040808301516000908152600c6020522060018101546113205782604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105a691815260200190565b60208301511580611350575082602001518160010154141580156113505750602083015161135090600790612646565b15611387576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015180516000036113c957806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a691906143a0565b8154640100000000900463ffffffff168260046113e583613ea4565b82546101009290920a63ffffffff8181021990931691831602179091558354640100000000900416905060005b82518110156114dd5761144883828151811061143057611430613dc2565b6020026020010151600361264690919063ffffffff16565b61148057826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a691906143a0565b6114cc83828151811061149557611495613dc2565b60200260200101518560030160008563ffffffff1663ffffffff1681526020019081526020016000206129ac90919063ffffffff16565b506114d681613e20565b9050611412565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9091161783556040850151600284015560018301546020860151811461154f576115346007826126fa565b5060208601516001850181905561154d906007906129ac565b505b85516040808801516020808a015183519283529082015263ffffffff909216917f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a2505050505050806115aa90613e20565b905061115d565b600e5460609063ffffffff1660006115ca600183613e58565b63ffffffff1667ffffffffffffffff8111156115e8576115e8613e75565b60405190808252806020026020018201604052801561162e57816020015b6040805180820190915260008152606060208201528152602001906001900390816116065790505b509050600060015b8363ffffffff168163ffffffff1610156117865763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff16156117765763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916116ca90613ec7565b80601f01602080910402602001604051908101604052809291908181526020018280546116f690613ec7565b80156117435780601f1061171857610100808354040283529160200191611743565b820191906000526020600020905b81548152906001019060200180831161172657829003601f168201915b50505050508152505083838151811061175e5761175e613dc2565b60200260200101819052508161177390613e20565b91505b61177f81613ea4565b9050611636565b50600e5461077b9060019063ffffffff16613e58565b6117a4612661565b600e805460009164010000000090910463ffffffff169060046117c683613ea4565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169091179055905061182e81600188888888886129b8565b505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610ba657600084848381811061187057611870613dc2565b90506020028101906118829190614299565b61188b906142cd565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916118e190613ec7565b80601f016020809104026020016040519081016040528092919081815260200182805461190d90613ec7565b801561195a5780601f1061192f5761010080835404028352916020019161195a565b820191906000526020600020905b81548152906001019060200180831161193d57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff166119c05781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024016105a6565b831580156119e55750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611a1e576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105a6565b6040808301516000908152600c602052206001810154151580611a4357506040830151155b15611a825782604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105a691815260200190565b60208301511580611a9f57506020830151611a9f90600790612646565b15611ad6576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611b1857806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a691906143a0565b81548290600490611b3690640100000000900463ffffffff16613ea4565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611bdd57611b7f83828151811061143057611430613dc2565b611bb757826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105a691906143a0565b611bcc83828151811061149557611495613dc2565b50611bd681613e20565b9050611b61565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff91821617845560408601516002850155602086015160018501819055611c3391600791906129ac16565b506040850151611c45906009906129ac565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080611ca090613e20565b9050611854565b60015473ffffffffffffffffffffffffffffffffffffffff163314611d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105a6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611de7576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105a6565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561182e576000868683818110611e1f57611e1f613dc2565b9050602002016020810190611e3491906137f7565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff16611ea3576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526024016105a6565b6000868685818110611eb757611eb7613dc2565b9050602002810190611ec99190613f1a565b611ed290614016565b805190915073ffffffffffffffffffffffffffffffffffffffff16611f23576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff163314801590611f6057503373ffffffffffffffffffffffffffffffffffffffff861614155b15611f99576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105a6565b8051825473ffffffffffffffffffffffffffffffffffffffff90811691161415806120155750602080820151604051611fd292016135b4565b6040516020818303038152906040528051906020012082600101604051602001611ffc91906143d8565b6040516020818303038152906040528051906020012014155b156120ce57805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020810151600183019061206f9082614111565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516120c591906135b4565b60405180910390a35b505050806120db90613e20565b9050611e03565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff169081111561214b5761214b613ac1565b600181111561215c5761215c613ac1565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b612194612661565b63ffffffff8087166000908152600d60205260408120546401000000009004909116908190036121f8576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526024016105a6565b6122128761220583613ea4565b92508288888888886129b8565b50505050505050565b612223612661565b60005b8181101561063957600083838381811061224257612242613dc2565b9050608002018036038101906122589190614481565b80516020808301516040805180840194909452838101919091528051808403820181526060909301905281519101209091506122956003826129ac565b6122ce576040517febf52551000000000000000000000000000000000000000000000000000000008152600481018290526024016105a6565b6122d88183612efc565b5050806122e490613e20565b9050612226565b606060006122f9600361299f565b9050600061230760056126e4565b825161231391906144d8565b67ffffffffffffffff81111561232b5761232b613e75565b60405190808252806020026020018201604052801561239b57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816123495790505b5090506000805b83518110156124b15760008482815181106123bf576123bf613dc2565b602002602001015190506123dd81600561264690919063ffffffff16565b6124a0576002600082815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16600181111561243757612437613ac1565b600181111561244857612448613ac1565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff16602090910152845185908590811061248657612486613dc2565b6020026020010181905250828061249c90613e20565b9350505b506124aa81613e20565b90506123a2565b50909392505050565b60608060006124c9600961299f565b90506000815167ffffffffffffffff8111156124e7576124e7613e75565b60405190808252806020026020018201604052801561255657816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816125055790505b5090506000825167ffffffffffffffff81111561257557612575613e75565b60405190808252806020026020018201604052801561259e578160200160208202803683370190505b50905060005b8351811015612627576125cf8482815181106125c2576125c2613dc2565b6020026020010151610f5e565b8483815181106125e1576125e1613dc2565b602002602001018484815181106125fa576125fa613dc2565b602002602001018263ffffffff1663ffffffff1681525082905250508061262090613e20565b90506125a4565b509094909350915050565b61263a612661565b61264381613124565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146126e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105a6565b565b600061047c825490565b600061265a8383613219565b600061265a8383613243565b6040805160a081018252600080825260208083018290528284018290526060808401819052608084015263ffffffff8581168352600d82528483208054640100000000900490911680845260019091018252848320600281018054875181860281018601909852808852959692959194939091908301828280156127a957602002820191906000526020600020905b815481526020019060010190808311612795575b505050505090506000815167ffffffffffffffff8111156127cc576127cc613e75565b60405190808252806020026020018201604052801561281257816020015b6040805180820190915260008152606060208201528152602001906001900390816127ea5790505b50905060005b815181101561293357604051806040016040528084838151811061283e5761283e613dc2565b6020026020010151815260200185600301600086858151811061286357612863613dc2565b60200260200101518152602001908152602001600020805461288490613ec7565b80601f01602080910402602001604051908101604052809291908181526020018280546128b090613ec7565b80156128fd5780601f106128d2576101008083540402835291602001916128fd565b820191906000526020600020905b8154815290600101906020018083116128e057829003601f168201915b505050505081525082828151811061291757612917613dc2565b60200260200101819052508061292c90613e20565b9050612818565b506040805160a08101825263ffffffff8881166000818152600d6020818152868320548086168752948b168187015292909152905268010000000000000000900460ff161515918101919091526060810161298d8561299f565b81526020019190915295945050505050565b6060600061265a83613336565b600061265a8383613392565b63ffffffff8088166000908152600d60209081526040808320938a168084526001948501909252909120911015612a775763ffffffff88166000908152600d602052604081206001908101908290612a10908b613e58565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612a38826126e4565b811015612a7457612a638a63ffffffff16600c600061052885876000016126ee90919063ffffffff16565b50612a6d81613e20565b9050612a2f565b50505b60005b85811015612b5e57612aa7878783818110612a9757612a97613dc2565b85926020909102013590506129ac565b612b075788878783818110612abe57612abe613dc2565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff909416600485015260200291909101356024830152506044016105a6565b612b4d8963ffffffff16600c60008a8a86818110612b2757612b27613dc2565b9050602002013581526020019081526020016000206004016129ac90919063ffffffff16565b50612b5781613e20565b9050612a7a565b5060005b83811015612e3d5736858583818110612b7d57612b7d613dc2565b9050602002810190612b8f9190613f1a565b9050612b9d60038235612646565b612bd6576040517fe181733f000000000000000000000000000000000000000000000000000000008152813560048201526024016105a6565b612be260058235612646565b15612c1c576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152813560048201526024016105a6565b8035600090815260038401602052604081208054612c3990613ec7565b90501115612c82576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8b166004820152813560248201526044016105a6565b60005b87811015612d9457612d298235600c60008c8c86818110612ca857612ca8613dc2565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110612cd857612cd8613dc2565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002061264690919063ffffffff16565b612d8457888882818110612d3f57612d3f613dc2565b6040517fa7e7925000000000000000000000000000000000000000000000000000000000815260209091029290920135600483015250823560248201526044016105a6565b612d8d81613e20565b9050612c85565b5060028301805460018101825560009182526020918290208335910155612dbd908201826144eb565b82356000908152600386016020526040902091612ddb919083614550565b50612e2c8a8a83358b8b612df260208801886144eb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133e192505050565b50612e3681613e20565b9050612b62565b5063ffffffff8881166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff1668010000000000000000881515027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1617640100000000958d1695860217905581519283528201929092527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050505050565b606081015173ffffffffffffffffffffffffffffffffffffffff161561304a57606081015173ffffffffffffffffffffffffffffffffffffffff163b1580612ff5575060608101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff3919061466b565b155b1561304a5760608101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016105a6565b8060026000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff0219169083600181111561309c5761309c613ac1565b0217905550606091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b3373ffffffffffffffffffffffffffffffffffffffff8216036131a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105a6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061323057613230613dc2565b9060005260206000200154905092915050565b6000818152600183016020526040812054801561332c5760006132676001836144d8565b855490915060009061327b906001906144d8565b90508181146132e057600086600001828154811061329b5761329b613dc2565b90600052602060002001549050808760000184815481106132be576132be613dc2565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806132f1576132f1614688565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061047c565b600091505061047c565b60608160000180548060200260200160405190810160405280929190818152602001828054801561338657602002820191906000526020600020905b815481526020019060010190808311613372575b50505050509050919050565b60008181526001830160205260408120546133d95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561047c565b50600061047c565b60008481526002602081905260409091200154610100900473ffffffffffffffffffffffffffffffffffffffff161561182e57600084815260026020819052604091829020015490517ffba64a7c00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613486908690869086908b908d906004016146b7565b600060405180830381600087803b1580156134a057600080fd5b505af11580156134b4573d6000803e3d6000fd5b50505050505050505050565b5080546134cc90613ec7565b6000825580601f106134dc575050565b601f0160209004906000526020600020908101906126439190613514565b508054600082559060005260206000209081019061264391905b5b808211156135295760008155600101613515565b5090565b60006020828403121561353f57600080fd5b5035919050565b60005b83811015613561578181015183820152602001613549565b50506000910152565b60008151808452613582816020860160208601613546565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061265a602083018461356a565b60008083601f8401126135d957600080fd5b50813567ffffffffffffffff8111156135f157600080fd5b6020830191508360208260051b8501011115610f5757600080fd5b6000806020838503121561361f57600080fd5b823567ffffffffffffffff81111561363657600080fd5b613642858286016135c7565b90969095509350505050565b600081518084526020808501945080840160005b8381101561367e57815187529582019590820190600101613662565b509495945050505050565b600063ffffffff8083511684526020818185015116818601526040915081840151151582860152606084015160a060608701526136c960a087018261364e565b9050608085015186820360808801528181518084528484019150848160051b850101858401935060005b82811015613750578582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001845284518051835287015187830189905261373d8984018261356a565b95880195948801949250506001016136f3565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526137bf858351613689565b94509285019290850190600101613785565b5092979650505050505050565b803563ffffffff811681146137f257600080fd5b919050565b60006020828403121561380957600080fd5b61265a826137de565b73ffffffffffffffffffffffffffffffffffffffff81511682526000602082015160406020850152613847604085018261356a565b949350505050565b60208152600061265a6020830184613812565b60208152600061265a6020830184613689565b6000806040838503121561388857600080fd5b50508035926020909101359150565b600080604083850312156138aa57600080fd5b6138b3836137de565b946020939093013593505050565b6040815260006138d4604083018561356a565b82810360208401526138e6818561356a565b95945050505050565b63ffffffff815116825260208101516020830152604081015160408301526000606082015160806060850152613847608085018261364e565b60408152600061393b60408301856138ef565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526139b1858351613812565b94509285019290850190600101613977565b801515811461264357600080fd5b6000806000806000606086880312156139e957600080fd5b853567ffffffffffffffff80821115613a0157600080fd5b613a0d89838a016135c7565b90975095506020880135915080821115613a2657600080fd5b50613a33888289016135c7565b9094509250506040860135613a47816139c3565b809150509295509295909350565b60008060008060408587031215613a6b57600080fd5b843567ffffffffffffffff80821115613a8357600080fd5b613a8f888389016135c7565b90965094506020870135915080821115613aa857600080fd5b50613ab5878288016135c7565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110613b3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b6080810161047c8284613af0565b60008060008060008060808789031215613b8757600080fd5b613b90876137de565b9550602087013567ffffffffffffffff80821115613bad57600080fd5b613bb98a838b016135c7565b90975095506040890135915080821115613bd257600080fd5b50613bdf89828a016135c7565b9094509250506060870135613bf3816139c3565b809150509295509295509295565b60008060208385031215613c1457600080fd5b823567ffffffffffffffff80821115613c2c57600080fd5b818501915085601f830112613c4057600080fd5b813581811115613c4f57600080fd5b8660208260071b8501011115613c6457600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613cb857613ca5838551613af0565b9284019260809290920191600101613c92565b50909695505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015613d39577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018552613d278683516138ef565b95509382019390820190600101613ced565b50508584038187015286518085528782019482019350915060005b82811015613d7657845163ffffffff1684529381019392810192600101613d54565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146137f257600080fd5b600060208284031215613db957600080fd5b61265a82613d83565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e5157613e51613df1565b5060010190565b63ffffffff82811682821603908082111561078b5761078b613df1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600063ffffffff808316818103613ebd57613ebd613df1565b6001019392505050565b600181811c90821680613edb57607f821691505b602082108103613f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112613f4e57600080fd5b9190910192915050565b6040516080810167ffffffffffffffff81118282101715613f7b57613f7b613e75565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613fc857613fc8613e75565b604052919050565b600067ffffffffffffffff821115613fea57613fea613e75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006040823603121561402857600080fd5b6040516040810167ffffffffffffffff828210818311171561404c5761404c613e75565b8160405261405985613d83565b835260209150818501358181111561407057600080fd5b8501905036601f82011261408357600080fd5b803561409661409182613fd0565b613f81565b81815236848385010111156140aa57600080fd5b81848401858301376000918101840191909152918301919091525092915050565b601f82111561063957600081815260208120601f850160051c810160208610156140f25750805b601f850160051c820191505b8181101561182e578281556001016140fe565b815167ffffffffffffffff81111561412b5761412b613e75565b61413f816141398454613ec7565b846140cb565b602080601f831160018114614192576000841561415c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561182e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156141df578886015182559484019460019091019084016141c0565b508582101561421b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561423d57600080fd5b815167ffffffffffffffff81111561425457600080fd5b8201601f8101841361426557600080fd5b805161427361409182613fd0565b81815285602083850101111561428857600080fd5b6138e6826020830160208601613546565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613f4e57600080fd5b6000608082360312156142df57600080fd5b6142e7613f58565b6142f0836137de565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff8082111561432157600080fd5b9085019036601f83011261433457600080fd5b81358181111561434657614346613e75565b8060051b9150614357848301613f81565b818152918301840191848101903684111561437157600080fd5b938501935b8385101561438f57843582529385019390850190614376565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613cb8578351835292840192918401916001016143bc565b60006020808352600084546143ec81613ec7565b8084870152604060018084166000811461440d576001811461444557614473565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614473565b896000528660002060005b8581101561446b5781548b8201860152908301908801614450565b8a0184019650505b509398975050505050505050565b60006080828403121561449357600080fd5b61449b613f58565b82358152602083013560208201526040830135600281106144bb57600080fd5b60408201526144cc60608401613d83565b60608201529392505050565b8181038181111561047c5761047c613df1565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261452057600080fd5b83018035915067ffffffffffffffff82111561453b57600080fd5b602001915036819003821315610f5757600080fd5b67ffffffffffffffff83111561456857614568613e75565b61457c836145768354613ec7565b836140cb565b6000601f8411600181146145ce57600085156145985750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614664565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561461d57868501358255602094850194600190920191016145fd565b5086821015614658577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561467d57600080fd5b815161265a816139c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156146f057600080fd5b8560051b808860a0850137820182810360a090810160208501526147169082018761356a565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", } var CapabilityRegistryABI = CapabilityRegistryMetaData.ABI @@ -1087,18 +1087,28 @@ type CapabilityRegistryNodeAdded struct { Raw types.Log } -func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeAdded(opts *bind.FilterOpts) (*CapabilityRegistryNodeAddedIterator, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeAdded(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeAddedIterator, error) { - logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeAdded") + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } + + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeAdded", nodeOperatorIdRule) if err != nil { return nil, err } return &CapabilityRegistryNodeAddedIterator{contract: _CapabilityRegistry.contract, event: "NodeAdded", logs: logs, sub: sub}, nil } -func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded) (event.Subscription, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded, nodeOperatorId []uint32) (event.Subscription, error) { + + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } - logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeAdded") + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeAdded", nodeOperatorIdRule) if err != nil { return nil, err } @@ -1206,28 +1216,36 @@ type CapabilityRegistryNodeOperatorAdded struct { Raw types.Log } -func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorAdded(opts *bind.FilterOpts, admin []common.Address) (*CapabilityRegistryNodeOperatorAddedIterator, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorAdded(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilityRegistryNodeOperatorAddedIterator, error) { + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } var adminRule []interface{} for _, adminItem := range admin { adminRule = append(adminRule, adminItem) } - logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorAdded", adminRule) + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorAdded", nodeOperatorIdRule, adminRule) if err != nil { return nil, err } return &CapabilityRegistryNodeOperatorAddedIterator{contract: _CapabilityRegistry.contract, event: "NodeOperatorAdded", logs: logs, sub: sub}, nil } -func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorAdded, admin []common.Address) (event.Subscription, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorAdded, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) { + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } var adminRule []interface{} for _, adminItem := range admin { adminRule = append(adminRule, adminItem) } - logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorAdded", adminRule) + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorAdded", nodeOperatorIdRule, adminRule) if err != nil { return nil, err } @@ -1333,18 +1351,28 @@ type CapabilityRegistryNodeOperatorRemoved struct { Raw types.Log } -func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorRemoved(opts *bind.FilterOpts) (*CapabilityRegistryNodeOperatorRemovedIterator, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorRemoved(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeOperatorRemovedIterator, error) { + + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } - logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorRemoved") + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorRemoved", nodeOperatorIdRule) if err != nil { return nil, err } return &CapabilityRegistryNodeOperatorRemovedIterator{contract: _CapabilityRegistry.contract, event: "NodeOperatorRemoved", logs: logs, sub: sub}, nil } -func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorRemoved) (event.Subscription, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorRemoved, nodeOperatorId []uint32) (event.Subscription, error) { - logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorRemoved") + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } + + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorRemoved", nodeOperatorIdRule) if err != nil { return nil, err } @@ -1452,28 +1480,36 @@ type CapabilityRegistryNodeOperatorUpdated struct { Raw types.Log } -func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorUpdated(opts *bind.FilterOpts, admin []common.Address) (*CapabilityRegistryNodeOperatorUpdatedIterator, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeOperatorUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilityRegistryNodeOperatorUpdatedIterator, error) { + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } var adminRule []interface{} for _, adminItem := range admin { adminRule = append(adminRule, adminItem) } - logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorUpdated", adminRule) + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeOperatorUpdated", nodeOperatorIdRule, adminRule) if err != nil { return nil, err } return &CapabilityRegistryNodeOperatorUpdatedIterator{contract: _CapabilityRegistry.contract, event: "NodeOperatorUpdated", logs: logs, sub: sub}, nil } -func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorUpdated, admin []common.Address) (event.Subscription, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorUpdated, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) { + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } var adminRule []interface{} for _, adminItem := range admin { adminRule = append(adminRule, adminItem) } - logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorUpdated", adminRule) + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeOperatorUpdated", nodeOperatorIdRule, adminRule) if err != nil { return nil, err } @@ -1698,18 +1734,28 @@ type CapabilityRegistryNodeUpdated struct { Raw types.Log } -func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeUpdated(opts *bind.FilterOpts) (*CapabilityRegistryNodeUpdatedIterator, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterNodeUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeUpdatedIterator, error) { - logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeUpdated") + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } + + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "NodeUpdated", nodeOperatorIdRule) if err != nil { return nil, err } return &CapabilityRegistryNodeUpdatedIterator{contract: _CapabilityRegistry.contract, event: "NodeUpdated", logs: logs, sub: sub}, nil } -func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeUpdated) (event.Subscription, error) { +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeUpdated, nodeOperatorId []uint32) (event.Subscription, error) { + + var nodeOperatorIdRule []interface{} + for _, nodeOperatorIdItem := range nodeOperatorId { + nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem) + } - logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeUpdated") + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "NodeUpdated", nodeOperatorIdRule) if err != nil { return nil, err } @@ -2171,27 +2217,27 @@ type CapabilityRegistryInterface interface { ParseConfigSet(log types.Log) (*CapabilityRegistryConfigSet, error) - FilterNodeAdded(opts *bind.FilterOpts) (*CapabilityRegistryNodeAddedIterator, error) + FilterNodeAdded(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeAddedIterator, error) - WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded) (event.Subscription, error) + WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded, nodeOperatorId []uint32) (event.Subscription, error) ParseNodeAdded(log types.Log) (*CapabilityRegistryNodeAdded, error) - FilterNodeOperatorAdded(opts *bind.FilterOpts, admin []common.Address) (*CapabilityRegistryNodeOperatorAddedIterator, error) + FilterNodeOperatorAdded(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilityRegistryNodeOperatorAddedIterator, error) - WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorAdded, admin []common.Address) (event.Subscription, error) + WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorAdded, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) ParseNodeOperatorAdded(log types.Log) (*CapabilityRegistryNodeOperatorAdded, error) - FilterNodeOperatorRemoved(opts *bind.FilterOpts) (*CapabilityRegistryNodeOperatorRemovedIterator, error) + FilterNodeOperatorRemoved(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeOperatorRemovedIterator, error) - WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorRemoved) (event.Subscription, error) + WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorRemoved, nodeOperatorId []uint32) (event.Subscription, error) ParseNodeOperatorRemoved(log types.Log) (*CapabilityRegistryNodeOperatorRemoved, error) - FilterNodeOperatorUpdated(opts *bind.FilterOpts, admin []common.Address) (*CapabilityRegistryNodeOperatorUpdatedIterator, error) + FilterNodeOperatorUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilityRegistryNodeOperatorUpdatedIterator, error) - WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorUpdated, admin []common.Address) (event.Subscription, error) + WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeOperatorUpdated, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) ParseNodeOperatorUpdated(log types.Log) (*CapabilityRegistryNodeOperatorUpdated, error) @@ -2201,9 +2247,9 @@ type CapabilityRegistryInterface interface { ParseNodeRemoved(log types.Log) (*CapabilityRegistryNodeRemoved, error) - FilterNodeUpdated(opts *bind.FilterOpts) (*CapabilityRegistryNodeUpdatedIterator, error) + FilterNodeUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilityRegistryNodeUpdatedIterator, error) - WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeUpdated) (event.Subscription, error) + WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeUpdated, nodeOperatorId []uint32) (event.Subscription, error) ParseNodeUpdated(log types.Log) (*CapabilityRegistryNodeUpdated, 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 047ca43eff5..a44e8c4c480 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 ed9164cfe4619dff824b11df46b66f4c6834b2ca072923f10d9ebc57ce508ed8 -keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin 1f2fce43c4809b7df4296b4c8aa08009646b1038973dee755a91e6ff7c57dfe2 +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin 1632ed7bd9ab685dc8e5f0caf0cfb39eb3654f4834a3356713fdb772155916ee ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2