diff --git a/.changeset/metal-glasses-count.md b/.changeset/metal-glasses-count.md new file mode 100644 index 00000000000..0408383bd03 --- /dev/null +++ b/.changeset/metal-glasses-count.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal diff --git a/contracts/.changeset/two-doors-dance.md b/contracts/.changeset/two-doors-dance.md new file mode 100644 index 00000000000..93fba83b558 --- /dev/null +++ b/contracts/.changeset/two-doors-dance.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts': patch +--- + +#internal diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index 55e6884c818..1aa0c02e3f3 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -1,5 +1,5 @@ -CapabilitiesRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 152156) -CapabilitiesRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 176137) +CapabilitiesRegistry_AddCapabilitiesTest:test_AddCapability_NoConfigurationContract() (gas: 154898) +CapabilitiesRegistry_AddCapabilitiesTest:test_AddCapability_WithConfiguration() (gas: 178879) CapabilitiesRegistry_AddCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 24723) CapabilitiesRegistry_AddCapabilitiesTest:test_RevertWhen_CapabilityExists() (gas: 145769) CapabilitiesRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractDoesNotMatchInterface() (gas: 94606) @@ -7,7 +7,7 @@ CapabilitiesRegistry_AddCapabilitiesTest:test_RevertWhen_ConfigurationContractNo CapabilitiesRegistry_AddDONTest:test_AddDON() (gas: 372909) CapabilitiesRegistry_AddDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 19269) CapabilitiesRegistry_AddDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 169874) -CapabilitiesRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 243042) +CapabilitiesRegistry_AddDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 239974) CapabilitiesRegistry_AddDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 249901) CapabilitiesRegistry_AddDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 116949) CapabilitiesRegistry_AddDONTest:test_RevertWhen_FaultToleranceIsZero() (gas: 43354) @@ -16,41 +16,40 @@ CapabilitiesRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() ( CapabilitiesRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 184333) CapabilitiesRegistry_AddNodeOperatorsTest:test_RevertWhen_CalledByNonAdmin() (gas: 17602) CapabilitiesRegistry_AddNodeOperatorsTest:test_RevertWhen_NodeOperatorAdminAddressZero() (gas: 18498) -CapabilitiesRegistry_AddNodesTest:test_AddsNodeParams() (gas: 358667) -CapabilitiesRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 358633) +CapabilitiesRegistry_AddNodesTest:test_AddsNodeParams() (gas: 358630) +CapabilitiesRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 358596) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 301350) -CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 55207) +CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 55174) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 24895) -CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 27702) +CapabilitiesRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 27669) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 25108) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 27408) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 27047) CapabilitiesRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 309800) -CapabilitiesRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 92938) -CapabilitiesRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 93066) +CapabilitiesRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 89870) +CapabilitiesRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 89998) CapabilitiesRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 22944) CapabilitiesRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 16231) -CapabilitiesRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 94395) -CapabilitiesRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 122114) -CapabilitiesRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 58311) +CapabilitiesRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 91327) +CapabilitiesRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 135740) CapabilitiesRegistry_GetDONsTest:test_CorrectlyFetchesDONs() (gas: 65746) CapabilitiesRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 65329) CapabilitiesRegistry_GetHashedCapabilityTest:test_CorrectlyGeneratesHashedCapabilityId() (gas: 11428) CapabilitiesRegistry_GetHashedCapabilityTest:test_DoesNotCauseIncorrectClashes() (gas: 13087) CapabilitiesRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 36653) CapabilitiesRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 38938) -CapabilitiesRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 65482) -CapabilitiesRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 73664) +CapabilitiesRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 65408) +CapabilitiesRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 73634) CapabilitiesRegistry_RemoveDONsTest:test_RemovesDON() (gas: 54946) CapabilitiesRegistry_RemoveDONsTest:test_RevertWhen_CalledByNonAdmin() (gas: 15647) CapabilitiesRegistry_RemoveDONsTest:test_RevertWhen_DONDoesNotExist() (gas: 16550) CapabilitiesRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 36122) CapabilitiesRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 15816) -CapabilitiesRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 115436) -CapabilitiesRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 288312) -CapabilitiesRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 562061) -CapabilitiesRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 73457) -CapabilitiesRegistry_RemoveNodesTest:test_RemovesNode() (gas: 75292) +CapabilitiesRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 115399) +CapabilitiesRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 288275) +CapabilitiesRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 562024) +CapabilitiesRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 73428) +CapabilitiesRegistry_RemoveNodesTest:test_RemovesNode() (gas: 75262) CapabilitiesRegistry_RemoveNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 25053) CapabilitiesRegistry_RemoveNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 18418) CapabilitiesRegistry_RemoveNodesTest:test_RevertWhen_NodePartOfCapabilitiesDON() (gas: 385680) @@ -59,7 +58,7 @@ CapabilitiesRegistry_TypeAndVersionTest:test_TypeAndVersion() (gas: 9796) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_CalledByNonAdmin() (gas: 19411) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 153162) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_DONDoesNotExist() (gas: 17831) -CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 226375) +CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_DeprecatedCapabilityAdded() (gas: 223307) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_DuplicateCapabilityAdded() (gas: 233235) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_DuplicateNodeAdded() (gas: 107828) CapabilitiesRegistry_UpdateDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (gas: 163668) @@ -69,16 +68,18 @@ CapabilitiesRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorAdminIsZ CapabilitiesRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorDoesNotExist() (gas: 19786) CapabilitiesRegistry_UpdateNodeOperatorTest:test_RevertWhen_NodeOperatorIdAndParamLengthsMismatch() (gas: 15426) CapabilitiesRegistry_UpdateNodeOperatorTest:test_UpdatesNodeOperator() (gas: 36991) -CapabilitiesRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 253325) -CapabilitiesRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 161746) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 35794) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 25064) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 27303) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 29214) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 27291) +CapabilitiesRegistry_UpdateNodesTest:test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() (gas: 256393) +CapabilitiesRegistry_UpdateNodesTest:test_OwnerCanUpdateNodes() (gas: 162174) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 35766) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 25069) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_NodeDoesNotExist() (gas: 27308) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_NodeSignerAlreadyAssignedToAnotherNode() (gas: 29219) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 27296) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_RemovingCapabilityRequiredByCapabilityDON() (gas: 471181) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_RemovingCapabilityRequiredByWorkflowDON() (gas: 341462) CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 26951) -CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 25508) -CapabilitiesRegistry_UpdateNodesTest:test_UpdatesNodeParams() (gas: 161800) +CapabilitiesRegistry_UpdateNodesTest:test_RevertWhen_UpdatingNodeWithoutCapabilities() (gas: 25480) +CapabilitiesRegistry_UpdateNodesTest:test_UpdatesNodeParams() (gas: 162228) KeystoneForwarder_ReportTest:test_Report_ConfigVersion() (gas: 1802140) KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverInterfaceNotSupported() (gas: 126020) KeystoneForwarder_ReportTest:test_Report_FailedDeliveryWhenReceiverNotContract() (gas: 127513) diff --git a/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol b/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol index 9286dd678b1..ff68b292836 100644 --- a/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol @@ -128,8 +128,41 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { /// /// Ex. id = "data-streams-reports:chain:ethereum@1.0.0" /// labelledName = "data-streams-reports:chain:ethereum" + string labelledName; + /// @notice Semver, e.g., "1.2.3" + /// @dev must be valid Semver + max 32 characters. + string version; + /// @notice CapabilityType indicates the type of capability which determines + /// where the capability can be used in a Workflow Spec. + CapabilityType capabilityType; + /// @notice CapabilityResponseType indicates whether remote response requires + // aggregation or is an already aggregated report. There are multiple + // possible ways to aggregate. + CapabilityResponseType responseType; + /// @notice An address to the capability configuration contract. Having this defined + // on a capability enforces consistent configuration across DON instances + // serving the same capability. Configuration contract MUST implement + // CapabilityConfigurationContractInterface. + // + /// @dev The main use cases are: + // 1) Sharing capability configuration across DON instances + // 2) Inspect and modify on-chain configuration without off-chain + // capability code. + // + // It is not recommended to store configuration which requires knowledge of + // the DON membership. + address configurationContract; + } + + struct CapabilityInfo { + /// @notice A hashed ID created by the `getHashedCapabilityId` function. + bytes32 hashedId; + /// @notice The partially qualified ID for the capability. + /// @dev Given the following capability ID: {name}:{label1_key}_{label1_value}:{label2_key}_{label2_value}@{version} + // Then we denote the `labelledName` as the `{name}:{label1_key}_{label1_value}:{label2_key}_{label2_value}` portion of the ID. /// - /// validation regex: ^[a-z0-9_\-:]{1,32}$ + /// Ex. id = "data-streams-reports:chain:ethereum@1.0.0" + /// labelledName = "data-streams-reports:chain:ethereum" string labelledName; /// @notice Semver, e.g., "1.2.3" /// @dev must be valid Semver + max 32 characters. @@ -154,6 +187,8 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { // It is not recommended to store configuration which requires knowledge of // the DON membership. address configurationContract; + /// @notice True if the capability is deprecated + bool isDeprecated; } /// @notice CapabilityConfiguration is a struct that holds the capability configuration @@ -328,6 +363,13 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param nodeP2PId The P2P Id of the node error NodePartOfWorkflowDON(uint32 donId, bytes32 nodeP2PId); + /// @notice This error is thrown when removing a capability from the node + /// when that capability is still required by one of the DONs the node + /// belongs to. + /// @param hashedCapabilityId The hashed ID of the capability + /// @param donId The ID of the DON that requires the capability + error CapabilityRequiredByDON(bytes32 hashedCapabilityId, uint32 donId); + /// @notice This error is thrown when trying to add a capability with a /// configuration contract that does not implement the required interface. /// @param proposedConfigurationContract The address of the proposed @@ -390,8 +432,6 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Set of deprecated hashed capability IDs, /// A hashed ID is created by the function `getHashedCapabilityId`. - /// - /// Deprecated capabilities are skipped by the `getCapabilities` function. EnumerableSet.Bytes32Set private s_deprecatedHashedCapabilityIds; /// @notice Encoded node signer addresses @@ -571,13 +611,11 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { bool isOwner = msg.sender == owner(); for (uint256 i; i < nodes.length; ++i) { NodeParams memory node = nodes[i]; - NodeOperator memory nodeOperator = s_nodeOperators[node.nodeOperatorId]; if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); Node storage storedNode = s_nodes[node.p2pId]; if (storedNode.signer == bytes32("")) revert NodeDoesNotExist(node.p2pId); - if (node.signer == bytes32("")) revert InvalidNodeSigner(); bytes32 previousSigner = storedNode.signer; @@ -598,6 +636,31 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { storedNode.supportedHashedCapabilityIds[capabilityConfigCount].add(supportedHashedCapabilityIds[j]); } + // Validate that capabilities required by a Workflow DON are still supported + uint32 nodeWorkflowDONId = storedNode.workflowDONId; + if (nodeWorkflowDONId != 0) { + bytes32[] memory workflowDonCapabilityIds = s_dons[nodeWorkflowDONId] + .config[s_dons[nodeWorkflowDONId].configCount] + .capabilityIds; + + for (uint256 j; j < workflowDonCapabilityIds.length; ++j) { + if (!storedNode.supportedHashedCapabilityIds[capabilityConfigCount].contains(workflowDonCapabilityIds[j])) + revert CapabilityRequiredByDON(workflowDonCapabilityIds[j], nodeWorkflowDONId); + } + } + + // Validate that capabilities required by capabilities DONs are still supported + uint256[] memory capabilitiesDONIds = storedNode.capabilitiesDONIds.values(); + for (uint32 j; j < capabilitiesDONIds.length; ++j) { + uint32 donId = uint32(capabilitiesDONIds[j]); + bytes32[] memory donCapabilityIds = s_dons[donId].config[s_dons[donId].configCount].capabilityIds; + + for (uint256 k; k < donCapabilityIds.length; ++k) { + if (!storedNode.supportedHashedCapabilityIds[capabilityConfigCount].contains(donCapabilityIds[k])) + revert CapabilityRequiredByDON(donCapabilityIds[k], donId); + } + } + storedNode.nodeOperatorId = node.nodeOperatorId; storedNode.p2pId = node.p2pId; @@ -656,51 +719,38 @@ contract CapabilitiesRegistry is OwnerIsCreator, TypeAndVersionInterface { if (!s_hashedCapabilityIds.contains(hashedCapabilityId)) revert CapabilityDoesNotExist(hashedCapabilityId); if (!s_deprecatedHashedCapabilityIds.add(hashedCapabilityId)) revert CapabilityIsDeprecated(hashedCapabilityId); - delete s_capabilities[hashedCapabilityId]; emit CapabilityDeprecated(hashedCapabilityId); } } /// @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]; + function getCapability(bytes32 hashedId) public view returns (CapabilityInfo memory) { + return ( + CapabilityInfo({ + hashedId: hashedId, + labelledName: s_capabilities[hashedId].labelledName, + version: s_capabilities[hashedId].version, + capabilityType: s_capabilities[hashedId].capabilityType, + responseType: s_capabilities[hashedId].responseType, + configurationContract: s_capabilities[hashedId].configurationContract, + isDeprecated: s_deprecatedHashedCapabilityIds.contains(hashedId) + }) + ); } /// @notice Returns all capabilities. This operation will copy capabilities /// to memory, which can be quite expensive. This is designed to mostly be /// used by view accessors that are queried without any gas fees. - /// @return hashedCapabilityIds bytes32[] List of hashed capability Ids - /// @return capabilities Capability[] List of capabilities - function getCapabilities() - external - view - returns (bytes32[] memory hashedCapabilityIds, Capability[] memory capabilities) - { - hashedCapabilityIds = s_hashedCapabilityIds.values(); - - uint256 numSupportedCapabilities = hashedCapabilityIds.length - s_deprecatedHashedCapabilityIds.length(); - - // Solidity does not support dynamic arrays in memory, so we create a - // fixed-size array and copy the capabilities into it. - capabilities = new Capability[](numSupportedCapabilities); - bytes32[] memory supportedHashedCapabilityIds = new bytes32[](numSupportedCapabilities); - - // We need to keep track of the new index because we are skipping - // deprecated capabilities. - uint256 newIndex; + /// @return CapabilityInfo[] List of capabilities + function getCapabilities() external view returns (CapabilityInfo[] memory) { + bytes32[] memory hashedCapabilityIds = s_hashedCapabilityIds.values(); + CapabilityInfo[] memory capabilitiesInfo = new CapabilityInfo[](hashedCapabilityIds.length); for (uint256 i; i < hashedCapabilityIds.length; ++i) { - bytes32 hashedCapabilityId = hashedCapabilityIds[i]; - - if (!s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId)) { - capabilities[newIndex] = s_capabilities[hashedCapabilityId]; - supportedHashedCapabilityIds[newIndex] = hashedCapabilityId; - ++newIndex; - } + capabilitiesInfo[i] = getCapability(hashedCapabilityIds[i]); } - - return (supportedHashedCapabilityIds, capabilities); + return capabilitiesInfo; } /// @notice This functions returns a capability id that has been hashed to fit into a bytes32 for cheaper access diff --git a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_AddCapabilitiesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_AddCapabilitiesTest.t.sol index 5b653489503..c63decb68be 100644 --- a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_AddCapabilitiesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_AddCapabilitiesTest.t.sol @@ -82,7 +82,9 @@ contract CapabilitiesRegistry_AddCapabilitiesTest is BaseTest { vm.expectEmit(true, true, true, true, address(s_CapabilitiesRegistry)); emit CapabilityConfigured(hashedCapabilityId); s_CapabilitiesRegistry.addCapabilities(capabilities); - CapabilitiesRegistry.Capability memory storedCapability = s_CapabilitiesRegistry.getCapability(hashedCapabilityId); + CapabilitiesRegistry.CapabilityInfo memory storedCapability = s_CapabilitiesRegistry.getCapability( + hashedCapabilityId + ); assertEq(storedCapability.labelledName, s_basicCapability.labelledName); assertEq(storedCapability.version, s_basicCapability.version); @@ -102,7 +104,9 @@ contract CapabilitiesRegistry_AddCapabilitiesTest is BaseTest { emit CapabilityConfigured(hashedCapabilityId); s_CapabilitiesRegistry.addCapabilities(capabilities); - CapabilitiesRegistry.Capability memory storedCapability = s_CapabilitiesRegistry.getCapability(hashedCapabilityId); + CapabilitiesRegistry.CapabilityInfo memory storedCapability = s_CapabilitiesRegistry.getCapability( + hashedCapabilityId + ); assertEq(storedCapability.labelledName, s_capabilityWithConfigurationContract.labelledName); assertEq(storedCapability.version, s_capabilityWithConfigurationContract.version); diff --git a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_GetCapabilitiesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_GetCapabilitiesTest.t.sol index 95551c19cdb..9702c62b9c7 100644 --- a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_GetCapabilitiesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_GetCapabilitiesTest.t.sol @@ -13,15 +13,16 @@ contract CapabilitiesRegistry_GetCapabilitiesTest is BaseTest { s_CapabilitiesRegistry.addCapabilities(capabilities); } - function test_ReturnsCapabilities() public view { - ( - bytes32[] memory hashedCapabilityIds, - CapabilitiesRegistry.Capability[] memory capabilities - ) = s_CapabilitiesRegistry.getCapabilities(); + function test_ReturnsCapabilities() public { + bytes32 hashedCapabilityId = s_CapabilitiesRegistry.getHashedCapabilityId( + s_basicCapability.labelledName, + s_basicCapability.version + ); + bytes32[] memory deprecatedCapabilities = new bytes32[](1); + deprecatedCapabilities[0] = hashedCapabilityId; + s_CapabilitiesRegistry.deprecateCapabilities(deprecatedCapabilities); - assertEq(hashedCapabilityIds.length, 2); - assertEq(hashedCapabilityIds[0], keccak256(abi.encode(capabilities[0].labelledName, capabilities[0].version))); - assertEq(hashedCapabilityIds[1], keccak256(abi.encode(capabilities[1].labelledName, capabilities[1].version))); + CapabilitiesRegistry.CapabilityInfo[] memory capabilities = s_CapabilitiesRegistry.getCapabilities(); assertEq(capabilities.length, 2); @@ -30,6 +31,8 @@ contract CapabilitiesRegistry_GetCapabilitiesTest is BaseTest { assertEq(uint256(capabilities[0].responseType), uint256(CapabilitiesRegistry.CapabilityResponseType.REPORT)); assertEq(uint256(capabilities[0].capabilityType), uint256(CapabilitiesRegistry.CapabilityType.TRIGGER)); assertEq(capabilities[0].configurationContract, address(0)); + assertEq(capabilities[0].hashedId, keccak256(abi.encode(capabilities[0].labelledName, capabilities[0].version))); + assertEq(capabilities[0].isDeprecated, true); assertEq(capabilities[1].labelledName, "read-ethereum-mainnet-gas-price"); assertEq(capabilities[1].version, "1.0.2"); @@ -39,33 +42,7 @@ contract CapabilitiesRegistry_GetCapabilitiesTest is BaseTest { ); assertEq(uint256(capabilities[1].capabilityType), uint256(CapabilitiesRegistry.CapabilityType.ACTION)); assertEq(capabilities[1].configurationContract, address(s_capabilityConfigurationContract)); - } - - function test_ExcludesDeprecatedCapabilities() public { - bytes32 hashedCapabilityId = s_CapabilitiesRegistry.getHashedCapabilityId( - s_basicCapability.labelledName, - s_basicCapability.version - ); - bytes32[] memory deprecatedCapabilities = new bytes32[](1); - deprecatedCapabilities[0] = hashedCapabilityId; - s_CapabilitiesRegistry.deprecateCapabilities(deprecatedCapabilities); - - ( - bytes32[] memory hashedCapabilityIds, - CapabilitiesRegistry.Capability[] memory capabilities - ) = s_CapabilitiesRegistry.getCapabilities(); - - assertEq(hashedCapabilityIds.length, 1); - assertEq(hashedCapabilityIds[0], keccak256(abi.encode(capabilities[0].labelledName, capabilities[0].version))); - - assertEq(capabilities.length, 1); - - assertEq(capabilities[0].labelledName, "read-ethereum-mainnet-gas-price"); - assertEq(capabilities[0].version, "1.0.2"); - assertEq( - uint256(capabilities[0].responseType), - uint256(CapabilitiesRegistry.CapabilityResponseType.OBSERVATION_IDENTICAL) - ); - assertEq(capabilities[0].configurationContract, address(s_capabilityConfigurationContract)); + assertEq(capabilities[1].hashedId, keccak256(abi.encode(capabilities[1].labelledName, capabilities[1].version))); + assertEq(capabilities[1].isDeprecated, false); } } diff --git a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol index cc180ec54e5..d61e76c9106 100644 --- a/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilitiesRegistry_UpdateNodesTest.t.sol @@ -168,6 +168,86 @@ contract CapabilitiesRegistry_UpdateNodesTest is BaseTest { s_CapabilitiesRegistry.updateNodes(nodes); } + function test_RevertWhen_RemovingCapabilityRequiredByWorkflowDON() public { + // SETUP: addDON + CapabilitiesRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilitiesRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilitiesRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: BASIC_CAPABILITY_CONFIG + }); + bytes32[] memory nodeIds = new bytes32[](2); + nodeIds[0] = P2P_ID; + nodeIds[1] = P2P_ID_TWO; + + // SETUP: updateNodes + CapabilitiesRegistry.NodeParams[] memory nodes = new CapabilitiesRegistry.NodeParams[](1); + bytes32[] memory hashedCapabilityIds = new bytes32[](1); + // DON requires s_basicHashedCapabilityId but we are swapping for + // s_capabilityWithConfigurationContractId + hashedCapabilityIds[0] = s_capabilityWithConfigurationContractId; + nodes[0] = CapabilitiesRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID, + signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, + hashedCapabilityIds: hashedCapabilityIds + }); + uint32 workflowDonId = 1; + + // Operations + changePrank(ADMIN); + s_CapabilitiesRegistry.addDON(nodeIds, capabilityConfigs, true, true, 1); + + vm.expectRevert( + abi.encodeWithSelector( + CapabilitiesRegistry.CapabilityRequiredByDON.selector, + s_basicHashedCapabilityId, + workflowDonId + ) + ); + s_CapabilitiesRegistry.updateNodes(nodes); + } + + function test_RevertWhen_RemovingCapabilityRequiredByCapabilityDON() public { + // SETUP: addDON + CapabilitiesRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilitiesRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilitiesRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: BASIC_CAPABILITY_CONFIG + }); + bytes32[] memory nodeIds = new bytes32[](2); + nodeIds[0] = P2P_ID; + nodeIds[1] = P2P_ID_TWO; + + // SETUP: updateNodes + CapabilitiesRegistry.NodeParams[] memory nodes = new CapabilitiesRegistry.NodeParams[](1); + bytes32[] memory hashedCapabilityIds = new bytes32[](1); + // DON requires s_basicHashedCapabilityId but we are swapping for + // s_capabilityWithConfigurationContractId + hashedCapabilityIds[0] = s_capabilityWithConfigurationContractId; + nodes[0] = CapabilitiesRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID, + signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, + hashedCapabilityIds: hashedCapabilityIds + }); + uint32 capabilitiesDonId = 1; + + // Operations + changePrank(ADMIN); + s_CapabilitiesRegistry.addDON(nodeIds, capabilityConfigs, true, false, 1); + + vm.expectRevert( + abi.encodeWithSelector( + CapabilitiesRegistry.CapabilityRequiredByDON.selector, + s_basicHashedCapabilityId, + capabilitiesDonId + ) + ); + s_CapabilitiesRegistry.updateNodes(nodes); + } + function test_CanUpdateParamsIfNodeSignerAddressNoLongerUsed() public { changePrank(NODE_OPERATOR_ONE_ADMIN); diff --git a/core/capabilities/reader.go b/core/capabilities/reader.go index 0a40b4652bd..a0b7d3d96d8 100644 --- a/core/capabilities/reader.go +++ b/core/capabilities/reader.go @@ -28,7 +28,7 @@ type donID uint32 type state struct { IDsToDONs map[donID]kcr.CapabilitiesRegistryDONInfo IDsToNodes map[p2ptypes.PeerID]kcr.CapabilitiesRegistryNodeInfo - IDsToCapabilities map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability + IDsToCapabilities map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo } func (r *remoteRegistryReader) LocalNode(ctx context.Context) (capabilities.Node, error) { @@ -80,15 +80,15 @@ func (r *remoteRegistryReader) state(ctx context.Context) (state, error) { idsToDONs[donID(d.Id)] = d } - caps := kcr.GetCapabilities{} + caps := []kcr.CapabilitiesRegistryCapabilityInfo{} err = r.r.GetLatestValue(ctx, "CapabilitiesRegistry", "getCapabilities", nil, &caps) if err != nil { return state{}, err } - idsToCapabilities := map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability{} - for i, c := range caps.Capabilities { - idsToCapabilities[caps.HashedCapabilityIds[i]] = c + idsToCapabilities := map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{} + for _, c := range caps { + idsToCapabilities[c.HashedId] = c } nodes := []kcr.CapabilitiesRegistryNodeInfo{} diff --git a/core/capabilities/reader_test.go b/core/capabilities/reader_test.go index 747736c23bd..cc61628c541 100644 --- a/core/capabilities/reader_test.go +++ b/core/capabilities/reader_test.go @@ -218,7 +218,14 @@ func TestReader_Integration(t *testing.T) { assert.Len(t, s.IDsToCapabilities, 1) gotCap := s.IDsToCapabilities[cid] - assert.Equal(t, writeChainCapability, gotCap) + assert.Equal(t, kcr.CapabilitiesRegistryCapabilityInfo{ + HashedId: cid, + LabelledName: "write-chain", + Version: "1.0.1", + ResponseType: uint8(1), + CapabilityType: uint8(0), + IsDeprecated: false, + }, gotCap) assert.Len(t, s.IDsToDONs, 1) assert.Equal(t, kcr.CapabilitiesRegistryDONInfo{ diff --git a/core/capabilities/syncer.go b/core/capabilities/syncer.go index 1a62b8af3a7..800fb325094 100644 --- a/core/capabilities/syncer.go +++ b/core/capabilities/syncer.go @@ -399,7 +399,7 @@ type capabilityService interface { services.Service } -func (s *registrySyncer) addToRegistryAndSetDispatcher(ctx context.Context, capabilityInfo kcr.CapabilitiesRegistryCapability, don kcr.CapabilitiesRegistryDONInfo, newCapFn func(info capabilities.CapabilityInfo) (capabilityService, error)) error { +func (s *registrySyncer) addToRegistryAndSetDispatcher(ctx context.Context, capabilityInfo kcr.CapabilitiesRegistryCapabilityInfo, don kcr.CapabilitiesRegistryDONInfo, newCapFn func(info capabilities.CapabilityInfo) (capabilityService, error)) error { fullCapID := fmt.Sprintf("%s@%s", capabilityInfo.LabelledName, capabilityInfo.Version) info, err := capabilities.NewRemoteCapabilityInfo( fullCapID, @@ -520,7 +520,7 @@ type receiverService interface { remotetypes.Receiver } -func (s *registrySyncer) addReceiver(ctx context.Context, capability kcr.CapabilitiesRegistryCapability, don kcr.CapabilitiesRegistryDONInfo, newReceiverFn func(capability capabilities.BaseCapability, info capabilities.CapabilityInfo) (receiverService, error)) error { +func (s *registrySyncer) addReceiver(ctx context.Context, capability kcr.CapabilitiesRegistryCapabilityInfo, don kcr.CapabilitiesRegistryDONInfo, newReceiverFn func(capability capabilities.BaseCapability, info capabilities.CapabilityInfo) (receiverService, error)) error { fullCapID := fmt.Sprintf("%s@%s", capability.LabelledName, capability.Version) info, err := capabilities.NewRemoteCapabilityInfo( fullCapID, diff --git a/core/capabilities/syncer_test.go b/core/capabilities/syncer_test.go index c1bc379e2f3..2c5f871bdb8 100644 --- a/core/capabilities/syncer_test.go +++ b/core/capabilities/syncer_test.go @@ -160,7 +160,7 @@ func TestSyncer_WiresUpExternalCapabilities(t *testing.T) { }, }, }, - IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability{ + IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{ triggerCapID: { LabelledName: "streams-trigger", Version: "1.0.0", @@ -262,7 +262,7 @@ func TestSyncer_IgnoresCapabilitiesForPrivateDON(t *testing.T) { }, }, }, - IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability{ + IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{ triggerCapID: { LabelledName: "streams-trigger", Version: "1.0.0", @@ -384,7 +384,7 @@ func TestSyncer_WiresUpClientsForPublicWorkflowDON(t *testing.T) { }, }, }, - IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability{ + IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{ triggerCapID: { LabelledName: "streams-trigger", Version: "1.0.0", @@ -539,7 +539,7 @@ func TestSyncer_WiresUpClientsForPublicWorkflowDONButIgnoresPrivateCapabilities( }, }, }, - IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapability{ + IDsToCapabilities: map[hashedCapabilityID]kcr.CapabilitiesRegistryCapabilityInfo{ triggerCapID: { LabelledName: "streams-trigger", Version: "1.0.0", diff --git a/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go b/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go index dfb70824fee..b701f312c70 100644 --- a/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go +++ b/core/gethwrappers/keystone/generated/capabilities_registry/capabilities_registry.go @@ -43,6 +43,16 @@ type CapabilitiesRegistryCapabilityConfiguration struct { Config []byte } +type CapabilitiesRegistryCapabilityInfo struct { + HashedId [32]byte + LabelledName string + Version string + CapabilityType uint8 + ResponseType uint8 + ConfigurationContract common.Address + IsDeprecated bool +} + type CapabilitiesRegistryDONInfo struct { Id uint32 ConfigCount uint32 @@ -76,8 +86,8 @@ type CapabilitiesRegistryNodeParams struct { } var CapabilitiesRegistryMetaData = &bind.MetaData{ - 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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"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\"}],\"name\":\"NodeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotExist\",\"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\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfCapabilitiesDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfWorkflowDON\",\"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\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeParams[]\",\"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\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.Capability[]\",\"name\":\"capabilities\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"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\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo\",\"name\":\"nodeInfo\",\"type\":\"tuple\"}],\"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\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"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\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6150bf80620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063d8bc7b6811610071578063d8bc7b68146103f6578063ddbe4f8214610409578063e29581aa1461041f578063f2fde38b1461043457600080fd5b80638da5cb5b1461039b5780639cb7c5f4146103c3578063d59a79f6146103e357600080fd5b806373ac22b4116100c857806373ac22b41461036d57806379ba50971461038057806386fa42461461038857600080fd5b80635e65e3091461033257806366acaa3314610345578063715f52951461035a57600080fd5b8063235374051161015b578063398f377311610135578063398f3773146102cb5780633f2a13c9146102de57806350c946fe146102ff5780635d83d9671461031f57600080fd5b80632353740514610285578063275459f2146102a55780632c01a1e8146102b857600080fd5b80631d05394c1161018c5780631d05394c1461023b578063214502431461025057806322bdbcbc1461026557600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613ef4565b610447565b6040519081526020015b60405180910390f35b6101ec6101e7366004613f58565b61047b565b60405190151581526020016101d0565b604080518082018252601a81527f4361706162696c6974696573526567697374727920312e302e30000000000000602082015290516101d09190613fdf565b61024e610249366004614037565b610488565b005b6102586106ab565b6040516101d09190614197565b610278610273366004614230565b610810565b6040516101d09190614288565b610298610293366004614230565b6108fd565b6040516101d0919061429b565b61024e6102b3366004614037565b610941565b61024e6102c6366004614037565b610a18565b61024e6102d9366004614037565b610cbd565b6102f16102ec3660046142ae565b610e85565b6040516101d09291906142d8565b61031261030d366004613f58565b611071565b6040516101d09190614369565b61024e61032d366004614037565b61114b565b61024e610340366004614037565b611299565b61034d611718565b6040516101d0919061437c565b61024e610368366004614037565b611903565b61024e61037b366004614037565b6119be565b61024e611e9a565b61024e6103963660046143ef565b611f97565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b6103d66103d1366004613f58565b6122dd565b6040516101d09190614517565b61024e6103f1366004614549565b6124e2565b61024e6104043660046145fe565b6125ab565b610411612675565b6040516101d09291906146a3565b6104276129d8565b6040516101d09190614733565b61024e6104423660046147ca565b612aea565b6000828260405160200161045c9291906142d8565b6040516020818303038152906040528051906020012090505b92915050565b6000610475600583612afe565b610490612b19565b60005b818110156106a65760008383838181106104af576104af6147e5565b90506020020160208101906104c49190614230565b63ffffffff8181166000908152600d60209081526040808320805464010000000081049095168085526001820190935290832094955093909290916a010000000000000000000090910460ff16905b61051c83612b9c565b8110156105c457811561057257600c60006105378584612ba6565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556105b4565b6105b28663ffffffff16600c60006105938588612ba690919063ffffffff16565b8152602001908152602001600020600401612bb290919063ffffffff16565b505b6105bd81614843565b9050610513565b508354640100000000900463ffffffff1660000361061b576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff861660048201526024015b60405180910390fd5b63ffffffff85166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a150505050508061069f90614843565b9050610493565b505050565b600e54606090640100000000900463ffffffff1660006106cc60018361487b565b63ffffffff1667ffffffffffffffff8111156106ea576106ea613d8e565b60405190808252806020026020018201604052801561077157816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816107085790505b509050600060015b8363ffffffff168163ffffffff1610156107ed5763ffffffff8082166000908152600d602052604090205416156107dd576107b381612bbe565b8383815181106107c5576107c56147e5565b6020026020010181905250816107da90614843565b91505b6107e681614898565b9050610779565b506107f960018461487b565b63ffffffff168114610809578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191610874906148bb565b80601f01602080910402602001604051908101604052809291908181526020018280546108a0906148bb565b80156108ed5780601f106108c2576101008083540402835291602001916108ed565b820191906000526020600020905b8154815290600101906020018083116108d057829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261047582612bbe565b610949612b19565b60005b63ffffffff81168211156106a657600083838363ffffffff16818110610974576109746147e5565b90506020020160208101906109899190614230565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109d46001830182613d21565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a250610a1181614898565b905061094c565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb7576000848483818110610a5257610a526147e5565b602090810292909201356000818152600c90935260409092206001810154929350919050610aaf576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610612565b6000610abd82600401612b9c565b1115610b1257610ad06004820184612ba6565b6040517f60a6d89800000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101839052604401610612565b805468010000000000000000900463ffffffff1615610b7a5780546040517f60b9df730000000000000000000000000000000000000000000000000000000081526801000000000000000090910463ffffffff16600482015260248101839052604401610612565b83158015610bb45750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bed576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610612565b6001810154610bfe90600790612bb2565b506002810154610c1090600990612bb2565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815560018101829055600281018290559060048201818181610c658282613d5b565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c9c91815260200190565b60405180910390a1505080610cb090614843565b9050610a36565b50505050565b610cc5612b19565b60005b818110156106a6576000838383818110610ce457610ce46147e5565b9050602002810190610cf6919061490e565b610cff9061494c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d50576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610ddc9082614a04565b5050600e8054909150600090610df79063ffffffff16614898565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e6a9190613fdf565b60405180910390a3505080610e7e90614843565b9050610cc8565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610ed7906148bb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f03906148bb565b8015610f505780601f10610f2557610100808354040283529160200191610f50565b820191906000526020600020905b815481529060010190602001808311610f3357829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff16159150611063905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa15801561101a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110609190810190614b1e565b90505b9093509150505b9250929050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526040805160e0810182526000848152600c6020908152838220805463ffffffff8082168652640100000000820481168487018190526801000000000000000090920416858701526001820154606086015260028201546080860152835260030190529190912060a082019061112090612e92565b8152602001611143600c6000868152602001908152602001600020600401612e92565b905292915050565b611153612b19565b60005b818110156106a6576000838383818110611172576111726147e5565b90506020020135905061118f816003612afe90919063ffffffff16565b6111c8576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610612565b6111d3600582612e9f565b61120c576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610612565b6000818152600260205260408120906112258282613d21565b611233600183016000613d21565b5060020180547fffffffffffffffffffff0000000000000000000000000000000000000000000016905560405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a25061129281614843565b9050611156565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb75760008484838181106112d3576112d36147e5565b90506020028101906112e59190614b8c565b6112ee90614bc0565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611344906148bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611370906148bb565b80156113bd5780601f10611392576101008083540402835291602001916113bd565b820191906000526020600020905b8154815290600101906020018083116113a057829003601f168201915b5050505050815250509050831580156113ed5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611426576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610612565b6040808301516000908152600c60205220600181015461147a5782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161061291815260200190565b60208301516114b5576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810154602084015181146115365760208401516114d690600790612afe565b1561150d576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208401516001830155611522600782612bb2565b50602084015161153490600790612e9f565b505b6060840151805160000361157857806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106129190614c93565b8254600090849060049061159990640100000000900463ffffffff16614898565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060005b8251811015611686576115f18382815181106115d9576115d96147e5565b60200260200101516003612afe90919063ffffffff16565b61162957826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106129190614c93565b61167583828151811061163e5761163e6147e5565b60200260200101518660030160008563ffffffff1663ffffffff168152602001908152602001600020612e9f90919063ffffffff16565b5061167f81614843565b90506115bb565b50855184547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9091169081178555604080880151600287018190556020808a01518351928352908201527f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a25050505050508061171190614843565b90506112b7565b600e5460609063ffffffff16600061173160018361487b565b63ffffffff1667ffffffffffffffff81111561174f5761174f613d8e565b60405190808252806020026020018201604052801561179557816020015b60408051808201909152600081526060602082015281526020019060019003908161176d5790505b509050600060015b8363ffffffff168163ffffffff1610156118ed5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff16156118dd5763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611831906148bb565b80601f016020809104026020016040519081016040528092919081815260200182805461185d906148bb565b80156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b5050505050815250508383815181106118c5576118c56147e5565b6020026020010181905250816118da90614843565b91505b6118e681614898565b905061179d565b50600e546107f99060019063ffffffff1661487b565b61190b612b19565b60005b818110156106a657600083838381811061192a5761192a6147e5565b905060200281019061193c9190614ca6565b61194590614ce9565b9050600061195b82600001518360200151610447565b9050611968600382612e9f565b6119a1576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610612565b6119ab8183612eab565b5050806119b790614843565b905061190e565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb75760008484838181106119f8576119f86147e5565b9050602002810190611a0a9190614b8c565b611a1390614bc0565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611a69906148bb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a95906148bb565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611b485781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610612565b83158015611b6d5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611ba6576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610612565b6040808301516000908152600c60205220600181015415611bfb5782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161061291815260200190565b6040830151611c3e5782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161061291815260200190565b60208301511580611c5b57506020830151611c5b90600790612afe565b15611c92576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611cd457806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106129190614c93565b81548290600490611cf290640100000000900463ffffffff16614898565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611dd057611d3b8382815181106115d9576115d96147e5565b611d7357826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106129190614c93565b611dbf838281518110611d8857611d886147e5565b60200260200101518560030160008563ffffffff1663ffffffff168152602001908152602001600020612e9f90919063ffffffff16565b50611dc981614843565b9050611d1d565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff91821617845560408601516002850155602086015160018501819055611e269160079190612e9f16565b506040850151611e3890600990612e9f565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080611e9390614843565b90506119dc565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610612565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611fda576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610612565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156122d5576000868683818110612012576120126147e5565b90506020020160208101906120279190614230565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff16612096576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610612565b60008686858181106120aa576120aa6147e5565b90506020028101906120bc919061490e565b6120c59061494c565b805190915073ffffffffffffffffffffffffffffffffffffffff16612116576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061215357503373ffffffffffffffffffffffffffffffffffffffff861614155b1561218c576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610612565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061220857506020808201516040516121c59201613fdf565b60405160208183030381529060405280519060200120826001016040516020016121ef9190614d8f565b6040516020818303038152906040528051906020012014155b156122c157805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602081015160018301906122629082614a04565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516122b89190613fdf565b60405180910390a35b505050806122ce90614843565b9050611ff6565b505050505050565b61230d6040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b60008281526002602052604090819020815160a08101909252805482908290612335906148bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612361906148bb565b80156123ae5780601f10612383576101008083540402835291602001916123ae565b820191906000526020600020905b81548152906001019060200180831161239157829003601f168201915b505050505081526020016001820180546123c7906148bb565b80601f01602080910402602001604051908101604052809291908181526020018280546123f3906148bb565b80156124405780601f1061241557610100808354040283529160200191612440565b820191906000526020600020905b81548152906001019060200180831161242357829003601f168201915b5050509183525050600282015460209091019060ff1660038111156124675761246761445b565b60038111156124785761247861445b565b81526020016002820160019054906101000a900460ff1660018111156124a0576124a061445b565b60018111156124b1576124b161445b565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b6124ea612b19565b63ffffffff8089166000908152600d602052604081205464010000000090049091169081900361254e576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610612565b6125a0888888886040518060a001604052808f63ffffffff1681526020018761257690614898565b97508763ffffffff1681526020018a1515815260200189151581526020018860ff1681525061313f565b505050505050505050565b6125b3612b19565b600e805460009164010000000090910463ffffffff169060046125d583614898565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a08101835292835260019083015286151590820152841515606082015260ff8416608082015290915061266b90899089908990899061313f565b5050505050505050565b6060806126826003612e92565b915060006126906005612b9c565b835161269c9190614e38565b90508067ffffffffffffffff8111156126b7576126b7613d8e565b60405190808252806020026020018201604052801561271857816020015b6127056040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b8152602001906001900390816126d55790505b50915060008167ffffffffffffffff81111561273657612736613d8e565b60405190808252806020026020018201604052801561275f578160200160208202803683370190505b5090506000805b85518110156129ce576000868281518110612783576127836147e5565b602002602001015190506127a1816005612afe90919063ffffffff16565b6129bd5760008181526002602052604090819020815160a081019092528054829082906127cd906148bb565b80601f01602080910402602001604051908101604052809291908181526020018280546127f9906148bb565b80156128465780601f1061281b57610100808354040283529160200191612846565b820191906000526020600020905b81548152906001019060200180831161282957829003601f168201915b5050505050815260200160018201805461285f906148bb565b80601f016020809104026020016040519081016040528092919081815260200182805461288b906148bb565b80156128d85780601f106128ad576101008083540402835291602001916128d8565b820191906000526020600020905b8154815290600101906020018083116128bb57829003601f168201915b5050509183525050600282015460209091019060ff1660038111156128ff576128ff61445b565b60038111156129105761291061445b565b81526020016002820160019054906101000a900460ff1660018111156129385761293861445b565b60018111156129495761294961445b565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff166020909101528651879085908110612988576129886147e5565b6020026020010181905250808484815181106129a6576129a66147e5565b60209081029190910101526129ba83614843565b92505b506129c781614843565b9050612766565b5090949293505050565b606060006129e66009612e92565b90506000815167ffffffffffffffff811115612a0457612a04613d8e565b604051908082528060200260200182016040528015612a8b57816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612a225790505b50905060005b825181101561080957612abc838281518110612aaf57612aaf6147e5565b6020026020010151611071565b828281518110612ace57612ace6147e5565b602002602001018190525080612ae390614843565b9050612a91565b612af2612b19565b612afb81613983565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610612565b565b6000610475825490565b6000612b128383613a78565b6000612b128383613aa2565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612c6f57602002820191906000526020600020905b815481526020019060010190808311612c5b575b505050505090506000815167ffffffffffffffff811115612c9257612c92613d8e565b604051908082528060200260200182016040528015612cd857816020015b604080518082019091526000815260606020820152815260200190600190039081612cb05790505b50905060005b8151811015612df9576040518060400160405280848381518110612d0457612d046147e5565b60200260200101518152602001856003016000868581518110612d2957612d296147e5565b602002602001015181526020019081526020016000208054612d4a906148bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612d76906148bb565b8015612dc35780601f10612d9857610100808354040283529160200191612dc3565b820191906000526020600020905b815481529060010190602001808311612da657829003601f168201915b5050505050815250828281518110612ddd57612ddd6147e5565b602002602001018190525080612df290614843565b9050612cde565b506040805160e08101825263ffffffff8089166000818152600d6020818152868320548086168752948b168187015260ff680100000000000000008604811697870197909752690100000000000000000085048716151560608701529290915290526a010000000000000000000090049091161515608082015260a08101612e8085612e92565b81526020019190915295945050505050565b60606000612b1283613b95565b6000612b128383613bf1565b608081015173ffffffffffffffffffffffffffffffffffffffff1615612ff957608081015173ffffffffffffffffffffffffffffffffffffffff163b1580612fa4575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa29190614e4b565b155b15612ff95760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610612565b6000828152600260205260409020815182919081906130189082614a04565b506020820151600182019061302d9082614a04565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561306f5761306f61445b565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008360018111156130b6576130b661445b565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b805163ffffffff9081166000908152600d602090815260408083208286015190941683526001909301905220608082015160ff16158061319157506080820151859061318c906001614e68565b60ff16115b156131da5760808201516040517f25b4d61800000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101869052604401610612565b6001826020015163ffffffff1611156132ca57815163ffffffff166000908152600d60209081526040822090840151600191820191839161321b919061487b565b63ffffffff1663ffffffff168152602001908152602001600020905060005b61324382612b9c565b8110156132c757613272846000015163ffffffff16600c60006105938587600001612ba690919063ffffffff16565b50600c60006132818484612ba6565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556132c081614843565b905061323a565b50505b60005b8581101561350c576132fa8787838181106132ea576132ea6147e5565b8592602090910201359050612e9f565b61335b578251878783818110613312576133126147e5565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610612565b8260600151156134b257825163ffffffff16600c6000898985818110613383576133836147e5565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff16148015906133fd5750600c60008888848181106133ce576133ce6147e5565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff1615155b1561345f578251878783818110613416576134166147e5565b6040517f60b9df7300000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610612565b8251600c6000898985818110613477576134776147e5565b90506020020135815260200190815260200160002060000160086101000a81548163ffffffff021916908363ffffffff1602179055506134fc565b82516134fa9063ffffffff16600c60008a8a868181106134d4576134d46147e5565b905060200201358152602001908152602001600020600401612e9f90919063ffffffff16565b505b61350581614843565b90506132cd565b5060005b838110156137f8573685858381811061352b5761352b6147e5565b905060200281019061353d919061490e565b905061354b60038235612afe565b613584576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610612565b61359060058235612afe565b156135ca576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610612565b80356000908152600384016020526040812080546135e7906148bb565b905011156136335783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610612565b60005b87811015613745576136da8235600c60008c8c86818110613659576136596147e5565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110613689576136896147e5565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612afe90919063ffffffff16565b613735578888828181106136f0576136f06147e5565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610612565b61373e81614843565b9050613636565b506002830180546001810182556000918252602091829020833591015561376e90820182614e81565b8235600090815260038601602052604090209161378c919083614ee6565b5083516020808601516137e792918435908c908c906137ad90880188614e81565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c4092505050565b506137f181614843565b9050613510565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff90951694909417909355606086015186518316825284822080549115156a0100000000000000000000027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff9092169190911790556080860151865183168252848220805460ff9290921668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c158170365192613973929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610612565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110613a8f57613a8f6147e5565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613b8b576000613ac6600183614e38565b8554909150600090613ada90600190614e38565b9050818114613b3f576000866000018281548110613afa57613afa6147e5565b9060005260206000200154905080876000018481548110613b1d57613b1d6147e5565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613b5057613b50615001565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610475565b6000915050610475565b606081600001805480602002602001604051908101604052809291908181526020018280548015613be557602002820191906000526020600020905b815481526020019060010190808311613bd1575b50505050509050919050565b6000818152600183016020526040812054613c3857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610475565b506000610475565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff16156122d557600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613ce7908690869086908b908d90600401615030565b600060405180830381600087803b158015613d0157600080fd5b505af1158015613d15573d6000803e3d6000fd5b50505050505050505050565b508054613d2d906148bb565b6000825580601f10613d3d575050565b601f016020900490600052602060002090810190612afb9190613d75565b5080546000825590600052602060002090810190612afb91905b5b80821115613d8a5760008155600101613d76565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613de057613de0613d8e565b60405290565b60405160a0810167ffffffffffffffff81118282101715613de057613de0613d8e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e5057613e50613d8e565b604052919050565b600067ffffffffffffffff821115613e7257613e72613d8e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613eaf57600080fd5b8135613ec2613ebd82613e58565b613e09565b818152846020838601011115613ed757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613f0757600080fd5b823567ffffffffffffffff80821115613f1f57600080fd5b613f2b86838701613e9e565b93506020850135915080821115613f4157600080fd5b50613f4e85828601613e9e565b9150509250929050565b600060208284031215613f6a57600080fd5b5035919050565b60005b83811015613f8c578181015183820152602001613f74565b50506000910152565b60008151808452613fad816020860160208601613f71565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612b126020830184613f95565b60008083601f84011261400457600080fd5b50813567ffffffffffffffff81111561401c57600080fd5b6020830191508360208260051b850101111561106a57600080fd5b6000806020838503121561404a57600080fd5b823567ffffffffffffffff81111561406157600080fd5b61406d85828601613ff2565b90969095509350505050565b600081518084526020808501945080840160005b838110156140a95781518752958201959082019060010161408d565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561411057828403895281518051855285015160408686018190526140fc81870183613f95565b9a87019a95505050908401906001016140d2565b5091979650505050505050565b600063ffffffff8083511684528060208401511660208501525060ff604083015116604084015260608201511515606084015260808201511515608084015260a082015160e060a085015261417560e0850182614079565b905060c083015184820360c086015261418e82826140b4565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561420a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526141f885835161411d565b945092850192908501906001016141be565b5092979650505050505050565b803563ffffffff8116811461422b57600080fd5b919050565b60006020828403121561424257600080fd5b612b1282614217565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526142806040850182613f95565b949350505050565b602081526000612b12602083018461424b565b602081526000612b12602083018461411d565b600080604083850312156142c157600080fd5b6142ca83614217565b946020939093013593505050565b6040815260006142eb6040830185613f95565b828103602084015261418e8185613f95565b600063ffffffff80835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160e060a085015261435060e0850182614079565b905060c083015184820360c086015261418e8282614079565b602081526000612b1260208301846142fd565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561420a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143dd85835161424b565b945092850192908501906001016143a3565b6000806000806040858703121561440557600080fd5b843567ffffffffffffffff8082111561441d57600080fd5b61442988838901613ff2565b9096509450602087013591508082111561444257600080fd5b5061444f87828801613ff2565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000815160a0845261449f60a0850182613f95565b9050602083015184820360208601526144b88282613f95565b9150506040830151600481106144d0576144d061445b565b60408501526060830151600281106144ea576144ea61445b565b606085015260809283015173ffffffffffffffffffffffffffffffffffffffff1692909301919091525090565b602081526000612b12602083018461448a565b8015158114612afb57600080fd5b803560ff8116811461422b57600080fd5b60008060008060008060008060c0898b03121561456557600080fd5b61456e89614217565b9750602089013567ffffffffffffffff8082111561458b57600080fd5b6145978c838d01613ff2565b909950975060408b01359150808211156145b057600080fd5b506145bd8b828c01613ff2565b90965094505060608901356145d18161452a565b925060808901356145e18161452a565b91506145ef60a08a01614538565b90509295985092959890939650565b600080600080600080600060a0888a03121561461957600080fd5b873567ffffffffffffffff8082111561463157600080fd5b61463d8b838c01613ff2565b909950975060208a013591508082111561465657600080fd5b506146638a828b01613ff2565b90965094505060408801356146778161452a565b925060608801356146878161452a565b915061469560808901614538565b905092959891949750929550565b6040815260006146b66040830185614079565b6020838203818501528185518084528284019150828160051b85010183880160005b83811015614724577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087840301855261471283835161448a565b948601949250908501906001016146d8565b50909998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561420a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526147948583516142fd565b9450928501929085019060010161475a565b803573ffffffffffffffffffffffffffffffffffffffff8116811461422b57600080fd5b6000602082840312156147dc57600080fd5b612b12826147a6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361487457614874614814565b5060010190565b63ffffffff82811682821603908082111561080957610809614814565b600063ffffffff8083168181036148b1576148b1614814565b6001019392505050565b600181811c908216806148cf57607f821691505b602082108103614908577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261494257600080fd5b9190910192915050565b60006040823603121561495e57600080fd5b6040516040810167ffffffffffffffff828210818311171561498257614982613d8e565b8160405261498f856147a6565b835260208501359150808211156149a557600080fd5b506149b236828601613e9e565b60208301525092915050565b601f8211156106a657600081815260208120601f850160051c810160208610156149e55750805b601f850160051c820191505b818110156122d5578281556001016149f1565b815167ffffffffffffffff811115614a1e57614a1e613d8e565b614a3281614a2c84546148bb565b846149be565b602080601f831160018114614a855760008415614a4f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556122d5565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614ad257888601518255948401946001909101908401614ab3565b5085821015614b0e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614b3057600080fd5b815167ffffffffffffffff811115614b4757600080fd5b8201601f81018413614b5857600080fd5b8051614b66613ebd82613e58565b818152856020838501011115614b7b57600080fd5b61418e826020830160208601613f71565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261494257600080fd5b600060808236031215614bd257600080fd5b614bda613dbd565b614be383614217565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff80821115614c1457600080fd5b9085019036601f830112614c2757600080fd5b813581811115614c3957614c39613d8e565b8060051b9150614c4a848301613e09565b8181529183018401918481019036841115614c6457600080fd5b938501935b83851015614c8257843582529385019390850190614c69565b606087015250939695505050505050565b602081526000612b126020830184614079565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261494257600080fd5b80356002811061422b57600080fd5b600060a08236031215614cfb57600080fd5b614d03613de6565b823567ffffffffffffffff80821115614d1b57600080fd5b614d2736838701613e9e565b83526020850135915080821115614d3d57600080fd5b50614d4a36828601613e9e565b602083015250604083013560048110614d6257600080fd5b6040820152614d7360608401614cda565b6060820152614d84608084016147a6565b608082015292915050565b6000602080835260008454614da3816148bb565b80848701526040600180841660008114614dc45760018114614dfc57614e2a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614e2a565b896000528660002060005b85811015614e225781548b8201860152908301908801614e07565b8a0184019650505b509398975050505050505050565b8181038181111561047557610475614814565b600060208284031215614e5d57600080fd5b8151612b128161452a565b60ff818116838216019081111561047557610475614814565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614eb657600080fd5b83018035915067ffffffffffffffff821115614ed157600080fd5b60200191503681900382131561106a57600080fd5b67ffffffffffffffff831115614efe57614efe613d8e565b614f1283614f0c83546148bb565b836149be565b6000601f841160018114614f645760008515614f2e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614ffa565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614fb35786850135825560209485019460019092019101614f93565b5086821015614fee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561506957600080fd5b8560051b808860a0850137820182810360a0908101602085015261508f90820187613f95565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", + 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\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"CapabilityRequiredByDON\",\"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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"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\"}],\"name\":\"NodeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotExist\",\"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\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfCapabilitiesDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfWorkflowDON\",\"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\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeParams[]\",\"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\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo\",\"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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.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\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"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\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo\",\"name\":\"nodeInfo\",\"type\":\"tuple\"}],\"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\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"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\":\"structCapabilitiesRegistry.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\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61517380620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635e65e309116100ee5780638da5cb5b11610097578063d8bc7b6811610071578063d8bc7b68146103f6578063ddbe4f8214610409578063e29581aa1461041e578063f2fde38b1461043357600080fd5b80638da5cb5b1461039b5780639cb7c5f4146103c3578063d59a79f6146103e357600080fd5b806373ac22b4116100c857806373ac22b41461036d57806379ba50971461038057806386fa42461461038857600080fd5b80635e65e3091461033257806366acaa3314610345578063715f52951461035a57600080fd5b8063235374051161015b578063398f377311610135578063398f3773146102cb5780633f2a13c9146102de57806350c946fe146102ff5780635d83d9671461031f57600080fd5b80632353740514610285578063275459f2146102a55780632c01a1e8146102b857600080fd5b80631d05394c1161018c5780631d05394c1461023b578063214502431461025057806322bdbcbc1461026557600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613f39565b610446565b6040519081526020015b60405180910390f35b6101ec6101e7366004613f9d565b61047a565b60405190151581526020016101d0565b604080518082018252601a81527f4361706162696c6974696573526567697374727920312e302e30000000000000602082015290516101d09190614024565b61024e61024936600461407c565b610487565b005b6102586106aa565b6040516101d091906141dc565b610278610273366004614275565b61080f565b6040516101d091906142cd565b610298610293366004614275565b6108fc565b6040516101d091906142e0565b61024e6102b336600461407c565b610940565b61024e6102c636600461407c565b610a17565b61024e6102d936600461407c565b610cbc565b6102f16102ec3660046142f3565b610e84565b6040516101d092919061431d565b61031261030d366004613f9d565b611070565b6040516101d091906143e2565b61024e61032d36600461407c565b61114a565b61024e61034036600461407c565b611247565b61034d61198d565b6040516101d091906143f5565b61024e61036836600461407c565b611b78565b61024e61037b36600461407c565b611c33565b61024e61210f565b61024e610396366004614468565b61220c565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b6103d66103d1366004613f9d565b612552565b6040516101d091906145b7565b61024e6103f13660046145e9565b61278d565b61024e61040436600461469e565b612856565b610411612920565b6040516101d09190614743565b610426612a1d565b6040516101d091906147b6565b61024e61044136600461484d565b612b2f565b6000828260405160200161045b92919061431d565b6040516020818303038152906040528051906020012090505b92915050565b6000610474600583612b43565b61048f612b5e565b60005b818110156106a55760008383838181106104ae576104ae614868565b90506020020160208101906104c39190614275565b63ffffffff8181166000908152600d60209081526040808320805464010000000081049095168085526001820190935290832094955093909290916a010000000000000000000090910460ff16905b61051b83612be1565b8110156105c357811561057157600c60006105368584612beb565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556105b3565b6105b18663ffffffff16600c60006105928588612beb90919063ffffffff16565b8152602001908152602001600020600401612bf790919063ffffffff16565b505b6105bc816148c6565b9050610512565b508354640100000000900463ffffffff1660000361061a576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff861660048201526024015b60405180910390fd5b63ffffffff85166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a150505050508061069e906148c6565b9050610492565b505050565b600e54606090640100000000900463ffffffff1660006106cb6001836148fe565b63ffffffff1667ffffffffffffffff8111156106e9576106e9613dd3565b60405190808252806020026020018201604052801561077057816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816107075790505b509050600060015b8363ffffffff168163ffffffff1610156107ec5763ffffffff8082166000908152600d602052604090205416156107dc576107b281612c03565b8383815181106107c4576107c4614868565b6020026020010181905250816107d9906148c6565b91505b6107e58161491b565b9050610778565b506107f86001846148fe565b63ffffffff168114610808578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916108739061493e565b80601f016020809104026020016040519081016040528092919081815260200182805461089f9061493e565b80156108ec5780601f106108c1576101008083540402835291602001916108ec565b820191906000526020600020905b8154815290600101906020018083116108cf57829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261047482612c03565b610948612b5e565b60005b63ffffffff81168211156106a557600083838363ffffffff1681811061097357610973614868565b90506020020160208101906109889190614275565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559192506109d36001830182613d66565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a250610a108161491b565b905061094b565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb6576000848483818110610a5157610a51614868565b602090810292909201356000818152600c90935260409092206001810154929350919050610aae576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610611565b6000610abc82600401612be1565b1115610b1157610acf6004820184612beb565b6040517f60a6d89800000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101839052604401610611565b805468010000000000000000900463ffffffff1615610b795780546040517f60b9df730000000000000000000000000000000000000000000000000000000081526801000000000000000090910463ffffffff16600482015260248101839052604401610611565b83158015610bb35750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bec576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6001810154610bfd90600790612bf7565b506002810154610c0f90600990612bf7565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815560018101829055600281018290559060048201818181610c648282613da0565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c9b91815260200190565b60405180910390a1505080610caf906148c6565b9050610a35565b50505050565b610cc4612b5e565b60005b818110156106a5576000838383818110610ce357610ce3614868565b9050602002810190610cf59190614991565b610cfe906149cf565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d4f576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610ddb9082614a87565b5050600e8054909150600090610df69063ffffffff1661491b565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e699190614024565b60405180910390a3505080610e7d906148c6565b9050610cc7565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610ed69061493e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f029061493e565b8015610f4f5780601f10610f2457610100808354040283529160200191610f4f565b820191906000526020600020905b815481529060010190602001808311610f3257829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff16159150611062905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015611019573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261105f9190810190614ba1565b90505b9093509150505b9250929050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c08101919091526040805160e0810182526000848152600c6020908152838220805463ffffffff8082168652640100000000820481168487018190526801000000000000000090920416858701526001820154606086015260028201546080860152835260030190529190912060a082019061111f90612ed7565b8152602001611142600c6000868152602001908152602001600020600401612ed7565b905292915050565b611152612b5e565b60005b818110156106a557600083838381811061117157611171614868565b90506020020135905061118e816003612b4390919063ffffffff16565b6111c7576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b6111d2600582612ee4565b61120b576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b60405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250611240816148c6565b9050611155565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb657600084848381811061128157611281614868565b90506020028101906112939190614c0f565b61129c90614c43565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916112f29061493e565b80601f016020809104026020016040519081016040528092919081815260200182805461131e9061493e565b801561136b5780601f106113405761010080835404028352916020019161136b565b820191906000526020600020905b81548152906001019060200180831161134e57829003601f168201915b50505050508152505090508315801561139b5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113d4576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6040808301516000908152600c6020522060018101546114285782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6020830151611463576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810154602084015181146114e457602084015161148490600790612b43565b156114bb576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084015160018301556114d0600782612bf7565b5060208401516114e290600790612ee4565b505b6060840151805160000361152657806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614d16565b8254600090849060049061154790640100000000900463ffffffff1661491b565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060005b82518110156116345761159f83828151811061158757611587614868565b60200260200101516003612b4390919063ffffffff16565b6115d757826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614d16565b6116238382815181106115ec576115ec614868565b60200260200101518660030160008563ffffffff1663ffffffff168152602001908152602001600020612ee490919063ffffffff16565b5061162d816148c6565b9050611569565b50835468010000000000000000900463ffffffff16801561179d5763ffffffff8082166000908152600d6020908152604080832080546401000000009004909416835260019093018152828220600201805484518184028101840190955280855292939290918301828280156116c957602002820191906000526020600020905b8154815260200190600101908083116116b5575b5050505050905060005b815181101561179a576117288282815181106116f1576116f1614868565b60200260200101518860030160008763ffffffff1663ffffffff168152602001908152602001600020612b4390919063ffffffff16565b61178a5781818151811061173e5761173e614868565b6020026020010151836040517f03dcd86200000000000000000000000000000000000000000000000000000000815260040161061192919091825263ffffffff16602082015260400190565b611793816148c6565b90506116d3565b50505b60006117ab86600401612ed7565b905060005b81518163ffffffff1610156118f9576000828263ffffffff16815181106117d9576117d9614868565b60209081029190910181015163ffffffff8082166000908152600d8452604080822080546401000000009004909316825260019092018452818120600201805483518187028101870190945280845293955090939192909183018282801561186057602002820191906000526020600020905b81548152602001906001019080831161184c575b5050505050905060005b81518110156118e5576118bf82828151811061188857611888614868565b60200260200101518b60030160008a63ffffffff1663ffffffff168152602001908152602001600020612b4390919063ffffffff16565b6118d55781818151811061173e5761173e614868565b6118de816148c6565b905061186a565b505050806118f29061491b565b90506117b0565b50875186547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff90911690811787556040808a0151600289018190556020808c01518351928352908201527f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a2505050505050505080611986906148c6565b9050611265565b600e5460609063ffffffff1660006119a66001836148fe565b63ffffffff1667ffffffffffffffff8111156119c4576119c4613dd3565b604051908082528060200260200182016040528015611a0a57816020015b6040805180820190915260008152606060208201528152602001906001900390816119e25790505b509050600060015b8363ffffffff168163ffffffff161015611b625763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b525763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611aa69061493e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad29061493e565b8015611b1f5780601f10611af457610100808354040283529160200191611b1f565b820191906000526020600020905b815481529060010190602001808311611b0257829003601f168201915b505050505081525050838381518110611b3a57611b3a614868565b602002602001018190525081611b4f906148c6565b91505b611b5b8161491b565b9050611a12565b50600e546107f89060019063ffffffff166148fe565b611b80612b5e565b60005b818110156106a5576000838383818110611b9f57611b9f614868565b9050602002810190611bb19190614d5a565b611bba90614d9d565b90506000611bd082600001518360200151610446565b9050611bdd600382612ee4565b611c16576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b611c208183612ef0565b505080611c2c906148c6565b9050611b83565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610cb6576000848483818110611c6d57611c6d614868565b9050602002810190611c7f9190614c0f565b611c8890614c43565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611cde9061493e565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0a9061493e565b8015611d575780601f10611d2c57610100808354040283529160200191611d57565b820191906000526020600020905b815481529060010190602001808311611d3a57829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611dbd5781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610611565b83158015611de25750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611e1b576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6040808301516000908152600c60205220600181015415611e705782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6040830151611eb35782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60208301511580611ed057506020830151611ed090600790612b43565b15611f07576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611f4957806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614d16565b81548290600490611f6790640100000000900463ffffffff1661491b565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b825181101561204557611fb083828151811061158757611587614868565b611fe857826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614d16565b612034838281518110611ffd57611ffd614868565b60200260200101518560030160008563ffffffff1663ffffffff168152602001908152602001600020612ee490919063ffffffff16565b5061203e816148c6565b9050611f92565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9182161784556040860151600285015560208601516001850181905561209b9160079190612ee416565b5060408501516120ad90600990612ee4565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080612108906148c6565b9050611c51565b60015473ffffffffffffffffffffffffffffffffffffffff163314612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610611565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b82811461224f576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610611565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561254a57600086868381811061228757612287614868565b905060200201602081019061229c9190614275565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1661230b576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610611565b600086868581811061231f5761231f614868565b90506020028101906123319190614991565b61233a906149cf565b805190915073ffffffffffffffffffffffffffffffffffffffff1661238b576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1633148015906123c857503373ffffffffffffffffffffffffffffffffffffffff861614155b15612401576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061247d575060208082015160405161243a9201614024565b60405160208183030381529060405280519060200120826001016040516020016124649190614e43565b6040516020818303038152906040528051906020012014155b1561253657805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602081015160018301906124d79082614a87565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a28836020015160405161252d9190614024565b60405180910390a35b50505080612543906148c6565b905061226b565b505050505050565b6125936040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b6040805160e081018252838152600084815260026020908152929020805491928301916125bf9061493e565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb9061493e565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b505050505081526020016002600085815260200190815260200160002060010180546126639061493e565b80601f016020809104026020016040519081016040528092919081815260200182805461268f9061493e565b80156126dc5780601f106126b1576101008083540402835291602001916126dc565b820191906000526020600020905b8154815290600101906020018083116126bf57829003601f168201915b50505091835250506000848152600260208181526040909220015491019060ff16600381111561270e5761270e6144d4565b815260008481526002602081815260409092200154910190610100900460ff16600181111561273f5761273f6144d4565b81526000848152600260208181526040928390209091015462010000900473ffffffffffffffffffffffffffffffffffffffff169083015201612783600585612b43565b1515905292915050565b612795612b5e565b63ffffffff8089166000908152600d60205260408120546401000000009004909116908190036127f9576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610611565b61284b888888886040518060a001604052808f63ffffffff168152602001876128219061491b565b97508763ffffffff1681526020018a1515815260200189151581526020018860ff16815250613184565b505050505050505050565b61285e612b5e565b600e805460009164010000000090910463ffffffff169060046128808361491b565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a08101835292835260019083015286151590820152841515606082015260ff84166080820152909150612916908990899089908990613184565b5050505050505050565b6060600061292e6003612ed7565b90506000815167ffffffffffffffff81111561294c5761294c613dd3565b6040519080825280602002602001820160405280156129be57816020015b6129ab6040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b81526020019060019003908161296a5790505b50905060005b8251811015610808576129ef8382815181106129e2576129e2614868565b6020026020010151612552565b828281518110612a0157612a01614868565b602002602001018190525080612a16906148c6565b90506129c4565b60606000612a2b6009612ed7565b90506000815167ffffffffffffffff811115612a4957612a49613dd3565b604051908082528060200260200182016040528015612ad057816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612a675790505b50905060005b825181101561080857612b01838281518110612af457612af4614868565b6020026020010151611070565b828281518110612b1357612b13614868565b602002602001018190525080612b28906148c6565b9050612ad6565b612b37612b5e565b612b40816139c8565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610611565b565b6000610474825490565b6000612b578383613abd565b6000612b578383613ae7565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612cb457602002820191906000526020600020905b815481526020019060010190808311612ca0575b505050505090506000815167ffffffffffffffff811115612cd757612cd7613dd3565b604051908082528060200260200182016040528015612d1d57816020015b604080518082019091526000815260606020820152815260200190600190039081612cf55790505b50905060005b8151811015612e3e576040518060400160405280848381518110612d4957612d49614868565b60200260200101518152602001856003016000868581518110612d6e57612d6e614868565b602002602001015181526020019081526020016000208054612d8f9061493e565b80601f0160208091040260200160405190810160405280929190818152602001828054612dbb9061493e565b8015612e085780601f10612ddd57610100808354040283529160200191612e08565b820191906000526020600020905b815481529060010190602001808311612deb57829003601f168201915b5050505050815250828281518110612e2257612e22614868565b602002602001018190525080612e37906148c6565b9050612d23565b506040805160e08101825263ffffffff8089166000818152600d6020818152868320548086168752948b168187015260ff680100000000000000008604811697870197909752690100000000000000000085048716151560608701529290915290526a010000000000000000000090049091161515608082015260a08101612ec585612ed7565b81526020019190915295945050505050565b60606000612b5783613bda565b6000612b578383613c36565b608081015173ffffffffffffffffffffffffffffffffffffffff161561303e57608081015173ffffffffffffffffffffffffffffffffffffffff163b1580612fe9575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa158015612fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe79190614eec565b155b1561303e5760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610611565b60008281526002602052604090208151829190819061305d9082614a87565b50602082015160018201906130729082614a87565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018360038111156130b4576130b46144d4565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008360018111156130fb576130fb6144d4565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b805163ffffffff9081166000908152600d602090815260408083208286015190941683526001909301905220608082015160ff1615806131d65750608082015185906131d1906001614f09565b60ff16115b1561321f5760808201516040517f25b4d61800000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101869052604401610611565b6001826020015163ffffffff16111561330f57815163ffffffff166000908152600d60209081526040822090840151600191820191839161326091906148fe565b63ffffffff1663ffffffff168152602001908152602001600020905060005b61328882612be1565b81101561330c576132b7846000015163ffffffff16600c60006105928587600001612beb90919063ffffffff16565b50600c60006132c68484612beb565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff169055613305816148c6565b905061327f565b50505b60005b858110156135515761333f87878381811061332f5761332f614868565b8592602090910201359050612ee4565b6133a057825187878381811061335757613357614868565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610611565b8260600151156134f757825163ffffffff16600c60008989858181106133c8576133c8614868565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff16148015906134425750600c600088888481811061341357613413614868565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff1615155b156134a457825187878381811061345b5761345b614868565b6040517f60b9df7300000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610611565b8251600c60008989858181106134bc576134bc614868565b90506020020135815260200190815260200160002060000160086101000a81548163ffffffff021916908363ffffffff160217905550613541565b825161353f9063ffffffff16600c60008a8a8681811061351957613519614868565b905060200201358152602001908152602001600020600401612ee490919063ffffffff16565b505b61354a816148c6565b9050613312565b5060005b8381101561383d573685858381811061357057613570614868565b90506020028101906135829190614991565b905061359060038235612b43565b6135c9576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610611565b6135d560058235612b43565b1561360f576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610611565b803560009081526003840160205260408120805461362c9061493e565b905011156136785783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610611565b60005b8781101561378a5761371f8235600c60008c8c8681811061369e5761369e614868565b9050602002013581526020019081526020016000206003016000600c60008e8e888181106136ce576136ce614868565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612b4390919063ffffffff16565b61377a5788888281811061373557613735614868565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610611565b613783816148c6565b905061367b565b50600283018054600181018255600091825260209182902083359101556137b390820182614f22565b823560009081526003860160205260409020916137d1919083614f87565b50835160208086015161382c92918435908c908c906137f290880188614f22565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c8592505050565b50613836816148c6565b9050613555565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff90951694909417909355606086015186518316825284822080549115156a0100000000000000000000027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff9092169190911790556080860151865183168252848220805460ff9290921668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651926139b8929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610611565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110613ad457613ad4614868565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613bd0576000613b0b6001836150a2565b8554909150600090613b1f906001906150a2565b9050818114613b84576000866000018281548110613b3f57613b3f614868565b9060005260206000200154905080876000018481548110613b6257613b62614868565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613b9557613b956150b5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610474565b6000915050610474565b606081600001805480602002602001604051908101604052809291908181526020018280548015613c2a57602002820191906000526020600020905b815481526020019060010190808311613c16575b50505050509050919050565b6000818152600183016020526040812054613c7d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610474565b506000610474565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff161561254a57600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613d2c908690869086908b908d906004016150e4565b600060405180830381600087803b158015613d4657600080fd5b505af1158015613d5a573d6000803e3d6000fd5b50505050505050505050565b508054613d729061493e565b6000825580601f10613d82575050565b601f016020900490600052602060002090810190612b409190613dba565b5080546000825590600052602060002090810190612b4091905b5b80821115613dcf5760008155600101613dbb565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613e2557613e25613dd3565b60405290565b60405160a0810167ffffffffffffffff81118282101715613e2557613e25613dd3565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e9557613e95613dd3565b604052919050565b600067ffffffffffffffff821115613eb757613eb7613dd3565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ef457600080fd5b8135613f07613f0282613e9d565b613e4e565b818152846020838601011115613f1c57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613f4c57600080fd5b823567ffffffffffffffff80821115613f6457600080fd5b613f7086838701613ee3565b93506020850135915080821115613f8657600080fd5b50613f9385828601613ee3565b9150509250929050565b600060208284031215613faf57600080fd5b5035919050565b60005b83811015613fd1578181015183820152602001613fb9565b50506000910152565b60008151808452613ff2816020860160208601613fb6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612b576020830184613fda565b60008083601f84011261404957600080fd5b50813567ffffffffffffffff81111561406157600080fd5b6020830191508360208260051b850101111561106957600080fd5b6000806020838503121561408f57600080fd5b823567ffffffffffffffff8111156140a657600080fd5b6140b285828601614037565b90969095509350505050565b600081518084526020808501945080840160005b838110156140ee578151875295820195908201906001016140d2565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015614155578284038952815180518552850151604086860181905261414181870183613fda565b9a87019a9550505090840190600101614117565b5091979650505050505050565b600063ffffffff8083511684528060208401511660208501525060ff604083015116604084015260608201511515606084015260808201511515608084015260a082015160e060a08501526141ba60e08501826140be565b905060c083015184820360c08601526141d382826140f9565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561424f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261423d858351614162565b94509285019290850190600101614203565b5092979650505050505050565b803563ffffffff8116811461427057600080fd5b919050565b60006020828403121561428757600080fd5b612b578261425c565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526142c56040850182613fda565b949350505050565b602081526000612b576020830184614290565b602081526000612b576020830184614162565b6000806040838503121561430657600080fd5b61430f8361425c565b946020939093013593505050565b6040815260006143306040830185613fda565b82810360208401526141d38185613fda565b600063ffffffff808351168452602081818501511681860152816040850151166040860152606084015160608601526080840151608086015260a0840151915060e060a086015261439660e08601836140be565b60c08581015187830391880191909152805180835290830193506000918301905b808310156143d757845182529383019360019290920191908301906143b7565b509695505050505050565b602081526000612b576020830184614342565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561424f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614456858351614290565b9450928501929085019060010161441c565b6000806000806040858703121561447e57600080fd5b843567ffffffffffffffff8082111561449657600080fd5b6144a288838901614037565b909650945060208701359150808211156144bb57600080fd5b506144c887828801614037565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b805182526000602082015160e0602085015261452260e0850182613fda565b90506040830151848203604086015261453b8282613fda565b915050606083015160048110614553576145536144d4565b606085015260808301516002811061456d5761456d6144d4565b8060808601525060a083015161459b60a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c08301516145af60c086018215159052565b509392505050565b602081526000612b576020830184614503565b8015158114612b4057600080fd5b803560ff8116811461427057600080fd5b60008060008060008060008060c0898b03121561460557600080fd5b61460e8961425c565b9750602089013567ffffffffffffffff8082111561462b57600080fd5b6146378c838d01614037565b909950975060408b013591508082111561465057600080fd5b5061465d8b828c01614037565b9096509450506060890135614671816145ca565b92506080890135614681816145ca565b915061468f60a08a016145d8565b90509295985092959890939650565b600080600080600080600060a0888a0312156146b957600080fd5b873567ffffffffffffffff808211156146d157600080fd5b6146dd8b838c01614037565b909950975060208a01359150808211156146f657600080fd5b506147038a828b01614037565b9096509450506040880135614717816145ca565b92506060880135614727816145ca565b9150614735608089016145d8565b905092959891949750929550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561424f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526147a4858351614503565b9450928501929085019060010161476a565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561424f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614817858351614342565b945092850192908501906001016147dd565b803573ffffffffffffffffffffffffffffffffffffffff8116811461427057600080fd5b60006020828403121561485f57600080fd5b612b5782614829565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148f7576148f7614897565b5060010190565b63ffffffff82811682821603908082111561080857610808614897565b600063ffffffff80831681810361493457614934614897565b6001019392505050565b600181811c9082168061495257607f821691505b60208210810361498b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126149c557600080fd5b9190910192915050565b6000604082360312156149e157600080fd5b6040516040810167ffffffffffffffff8282108183111715614a0557614a05613dd3565b81604052614a1285614829565b83526020850135915080821115614a2857600080fd5b50614a3536828601613ee3565b60208301525092915050565b601f8211156106a557600081815260208120601f850160051c81016020861015614a685750805b601f850160051c820191505b8181101561254a57828155600101614a74565b815167ffffffffffffffff811115614aa157614aa1613dd3565b614ab581614aaf845461493e565b84614a41565b602080601f831160018114614b085760008415614ad25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561254a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b5557888601518255948401946001909101908401614b36565b5085821015614b9157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614bb357600080fd5b815167ffffffffffffffff811115614bca57600080fd5b8201601f81018413614bdb57600080fd5b8051614be9613f0282613e9d565b818152856020838501011115614bfe57600080fd5b6141d3826020830160208601613fb6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149c557600080fd5b600060808236031215614c5557600080fd5b614c5d613e02565b614c668361425c565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff80821115614c9757600080fd5b9085019036601f830112614caa57600080fd5b813581811115614cbc57614cbc613dd3565b8060051b9150614ccd848301613e4e565b8181529183018401918481019036841115614ce757600080fd5b938501935b83851015614d0557843582529385019390850190614cec565b606087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614d4e57835183529284019291840191600101614d32565b50909695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126149c557600080fd5b80356002811061427057600080fd5b600060a08236031215614daf57600080fd5b614db7613e2b565b823567ffffffffffffffff80821115614dcf57600080fd5b614ddb36838701613ee3565b83526020850135915080821115614df157600080fd5b50614dfe36828601613ee3565b602083015250604083013560048110614e1657600080fd5b6040820152614e2760608401614d8e565b6060820152614e3860808401614829565b608082015292915050565b6000602080835260008454614e578161493e565b80848701526040600180841660008114614e785760018114614eb057614ede565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614ede565b896000528660002060005b85811015614ed65781548b8201860152908301908801614ebb565b8a0184019650505b509398975050505050505050565b600060208284031215614efe57600080fd5b8151612b57816145ca565b60ff818116838216019081111561047457610474614897565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f5757600080fd5b83018035915067ffffffffffffffff821115614f7257600080fd5b60200191503681900382131561106957600080fd5b67ffffffffffffffff831115614f9f57614f9f613dd3565b614fb383614fad835461493e565b83614a41565b6000601f8411600181146150055760008515614fcf5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561509b565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156150545786850135825560209485019460019092019101615034565b508682101561508f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561047457610474614897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561511d57600080fd5b8560051b808860a0850137820182810360a0908101602085015261514390820187613fda565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000813000a", } var CapabilitiesRegistryABI = CapabilitiesRegistryMetaData.ABI @@ -216,55 +226,47 @@ func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorRaw) Transact(opts *b return _CapabilitiesRegistry.Contract.contract.Transact(opts, method, params...) } -func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapabilities(opts *bind.CallOpts) (GetCapabilities, - - error) { +func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapabilities(opts *bind.CallOpts) ([]CapabilitiesRegistryCapabilityInfo, error) { var out []interface{} err := _CapabilitiesRegistry.contract.Call(opts, &out, "getCapabilities") - outstruct := new(GetCapabilities) if err != nil { - return *outstruct, err + return *new([]CapabilitiesRegistryCapabilityInfo), err } - outstruct.HashedCapabilityIds = *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) - outstruct.Capabilities = *abi.ConvertType(out[1], new([]CapabilitiesRegistryCapability)).(*[]CapabilitiesRegistryCapability) + out0 := *abi.ConvertType(out[0], new([]CapabilitiesRegistryCapabilityInfo)).(*[]CapabilitiesRegistryCapabilityInfo) - return *outstruct, err + return out0, err } -func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapabilities() (GetCapabilities, - - error) { +func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapabilities() ([]CapabilitiesRegistryCapabilityInfo, error) { return _CapabilitiesRegistry.Contract.GetCapabilities(&_CapabilitiesRegistry.CallOpts) } -func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapabilities() (GetCapabilities, - - error) { +func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapabilities() ([]CapabilitiesRegistryCapabilityInfo, error) { return _CapabilitiesRegistry.Contract.GetCapabilities(&_CapabilitiesRegistry.CallOpts) } -func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapability, error) { +func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) { var out []interface{} err := _CapabilitiesRegistry.contract.Call(opts, &out, "getCapability", hashedId) if err != nil { - return *new(CapabilitiesRegistryCapability), err + return *new(CapabilitiesRegistryCapabilityInfo), err } - out0 := *abi.ConvertType(out[0], new(CapabilitiesRegistryCapability)).(*CapabilitiesRegistryCapability) + out0 := *abi.ConvertType(out[0], new(CapabilitiesRegistryCapabilityInfo)).(*CapabilitiesRegistryCapabilityInfo) return out0, err } -func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapability, error) { +func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) { return _CapabilitiesRegistry.Contract.GetCapability(&_CapabilitiesRegistry.CallOpts, hashedId) } -func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapability, error) { +func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) { return _CapabilitiesRegistry.Contract.GetCapability(&_CapabilitiesRegistry.CallOpts, hashedId) } @@ -2087,11 +2089,6 @@ func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseOwnershipTransfe return event, nil } -type GetCapabilities struct { - HashedCapabilityIds [][32]byte - Capabilities []CapabilitiesRegistryCapability -} - func (_CapabilitiesRegistry *CapabilitiesRegistry) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _CapabilitiesRegistry.abi.Events["CapabilityConfigured"].ID: @@ -2171,11 +2168,9 @@ func (_CapabilitiesRegistry *CapabilitiesRegistry) Address() common.Address { } type CapabilitiesRegistryInterface interface { - GetCapabilities(opts *bind.CallOpts) (GetCapabilities, - - error) + GetCapabilities(opts *bind.CallOpts) ([]CapabilitiesRegistryCapabilityInfo, error) - GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapability, error) + GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) GetCapabilityConfigs(opts *bind.CallOpts, donId uint32, capabilityId [32]byte) ([]byte, []byte, 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 4a0d0d7c5a0..1839ed8cb85 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 -capabilities_registry: ../../../contracts/solc/v0.8.19/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.19/CapabilitiesRegistry/CapabilitiesRegistry.bin 3a42a29db3b81e03f7fad6d872fa2182949643d8c1ed62c34a6af7520583eba4 +capabilities_registry: ../../../contracts/solc/v0.8.19/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.19/CapabilitiesRegistry/CapabilitiesRegistry.bin 010d0b7796300bfe2ab4bc7098d1bebbaf124bd75c5e8e36310dbef8bf532a17 forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin bd15b7c5cecc87d44cac0b8414627cfb2c0e1cdd554df60a50dcb682f9a05129 ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 144f23145878b95d1672e4919874eddeeaa38ce520d0edbe72c6677e39bb4741