From 144c4201bd1f0b1adbbcd270c8c7d66aedc01517 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Sun, 2 Jun 2024 17:23:57 -0700 Subject: [PATCH 1/8] I03: index nodeOperatorId in events --- contracts/gas-snapshots/keystone.gas-snapshot | 42 ++++++++++--------- .../src/v0.8/keystone/CapabilityRegistry.sol | 10 ++--- ...abilityRegistry_AddNodeOperatorsTest.t.sol | 2 +- .../CapabilityRegistry_AddNodesTest.t.sol | 2 +- ...lityRegistry_RemoveNodeOperatorsTest.t.sol | 2 +- ...lityRegistry_UpdateNodeOperatorsTest.t.sol | 2 +- .../CapabilityRegistry_UpdateNodesTest.t.sol | 2 +- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 34ad3bed7a7..ca9539ab85c 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -11,18 +11,19 @@ CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 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_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 148055) 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_AddNodesTest:test_AddsNodeInfo() (gas: 362452) +CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362451) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308124) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61509) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31113) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33840) +CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30746) +CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31485) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31315) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320560) CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90723) CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90884) CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 23004) @@ -35,17 +36,17 @@ CapabilityRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 86969) 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_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37419) CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67928) CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 82281) CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 57276) 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: 37708) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 17898) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 89793) +CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 89930) CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 266586) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 719288) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 719397) CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 63376) CapabilityRegistry_RemoveNodesTest:test_RemovesNode() (gas: 63384) CapabilityRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31489) @@ -66,11 +67,12 @@ CapabilityRegistry_UpdateDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas 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_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNonOwner() (gas: 22201) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22125) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21906) +CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 39250) +CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262982) +CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164433) CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42407) CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30762) CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31432) @@ -78,7 +80,7 @@ CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAn 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_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164411) 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 c83aa58a118..e80c26e1ef4 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -237,7 +237,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 +247,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 +260,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 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..27721a8ab80 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; 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_UpdateNodeOperatorsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol index e3850968e10..b3f86940ce7 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); 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..df74ed3fab5 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; From f195d802c183c1a4f4308be426c48545a78e3a11 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Sun, 2 Jun 2024 18:28:30 -0700 Subject: [PATCH 2/8] I08: gas optimizations --- contracts/gas-snapshots/keystone.gas-snapshot | 72 +++++++++---------- .../src/v0.8/keystone/CapabilityRegistry.sol | 53 +++++--------- 2 files changed, 55 insertions(+), 70 deletions(-) diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index ca9539ab85c..37bd08b3ee3 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -4,26 +4,26 @@ CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 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_AddDON() (gas: 345722) 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_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 159618) +CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 254731) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 260791) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 179976) +CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 191342) CapabilityRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 148055) CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_CalledByNonAdmin() (gas: 28654) CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_NodeOperatorAdminAddressZero() (gas: 29526) -CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 362452) -CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362451) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308124) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61509) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31113) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33840) -CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30746) -CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31485) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31315) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320560) +CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 362265) +CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362264) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308046) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61471) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31078) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33802) +CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30711) +CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31447) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31277) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320482) CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90723) CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90884) CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 23004) @@ -38,21 +38,21 @@ CapabilityRegistry_GetHashedCapabilityTest:test_DoesNotCauseIncorrectClashes() ( CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 37814) CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37419) CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67928) -CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 82281) +CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 78180) CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 57276) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_CalledByNonAdmin() (gas: 17801) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_DONDoesNotExist() (gas: 16561) CapabilityRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 37708) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 17898) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 89930) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 266586) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 719397) -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: 88889) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 262290) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 718269) +CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 59156) +CapabilityRegistry_RemoveNodesTest:test_RemovesNode() (gas: 60982) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 28639) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 20569) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodePartOfDON() (gas: 271181) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 20581) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 32669) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExists() (gas: 33956) CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 69052) @@ -71,16 +71,16 @@ CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNon CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22125) CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21906) CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 39250) -CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262982) -CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164433) -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: 164411) +CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262742) +CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164239) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42363) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30727) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31388) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35450) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31376) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31250) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31771) +CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164217) 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 e80c26e1ef4..089f32a6057 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -403,17 +403,16 @@ 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(); - bool nodeExists = s_nodes[node.p2pId].signer != bytes32(""); - if (nodeExists || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); + if (s_nodes[node.p2pId].signer != bytes32("") || bytes32(node.p2pId) == bytes32("")) + revert InvalidNodeP2PId(node.p2pId); if (bytes32(node.signer) == bytes32("") || s_nodeSigners.contains(node.signer)) revert InvalidNodeSigner(); @@ -447,13 +446,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(); s_nodeSigners.remove(node.signer); s_nodeP2PIds.remove(node.p2pId); delete s_nodes[p2pId]; @@ -465,16 +461,14 @@ 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(); - bool nodeExists = s_nodes[node.p2pId].signer != bytes32(""); - if (!nodeExists) revert InvalidNodeP2PId(node.p2pId); + if (s_nodes[node.p2pId].signer == bytes32("")) revert InvalidNodeP2PId(node.p2pId); if ( bytes32(node.signer) == bytes32("") || @@ -510,8 +504,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].supportedCapabilityIds[s_nodes[p2pId].configCount].values() + }), + s_nodes[p2pId].configCount + ); } /// @notice Gets all nodes @@ -524,7 +526,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { for (uint256 i; i < p2pIds.length; ++i) { bytes32 p2pId = p2pIds[i]; - (NodeInfo memory node, uint32 configCount) = _getNode(p2pId); + (NodeInfo memory node, uint32 configCount) = getNode(p2pId); nodeInfo[i] = node; configCounts[i] = configCount; } @@ -630,10 +632,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { CapabilityConfiguration[] calldata capabilityConfigurations, bool isPublic ) external onlyOwner { - uint32 id = s_donId; + uint32 id = s_donId++; s_dons[id].id = id; _setDONConfig(id, 1, nodes, capabilityConfigurations, isPublic); - ++s_donId; } /// @notice Updates a DON's configuration. This allows @@ -803,22 +804,6 @@ 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 From f5aed14b30f56cdd0fa2ee8296b003d41294e769 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Tue, 4 Jun 2024 16:03:39 -0700 Subject: [PATCH 3/8] I9: nitpicks --- .../src/v0.8/keystone/CapabilityRegistry.sol | 63 +++++++++++-------- ...pabilityRegistry_AddCapabilitiesTest.t.sol | 4 +- .../CapabilityRegistry_AddNodesTest.t.sol | 2 +- .../CapabilityRegistry_RemoveNodesTest.t.sol | 2 +- ...lityRegistry_UpdateNodeOperatorsTest.t.sol | 2 +- .../CapabilityRegistry_UpdateNodesTest.t.sol | 2 +- 6 files changed, 44 insertions(+), 31 deletions(-) diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index 22f7781f2e9..5760f33882a 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -40,7 +40,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 @@ -84,8 +84,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 +158,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 +192,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 @@ -308,15 +313,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 +333,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); } } @@ -358,7 +363,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { 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 || @@ -381,9 +386,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 +396,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { ++idx; } } - if (idx != s_nodeOperatorId - 1) { + if (idx != s_nextNodeOperatorId - 1) { assembly { mstore(nodeOperators, idx) } @@ -409,7 +414,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { 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); if (s_nodes[node.p2pId].signer != bytes32("") || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); @@ -449,7 +454,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { if (bytes32(node.signer) == bytes32("")) revert InvalidNodeP2PId(p2pId); if (node.supportedDONIds.length() > 0) revert NodePartOfDON(p2pId); - if (!isOwner && msg.sender != s_nodeOperators[node.nodeOperatorId].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]; @@ -466,7 +471,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { NodeInfo memory node = nodes[i]; 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); if (s_nodes[node.p2pId].signer == bytes32("")) revert InvalidNodeP2PId(node.p2pId); @@ -539,7 +544,7 @@ 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(); + if (s_hashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityAlreadyExists(hashedCapabilityId); s_hashedCapabilityIds.add(hashedCapabilityId); _setCapability(hashedCapabilityId, capability); } @@ -556,7 +561,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { } } - /// @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) { @@ -571,7 +576,8 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { } } - /// @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]; } @@ -632,7 +638,7 @@ 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); } @@ -687,8 +693,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; /// @@ -819,6 +825,11 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @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_AddNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol index 27721a8ab80..b3898656e92 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol @@ -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_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 111b5ed5496..77d180a784a 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodeOperatorsTest.t.sol @@ -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 df74ed3fab5..edc17b960c2 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol @@ -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); } From 3fda37644b6213ca28b43732802cd0bef2a99d84 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Tue, 4 Jun 2024 16:33:44 -0700 Subject: [PATCH 4/8] I12: nits and stylings --- .../src/v0.8/keystone/CapabilityRegistry.sol | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index 5760f33882a..4a197df9910 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -58,7 +58,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; } @@ -352,6 +352,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); @@ -429,7 +430,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { uint32 capabilityConfigCount = s_nodes[node.p2pId].configCount; for (uint256 j; j < capabilityIds.length; ++j) { if (!s_hashedCapabilityIds.contains(capabilityIds[j])) revert InvalidNodeCapabilities(capabilityIds); - s_nodes[node.p2pId].supportedCapabilityIds[capabilityConfigCount].add(capabilityIds[j]); + s_nodes[node.p2pId].supportedHashedCapabilityIds[capabilityConfigCount].add(capabilityIds[j]); } s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; @@ -480,15 +481,15 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { (s_nodes[node.p2pId].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]); + for (uint256 j; j < supportedHashedCapabilityIds.length; ++j) { + if (!s_hashedCapabilityIds.contains(supportedHashedCapabilityIds[j])) + revert InvalidNodeCapabilities(supportedHashedCapabilityIds); + s_nodes[node.p2pId].supportedHashedCapabilityIds[capabilityConfigCount].add(supportedHashedCapabilityIds[j]); } s_nodes[node.p2pId].nodeOperatorId = node.nodeOperatorId; @@ -515,7 +516,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { 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() + hashedCapabilityIds: s_nodes[p2pId].supportedHashedCapabilityIds[s_nodes[p2pId].configCount].values() }), s_nodes[p2pId].configCount ); @@ -782,7 +783,7 @@ 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); } From a333e54ecbaddc92544f6dff1ef4f4d13562c80e Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Wed, 5 Jun 2024 14:58:44 -0700 Subject: [PATCH 5/8] add comments --- contracts/gas-snapshots/keystone.gas-snapshot | 120 +++++++++--------- .../src/v0.8/keystone/CapabilityRegistry.sol | 14 +- 2 files changed, 73 insertions(+), 61 deletions(-) diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 37bd08b3ee3..1334972cdde 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -1,86 +1,88 @@ -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 140145) -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 163638) +CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 140167) +CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 163660) CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 24523) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CapabilityExists() (gas: 136050) +CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_CapabilityExists() (gas: 138694) CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 90873) CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractNotDeployed() (gas: 89273) -CapabilityRegistry_AddDONTest:test_AddDON() (gas: 345722) -CapabilityRegistry_AddDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 21183) -CapabilityRegistry_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 159618) -CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 254731) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 260791) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 179976) -CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 191342) -CapabilityRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 148055) +CapabilityRegistry_AddDONTest:test_AddDON() (gas: 378684) +CapabilityRegistry_AddDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 21138) +CapabilityRegistry_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 159573) +CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 254621) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 260746) +CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 179931) +CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 191297) +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: 362265) -CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362264) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308046) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61471) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31078) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33802) -CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30711) -CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31447) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31277) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320482) -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: 362309) +CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362308) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308090) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61493) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 31100) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33824) +CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31370) +CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31469) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31299) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320526) +CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90658) +CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90819) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 22939) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 16158) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 92019) +CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 112521) 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: 37419) +CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 37880) +CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37463) CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67928) CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 78180) -CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 57276) +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: 37708) +CapabilityRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 37762) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 17898) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 88889) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 262290) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 718269) -CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 59156) -CapabilityRegistry_RemoveNodesTest:test_RemovesNode() (gas: 60982) -CapabilityRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 28639) +CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 88933) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 262278) +CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 718281) +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: 271181) +CapabilityRegistry_RemoveNodesTest:test_RevertWhen_NodePartOfDON() (gas: 271144) 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_DONDoesNotExist() (gas: 17397) -CapabilityRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 176387) +CapabilityRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 176322) 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: 22201) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22125) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21906) -CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 39250) -CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262742) -CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164239) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42363) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 30727) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31388) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35450) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31376) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31250) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31771) -CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164217) +CapabilityRegistry_UpdateDONTest:test_UpdatesDON() (gas: 308419) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNonOwner() (gas: 22853) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22167) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21936) +CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorIdAndParamLengthsMismatch() (gas: 17582) +CapabilityRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 39358) +CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262808) +CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164283) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42385) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31398) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 31410) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35472) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31398) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31272) +CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31793) +CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164261) 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 4a197df9910..b1d90f0437d 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; @@ -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, @@ -783,7 +792,9 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { for (uint256 j; j < nodes.length; ++j) { if ( - !s_nodes[nodes[j]].supportedHashedCapabilityIds[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); } @@ -826,7 +837,6 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @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 From a3a1503181924f42756945686e1b75f2c4d277f6 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Wed, 5 Jun 2024 15:16:06 -0700 Subject: [PATCH 6/8] I10: Gas optimizations --- contracts/gas-snapshots/keystone.gas-snapshot | 96 +++++++++---------- .../src/v0.8/keystone/CapabilityRegistry.sol | 68 +++++++------ 2 files changed, 81 insertions(+), 83 deletions(-) diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 1334972cdde..f10caa485b1 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -1,35 +1,35 @@ -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 140167) -CapabilityRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 163660) +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: 138694) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 90873) -CapabilityRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractNotDeployed() (gas: 89273) -CapabilityRegistry_AddDONTest:test_AddDON() (gas: 378684) +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: 159573) -CapabilityRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 254621) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 260746) -CapabilityRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 179931) -CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 191297) +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: 29539) -CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 362309) -CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 362308) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 308090) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 61493) +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: 33824) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 33827) CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 31370) -CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31469) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31299) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 320526) -CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 90658) -CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 90819) +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: 92019) -CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 112521) +CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 91854) +CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 112292) CapabilityRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 43926) CapabilityRegistry_GetDONsTest:test_CorrectlyFetchesDONs() (gas: 63784) CapabilityRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 86991) @@ -37,21 +37,21 @@ CapabilityRegistry_GetHashedCapabilityTest:test_CorrectlyGeneratesHashedCapabili CapabilityRegistry_GetHashedCapabilityTest:test_DoesNotCauseIncorrectClashes() (gas: 9510) CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 37880) CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 37463) -CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 67928) -CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 78180) +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: 37762) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 17898) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 88933) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 262278) -CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 718281) +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: 271144) +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) @@ -61,28 +61,28 @@ CapabilityRegistry_UpdateCapabilitiesTest:test_RevertWhen_ConfigurationContractN 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: 176322) -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: 308419) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_CalledByNonAdminAndNonOwner() (gas: 22853) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZeroAddress() (gas: 22167) -CapabilityRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 21936) +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: 39358) -CapabilityRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 262808) -CapabilityRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 164283) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 42385) +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: 31410) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 35472) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 31398) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 31272) -CapabilityRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 31793) -CapabilityRegistry_UpdateNodesTest:test_UpdatesNodeInfo() (gas: 164261) +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 b1d90f0437d..48c678613bb 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -369,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(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); } } @@ -426,25 +428,25 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { if (nodeOperator.admin == address(0)) revert NodeOperatorDoesNotExist(node.nodeOperatorId); if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); - if (s_nodes[node.p2pId].signer != bytes32("") || 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].supportedHashedCapabilityIds[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); @@ -483,32 +485,32 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); - if (s_nodes[node.p2pId].signer == bytes32("")) 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 supportedHashedCapabilityIds = node.hashedCapabilityIds; if (supportedHashedCapabilityIds.length == 0) revert InvalidNodeCapabilities(supportedHashedCapabilityIds); - s_nodes[node.p2pId].configCount++; - uint32 capabilityConfigCount = s_nodes[node.p2pId].configCount; + storedNode.configCount++; + uint32 capabilityConfigCount = storedNode.configCount; for (uint256 j; j < supportedHashedCapabilityIds.length; ++j) { if (!s_hashedCapabilityIds.contains(supportedHashedCapabilityIds[j])) revert InvalidNodeCapabilities(supportedHashedCapabilityIds); - s_nodes[node.p2pId].supportedHashedCapabilityIds[capabilityConfigCount].add(supportedHashedCapabilityIds[j]); + 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); @@ -540,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); } @@ -554,8 +553,7 @@ 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(hashedCapabilityId); - s_hashedCapabilityIds.add(hashedCapabilityId); + if (!s_hashedCapabilityIds.add(hashedCapabilityId)) revert CapabilityAlreadyExists(hashedCapabilityId); _setCapability(hashedCapabilityId, capability); } } @@ -577,10 +575,8 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { 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); } @@ -774,8 +770,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); } From 045a94020c5f9b2a1ac25ba31607934fbbbd1abd Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Wed, 5 Jun 2024 15:19:17 -0700 Subject: [PATCH 7/8] generate wrappers --- .../keystone_capability_registry.go | 110 +++++++++++++----- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 2 files changed, 79 insertions(+), 33 deletions(-) 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 6641d3240fb..0700af670e4 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\":[{\"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\":\"updateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b614ae680620001776000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80635d83d967116100f95780638da5cb5b11610097578063caef831d11610071578063caef831d1461043c578063ddbe4f821461044f578063e29581aa14610464578063f2fde38b1461047a57600080fd5b80638da5cb5b146103e15780639cb7c5f414610409578063c63239c51461042957600080fd5b80636ae5c591116100d35780636ae5c591146103a057806373ac22b4146103b357806379ba5097146103c657806386fa4246146103ce57600080fd5b80635d83d967146103655780635e65e3091461037857806366acaa331461038b57600080fd5b8063275459f21161016657806336b402fb1161014057806336b402fb146102c8578063398f3773146103105780633f2a13c91461032357806350c946fe1461034457600080fd5b8063275459f21461028f5780632c01a1e8146102a25780632c3bc7a0146102b557600080fd5b80632145024311610197578063214502431461023a57806322bdbcbc1461024f578063235374051461026f57600080fd5b806312570011146101be578063181f5a77146101e65780631d05394c14610225575b600080fd5b6101d16101cc3660046138ae565b61048d565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101dd9190613935565b61023861023336600461398d565b6104a0565b005b61024261065c565b6040516101dd9190613adf565b61026261025d366004613b78565b6107b0565b6040516101dd9190613bd0565b61028261027d366004613b78565b61089d565b6040516101dd9190613be3565b61023861029d36600461398d565b6108d0565b6102386102b036600461398d565b6109af565b6102386102c3366004613bf6565b610c96565b6103026102d6366004613c6b565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101dd565b61023861031e36600461398d565b610d66565b610336610331366004613c8d565b610f29565b6040516101dd929190613cb7565b6103576103523660046138ae565b611113565b6040516101dd929190613d1e565b61023861037336600461398d565b611148565b61023861038636600461398d565b611291565b610393611794565b6040516101dd9190613d46565b6102386103ae366004613dc7565b61197f565b6102386103c136600461398d565b611a22565b610238611ee3565b6102386103dc366004613e4b565b611fe0565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b61041c6104173660046138ae565b61237a565b6040516101dd9190613f56565b610238610437366004613f64565b612424565b61023861044a366004613bf6565b6124b3565b61045761258d565b6040516101dd9190613ff7565b61046c61275c565b6040516101dd929190614045565b610238610488366004614128565b6128e7565b600061049a6005836128fb565b92915050565b6104a8612916565b60005b818110156106575760008383838181106104c7576104c7614143565b90506020020160208101906104dc9190613b78565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b61051e82612999565b811015610576576105658563ffffffff16600c600061054685876129a390919063ffffffff16565b81526020019081526020016000206004016129af90919063ffffffff16565b5061056f816141a1565b9050610515565b508254640100000000900463ffffffff166000036105cd576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505080610650906141a1565b90506104ab565b505050565b600e54606090640100000000900463ffffffff16600061067d6001836141d9565b63ffffffff1667ffffffffffffffff81111561069b5761069b6141f6565b60405190808252806020026020018201604052801561071157816020015b6040805160a08101825260008082526020808301829052928201526060808201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816106b95790505b509050600060015b8363ffffffff168163ffffffff16101561078d5763ffffffff8082166000908152600d6020526040902054161561077d57610753816129bb565b83838151811061076557610765614143565b60200260200101819052508161077a906141a1565b91505b61078681614225565b9050610719565b506107996001846141d9565b63ffffffff1681146107a9578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff168352600181018054919284019161081490614248565b80601f016020809104026020016040519081016040528092919081815260200182805461084090614248565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050815250509050919050565b6040805160a081018252600080825260208201819052918101919091526060808201819052608082015261049a826129bb565b6108d8612916565b60005b63ffffffff811682111561065757600083838363ffffffff1681811061090357610903614143565b90506020020160208101906109189190613b78565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109636001830182613841565b505060405163ffffffff821681527fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a9060200160405180910390a1506109a881614225565b90506108db565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c905760008484838181106109e9576109e9614143565b602090810292909201356000818152600c90935260409092206001810154929350911515905080610a49576040517f64e2ee92000000000000000000000000000000000000000000000000000000008152600481018490526024016105c4565b6000610a5783600401612999565b1115610a92576040517f34a4a3f6000000000000000000000000000000000000000000000000000000008152600481018490526024016105c4565b815463ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610ae490614248565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1090614248565b8015610b5d5780601f10610b3257610100808354040283529160200191610b5d565b820191906000526020600020905b815481529060010190602001808311610b4057829003601f168201915b505050505081525050905085158015610b8d5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610bc4576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001830154610bd5906007906129af565b506002830154610be7906009906129af565b506000848152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610c3c828261387b565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320584604051610c7391815260200190565b60405180910390a15050505080610c89906141a1565b90506109cd565b50505050565b610c9e612916565b60005b81811015610657576000838383818110610cbd57610cbd614143565b905060800201803603810190610cd39190614313565b8051602080830151604080518084019490945283810191909152805180840382018152606090930190528151910120909150610d106003826128fb565b610d49576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b610d538183612c54565b505080610d5f906141a1565b9050610ca1565b610d6e612916565b60005b81811015610657576000838383818110610d8d57610d8d614143565b9050602002810190610d9f919061436a565b610da8906143ee565b805190915073ffffffffffffffffffffffffffffffffffffffff16610df9576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610e8590826144e9565b5050600e8054909150600090610ea09063ffffffff16614225565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e828460200151604051610f0e929190614603565b60405180910390a2505080610f22906141a1565b9050610d71565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610f7b90614248565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa790614248565b8015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b50505060008881526002602081905260409091200154929350606092610100900473ffffffffffffffffffffffffffffffffffffffff16159150611105905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015261010090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa1580156110bc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526111029190810190614622565b90505b9093509150505b9250929050565b604080516080810182526000808252602082018190529181018290526060808201529061113f83612e7c565b91509150915091565b611150612916565b60005b8181101561065757600083838381811061116f5761116f614143565b90506020020135905061118c8160036128fb90919063ffffffff16565b6111c5576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b6111d06005826128fb565b1561120a576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b611215600582612f21565b5060008181526002602081905260408083208381556001810184905590910180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690555182917fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2191a25061128a816141a1565b9050611153565b60005b818110156106575760008383838181106112b0576112b0614143565b90506020028101906112c29190614690565b6112cb906146c4565b905060006112ee60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff9081168352600182018054969091163314965093949193909284019161134b90614248565b80601f016020809104026020016040519081016040528092919081815260200182805461137790614248565b80156113c45780601f10611399576101008083540402835291602001916113c4565b820191906000526020600020905b8154815290600101906020018083116113a757829003601f168201915b5050505050815250509050811580156113f45750805173ffffffffffffffffffffffffffffffffffffffff163314155b1561142b576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040808401516000908152600c60205220600101541515806114815783604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105c491815260200190565b602084015115806114c757508360200151600c60008660400151815260200190815260200160002060010154141580156114c7575060208401516114c7906007906128fb565b156114fe576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060840151805160000361154057806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c49190614797565b6040858101516000908152600c602052208054640100000000900463ffffffff1690600461156d83614225565b82546101009290920a63ffffffff8181021990931691831602179091556040878101516000908152600c60205290812054640100000000900490911691505b8251811015611678576115e28382815181106115ca576115ca614143565b602002602001015160036128fb90919063ffffffff16565b61161a57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c49190614797565b61166783828151811061162f5761162f614143565b6020908102919091018101516040808b01516000908152600c845281812063ffffffff808916835260039091019094522091612f2116565b50611671816141a1565b90506115ac565b508551604080880180516000908152600c602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9096169590951790945581518082528382206002015581518152828120600190810154948b015192518252929020909101541461172d576116fc6007826129af565b50602080880180516040808b01516000908152600c909452909220600101919091555161172b90600790612f21565b505b60408781015188516020808b0151845193845263ffffffff909216908301528183015290517f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b9181900360600190a1505050505050508061178d906141a1565b9050611294565b600e5460609063ffffffff1660006117ad6001836141d9565b63ffffffff1667ffffffffffffffff8111156117cb576117cb6141f6565b60405190808252806020026020018201604052801561181157816020015b6040805180820190915260008152606060208201528152602001906001900390816117e95790505b509050600060015b8363ffffffff168163ffffffff1610156119695763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff16156119595763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916118ad90614248565b80601f01602080910402602001604051908101604052809291908181526020018280546118d990614248565b80156119265780601f106118fb57610100808354040283529160200191611926565b820191906000526020600020905b81548152906001019060200180831161190957829003601f168201915b50505050508152505083838151811061194157611941614143565b602002602001018190525081611956906141a1565b91505b61196281614225565b9050611819565b50600e546107999060019063ffffffff166141d9565b611987612916565b600e54640100000000900463ffffffff166000818152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016821790556119de8160018888888888612f2d565b600e80546004906119fc90640100000000900463ffffffff16614225565b91906101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b60005b81811015610657576000838383818110611a4157611a41614143565b9050602002810190611a539190614690565b611a5c906146c4565b90506000611a7f60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff90811683526001820180549690911633149650939491939092840191611adc90614248565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0890614248565b8015611b555780601f10611b2a57610100808354040283529160200191611b55565b820191906000526020600020905b815481529060010190602001808311611b3857829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611bbb5782516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024016105c4565b81158015611be05750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611c17576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040808401516000908152600c602052206001015415158080611c3c57506040840151155b15611c7b5783604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105c491815260200190565b60208401511580611c9857506020840151611c98906007906128fb565b15611ccf576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608401518051600003611d1157806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c49190614797565b6040858101516000908152600c602052208054600490611d3e90640100000000900463ffffffff16614225565b82546101009290920a63ffffffff8181021990931691831602179091556040868101516000908152600c602052908120546401000000009004909116905b8251811015611df857611d9a8382815181106115ca576115ca614143565b611dd257826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c49190614797565b611de783828151811061162f5761162f614143565b50611df1816141a1565b9050611d7c565b508551604080880180516000908152600c602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9687161790558251808352848320600201558a018051925182529290206001015551611e6a9160079190612f2116565b506040860151611e7c90600990612f21565b5060408681015187516020808a0151845193845263ffffffff909216908301528183015290517f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f059181900360600190a150505050505080611edc906141a1565b9050611a25565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105c4565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114612023576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105c4565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561237257600086868381811061205b5761205b614143565b90506020020160208101906120709190613b78565b63ffffffff81166000908152600b602052604090205490915073ffffffffffffffffffffffffffffffffffffffff166120dd576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526024016105c4565b60008585848181106120f1576120f1614143565b9050602002810190612103919061436a565b61210c906143ee565b805190915073ffffffffffffffffffffffffffffffffffffffff1661215d576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061219a57503373ffffffffffffffffffffffffffffffffffffffff851614155b156121d1576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805163ffffffff83166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff9081169116141580612291575060208082015160405161221e9201613935565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012063ffffffff86166000908152600b83529290922091926122789260010191016147cf565b6040516020818303038152906040528051906020012014155b1561235f57805163ffffffff83166000908152600b6020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217825582015160019091019061230590826144e9565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a28838360200151604051612356929190614603565b60405180910390a25b50508061236b906141a1565b905061203f565b505050505050565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff16908111156123e3576123e3613eb7565b60018111156123f4576123f4613eb7565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61242c612916565b63ffffffff8087166000908152600d6020526040812054640100000000900490911690819003612490576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526024016105c4565b6124aa8761249d83614225565b9250828888888888612f2d565b50505050505050565b6124bb612916565b60005b818110156106575760008383838181106124da576124da614143565b9050608002018036038101906124f09190614313565b805160208083015160408051808401949094528381019190915280518084038201815260609093019052815191012090915061252d6003826128fb565b15612564576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61256f600382612f21565b5061257a8183612c54565b505080612586906141a1565b90506124be565b6060600061259b6003613498565b905060006125a96005612999565b82516125b59190614878565b67ffffffffffffffff8111156125cd576125cd6141f6565b60405190808252806020026020018201604052801561263d57816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816125eb5790505b5090506000805b835181101561275357600084828151811061266157612661614143565b6020026020010151905061267f8160056128fb90919063ffffffff16565b612742576002600082815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1660018111156126d9576126d9613eb7565b60018111156126ea576126ea613eb7565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff16602090910152845185908590811061272857612728614143565b6020026020010181905250828061273e906141a1565b9350505b5061274c816141a1565b9050612644565b50909392505050565b606080600061276b6009613498565b90506000815167ffffffffffffffff811115612789576127896141f6565b6040519080825280602002602001820160405280156127f857816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816127a75790505b5090506000825167ffffffffffffffff811115612817576128176141f6565b604051908082528060200260200182016040528015612840578160200160208202803683370190505b50905060005b83518110156128dc57600084828151811061286357612863614143565b6020026020010151905060008061287983612e7c565b915091508186858151811061289057612890614143565b6020026020010181905250808585815181106128ae576128ae614143565b602002602001019063ffffffff16908163ffffffff1681525050505050806128d5906141a1565b9050612846565b509094909350915050565b6128ef612916565b6128f8816134a5565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105c4565b565b600061049a825490565b600061290f838361359a565b600061290f83836135c4565b6040805160a081018252600080825260208083018290528284018290526060808401819052608084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612a5e57602002820191906000526020600020905b815481526020019060010190808311612a4a575b505050505090506000815167ffffffffffffffff811115612a8157612a816141f6565b604051908082528060200260200182016040528015612ac757816020015b604080518082019091526000815260606020820152815260200190600190039081612a9f5790505b50905060005b8151811015612be8576040518060400160405280848381518110612af357612af3614143565b60200260200101518152602001856003016000868581518110612b1857612b18614143565b602002602001015181526020019081526020016000208054612b3990614248565b80601f0160208091040260200160405190810160405280929190818152602001828054612b6590614248565b8015612bb25780601f10612b8757610100808354040283529160200191612bb2565b820191906000526020600020905b815481529060010190602001808311612b9557829003601f168201915b5050505050815250828281518110612bcc57612bcc614143565b602002602001018190525080612be1906141a1565b9050612acd565b506040805160a08101825263ffffffff8881166000818152600d6020818152868320548086168752948b168187015292909152905268010000000000000000900460ff1615159181019190915260608101612c4285613498565b81526020019190915295945050505050565b606081015173ffffffffffffffffffffffffffffffffffffffff1615612da257606081015173ffffffffffffffffffffffffffffffffffffffff163b1580612d4d575060608101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4b919061488b565b155b15612da25760608101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016105c4565b8060026000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690836001811115612df457612df4613eb7565b0217905550606091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff808216865260018301548487015260028301548688015264010000000090910416835260030190529182206060820190612ef890613498565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b600061290f83836136b7565b63ffffffff8088166000908152600d60209081526040808320938a168084526001948501909252909120911015612fec5763ffffffff88166000908152600d602052604081206001908101908290612f85908b6141d9565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612fad82612999565b811015612fe957612fd88a63ffffffff16600c600061054685876000016129a390919063ffffffff16565b50612fe2816141a1565b9050612fa4565b50505b60005b858110156130fa5761301c87878381811061300c5761300c614143565b85926020909102013590506128fb565b1561307d578887878381811061303457613034614143565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff909416600485015260200291909101356024830152506044016105c4565b6130a287878381811061309257613092614143565b8592602090910201359050612f21565b506130e98963ffffffff16600c60008a8a868181106130c3576130c3614143565b905060200201358152602001908152602001600020600401612f2190919063ffffffff16565b506130f3816141a1565b9050612fef565b5060005b838110156133d9573685858381811061311957613119614143565b905060200281019061312b919061436a565b9050613139600382356128fb565b613172576040517fe181733f000000000000000000000000000000000000000000000000000000008152813560048201526024016105c4565b61317e600582356128fb565b156131b8576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152813560048201526024016105c4565b80356000908152600384016020526040812080546131d590614248565b9050111561321e576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8b166004820152813560248201526044016105c4565b60005b87811015613330576132c58235600c60008c8c8681811061324457613244614143565b9050602002013581526020019081526020016000206003016000600c60008e8e8881811061327457613274614143565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020019081526020016000206128fb90919063ffffffff16565b613320578888828181106132db576132db614143565b6040517fa7e7925000000000000000000000000000000000000000000000000000000000815260209091029290920135600483015250823560248201526044016105c4565b613329816141a1565b9050613221565b5060028301805460018101825560009182526020918290208335910155613359908201826148a8565b8235600090815260038601602052604090209161337791908361490d565b506133c88a8a83358b8b61338e60208801886148a8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061370692505050565b506133d2816141a1565b90506130fe565b5063ffffffff8881166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff1668010000000000000000881515027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1617640100000000958d1695860217905581519283528201929092527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050505050565b6060600061290f836137e5565b3373ffffffffffffffffffffffffffffffffffffffff821603613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105c4565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008260000182815481106135b1576135b1614143565b9060005260206000200154905092915050565b600081815260018301602052604081205480156136ad5760006135e8600183614878565b85549091506000906135fc90600190614878565b905081811461366157600086600001828154811061361c5761361c614143565b906000526020600020015490508087600001848154811061363f5761363f614143565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061367257613672614a28565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061049a565b600091505061049a565b60008181526001830160205260408120546136fe5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561049a565b50600061049a565b60008481526002602081905260409091200154610100900473ffffffffffffffffffffffffffffffffffffffff161561237257600084815260026020819052604091829020015490517ffba64a7c00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c906137ab908690869086908b908d90600401614a57565b600060405180830381600087803b1580156137c557600080fd5b505af11580156137d9573d6000803e3d6000fd5b50505050505050505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561383557602002820191906000526020600020905b815481526020019060010190808311613821575b50505050509050919050565b50805461384d90614248565b6000825580601f1061385d575050565b601f0160209004906000526020600020908101906128f89190613895565b50805460008255906000526020600020908101906128f891905b5b808211156138aa5760008155600101613896565b5090565b6000602082840312156138c057600080fd5b5035919050565b60005b838110156138e25781810151838201526020016138ca565b50506000910152565b600081518084526139038160208601602086016138c7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061290f60208301846138eb565b60008083601f84011261395a57600080fd5b50813567ffffffffffffffff81111561397257600080fd5b6020830191508360208260051b850101111561110c57600080fd5b600080602083850312156139a057600080fd5b823567ffffffffffffffff8111156139b757600080fd5b6139c385828601613948565b90969095509350505050565b600081518084526020808501945080840160005b838110156139ff578151875295820195908201906001016139e3565b509495945050505050565b600063ffffffff8083511684526020818185015116818601526040915081840151151582860152606084015160a06060870152613a4a60a08701826139cf565b9050608085015186820360808801528181518084528484019150848160051b850101858401935060005b82811015613ad1578582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018452845180518352870151878301899052613abe898401826138eb565b9588019594880194925050600101613a74565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613b52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613b40858351613a0a565b94509285019290850190600101613b06565b5092979650505050505050565b803563ffffffff81168114613b7357600080fd5b919050565b600060208284031215613b8a57600080fd5b61290f82613b5f565b73ffffffffffffffffffffffffffffffffffffffff81511682526000602082015160406020850152613bc860408501826138eb565b949350505050565b60208152600061290f6020830184613b93565b60208152600061290f6020830184613a0a565b60008060208385031215613c0957600080fd5b823567ffffffffffffffff80821115613c2157600080fd5b818501915085601f830112613c3557600080fd5b813581811115613c4457600080fd5b8660208260071b8501011115613c5957600080fd5b60209290920196919550909350505050565b60008060408385031215613c7e57600080fd5b50508035926020909101359150565b60008060408385031215613ca057600080fd5b613ca983613b5f565b946020939093013593505050565b604081526000613cca60408301856138eb565b8281036020840152613cdc81856138eb565b95945050505050565b63ffffffff815116825260208101516020830152604081015160408301526000606082015160806060850152613bc860808501826139cf565b604081526000613d316040830185613ce5565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613b52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613da7858351613b93565b94509285019290850190600101613d6d565b80151581146128f857600080fd5b600080600080600060608688031215613ddf57600080fd5b853567ffffffffffffffff80821115613df757600080fd5b613e0389838a01613948565b90975095506020880135915080821115613e1c57600080fd5b50613e2988828901613948565b9094509250506040860135613e3d81613db9565b809150509295509295909350565b60008060008060408587031215613e6157600080fd5b843567ffffffffffffffff80821115613e7957600080fd5b613e8588838901613948565b90965094506020870135915080821115613e9e57600080fd5b50613eab87828801613948565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110613f30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b6080810161049a8284613ee6565b60008060008060008060808789031215613f7d57600080fd5b613f8687613b5f565b9550602087013567ffffffffffffffff80821115613fa357600080fd5b613faf8a838b01613948565b90975095506040890135915080821115613fc857600080fd5b50613fd589828a01613948565b9094509250506060870135613fe981613db9565b809150509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561403957614026838551613ee6565b9284019260809290920191600101614013565b50909695505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156140ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08887030185526140a8868351613ce5565b9550938201939082019060010161406e565b50508584038187015286518085528782019482019350915060005b828110156140f757845163ffffffff16845293810193928101926001016140d5565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613b7357600080fd5b60006020828403121561413a57600080fd5b61290f82614104565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141d2576141d2614172565b5060010190565b63ffffffff8281168282160390808211156107a9576107a9614172565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600063ffffffff80831681810361423e5761423e614172565b6001019392505050565b600181811c9082168061425c57607f821691505b602082108103614295577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6040516080810167ffffffffffffffff811182821017156142be576142be6141f6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561430b5761430b6141f6565b604052919050565b60006080828403121561432557600080fd5b61432d61429b565b823581526020830135602082015260408301356002811061434d57600080fd5b604082015261435e60608401614104565b60608201529392505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261439e57600080fd5b9190910192915050565b600067ffffffffffffffff8211156143c2576143c26141f6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006040823603121561440057600080fd5b6040516040810167ffffffffffffffff8282108183111715614424576144246141f6565b8160405261443185614104565b835260209150818501358181111561444857600080fd5b8501905036601f82011261445b57600080fd5b803561446e614469826143a8565b6142c4565b818152368483850101111561448257600080fd5b81848401858301376000918101840191909152918301919091525092915050565b601f82111561065757600081815260208120601f850160051c810160208610156144ca5750805b601f850160051c820191505b81811015612372578281556001016144d6565b815167ffffffffffffffff811115614503576145036141f6565b614517816145118454614248565b846144a3565b602080601f83116001811461456a57600084156145345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612372565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156145b757888601518255948401946001909101908401614598565b50858210156145f357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b63ffffffff83168152604060208201526000613bc860408301846138eb565b60006020828403121561463457600080fd5b815167ffffffffffffffff81111561464b57600080fd5b8201601f8101841361465c57600080fd5b805161466a614469826143a8565b81815285602083850101111561467f57600080fd5b613cdc8260208301602086016138c7565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261439e57600080fd5b6000608082360312156146d657600080fd5b6146de61429b565b6146e783613b5f565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff8082111561471857600080fd5b9085019036601f83011261472b57600080fd5b81358181111561473d5761473d6141f6565b8060051b915061474e8483016142c4565b818152918301840191848101903684111561476857600080fd5b938501935b838510156147865784358252938501939085019061476d565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614039578351835292840192918401916001016147b3565b60006020808352600084546147e381614248565b80848701526040600180841660008114614804576001811461483c5761486a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a0101955061486a565b896000528660002060005b858110156148625781548b8201860152908301908801614847565b8a0184019650505b509398975050505050505050565b8181038181111561049a5761049a614172565b60006020828403121561489d57600080fd5b815161290f81613db9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126148dd57600080fd5b83018035915067ffffffffffffffff8211156148f857600080fd5b60200191503681900382131561110c57600080fd5b67ffffffffffffffff831115614925576149256141f6565b614939836149338354614248565b836144a3565b6000601f84116001811461498b57600085156149555750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614a21565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156149da57868501358255602094850194600190920191016149ba565b5086821015614a15577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115614a9057600080fd5b8560051b808860a0850137820182810360a09081016020850152614ab6908201876138eb565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", + 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\":[{\"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\":\"updateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61483480620001776000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80635d83d967116100f95780638da5cb5b11610097578063caef831d11610071578063caef831d1461043c578063ddbe4f821461044f578063e29581aa14610464578063f2fde38b1461047a57600080fd5b80638da5cb5b146103e15780639cb7c5f414610409578063c63239c51461042957600080fd5b80636ae5c591116100d35780636ae5c591146103a057806373ac22b4146103b357806379ba5097146103c657806386fa4246146103ce57600080fd5b80635d83d967146103655780635e65e3091461037857806366acaa331461038b57600080fd5b8063275459f21161016657806336b402fb1161014057806336b402fb146102c8578063398f3773146103105780633f2a13c91461032357806350c946fe1461034457600080fd5b8063275459f21461028f5780632c01a1e8146102a25780632c3bc7a0146102b557600080fd5b80632145024311610197578063214502431461023a57806322bdbcbc1461024f578063235374051461026f57600080fd5b806312570011146101be578063181f5a77146101e65780631d05394c14610225575b600080fd5b6101d16101cc36600461361b565b61048d565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101dd91906136a2565b6102386102333660046136fa565b6104a0565b005b61024261065c565b6040516101dd919061384c565b61026261025d3660046138e5565b6107b0565b6040516101dd919061393d565b61028261027d3660046138e5565b61089d565b6040516101dd9190613950565b61023861029d3660046136fa565b6108d0565b6102386102b03660046136fa565b6109a7565b6102386102c3366004613963565b610bca565b6103026102d63660046139d8565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101dd565b61023861031e3660046136fa565b610c9a565b6103366103313660046139fa565b610e62565b6040516101dd929190613a24565b61035761035236600461361b565b61104c565b6040516101dd929190613a8b565b6102386103733660046136fa565b6110f1565b6102386103863660046136fa565b61122d565b61039361169f565b6040516101dd9190613ab3565b6102386103ae366004613b34565b61188a565b6102386103c13660046136fa565b611924565b610238611d95565b6102386103dc366004613bb8565b611e92565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b61041c61041736600461361b565b6121d0565b6040516101dd9190613cc3565b610238610437366004613cd1565b61227a565b61023861044a366004613963565b612309565b6104576123d9565b6040516101dd9190613d64565b61046c6125a8565b6040516101dd929190613db2565b610238610488366004613e95565b612720565b600061049a600583612734565b92915050565b6104a861274f565b60005b818110156106575760008383838181106104c7576104c7613eb0565b90506020020160208101906104dc91906138e5565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b61051e826127d2565b811015610576576105658563ffffffff16600c600061054685876127dc90919063ffffffff16565b81526020019081526020016000206004016127e890919063ffffffff16565b5061056f81613f0e565b9050610515565b508254640100000000900463ffffffff166000036105cd576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a1505050508061065090613f0e565b90506104ab565b505050565b600e54606090640100000000900463ffffffff16600061067d600183613f46565b63ffffffff1667ffffffffffffffff81111561069b5761069b613f63565b60405190808252806020026020018201604052801561071157816020015b6040805160a08101825260008082526020808301829052928201526060808201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816106b95790505b509050600060015b8363ffffffff168163ffffffff16101561078d5763ffffffff8082166000908152600d6020526040902054161561077d57610753816127f4565b83838151811061076557610765613eb0565b60200260200101819052508161077a90613f0e565b91505b61078681613f92565b9050610719565b50610799600184613f46565b63ffffffff1681146107a9578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff168352600181018054919284019161081490613fb5565b80601f016020809104026020016040519081016040528092919081815260200182805461084090613fb5565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050815250509050919050565b6040805160a081018252600080825260208201819052918101919091526060808201819052608082015261049a826127f4565b6108d861274f565b60005b63ffffffff811682111561065757600083838363ffffffff1681811061090357610903613eb0565b905060200201602081019061091891906138e5565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815591925061096360018301826135ae565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a2506109a081613f92565b90506108db565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610bc45760008484838181106109e1576109e1613eb0565b602090810292909201356000818152600c90935260409092206001810154929350919050610a3e576040517f64e2ee92000000000000000000000000000000000000000000000000000000008152600481018390526024016105c4565b6000610a4c826004016127d2565b1115610a87576040517f34a4a3f6000000000000000000000000000000000000000000000000000000008152600481018390526024016105c4565b83158015610ac15750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610afa576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105c4565b6001810154610b0b906007906127e8565b506002810154610b1d906009906127e8565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610b7282826135e8565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610ba991815260200190565b60405180910390a1505080610bbd90613f0e565b90506109c5565b50505050565b610bd261274f565b60005b81811015610657576000838383818110610bf157610bf1613eb0565b905060800201803603810190610c079190614080565b8051602080830151604080518084019490945283810191909152805180840382018152606090930190528151910120909150610c44600382612734565b610c7d576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b610c878183612a8d565b505080610c9390613f0e565b9050610bd5565b610ca261274f565b60005b81811015610657576000838383818110610cc157610cc1613eb0565b9050602002810190610cd391906140d7565b610cdc9061415b565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d2d576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610db99082614256565b5050600e8054909150600090610dd49063ffffffff16613f92565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e4791906136a2565b60405180910390a3505080610e5b90613f0e565b9050610ca5565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610eb490613fb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee090613fb5565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b50505060008881526002602081905260409091200154929350606092610100900473ffffffffffffffffffffffffffffffffffffffff1615915061103e905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015261010090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610ff5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261103b9190810190614370565b90505b9093509150505b9250929050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff8082168652600183015484870152600283015486880152640100000000909104168352600301905291822060608201906110c890612cb5565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b6110f961274f565b60005b8181101561065757600083838381811061111857611118613eb0565b90506020020135905061113581600361273490919063ffffffff16565b61116e576040517fe181733f000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b611179600582612cc2565b6111b2576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b60008181526002602081905260408083208381556001810184905590910180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690555182917fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2191a25061122681613f0e565b90506110fc565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610bc457600084848381811061126757611267613eb0565b905060200281019061127991906143de565b61128290614412565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916112d890613fb5565b80601f016020809104026020016040519081016040528092919081815260200182805461130490613fb5565b80156113515780601f1061132657610100808354040283529160200191611351565b820191906000526020600020905b81548152906001019060200180831161133457829003601f168201915b5050505050815250509050831580156113815750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113ba576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105c4565b6040808301516000908152600c60205220600181015461140e5782604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105c491815260200190565b6020830151158061143e5750826020015181600101541415801561143e5750602083015161143e90600790612734565b15611475576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015180516000036114b757806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c491906144e5565b8154640100000000900463ffffffff168260046114d383613f92565b82546101009290920a63ffffffff8181021990931691831602179091558354640100000000900416905060005b82518110156115cb5761153683828151811061151e5761151e613eb0565b6020026020010151600361273490919063ffffffff16565b61156e57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c491906144e5565b6115ba83828151811061158357611583613eb0565b60200260200101518560030160008563ffffffff1663ffffffff168152602001908152602001600020612cc290919063ffffffff16565b506115c481613f0e565b9050611500565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9091161783556040850151600284015560018301546020860151811461163d576116226007826127e8565b5060208601516001850181905561163b90600790612cc2565b505b85516040808801516020808a015183519283529082015263ffffffff909216917f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a25050505050508061169890613f0e565b905061124b565b600e5460609063ffffffff1660006116b8600183613f46565b63ffffffff1667ffffffffffffffff8111156116d6576116d6613f63565b60405190808252806020026020018201604052801561171c57816020015b6040805180820190915260008152606060208201528152602001906001900390816116f45790505b509050600060015b8363ffffffff168163ffffffff1610156118745763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff16156118645763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916117b890613fb5565b80601f01602080910402602001604051908101604052809291908181526020018280546117e490613fb5565b80156118315780601f1061180657610100808354040283529160200191611831565b820191906000526020600020905b81548152906001019060200180831161181457829003601f168201915b50505050508152505083838151811061184c5761184c613eb0565b60200260200101819052508161186190613f0e565b91505b61186d81613f92565b9050611724565b50600e546107999060019063ffffffff16613f46565b61189261274f565b600e805460009164010000000090910463ffffffff169060046118b483613f92565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000169091179055905061191c8160018888888888612cce565b505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610bc457600084848381811061195e5761195e613eb0565b905060200281019061197091906143de565b61197990614412565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916119cf90613fb5565b80601f01602080910402602001604051908101604052809291908181526020018280546119fb90613fb5565b8015611a485780601f10611a1d57610100808354040283529160200191611a48565b820191906000526020600020905b815481529060010190602001808311611a2b57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611aae5781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024016105c4565b83158015611ad35750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611b0c576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105c4565b6040808301516000908152600c602052206001810154151580611b3157506040830151155b15611b705782604001516040517f64e2ee920000000000000000000000000000000000000000000000000000000081526004016105c491815260200190565b60208301511580611b8d57506020830151611b8d90600790612734565b15611bc4576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611c0657806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c491906144e5565b81548290600490611c2490640100000000900463ffffffff16613f92565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611ccb57611c6d83828151811061151e5761151e613eb0565b611ca557826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016105c491906144e5565b611cba83828151811061158357611583613eb0565b50611cc481613f0e565b9050611c4f565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff91821617845560408601516002850155602086015160018501819055611d219160079190612cc216565b506040850151611d3390600990612cc2565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080611d8e90613f0e565b9050611942565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016105c4565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611ed5576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105c4565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561191c576000868683818110611f0d57611f0d613eb0565b9050602002016020810190611f2291906138e5565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff16611f91576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526024016105c4565b6000868685818110611fa557611fa5613eb0565b9050602002810190611fb791906140d7565b611fc09061415b565b805190915073ffffffffffffffffffffffffffffffffffffffff16612011576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061204e57503373ffffffffffffffffffffffffffffffffffffffff861614155b15612087576040517f9473075d0000000000000000000000000000000000000000000000000000000081523360048201526024016105c4565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061210357506020808201516040516120c092016136a2565b60405160208183030381529060405280519060200120826001016040516020016120ea919061451d565b6040516020818303038152906040528051906020012014155b156121bc57805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020810151600183019061215d9082614256565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516121b391906136a2565b60405180910390a35b505050806121c990613f0e565b9050611ef1565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff169081111561223957612239613c24565b600181111561224a5761224a613c24565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61228261274f565b63ffffffff8087166000908152600d60205260408120546401000000009004909116908190036122e6576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526024016105c4565b612300876122f383613f92565b9250828888888888612cce565b50505050505050565b61231161274f565b60005b8181101561065757600083838381811061233057612330613eb0565b9050608002018036038101906123469190614080565b8051602080830151604080518084019490945283810191909152805180840382018152606090930190528151910120909150612383600382612cc2565b6123bc576040517febf52551000000000000000000000000000000000000000000000000000000008152600481018290526024016105c4565b6123c68183612a8d565b5050806123d290613f0e565b9050612314565b606060006123e76003612cb5565b905060006123f560056127d2565b825161240191906145c6565b67ffffffffffffffff81111561241957612419613f63565b60405190808252806020026020018201604052801561248957816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816124375790505b5090506000805b835181101561259f5760008482815181106124ad576124ad613eb0565b602002602001015190506124cb81600561273490919063ffffffff16565b61258e576002600082815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16600181111561252557612525613c24565b600181111561253657612536613c24565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff16602090910152845185908590811061257457612574613eb0565b6020026020010181905250828061258a90613f0e565b9350505b5061259881613f0e565b9050612490565b50909392505050565b60608060006125b76009612cb5565b90506000815167ffffffffffffffff8111156125d5576125d5613f63565b60405190808252806020026020018201604052801561264457816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816125f35790505b5090506000825167ffffffffffffffff81111561266357612663613f63565b60405190808252806020026020018201604052801561268c578160200160208202803683370190505b50905060005b8351811015612715576126bd8482815181106126b0576126b0613eb0565b602002602001015161104c565b8483815181106126cf576126cf613eb0565b602002602001018484815181106126e8576126e8613eb0565b602002602001018263ffffffff1663ffffffff1681525082905250508061270e90613f0e565b9050612692565b509094909350915050565b61272861274f565b61273181613212565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105c4565b565b600061049a825490565b60006127488383613307565b60006127488383613331565b6040805160a081018252600080825260208083018290528284018290526060808401819052608084015263ffffffff8581168352600d825284832080546401000000009004909116808452600190910182528483206002810180548751818602810186019098528088529596929591949390919083018282801561289757602002820191906000526020600020905b815481526020019060010190808311612883575b505050505090506000815167ffffffffffffffff8111156128ba576128ba613f63565b60405190808252806020026020018201604052801561290057816020015b6040805180820190915260008152606060208201528152602001906001900390816128d85790505b50905060005b8151811015612a2157604051806040016040528084838151811061292c5761292c613eb0565b6020026020010151815260200185600301600086858151811061295157612951613eb0565b60200260200101518152602001908152602001600020805461297290613fb5565b80601f016020809104026020016040519081016040528092919081815260200182805461299e90613fb5565b80156129eb5780601f106129c0576101008083540402835291602001916129eb565b820191906000526020600020905b8154815290600101906020018083116129ce57829003601f168201915b5050505050815250828281518110612a0557612a05613eb0565b602002602001018190525080612a1a90613f0e565b9050612906565b506040805160a08101825263ffffffff8881166000818152600d6020818152868320548086168752948b168187015292909152905268010000000000000000900460ff1615159181019190915260608101612a7b85612cb5565b81526020019190915295945050505050565b606081015173ffffffffffffffffffffffffffffffffffffffff1615612bdb57606081015173ffffffffffffffffffffffffffffffffffffffff163b1580612b86575060608101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8491906145d9565b155b15612bdb5760608101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016105c4565b8060026000848152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690836001811115612c2d57612c2d613c24565b0217905550606091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b6060600061274883613424565b60006127488383613480565b63ffffffff8088166000908152600d60209081526040808320938a168084526001948501909252909120911015612d8d5763ffffffff88166000908152600d602052604081206001908101908290612d26908b613f46565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612d4e826127d2565b811015612d8a57612d798a63ffffffff16600c600061054685876000016127dc90919063ffffffff16565b50612d8381613f0e565b9050612d45565b50505b60005b85811015612e7457612dbd878783818110612dad57612dad613eb0565b8592602090910201359050612cc2565b612e1d5788878783818110612dd457612dd4613eb0565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff909416600485015260200291909101356024830152506044016105c4565b612e638963ffffffff16600c60008a8a86818110612e3d57612e3d613eb0565b905060200201358152602001908152602001600020600401612cc290919063ffffffff16565b50612e6d81613f0e565b9050612d90565b5060005b838110156131535736858583818110612e9357612e93613eb0565b9050602002810190612ea591906140d7565b9050612eb360038235612734565b612eec576040517fe181733f000000000000000000000000000000000000000000000000000000008152813560048201526024016105c4565b612ef860058235612734565b15612f32576040517ff7d7a294000000000000000000000000000000000000000000000000000000008152813560048201526024016105c4565b8035600090815260038401602052604081208054612f4f90613fb5565b90501115612f98576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8b166004820152813560248201526044016105c4565b60005b878110156130aa5761303f8235600c60008c8c86818110612fbe57612fbe613eb0565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110612fee57612fee613eb0565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002061273490919063ffffffff16565b61309a5788888281811061305557613055613eb0565b6040517fa7e7925000000000000000000000000000000000000000000000000000000000815260209091029290920135600483015250823560248201526044016105c4565b6130a381613f0e565b9050612f9b565b50600283018054600181018255600091825260209182902083359101556130d3908201826145f6565b823560009081526003860160205260409020916130f191908361465b565b506131428a8a83358b8b61310860208801886145f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506134cf92505050565b5061314c81613f0e565b9050612e78565b5063ffffffff8881166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff1668010000000000000000881515027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1617640100000000958d1695860217905581519283528201929092527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a15050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105c4565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061331e5761331e613eb0565b9060005260206000200154905092915050565b6000818152600183016020526040812054801561341a5760006133556001836145c6565b8554909150600090613369906001906145c6565b90508181146133ce57600086600001828154811061338957613389613eb0565b90600052602060002001549050808760000184815481106133ac576133ac613eb0565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806133df576133df614776565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061049a565b600091505061049a565b60608160000180548060200260200160405190810160405280929190818152602001828054801561347457602002820191906000526020600020905b815481526020019060010190808311613460575b50505050509050919050565b60008181526001830160205260408120546134c75750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561049a565b50600061049a565b60008481526002602081905260409091200154610100900473ffffffffffffffffffffffffffffffffffffffff161561191c57600084815260026020819052604091829020015490517ffba64a7c00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613574908690869086908b908d906004016147a5565b600060405180830381600087803b15801561358e57600080fd5b505af11580156135a2573d6000803e3d6000fd5b50505050505050505050565b5080546135ba90613fb5565b6000825580601f106135ca575050565b601f0160209004906000526020600020908101906127319190613602565b508054600082559060005260206000209081019061273191905b5b808211156136175760008155600101613603565b5090565b60006020828403121561362d57600080fd5b5035919050565b60005b8381101561364f578181015183820152602001613637565b50506000910152565b60008151808452613670816020860160208601613634565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006127486020830184613658565b60008083601f8401126136c757600080fd5b50813567ffffffffffffffff8111156136df57600080fd5b6020830191508360208260051b850101111561104557600080fd5b6000806020838503121561370d57600080fd5b823567ffffffffffffffff81111561372457600080fd5b613730858286016136b5565b90969095509350505050565b600081518084526020808501945080840160005b8381101561376c57815187529582019590820190600101613750565b509495945050505050565b600063ffffffff8083511684526020818185015116818601526040915081840151151582860152606084015160a060608701526137b760a087018261373c565b9050608085015186820360808801528181518084528484019150848160051b850101858401935060005b8281101561383e578582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001845284518051835287015187830189905261382b89840182613658565b95880195948801949250506001016137e1565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156138bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526138ad858351613777565b94509285019290850190600101613873565b5092979650505050505050565b803563ffffffff811681146138e057600080fd5b919050565b6000602082840312156138f757600080fd5b612748826138cc565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526139356040850182613658565b949350505050565b6020815260006127486020830184613900565b6020815260006127486020830184613777565b6000806020838503121561397657600080fd5b823567ffffffffffffffff8082111561398e57600080fd5b818501915085601f8301126139a257600080fd5b8135818111156139b157600080fd5b8660208260071b85010111156139c657600080fd5b60209290920196919550909350505050565b600080604083850312156139eb57600080fd5b50508035926020909101359150565b60008060408385031215613a0d57600080fd5b613a16836138cc565b946020939093013593505050565b604081526000613a376040830185613658565b8281036020840152613a498185613658565b95945050505050565b63ffffffff815116825260208101516020830152604081015160408301526000606082015160806060850152613935608085018261373c565b604081526000613a9e6040830185613a52565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156138bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613b14858351613900565b94509285019290850190600101613ada565b801515811461273157600080fd5b600080600080600060608688031215613b4c57600080fd5b853567ffffffffffffffff80821115613b6457600080fd5b613b7089838a016136b5565b90975095506020880135915080821115613b8957600080fd5b50613b96888289016136b5565b9094509250506040860135613baa81613b26565b809150509295509295909350565b60008060008060408587031215613bce57600080fd5b843567ffffffffffffffff80821115613be657600080fd5b613bf2888389016136b5565b90965094506020870135915080821115613c0b57600080fd5b50613c18878288016136b5565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110613c9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b6080810161049a8284613c53565b60008060008060008060808789031215613cea57600080fd5b613cf3876138cc565b9550602087013567ffffffffffffffff80821115613d1057600080fd5b613d1c8a838b016136b5565b90975095506040890135915080821115613d3557600080fd5b50613d4289828a016136b5565b9094509250506060870135613d5681613b26565b809150509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015613da657613d93838551613c53565b9284019260809290920191600101613d80565b50909695505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015613e27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018552613e15868351613a52565b95509382019390820190600101613ddb565b50508584038187015286518085528782019482019350915060005b82811015613e6457845163ffffffff1684529381019392810192600101613e42565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138e057600080fd5b600060208284031215613ea757600080fd5b61274882613e71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f3f57613f3f613edf565b5060010190565b63ffffffff8281168282160390808211156107a9576107a9613edf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600063ffffffff808316818103613fab57613fab613edf565b6001019392505050565b600181811c90821680613fc957607f821691505b602082108103614002577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6040516080810167ffffffffffffffff8111828210171561402b5761402b613f63565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407857614078613f63565b604052919050565b60006080828403121561409257600080fd5b61409a614008565b82358152602083013560208201526040830135600281106140ba57600080fd5b60408201526140cb60608401613e71565b60608201529392505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261410b57600080fd5b9190910192915050565b600067ffffffffffffffff82111561412f5761412f613f63565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006040823603121561416d57600080fd5b6040516040810167ffffffffffffffff828210818311171561419157614191613f63565b8160405261419e85613e71565b83526020915081850135818111156141b557600080fd5b8501905036601f8201126141c857600080fd5b80356141db6141d682614115565b614031565b81815236848385010111156141ef57600080fd5b81848401858301376000918101840191909152918301919091525092915050565b601f82111561065757600081815260208120601f850160051c810160208610156142375750805b601f850160051c820191505b8181101561191c57828155600101614243565b815167ffffffffffffffff81111561427057614270613f63565b6142848161427e8454613fb5565b84614210565b602080601f8311600181146142d757600084156142a15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561191c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561432457888601518255948401946001909101908401614305565b508582101561436057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561438257600080fd5b815167ffffffffffffffff81111561439957600080fd5b8201601f810184136143aa57600080fd5b80516143b86141d682614115565b8181528560208385010111156143cd57600080fd5b613a49826020830160208601613634565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261410b57600080fd5b60006080823603121561442457600080fd5b61442c614008565b614435836138cc565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff8082111561446657600080fd5b9085019036601f83011261447957600080fd5b81358181111561448b5761448b613f63565b8060051b915061449c848301614031565b81815291830184019184810190368411156144b657600080fd5b938501935b838510156144d4578435825293850193908501906144bb565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613da657835183529284019291840191600101614501565b600060208083526000845461453181613fb5565b80848701526040600180841660008114614552576001811461458a576145b8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506145b8565b896000528660002060005b858110156145b05781548b8201860152908301908801614595565b8a0184019650505b509398975050505050505050565b8181038181111561049a5761049a613edf565b6000602082840312156145eb57600080fd5b815161274881613b26565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261462b57600080fd5b83018035915067ffffffffffffffff82111561464657600080fd5b60200191503681900382131561104557600080fd5b67ffffffffffffffff83111561467357614673613f63565b614687836146818354613fb5565b83614210565b6000601f8411600181146146d957600085156146a35750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561476f565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156147285786850135825560209485019460019092019101614708565b5086821015614763577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156147de57600080fd5b8560051b808860a0850137820182810360a0908101602085015261480490820187613658565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", } var CapabilityRegistryABI = CapabilityRegistryMetaData.ABI @@ -1099,18 +1099,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 } @@ -1218,28 +1228,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 } @@ -1345,18 +1363,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 } @@ -1464,28 +1492,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 } @@ -1710,18 +1746,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 } @@ -2185,27 +2231,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) @@ -2215,9 +2261,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 a4d018c8c19..6245998c340 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 d95781054b4491e1469038a2857372f7bbaf455a244e138880579d15bb9471c6 +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin c5364e838f222233ba991a4fa78ac4b92e6db0a18628beec4a4e9efc8f2a54b1 ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2 From 6595aef9f38655ec1e21812e38671ed9b1c1415f Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Wed, 5 Jun 2024 15:25:44 -0700 Subject: [PATCH 8/8] add changesets --- .changeset/empty-dryers-fold.md | 5 +++++ contracts/.changeset/dull-phones-retire.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/empty-dryers-fold.md create mode 100644 contracts/.changeset/dull-phones-retire.md 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