From 6d8a253fc206562934f281a1b1f51d31cc1e7d42 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Thu, 16 May 2024 17:04:46 +0700 Subject: [PATCH] implement remove DONs in capability registry --- .changeset/metal-horses-count.md | 5 + contracts/.changeset/long-beans-turn.md | 5 + .../src/v0.8/keystone/CapabilityRegistry.sol | 22 +++ .../CapabilityRegistry_RemoveDONsTest.t.sol | 99 ++++++++++++ .../keystone_capability_registry.go | 147 +++++++++++++++++- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 6 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 .changeset/metal-horses-count.md create mode 100644 contracts/.changeset/long-beans-turn.md create mode 100644 contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveDONsTest.t.sol diff --git a/.changeset/metal-horses-count.md b/.changeset/metal-horses-count.md new file mode 100644 index 00000000000..5cb5e8331a9 --- /dev/null +++ b/.changeset/metal-horses-count.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal implement remove DONs in capability registry diff --git a/contracts/.changeset/long-beans-turn.md b/contracts/.changeset/long-beans-turn.md new file mode 100644 index 00000000000..3af5e4a2171 --- /dev/null +++ b/contracts/.changeset/long-beans-turn.md @@ -0,0 +1,5 @@ +--- +"@chainlink/contracts": patch +--- + +implement remove DONs in capability registry diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index be47dc7abe8..41a6a71b5d1 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -175,6 +175,14 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param isPublic True if the newly created DON is public event DONAdded(uint256 donId, bool isPublic); + /// @notice This event is emitted when a DON is removed + /// @param donId The ID of the removed DON + event DONRemoved(uint32 donId); + + /// @notice This error is emitted when a DON does not exist + /// @param donId The ID of the nonexistent DON + error DONDoesNotExist(uint32 donId); + /// @notice This error is thrown when trying to set the node's /// signer address to zero error InvalidNodeSigner(); @@ -559,6 +567,20 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { emit DONAdded(id, isPublic); } + /// @notice Removes DONs from the Capability Registry + /// @param donIds The IDs of the DON to be removed + function removeDONs(uint32[] calldata donIds) external onlyOwner { + for (uint256 i; i < donIds.length; ++i) { + uint32 donId = donIds[i]; + DON storage don = s_dons[donId]; + + // DON config count starts at index 1 + if (don.configCount == 0) revert DONDoesNotExist(donId); + delete s_dons[donId]; + emit DONRemoved(donId); + } + } + /// @notice Gets DON's data /// @param donId The DON ID /// @return uint32 The DON ID diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveDONsTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveDONsTest.t.sol new file mode 100644 index 00000000000..36d29b0a107 --- /dev/null +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveDONsTest.t.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import {BaseTest} from "./BaseTest.t.sol"; + +import {CapabilityRegistry} from "../CapabilityRegistry.sol"; + +contract CapabilityRegistry_RemoveDONsTest is BaseTest { + event DONRemoved(uint32 donId); + + uint32 private constant DON_ID = 1; + uint32 private constant TEST_NODE_OPERATOR_ONE_ID = 0; + uint256 private constant TEST_NODE_OPERATOR_TWO_ID = 1; + bytes32 private constant INVALID_P2P_ID = bytes32("fake-p2p"); + bytes private constant CONFIG = bytes("onchain-config"); + + function setUp() public override { + BaseTest.setUp(); + + s_capabilityRegistry.addNodeOperators(_getNodeOperators()); + s_capabilityRegistry.addCapability(s_basicCapability); + s_capabilityRegistry.addCapability(s_capabilityWithConfigurationContract); + + CapabilityRegistry.NodeParams[] memory nodes = new CapabilityRegistry.NodeParams[](2); + bytes32[] memory capabilityIds = new bytes32[](2); + capabilityIds[0] = s_basicHashedCapabilityId; + capabilityIds[1] = s_capabilityWithConfigurationContractId; + + nodes[0] = CapabilityRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID, + signer: NODE_OPERATOR_ONE_SIGNER_ADDRESS, + hashedCapabilityIds: capabilityIds + }); + + bytes32[] memory nodeTwoCapabilityIds = new bytes32[](1); + nodeTwoCapabilityIds[0] = s_basicHashedCapabilityId; + + nodes[1] = CapabilityRegistry.NodeParams({ + nodeOperatorId: TEST_NODE_OPERATOR_ONE_ID, + p2pId: P2P_ID_TWO, + signer: NODE_OPERATOR_TWO_SIGNER_ADDRESS, + hashedCapabilityIds: nodeTwoCapabilityIds + }); + + changePrank(NODE_OPERATOR_ONE_ADMIN); + s_capabilityRegistry.addNodes(nodes); + + CapabilityRegistry.CapabilityConfiguration[] + memory capabilityConfigs = new CapabilityRegistry.CapabilityConfiguration[](1); + capabilityConfigs[0] = CapabilityRegistry.CapabilityConfiguration({ + capabilityId: s_basicHashedCapabilityId, + config: CONFIG + }); + + bytes32[] memory nodeIds = new bytes32[](2); + nodeIds[0] = P2P_ID; + nodeIds[1] = P2P_ID_TWO; + + changePrank(ADMIN); + s_capabilityRegistry.addDON(nodeIds, capabilityConfigs, true); + } + + function test_RevertWhen_CalledByNonAdmin() public { + uint32[] memory donIDs = new uint32[](1); + donIDs[0] = 1; + changePrank(STRANGER); + vm.expectRevert("Only callable by owner"); + s_capabilityRegistry.removeDONs(donIDs); + } + + function test_RevertWhen_DONDoesNotExist() public { + uint32 invalidDONId = 10; + uint32[] memory donIDs = new uint32[](1); + donIDs[0] = invalidDONId; + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.DONDoesNotExist.selector, invalidDONId)); + s_capabilityRegistry.removeDONs(donIDs); + } + + function test_RemovesDON() public { + uint32[] memory donIDs = new uint32[](1); + donIDs[0] = DON_ID; + vm.expectEmit(true, true, true, true, address(s_capabilityRegistry)); + emit DONRemoved(DON_ID); + s_capabilityRegistry.removeDONs(donIDs); + + ( + uint32 id, + bool isPublic, + bytes32[] memory donNodes, + CapabilityRegistry.CapabilityConfiguration[] memory donCapabilityConfigs + ) = s_capabilityRegistry.getDON(DON_ID); + assertEq(id, 0); + assertEq(isPublic, false); + assertEq(donCapabilityConfigs.length, 0); + assertEq(s_capabilityRegistry.getDONCapabilityConfig(DON_ID, s_basicHashedCapabilityId), bytes("")); + assertEq(donNodes.length, 0); + } +} diff --git a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go index 8198a3a69f8..b3b5f3f7be7 100644 --- a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go +++ b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go @@ -55,8 +55,8 @@ type CapabilityRegistryNodeParams struct { } var CapabilityRegistryMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"donId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"DONAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"capability\",\"type\":\"tuple\"}],\"name\":\"addCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"deprecateCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getDONCapabilityConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052600b805463ffffffff191660011790553480156200002157600080fd5b503380600081620000795760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ac57620000ac81620000b5565b50505062000160565b336001600160a01b038216036200010f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000070565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6134fe80620001706000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806350e03b16116100d85780638da5cb5b1161008c578063b06e07a711610066578063b06e07a71461038f578063ddbe4f82146103a2578063f2fde38b146103b757600080fd5b80638da5cb5b146103345780639cb7c5f41461035c578063ae3c241c1461037c57600080fd5b806365c14dc7116100bd57806365c14dc7146102f95780636ae5c5911461031957806379ba50971461032c57600080fd5b806350e03b16146102d35780635840cd45146102e657600080fd5b8063235374051161012f57806336b402fb1161011457806336b402fb14610257578063398f37731461029f57806350c946fe146102b257600080fd5b806323537405146102215780632c01a1e81461024457600080fd5b8063125700111161016057806312570011146101a4578063181f5a77146101cc5780631cdf63431461020e57600080fd5b80630c5801e31461017c578063117392ce14610191575b600080fd5b61018f61018a366004612726565b6103ca565b005b61018f61019f366004612792565b6106db565b6101b76101b23660046127aa565b610926565b60405190151581526020015b60405180910390f35b60408051808201909152601881527f4361706162696c697479526567697374727920312e302e30000000000000000060208201525b6040516101c39190612827565b61018f61021c36600461283a565b610939565b61023461022f366004612895565b6109fc565b6040516101c394939291906128eb565b61018f61025236600461283a565b610c55565b6102916102653660046129a3565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101c3565b61018f6102ad36600461283a565b610ed3565b6102c56102c03660046127aa565b61106c565b6040516101c39291906129c5565b61018f6102e136600461283a565b61112e565b61018f6102f436600461283a565b61160f565b61030c6103073660046127aa565b611aa9565b6040516101c39190612a67565b61018f610327366004612ab8565b611b8f565b61018f611f8b565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b61036f61036a3660046127aa565b612088565b6040516101c39190612bdb565b61018f61038a3660046127aa565b612132565b61020161039d366004612be9565b6121fd565b6103aa6122d2565b6040516101c39190612c13565b61018f6103c5366004612c83565b612417565b828114610412576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156106d357600086868381811061044a5761044a612ca0565b905060200201359050600085858481811061046757610467612ca0565b90506020028101906104799190612ccf565b61048290612dd7565b805190915073ffffffffffffffffffffffffffffffffffffffff166104d3576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061051057503373ffffffffffffffffffffffffffffffffffffffff851614155b15610547576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff90811691161415806105f9575060208082015160405161058d9201612827565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000868152600783529290922091926105e0926001019101612ef0565b6040516020818303038152906040528051906020012014155b156106c0578051600083815260076020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921782558201516001909101906106669082612fdf565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f14c8f513e8a6d86d2d16b0cb64976de4e72386c4f8068eca3b7354373f8fe97a8383602001516040516106b79291906130f9565b60405180910390a25b5050806106cc90613141565b905061042e565b505050505050565b6106e361242b565b60408051823560208281019190915280840135828401528251808303840181526060909201909252805191012061071b6003826124ae565b15610752576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107646080840160608501612c83565b73ffffffffffffffffffffffffffffffffffffffff16146108cf5761078f6080830160608401612c83565b73ffffffffffffffffffffffffffffffffffffffff163b158061086f57506107bd6080830160608401612c83565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f884efe6100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff91909116906301ffc9a790602401602060405180830381865afa158015610849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086d9190613179565b155b156108cf576108846080830160608401612c83565b6040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610409565b6108da6003826124c9565b50600081815260026020526040902082906108f58282613196565b505060405181907f65610e5677eedff94555572640e442f89848a109ef8593fa927ac30b2565ff0690600090a25050565b60006109336005836124ae565b92915050565b61094161242b565b60005b818110156109f757600083838381811061096057610960612ca0565b60209081029290920135600081815260079093526040832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559093509190506109b1600183018261268c565b50506040518181527f1e5877d7b3001d1569bf733b76c7eceda58bd6c031e5b8d0b7042308ba2e9d4f9060200160405180910390a1506109f081613141565b9050610944565b505050565b63ffffffff808216600090815260096020908152604080832080546401000000009004909416808452600190940182528083206002810180548351818602810186019094528084529495869560609586959294938893929091830182828015610a8457602002820191906000526020600020905b815481526020019060010190808311610a70575b505050505090506000815167ffffffffffffffff811115610aa757610aa7612d0d565b604051908082528060200260200182016040528015610aed57816020015b604080518082019091526000815260606020820152815260200190600190039081610ac55790505b50905060005b8151811015610c0e576040518060400160405280848381518110610b1957610b19612ca0565b60200260200101518152602001856003016000868581518110610b3e57610b3e612ca0565b602002602001015181526020019081526020016000208054610b5f90612ea3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8b90612ea3565b8015610bd85780601f10610bad57610100808354040283529160200191610bd8565b820191906000526020600020905b815481529060010190602001808311610bbb57829003601f168201915b5050505050815250828281518110610bf257610bf2612ca0565b602002602001018190525080610c0790613141565b9050610af3565b5063ffffffff8981166000908152600960205260409020549081169068010000000000000000900460ff16610c42856124d5565b9199509750955093505050509193509193565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610ecd576000848483818110610c8f57610c8f612ca0565b60209081029290920135600081815260089093526040909220549192505068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16151580610d0b576040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260048101839052602401610409565b60008281526008602090815260408083205463ffffffff168352600782528083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610d6590612ea3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9190612ea3565b8015610dde5780601f10610db357610100808354040283529160200191610dde565b820191906000526020600020905b815481529060010190602001808311610dc157829003601f168201915b505050505081525050905084158015610e0e5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610e45576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602052604080822080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010191909155517f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320590610eb19085815260200190565b60405180910390a150505080610ec690613141565b9050610c73565b50505050565b610edb61242b565b60005b818110156109f7576000838383818110610efa57610efa612ca0565b9050602002810190610f0c9190612ccf565b610f1590612dd7565b805190915073ffffffffffffffffffffffffffffffffffffffff16610f66576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815260008681526007909252939020825181547fffffffffffffffffffffffff000000000000000000000000000000000000000016921691909117815591519091906001820190610fe99082612fdf565b50905050600a60008154610ffc90613141565b909155508151602083015160405173ffffffffffffffffffffffffffffffffffffffff909216917fda6697b182650034bd205cdc2dbfabb06bdb3a0a83a2b45bfefa3c4881284e0b91611051918591906130f9565b60405180910390a250508061106590613141565b9050610ede565b604080516080810182526000808252602082018190529181019190915260608082015260408051608081018252600084815260086020908152838220805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff680100000000000000008304168487015260018301548688015264010000000090910416835260020190529182206060820190611105906124d5565b905260009384526008602052604090932054929364010000000090930463ffffffff1692915050565b60005b818110156109f757600083838381811061114d5761114d612ca0565b905060200281019061115f9190613218565b6111689061324c565b9050600061118b60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916111e890612ea3565b80601f016020809104026020016040519081016040528092919081815260200182805461121490612ea3565b80156112615780601f1061123657610100808354040283529160200191611261565b820191906000526020600020905b81548152906001019060200180831161124457829003601f168201915b5050505050815250509050811580156112915750805173ffffffffffffffffffffffffffffffffffffffff163314155b156112c8576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615158061133d5783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161040991815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff1661138e576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606084015180516000036113d057806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016104099190613328565b60408581015160009081526008602052208054640100000000900463ffffffff169060046113fd8361333b565b82546101009290920a63ffffffff8181021990931691831602179091556040878101516000908152600860205290812054640100000000900490911691505b82518110156115085761147283828151811061145a5761145a612ca0565b602002602001015160036124ae90919063ffffffff16565b6114aa57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016104099190613328565b6114f78382815181106114bf576114bf612ca0565b6020908102919091018101516040808b015160009081526008845281812063ffffffff8089168352600290910190945220916124c916565b5061150181613141565b905061143c565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b018051845184529285902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9586160217905592518b5193518551918252939095169085015216908201527f6bbba867c646be512c2f3241e65fdffdefd5528d7e7939649e06e10ee5addc3e9060600160405180910390a15050505050508061160890613141565b9050611131565b60005b818110156109f757600083838381811061162e5761162e612ca0565b90506020028101906116409190613218565b6116499061324c565b9050600061166c60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff908116835260018201805496909116331496509394919390928401916116c990612ea3565b80601f01602080910402602001604051908101604052809291908181526020018280546116f590612ea3565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b5050505050815250509050811580156117725750805173ffffffffffffffffffffffffffffffffffffffff163314155b156117a9576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16151580806117ed57506040840151155b1561182c5783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161040991815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff1661187d576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606084015180516000036118bf57806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016104099190613328565b604085810151600090815260086020522080546004906118ec90640100000000900463ffffffff1661333b565b82546101009290920a63ffffffff81810219909316918316021790915560408681015160009081526008602052908120546401000000009004909116905b82518110156119a65761194883828151811061145a5761145a612ca0565b61198057826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016104099190613328565b6119958382815181106114bf576114bf612ca0565b5061199f81613141565b905061192a565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b0151835183529184902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9094169390930292909217909155905189518351918252909316908301527f5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f910160405180910390a150505050505080611aa290613141565b9050611612565b6040805180820190915260008152606060208201526000828152600760209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611b0690612ea3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3290612ea3565b8015611b7f5780601f10611b5457610100808354040283529160200191611b7f565b820191906000526020600020905b815481529060010190602001808311611b6257829003601f168201915b5050505050815250509050919050565b611b9761242b565b600b5463ffffffff16600081815260096020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffff0000000016851768010000000000000000871515021781556001808552908101909252822090915b87811015611c8d576000898983818110611c1457611c14612ca0565b60200291909101359150611c2a905083826124ae565b15611c70576040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015260248101829052604401610409565b611c7a83826124c9565b505080611c8690613141565b9050611bf8565b5060005b85811015611ebf5736878783818110611cac57611cac612ca0565b9050602002810190611cbe9190612ccf565b90508035611ccd6003826124ae565b611d06576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b611d116005826124ae565b15611d4b576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b600081815260038501602052604081208054611d6690612ea3565b90501115611daf576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260248101829052604401610409565b60005b8a811015611e675760008c8c83818110611dce57611dce612ca0565b602090810292909201356000818152600884526040808220805463ffffffff6401000000009091048116845260029091019095529020909350611e169290915085906124ae16565b611e56576040517fa7e792500000000000000000000000000000000000000000000000000000000081526004810182905260248101849052604401610409565b50611e6081613141565b9050611db2565b50600284018054600181018255600091825260209182902001829055611e8f9083018361335e565b6000838152600387016020526040902091611eab9190836133c3565b50505080611eb890613141565b9050611c91565b5063ffffffff838116600090815260096020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1664010000000086851602179055600b80549092611f17911661333b565b91906101000a81548163ffffffff021916908363ffffffff1602179055507fab55f4c8fb4335a586285ae209d1f1e17a7ccb22e1131963624434d98c8546a58385604051611f7992919063ffffffff9290921682521515602082015260400190565b60405180910390a15050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610409565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff16908111156120f1576120f1612b3c565b600181111561210257612102612b3c565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61213a61242b565b6121456003826124ae565b61217e576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b6121896005826124ae565b156121c3576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610409565b6121ce6005826124c9565b5060405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250565b63ffffffff8083166000908152600960209081526040808320805464010000000090049094168084526001909401825280832085845260030190915290208054606092919061224b90612ea3565b80601f016020809104026020016040519081016040528092919081815260200182805461227790612ea3565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b505050505091505092915050565b606060006122e060036124d5565b905060006122ee60056124e2565b82516122fa91906134de565b67ffffffffffffffff81111561231257612312612d0d565b60405190808252806020026020018201604052801561238257816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816123305790505b5090506000805b835181101561240e5760008482815181106123a6576123a6612ca0565b602002602001015190506123c48160056124ae90919063ffffffff16565b6123fd576123d181612088565b8484815181106123e3576123e3612ca0565b602002602001018190525082806123f990613141565b9350505b5061240781613141565b9050612389565b50909392505050565b61241f61242b565b612428816124ec565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610409565b565b600081815260018301602052604081205415155b9392505050565b60006124c283836125e1565b606060006124c283612630565b6000610933825490565b3373ffffffffffffffffffffffffffffffffffffffff82160361256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610409565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205461262857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610933565b506000610933565b60608160000180548060200260200160405190810160405280929190818152602001828054801561268057602002820191906000526020600020905b81548152602001906001019080831161266c575b50505050509050919050565b50805461269890612ea3565b6000825580601f106126a8575050565b601f01602090049060005260206000209081019061242891905b808211156126d657600081556001016126c2565b5090565b60008083601f8401126126ec57600080fd5b50813567ffffffffffffffff81111561270457600080fd5b6020830191508360208260051b850101111561271f57600080fd5b9250929050565b6000806000806040858703121561273c57600080fd5b843567ffffffffffffffff8082111561275457600080fd5b612760888389016126da565b9096509450602087013591508082111561277957600080fd5b50612786878288016126da565b95989497509550505050565b6000608082840312156127a457600080fd5b50919050565b6000602082840312156127bc57600080fd5b5035919050565b6000815180845260005b818110156127e9576020818501810151868301820152016127cd565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006124c260208301846127c3565b6000806020838503121561284d57600080fd5b823567ffffffffffffffff81111561286457600080fd5b612870858286016126da565b90969095509350505050565b803563ffffffff8116811461289057600080fd5b919050565b6000602082840312156128a757600080fd5b6124c28261287c565b600081518084526020808501945080840160005b838110156128e0578151875295820195908201906001016128c4565b509495945050505050565b63ffffffff851681526000602085151581840152604060808185015261291460808501876128b0565b8481036060860152855180825283820190600581901b8301850185890160005b83811015612991578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001855281518051845288015188840188905261297e888501826127c3565b9589019593505090870190600101612934565b50909c9b505050505050505050505050565b600080604083850312156129b657600080fd5b50508035926020909101359150565b60408152600060c0820163ffffffff8551166040840152602073ffffffffffffffffffffffffffffffffffffffff81870151166060850152604086015160808501526060860151608060a086015282815180855260e0870191508383019450600092505b80831015612a495784518252938301936001929092019190830190612a29565b5063ffffffff8716838701529350612a5e9050565b50509392505050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260006020830151604080840152612aa260608401826127c3565b949350505050565b801515811461242857600080fd5b600080600080600060608688031215612ad057600080fd5b853567ffffffffffffffff80821115612ae857600080fd5b612af489838a016126da565b90975095506020880135915080821115612b0d57600080fd5b50612b1a888289016126da565b9094509250506040860135612b2e81612aaa565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110612bb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b608081016109338284612b6b565b60008060408385031215612bfc57600080fd5b612c058361287c565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612c5557612c42838551612b6b565b9284019260809290920191600101612c2f565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461242857600080fd5b600060208284031215612c9557600080fd5b81356124c281612c61565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112612d0357600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612d5f57612d5f612d0d565b60405290565b6040516080810167ffffffffffffffff81118282101715612d5f57612d5f612d0d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612dcf57612dcf612d0d565b604052919050565b600060408236031215612de957600080fd5b612df1612d3c565b8235612dfc81612c61565b815260208381013567ffffffffffffffff80821115612e1a57600080fd5b9085019036601f830112612e2d57600080fd5b813581811115612e3f57612e3f612d0d565b612e6f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612d88565b91508082523684828501011115612e8557600080fd5b80848401858401376000908201840152918301919091525092915050565b600181811c90821680612eb757607f821691505b6020821081036127a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454612f0481612ea3565b80848701526040600180841660008114612f255760018114612f5d57612f8b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612f8b565b896000528660002060005b85811015612f835781548b8201860152908301908801612f68565b8a0184019650505b509398975050505050505050565b601f8211156109f757600081815260208120601f850160051c81016020861015612fc05750805b601f850160051c820191505b818110156106d357828155600101612fcc565b815167ffffffffffffffff811115612ff957612ff9612d0d565b61300d816130078454612ea3565b84612f99565b602080601f831160018114613060576000841561302a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106d3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156130ad5788860151825594840194600190910190840161308e565b50858210156130e957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000612aa260408301846127c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361317257613172613112565b5060010190565b60006020828403121561318b57600080fd5b81516124c281612aaa565b8135815560208201356001820155600281016040830135600281106131ba57600080fd5b815460608501356131ca81612c61565b74ffffffffffffffffffffffffffffffffffffffff008160081b1660ff84167fffffffffffffffffffffff000000000000000000000000000000000000000000841617178455505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612d0357600080fd5b60006080823603121561325e57600080fd5b613266612d65565b61326f8361287c565b815260208084013561328081612c61565b8282015260408481013590830152606084013567ffffffffffffffff808211156132a957600080fd5b9085019036601f8301126132bc57600080fd5b8135818111156132ce576132ce612d0d565b8060051b91506132df848301612d88565b81815291830184019184810190368411156132f957600080fd5b938501935b83851015613317578435825293850193908501906132fe565b606087015250939695505050505050565b6020815260006124c260208301846128b0565b600063ffffffff80831681810361335457613354613112565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261339357600080fd5b83018035915067ffffffffffffffff8211156133ae57600080fd5b60200191503681900382131561271f57600080fd5b67ffffffffffffffff8311156133db576133db612d0d565b6133ef836133e98354612ea3565b83612f99565b6000601f841160018114613441576000851561340b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556134d7565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156134905786850135825560209485019460019092019101613470565b50868210156134cb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b818103818111156109335761093361311256fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"donId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"DONAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"capability\",\"type\":\"tuple\"}],\"name\":\"addCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"deprecateCapability\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getDONCapabilityConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"labelledName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nodeOperatorId\",\"type\":\"uint256\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint256[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052600b805463ffffffff191660011790553480156200002157600080fd5b503380600081620000795760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000ac57620000ac81620000b5565b50505062000160565b336001600160a01b038216036200010f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000070565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61364180620001706000396000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806350e03b16116100d85780638da5cb5b1161008c578063b06e07a711610066578063b06e07a7146103ad578063ddbe4f82146103c0578063f2fde38b146103d557600080fd5b80638da5cb5b146103525780639cb7c5f41461037a578063ae3c241c1461039a57600080fd5b806365c14dc7116100bd57806365c14dc7146103175780636ae5c5911461033757806379ba50971461034a57600080fd5b806350e03b16146102f15780635840cd451461030457600080fd5b80631d05394c1161013a57806336b402fb1161011457806336b402fb14610275578063398f3773146102bd57806350c946fe146102d057600080fd5b80631d05394c1461022c578063235374051461023f5780632c01a1e81461026257600080fd5b8063125700111161016b57806312570011146101af578063181f5a77146101d75780631cdf63431461021957600080fd5b80630c5801e314610187578063117392ce1461019c575b600080fd5b61019a610195366004612869565b6103e8565b005b61019a6101aa3660046128d5565b6106f9565b6101c26101bd3660046128ed565b610944565b60405190151581526020015b60405180910390f35b60408051808201909152601881527f4361706162696c697479526567697374727920312e302e30000000000000000060208201525b6040516101ce919061296a565b61019a61022736600461297d565b610957565b61019a61023a36600461297d565b610a1a565b61025261024d3660046129d8565b610b3f565b6040516101ce9493929190612a2e565b61019a61027036600461297d565b610d98565b6102af610283366004612ae6565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040519081526020016101ce565b61019a6102cb36600461297d565b611016565b6102e36102de3660046128ed565b6111af565b6040516101ce929190612b08565b61019a6102ff36600461297d565b611271565b61019a61031236600461297d565b611752565b61032a6103253660046128ed565b611bec565b6040516101ce9190612baa565b61019a610345366004612bfb565b611cd2565b61019a6120ce565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ce565b61038d6103883660046128ed565b6121cb565b6040516101ce9190612d1e565b61019a6103a83660046128ed565b612275565b61020c6103bb366004612d2c565b612340565b6103c8612415565b6040516101ce9190612d56565b61019a6103e3366004612dc6565b61255a565b828114610430576040517fab8b67c600000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044015b60405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff16905b848110156106f157600086868381811061046857610468612de3565b905060200201359050600085858481811061048557610485612de3565b90506020028101906104979190612e12565b6104a090612f1a565b805190915073ffffffffffffffffffffffffffffffffffffffff166104f1576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061052e57503373ffffffffffffffffffffffffffffffffffffffff851614155b15610565576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614158061061757506020808201516040516105ab920161296a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000868152600783529290922091926105fe926001019101613033565b6040516020818303038152906040528051906020012014155b156106de578051600083815260076020908152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921782558201516001909101906106849082613122565b50806000015173ffffffffffffffffffffffffffffffffffffffff167f14c8f513e8a6d86d2d16b0cb64976de4e72386c4f8068eca3b7354373f8fe97a8383602001516040516106d592919061323c565b60405180910390a25b5050806106ea90613284565b905061044c565b505050505050565b61070161256e565b6040805182356020828101919091528084013582840152825180830384018152606090920190925280519101206107396003826125f1565b15610770576040517fe288638f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107826080840160608501612dc6565b73ffffffffffffffffffffffffffffffffffffffff16146108ed576107ad6080830160608401612dc6565b73ffffffffffffffffffffffffffffffffffffffff163b158061088d57506107db6080830160608401612dc6565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f884efe6100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff91909116906301ffc9a790602401602060405180830381865afa158015610867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088b91906132bc565b155b156108ed576108a26080830160608401612dc6565b6040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610427565b6108f860038261260c565b506000818152600260205260409020829061091382826132d9565b505060405181907f65610e5677eedff94555572640e442f89848a109ef8593fa927ac30b2565ff0690600090a25050565b60006109516005836125f1565b92915050565b61095f61256e565b60005b81811015610a1557600083838381811061097e5761097e612de3565b60209081029290920135600081815260079093526040832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681559093509190506109cf60018301826127cf565b50506040518181527f1e5877d7b3001d1569bf733b76c7eceda58bd6c031e5b8d0b7042308ba2e9d4f9060200160405180910390a150610a0e81613284565b9050610962565b505050565b610a2261256e565b60005b81811015610a15576000838383818110610a4157610a41612de3565b9050602002016020810190610a5691906129d8565b63ffffffff808216600090815260096020526040812080549394509264010000000090049091169003610abd576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610427565b63ffffffff821660008181526009602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000016905590519182527f7c551c5f33df1b67ff1dee6d812a4a2ea076c2a5bea7d3da390a75619df1553e910160405180910390a1505080610b3890613284565b9050610a25565b63ffffffff808216600090815260096020908152604080832080546401000000009004909416808452600190940182528083206002810180548351818602810186019094528084529495869560609586959294938893929091830182828015610bc757602002820191906000526020600020905b815481526020019060010190808311610bb3575b505050505090506000815167ffffffffffffffff811115610bea57610bea612e50565b604051908082528060200260200182016040528015610c3057816020015b604080518082019091526000815260606020820152815260200190600190039081610c085790505b50905060005b8151811015610d51576040518060400160405280848381518110610c5c57610c5c612de3565b60200260200101518152602001856003016000868581518110610c8157610c81612de3565b602002602001015181526020019081526020016000208054610ca290612fe6565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce90612fe6565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050505050815250828281518110610d3557610d35612de3565b602002602001018190525080610d4a90613284565b9050610c36565b5063ffffffff8981166000908152600960205260409020549081169068010000000000000000900460ff16610d8585612618565b9199509750955093505050509193509193565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015611010576000848483818110610dd257610dd2612de3565b60209081029290920135600081815260089093526040909220549192505068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16151580610e4e576040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260048101839052602401610427565b60008281526008602090815260408083205463ffffffff168352600782528083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549293919291840191610ea890612fe6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed490612fe6565b8015610f215780601f10610ef657610100808354040283529160200191610f21565b820191906000526020600020905b815481529060010190602001808311610f0457829003601f168201915b505050505081525050905084158015610f515750805173ffffffffffffffffffffffffffffffffffffffff163314155b15610f88576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602052604080822080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010191909155517f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320590610ff49085815260200190565b60405180910390a15050508061100990613284565b9050610db6565b50505050565b61101e61256e565b60005b81811015610a1557600083838381811061103d5761103d612de3565b905060200281019061104f9190612e12565b61105890612f1a565b805190915073ffffffffffffffffffffffffffffffffffffffff166110a9576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815260008681526007909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559151909190600182019061112c9082613122565b50905050600a6000815461113f90613284565b909155508151602083015160405173ffffffffffffffffffffffffffffffffffffffff909216917fda6697b182650034bd205cdc2dbfabb06bdb3a0a83a2b45bfefa3c4881284e0b916111949185919061323c565b60405180910390a25050806111a890613284565b9050611021565b604080516080810182526000808252602082018190529181019190915260608082015260408051608081018252600084815260086020908152838220805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff68010000000000000000830416848701526001830154868801526401000000009091041683526002019052918220606082019061124890612618565b905260009384526008602052604090932054929364010000000090930463ffffffff1692915050565b60005b81811015610a1557600083838381811061129057611290612de3565b90506020028101906112a2919061335b565b6112ab9061338f565b905060006112ce60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff9081168352600182018054969091163314965093949193909284019161132b90612fe6565b80601f016020809104026020016040519081016040528092919081815260200182805461135790612fe6565b80156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050811580156113d45750805173ffffffffffffffffffffffffffffffffffffffff163314155b1561140b576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161515806114805783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161042791815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff166114d1576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060840151805160000361151357806040517f3748d4c6000000000000000000000000000000000000000000000000000000008152600401610427919061346b565b60408581015160009081526008602052208054640100000000900463ffffffff169060046115408361347e565b82546101009290920a63ffffffff8181021990931691831602179091556040878101516000908152600860205290812054640100000000900490911691505b825181101561164b576115b583828151811061159d5761159d612de3565b602002602001015160036125f190919063ffffffff16565b6115ed57826040517f3748d4c6000000000000000000000000000000000000000000000000000000008152600401610427919061346b565b61163a83828151811061160257611602612de3565b6020908102919091018101516040808b015160009081526008845281812063ffffffff80891683526002909101909452209161260c16565b5061164481613284565b905061157f565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b018051845184529285902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9586160217905592518b5193518551918252939095169085015216908201527f6bbba867c646be512c2f3241e65fdffdefd5528d7e7939649e06e10ee5addc3e9060600160405180910390a15050505050508061174b90613284565b9050611274565b60005b81811015610a1557600083838381811061177157611771612de3565b9050602002810190611783919061335b565b61178c9061338f565b905060006117af60005473ffffffffffffffffffffffffffffffffffffffff1690565b825163ffffffff1660009081526007602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff9081168352600182018054969091163314965093949193909284019161180c90612fe6565b80601f016020809104026020016040519081016040528092919081815260200182805461183890612fe6565b80156118855780601f1061185a57610100808354040283529160200191611885565b820191906000526020600020905b81548152906001019060200180831161186857829003601f168201915b5050505050815250509050811580156118b55750805173ffffffffffffffffffffffffffffffffffffffff163314155b156118ec576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408084015160009081526008602052205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161515808061193057506040840151155b1561196f5783604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161042791815260200190565b602084015173ffffffffffffffffffffffffffffffffffffffff166119c0576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608401518051600003611a0257806040517f3748d4c6000000000000000000000000000000000000000000000000000000008152600401610427919061346b565b60408581015160009081526008602052208054600490611a2f90640100000000900463ffffffff1661347e565b82546101009290920a63ffffffff81810219909316918316021790915560408681015160009081526008602052908120546401000000009004909116905b8251811015611ae957611a8b83828151811061159d5761159d612de3565b611ac357826040517f3748d4c6000000000000000000000000000000000000000000000000000000008152600401610427919061346b565b611ad883828151811061160257611602612de3565b50611ae281613284565b9050611a6d565b5085516040808801805160009081526008602090815283822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff968716179055825180835284832060010155808b0151835183529184902080547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff9094169390930292909217909155905189518351918252909316908301527f5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f910160405180910390a150505050505080611be590613284565b9050611755565b6040805180820190915260008152606060208201526000828152600760209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611c4990612fe6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7590612fe6565b8015611cc25780601f10611c9757610100808354040283529160200191611cc2565b820191906000526020600020905b815481529060010190602001808311611ca557829003601f168201915b5050505050815250509050919050565b611cda61256e565b600b5463ffffffff16600081815260096020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffff0000000016851768010000000000000000871515021781556001808552908101909252822090915b87811015611dd0576000898983818110611d5757611d57612de3565b60200291909101359150611d6d905083826125f1565b15611db3576040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015260248101829052604401610427565b611dbd838261260c565b505080611dc990613284565b9050611d3b565b5060005b858110156120025736878783818110611def57611def612de3565b9050602002810190611e019190612e12565b90508035611e106003826125f1565b611e49576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610427565b611e546005826125f1565b15611e8e576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610427565b600081815260038501602052604081208054611ea990612fe6565b90501115611ef2576040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260248101829052604401610427565b60005b8a811015611faa5760008c8c83818110611f1157611f11612de3565b602090810292909201356000818152600884526040808220805463ffffffff6401000000009091048116845260029091019095529020909350611f599290915085906125f116565b611f99576040517fa7e792500000000000000000000000000000000000000000000000000000000081526004810182905260248101849052604401610427565b50611fa381613284565b9050611ef5565b50600284018054600181018255600091825260209182902001829055611fd2908301836134a1565b6000838152600387016020526040902091611fee919083613506565b50505080611ffb90613284565b9050611dd4565b5063ffffffff838116600090815260096020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1664010000000086851602179055600b8054909261205a911661347e565b91906101000a81548163ffffffff021916908363ffffffff1602179055507fab55f4c8fb4335a586285ae209d1f1e17a7ccb22e1131963624434d98c8546a583856040516120bc92919063ffffffff9290921682521515602082015260400190565b60405180910390a15050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610427565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b604080516080808201835260008083526020808401829052838501829052606084018290528582526002808252918590208551938401865280548452600180820154928501929092529182015493949293919284019160ff169081111561223457612234612c7f565b600181111561224557612245612c7f565b815260029190910154610100900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b61227d61256e565b6122886003826125f1565b6122c1576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610427565b6122cc6005826125f1565b15612306576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610427565b61231160058261260c565b5060405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250565b63ffffffff8083166000908152600960209081526040808320805464010000000090049094168084526001909401825280832085845260030190915290208054606092919061238e90612fe6565b80601f01602080910402602001604051908101604052809291908181526020018280546123ba90612fe6565b80156124075780601f106123dc57610100808354040283529160200191612407565b820191906000526020600020905b8154815290600101906020018083116123ea57829003601f168201915b505050505091505092915050565b606060006124236003612618565b905060006124316005612625565b825161243d9190613621565b67ffffffffffffffff81111561245557612455612e50565b6040519080825280602002602001820160405280156124c557816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816124735790505b5090506000805b83518110156125515760008482815181106124e9576124e9612de3565b602002602001015190506125078160056125f190919063ffffffff16565b61254057612514816121cb565b84848151811061252657612526612de3565b6020026020010181905250828061253c90613284565b9350505b5061254a81613284565b90506124cc565b50909392505050565b61256261256e565b61256b8161262f565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610427565b565b600081815260018301602052604081205415155b9392505050565b60006126058383612724565b6060600061260583612773565b6000610951825490565b3373ffffffffffffffffffffffffffffffffffffffff8216036126ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610427565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600081815260018301602052604081205461276b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610951565b506000610951565b6060816000018054806020026020016040519081016040528092919081815260200182805480156127c357602002820191906000526020600020905b8154815260200190600101908083116127af575b50505050509050919050565b5080546127db90612fe6565b6000825580601f106127eb575050565b601f01602090049060005260206000209081019061256b91905b808211156128195760008155600101612805565b5090565b60008083601f84011261282f57600080fd5b50813567ffffffffffffffff81111561284757600080fd5b6020830191508360208260051b850101111561286257600080fd5b9250929050565b6000806000806040858703121561287f57600080fd5b843567ffffffffffffffff8082111561289757600080fd5b6128a38883890161281d565b909650945060208701359150808211156128bc57600080fd5b506128c98782880161281d565b95989497509550505050565b6000608082840312156128e757600080fd5b50919050565b6000602082840312156128ff57600080fd5b5035919050565b6000815180845260005b8181101561292c57602081850181015186830182015201612910565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006126056020830184612906565b6000806020838503121561299057600080fd5b823567ffffffffffffffff8111156129a757600080fd5b6129b38582860161281d565b90969095509350505050565b803563ffffffff811681146129d357600080fd5b919050565b6000602082840312156129ea57600080fd5b612605826129bf565b600081518084526020808501945080840160005b83811015612a2357815187529582019590820190600101612a07565b509495945050505050565b63ffffffff8516815260006020851515818401526040608081850152612a5760808501876129f3565b8481036060860152855180825283820190600581901b8301850185890160005b83811015612ad4578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018552815180518452880151888401889052612ac188850182612906565b9589019593505090870190600101612a77565b50909c9b505050505050505050505050565b60008060408385031215612af957600080fd5b50508035926020909101359150565b60408152600060c0820163ffffffff8551166040840152602073ffffffffffffffffffffffffffffffffffffffff81870151166060850152604086015160808501526060860151608060a086015282815180855260e0870191508383019450600092505b80831015612b8c5784518252938301936001929092019190830190612b6c565b5063ffffffff8716838701529350612ba19050565b50509392505050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260006020830151604080840152612be56060840182612906565b949350505050565b801515811461256b57600080fd5b600080600080600060608688031215612c1357600080fd5b853567ffffffffffffffff80821115612c2b57600080fd5b612c3789838a0161281d565b90975095506020880135915080821115612c5057600080fd5b50612c5d8882890161281d565b9094509250506040860135612c7181612bed565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8051825260208101516020830152604081015160028110612cf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604083015260609081015173ffffffffffffffffffffffffffffffffffffffff16910152565b608081016109518284612cae565b60008060408385031215612d3f57600080fd5b612d48836129bf565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612d9857612d85838551612cae565b9284019260809290920191600101612d72565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461256b57600080fd5b600060208284031215612dd857600080fd5b813561260581612da4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112612e4657600080fd5b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612ea257612ea2612e50565b60405290565b6040516080810167ffffffffffffffff81118282101715612ea257612ea2612e50565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f1257612f12612e50565b604052919050565b600060408236031215612f2c57600080fd5b612f34612e7f565b8235612f3f81612da4565b815260208381013567ffffffffffffffff80821115612f5d57600080fd5b9085019036601f830112612f7057600080fd5b813581811115612f8257612f82612e50565b612fb2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612ecb565b91508082523684828501011115612fc857600080fd5b80848401858401376000908201840152918301919091525092915050565b600181811c90821680612ffa57607f821691505b6020821081036128e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060208083526000845461304781612fe6565b8084870152604060018084166000811461306857600181146130a0576130ce565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506130ce565b896000528660002060005b858110156130c65781548b82018601529083019088016130ab565b8a0184019650505b509398975050505050505050565b601f821115610a1557600081815260208120601f850160051c810160208610156131035750805b601f850160051c820191505b818110156106f15782815560010161310f565b815167ffffffffffffffff81111561313c5761313c612e50565b6131508161314a8454612fe6565b846130dc565b602080601f8311600181146131a3576000841561316d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106f1565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156131f0578886015182559484019460019091019084016131d1565b508582101561322c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000612be56040830184612906565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132b5576132b5613255565b5060010190565b6000602082840312156132ce57600080fd5b815161260581612bed565b8135815560208201356001820155600281016040830135600281106132fd57600080fd5b8154606085013561330d81612da4565b74ffffffffffffffffffffffffffffffffffffffff008160081b1660ff84167fffffffffffffffffffffff000000000000000000000000000000000000000000841617178455505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612e4657600080fd5b6000608082360312156133a157600080fd5b6133a9612ea8565b6133b2836129bf565b81526020808401356133c381612da4565b8282015260408481013590830152606084013567ffffffffffffffff808211156133ec57600080fd5b9085019036601f8301126133ff57600080fd5b81358181111561341157613411612e50565b8060051b9150613422848301612ecb565b818152918301840191848101903684111561343c57600080fd5b938501935b8385101561345a57843582529385019390850190613441565b606087015250939695505050505050565b60208152600061260560208301846129f3565b600063ffffffff80831681810361349757613497613255565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126134d657600080fd5b83018035915067ffffffffffffffff8211156134f157600080fd5b60200191503681900382131561286257600080fd5b67ffffffffffffffff83111561351e5761351e612e50565b6135328361352c8354612fe6565b836130dc565b6000601f841160018114613584576000851561354e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561361a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156135d357868501358255602094850194600190920191016135b3565b508682101561360e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b818103818111156109515761095161325556fea164736f6c6343000813000a", } var CapabilityRegistryABI = CapabilityRegistryMetaData.ABI @@ -491,6 +491,18 @@ func (_CapabilityRegistry *CapabilityRegistryTransactorSession) DeprecateCapabil return _CapabilityRegistry.Contract.DeprecateCapability(&_CapabilityRegistry.TransactOpts, hashedCapabilityId) } +func (_CapabilityRegistry *CapabilityRegistryTransactor) RemoveDONs(opts *bind.TransactOpts, donIds []uint32) (*types.Transaction, error) { + return _CapabilityRegistry.contract.Transact(opts, "removeDONs", donIds) +} + +func (_CapabilityRegistry *CapabilityRegistrySession) RemoveDONs(donIds []uint32) (*types.Transaction, error) { + return _CapabilityRegistry.Contract.RemoveDONs(&_CapabilityRegistry.TransactOpts, donIds) +} + +func (_CapabilityRegistry *CapabilityRegistryTransactorSession) RemoveDONs(donIds []uint32) (*types.Transaction, error) { + return _CapabilityRegistry.Contract.RemoveDONs(&_CapabilityRegistry.TransactOpts, donIds) +} + func (_CapabilityRegistry *CapabilityRegistryTransactor) RemoveNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []*big.Int) (*types.Transaction, error) { return _CapabilityRegistry.contract.Transact(opts, "removeNodeOperators", nodeOperatorIds) } @@ -923,6 +935,123 @@ func (_CapabilityRegistry *CapabilityRegistryFilterer) ParseDONAdded(log types.L return event, nil } +type CapabilityRegistryDONRemovedIterator struct { + Event *CapabilityRegistryDONRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CapabilityRegistryDONRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CapabilityRegistryDONRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CapabilityRegistryDONRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CapabilityRegistryDONRemovedIterator) Error() error { + return it.fail +} + +func (it *CapabilityRegistryDONRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CapabilityRegistryDONRemoved struct { + DonId uint32 + Raw types.Log +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) FilterDONRemoved(opts *bind.FilterOpts) (*CapabilityRegistryDONRemovedIterator, error) { + + logs, sub, err := _CapabilityRegistry.contract.FilterLogs(opts, "DONRemoved") + if err != nil { + return nil, err + } + return &CapabilityRegistryDONRemovedIterator{contract: _CapabilityRegistry.contract, event: "DONRemoved", logs: logs, sub: sub}, nil +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) WatchDONRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryDONRemoved) (event.Subscription, error) { + + logs, sub, err := _CapabilityRegistry.contract.WatchLogs(opts, "DONRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CapabilityRegistryDONRemoved) + if err := _CapabilityRegistry.contract.UnpackLog(event, "DONRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CapabilityRegistry *CapabilityRegistryFilterer) ParseDONRemoved(log types.Log) (*CapabilityRegistryDONRemoved, error) { + event := new(CapabilityRegistryDONRemoved) + if err := _CapabilityRegistry.contract.UnpackLog(event, "DONRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type CapabilityRegistryNodeAddedIterator struct { Event *CapabilityRegistryNodeAdded @@ -1932,6 +2061,8 @@ func (_CapabilityRegistry *CapabilityRegistry) ParseLog(log types.Log) (generate return _CapabilityRegistry.ParseCapabilityDeprecated(log) case _CapabilityRegistry.abi.Events["DONAdded"].ID: return _CapabilityRegistry.ParseDONAdded(log) + case _CapabilityRegistry.abi.Events["DONRemoved"].ID: + return _CapabilityRegistry.ParseDONRemoved(log) case _CapabilityRegistry.abi.Events["NodeAdded"].ID: return _CapabilityRegistry.ParseNodeAdded(log) case _CapabilityRegistry.abi.Events["NodeOperatorAdded"].ID: @@ -1966,6 +2097,10 @@ func (CapabilityRegistryDONAdded) Topic() common.Hash { return common.HexToHash("0xab55f4c8fb4335a586285ae209d1f1e17a7ccb22e1131963624434d98c8546a5") } +func (CapabilityRegistryDONRemoved) Topic() common.Hash { + return common.HexToHash("0x7c551c5f33df1b67ff1dee6d812a4a2ea076c2a5bea7d3da390a75619df1553e") +} + func (CapabilityRegistryNodeAdded) Topic() common.Hash { return common.HexToHash("0x5bfe8a52ad26ac6ee7b0cd46d2fd92be04735a31c45ef8aa3d4b7ea1b61bbc1f") } @@ -2035,6 +2170,8 @@ type CapabilityRegistryInterface interface { DeprecateCapability(opts *bind.TransactOpts, hashedCapabilityId [32]byte) (*types.Transaction, error) + RemoveDONs(opts *bind.TransactOpts, donIds []uint32) (*types.Transaction, error) + RemoveNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []*big.Int) (*types.Transaction, error) RemoveNodes(opts *bind.TransactOpts, removedNodeP2PIds [][32]byte) (*types.Transaction, error) @@ -2063,6 +2200,12 @@ type CapabilityRegistryInterface interface { ParseDONAdded(log types.Log) (*CapabilityRegistryDONAdded, error) + FilterDONRemoved(opts *bind.FilterOpts) (*CapabilityRegistryDONRemovedIterator, error) + + WatchDONRemoved(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryDONRemoved) (event.Subscription, error) + + ParseDONRemoved(log types.Log) (*CapabilityRegistryDONRemoved, error) + FilterNodeAdded(opts *bind.FilterOpts) (*CapabilityRegistryNodeAddedIterator, error) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilityRegistryNodeAdded) (event.Subscription, error) diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 0f4d9d58d8d..d8e11a9d186 100644 --- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ GETH_VERSION: 1.13.8 forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin b4c900aae9e022f01abbac7993d41f93912247613ac6270b0c4da4ef6f2016e3 -keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin efa84b7cae3ce74a85bccd04544ce8176c33cbaf83af24370c0f6e52b2fde0c6 +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin f44b8bf19bb83bb51c2291fc1967b5c6084b19b7fd6aa5ab3352d0f0c1bd3754 ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2