diff --git a/contracts/generated/NetworkConfig/NetworkConfig.go b/contracts/generated/NetworkConfig/NetworkConfig.go index f4b6439447..990899445a 100644 --- a/contracts/generated/NetworkConfig/NetworkConfig.go +++ b/contracts/generated/NetworkConfig/NetworkConfig.go @@ -58,8 +58,8 @@ type NetworkConfigNamedAddress struct { // NetworkConfigMetaData contains all meta data concerning the NetworkConfig contract. var NetworkConfigMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"AdditionalContractAddressAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"AdditionalContractAddressRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"NetworkContractAddressAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"featureName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"featureData\",\"type\":\"bytes\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CROSS_CHAIN_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DATA_AVAILABILITY_REGISTRY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FORK_MANAGER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_CROSS_CHAIN_MESSENGER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_CROSS_CHAIN_MESSENGER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSAGE_BUS_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NETWORK_ENCLAVE_REGISTRY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"addAdditionalAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"contractName\",\"type\":\"string\"}],\"name\":\"additionalAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addressNames\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addresses\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"crossChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageBus\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"networkEnclaveRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataAvailabilityRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l2Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1CrossChainMessenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l2CrossChainMessenger\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"internalType\":\"structNetworkConfig.NamedAddress[]\",\"name\":\"additionalContracts\",\"type\":\"tuple[]\"}],\"internalType\":\"structNetworkConfig.Addresses\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"crossChainContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daRegistryContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdditionalContractNames\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"crossChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageBus\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"networkEnclaveRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataAvailabilityRegistry\",\"type\":\"address\"}],\"internalType\":\"structNetworkConfig.FixedAddresses\",\"name\":\"_addresses\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1CrossChainMessengerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2CrossChainMessengerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBusContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkEnclaveRegistryContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"removeAdditionalAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL1BridgeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL1CrossChainMessengerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL2BridgeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL2CrossChainMessengerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"featureName\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"featureData\",\"type\":\"bytes\"}],\"name\":\"upgradeFeature\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f5ffd5b5061001861001d565b6100fc565b5f6100266100bd565b805490915068010000000000000000900460ff16156100585760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100ba5780546001600160401b0319166001600160401b0390811782556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916100b1916100e7565b60405180910390a15b50565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6001600160401b0382168152602081016100e1565b612376806101095f395ff3fe608060405234801561000f575f5ffd5b506004361061021b575f3560e01c806385f427cb11610123578063be9f8207116100b8578063f2fde38b11610088578063faa5e2de1161006e578063faa5e2de146103f2578063fbfd6d91146103fa578063ff48940914610402575f5ffd5b8063f2fde38b146103d7578063f5e9f286146103ea575f5ffd5b8063be9f82071461039f578063da0321cd146103a7578063e1825d06146103bc578063e30c3978146103cf575f5ffd5b8063a1b918d6116100f3578063a1b918d614610348578063ae61ecba14610350578063af45463514610358578063b7bef9ab1461038c575f5ffd5b806385f427cb1461031d5780638da5cb5b14610325578063934746a71461032d57806396493cc514610335575f5ffd5b8063556d89dd116101b3578063715018a61161018357806372bad9121161016957806372bad9121461030557806379ba50971461030d578063812b1ffe14610315575f5ffd5b8063715018a6146102f557806371fd11f3146102fd575f5ffd5b8063556d89dd146102bf5780635ab2a558146102d257806367cc852e146102da5780636c1358ac146102e2575f5ffd5b806331d1464d116101ee57806331d1464d1461027a578063450948ad1461028f57806346a30a781461029757806348d87239146102aa575f5ffd5b80630b592f451461021f5780630f387b1e1461023d57806313eeee961461025d5780632fc00c7614610272575b5f5ffd5b610227610415565b6040516102349190611624565b60405180910390f35b61025061024b366004611649565b61044d565b60405161023491906116a9565b6102656104f2565b604051610234919061172d565b6102276105c5565b61028d61028836600461178c565b6105f4565b005b6102276106c1565b61028d6102a53660046117e5565b6106f0565b6102b261078b565b6040516102349190611808565b61028d6102cd3660046117e5565b6107b9565b610227610844565b6102b2610873565b61028d6102f03660046118d9565b61089e565b61028d610b6e565b610227610b8e565b6102b2610bbd565b61028d610be8565b6102b2610c27565b6102b2610c52565b610227610c7d565b610227610cb1565b61028d6103433660046117e5565b610ce0565b610227610d6b565b6102b2610d9a565b61022761036636600461199b565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b61028d61039a3660046119db565b610dc5565b6102b2610f58565b6103af610f83565b6040516102349190611b81565b61028d6103ca3660046117e5565b61121b565b6102276112a6565b61028d6103e53660046117e5565b6112ce565b610227611353565b6102b2611382565b6102b26113ad565b61028d610410366004611b92565b6113d8565b5f61044861044460017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c1a565b5490565b905090565b5f818154811061045b575f80fd5b905f5260205f20015f91509050805461047390611c41565b80601f016020809104026020016040519081016040528092919081815260200182805461049f90611c41565b80156104ea5780601f106104c1576101008083540402835291602001916104ea565b820191905f5260205f20905b8154815290600101906020018083116104cd57829003601f168201915b505050505081565b60605f805480602002602001604051908101604052809291908181526020015f905b828210156105bc578382905f5260205f2001805461053190611c41565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90611c41565b80156105a85780601f1061057f576101008083540402835291602001916105a8565b820191905f5260205f20905b81548152906001019060200180831161058b57829003601f168201915b505050505081526020019060010190610514565b50505050905090565b5f61044861044460017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c1a565b6105fc611423565b5f6001600160a01b031660018383604051610618929190611c7d565b908152604051908190036020019020546001600160a01b0316036106575760405162461bcd60e51b815260040161064e90611cba565b60405180910390fd5b60018282604051610669929190611c7d565b90815260405190819003602001812080546001600160a01b03191690557f5f9e4bc50ed4fc3c0bf14c4b518e1f8132c7a95ce5bed2e97c8675e6adf03573906106b59084908490611cea565b60405180910390a15050565b5f61044861044460017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c1a565b6106f8611423565b6001600160a01b03811661071e5760405162461bcd60e51b815260040161064e90611d2e565b61075161074c60017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c1a565b829055565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190611d70565b60405180910390a150565b6107b660017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c1a565b81565b6107c1611423565b6001600160a01b0381166107e75760405162461bcd60e51b815260040161064e90611d2e565b61081561074c60017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c1a565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190611dc1565b5f61044861044460017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c1a565b6107b660017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c1a565b5f6108a7611457565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d35750825b90505f8267ffffffffffffffff1660011480156108ef5750303b155b9050811580156108fd575080155b15610934576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096857845468ff00000000000000001916680100000000000000001785555b6001600160a01b03861661098e5760405162461bcd60e51b815260040161064e90611e03565b86516001600160a01b03166109b55760405162461bcd60e51b815260040161064e90611e45565b60208701516001600160a01b03166109df5760405162461bcd60e51b815260040161064e90611e87565b60408701516001600160a01b0316610a095760405162461bcd60e51b815260040161064e90611ef1565b60608701516001600160a01b0316610a335760405162461bcd60e51b815260040161064e90611f59565b610a3c86611481565b610a70610a6a60017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c1a565b88519055565b610aa7610a9e60017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c1a565b60208901519055565b610ade610ad560017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c1a565b60408901519055565b610b15610b0c60017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c1a565b60608901519055565b8315610b6557845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610b5c90600190611f8c565b60405180910390a15b50505050505050565b610b76611423565b60405162461bcd60e51b815260040161064e90611ff2565b5f61044861044460017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c1a565b6107b660017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c1a565b3380610bf26112a6565b6001600160a01b031614610c1b578060405163118cdaa760e01b815260040161064e9190611624565b610c248161149a565b50565b6107b660017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c1a565b6107b660017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c1a565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f61044861044460017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c1a565b610ce8611423565b6001600160a01b038116610d0e5760405162461bcd60e51b815260040161064e90611d2e565b610d3c61074c60017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c1a565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190612034565b5f61044861044460017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c1a565b6107b660017fc9e8e7a4a583757cbcf624a50138f888cb585d449a8799952d3cc62760699622611c1a565b610dcd611423565b6001600160a01b038116610df35760405162461bcd60e51b815260040161064e90611d2e565b5f6001600160a01b031660018484604051610e0f929190611c7d565b908152604051908190036020019020546001600160a01b031614610e455760405162461bcd60e51b815260040161064e90612076565b81610e625760405162461bcd60e51b815260040161064e906120b8565b5f6001600160a01b031660018484604051610e7e929190611c7d565b908152604051908190036020019020546001600160a01b031603610ed7575f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301610ed5838583612160565b505b8060018484604051610eea929190611c7d565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091557f7ef997b0c9df3b39718be90c44d4d0d3d0230ac10eae31d63200210c7541ab7090610f4b9085908590859061221f565b60405180910390a1505050565b6107b660017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c1a565b60408051610120810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820152815490919067ffffffffffffffff811115610fe657610fe6611816565b60405190808252806020026020018201604052801561102b57816020015b60408051808201909152606081525f60208201528152602001906001900390816110045790505b5090505f5b5f548110156111555760405180604001604052805f838154811061105657611056612240565b905f5260205f2001805461106990611c41565b80601f016020809104026020016040519081016040528092919081815260200182805461109590611c41565b80156110e05780601f106110b7576101008083540402835291602001916110e0565b820191905f5260205f20905b8154815290600101906020018083116110c357829003601f168201915b5050505050815260200160015f84815481106110fe576110fe612240565b905f5260205f200160405161111391906122c3565b908152604051908190036020019020546001600160a01b03169052825183908390811061114257611142612240565b6020908102919091010152600101611030565b5060405180610120016040528061116a610d6b565b6001600160a01b03168152602001611180611353565b6001600160a01b031681526020016111966105c5565b6001600160a01b031681526020016111ac610b8e565b6001600160a01b031681526020016111c2610844565b6001600160a01b031681526020016111d8610cb1565b6001600160a01b031681526020016111ee6106c1565b6001600160a01b03168152602001611204610415565b6001600160a01b0316815260200191909152919050565b611223611423565b6001600160a01b0381166112495760405162461bcd60e51b815260040161064e90611d2e565b61127761074c60017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c1a565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b738160405161078091906122ff565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610ca1565b6112d6611423565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b038316908117825561131a610c7d565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f61044861044460017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c1a565b6107b660017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c1a565b6107b660017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c1a565b6113e0611423565b7f23dedaf6832e6f49f00aba880354923b9a346706121410bb3aba36d29dd8201884848484604051611415949392919061230f565b60405180910390a150505050565b3361142c610c7d565b6001600160a01b031614611455573360405163118cdaa760e01b815260040161064e9190611624565b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6114896114d6565b61149281611514565b610c24611525565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556114d28261152d565b5050565b6114de61159d565b611455576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61151c6114d6565b610c24816115bb565b6114556114d6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f6115a6611457565b5468010000000000000000900460ff16919050565b6115c36114d6565b6001600160a01b038116610c1b575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161064e9190611624565b5f6001600160a01b03821661147b565b61161e81611605565b82525050565b6020810161147b8284611615565b805b8114610c24575f5ffd5b803561147b81611632565b5f6020828403121561165c5761165c5f5ffd5b611666838361163e565b9392505050565b8281835e505f910152565b5f611681825190565b80845260208401935061169881856020860161166d565b601f01601f19169290920192915050565b602080825281016116668184611678565b5f6116668383611678565b60200190565b5f6116d4825190565b808452602084019350836020820285016116ee8560200190565b5f5b84811015611721578383038852815161170984826116ba565b935050602082016020989098019791506001016116f0565b50909695505050505050565b6020808252810161166681846116cb565b5f5f83601f840112611751576117515f5ffd5b50813567ffffffffffffffff81111561176b5761176b5f5ffd5b602083019150836001820283011115611785576117855f5ffd5b9250929050565b5f5f602083850312156117a0576117a05f5ffd5b823567ffffffffffffffff8111156117b9576117b95f5ffd5b6117c58582860161173e565b92509250509250929050565b61163481611605565b803561147b816117d1565b5f602082840312156117f8576117f85f5ffd5b61166683836117da565b8061161e565b6020810161147b8284611802565b634e487b7160e01b5f52604160045260245ffd5b601f19601f830116810181811067ffffffffffffffff8211171561185057611850611816565b6040525050565b5f61186160405190565b905061186d828261182a565b919050565b5f60808284031215611885576118855f5ffd5b61188f6080611857565b905061189b83836117da565b81526118aa83602084016117da565b60208201526118bc83604084016117da565b60408201526118ce83606084016117da565b606082015292915050565b5f5f60a083850312156118ed576118ed5f5ffd5b6118f78484611872565b915061190684608085016117da565b90509250929050565b5f67ffffffffffffffff82111561192857611928611816565b601f19601f83011660200192915050565b82818337505f910152565b5f6119566119518461190f565b611857565b905082815283838301111561196c5761196c5f5ffd5b611666836020830184611939565b5f82601f83011261198c5761198c5f5ffd5b61166683833560208501611944565b5f602082840312156119ae576119ae5f5ffd5b813567ffffffffffffffff8111156119c7576119c75f5ffd5b6119d38482850161197a565b949350505050565b5f5f5f604084860312156119f0576119f05f5ffd5b833567ffffffffffffffff811115611a0957611a095f5ffd5b611a158682870161173e565b9350935050611a2785602086016117da565b90509250925092565b805160408084525f9190840190611a478282611678565b9150506020830151611a5c6020860182611615565b509392505050565b5f6116668383611a30565b5f611a78825190565b80845260208401935083602082028501611a928560200190565b5f5b848110156117215783830388528151611aad8482611a64565b93505060208201602098909801979150600101611a94565b80515f90610120840190611ad98582611615565b506020830151611aec6020860182611615565b506040830151611aff6040860182611615565b506060830151611b126060860182611615565b506080830151611b256080860182611615565b5060a0830151611b3860a0860182611615565b5060c0830151611b4b60c0860182611615565b5060e0830151611b5e60e0860182611615565b50610100830151848203610100860152611b788282611a6f565b95945050505050565b602080825281016116668184611ac5565b5f5f5f5f60408587031215611ba857611ba85f5ffd5b843567ffffffffffffffff811115611bc157611bc15f5ffd5b611bcd8782880161173e565b9450945050602085013567ffffffffffffffff811115611bee57611bee5f5ffd5b611bfa8782880161173e565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561147b5761147b611c06565b634e487b7160e01b5f52602260045260245ffd5b600281046001821680611c5557607f821691505b602082108103611c6757611c67611c2d565b50919050565b611c78828483611939565b500190565b611666818385611c6d565b60168152602081017f4164647265737320646f6573206e6f7420657869737400000000000000000000815290506116c5565b6020808252810161147b81611c88565b818352602083019250611cde828483611939565b50601f01601f19160190565b602080825281016119d3818486611cca565b600f8152602081017f496e76616c696420616464726573730000000000000000000000000000000000815290506116c5565b6020808252810161147b81611cfc565b60158152602081017f6c3143726f7373436861696e4d657373656e6765720000000000000000000000815290506116c5565b60408082528101611d8081611d3e565b905061147b6020830184611615565b60088152602081017f6c32427269646765000000000000000000000000000000000000000000000000815290506116c5565b60408082528101611d8081611d8f565b60138152602081017f4f776e65722063616e6e6f742062652030783000000000000000000000000000815290506116c5565b6020808252810161147b81611dd1565b60198152602081017f43726f737320636861696e2063616e6e6f742062652030783000000000000000815290506116c5565b6020808252810161147b81611e13565b60198152602081017f4d657373616765206275732063616e6e6f742062652030783000000000000000815290506116c5565b6020808252810161147b81611e55565b60268152602081017f4e6574776f726b20656e636c6176652072656769737472792063616e6e6f742081527f6265203078300000000000000000000000000000000000000000000000000000602082015290505b60400190565b6020808252810161147b81611e97565b60288152602081017f4461746120617661696c6162696c6974792072656769737472792063616e6e6f81527f742062652030783000000000000000000000000000000000000000000000000060208201529050611eeb565b6020808252810161147b81611f01565b5f61147b82611f76565b90565b67ffffffffffffffff1690565b61161e81611f69565b6020810161147b8284611f83565b60348152602081017f556e72656e6f756e6361626c654f776e61626c6532537465703a2063616e6e6f81527f742072656e6f756e6365206f776e65727368697000000000000000000000000060208201529050611eeb565b6020808252810161147b81611f9a565b60158152602081017f6c3243726f7373436861696e4d657373656e6765720000000000000000000000815290506116c5565b60408082528101611d8081612002565b60168152602081017f4164647265737320616c72656164792065786973747300000000000000000000815290506116c5565b6020808252810161147b81612044565b60148152602081017f4e616d652063616e6e6f7420626520656d707479000000000000000000000000815290506116c5565b6020808252810161147b81612086565b5f61147b611f738381565b6120dc836120c8565b81545f1960089490940293841b1916921b91909117905550565b5f6121028184846120d3565b505050565b818110156114d2576121195f826120f6565b600101612107565b601f821115612102575f818152602090206020601f850104810160208510156121475750805b6121596020601f860104830182612107565b5050505050565b8267ffffffffffffffff81111561217957612179611816565b6121838254611c41565b61218e828285612121565b505f601f8211600181146121c0575f83156121a95750848201355b5f19600885021c1981166002850217855550612217565b5f84815260208120601f198516915b828110156121ef57878501358255602094850194600190920191016121cf565b508482101561220b575f196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b60408082528101612231818587611cca565b90506119d36020830184611615565b634e487b7160e01b5f52603260045260245ffd5b5f815461226081611c41565b600182168015612277576001811461228c576122ba565b60ff19831686528115158202860193506122ba565b5f858152602090205f5b838110156122b257815488820152600190910190602001612296565b505081860193505b50505092915050565b61147b8183612254565b60088152602081017f6c31427269646765000000000000000000000000000000000000000000000000815290506116c5565b60408082528101611d80816122cd565b60408082528101612321818688611cca565b90508181036020830152612336818486611cca565b969550505050505056fea2646970667358221220d00096b59939b47a47a36be43d0cd5d89e18f7b207bc640d84518ef4ba04b9b264736f6c634300081c0033", + ABI: "[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"AdditionalContractAddressAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"AdditionalContractAddressRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"NetworkContractAddressAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"featureName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"featureData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"validAtBlock\",\"type\":\"uint256\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CROSS_CHAIN_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DATA_AVAILABILITY_REGISTRY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FORK_MANAGER_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L1_CROSS_CHAIN_MESSENGER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BRIDGE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_CROSS_CHAIN_MESSENGER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSAGE_BUS_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NETWORK_ENCLAVE_REGISTRY_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"addAdditionalAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"contractName\",\"type\":\"string\"}],\"name\":\"additionalAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addressNames\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addresses\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"crossChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageBus\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"networkEnclaveRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataAvailabilityRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l2Bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l1CrossChainMessenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"l2CrossChainMessenger\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"internalType\":\"structNetworkConfig.NamedAddress[]\",\"name\":\"additionalContracts\",\"type\":\"tuple[]\"}],\"internalType\":\"structNetworkConfig.Addresses\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"crossChainContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daRegistryContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAdditionalContractNames\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"crossChain\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageBus\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"networkEnclaveRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataAvailabilityRegistry\",\"type\":\"address\"}],\"internalType\":\"structNetworkConfig.FixedAddresses\",\"name\":\"_addresses\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1CrossChainMessengerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2CrossChainMessengerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBusContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkEnclaveRegistryContractAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"removeAdditionalAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL1BridgeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL1CrossChainMessengerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL2BridgeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"setL2CrossChainMessengerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"featureName\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"featureData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validAtBlock\",\"type\":\"uint256\"}],\"name\":\"upgradeFeature\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f5ffd5b5061001861001d565b6100fc565b5f6100266100bd565b805490915068010000000000000000900460ff16156100585760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100ba5780546001600160401b0319166001600160401b0390811782556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916100b1916100e7565b60405180910390a15b50565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6001600160401b0382168152602081016100e1565b612419806101095f395ff3fe608060405234801561000f575f5ffd5b506004361061021b575f3560e01c806385f427cb11610123578063be9f8207116100b8578063e30c397811610088578063f5e9f2861161006e578063f5e9f286146103fd578063faa5e2de14610405578063fbfd6d911461040d575f5ffd5b8063e30c3978146103e2578063f2fde38b146103ea575f5ffd5b8063be9f82071461039f578063da0321cd146103a7578063dbf5d903146103bc578063e1825d06146103cf575f5ffd5b8063a1b918d6116100f3578063a1b918d614610348578063ae61ecba14610350578063af45463514610358578063b7bef9ab1461038c575f5ffd5b806385f427cb1461031d5780638da5cb5b14610325578063934746a71461032d57806396493cc514610335575f5ffd5b8063556d89dd116101b3578063715018a61161018357806372bad9121161016957806372bad9121461030557806379ba50971461030d578063812b1ffe14610315575f5ffd5b8063715018a6146102f557806371fd11f3146102fd575f5ffd5b8063556d89dd146102bf5780635ab2a558146102d257806367cc852e146102da5780636c1358ac146102e2575f5ffd5b806331d1464d116101ee57806331d1464d1461027a578063450948ad1461028f57806346a30a781461029757806348d87239146102aa575f5ffd5b80630b592f451461021f5780630f387b1e1461023d57806313eeee961461025d5780632fc00c7614610272575b5f5ffd5b610227610415565b6040516102349190611650565b60405180910390f35b61025061024b366004611675565b61044d565b60405161023491906116d5565b6102656104f2565b6040516102349190611759565b6102276105c5565b61028d6102883660046117b8565b6105f4565b005b6102276106c1565b61028d6102a5366004611811565b6106f0565b6102b261078b565b6040516102349190611834565b61028d6102cd366004611811565b6107b9565b610227610844565b6102b2610873565b61028d6102f0366004611905565b61089e565b61028d610b6e565b610227610b8e565b6102b2610bbd565b61028d610be8565b6102b2610c27565b6102b2610c52565b610227610c7d565b610227610cb1565b61028d610343366004611811565b610ce0565b610227610d6b565b6102b2610d9a565b6102276103663660046119c7565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b61028d61039a366004611a07565b610dc5565b6102b2610f58565b6103af610f83565b6040516102349190611bad565b61028d6103ca366004611bbe565b61121b565b61028d6103dd366004611811565b611292565b61022761131d565b61028d6103f8366004611811565b611345565b6102276113ca565b6102b26113f9565b6102b2611424565b5f61044861044460017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c59565b5490565b905090565b5f818154811061045b575f80fd5b905f5260205f20015f91509050805461047390611c80565b80601f016020809104026020016040519081016040528092919081815260200182805461049f90611c80565b80156104ea5780601f106104c1576101008083540402835291602001916104ea565b820191905f5260205f20905b8154815290600101906020018083116104cd57829003601f168201915b505050505081565b60605f805480602002602001604051908101604052809291908181526020015f905b828210156105bc578382905f5260205f2001805461053190611c80565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90611c80565b80156105a85780601f1061057f576101008083540402835291602001916105a8565b820191905f5260205f20905b81548152906001019060200180831161058b57829003601f168201915b505050505081526020019060010190610514565b50505050905090565b5f61044861044460017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c59565b6105fc61144f565b5f6001600160a01b031660018383604051610618929190611cbc565b908152604051908190036020019020546001600160a01b0316036106575760405162461bcd60e51b815260040161064e90611cf9565b60405180910390fd5b60018282604051610669929190611cbc565b90815260405190819003602001812080546001600160a01b03191690557f5f9e4bc50ed4fc3c0bf14c4b518e1f8132c7a95ce5bed2e97c8675e6adf03573906106b59084908490611d29565b60405180910390a15050565b5f61044861044460017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c59565b6106f861144f565b6001600160a01b03811661071e5760405162461bcd60e51b815260040161064e90611d6d565b61075161074c60017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c59565b829055565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190611daf565b60405180910390a150565b6107b660017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c59565b81565b6107c161144f565b6001600160a01b0381166107e75760405162461bcd60e51b815260040161064e90611d6d565b61081561074c60017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c59565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190611e00565b5f61044861044460017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c59565b6107b660017f9c4bf36639b03148aa45703f540290d6a1c2225945d7196e6b3ef866efdf4f82611c59565b5f6108a7611483565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156108d35750825b90505f8267ffffffffffffffff1660011480156108ef5750303b155b9050811580156108fd575080155b15610934576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561096857845468ff00000000000000001916680100000000000000001785555b6001600160a01b03861661098e5760405162461bcd60e51b815260040161064e90611e42565b86516001600160a01b03166109b55760405162461bcd60e51b815260040161064e90611e84565b60208701516001600160a01b03166109df5760405162461bcd60e51b815260040161064e90611ec6565b60408701516001600160a01b0316610a095760405162461bcd60e51b815260040161064e90611f30565b60608701516001600160a01b0316610a335760405162461bcd60e51b815260040161064e90611f98565b610a3c866114ad565b610a70610a6a60017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c59565b88519055565b610aa7610a9e60017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c59565b60208901519055565b610ade610ad560017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c59565b60408901519055565b610b15610b0c60017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c59565b60608901519055565b8315610b6557845468ff0000000000000000191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290610b5c90600190611fcb565b60405180910390a15b50505050505050565b610b7661144f565b60405162461bcd60e51b815260040161064e90612031565b5f61044861044460017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c59565b6107b660017fa8dc982740f2c3c626e5e571dc05dd1658ff80318c0fb06acc8b264b5ed7ebba611c59565b3380610bf261131d565b6001600160a01b031614610c1b578060405163118cdaa760e01b815260040161064e9190611650565b610c24816114c6565b50565b6107b660017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c59565b6107b660017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c59565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f61044861044460017f01487b9e499fe6b85dcf5493ba4e0a725bd52278ead06c0d370c5b5e3d513c91611c59565b610ce861144f565b6001600160a01b038116610d0e5760405162461bcd60e51b815260040161064e90611d6d565b610d3c61074c60017f73731984b9847fe0f6bd6840905e6dc77e4bfa84e759f8238ab14c4e91ca3cbf611c59565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b73816040516107809190612073565b5f61044861044460017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c59565b6107b660017fc9e8e7a4a583757cbcf624a50138f888cb585d449a8799952d3cc62760699622611c59565b610dcd61144f565b6001600160a01b038116610df35760405162461bcd60e51b815260040161064e90611d6d565b5f6001600160a01b031660018484604051610e0f929190611cbc565b908152604051908190036020019020546001600160a01b031614610e455760405162461bcd60e51b815260040161064e906120b5565b81610e625760405162461bcd60e51b815260040161064e906120f7565b5f6001600160a01b031660018484604051610e7e929190611cbc565b908152604051908190036020019020546001600160a01b031603610ed7575f80546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301610ed583858361219f565b505b8060018484604051610eea929190611cbc565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091557f7ef997b0c9df3b39718be90c44d4d0d3d0230ac10eae31d63200210c7541ab7090610f4b9085908590859061225e565b60405180910390a1505050565b6107b660017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c59565b60408051610120810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820152815490919067ffffffffffffffff811115610fe657610fe6611842565b60405190808252806020026020018201604052801561102b57816020015b60408051808201909152606081525f60208201528152602001906001900390816110045790505b5090505f5b5f548110156111555760405180604001604052805f83815481106110565761105661227f565b905f5260205f2001805461106990611c80565b80601f016020809104026020016040519081016040528092919081815260200182805461109590611c80565b80156110e05780601f106110b7576101008083540402835291602001916110e0565b820191905f5260205f20905b8154815290600101906020018083116110c357829003601f168201915b5050505050815260200160015f84815481106110fe576110fe61227f565b905f5260205f20016040516111139190612302565b908152604051908190036020019020546001600160a01b0316905282518390839081106111425761114261227f565b6020908102919091010152600101611030565b5060405180610120016040528061116a610d6b565b6001600160a01b031681526020016111806113ca565b6001600160a01b031681526020016111966105c5565b6001600160a01b031681526020016111ac610b8e565b6001600160a01b031681526020016111c2610844565b6001600160a01b031681526020016111d8610cb1565b6001600160a01b031681526020016111ee6106c1565b6001600160a01b03168152602001611204610415565b6001600160a01b0316815260200191909152919050565b61122361144f565b61122e43604061230c565b811161124c5760405162461bcd60e51b815260040161064e90612351565b7f403a465e7990270029003553a58e56a0aa4f72cdf7948740eb4d5cf4056678c18585858585604051611283959493929190612361565b60405180910390a15050505050565b61129a61144f565b6001600160a01b0381166112c05760405162461bcd60e51b815260040161064e90611d6d565b6112ee61074c60017f5c3a696a2e63ec310c7ce2ec9686153b437260263b2fd38923a13e3adc7a8d8a611c59565b7f8fda284de6722991b87a5152e250cda7a6342080d9895b760e10ce0fa5050b738160405161078091906123d3565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610ca1565b61134d61144f565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255611391610c7d565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f61044861044460017f83a6e12707c3cce2dda8a0b6be6d727d0c7e3f872360a29f026e5f6fb65eff2c611c59565b6107b660017f5c104a5cbc447428f263418ae884b79d6ce229d3ad858ef1544ef89e88adc15f611c59565b6107b660017fa508d09e1d1c531b763d64886006a2907e36a4e174a478e71c5c12a783071958611c59565b33611458610c7d565b6001600160a01b031614611481573360405163118cdaa760e01b815260040161064e9190611650565b565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b6114b5611502565b6114be81611540565b610c24611551565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556114fe82611559565b5050565b61150a6115c9565b611481576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611548611502565b610c24816115e7565b611481611502565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f6115d2611483565b5468010000000000000000900460ff16919050565b6115ef611502565b6001600160a01b038116610c1b575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161064e9190611650565b5f6001600160a01b0382166114a7565b61164a81611631565b82525050565b602081016114a78284611641565b805b8114610c24575f5ffd5b80356114a78161165e565b5f60208284031215611688576116885f5ffd5b611692838361166a565b9392505050565b8281835e505f910152565b5f6116ad825190565b8084526020840193506116c4818560208601611699565b601f01601f19169290920192915050565b6020808252810161169281846116a4565b5f61169283836116a4565b60200190565b5f611700825190565b8084526020840193508360208202850161171a8560200190565b5f5b8481101561174d578383038852815161173584826116e6565b9350506020820160209890980197915060010161171c565b50909695505050505050565b6020808252810161169281846116f7565b5f5f83601f84011261177d5761177d5f5ffd5b50813567ffffffffffffffff811115611797576117975f5ffd5b6020830191508360018202830111156117b1576117b15f5ffd5b9250929050565b5f5f602083850312156117cc576117cc5f5ffd5b823567ffffffffffffffff8111156117e5576117e55f5ffd5b6117f18582860161176a565b92509250509250929050565b61166081611631565b80356114a7816117fd565b5f60208284031215611824576118245f5ffd5b6116928383611806565b8061164a565b602081016114a7828461182e565b634e487b7160e01b5f52604160045260245ffd5b601f19601f830116810181811067ffffffffffffffff8211171561187c5761187c611842565b6040525050565b5f61188d60405190565b90506118998282611856565b919050565b5f608082840312156118b1576118b15f5ffd5b6118bb6080611883565b90506118c78383611806565b81526118d68360208401611806565b60208201526118e88360408401611806565b60408201526118fa8360608401611806565b606082015292915050565b5f5f60a08385031215611919576119195f5ffd5b611923848461189e565b91506119328460808501611806565b90509250929050565b5f67ffffffffffffffff82111561195457611954611842565b601f19601f83011660200192915050565b82818337505f910152565b5f61198261197d8461193b565b611883565b9050828152838383011115611998576119985f5ffd5b611692836020830184611965565b5f82601f8301126119b8576119b85f5ffd5b61169283833560208501611970565b5f602082840312156119da576119da5f5ffd5b813567ffffffffffffffff8111156119f3576119f35f5ffd5b6119ff848285016119a6565b949350505050565b5f5f5f60408486031215611a1c57611a1c5f5ffd5b833567ffffffffffffffff811115611a3557611a355f5ffd5b611a418682870161176a565b9350935050611a538560208601611806565b90509250925092565b805160408084525f9190840190611a7382826116a4565b9150506020830151611a886020860182611641565b509392505050565b5f6116928383611a5c565b5f611aa4825190565b80845260208401935083602082028501611abe8560200190565b5f5b8481101561174d5783830388528151611ad98482611a90565b93505060208201602098909801979150600101611ac0565b80515f90610120840190611b058582611641565b506020830151611b186020860182611641565b506040830151611b2b6040860182611641565b506060830151611b3e6060860182611641565b506080830151611b516080860182611641565b5060a0830151611b6460a0860182611641565b5060c0830151611b7760c0860182611641565b5060e0830151611b8a60e0860182611641565b50610100830151848203610100860152611ba48282611a9b565b95945050505050565b602080825281016116928184611af1565b5f5f5f5f5f60608688031215611bd557611bd55f5ffd5b853567ffffffffffffffff811115611bee57611bee5f5ffd5b611bfa8882890161176a565b9550955050602086013567ffffffffffffffff811115611c1b57611c1b5f5ffd5b611c278882890161176a565b9350935050611c39876040880161166a565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114a7576114a7611c45565b634e487b7160e01b5f52602260045260245ffd5b600281046001821680611c9457607f821691505b602082108103611ca657611ca6611c6c565b50919050565b611cb7828483611965565b500190565b611692818385611cac565b60168152602081017f4164647265737320646f6573206e6f7420657869737400000000000000000000815290506116f1565b602080825281016114a781611cc7565b818352602083019250611d1d828483611965565b50601f01601f19160190565b602080825281016119ff818486611d09565b600f8152602081017f496e76616c696420616464726573730000000000000000000000000000000000815290506116f1565b602080825281016114a781611d3b565b60158152602081017f6c3143726f7373436861696e4d657373656e6765720000000000000000000000815290506116f1565b60408082528101611dbf81611d7d565b90506114a76020830184611641565b60088152602081017f6c32427269646765000000000000000000000000000000000000000000000000815290506116f1565b60408082528101611dbf81611dce565b60138152602081017f4f776e65722063616e6e6f742062652030783000000000000000000000000000815290506116f1565b602080825281016114a781611e10565b60198152602081017f43726f737320636861696e2063616e6e6f742062652030783000000000000000815290506116f1565b602080825281016114a781611e52565b60198152602081017f4d657373616765206275732063616e6e6f742062652030783000000000000000815290506116f1565b602080825281016114a781611e94565b60268152602081017f4e6574776f726b20656e636c6176652072656769737472792063616e6e6f742081527f6265203078300000000000000000000000000000000000000000000000000000602082015290505b60400190565b602080825281016114a781611ed6565b60288152602081017f4461746120617661696c6162696c6974792072656769737472792063616e6e6f81527f742062652030783000000000000000000000000000000000000000000000000060208201529050611f2a565b602080825281016114a781611f40565b5f6114a782611fb5565b90565b67ffffffffffffffff1690565b61164a81611fa8565b602081016114a78284611fc2565b60348152602081017f556e72656e6f756e6361626c654f776e61626c6532537465703a2063616e6e6f81527f742072656e6f756e6365206f776e65727368697000000000000000000000000060208201529050611f2a565b602080825281016114a781611fd9565b60158152602081017f6c3243726f7373436861696e4d657373656e6765720000000000000000000000815290506116f1565b60408082528101611dbf81612041565b60168152602081017f4164647265737320616c72656164792065786973747300000000000000000000815290506116f1565b602080825281016114a781612083565b60148152602081017f4e616d652063616e6e6f7420626520656d707479000000000000000000000000815290506116f1565b602080825281016114a7816120c5565b5f6114a7611fb28381565b61211b83612107565b81545f1960089490940293841b1916921b91909117905550565b5f612141818484612112565b505050565b818110156114fe576121585f82612135565b600101612146565b601f821115612141575f818152602090206020601f850104810160208510156121865750805b6121986020601f860104830182612146565b5050505050565b8267ffffffffffffffff8111156121b8576121b8611842565b6121c28254611c80565b6121cd828285612160565b505f601f8211600181146121ff575f83156121e85750848201355b5f19600885021c1981166002850217855550612256565b5f84815260208120601f198516915b8281101561222e578785013582556020948501946001909201910161220e565b508482101561224a575f196008601f8716021c19878501351681555b50506001600284020184555b505050505050565b60408082528101612270818587611d09565b90506119ff6020830184611641565b634e487b7160e01b5f52603260045260245ffd5b5f815461229f81611c80565b6001821680156122b657600181146122cb576122f9565b60ff19831686528115158202860193506122f9565b5f858152602090205f5b838110156122f1578154888201526001909101906020016122d5565b505081860193505b50505092915050565b6114a78183612293565b808201808211156114a7576114a7611c45565b60148152602081017f496e76616c69642076616c69644174426c6f636b000000000000000000000000815290506116f1565b602080825281016114a78161231f565b60608082528101612373818789611d09565b90508181036020830152612388818587611d09565b9050612397604083018461182e565b9695505050505050565b60088152602081017f6c31427269646765000000000000000000000000000000000000000000000000815290506116f1565b60408082528101611dbf816123a156fea26469706673582212207cd3c55ea986e2569a4abf40a4a04fd21c92f9b8c86d4a1b5b6e2164633c2ac064736f6c634300081c0033", } // NetworkConfigABI is the input ABI used to generate the binding from. @@ -1160,25 +1160,25 @@ func (_NetworkConfig *NetworkConfigTransactorSession) TransferOwnership(newOwner return _NetworkConfig.Contract.TransferOwnership(&_NetworkConfig.TransactOpts, newOwner) } -// UpgradeFeature is a paid mutator transaction binding the contract method 0xff489409. +// UpgradeFeature is a paid mutator transaction binding the contract method 0xdbf5d903. // -// Solidity: function upgradeFeature(string featureName, bytes featureData) returns() -func (_NetworkConfig *NetworkConfigTransactor) UpgradeFeature(opts *bind.TransactOpts, featureName string, featureData []byte) (*types.Transaction, error) { - return _NetworkConfig.contract.Transact(opts, "upgradeFeature", featureName, featureData) +// Solidity: function upgradeFeature(string featureName, bytes featureData, uint256 validAtBlock) returns() +func (_NetworkConfig *NetworkConfigTransactor) UpgradeFeature(opts *bind.TransactOpts, featureName string, featureData []byte, validAtBlock *big.Int) (*types.Transaction, error) { + return _NetworkConfig.contract.Transact(opts, "upgradeFeature", featureName, featureData, validAtBlock) } -// UpgradeFeature is a paid mutator transaction binding the contract method 0xff489409. +// UpgradeFeature is a paid mutator transaction binding the contract method 0xdbf5d903. // -// Solidity: function upgradeFeature(string featureName, bytes featureData) returns() -func (_NetworkConfig *NetworkConfigSession) UpgradeFeature(featureName string, featureData []byte) (*types.Transaction, error) { - return _NetworkConfig.Contract.UpgradeFeature(&_NetworkConfig.TransactOpts, featureName, featureData) +// Solidity: function upgradeFeature(string featureName, bytes featureData, uint256 validAtBlock) returns() +func (_NetworkConfig *NetworkConfigSession) UpgradeFeature(featureName string, featureData []byte, validAtBlock *big.Int) (*types.Transaction, error) { + return _NetworkConfig.Contract.UpgradeFeature(&_NetworkConfig.TransactOpts, featureName, featureData, validAtBlock) } -// UpgradeFeature is a paid mutator transaction binding the contract method 0xff489409. +// UpgradeFeature is a paid mutator transaction binding the contract method 0xdbf5d903. // -// Solidity: function upgradeFeature(string featureName, bytes featureData) returns() -func (_NetworkConfig *NetworkConfigTransactorSession) UpgradeFeature(featureName string, featureData []byte) (*types.Transaction, error) { - return _NetworkConfig.Contract.UpgradeFeature(&_NetworkConfig.TransactOpts, featureName, featureData) +// Solidity: function upgradeFeature(string featureName, bytes featureData, uint256 validAtBlock) returns() +func (_NetworkConfig *NetworkConfigTransactorSession) UpgradeFeature(featureName string, featureData []byte, validAtBlock *big.Int) (*types.Transaction, error) { + return _NetworkConfig.Contract.UpgradeFeature(&_NetworkConfig.TransactOpts, featureName, featureData, validAtBlock) } // NetworkConfigAdditionalContractAddressAddedIterator is returned from FilterAdditionalContractAddressAdded and is used to iterate over the raw logs and unpacked data for AdditionalContractAddressAdded events raised by the NetworkConfig contract. @@ -2094,14 +2094,15 @@ func (it *NetworkConfigUpgradedIterator) Close() error { // NetworkConfigUpgraded represents a Upgraded event raised by the NetworkConfig contract. type NetworkConfigUpgraded struct { - FeatureName string - FeatureData []byte - Raw types.Log // Blockchain specific contextual infos + FeatureName string + FeatureData []byte + ValidAtBlock *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterUpgraded is a free log retrieval operation binding the contract event 0x23dedaf6832e6f49f00aba880354923b9a346706121410bb3aba36d29dd82018. +// FilterUpgraded is a free log retrieval operation binding the contract event 0x403a465e7990270029003553a58e56a0aa4f72cdf7948740eb4d5cf4056678c1. // -// Solidity: event Upgraded(string featureName, bytes featureData) +// Solidity: event Upgraded(string featureName, bytes featureData, uint256 validAtBlock) func (_NetworkConfig *NetworkConfigFilterer) FilterUpgraded(opts *bind.FilterOpts) (*NetworkConfigUpgradedIterator, error) { logs, sub, err := _NetworkConfig.contract.FilterLogs(opts, "Upgraded") @@ -2111,9 +2112,9 @@ func (_NetworkConfig *NetworkConfigFilterer) FilterUpgraded(opts *bind.FilterOpt return &NetworkConfigUpgradedIterator{contract: _NetworkConfig.contract, event: "Upgraded", logs: logs, sub: sub}, nil } -// WatchUpgraded is a free log subscription operation binding the contract event 0x23dedaf6832e6f49f00aba880354923b9a346706121410bb3aba36d29dd82018. +// WatchUpgraded is a free log subscription operation binding the contract event 0x403a465e7990270029003553a58e56a0aa4f72cdf7948740eb4d5cf4056678c1. // -// Solidity: event Upgraded(string featureName, bytes featureData) +// Solidity: event Upgraded(string featureName, bytes featureData, uint256 validAtBlock) func (_NetworkConfig *NetworkConfigFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *NetworkConfigUpgraded) (event.Subscription, error) { logs, sub, err := _NetworkConfig.contract.WatchLogs(opts, "Upgraded") @@ -2148,9 +2149,9 @@ func (_NetworkConfig *NetworkConfigFilterer) WatchUpgraded(opts *bind.WatchOpts, }), nil } -// ParseUpgraded is a log parse operation binding the contract event 0x23dedaf6832e6f49f00aba880354923b9a346706121410bb3aba36d29dd82018. +// ParseUpgraded is a log parse operation binding the contract event 0x403a465e7990270029003553a58e56a0aa4f72cdf7948740eb4d5cf4056678c1. // -// Solidity: event Upgraded(string featureName, bytes featureData) +// Solidity: event Upgraded(string featureName, bytes featureData, uint256 validAtBlock) func (_NetworkConfig *NetworkConfigFilterer) ParseUpgraded(log types.Log) (*NetworkConfigUpgraded, error) { event := new(NetworkConfigUpgraded) if err := _NetworkConfig.contract.UnpackLog(event, "Upgraded", log); err != nil { diff --git a/contracts/src/l1_management/contracts/NetworkConfig.sol b/contracts/src/l1_management/contracts/NetworkConfig.sol index 7b0c7a8ef6..4c04279afb 100644 --- a/contracts/src/l1_management/contracts/NetworkConfig.sol +++ b/contracts/src/l1_management/contracts/NetworkConfig.sol @@ -99,7 +99,7 @@ contract NetworkConfig is Initializable, UnrenouncableOwnable2Step { * @param featureName The name of the feature that was upgraded * @param featureData The data of the feature that was upgraded - to be forwarded to it for initialization. */ - event Upgraded(string featureName, bytes featureData); + event Upgraded(string featureName, bytes featureData, uint256 validAtBlock); /** * @dev Initializes the contract with addresses and owner @@ -279,7 +279,8 @@ contract NetworkConfig is Initializable, UnrenouncableOwnable2Step { * @param featureName The name of the feature that was upgraded * @param featureData The data of the feature that was upgraded - to be forwarded to it for initialization. */ - function upgradeFeature(string calldata featureName, bytes calldata featureData) external onlyOwner { - emit Upgraded(featureName, featureData); + function upgradeFeature(string calldata featureName, bytes calldata featureData, uint256 validAtBlock) external onlyOwner { + require(validAtBlock > block.number + 64, "Invalid validAtBlock"); + emit Upgraded(featureName, featureData, validAtBlock); } } \ No newline at end of file diff --git a/go/common/errutil/errors_util.go b/go/common/errutil/errors_util.go index c246d42a20..ab5f39b1b3 100644 --- a/go/common/errutil/errors_util.go +++ b/go/common/errutil/errors_util.go @@ -26,6 +26,7 @@ var ( ErrCrossChainBundleNoBatches = errors.New("no batches for cross chain bundle") ErrCrossChainRootMismatch = errors.New("cross chain root mismatch") ErrCriticalRollupProcessing = errors.New("critical error during rollup processing") + ErrUpgradeNotSupported = errors.New("upgrade not supported") ) // BlockRejectError is used as a standard format for error response from enclave for block submission errors diff --git a/go/common/rpc/converters.go b/go/common/rpc/converters.go index 600a68d5e8..1926c42106 100644 --- a/go/common/rpc/converters.go +++ b/go/common/rpc/converters.go @@ -1,12 +1,14 @@ package rpc import ( + "errors" "fmt" "math/big" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ten-protocol/go-ten/go/common" + "github.com/ten-protocol/go-ten/go/common/errutil" "github.com/ten-protocol/go-ten/go/common/rpc/generated" gethcommon "github.com/ethereum/go-ethereum/common" @@ -78,6 +80,17 @@ func ToBlockSubmissionResponseMsg(response *common.BlockSubmissionResponse) (*ge return msg, nil } +func FromBlockSubmissionErrorMsg(msg *generated.BlockSubmissionErrorMsg) *errutil.BlockRejectError { + if msg == nil { + return nil + } + + return &errutil.BlockRejectError{ + L1Head: gethcommon.BytesToHash(msg.L1Head), + Wrapped: errors.New(msg.Cause), + } +} + func FromBlockSubmissionResponseMsg(msg *generated.BlockSubmissionResponseMsg) (*common.BlockSubmissionResponse, error) { rollupMetadata := make([]common.ExtRollupMetadata, len(msg.RollupMetadata)) for i, metadata := range msg.RollupMetadata { @@ -88,6 +101,7 @@ func FromBlockSubmissionResponseMsg(msg *generated.BlockSubmissionResponseMsg) ( return &common.BlockSubmissionResponse{ ProducedSecretResponses: FromSecretRespMsg(msg.ProducedSecretResponses), RollupMetadata: rollupMetadata, + RejectError: FromBlockSubmissionErrorMsg(msg.Error), }, nil } diff --git a/go/enclave/components/gas_pricer.go b/go/enclave/components/gas_pricer.go index e4b0ff5843..b3d31e85c2 100644 --- a/go/enclave/components/gas_pricer.go +++ b/go/enclave/components/gas_pricer.go @@ -13,10 +13,7 @@ import ( ) const ( - InitialBaseFee = params.InitialBaseFee / 10 // InitialBaseFee is ETH's base fee. - ComponentName = "gas_pricing" - DynamicPricingTrigger = "dynamic-pricing" - StaticPricingTrigger = "static_pricing" + InitialBaseFee = params.InitialBaseFee / 10 // InitialBaseFee is ETH's base fee. ) type GasPricer struct { diff --git a/go/enclave/components/upgrade_manager.go b/go/enclave/components/upgrade_manager.go index b8debf3bb7..dfb8a9eb75 100644 --- a/go/enclave/components/upgrade_manager.go +++ b/go/enclave/components/upgrade_manager.go @@ -2,11 +2,15 @@ package components import ( "context" + "fmt" "github.com/ethereum/go-ethereum/core/types" gethlog "github.com/ethereum/go-ethereum/log" + "github.com/ten-protocol/go-ten/contracts/generated/NetworkConfig" "github.com/ten-protocol/go-ten/go/common" + "github.com/ten-protocol/go-ten/go/common/errutil" "github.com/ten-protocol/go-ten/go/enclave/storage" + "github.com/ten-protocol/go-ten/go/enclave/storage/enclavedb" ) // NetworkUpgradeConfirmationDepth retained for reference @@ -33,8 +37,141 @@ func (um *upgradeManager) RegisterUpgradeHandler(featureName string, handler Upg // keep API no-op } +func (um *upgradeManager) StoreNetworkUpgrades(ctx context.Context, blockHeader *types.Header, upgrades []NetworkConfig.NetworkConfigUpgraded) error { + if len(upgrades) == 0 { + return nil + } + + for _, upgrade := range upgrades { + um.logger.Info("Upgrade detected", "featureName", upgrade.FeatureName, "featureData", upgrade.FeatureData) + blockHeight := blockHeader.Number.Uint64() + 64 + blockHeightActive := upgrade.ValidAtBlock.Uint64() + + err := um.storage.StoreNetworkUpgrade(ctx, &enclavedb.NetworkUpgrade{ + FeatureName: upgrade.FeatureName, + FeatureData: upgrade.FeatureData, + BlockHash: blockHeader.Hash(), + BlockHeightFinal: &blockHeight, + BlockHeightActive: &blockHeightActive, + }) + if err != nil { + return fmt.Errorf("failed to store network upgrade. Cause: %w", err) + } + } + um.logger.Info("Stored network upgrades", "upgrades", len(upgrades)) + return nil +} + +// collectNetworkUpgrades extracts all NetworkConfigUpgraded from L1 data +func (um *upgradeManager) collectNetworkUpgrades(processed *common.ProcessedL1Data) []NetworkConfig.NetworkConfigUpgraded { + upgradeTxs := processed.GetEvents(common.NetworkUpgradedTx) + allUpgrades := make([]NetworkConfig.NetworkConfigUpgraded, 0) + for _, tx := range upgradeTxs { + allUpgrades = append(allUpgrades, tx.NetworkUpgrades...) + } + return allUpgrades +} + +// filterSupportedUpgrades filters upgrades to only include supported ones +func (um *upgradeManager) filterSupportedUpgrades(ctx context.Context, allUpgrades []NetworkConfig.NetworkConfigUpgraded) []NetworkConfig.NetworkConfigUpgraded { + supportedUpgrades := make([]NetworkConfig.NetworkConfigUpgraded, 0) + for _, upgrade := range allUpgrades { + um.logger.Info("Upgrade detected", "featureName", upgrade.FeatureName, "featureData", upgrade.FeatureData) + + // Check if handler is registered for this upgrade + handlers, ok := um.handlers[upgrade.FeatureName] + if !ok { + um.logger.Warn("No handler registered for upgrade, filtering out", "featureName", upgrade.FeatureName) + continue + } + + // Check if all handlers support this upgrade + upgradeSupported := true + for _, handler := range handlers { + canUpgrade := handler.CanUpgrade(ctx, upgrade.FeatureName, upgrade.FeatureData) + if !canUpgrade { + um.logger.Warn("Upgrade not supported by handler, filtering out", "featureName", upgrade.FeatureName) + upgradeSupported = false + break + } + } + + if upgradeSupported { + supportedUpgrades = append(supportedUpgrades, upgrade) + um.logger.Info("Upgrade supported and included", "featureName", upgrade.FeatureName) + } + } + + um.logger.Info("Filtered upgrades", "total", len(allUpgrades), "supported", len(supportedUpgrades)) + return supportedUpgrades +} + +func (um *upgradeManager) getUpgradesFor(blockHeader *types.Header) ([]NetworkConfig.NetworkConfigUpgraded, error) { + ctx := context.Background() + + // Ensure the current block is canonical before proceeding + isCanonical, err := um.storage.IsBlockCanonical(ctx, blockHeader.Hash()) + if err != nil { + um.logger.Error("Failed to check block canonicality", "hash", blockHeader.Hash(), "error", err) + return nil, fmt.Errorf("failed to check block canonicality: %w", err) + } + if !isCanonical { + return nil, fmt.Errorf("block %s is not canonical", blockHeader.Hash()) + } + + // Load activated upgrades up to current block height + currentHeight := blockHeader.Number.Uint64() + stored, err := um.storage.GetActivatedNetworkUpgrades(ctx, currentHeight) + if err != nil { + um.logger.Error("Failed to load activated network upgrades from storage", "error", err, "height", currentHeight) + return nil, fmt.Errorf("failed to load activated network upgrades: %w", err) + } + + // Filter: only upgrades whose saved block hash is canonical + candidates := make([]NetworkConfig.NetworkConfigUpgraded, 0) + for _, u := range stored { + // The upgrade must have been recorded for a canonical block hash + upgradeBlockCanonical, err := um.storage.IsBlockCanonical(ctx, u.BlockHash) + if err != nil { + um.logger.Error("Failed to check canonicality for upgrade's block", "hash", u.BlockHash, "error", err) + return nil, fmt.Errorf("failed to check canonicality for upgrade's block: %w", err) + } + if !upgradeBlockCanonical { + continue + } + + candidates = append(candidates, NetworkConfig.NetworkConfigUpgraded{ + FeatureName: u.FeatureName, + FeatureData: u.FeatureData, + }) + } + + // Verify all selected upgrades are supported by registered handlers + supported := um.filterSupportedUpgrades(ctx, candidates) + if len(supported) != len(candidates) { + return nil, fmt.Errorf("unsupported upgrades detected at height %d: total=%d supported=%d", currentHeight, len(candidates), len(supported)) + } + + return supported, nil +} + func (um *upgradeManager) OnL1Block(ctx context.Context, blockHeader *types.Header, processed *common.ProcessedL1Data) error { - // no-op: upgrades disabled + // Collect all upgrades from L1 data + allUpgrades := um.collectNetworkUpgrades(processed) + + // Store all upgrades (both supported and unsupported) + err := um.StoreNetworkUpgrades(ctx, blockHeader, allUpgrades) + if err != nil { + um.logger.Error("Failed to store network upgrades", "error", err) + return err + } + + _, err = um.getUpgradesFor(blockHeader) + if err != nil { + um.logger.Error("Failed to get upgrades for block", "error", err) + return errutil.ErrUpgradeNotSupported + } + return nil } diff --git a/go/enclave/enclave_admin_service.go b/go/enclave/enclave_admin_service.go index 1ba4b9f92a..16d3dcc392 100644 --- a/go/enclave/enclave_admin_service.go +++ b/go/enclave/enclave_admin_service.go @@ -204,6 +204,13 @@ func (e *enclaveAdminService) SubmitL1Block(ctx context.Context, blockData *comm return nil, e.rejectBlockErr(ctx, fmt.Errorf("could not submit L1 block. Cause: %w", err)) } + // Process network upgrade events when they reach finality + err = e.upgradeManager.OnL1Block(ctx, blockHeader, blockData) + if err != nil { + e.logger.Error("Failed to process network upgrades", "error", err) + return nil, e.rejectBlockErr(ctx, fmt.Errorf("could not process network upgrades. Cause: %w", err)) + } + err = e.storage.UpdateProcessed(ctx, blockHeader.Hash()) if err != nil { return nil, e.rejectBlockErr(ctx, fmt.Errorf("could not submit L1 block. Cause: %w", err)) @@ -220,12 +227,6 @@ func (e *enclaveAdminService) SubmitL1Block(ctx context.Context, blockData *comm // doing this after the network secret msgs to make sure we have stored the attestation before promotion. e.processSequencerPromotions(blockData) - // Process network upgrade events when they reach finality - err = e.upgradeManager.OnL1Block(ctx, blockHeader, blockData) - if err != nil { - return nil, e.rejectBlockErr(ctx, fmt.Errorf("could not process network upgrades. Cause: %w", err)) - } - return bsr, nil } diff --git a/go/enclave/storage/enclavedb/network_upgrade.go b/go/enclave/storage/enclavedb/network_upgrade.go index f944548dbb..726dc7c50b 100644 --- a/go/enclave/storage/enclavedb/network_upgrade.go +++ b/go/enclave/storage/enclavedb/network_upgrade.go @@ -1,3 +1,172 @@ package enclavedb -// Upgrades disabled: network_upgrade.go stashed. Keep package for imports if any remain. +import ( + "context" + "database/sql" + + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/jmoiron/sqlx" +) + +// NetworkUpgrade represents a network upgrade feature +type NetworkUpgrade struct { + ID uint64 `db:"id" json:"id"` + FeatureName string `db:"feature_name" json:"feature_name"` + FeatureData []byte `db:"feature_data" json:"-"` + BlockHash gethcommon.Hash `db:"block_hash" json:"block_hash"` + BlockHeightFinal *uint64 `db:"block_height_final" json:"block_height_final"` + BlockHeightActive *uint64 `db:"block_height_active" json:"block_height_active"` + CreatedAt sql.NullTime `db:"created_at" json:"created_at"` +} + +// FeatureData is stored and retrieved as raw bytes; no JSON marshaling is applied + +// StoreNetworkUpgrade stores a new network upgrade in the database +func StoreNetworkUpgrade(ctx context.Context, db *sqlx.Tx, upgrade *NetworkUpgrade) error { + query := `INSERT INTO network_upgrade + (feature_name, feature_data, block_hash, block_height_final, block_height_active) + VALUES (?, ?, ?, ?, ?)` + + _, err := db.ExecContext(ctx, query, + upgrade.FeatureName, + upgrade.FeatureData, + upgrade.BlockHash.Bytes(), + upgrade.BlockHeightFinal, + upgrade.BlockHeightActive, + ) + + return err +} + +// GetNetworkUpgrades retrieves all network upgrades from the database +func GetNetworkUpgrades(ctx context.Context, db *sqlx.DB) ([]*NetworkUpgrade, error) { + query := `SELECT id, feature_name, feature_data, block_hash, block_height_final, block_height_active, created_at + FROM network_upgrade + ORDER BY created_at ASC` + + var upgrades []*NetworkUpgrade + rows, err := db.QueryxContext(ctx, query) + if err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var upgrade NetworkUpgrade + var blockHashBytes []byte + + err := rows.Scan( + &upgrade.ID, + &upgrade.FeatureName, + &upgrade.FeatureData, + &blockHashBytes, + &upgrade.BlockHeightFinal, + &upgrade.BlockHeightActive, + &upgrade.CreatedAt, + ) + if err != nil { + return nil, err + } + + // Convert block_hash bytes to gethcommon.Hash + upgrade.BlockHash = gethcommon.BytesToHash(blockHashBytes) + + upgrades = append(upgrades, &upgrade) + } + + return upgrades, rows.Err() +} + +// GetNetworkUpgradesByFeature retrieves network upgrades for a specific feature +func GetNetworkUpgradesByFeature(ctx context.Context, db *sqlx.DB, featureName string) ([]*NetworkUpgrade, error) { + query := `SELECT id, feature_name, feature_data, block_hash, block_height_final, block_height_active, created_at + FROM network_upgrade + WHERE feature_name = ? + ORDER BY created_at ASC` + + var upgrades []*NetworkUpgrade + rows, err := db.QueryxContext(ctx, query, featureName) + if err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var upgrade NetworkUpgrade + var blockHashBytes []byte + + err := rows.Scan( + &upgrade.ID, + &upgrade.FeatureName, + &upgrade.FeatureData, + &blockHashBytes, + &upgrade.BlockHeightFinal, + &upgrade.BlockHeightActive, + &upgrade.CreatedAt, + ) + if err != nil { + return nil, err + } + + // Convert block_hash bytes to gethcommon.Hash + upgrade.BlockHash = gethcommon.BytesToHash(blockHashBytes) + + upgrades = append(upgrades, &upgrade) + } + + return upgrades, rows.Err() +} + +func GetActivatedNetworkUpgrades(ctx context.Context, db *sqlx.DB, height uint64) ([]*NetworkUpgrade, error) { + query := `SELECT id, feature_name, feature_data, block_hash, block_height_final, block_height_active, created_at + FROM network_upgrade + WHERE block_height_active IS NOT NULL AND block_height_active <= ? + ORDER BY created_at ASC` + + var upgrades []*NetworkUpgrade + rows, err := db.QueryxContext(ctx, query, height) + if err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var upgrade NetworkUpgrade + var blockHashBytes []byte + + err := rows.Scan( + &upgrade.ID, + &upgrade.FeatureName, + &upgrade.FeatureData, + &blockHashBytes, + &upgrade.BlockHeightFinal, + &upgrade.BlockHeightActive, + &upgrade.CreatedAt, + ) + if err != nil { + return nil, err + } + + upgrade.BlockHash = gethcommon.BytesToHash(blockHashBytes) + upgrades = append(upgrades, &upgrade) + } + + return upgrades, rows.Err() +} + +// DeleteNetworkUpgrade removes a network upgrade from the database +func DeleteNetworkUpgrade(ctx context.Context, db *sqlx.Tx, id uint64) error { + query := `DELETE FROM network_upgrade WHERE id = ?` + _, err := db.ExecContext(ctx, query, id) + return err +} + +// UpdateNetworkUpgradeHeights updates the finalization and activation heights for a network upgrade +func UpdateNetworkUpgradeHeights(ctx context.Context, db *sqlx.Tx, id uint64, finalHeight, activeHeight *uint64) error { + query := `UPDATE network_upgrade + SET block_height_final = ?, block_height_active = ? + WHERE id = ?` + + _, err := db.ExecContext(ctx, query, finalHeight, activeHeight, id) + return err +} diff --git a/go/enclave/storage/init/edgelessdb/003_init.sql b/go/enclave/storage/init/edgelessdb/003_init.sql new file mode 100644 index 0000000000..3dbc00fbf8 --- /dev/null +++ b/go/enclave/storage/init/edgelessdb/003_init.sql @@ -0,0 +1,17 @@ +-- Create table for storing network upgrades +create table if not exists tendb.network_upgrade +( + id int NOT NULL AUTO_INCREMENT, + feature_name varchar(255) NOT NULL, + feature_data mediumblob NOT NULL, + block_hash binary(32) NOT NULL, + block_height_final bigint, + block_height_active bigint, + created_at timestamp DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id) +); + +-- Indexes for efficient queries +CREATE INDEX feature ON tendb.network_upgrade (feature_name); +CREATE INDEX block_hash ON tendb.network_upgrade (block_hash); +CREATE INDEX heights ON tendb.network_upgrade (block_height_final, block_height_active); diff --git a/go/enclave/storage/init/sqlite/003_init.sql b/go/enclave/storage/init/sqlite/003_init.sql new file mode 100644 index 0000000000..9e0483e5ea --- /dev/null +++ b/go/enclave/storage/init/sqlite/003_init.sql @@ -0,0 +1,16 @@ +-- Create table for storing network upgrades +create table if not exists network_upgrade +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + feature_name varchar(255) NOT NULL, + feature_data mediumblob NOT NULL, + block_hash binary(32) NOT NULL, + block_height_final bigint, + block_height_active bigint, + created_at timestamp DEFAULT CURRENT_TIMESTAMP +); + +-- Indexes for efficient queries +create index IDX_NETWORK_UPGRADE_FEATURE on network_upgrade (feature_name); +create index IDX_NETWORK_UPGRADE_BLOCK_HASH on network_upgrade (block_hash); +create index IDX_NETWORK_UPGRADE_HEIGHTS on network_upgrade (block_height_final, block_height_active); diff --git a/go/enclave/storage/interfaces.go b/go/enclave/storage/interfaces.go index f45418fbe5..2dd6c5216c 100644 --- a/go/enclave/storage/interfaces.go +++ b/go/enclave/storage/interfaces.go @@ -128,6 +128,12 @@ type SystemContractAddressesStorage interface { GetSystemContractAddresses(ctx context.Context) (common.SystemContractAddresses, error) } +type NetworkUpgradeStorage interface { + StoreNetworkUpgrade(ctx context.Context, upgrade *enclavedb.NetworkUpgrade) error + GetNetworkUpgrades(ctx context.Context) ([]*enclavedb.NetworkUpgrade, error) + GetActivatedNetworkUpgrades(ctx context.Context, height uint64) ([]*enclavedb.NetworkUpgrade, error) +} + // Storage is the enclave's interface for interacting with the enclave's datastore type Storage interface { BlockResolver @@ -140,6 +146,7 @@ type Storage interface { EnclaveKeyStorage ScanStorage SystemContractAddressesStorage + NetworkUpgradeStorage io.Closer // HealthCheck returns whether the storage is deemed healthy or not diff --git a/go/enclave/storage/storage.go b/go/enclave/storage/storage.go index fafaaca60f..88452e90ce 100644 --- a/go/enclave/storage/storage.go +++ b/go/enclave/storage/storage.go @@ -1164,5 +1164,44 @@ func (s *storageImpl) GetSequencerEnclaveIDs(ctx context.Context) ([]common.Encl // NetworkUpgradeStorage implementation -// Removed: StorePendingNetworkUpgrade, FinalizeNetworkUpgrade, GetPendingNetworkUpgrades, GetFinalizedNetworkUpgrades -// Upgrades are disabled; methods deleted. +func (s *storageImpl) StoreNetworkUpgrade(ctx context.Context, upgrade *enclavedb.NetworkUpgrade) error { + defer s.logDuration("StoreNetworkUpgrade", measure.NewStopwatch()) + + dbTx, err := s.db.NewDBTransaction(ctx) + if err != nil { + return fmt.Errorf("could not create DB transaction - %w", err) + } + defer dbTx.Rollback() + + if err := enclavedb.StoreNetworkUpgrade(ctx, dbTx, upgrade); err != nil { + return fmt.Errorf("could not store network upgrade - %w", err) + } + + if err := dbTx.Commit(); err != nil { + return fmt.Errorf("could not commit network upgrade transaction - %w", err) + } + + return nil +} + +func (s *storageImpl) GetNetworkUpgrades(ctx context.Context) ([]*enclavedb.NetworkUpgrade, error) { + defer s.logDuration("GetNetworkUpgrades", measure.NewStopwatch()) + + upgrades, err := enclavedb.GetNetworkUpgrades(ctx, s.db.GetSQLDB()) + if err != nil { + return nil, fmt.Errorf("could not fetch network upgrades - %w", err) + } + + return upgrades, nil +} + +func (s *storageImpl) GetActivatedNetworkUpgrades(ctx context.Context, height uint64) ([]*enclavedb.NetworkUpgrade, error) { + defer s.logDuration("GetActivatedNetworkUpgrades", measure.NewStopwatch()) + + upgrades, err := enclavedb.GetActivatedNetworkUpgrades(ctx, s.db.GetSQLDB(), height) + if err != nil { + return nil, fmt.Errorf("could not fetch activated network upgrades - %w", err) + } + + return upgrades, nil +} diff --git a/go/host/enclave/guardian.go b/go/host/enclave/guardian.go index 9370de1e41..05790b34a3 100644 --- a/go/host/enclave/guardian.go +++ b/go/host/enclave/guardian.go @@ -540,9 +540,18 @@ func (g *Guardian) submitL1Block(block *types.Header, isLatest bool) (bool, erro resp, err := g.enclaveClient.SubmitL1Block(context.Background(), processedData) + if resp.RejectError != nil { + if resp.RejectError.Is(errutil.ErrUpgradeNotSupported) { + g.logger.Info("Upgrade not supported, stopping enclave") + g.Stop() + g.submitDataLock.Unlock() // lock is only guarding the enclave call, so we can release it now + return false, errutil.ErrUpgradeNotSupported + } + } + g.submitDataLock.Unlock() // lock is only guarding the enclave call, so we can release it now - if err != nil { - if strings.Contains(err.Error(), errutil.ErrBlockAlreadyProcessed.Error()) { + if resp.RejectError != nil { + if strings.Contains(resp.RejectError.Error(), errutil.ErrBlockAlreadyProcessed.Error()) { // we have already processed this block, let's try the next canonical block // this is most common when we are returning to a previous fork and the enclave has already seen some of the blocks on it // note: logging this because we don't expect it to happen often and would like visibility on that. diff --git a/integration/simulation/simulation.go b/integration/simulation/simulation.go index ff2794808e..ed29911ecb 100644 --- a/integration/simulation/simulation.go +++ b/integration/simulation/simulation.go @@ -35,7 +35,6 @@ import ( "github.com/ten-protocol/go-ten/integration/simulation/stats" gethcommon "github.com/ethereum/go-ethereum/common" - "github.com/ten-protocol/go-ten/contracts/generated/NetworkConfig" testcommon "github.com/ten-protocol/go-ten/integration/common" ) @@ -105,9 +104,6 @@ func (s *Simulation) Start() { fmt.Printf("Prefunding L1 wallets\n") s.prefundL1Accounts() // Prefund every L1 wallet - fmt.Printf("Triggering dynamic gas pricing upgrade\n") - s.triggerGasPricingUpgrade() // Trigger the network upgrade for dynamic gas pricing - fmt.Printf("Checking health status\n") s.checkHealthStatus() // Checks the nodes health status @@ -494,62 +490,6 @@ func (s *Simulation) prefundL1Accounts() { } } -func (s *Simulation) triggerGasPricingUpgrade() { - if s.Params.IsInMem { - return - } - - // Use L1 client and wallet to call NetworkConfig contract on L1 - l1Client := s.RPCHandles.RndEthClient() - l1Wallet := s.Params.Wallets.ContractOwnerWallet // Use L1 faucet wallet - - // Get NetworkConfig contract address from L1TenData - networkConfigAddress := s.Params.L1TenData.NetworkConfigAddress - if networkConfigAddress.Cmp(gethcommon.Address{}) == 0 { - panic(fmt.Errorf("network config address is not set")) - } - - // Create NetworkConfig contract instance - networkConfig, err := NetworkConfig.NewNetworkConfig(networkConfigAddress, l1Client.EthClient()) - if err != nil { - panic(fmt.Errorf("failed to create NetworkConfig contract instance: %w", err)) - } - - // Create transactor for L1 transaction - auth, err := bind.NewKeyedTransactorWithChainID(l1Wallet.PrivateKey(), l1Wallet.ChainID()) - if err != nil { - panic(fmt.Errorf("failed to create transactor for gas pricing upgrade: %w", err)) - } - - auth.Nonce = big.NewInt(int64(l1Wallet.GetNonceAndIncrement())) - auth.Context = s.ctx - auth.Value = big.NewInt(0) - - // Call UpgradeFeature with gas_pricing feature and dynamic-pricing data - featureName := "gas_pricing" - featureData := []byte("dynamic-pricing") - - tx, err := networkConfig.UpgradeFeature(auth, featureName, featureData) - if err != nil { - panic(fmt.Errorf("failed to call UpgradeFeature: %w", err)) - } - - // Wait for transaction to be mined - receipt, err := testcommon.AwaitReceiptEth(s.ctx, l1Client.EthClient(), tx.Hash(), 20*time.Second) - if err != nil { - panic(fmt.Errorf("failed to wait for gas pricing upgrade transaction: %w", err)) - } - - if receipt.Status != types.ReceiptStatusSuccessful { - panic(fmt.Errorf("gas pricing upgrade transaction failed")) - } - - testlog.Logger().Info("Successfully triggered dynamic gas pricing upgrade", - "txHash", tx.Hash().Hex(), - "featureName", featureName, - "featureData", string(featureData)) -} - func (s *Simulation) checkHealthStatus() { testlog.Logger().Info("Checking health status") diff --git a/integration/simulation/transaction_injector.go b/integration/simulation/transaction_injector.go index 39249fce5a..3215cf4ca1 100644 --- a/integration/simulation/transaction_injector.go +++ b/integration/simulation/transaction_injector.go @@ -145,6 +145,11 @@ func (ti *TransactionInjector) Start() { return nil }) + wg.Go(func() error { + ti.issueUpgradeTransaction() + return nil + }) + _ = wg.Wait() // future proofing to return errors ti.fullyStoppedChan <- true }