diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a8e5ca692..550655dfc 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -103,8 +103,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615eda380380615eda83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d8d8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061023f575f3560e01c806380dd672f11610135578063b771b3bc116100b4578063d5f20ff611610079578063d5f20ff614610516578063df93d8de14610536578063e4a63c4014610540578063fb8b11dd14610554578063fd7ac5e714610567575f80fd5b8063b771b3bc146104ae578063ba3a4b97146104d4578063bc5fbfec146104e7578063bee0a03f146104fb578063c974d1b61461050e575f80fd5b80639e1bc4ef116100fa5780639e1bc4ef1461044e5780639e478eea14610461578063a3a65e4814610474578063a9778a7a146102ee578063afb9809614610487575f80fd5b806380dd672f146103fa5780638280a25a1461040d5780638ef34c981461041557806393e24598146104285780639ae064471461043b575f80fd5b8063467ef06f116101c1578063620658561161018657806362065856146103a757806366435abf146103ba578063732214f8146103cd57806376f78621146103d45780637d8d2f77146103e7575f80fd5b8063467ef06f146103305780634bee0040146103435780635dd6a6cb1461036457806360305d621461037757806360ad778414610394575f80fd5b806325e1c7761161020757806325e1c776146102b05780632e2194d8146102c357806335455ded146102ee57806337b9be8f1461030a5780633a1cfff61461031d575f80fd5b80630118acc4146102435780630322ed9814610258578063151d30d11461026b5780631ec447241461028a57806320d91b7a1461029d575b5f80fd5b610256610251366004614cd1565b61057a565b005b610256610266366004614d0c565b61058b565b610273600a81565b60405160ff90911681526020015b60405180910390f35b610256610298366004614cd1565b61081b565b6102566102ab366004614d23565b610827565b6102566102be366004614d71565b610dac565b6102d66102d1366004614d0c565b610e20565b6040516001600160401b039091168152602001610281565b6102f761271081565b60405161ffff9091168152602001610281565b610256610318366004614da6565b610e74565b61025661032b366004614cd1565b610e87565b61025661033e366004614df4565b610e93565b610356610351366004614e32565b610f78565b604051908152602001610281565b610256610372366004614da6565b610fad565b61037f601481565b60405163ffffffff9091168152602001610281565b6102566103a2366004614d71565b610fb9565b6103566103b5366004614e99565b611286565b6102d66103c8366004614d0c565b6112a6565b6103565f81565b6102566103e2366004614cd1565b6112ba565b6102566103f5366004614da6565b6112c6565b610256610408366004614d71565b6112d2565b610273603081565b610256610423366004614eb4565b61150c565b610256610436366004614d0c565b6115ed565b610256610449366004614da6565b611681565b61035661045c366004614ee2565b61168d565b61025661046f366004614f02565b6116b9565b610256610482366004614df4565b611798565b6103567f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b6104bc6005600160991b0181565b6040516001600160a01b039091168152602001610281565b6102566104e2366004614d0c565b61198d565b6103565f80516020615cf883398151915281565b610256610509366004614d0c565b611be6565b610273601481565b610529610524366004614d0c565b611d23565b6040516102819190614faa565b6102d66202a30081565b6103565f80516020615cd883398151915281565b610256610562366004614eb4565b611e72565b61035661057536600461502a565b611f39565b6105868383835f611f94565b505050565b5f8181525f80516020615d388339815191526020526040808220815160e0810190925280545f80516020615cf883398151915293929190829060ff1660058111156105d8576105d8614f35565b60058111156105e9576105e9614f35565b81526020016001820180546105fd90615095565b80601f016020809104026020016040519081016040528092919081815260200182805461062990615095565b80156106745780601f1061064b57610100808354040283529160200191610674565b820191905f5260205f20905b81548152906001019060200180831161065757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106df576106df614f35565b1461071b575f8381526007830160205260409081902054905163170cc93360e21b81526107129160ff16906004016150cd565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610792573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107b991908101906151d6565b6040518263ffffffff1660e01b81526004016107d59190615207565b6020604051808303815f875af11580156107f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108159190615219565b50505050565b6108158383835f611fc0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cf88339815191529060ff161561087957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e09190615219565b836020013514610909576040516372b0a7e760e11b815260208401356004820152602401610712565b3061091a6060850160408601615230565b6001600160a01b03161461095d576109386060840160408501615230565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610712565b5f61096b606085018561524b565b905090505f805b828163ffffffff161015610bd2575f61098e606088018861524b565b8363ffffffff168181106109a4576109a4615290565b90506020028101906109b691906152a4565b6109bf9061530f565b80516040519192505f9160088801916109d79161538a565b90815260200160405180910390205414610a0757805160405163a41f772f60e01b81526107129190600401615207565b5f6002885f013584604051602001610a3692919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a509161538a565b602060405180830381855afa158015610a6b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a8e9190615219565b90508086600801835f0151604051610aa6919061538a565b90815260408051918290036020908101909220929092555f8381526007890190915220805460ff191660021781558251600190910190610ae690826153df565b50604080830180515f84815260078a01602052929092206002810180549251426001600160401b03908116600160c01b026001600160c01b03928216600160801b81026001600160c01b03199097169290971691909117949094171692909217909155600301805467ffffffffffffffff19169055610b6590856154ae565b8251604051919550610b769161538a565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610bcb906154c1565b9050610972565b50600483018190556001830154606490610bf690600160401b900460ff16836154e3565b1015610c1857604051635943317f60e01b815260048101829052602401610712565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610c3c876122ed565b604001516040518263ffffffff1660e01b8152600401610c5c9190615207565b602060405180830381865af4158015610c77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9b9190615219565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610cd59190615625565b5f60405180830381865af4158015610cef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d1691908101906151d6565b90505f600282604051610d29919061538a565b602060405180830381855afa158015610d44573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d679190615219565b9050828114610d935760405163baaea89d60e01b81526004810182905260248101849052604401610712565b5050506009909201805460ff1916600117905550505050565b610db582612403565b610dd5576040516330efa98b60e01b815260048101839052602401610712565b5f610ddf83611d23565b5190506002816005811115610df657610df6614f35565b14610e16578060405163170cc93360e21b815260040161071291906150cd565b610815838361242c565b5f80610e2a6126cb565b60030154610e3890846156b9565b9050801580610e4d57506001600160401b0381115b15610e6e5760405163222d164360e21b815260048101849052602401610712565b92915050565b610e8084848484611fc0565b5050505050565b6108158383835f6126ef565b610e9b612911565b5f610ea46126cb565b90505f80610eb184612948565b91509150610ebe82612403565b610eca57505050610f5f565b5f828152600684016020908152604080832054600b8701909252909120546001600160a01b03918216911680610f01575080610f1f565b5f848152600b86016020526040902080546001600160a01b03191690555b600483516005811115610f3457610f34614f35565b03610f4357610f438185612cfb565b610f5982610f548560400151611286565b612d25565b50505050505b610f7560015f80516020615d1883398151915255565b50565b5f610f81612911565b610f8d85858585612d5b565b9050610fa560015f80516020615d1883398151915255565b949350505050565b61081584848484612ec0565b5f610fc26126cb565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115610ffb57610ffb614f35565b600381111561100c5761100c614f35565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61108282611d23565b905060018351600381111561109957611099614f35565b146110ba578251604051633b0d540d60e21b815261071291906004016156d8565b6004815160058111156110cf576110cf614f35565b036110e5576110dd86612eec565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61110a896122ed565b604001516040518263ffffffff1660e01b815260040161112a9190615207565b606060405180830381865af4158015611145573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116991906156f2565b509150915081841461119657846040015160405163089938b360e11b815260040161071291815260200190565b806001600160401b031683606001516001600160401b031610806111cf5750806001600160401b03168560a001516001600160401b0316115b156111f857604051632e19bc2d60e11b81526001600160401b0382166004820152602401610712565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f61128f6126cb565b60030154610e6e906001600160401b0384166154e3565b5f6112b082611d23565b6080015192915050565b6105868383835f612ec0565b610e80848484846126ef565b6112da612911565b5f6112e36126cb565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561131c5761131c614f35565b600381111561132d5761132d614f35565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113a6576113a6614f35565b146113c7578051604051633b0d540d60e21b815261071291906004016156d8565b60046113d68260400151611d23565b5160058111156113e8576113e8614f35565b146114e7575f6113f7846122ed565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016114369190615207565b606060405180830381865af4158015611451573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147591906156f2565b5091509150818460400151146114a15760405163089938b360e11b815260048101839052602401610712565b806001600160401b03168460c001516001600160401b031611156114e357604051632e19bc2d60e11b81526001600160401b0382166004820152602401610712565b5050505b6114f084612eec565b505061150860015f80516020615d1883398151915255565b5050565b5f6115156126cb565b90506001600160a01b0382166115495760405163caa903f960e01b81526001600160a01b0383166004820152602401610712565b5f8381526006820160205260409020546001600160a01b0316331461158f57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610712565b336001600160a01b038316036115be575f928352600b01602052506040902080546001600160a01b0319169055565b5f838152600b82016020526040902080546001600160a01b0384166001600160a01b0319909116179055505050565b5f6115f66126cb565b90505f61160283611d23565b519050600481600581111561161957611619614f35565b14611639578060405163170cc93360e21b815260040161071291906150cd565b5f8381526006830160205260409020546001600160a01b0316331461165e573361156a565b5f838152600683016020526040902054610586906001600160a01b031684612cfb565b61081584848484611f94565b5f611696612911565b6116a18333846130f9565b9050610e6e60015f80516020615d1883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611702575080546001600160401b03808416911610155b156117205760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561174b848461333e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615cf88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6117cb866122ed565b604001516040518263ffffffff1660e01b81526004016117eb9190615207565b6040805180830381865af4158015611805573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118299190615732565b915091508061184f57604051632d07135360e01b81528115156004820152602401610712565b5f8281526006840160205260409020805461186990615095565b90505f0361188d5760405163089938b360e11b815260048101839052602401610712565b60015f83815260078501602052604090205460ff1660058111156118b3576118b3614f35565b146118e6575f8281526007840160205260409081902054905163170cc93360e21b81526107129160ff16906004016150cd565b5f82815260068401602052604081206118fe91614c20565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6119966126cb565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660038111156119cf576119cf614f35565b60038111156119e0576119e0614f35565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a5957611a59614f35565b14158015611a7a5750600381516003811115611a7757611a77614f35565b14155b15611a9b578051604051633b0d540d60e21b815261071291906004016156d8565b5f611aa98260400151611d23565b905080606001516001600160401b03165f03611adb576040516339b894f960e21b815260048101859052602401610712565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611b4993906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611b63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b8a91908101906151d6565b6040518263ffffffff1660e01b8152600401611ba69190615207565b6020604051808303815f875af1158015611bc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e809190615219565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cf88339815191529190611c2d90615095565b90505f03611c515760405163089938b360e11b815260048101839052602401610712565b60015f83815260078301602052604090205460ff166005811115611c7757611c77614f35565b14611caa575f8281526007820160205260409081902054905163170cc93360e21b81526107129160ff16906004016150cd565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce39190600401615755565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105869190615219565b611d2b614c57565b5f8281525f80516020615d38833981519152602052604090819020815160e0810190925280545f80516020615cf8833981519152929190829060ff166005811115611d7857611d78614f35565b6005811115611d8957611d89614f35565b8152602001600182018054611d9d90615095565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc990615095565b8015611e145780601f10611deb57610100808354040283529160200191611e14565b820191905f5260205f20905b815481529060010190602001808311611df757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b038116611ea45760405163caa903f960e01b81526001600160a01b0382166004820152602401610712565b5f611ead6126cb565b5f8481526007820160205260409020549091506001600160a01b03610100909104163314611edb573361156a565b336001600160a01b03831603611f0a575f928352600901602052506040902080546001600160a01b0319169055565b5f838152600982016020526040902080546001600160a01b0384166001600160a01b0319909116179055505050565b6040515f905f80516020615cf8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611f7c90869086906157df565b90815260200160405180910390205491505092915050565b611fa084848484611fc0565b61081557604051631036cf9160e11b815260048101859052602401610712565b5f80611fca6126cb565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561200357612003614f35565b600381111561201457612014614f35565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61208a82611d23565b90506002835160038111156120a1576120a1614f35565b146120c2578251604051633b0d540d60e21b815261071291906004016156d8565b60208301516001600160a01b0316331461215e575f8281526006850160205260409020546001600160a01b031633146120fb573361156a565b5f82815260068501602052604090205460a082015161212a91600160b01b90046001600160401b0316906157ee565b6001600160401b031642101561215e5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610712565b60028151600581111561217357612173614f35565b036122955760028401546080840151612195916001600160401b0316906157ee565b6001600160401b03164210156121c95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610712565b87156121db576121d9828861242c565b505b5f8981526007850160205260409020805460ff191660031790556060830151608082015161221491849161220f919061580e565b613358565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561225784888c61352f565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a315159450610fa59350505050565b6004815160058111156122aa576122aa614f35565b036122d1576122ba83878b61352f565b506122c489612eec565b6001945050505050610fa5565b805160405163170cc93360e21b815261071291906004016150cd565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612351573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612378919081019061582e565b915091508061239a57604051636b2f19e960e01b815260040160405180910390fd5b8151156123c0578151604051636ba589a560e01b81526004810191909152602401610712565b60208201516001600160a01b0316156123fc576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610712565b5092915050565b5f8061240d6126cb565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612477573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261249e919081019061582e565b91509150806124c057604051636b2f19e960e01b815260040160405180910390fd5b5f6124c96126cb565b60058101548451919250146124f7578251604051636ba589a560e01b81526004810191909152602401610712565b60208301516001600160a01b031615612533576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610712565b60208301516001600160a01b03161561256f576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610712565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b81526004016125ac9190615207565b6040805180830381865af41580156125c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ea91906158be565b915091508188146126115760405163089938b360e11b815260048101899052602401610712565b5f8881526006840160205260409020600101546001600160401b0390811690821611156126a2575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26126c0565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806126f96126cb565b90505f61270587613714565b905061271087612403565b61271f57600192505050610fa5565b5f8781526006830160205260409020546001600160a01b03163314612744573361156a565b5f87815260068301602052604090205460a082015161277391600160b01b90046001600160401b0316906157ee565b6001600160401b03168160c001516001600160401b031610156127ba5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610712565b5f86156127d2576127cb888761242c565b90506127f0565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061281590611286565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561287e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a29190615219565b90508084600a015f8b81526020019081526020015f205f8282546128c691906154ae565b90915550506001600160a01b03861615612903575f898152600b85016020526040902080546001600160a01b0319166001600160a01b0388161790555b151598975050505050505050565b5f80516020615d1883398151915280546001190161294257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612951614c57565b5f80516020615cf88339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612984886122ed565b604001516040518263ffffffff1660e01b81526004016129a49190615207565b6040805180830381865af41580156129be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e29190615732565b915091508015612a0957604051632d07135360e01b81528115156004820152602401610712565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612a3a57612a3a614f35565b6005811115612a4b57612a4b614f35565b8152602001600182018054612a5f90615095565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8b90615095565b8015612ad65780601f10612aad57610100808354040283529160200191612ad6565b820191905f5260205f20905b815481529060010190602001808311612ab957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b4157612b41614f35565b14158015612b625750600181516005811115612b5f57612b5f614f35565b14155b15612b8357805160405163170cc93360e21b815261071291906004016150cd565b600381516005811115612b9857612b98614f35565b03612ba65760048152612bab565b600581525b836008018160200151604051612bc1919061538a565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612c0557612c05614f35565b021790555060208201516001820190612c1e90826153df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cc457612cc4614f35565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612d046126cb565b5f838152600a820160205260408120805491905590915061081584826139f8565b5f80516020615cd883398151915254611508906001600160a01b03168383613a6e565b60015f80516020615d1883398151915255565b5f80612d656126cb565b600281015490915061ffff600160401b90910481169086161080612d8e575061271061ffff8616115b15612db257604051635f12e6c360e11b815261ffff86166004820152602401610712565b60028101546001600160401b039081169085161015612dee576040516202a06d60e11b81526001600160401b0385166004820152602401610712565b8054831080612e005750806001015483115b15612e215760405163222d164360e21b815260048101849052602401610712565b5f612e2b84613acd565b90505f612e3782610e20565b90505f612e448983613af0565b5f818152600695909501602052604090942080546001600160b01b0319163317600160a01b61ffff9a909a16999099029890981767ffffffffffffffff60b01b1916600160b01b6001600160401b03989098169790970296909617875550506001909401805467ffffffffffffffff1916905550919392505050565b612ecc848484846126ef565b61081557604051635bff683f60e11b815260048101859052602401610712565b5f612ef56126cb565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f2e57612f2e614f35565b6003811115612f3f57612f3f614f35565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fdc7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612feb91906157ee565b6001600160401b031642101561301f5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610712565b5f848152600784016020908152604080832080546001600160a81b031916815560018101849055600201839055600986019091529020546001600160a01b03168061306f5750602082015161308d565b5f858152600985016020526040902080546001600160a01b03191690555b5f8061309a838886614015565b915091506130b38560200151610f548760600151611286565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806131036126cb565b90505f6131126102d185613acd565b90505f61311e87611d23565b905061312987612403565b613149576040516330efa98b60e01b815260048101889052602401610712565b60028151600581111561315e5761315e614f35565b1461317f57805160405163170cc93360e21b815261071291906004016150cd565b5f82826080015161319091906157ee565b905083600201600a9054906101000a90046001600160401b031682604001516131b991906158e1565b6001600160401b0316816001600160401b031611156131f657604051636d51fe0560e11b81526001600160401b0382166004820152602401610712565b5f806132028a84613358565b915091505f8a8360405160200161323092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a496505050505050505b9392505050565b6133466140c2565b61334f8261410d565b61150881614187565b5f8281525f80516020615d38833981519152602052604081206002015481905f80516020615cf883398151915290600160801b90046001600160401b03166133a085826141ef565b5f6133aa87614412565b5f888152600785016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613453573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261347a91908101906151d6565b6040518263ffffffff1660e01b81526004016134969190615207565b6020604051808303815f875af11580156134b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134d69190615219565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f806135396126cb565b90505f6135498660400151611d23565b90505f60038251600581111561356157613561614f35565b148061357f575060048251600581111561357d5761357d614f35565b145b1561358f575060c08101516135cc565b6002825160058111156135a4576135a4614f35565b036135b05750426135cc565b815160405163170cc93360e21b815261071291906004016150cd565b86608001516001600160401b0316816001600160401b0316116135f4575f9350505050613337565b600483015460608801515f916001600160a01b031690634f22429f9061361990611286565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa15801561369a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136be9190615219565b5f878152600886016020526040902081905590506001600160a01b038716156126c0575f868152600985016020526040902080546001600160a01b0319166001600160a01b038916179055979650505050505050565b61371c614c57565b5f8281525f80516020615d388339815191526020526040808220815160e0810190925280545f80516020615cf883398151915293929190829060ff16600581111561376957613769614f35565b600581111561377a5761377a614f35565b815260200160018201805461378e90615095565b80601f01602080910402602001604051908101604052809291908181526020018280546137ba90615095565b80156138055780601f106137dc57610100808354040283529160200191613805565b820191905f5260205f20905b8154815290600101906020018083116137e857829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a0909101529091508151600581111561387357613873614f35565b146138a6575f8481526007830160205260409081902054905163170cc93360e21b81526107129160ff16906004016150cd565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156138ea576138ea614f35565b02179055506020820151600182019061390390826153df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6139a18582613358565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f5f80516020615cd883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015613a53575f80fd5b505af1158015613a65573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b0383811660248301526044820183905261058691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614487565b5f610e6e825f80516020615cd8833981519152546001600160a01b0316906144e8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b3457604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cf883398151915242613b536060860160408701614e99565b6001600160401b0316111580613b8d5750613b716202a300426154ae565b613b816060860160408701614e99565b6001600160401b031610155b15613bc757613ba26060850160408601614e99565b604051635879da1360e11b81526001600160401b039091166004820152602401610712565b613bdc613bd7606086018661590c565b6144f4565b613bec613bd7608086018661590c565b6030613bfb6020860186615920565b905014613c2d57613c0f6020850185615920565b6040516326475b2f60e11b8152610712925060040190815260200190565b613c378480615920565b90505f03613c6457613c498480615920565b604051633e08a12560e11b8152600401610712929190615962565b5f60088201613c738680615920565b604051613c819291906157df565b90815260200160405180910390205414613cba57613c9f8480615920565b60405163a41f772f60e01b8152600401610712929190615962565b613cc4835f6141ef565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613d018a80615920565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613d49908b018b615920565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613d9260608b0160408c01614e99565b6001600160401b03168152602001613dad60608b018b61590c565b613db690615975565b8152602001613dc860808b018b61590c565b613dd190615975565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401613dff9190615aa2565b5f60405180830381865af4158015613e19573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613e409190810190615b59565b5f82815260068601602052604090209193509150613e5e82826153df565b508160088401613e6e8880615920565b604051613e7c9291906157df565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613eb8908590600401615207565b6020604051808303815f875af1158015613ed4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ef89190615219565b5f8481526007860160205260409020805460ff191660011790559050613f1e8780615920565b5f858152600787016020526040902060010191613f3c919083615b9c565b505f83815260078501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580613f9b8880615920565b604051613fa99291906157df565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190613fe79190614e99565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805f6140206126cb565b5f868152600882016020526040812080549082905591925090819080156140b4575f8781526006850160205260409020546127109061406a90600160a01b900461ffff16836154e3565b61407491906156b9565b91508184600a015f8981526020019081526020015f205f82825461409891906154ae565b909155506140a890508282615c55565b92506140b489846139f8565b509097909650945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661410b57604051631afcd79f60e31b815260040160405180910390fd5b565b6141156140c2565b61411e8161465d565b614126614676565b610f756060820135608083013561414360c0850160a08601614e99565b61415360e0860160c08701615c68565b614164610100870160e08801615c81565b61010087013561417c61014089016101208a01615230565b886101400135614686565b61418f6140c2565b5f80516020615cd88339815191526001600160a01b0382166141cf57604051637330680360e01b81526001600160a01b0383166004820152602401610712565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615cf88339815191525f6001600160401b0380841690851611156142235761421c838561580e565b9050614230565b61422d848461580e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061429257506001840154815161428e916001600160401b0316906154ae565b8210155b156142b8576001600160401b0383166060820152818152604081015160208201526142d7565b82816060018181516142ca91906157ee565b6001600160401b03169052505b60608101516142e79060646158e1565b602082015160018601546001600160401b0392909216916143129190600160401b900460ff166154e3565b101561434257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610712565b856001600160401b03168160400181815161435d91906154ae565b9052506040810180516001600160401b038716919061437d908390615c55565b905250600184015460408201516064916143a291600160401b90910460ff16906154e3565b10156143c9578060400151604051635943317f60e01b815260040161071291815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d388339815191526020526040812060020180545f80516020615cf8833981519152919060089061445c90600160401b90046001600160401b0316615ca1565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61449b6001600160a01b0384168361486b565b905080515f141580156144bf5750808060200190518101906144bd9190615cbc565b155b1561058657604051635274afe760e01b81526001600160a01b0384166004820152602401610712565b5f613337833384614878565b6145016020820182614df4565b63ffffffff16158015614521575061451c602082018261524b565b151590505b15614568576145336020820182614df4565b614540602083018361524b565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610712565b614575602082018261524b565b90506145846020830183614df4565b63ffffffff16111561459d576145336020820182614df4565b60015b6145ad602083018361524b565b9050811015611508576145c3602083018361524b565b6145ce600184615c55565b8181106145dd576145dd615290565b90506020020160208101906145f29190615230565b6001600160a01b0316614608602084018461524b565b8381811061461857614618615290565b905060200201602081019061462d9190615230565b6001600160a01b0316101561465557604051630dbc8d5f60e31b815260040160405180910390fd5b6001016145a0565b6146656140c2565b61466d6149db565b610f75816149e3565b61467e6140c2565b61410b614acb565b61468e6140c2565b5f6146976126cb565b905061ffff861615806146af575061271061ffff8716115b156146d357604051635f12e6c360e11b815261ffff87166004820152602401610712565b878911156146f75760405163222d164360e21b8152600481018a9052602401610712565b60ff8516158061470a5750600a60ff8616115b1561472d5760405163170db35960e31b815260ff86166004820152602401610712565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316876001600160401b03161015614794576040516202a06d60e11b81526001600160401b0388166004820152602401610712565b835f036147b45760405163a733007160e01b815260040160405180910390fd5b816147d557604051632f6bd1db60e01b815260048101839052602401610712565b97885560018801969096556002870180546001600160401b039690961669ffffffffffffffffffff1990961695909517600160401b61ffff95909516949094029390931767ffffffffffffffff60501b191660ff92909216600160501b029190911790925560038401919091556004830180546001600160a01b0319166001600160a01b03909216919091179055600590910155565b606061333783835f614ad3565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e29190615219565b90506148f96001600160a01b038616853086614b62565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa15801561493d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149619190615219565b90508181116149c75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610712565b6149d18282615c55565b9695505050505050565b61410b6140c2565b6149eb6140c2565b80355f80516020615cf88339815191529081556014614a106060840160408501615c81565b60ff161180614a2f5750614a2a6060830160408401615c81565b60ff16155b15614a6357614a446060830160408401615c81565b604051634a59bbff60e11b815260ff9091166004820152602401610712565b614a736060830160408401615c81565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614aa46040830160208401614e99565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d486140c2565b606081471015614af85760405163cd78605960e01b8152306004820152602401610712565b5f80856001600160a01b03168486604051614b13919061538a565b5f6040518083038185875af1925050503d805f8114614b4d576040519150601f19603f3d011682016040523d82523d5f602084013e614b52565b606091505b50915091506149d1868383614b9b565b6040516001600160a01b0384811660248301528381166044830152606482018390526108159186918216906323b872dd90608401613a9b565b606082614bb057614bab82614bf7565b613337565b8151158015614bc757506001600160a01b0384163b155b15614bf057604051639996b31560e01b81526001600160a01b0385166004820152602401610712565b5080613337565b805115614c075780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614c2c90615095565b5f825580601f10614c3b575050565b601f0160209004905f5260205f2090810190610f759190614c94565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ca8575f8155600101614c95565b5090565b8015158114610f75575f80fd5b803563ffffffff81168114614ccc575f80fd5b919050565b5f805f60608486031215614ce3575f80fd5b833592506020840135614cf581614cac565b9150614d0360408501614cb9565b90509250925092565b5f60208284031215614d1c575f80fd5b5035919050565b5f8060408385031215614d34575f80fd5b82356001600160401b03811115614d49575f80fd5b830160808186031215614d5a575f80fd5b9150614d6860208401614cb9565b90509250929050565b5f8060408385031215614d82575f80fd5b82359150614d6860208401614cb9565b6001600160a01b0381168114610f75575f80fd5b5f805f8060808587031215614db9575f80fd5b843593506020850135614dcb81614cac565b9250614dd960408601614cb9565b91506060850135614de981614d92565b939692955090935050565b5f60208284031215614e04575f80fd5b61333782614cb9565b803561ffff81168114614ccc575f80fd5b6001600160401b0381168114610f75575f80fd5b5f805f8060808587031215614e45575f80fd5b84356001600160401b03811115614e5a575f80fd5b850160a08188031215614e6b575f80fd5b9350614e7960208601614e0d565b92506040850135614e8981614e1e565b9396929550929360600135925050565b5f60208284031215614ea9575f80fd5b813561333781614e1e565b5f8060408385031215614ec5575f80fd5b823591506020830135614ed781614d92565b809150509250929050565b5f8060408385031215614ef3575f80fd5b50508035926020909101359150565b5f80828403610180811215614f15575f80fd5b61016080821215614f24575f80fd5b8493508301359050614ed781614d92565b634e487b7160e01b5f52602160045260245ffd5b60068110614f5957614f59614f35565b9052565b5f5b83811015614f77578181015183820152602001614f5f565b50505f910152565b5f8151808452614f96816020860160208601614f5d565b601f01601f19169290920160200192915050565b60208152614fbc602082018351614f49565b5f602083015160e06040840152614fd7610100840182614f7f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561503b575f80fd5b82356001600160401b0380821115615051575f80fd5b818501915085601f830112615064575f80fd5b813581811115615072575f80fd5b866020828501011115615083575f80fd5b60209290920196919550909350505050565b600181811c908216806150a957607f821691505b6020821081036150c757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610e6e8284614f49565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615111576151116150db565b60405290565b604080519081016001600160401b0381118282101715615111576151116150db565b604051601f8201601f191681016001600160401b0381118282101715615161576151616150db565b604052919050565b5f6001600160401b03821115615181576151816150db565b50601f01601f191660200190565b5f82601f83011261519e575f80fd5b81516151b16151ac82615169565b615139565b8181528460208386010111156151c5575f80fd5b610fa5826020830160208701614f5d565b5f602082840312156151e6575f80fd5b81516001600160401b038111156151fb575f80fd5b610fa58482850161518f565b602081525f6133376020830184614f7f565b5f60208284031215615229575f80fd5b5051919050565b5f60208284031215615240575f80fd5b813561333781614d92565b5f808335601e19843603018112615260575f80fd5b8301803591506001600160401b03821115615279575f80fd5b6020019150600581901b3603821315613528575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152b8575f80fd5b9190910192915050565b5f82601f8301126152d1575f80fd5b81356152df6151ac82615169565b8181528460208386010111156152f3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561531f575f80fd5b6153276150ef565b82356001600160401b038082111561533d575f80fd5b615349368387016152c2565b8352602085013591508082111561535e575f80fd5b5061536b368286016152c2565b602083015250604083013561537f81614e1e565b604082015292915050565b5f82516152b8818460208701614f5d565b601f82111561058657805f5260205f20601f840160051c810160208510156153c05750805b601f840160051c820191505b81811015610e80575f81556001016153cc565b81516001600160401b038111156153f8576153f86150db565b61540c816154068454615095565b8461539b565b602080601f83116001811461543f575f84156154285750858301515b5f19600386901b1c1916600185901b1785556110dd565b5f85815260208120601f198616915b8281101561546d5788860151825594840194600190910190840161544e565b508582101561548a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e6e57610e6e61549a565b5f63ffffffff8083168181036154d9576154d961549a565b6001019392505050565b8082028115828204841417610e6e57610e6e61549a565b5f808335601e1984360301811261550f575f80fd5b83016020810192503590506001600160401b0381111561552d575f80fd5b803603821315613528575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561561857848303601f19018952813536889003605e1901811261559f575f80fd5b870160606155ad82806154fa565b8287526155bd838801828461553b565b925050506155cd868301836154fa565b868303888801526155df83828461553b565b9250505060408083013592506155f483614e1e565b6001600160401b03929092169490910193909352978301979083019060010161557a565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561564981614d92565b6001600160a01b031660608381019190915283013536849003601e19018112615670575f80fd5b83016020810190356001600160401b0381111561568b575f80fd5b8060051b360382131561569c575f80fd5b6080808501526156b060a085018284615563565b95945050505050565b5f826156d357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156ec576156ec614f35565b91905290565b5f805f60608486031215615704575f80fd5b83519250602084015161571681614e1e565b604085015190925061572781614e1e565b809150509250925092565b5f8060408385031215615743575f80fd5b825191506020830151614ed781614cac565b5f60208083525f845461576781615095565b806020870152604060018084165f811461578857600181146157a4576157d1565b60ff19851660408a0152604084151560051b8a010195506157d1565b895f5260205f205f5b858110156157c85781548b82018601529083019088016157ad565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156123fc576123fc61549a565b6001600160401b038281168282160390808211156123fc576123fc61549a565b5f806040838503121561583f575f80fd5b82516001600160401b0380821115615855575f80fd5b9084019060608287031215615868575f80fd5b6158706150ef565b82518152602083015161588281614d92565b6020820152604083015182811115615898575f80fd5b6158a48882860161518f565b6040830152508094505050506020830151614ed781614cac565b5f80604083850312156158cf575f80fd5b825191506020830151614ed781614e1e565b6001600160401b038181168382160280821691908281146159045761590461549a565b505092915050565b5f8235603e198336030181126152b8575f80fd5b5f808335601e19843603018112615935575f80fd5b8301803591506001600160401b0382111561594e575f80fd5b602001915036819003821315613528575f80fd5b602081525f610fa560208301848661553b565b5f60408236031215615985575f80fd5b61598d615117565b61599683614cb9565b81526020808401356001600160401b03808211156159b2575f80fd5b9085019036601f8301126159c4575f80fd5b8135818111156159d6576159d66150db565b8060051b91506159e7848301615139565b8181529183018401918481019036841115615a00575f80fd5b938501935b83851015615a2a5784359250615a1a83614d92565b8282529385019390850190615a05565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015615a975784516001600160a01b03168252938301936001929092019190830190615a6e565b509695505050505050565b60208152815160208201525f602083015160e06040840152615ac8610100840182614f7f565b90506040840151601f1980858403016060860152615ae68383614f7f565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152615b168383615a3c565b925060a08601519150808584030160c086015250615b348282615a3c565b91505060c0840151615b5160e08501826001600160401b03169052565b509392505050565b5f8060408385031215615b6a575f80fd5b8251915060208301516001600160401b03811115615b86575f80fd5b615b928582860161518f565b9150509250929050565b6001600160401b03831115615bb357615bb36150db565b615bc783615bc18354615095565b8361539b565b5f601f841160018114615bf8575f8515615be15750838201355b5f19600387901b1c1916600186901b178355610e80565b5f83815260208120601f198716915b82811015615c275786850135825560209485019460019092019101615c07565b5086821015615c43575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610e6e57610e6e61549a565b5f60208284031215615c78575f80fd5b61333782614e0d565b5f60208284031215615c91575f80fd5b813560ff81168114613337575f80fd5b5f6001600160401b038083168181036154d9576154d961549a565b5f60208284031215615ccc575f80fd5b815161333781614cac56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a2646970667358221220e4dc796729b8e245265e86fa31d6fa89c91bcc08a3f6eb5e1d9fd39f7323d2ff64736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc20\",\"outputs\":[{\"internalType\":\"contractIERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615f7d380380615f7d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e308061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061024a575f3560e01c80637d8d2f7711610140578063afb98096116100bf578063c974d1b611610084578063c974d1b614610532578063d5f20ff61461053a578063df93d8de1461055a578063e4a63c4014610564578063fb8b11dd14610578578063fd7ac5e71461058b575f80fd5b8063afb98096146104c3578063b771b3bc146104ea578063ba3a4b97146104f8578063bc5fbfec1461050b578063bee0a03f1461051f575f80fd5b80639ae06447116101055780639ae06447146104775780639e1bc4ef1461048a5780639e478eea1461049d578063a3a65e48146104b0578063a9778a7a146102f9575f80fd5b80637d8d2f771461042357806380dd672f146104365780638280a25a146104495780638ef34c981461045157806393e2459814610464575f80fd5b8063467ef06f116101cc578063620658561161019157806362065856146103b257806366435abf146103c5578063732214f8146103d857806376f78621146103df578063785e9e86146103f2575f80fd5b8063467ef06f1461033b5780634bee00401461034e5780635dd6a6cb1461036f57806360305d621461038257806360ad77841461039f575f80fd5b806325e1c7761161021257806325e1c776146102bb5780632e2194d8146102ce57806335455ded146102f957806337b9be8f146103155780633a1cfff614610328575f80fd5b80630118acc41461024e5780630322ed9814610263578063151d30d1146102765780631ec447241461029557806320d91b7a146102a8575b5f80fd5b61026161025c366004614d74565b61059e565b005b610261610271366004614daf565b6105af565b61027e600a81565b60405160ff90911681526020015b60405180910390f35b6102616102a3366004614d74565b61083f565b6102616102b6366004614dc6565b61084b565b6102616102c9366004614e14565b610e01565b6102e16102dc366004614daf565b610e75565b6040516001600160401b03909116815260200161028c565b61030261271081565b60405161ffff909116815260200161028c565b610261610323366004614e49565b610ec9565b610261610336366004614d74565b610edc565b610261610349366004614e97565b610ee8565b61036161035c366004614ed5565b610fba565b60405190815260200161028c565b61026161037d366004614e49565b610fef565b61038a601481565b60405163ffffffff909116815260200161028c565b6102616103ad366004614e14565b610ffb565b6103616103c0366004614f3c565b6112c3565b6102e16103d3366004614daf565b6112e3565b6103615f81565b6102616103ed366004614d74565b6112f7565b5f80516020615d7b833981519152546001600160a01b03165b6040516001600160a01b03909116815260200161028c565b610261610431366004614e49565b611303565b610261610444366004614e14565b61130f565b61027e603081565b61026161045f366004614f57565b611549565b610261610472366004614daf565b6115fa565b610261610485366004614e49565b61168e565b610361610498366004614f85565b61169a565b6102616104ab366004614fa5565b6116c6565b6102616104be366004614e97565b6117a5565b6103617f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b61040b6005600160991b0181565b610261610506366004614daf565b61199b565b6103615f80516020615d9b83398151915281565b61026161052d366004614daf565b611bf4565b61027e601481565b61054d610548366004614daf565b611d30565b60405161028c919061504d565b6102e16202a30081565b6103615f80516020615d7b83398151915281565b610261610586366004614f57565b611e7f565b6103616105993660046150cd565b611f16565b6105aa8383835f611f71565b505050565b5f8181525f80516020615dbb8339815191526020526040808220815160e0810190925280545f80516020615d9b83398151915293929190829060ff1660058111156105fc576105fc614fd8565b600581111561060d5761060d614fd8565b815260200160018201805461062190615138565b80601f016020809104026020016040519081016040528092919081815260200182805461064d90615138565b80156106985780601f1061066f57610100808354040283529160200191610698565b820191905f5260205f20905b81548152906001019060200180831161067b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561070357610703614fd8565b1461073f575f8381526005830160205260409081902054905163170cc93360e21b81526107369160ff1690600401615170565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156107b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107dd9190810190615279565b6040518263ffffffff1660e01b81526004016107f991906152aa565b6020604051808303815f875af1158015610815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083991906152bc565b50505050565b6108398383835f611f9d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615d9b8339815191529060ff161561089d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090491906152bc565b83602001351461092d576040516372b0a7e760e11b815260208401356004820152602401610736565b3061093e60608501604086016152d3565b6001600160a01b0316146109815761095c60608401604085016152d3565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610736565b5f61098f60608501856152ee565b905090505f805b828163ffffffff161015610bf7575f6109b260608801886152ee565b8363ffffffff168181106109c8576109c8615333565b90506020028101906109da9190615347565b6109e3906153b2565b80516040519192505f9160068801916109fb9161542d565b90815260200160405180910390205414610a2b57805160405163a41f772f60e01b815261073691906004016152aa565b5f6002885f013584604051602001610a5a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a749161542d565b602060405180830381855afa158015610a8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ab291906152bc565b90508086600601835f0151604051610aca919061542d565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610b0a9082615482565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610b8a9085615551565b8251604051919550610b9b9161542d565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610bf090615571565b9050610996565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610c3a910460ff1683615593565b6001600160401b03161015610c6d57604051633e1a785160e01b81526001600160401b0382166004820152602401610736565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610c91876122ca565b604001516040518263ffffffff1660e01b8152600401610cb191906152aa565b602060405180830381865af4158015610ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf091906152bc565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610d2a91906156e9565b5f60405180830381865af4158015610d44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d6b9190810190615279565b90505f600282604051610d7e919061542d565b602060405180830381855afa158015610d99573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610dbc91906152bc565b9050828114610de85760405163baaea89d60e01b81526004810182905260248101849052604401610736565b5050506007909201805460ff1916600117905550505050565b610e0a826123e0565b610e2a576040516330efa98b60e01b815260048101839052602401610736565b5f610e3483611d30565b5190506002816005811115610e4b57610e4b614fd8565b14610e6b578060405163170cc93360e21b81526004016107369190615170565b6108398383612409565b5f80610e7f6126a8565b60030154610e8d908461577d565b9050801580610ea257506001600160401b0381115b15610ec35760405163222d164360e21b815260048101849052602401610736565b92915050565b610ed584848484611f9d565b5050505050565b6108398383835f6126cc565b610ef0612909565b5f610ef96126a8565b90505f80610f0684612940565b91509150610f13826123e0565b610f1f57505050610fa1565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b03918216911680610f615750805b600483516005811115610f7657610f76614fd8565b03610f8557610f858185612cf8565b610f9b82610f9685604001516112c3565b612d22565b50505050505b610fb760015f80516020615ddb83398151915255565b50565b5f610fc3612909565b610fcf85858585612d58565b9050610fe760015f80516020615ddb83398151915255565b949350505050565b61083984848484612ed8565b5f6110046126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561103d5761103d614fd8565b600381111561104e5761104e614fd8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6110c482611d30565b90506001835160038111156110db576110db614fd8565b146110fc578251604051633b0d540d60e21b8152610736919060040161579c565b60048151600581111561111157611111614fd8565b036111275761111f86612f04565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61114c896122ca565b604001516040518263ffffffff1660e01b815260040161116c91906152aa565b606060405180830381865af4158015611187573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ab91906157b6565b50915091508184146111d857846040015160405163089938b360e11b815260040161073691815260200190565b806001600160401b031683606001516001600160401b031610806112115750806001600160401b03168560a001516001600160401b0316115b1561123a57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6112cc6126a8565b60030154610ec3906001600160401b0384166157f6565b5f6112ed82611d30565b6080015192915050565b6105aa8383835f612ed8565b610ed5848484846126cc565b611317612909565b5f6113206126a8565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561135957611359614fd8565b600381111561136a5761136a614fd8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e3576113e3614fd8565b14611404578051604051633b0d540d60e21b8152610736919060040161579c565b60046114138260400151611d30565b51600581111561142557611425614fd8565b14611524575f611434846122ca565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b815260040161147391906152aa565b606060405180830381865af415801561148e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b291906157b6565b5091509150818460400151146114de5760405163089938b360e11b815260048101839052602401610736565b806001600160401b03168460c001516001600160401b0316111561152057604051632e19bc2d60e11b81526001600160401b0382166004820152602401610736565b5050505b61152d84612f04565b505061154560015f80516020615ddb83398151915255565b5050565b5f6115526126a8565b90506001600160a01b0382166115865760405163caa903f960e01b81526001600160a01b0383166004820152602401610736565b5f8381526006820160205260409020546001600160a01b031633146115cc57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610736565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6116036126a8565b90505f61160f83611d30565b519050600481600581111561162657611626614fd8565b14611646578060405163170cc93360e21b81526004016107369190615170565b5f8381526006830160205260409020546001600160a01b0316331461166b57336115a7565b5f8381526006830160205260409020546105aa906001600160a01b031684612cf8565b61083984848484611f71565b5f6116a3612909565b6116ae8333846130fe565b9050610ec360015f80516020615ddb83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061170f575080546001600160401b03808416911610155b1561172d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556117588484613343565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615d9b8339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6117d8866122ca565b604001516040518263ffffffff1660e01b81526004016117f891906152aa565b6040805180830381865af4158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061580d565b915091508061185c57604051632d07135360e01b81528115156004820152602401610736565b5f8281526004840160205260409020805461187690615138565b90505f0361189a5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580860160205260409091205460ff16908111156118c1576118c1614fd8565b146118f4575f8281526005840160205260409081902054905163170cc93360e21b81526107369160ff1690600401615170565b5f828152600484016020526040812061190c91614cc3565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f6119a46126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660038111156119dd576119dd614fd8565b60038111156119ee576119ee614fd8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a6757611a67614fd8565b14158015611a885750600381516003811115611a8557611a85614fd8565b14155b15611aa9578051604051633b0d540d60e21b8152610736919060040161579c565b5f611ab78260400151611d30565b905080606001516001600160401b03165f03611ae9576040516339b894f960e21b815260048101859052602401610736565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611b5793906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611b71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b989190810190615279565b6040518263ffffffff1660e01b8152600401611bb491906152aa565b6020604051808303815f875af1158015611bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed591906152bc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615d9b8339815191529190611c3b90615138565b90505f03611c5f5760405163089938b360e11b815260048101839052602401610736565b60015f838152600580840160205260409091205460ff1690811115611c8657611c86614fd8565b14611cb9575f8281526005820160205260409081902054905163170cc93360e21b81526107369160ff1690600401615170565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611cf09201615830565b6020604051808303815f875af1158015611d0c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105aa91906152bc565b611d38614cfa565b5f8281525f80516020615dbb833981519152602052604090819020815160e0810190925280545f80516020615d9b833981519152929190829060ff166005811115611d8557611d85614fd8565b6005811115611d9657611d96614fd8565b8152602001600182018054611daa90615138565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd690615138565b8015611e215780601f10611df857610100808354040283529160200191611e21565b820191905f5260205f20905b815481529060010190602001808311611e0457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b038116611eb15760405163caa903f960e01b81526001600160a01b0382166004820152602401610736565b5f611eba6126a8565b5f8481526007820160205260409020549091506001600160a01b03610100909104163314611ee857336115a7565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615d9b833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0690611f5990869086906158ba565b90815260200160405180910390205491505092915050565b611f7d84848484611f9d565b61083957604051631036cf9160e11b815260048101859052602401610736565b5f80611fa76126a8565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fe057611fe0614fd8565b6003811115611ff157611ff1614fd8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61206782611d30565b905060028351600381111561207e5761207e614fd8565b1461209f578251604051633b0d540d60e21b8152610736919060040161579c565b60208301516001600160a01b0316331461213b575f8281526006850160205260409020546001600160a01b031633146120d857336115a7565b5f82815260068501602052604090205460a082015161210791600160b01b90046001600160401b031690615551565b6001600160401b031642101561213b5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b60028151600581111561215057612150614fd8565b036122725760028401546080840151612172916001600160401b031690615551565b6001600160401b03164210156121a65760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b87156121b8576121b68288612409565b505b5f8981526007850160205260409020805460ff19166003179055606083015160808201516121f19184916121ec91906158c9565b61335d565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561223484888c613534565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a315159450610fe79350505050565b60048151600581111561228757612287614fd8565b036122ae5761229783878b613534565b506122a189612f04565b6001945050505050610fe7565b805160405163170cc93360e21b81526107369190600401615170565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561232e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235591908101906158e9565b915091508061237757604051636b2f19e960e01b815260040160405180910390fd5b81511561239d578151604051636ba589a560e01b81526004810191909152602401610736565b60208201516001600160a01b0316156123d9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5092915050565b5f806123ea6126a8565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612454573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247b91908101906158e9565b915091508061249d57604051636b2f19e960e01b815260040160405180910390fd5b5f6124a66126a8565b60058101548451919250146124d4578251604051636ba589a560e01b81526004810191909152602401610736565b60208301516001600160a01b031615612510576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b60208301516001600160a01b03161561254c576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610736565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161258991906152aa565b6040805180830381865af41580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190615979565b915091508188146125ee5760405163089938b360e11b815260048101899052602401610736565b5f8881526006840160205260409020600101546001600160401b03908116908216111561267f575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261269d565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806126d66126a8565b90505f6126e287613722565b90506126ed876123e0565b6126fc57600192505050610fe7565b5f8781526006830160205260409020546001600160a01b0316331461272157336115a7565b5f87815260068301602052604090205460a082015161275091600160b01b90046001600160401b031690615551565b6001600160401b03168160c001516001600160401b031610156127975760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610736565b5f86156127af576127a88887612409565b90506127cd565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127f2906112c3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561285b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287f91906152bc565b90506001600160a01b0386166128ab575f8981526006850160205260409020546001600160a01b031695505b5f898152600a85016020526040812080548392906128ca90849061599c565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615ddb83398151915280546001190161293a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612949614cfa565b5f80516020615d9b8339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61297c886122ca565b604001516040518263ffffffff1660e01b815260040161299c91906152aa565b6040805180830381865af41580156129b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129da919061580d565b915091508015612a0157604051632d07135360e01b81528115156004820152602401610736565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612a3857612a38614fd8565b6005811115612a4957612a49614fd8565b8152602001600182018054612a5d90615138565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8990615138565b8015612ad45780601f10612aab57610100808354040283529160200191612ad4565b820191905f5260205f20905b815481529060010190602001808311612ab757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b3f57612b3f614fd8565b14158015612b605750600181516005811115612b5d57612b5d614fd8565b14155b15612b8157805160405163170cc93360e21b81526107369190600401615170565b600381516005811115612b9657612b96614fd8565b03612ba45760048152612ba9565b600581525b836006018160200151604051612bbf919061542d565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612c0257612c02614fd8565b021790555060208201516001820190612c1b9082615482565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cc157612cc1614fd8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612d016126a8565b5f838152600a82016020526040812080549190559091506108398482613a07565b5f80516020615d7b83398151915254611545906001600160a01b03168383613a7d565b60015f80516020615ddb83398151915255565b5f80612d626126a8565b600281015490915061ffff600160401b90910481169086161080612d8b575061271061ffff8616115b15612daf57604051635f12e6c360e11b815261ffff86166004820152602401610736565b60028101546001600160401b039081169085161015612deb576040516202a06d60e11b81526001600160401b0385166004820152602401610736565b8054831080612dfd5750806001015483115b15612e1e5760405163222d164360e21b815260048101849052602401610736565b5f612e2884613adc565b90505f612e3482610e75565b90505f612e418983613aff565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b612ee4848484846126cc565b61083957604051635bff683f60e11b815260048101859052602401610736565b5f612f0d6126a8565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f4657612f46614fd8565b6003811115612f5757612f57614fd8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612ff47fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b82608001516130039190615551565b6001600160401b03164210156130375760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610736565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b031680613092575060208201515b5f8061309f838886614071565b915091506130b88560200151610f9687606001516112c3565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806131086126a8565b90505f6131176102dc85613adc565b90505f61312387611d30565b905061312e876123e0565b61314e576040516330efa98b60e01b815260048101889052602401610736565b60028151600581111561316357613163614fd8565b1461318457805160405163170cc93360e21b81526107369190600401615170565b5f8282608001516131959190615551565b905083600201600a9054906101000a90046001600160401b031682604001516131be9190615593565b6001600160401b0316816001600160401b031611156131fb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610736565b5f806132078a8461335d565b915091505f8a8360405160200161323592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a496505050505050505b9392505050565b61334b61411e565b61335482614169565b611545816141e3565b5f8281525f80516020615dbb833981519152602052604081206002015481905f80516020615d9b83398151915290600160801b90046001600160401b03166133a5858261424b565b5f6133af876144b5565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613458573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261347f9190810190615279565b6040518263ffffffff1660e01b815260040161349b91906152aa565b6020604051808303815f875af11580156134b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134db91906152bc565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8061353e6126a8565b90505f61354e8660400151611d30565b90505f60038251600581111561356657613566614fd8565b1480613584575060048251600581111561358257613582614fd8565b145b15613594575060c08101516135d1565b6002825160058111156135a9576135a9614fd8565b036135b55750426135d1565b815160405163170cc93360e21b81526107369190600401615170565b86608001516001600160401b0316816001600160401b0316116135f9575f935050505061333c565b600483015460608801515f916001600160a01b031690634f22429f9061361e906112c3565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa15801561369f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136c391906152bc565b90506001600160a01b0387166136db57876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b61372a614cfa565b5f8281525f80516020615dbb8339815191526020526040808220815160e0810190925280545f80516020615d9b83398151915293929190829060ff16600581111561377757613777614fd8565b600581111561378857613788614fd8565b815260200160018201805461379c90615138565b80601f01602080910402602001604051908101604052809291908181526020018280546137c890615138565b80156138135780601f106137ea57610100808354040283529160200191613813565b820191905f5260205f20905b8154815290600101906020018083116137f657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a0909101529091508151600581111561388157613881614fd8565b146138b4575f8481526005830160205260409081902054905163170cc93360e21b81526107369160ff1690600401615170565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff19169060019084908111156138f9576138f9614fd8565b0217905550602082015160018201906139129082615482565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6139b0858261335d565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b5f5f80516020615d7b83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015613a62575f80fd5b505af1158015613a74573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b038381166024830152604482018390526105aa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061452a565b5f610ec3825f80516020615d7b833981519152546001600160a01b03169061458b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613b4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d9b83398151915242613b626060860160408701614f3c565b6001600160401b0316111580613b9c5750613b806202a3004261599c565b613b906060860160408701614f3c565b6001600160401b031610155b15613bd657613bb16060850160408601614f3c565b604051635879da1360e11b81526001600160401b039091166004820152602401610736565b60038101546001600160401b0390613bf990600160401b9004821685831661599c565b1115613c2357604051633e1a785160e01b81526001600160401b0384166004820152602401610736565b613c38613c3360608601866159af565b614597565b613c48613c3360808601866159af565b6030613c5760208601866159c3565b905014613c8957613c6b60208501856159c3565b6040516326475b2f60e11b8152610736925060040190815260200190565b613c9384806159c3565b90505f03613cc057613ca584806159c3565b604051633e08a12560e11b8152600401610736929190615a05565b5f60068201613ccf86806159c3565b604051613cdd9291906158ba565b90815260200160405180910390205414613d1657613cfb84806159c3565b60405163a41f772f60e01b8152600401610736929190615a05565b613d20835f61424b565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613d5d8a806159c3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613da5908b018b6159c3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613dee60608b0160408c01614f3c565b6001600160401b03168152602001613e0960608b018b6159af565b613e1290615a18565b8152602001613e2460808b018b6159af565b613e2d90615a18565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401613e5b9190615b45565b5f60405180830381865af4158015613e75573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613e9c9190810190615bfc565b5f82815260048601602052604090209193509150613eba8282615482565b508160068401613eca88806159c3565b604051613ed89291906158ba565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613f149085906004016152aa565b6020604051808303815f875af1158015613f30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f5491906152bc565b5f8481526005860160205260409020805460ff191660011790559050613f7a87806159c3565b5f858152600587016020526040902060010191613f98919083615c3f565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580613ff788806159c3565b6040516140059291906158ba565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b60400160208101906140439190614f3c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805f61407c6126a8565b5f86815260088201602052604081208054908290559192509081908015614110575f878152600685016020526040902054612710906140c690600160a01b900461ffff16836157f6565b6140d0919061577d565b91508184600a015f8981526020019081526020015f205f8282546140f4919061599c565b9091555061410490508282615cf8565b92506141108984613a07565b509097909650945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661416757604051631afcd79f60e31b815260040160405180910390fd5b565b61417161411e565b61417a81614700565b614182614719565b610fb76060820135608083013561419f60c0850160a08601614f3c565b6141af60e0860160c08701615d0b565b6141c0610100870160e08801615d24565b6101008701356141d861014089016101208a016152d3565b886101400135614729565b6141eb61411e565b5f80516020615d7b8339815191526001600160a01b03821661422b57604051637330680360e01b81526001600160a01b0383166004820152602401610736565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615d9b8339815191525f6001600160401b03808416908516111561427f5761427883856158c9565b905061428c565b61428984846158c9565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806142f95750600184015481516142f5916001600160401b03169061599c565b8210155b15614321576001600160401b0380841660608301528282526040820151166020820152614340565b82816060018181516143339190615551565b6001600160401b03169052505b6060810151614350906064615593565b602082015160018601546001600160401b03929092169161437b9190600160401b900460ff16615593565b6001600160401b031610156143b457606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610736565b85816040018181516143c69190615551565b6001600160401b03169052506040810180518691906143e69083906158c9565b6001600160401b03169052506001840154604082015160649161441491600160401b90910460ff1690615593565b6001600160401b0316101561444d576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610736565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615dbb8339815191526020526040812060020180545f80516020615d9b83398151915291906008906144ff90600160401b90046001600160401b0316615d44565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61453e6001600160a01b0384168361490e565b905080515f141580156145625750808060200190518101906145609190615d5f565b155b156105aa57604051635274afe760e01b81526001600160a01b0384166004820152602401610736565b5f61333c83338461491b565b6145a46020820182614e97565b63ffffffff161580156145c457506145bf60208201826152ee565b151590505b1561460b576145d66020820182614e97565b6145e360208301836152ee565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610736565b61461860208201826152ee565b90506146276020830183614e97565b63ffffffff161115614640576145d66020820182614e97565b60015b61465060208301836152ee565b90508110156115455761466660208301836152ee565b614671600184615cf8565b81811061468057614680615333565b905060200201602081019061469591906152d3565b6001600160a01b03166146ab60208401846152ee565b838181106146bb576146bb615333565b90506020020160208101906146d091906152d3565b6001600160a01b031610156146f857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614643565b61470861411e565b614710614a7e565b610fb781614a86565b61472161411e565b614167614b6e565b61473161411e565b5f61473a6126a8565b905061ffff86161580614752575061271061ffff8716115b1561477657604051635f12e6c360e11b815261ffff87166004820152602401610736565b8789111561479a5760405163222d164360e21b8152600481018a9052602401610736565b60ff851615806147ad5750600a60ff8616115b156147d05760405163170db35960e31b815260ff86166004820152602401610736565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316876001600160401b03161015614837576040516202a06d60e11b81526001600160401b0388166004820152602401610736565b835f036148575760405163a733007160e01b815260040160405180910390fd5b8161487857604051632f6bd1db60e01b815260048101839052602401610736565b97885560018801969096556002870180546001600160401b039690961669ffffffffffffffffffff1990961695909517600160401b61ffff95909516949094029390931767ffffffffffffffff60501b191660ff92909216600160501b029190911790925560038401919091556004830180546001600160a01b0319166001600160a01b03909216919091179055600590910155565b606061333c83835f614b76565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015614961573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498591906152bc565b905061499c6001600160a01b038616853086614c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa1580156149e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0491906152bc565b9050818111614a6a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610736565b614a748282615cf8565b9695505050505050565b61416761411e565b614a8e61411e565b80355f80516020615d9b8339815191529081556014614ab36060840160408501615d24565b60ff161180614ad25750614acd6060830160408401615d24565b60ff16155b15614b0657614ae76060830160408401615d24565b604051634a59bbff60e11b815260ff9091166004820152602401610736565b614b166060830160408401615d24565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b476040830160208401614f3c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d4561411e565b606081471015614b9b5760405163cd78605960e01b8152306004820152602401610736565b5f80856001600160a01b03168486604051614bb6919061542d565b5f6040518083038185875af1925050503d805f8114614bf0576040519150601f19603f3d011682016040523d82523d5f602084013e614bf5565b606091505b5091509150614a74868383614c3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526108399186918216906323b872dd90608401613aaa565b606082614c5357614c4e82614c9a565b61333c565b8151158015614c6a57506001600160a01b0384163b155b15614c9357604051639996b31560e01b81526001600160a01b0385166004820152602401610736565b508061333c565b805115614caa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ccf90615138565b5f825580601f10614cde575050565b601f0160209004905f5260205f2090810190610fb79190614d37565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d4b575f8155600101614d38565b5090565b8015158114610fb7575f80fd5b803563ffffffff81168114614d6f575f80fd5b919050565b5f805f60608486031215614d86575f80fd5b833592506020840135614d9881614d4f565b9150614da660408501614d5c565b90509250925092565b5f60208284031215614dbf575f80fd5b5035919050565b5f8060408385031215614dd7575f80fd5b82356001600160401b03811115614dec575f80fd5b830160808186031215614dfd575f80fd5b9150614e0b60208401614d5c565b90509250929050565b5f8060408385031215614e25575f80fd5b82359150614e0b60208401614d5c565b6001600160a01b0381168114610fb7575f80fd5b5f805f8060808587031215614e5c575f80fd5b843593506020850135614e6e81614d4f565b9250614e7c60408601614d5c565b91506060850135614e8c81614e35565b939692955090935050565b5f60208284031215614ea7575f80fd5b61333c82614d5c565b803561ffff81168114614d6f575f80fd5b6001600160401b0381168114610fb7575f80fd5b5f805f8060808587031215614ee8575f80fd5b84356001600160401b03811115614efd575f80fd5b850160a08188031215614f0e575f80fd5b9350614f1c60208601614eb0565b92506040850135614f2c81614ec1565b9396929550929360600135925050565b5f60208284031215614f4c575f80fd5b813561333c81614ec1565b5f8060408385031215614f68575f80fd5b823591506020830135614f7a81614e35565b809150509250929050565b5f8060408385031215614f96575f80fd5b50508035926020909101359150565b5f80828403610180811215614fb8575f80fd5b61016080821215614fc7575f80fd5b8493508301359050614f7a81614e35565b634e487b7160e01b5f52602160045260245ffd5b60068110614ffc57614ffc614fd8565b9052565b5f5b8381101561501a578181015183820152602001615002565b50505f910152565b5f8151808452615039816020860160208601615000565b601f01601f19169290920160200192915050565b6020815261505f602082018351614fec565b5f602083015160e0604084015261507a610100840182615022565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150de575f80fd5b82356001600160401b03808211156150f4575f80fd5b818501915085601f830112615107575f80fd5b813581811115615115575f80fd5b866020828501011115615126575f80fd5b60209290920196919550909350505050565b600181811c9082168061514c57607f821691505b60208210810361516a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ec38284614fec565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151b4576151b461517e565b60405290565b604080519081016001600160401b03811182821017156151b4576151b461517e565b604051601f8201601f191681016001600160401b03811182821017156152045761520461517e565b604052919050565b5f6001600160401b038211156152245761522461517e565b50601f01601f191660200190565b5f82601f830112615241575f80fd5b815161525461524f8261520c565b6151dc565b818152846020838601011115615268575f80fd5b610fe7826020830160208701615000565b5f60208284031215615289575f80fd5b81516001600160401b0381111561529e575f80fd5b610fe784828501615232565b602081525f61333c6020830184615022565b5f602082840312156152cc575f80fd5b5051919050565b5f602082840312156152e3575f80fd5b813561333c81614e35565b5f808335601e19843603018112615303575f80fd5b8301803591506001600160401b0382111561531c575f80fd5b6020019150600581901b360382131561352d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261535b575f80fd5b9190910192915050565b5f82601f830112615374575f80fd5b813561538261524f8261520c565b818152846020838601011115615396575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153c2575f80fd5b6153ca615192565b82356001600160401b03808211156153e0575f80fd5b6153ec36838701615365565b83526020850135915080821115615401575f80fd5b5061540e36828601615365565b602083015250604083013561542281614ec1565b604082015292915050565b5f825161535b818460208701615000565b601f8211156105aa57805f5260205f20601f840160051c810160208510156154635750805b601f840160051c820191505b81811015610ed5575f815560010161546f565b81516001600160401b0381111561549b5761549b61517e565b6154af816154a98454615138565b8461543e565b602080601f8311600181146154e2575f84156154cb5750858301515b5f19600386901b1c1916600185901b17855561111f565b5f85815260208120601f198616915b82811015615510578886015182559484019460019091019084016154f1565b508582101561552d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156123d9576123d961553d565b5f63ffffffff8083168181036155895761558961553d565b6001019392505050565b6001600160401b038181168382160280821691908281146155b6576155b661553d565b505092915050565b5f808335601e198436030181126155d3575f80fd5b83016020810192503590506001600160401b038111156155f1575f80fd5b80360382131561352d575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b878110156156dc57848303601f19018952813536889003605e19018112615663575f80fd5b8701606061567182806155be565b82875261568183880182846155ff565b92505050615691868301836155be565b868303888801526156a38382846155ff565b9250505060408083013592506156b883614ec1565b6001600160401b03929092169490910193909352978301979083019060010161563e565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561570d81614e35565b6001600160a01b031660608381019190915283013536849003601e19018112615734575f80fd5b83016020810190356001600160401b0381111561574f575f80fd5b8060051b3603821315615760575f80fd5b60808085015261577460a085018284615627565b95945050505050565b5f8261579757634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157b0576157b0614fd8565b91905290565b5f805f606084860312156157c8575f80fd5b8351925060208401516157da81614ec1565b60408501519092506157eb81614ec1565b809150509250925092565b8082028115828204841417610ec357610ec361553d565b5f806040838503121561581e575f80fd5b825191506020830151614f7a81614d4f565b5f60208083525f845461584281615138565b806020870152604060018084165f8114615863576001811461587f576158ac565b60ff19851660408a0152604084151560051b8a010195506158ac565b895f5260205f205f5b858110156158a35781548b8201860152908301908801615888565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156123d9576123d961553d565b5f80604083850312156158fa575f80fd5b82516001600160401b0380821115615910575f80fd5b9084019060608287031215615923575f80fd5b61592b615192565b82518152602083015161593d81614e35565b6020820152604083015182811115615953575f80fd5b61595f88828601615232565b6040830152508094505050506020830151614f7a81614d4f565b5f806040838503121561598a575f80fd5b825191506020830151614f7a81614ec1565b80820180821115610ec357610ec361553d565b5f8235603e1983360301811261535b575f80fd5b5f808335601e198436030181126159d8575f80fd5b8301803591506001600160401b038211156159f1575f80fd5b60200191503681900382131561352d575f80fd5b602081525f610fe76020830184866155ff565b5f60408236031215615a28575f80fd5b615a306151ba565b615a3983614d5c565b81526020808401356001600160401b0380821115615a55575f80fd5b9085019036601f830112615a67575f80fd5b813581811115615a7957615a7961517e565b8060051b9150615a8a8483016151dc565b8181529183018401918481019036841115615aa3575f80fd5b938501935b83851015615acd5784359250615abd83614e35565b8282529385019390850190615aa8565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015615b3a5784516001600160a01b03168252938301936001929092019190830190615b11565b509695505050505050565b60208152815160208201525f602083015160e06040840152615b6b610100840182615022565b90506040840151601f1980858403016060860152615b898383615022565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152615bb98383615adf565b925060a08601519150808584030160c086015250615bd78282615adf565b91505060c0840151615bf460e08501826001600160401b03169052565b509392505050565b5f8060408385031215615c0d575f80fd5b8251915060208301516001600160401b03811115615c29575f80fd5b615c3585828601615232565b9150509250929050565b6001600160401b03831115615c5657615c5661517e565b615c6a83615c648354615138565b8361543e565b5f601f841160018114615c9b575f8515615c845750838201355b5f19600387901b1c1916600186901b178355610ed5565b5f83815260208120601f198716915b82811015615cca5786850135825560209485019460019092019101615caa565b5086821015615ce6575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610ec357610ec361553d565b5f60208284031215615d1b575f80fd5b61333c82614eb0565b5f60208284031215615d34575f80fd5b813560ff8116811461333c575f80fd5b5f6001600160401b038083168181036155895761558961553d565b5f60208284031215615d6f575f80fd5b815161333c81614d4f56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220fafb3704210356d6f068b2621a4b7c5a5b40dcbb1963f3cd2fd2aedd85d49b9064736f6c63430008190033", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -649,6 +649,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) } +// Erc20 is a free data retrieval call binding the contract method 0x785e9e86. +// +// Solidity: function erc20() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) Erc20(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "erc20") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Erc20 is a free data retrieval call binding the contract method 0x785e9e86. +// +// Solidity: function erc20() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) Erc20() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.Erc20(&_ERC20TokenStakingManager.CallOpts) +} + +// Erc20 is a free data retrieval call binding the contract method 0x785e9e86. +// +// Solidity: function erc20() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) Erc20() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.Erc20(&_ERC20TokenStakingManager.CallOpts) +} + // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // // Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) @@ -1986,13 +2017,13 @@ func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error type ERC20TokenStakingManagerInitialValidatorCreated struct { ValidationID [32]byte NodeID common.Hash - Weight *big.Int + Weight uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} @@ -2011,9 +2042,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitial return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2057,9 +2088,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialV }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { event := new(ERC20TokenStakingManagerInitialValidatorCreated) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -2420,14 +2451,14 @@ type ERC20TokenStakingManagerValidationPeriodCreated struct { ValidationID [32]byte NodeID common.Hash RegisterValidationMessageID [32]byte - Weight *big.Int + Weight uint64 RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} @@ -2450,9 +2481,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat return &ERC20TokenStakingManagerValidationPeriodCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2500,9 +2531,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidati }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*ERC20TokenStakingManagerValidationPeriodCreated, error) { event := new(ERC20TokenStakingManagerValidationPeriodCreated) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { @@ -2735,14 +2766,14 @@ func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Close() er // ERC20TokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidationPeriodRegistered struct { ValidationID [32]byte - Weight *big.Int + Weight uint64 Timestamp *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodRegisteredIterator, error) { var validationIDRule []interface{} @@ -2757,9 +2788,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat return &ERC20TokenStakingManagerValidationPeriodRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil } -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2799,9 +2830,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidati }), nil } -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*ERC20TokenStakingManagerValidationPeriodRegistered, error) { event := new(ERC20TokenStakingManagerValidationPeriodRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { @@ -2882,14 +2913,14 @@ func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Close() e type ERC20TokenStakingManagerValidatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Weight *big.Int + Weight uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -2908,9 +2939,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat return &ERC20TokenStakingManagerValidatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2954,9 +2985,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidato }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { @@ -3037,14 +3068,14 @@ func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Close() error { type ERC20TokenStakingManagerValidatorWeightUpdate struct { ValidationID [32]byte Nonce uint64 - ValidatorWeight uint64 + Weight uint64 SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } // FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerValidatorWeightUpdateIterator, error) { var validationIDRule []interface{} @@ -3065,7 +3096,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat // WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} @@ -3111,7 +3142,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidato // ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*ERC20TokenStakingManagerValidatorWeightUpdate, error) { event := new(ERC20TokenStakingManagerValidatorWeightUpdate) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { @@ -3124,7 +3155,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidato // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x612160610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c3366004611904565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f0366004611904565b61044a565b604080519283526001600160401b039091166020830152016100d9565b610125610120366004611904565b61063b565b6040519081526020016100d9565b610146610141366004611904565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a561017936600461193d565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d991906119a1565b6101a56101c03660046119d5565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d366004611a0e565b610a1e565b610235610230366004611904565b610bff565b6040516100d99190611aaa565b6101a5610250366004611b61565b61154a565b6101a5610263366004611b93565b61158e565b61027b610276366004611ca1565b6115c4565b6040516100d9929190611d9d565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611dc9565b6102e6906008611ddc565b61ffff168582815181106102fc576102fc611df3565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611dc9565b61035f906008611ddc565b63ffffffff1686610371836002611e07565b8151811061038157610381611df3565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611dc9565b6103e2906008611ddc565b876103ee836006611e07565b815181106103fe576103fe611df3565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611df3565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611dc9565b6104a2906008611ddc565b61ffff168582815181106104b8576104b8611df3565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611dc9565b61051b906008611ddc565b63ffffffff168661052d836002611e07565b8151811061053d5761053d611df3565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611dc9565b61059c906008611ddc565b876105a8836006611e07565b815181106105b8576105b8611df3565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611dc9565b6105f2906008611ddc565b6001600160401b031688610607836026611e07565b8151811061061757610617611df3565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611dc9565b610692906008611ddc565b61ffff168482815181106106a8576106a8611df3565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611dc9565b61070b906008611ddc565b63ffffffff168561071d836002611e07565b8151811061072d5761072d611df3565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611dc9565b61078c906008611ddc565b86610798836006611e07565b815181106107a8576107a8611df3565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611dc9565b610821906008611ddc565b61ffff1686828151811061083757610837611df3565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611dc9565b61089a906008611ddc565b63ffffffff16876108ac836002611e07565b815181106108bc576108bc611df3565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611dc9565b61091d906008611ddc565b88610929836006611e07565b8151811061093957610939611df3565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611dc9565b610973906008611ddc565b6001600160401b031689610988836026611e07565b8151811061099857610998611df3565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611dc9565b6109d2906008611ddc565b6001600160401b03168a6109e783602e611e07565b815181106109f7576109f7611df3565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b60605f80833560208501356014610a3a87870160408901611e1a565b610a476060890189611e33565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b610acd6060850185611e33565b9050811015610bf85781610ae46060860186611e33565b83818110610af457610af4611df3565b9050602002810190610b069190611e7f565b610b109080611e9d565b9050610b1f6060870187611e33565b84818110610b2f57610b2f611df3565b9050602002810190610b419190611e7f565b610b4b9080611e9d565b610b586060890189611e33565b86818110610b6857610b68611df3565b9050602002810190610b7a9190611e7f565b610b88906020810190611e9d565b610b9560608b018b611e33565b88818110610ba557610ba5611df3565b9050602002810190610bb79190611e7f565b610bc8906060810190604001611edf565b604051602001610bde9796959493929190611ef8565b60408051601f198184030181529190529150600101610ac0565b5092915050565b610c076117b1565b5f610c106117b1565b5f805b6002811015610c6e57610c27816001611dc9565b610c32906008611ddc565b61ffff1686610c4763ffffffff871684611e07565b81518110610c5757610c57611df3565b016020015160f81c901b9190911790600101610c13565b5061ffff811615610c985760405163407b587360e01b815261ffff821660048201526024016102bb565b610ca3600284611f61565b9250505f805b6004811015610d0857610cbd816003611dc9565b610cc8906008611ddc565b63ffffffff16868563ffffffff1683610ce19190611e07565b81518110610cf157610cf1611df3565b016020015160f81c901b9190911790600101610ca9565b5063ffffffff8116600114610d3057604051635b60892f60e01b815260040160405180910390fd5b610d3b600484611f61565b9250505f805b6020811015610d9857610d5581601f611dc9565b610d60906008611ddc565b86610d7163ffffffff871684611e07565b81518110610d8157610d81611df3565b016020015160f81c901b9190911790600101610d41565b50808252610da7602084611f61565b9250505f805b6004811015610e0c57610dc1816003611dc9565b610dcc906008611ddc565b63ffffffff16868563ffffffff1683610de59190611e07565b81518110610df557610df5611df3565b016020015160f81c901b9190911790600101610dad565b50610e18600484611f61565b92505f8163ffffffff166001600160401b03811115610e3957610e3961180b565b6040519080825280601f01601f191660200182016040528015610e63576020820181803683370190505b5090505f5b8263ffffffff16811015610ed25786610e8763ffffffff871683611e07565b81518110610e9757610e97611df3565b602001015160f81c60f81b828281518110610eb457610eb4611df3565b60200101906001600160f81b03191690815f1a905350600101610e68565b5060208301819052610ee48285611f61565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610f705786610f2563ffffffff871683611e07565b81518110610f3557610f35611df3565b602001015160f81c60f81b828281518110610f5257610f52611df3565b60200101906001600160f81b03191690815f1a905350600101610f0b565b5060408301819052610f83603085611f61565b9350505f805b6008811015610fe957610f9d816007611dc9565b610fa8906008611ddc565b6001600160401b031687610fc263ffffffff881684611e07565b81518110610fd257610fd2611df3565b016020015160f81c901b9190911790600101610f89565b506001600160401b0381166060840152611004600885611f61565b9350505f805f5b600481101561106a5761101f816003611dc9565b61102a906008611ddc565b63ffffffff16888763ffffffff16836110439190611e07565b8151811061105357611053611df3565b016020015160f81c901b919091179060010161100b565b50611076600486611f61565b94505f5b60048110156110d95761108e816003611dc9565b611099906008611ddc565b63ffffffff16888763ffffffff16836110b29190611e07565b815181106110c2576110c2611df3565b016020015160f81c901b929092179160010161107a565b506110e5600486611f61565b94505f8263ffffffff166001600160401b038111156111065761110661180b565b60405190808252806020026020018201604052801561112f578160200160208202803683370190505b5090505f5b8363ffffffff16811015611217576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156111c9578a61117e63ffffffff8b1683611e07565b8151811061118e5761118e611df3565b602001015160f81c60f81b8282815181106111ab576111ab611df3565b60200101906001600160f81b03191690815f1a905350600101611164565b505f60148201519050808484815181106111e5576111e5611df3565b6001600160a01b039092166020928302919091019091015261120860148a611f61565b98505050806001019050611134565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156112995761124e816003611dc9565b611259906008611ddc565b63ffffffff16898863ffffffff16836112729190611e07565b8151811061128257611282611df3565b016020015160f81c901b919091179060010161123a565b506112a5600487611f61565b95505f5b6004811015611308576112bd816003611dc9565b6112c8906008611ddc565b63ffffffff16898863ffffffff16836112e19190611e07565b815181106112f1576112f1611df3565b016020015160f81c901b92909217916001016112a9565b50611314600487611f61565b95505f8263ffffffff166001600160401b038111156113355761133561180b565b60405190808252806020026020018201604052801561135e578160200160208202803683370190505b5090505f5b8363ffffffff16811015611446576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156113f8578b6113ad63ffffffff8c1683611e07565b815181106113bd576113bd611df3565b602001015160f81c60f81b8282815181106113da576113da611df3565b60200101906001600160f81b03191690815f1a905350600101611393565b505f601482015190508084848151811061141457611414611df3565b6001600160a01b039092166020928302919091019091015261143760148b611f61565b99505050806001019050611363565b506040805180820190915263ffffffff9092168252602082015260a08501525f6114708284611f61565b61147b906014611f7e565b61148685607a611f61565b6114909190611f61565b90508063ffffffff168851146114cc57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561152f576114e3816007611dc9565b6114ee906008611ddc565b6001600160401b03168a61150863ffffffff8b1684611e07565b8151811061151857611518611df3565b016020015160f81c901b91909117906001016114cf565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e01611576565b5f60608260400151516030146115ed5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861162e988a986001989297929690959094909390929101611fa6565b60405160208183030381529060405290505f5b846080015160200151518110156116a05781856080015160200151828151811061166d5761166d611df3565b6020026020010151604051602001611686929190612060565b60408051601f198184030181529190529150600101611641565b5060a08401518051602091820151516040516116c0938593929101612096565b60405160208183030381529060405290505f5b8460a00151602001515181101561173257818560a001516020015182815181106116ff576116ff611df3565b6020026020010151604051602001611718929190612060565b60408051601f1981840301815291905291506001016116d3565b5060c08401516040516117499183916020016120d1565b604051602081830303815290604052905060028160405161176a9190612102565b602060405180830381855afa158015611785573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117a89190612113565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156118415761184161180b565b60405290565b60405160e081016001600160401b03811182821017156118415761184161180b565b604051601f8201601f191681016001600160401b03811182821017156118915761189161180b565b604052919050565b5f82601f8301126118a8575f80fd5b81356001600160401b038111156118c1576118c161180b565b6118d4601f8201601f1916602001611869565b8181528460208386010111156118e8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611914575f80fd5b81356001600160401b03811115611929575f80fd5b61193584828501611899565b949350505050565b5f6020828403121561194d575f80fd5b5035919050565b5f5b8381101561196e578181015183820152602001611956565b50505f910152565b5f815180845261198d816020860160208601611954565b601f01601f19169290920160200192915050565b602081525f6119b36020830184611976565b9392505050565b80356001600160401b03811681146119d0575f80fd5b919050565b5f805f606084860312156119e7575f80fd5b833592506119f7602085016119ba565b9150611a05604085016119ba565b90509250925092565b5f60208284031215611a1e575f80fd5b81356001600160401b03811115611a33575f80fd5b8201608081850312156119b3575f80fd5b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611a9f5784516001600160a01b03168252938301936001929092019190830190611a76565b509695505050505050565b60208152815160208201525f602083015160e06040840152611ad0610100840182611976565b90506040840151601f1980858403016060860152611aee8383611976565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611b1e8383611a44565b925060a08601519150808584030160c086015250611b3c8282611a44565b91505060c0840151611b5960e08501826001600160401b03169052565b509392505050565b5f8060408385031215611b72575f80fd5b8235915060208301358015158114611b88575f80fd5b809150509250929050565b5f8060408385031215611ba4575f80fd5b82359150611bb4602084016119ba565b90509250929050565b80356001600160a01b03811681146119d0575f80fd5b5f60408284031215611be3575f80fd5b611beb61181f565b9050813563ffffffff81168114611c00575f80fd5b81526020828101356001600160401b0380821115611c1c575f80fd5b818501915085601f830112611c2f575f80fd5b813581811115611c4157611c4161180b565b8060051b9150611c52848301611869565b8181529183018401918481019088841115611c6b575f80fd5b938501935b83851015611c9057611c8185611bbd565b82529385019390850190611c70565b808688015250505050505092915050565b5f60208284031215611cb1575f80fd5b81356001600160401b0380821115611cc7575f80fd5b9083019060e08286031215611cda575f80fd5b611ce2611847565b82358152602083013582811115611cf7575f80fd5b611d0387828601611899565b602083015250604083013582811115611d1a575f80fd5b611d2687828601611899565b604083015250611d38606084016119ba565b6060820152608083013582811115611d4e575f80fd5b611d5a87828601611bd3565b60808301525060a083013582811115611d71575f80fd5b611d7d87828601611bd3565b60a083015250611d8f60c084016119ba565b60c082015295945050505050565b828152604060208201525f6119356040830184611976565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561158857611588611db5565b808202811582820484141761158857611588611db5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561158857611588611db5565b5f60208284031215611e2a575f80fd5b6119b382611bbd565b5f808335601e19843603018112611e48575f80fd5b8301803591506001600160401b03821115611e61575f80fd5b6020019150600581901b3603821315611e78575f80fd5b9250929050565b5f8235605e19833603018112611e93575f80fd5b9190910192915050565b5f808335601e19843603018112611eb2575f80fd5b8301803591506001600160401b03821115611ecb575f80fd5b602001915036819003821315611e78575f80fd5b5f60208284031215611eef575f80fd5b6119b3826119ba565b5f8851611f09818460208d01611954565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b63ffffffff818116838216019080821115610bf857610bf8611db5565b63ffffffff818116838216028082169190828114611f9e57611f9e611db5565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611fec81602a850160208b01611954565b86519083019061200381602a840160208b01611954565b60c087901b6001600160c01b031916602a9290910191820152612035603282018660e01b6001600160e01b0319169052565b61204e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351612071818460208801611954565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120a7818460208901611954565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120e2818460208801611954565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f8251611e93818460208701611954565b5f60208284031215612123575f80fd5b505191905056fea264697066735822122011621dfb91ec33af686b7db0125d7be205eba3545324b3431097bb320ce72c5764736f6c63430008190033", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea2646970667358221220c86fc0fb87c524ec5b0c98159450f3ea9dc01af042aec5aff977246d615450e664736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 8bc946830..89a61293e 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -103,8 +103,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c39380380615c3983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615aec8061014d5f395ff3fe608060405260043610610233575f3560e01c80637d8d2f7711610129578063b771b3bc116100a8578063c974d1b61161006d578063c974d1b614610690578063d5f20ff6146106a4578063df93d8de146106d0578063fb8b11dd146106e6578063fd7ac5e714610705575f80fd5b8063b771b3bc14610605578063ba3a4b971461061f578063bc5fbfec1461063e578063bee0a03f1461065e578063c599e24f1461067d575f80fd5b80639ae06447116100ee5780639ae0644714610581578063a3a65e48146105a0578063a9778a7a14610387578063af2f5feb146105bf578063afb98096146105d2575f80fd5b80637d8d2f77146104f157806380dd672f146105105780638280a25a1461052f5780638ef34c981461054357806393e2459814610562575f80fd5b806337b9be8f116101b557806360ad77841161017a57806360ad778414610454578063620658561461047357806366435abf146104a0578063732214f8146104bf57806376f78621146104d2575f80fd5b806337b9be8f146103af5780633a1cfff6146103ce578063467ef06f146103ed5780635dd6a6cb1461040c57806360305d621461042b575f80fd5b806320d91b7a116101fb57806320d91b7a146102e057806325e1c776146102ff5780632e2194d81461031e578063329c3e121461035557806335455ded14610387575f80fd5b80630118acc4146102375780630322ed98146102585780630ba512d114610277578063151d30d1146102965780631ec44724146102c1575b5f80fd5b348015610242575f80fd5b50610256610251366004614abe565b610724565b005b348015610263575f80fd5b50610256610272366004614af9565b610735565b348015610282575f80fd5b50610256610291366004614b10565b6109c5565b3480156102a1575f80fd5b506102aa600a81565b60405160ff90911681526020015b60405180910390f35b3480156102cc575f80fd5b506102566102db366004614abe565b610aa2565b3480156102eb575f80fd5b506102566102fa366004614b27565b610aae565b34801561030a575f80fd5b50610256610319366004614b75565b611033565b348015610329575f80fd5b5061033d610338366004614af9565b6110a7565b6040516001600160401b0390911681526020016102b8565b348015610360575f80fd5b5061036f6001600160991b0181565b6040516001600160a01b0390911681526020016102b8565b348015610392575f80fd5b5061039c61271081565b60405161ffff90911681526020016102b8565b3480156103ba575f80fd5b506102566103c9366004614baa565b6110fb565b3480156103d9575f80fd5b506102566103e8366004614abe565b61110e565b3480156103f8575f80fd5b50610256610407366004614bf8565b61111a565b348015610417575f80fd5b50610256610426366004614baa565b6111ff565b348015610436575f80fd5b5061043f601481565b60405163ffffffff90911681526020016102b8565b34801561045f575f80fd5b5061025661046e366004614b75565b61120b565b34801561047e575f80fd5b5061049261048d366004614c25565b6114d8565b6040519081526020016102b8565b3480156104ab575f80fd5b5061033d6104ba366004614af9565b6114f8565b3480156104ca575f80fd5b506104925f81565b3480156104dd575f80fd5b506102566104ec366004614abe565b61150c565b3480156104fc575f80fd5b5061025661050b366004614baa565b611518565b34801561051b575f80fd5b5061025661052a366004614b75565b611524565b34801561053a575f80fd5b506102aa603081565b34801561054e575f80fd5b5061025661055d366004614c40565b61175e565b34801561056d575f80fd5b5061025661057c366004614af9565b61183f565b34801561058c575f80fd5b5061025661059b366004614baa565b6118d3565b3480156105ab575f80fd5b506102566105ba366004614bf8565b6118df565b6104926105cd366004614c7f565b611ad4565b3480156105dd575f80fd5b506104927f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610610575f80fd5b5061036f6005600160991b0181565b34801561062a575f80fd5b50610256610639366004614af9565b611b08565b348015610649575f80fd5b506104925f80516020615a5783398151915281565b348015610669575f80fd5b50610256610678366004614af9565b611d61565b61049261068b366004614af9565b611e9e565b34801561069b575f80fd5b506102aa601481565b3480156106af575f80fd5b506106c36106be366004614af9565b611ecf565b6040516102b89190614d55565b3480156106db575f80fd5b5061033d6202a30081565b3480156106f1575f80fd5b50610256610700366004614c40565b61201e565b348015610710575f80fd5b5061049261071f366004614dd5565b6120e5565b6107308383835f612140565b505050565b5f8181525f80516020615a978339815191526020526040808220815160e0810190925280545f80516020615a5783398151915293929190829060ff16600581111561078257610782614ce0565b600581111561079357610793614ce0565b81526020016001820180546107a790614e40565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390614e40565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561088957610889614ce0565b146108c5575f8381526007830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614e72565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561093c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109639190810190614f7b565b6040518263ffffffff1660e01b815260040161097f9190614fac565b6020604051808303815f875af115801561099b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bf9190614fbe565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0e575080546001600160401b03808416911610155b15610a2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a568361216c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6109bf8383835f61217d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615a578339815191529060ff1615610b0057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b679190614fbe565b836020013514610b90576040516372b0a7e760e11b8152602084013560048201526024016108bc565b30610ba16060850160408601614fd5565b6001600160a01b031614610be457610bbf6060840160408501614fd5565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016108bc565b5f610bf26060850185614ff0565b905090505f805b828163ffffffff161015610e59575f610c156060880188614ff0565b8363ffffffff16818110610c2b57610c2b615035565b9050602002810190610c3d9190615049565b610c46906150b4565b80516040519192505f916008880191610c5e9161512f565b90815260200160405180910390205414610c8e57805160405163a41f772f60e01b81526108bc9190600401614fac565b5f6002885f013584604051602001610cbd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610cd79161512f565b602060405180830381855afa158015610cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d159190614fbe565b90508086600801835f0151604051610d2d919061512f565b90815260408051918290036020908101909220929092555f8381526007890190915220805460ff191660021781558251600190910190610d6d9082615184565b50604080830180515f84815260078a01602052929092206002810180549251426001600160401b03908116600160c01b026001600160c01b03928216600160801b81026001600160c01b03199097169290971691909117949094171692909217909155600301805467ffffffffffffffff19169055610dec9085615253565b8251604051919550610dfd9161512f565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610e5290615266565b9050610bf9565b50600483018190556001830154606490610e7d90600160401b900460ff1683615288565b1015610e9f57604051635943317f60e01b8152600481018290526024016108bc565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610ec3876124b2565b604001516040518263ffffffff1660e01b8152600401610ee39190614fac565b602060405180830381865af4158015610efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f229190614fbe565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610f5c91906153ca565b5f60405180830381865af4158015610f76573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f9d9190810190614f7b565b90505f600282604051610fb0919061512f565b602060405180830381855afa158015610fcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fee9190614fbe565b905082811461101a5760405163baaea89d60e01b815260048101829052602481018490526044016108bc565b5050506009909201805460ff1916600117905550505050565b61103c826125c8565b61105c576040516330efa98b60e01b8152600481018390526024016108bc565b5f61106683611ecf565b519050600281600581111561107d5761107d614ce0565b1461109d578060405163170cc93360e21b81526004016108bc9190614e72565b6109bf83836125f1565b5f806110b1612890565b600301546110bf908461545e565b90508015806110d457506001600160401b0381115b156110f55760405163222d164360e21b8152600481018490526024016108bc565b92915050565b6111078484848461217d565b5050505050565b6109bf8383835f6128b4565b611122612ad6565b5f61112b612890565b90505f8061113884612b0d565b91509150611145826125c8565b611151575050506111e6565b5f828152600684016020908152604080832054600b8701909252909120546001600160a01b039182169116806111885750806111a6565b5f848152600b86016020526040902080546001600160a01b03191690555b6004835160058111156111bb576111bb614ce0565b036111ca576111ca8185612ec0565b6111e0826111db85604001516114d8565b612eea565b50505050505b6111fc60015f80516020615a7783398151915255565b50565b6109bf84848484612f10565b5f611214612890565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561124d5761124d614ce0565b600381111561125e5761125e614ce0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6112d482611ecf565b90506001835160038111156112eb576112eb614ce0565b1461130c578251604051633b0d540d60e21b81526108bc919060040161547d565b60048151600581111561132157611321614ce0565b036113375761132f86612f3c565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61135c896124b2565b604001516040518263ffffffff1660e01b815260040161137c9190614fac565b606060405180830381865af4158015611397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113bb9190615497565b50915091508184146113e857846040015160405163089938b360e11b81526004016108bc91815260200190565b806001600160401b031683606001516001600160401b031610806114215750806001600160401b03168560a001516001600160401b0316115b1561144a57604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6114e1612890565b600301546110f5906001600160401b038416615288565b5f61150282611ecf565b6080015192915050565b6107308383835f612f10565b611107848484846128b4565b61152c612ad6565b5f611535612890565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561156e5761156e614ce0565b600381111561157f5761157f614ce0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115f8576115f8614ce0565b14611619578051604051633b0d540d60e21b81526108bc919060040161547d565b60046116288260400151611ecf565b51600581111561163a5761163a614ce0565b14611739575f611649846124b2565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016116889190614fac565b606060405180830381865af41580156116a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116c79190615497565b5091509150818460400151146116f35760405163089938b360e11b8152600481018390526024016108bc565b806001600160401b03168460c001516001600160401b0316111561173557604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5050505b61174284612f3c565b505061175a60015f80516020615a7783398151915255565b5050565b5f611767612890565b90506001600160a01b03821661179b5760405163caa903f960e01b81526001600160a01b03831660048201526024016108bc565b5f8381526006820160205260409020546001600160a01b031633146117e157335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016108bc565b336001600160a01b03831603611810575f928352600b01602052506040902080546001600160a01b0319169055565b5f838152600b82016020526040902080546001600160a01b0384166001600160a01b0319909116179055505050565b5f611848612890565b90505f61185483611ecf565b519050600481600581111561186b5761186b614ce0565b1461188b578060405163170cc93360e21b81526004016108bc9190614e72565b5f8381526006830160205260409020546001600160a01b031633146118b057336117bc565b5f838152600683016020526040902054610730906001600160a01b031684612ec0565b6109bf84848484612140565b5f80516020615a578339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f611912866124b2565b604001516040518263ffffffff1660e01b81526004016119329190614fac565b6040805180830381865af415801561194c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197091906154cc565b915091508061199657604051632d07135360e01b815281151560048201526024016108bc565b5f828152600684016020526040902080546119b090614e40565b90505f036119d45760405163089938b360e11b8152600481018390526024016108bc565b60015f83815260078501602052604090205460ff1660058111156119fa576119fa614ce0565b14611a2d575f8281526007840160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614e72565b5f8281526006840160205260408120611a4591614a12565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611add612ad6565b611ae984848434613149565b9050611b0160015f80516020615a7783398151915255565b9392505050565b5f611b11612890565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611b4a57611b4a614ce0565b6003811115611b5b57611b5b614ce0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611bd457611bd4614ce0565b14158015611bf55750600381516003811115611bf257611bf2614ce0565b14155b15611c16578051604051633b0d540d60e21b81526108bc919060040161547d565b5f611c248260400151611ecf565b905080606001516001600160401b03165f03611c56576040516339b894f960e21b8152600481018590526024016108bc565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611cc493906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611cde573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d059190810190614f7b565b6040518263ffffffff1660e01b8152600401611d219190614fac565b6020604051808303815f875af1158015611d3d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111079190614fbe565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615a578339815191529190611da890614e40565b90505f03611dcc5760405163089938b360e11b8152600481018390526024016108bc565b60015f83815260078301602052604090205460ff166005811115611df257611df2614ce0565b14611e25575f8281526007820160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614e72565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611e5e91906004016154ef565b6020604051808303815f875af1158015611e7a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107309190614fbe565b5f611ea7612ad6565b611eb28233346132a3565b9050611eca60015f80516020615a7783398151915255565b919050565b611ed7614a49565b5f8281525f80516020615a97833981519152602052604090819020815160e0810190925280545f80516020615a57833981519152929190829060ff166005811115611f2457611f24614ce0565b6005811115611f3557611f35614ce0565b8152602001600182018054611f4990614e40565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7590614e40565b8015611fc05780601f10611f9757610100808354040283529160200191611fc0565b820191905f5260205f20905b815481529060010190602001808311611fa357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b0381166120505760405163caa903f960e01b81526001600160a01b03821660048201526024016108bc565b5f612059612890565b5f8481526007820160205260409020549091506001600160a01b0361010090910416331461208757336117bc565b336001600160a01b038316036120b6575f928352600901602052506040902080546001600160a01b0319169055565b5f838152600982016020526040902080546001600160a01b0384166001600160a01b0319909116179055505050565b6040515f905f80516020615a57833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08906121289086908690615579565b90815260200160405180910390205491505092915050565b61214c8484848461217d565b6109bf57604051631036cf9160e11b8152600481018590526024016108bc565b6121746134e3565b6111fc8161352e565b5f80612187612890565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff1660038111156121c0576121c0614ce0565b60038111156121d1576121d1614ce0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61224782611ecf565b905060028351600381111561225e5761225e614ce0565b1461227f578251604051633b0d540d60e21b81526108bc919060040161547d565b60208301516001600160a01b0316331461231b575f8281526006850160205260409020546001600160a01b031633146122b857336117bc565b5f82815260068501602052604090205460a08201516122e791600160b01b90046001600160401b031690615588565b6001600160401b031642101561231b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b60028151600581111561233057612330614ce0565b036124525760028401546080840151612352916001600160401b031690615588565b6001600160401b03164210156123865760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b87156123985761239682886125f1565b505b5f8981526007850160205260409020805460ff19166003179055606083015160808201516123d19184916123cc91906155a8565b6135a8565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561241484888c61377f565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a3151594506124aa9350505050565b60048151600581111561246757612467614ce0565b0361248e5761247783878b61377f565b5061248189612f3c565b60019450505050506124aa565b805160405163170cc93360e21b81526108bc9190600401614e72565b949350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612516573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261253d91908101906155c8565b915091508061255f57604051636b2f19e960e01b815260040160405180910390fd5b815115612585578151604051636ba589a560e01b815260048101919091526024016108bc565b60208201516001600160a01b0316156125c1576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5092915050565b5f806125d2612890565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561263c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261266391908101906155c8565b915091508061268557604051636b2f19e960e01b815260040160405180910390fd5b5f61268e612890565b60058101548451919250146126bc578251604051636ba589a560e01b815260048101919091526024016108bc565b60208301516001600160a01b0316156126f8576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b60208301516001600160a01b031615612734576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b81526004016127719190614fac565b6040805180830381865af415801561278b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127af9190615658565b915091508188146127d65760405163089938b360e11b8152600481018990526024016108bc565b5f8881526006840160205260409020600101546001600160401b039081169082161115612867575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612885565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806128be612890565b90505f6128ca87613964565b90506128d5876125c8565b6128e4576001925050506124aa565b5f8781526006830160205260409020546001600160a01b0316331461290957336117bc565b5f87815260068301602052604090205460a082015161293891600160b01b90046001600160401b031690615588565b6001600160401b03168160c001516001600160401b0316101561297f5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016108bc565b5f86156129975761299088876125f1565b90506129b5565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906129da906114d8565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612a43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a679190614fbe565b90508084600a015f8b81526020019081526020015f205f828254612a8b9190615253565b90915550506001600160a01b03861615612ac8575f898152600b85016020526040902080546001600160a01b0319166001600160a01b0388161790555b151598975050505050505050565b5f80516020615a77833981519152805460011901612b0757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612b16614a49565b5f80516020615a578339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612b49886124b2565b604001516040518263ffffffff1660e01b8152600401612b699190614fac565b6040805180830381865af4158015612b83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ba791906154cc565b915091508015612bce57604051632d07135360e01b815281151560048201526024016108bc565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612bff57612bff614ce0565b6005811115612c1057612c10614ce0565b8152602001600182018054612c2490614e40565b80601f0160208091040260200160405190810160405280929190818152602001828054612c5090614e40565b8015612c9b5780601f10612c7257610100808354040283529160200191612c9b565b820191905f5260205f20905b815481529060010190602001808311612c7e57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612d0657612d06614ce0565b14158015612d275750600181516005811115612d2457612d24614ce0565b14155b15612d4857805160405163170cc93360e21b81526108bc9190600401614e72565b600381516005811115612d5d57612d5d614ce0565b03612d6b5760048152612d70565b600581525b836008018160200151604051612d86919061512f565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612dca57612dca614ce0565b021790555060208201516001820190612de39082615184565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e8957612e89614ce0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612ec9612890565b5f838152600a82016020526040812080549190559091506109bf8482613c48565b61175a6001600160a01b03831682613ca6565b60015f80516020615a7783398151915255565b612f1c848484846128b4565b6109bf57604051635bff683f60e11b8152600481018590526024016108bc565b5f612f45612890565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f7e57612f7e614ce0565b6003811115612f8f57612f8f614ce0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015281015190915061302c7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b826080015161303b9190615588565b6001600160401b031642101561306f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b5f848152600784016020908152604080832080546001600160a81b031916815560018101849055600201839055600986019091529020546001600160a01b0316806130bf575060208201516130dd565b5f858152600985016020526040902080546001600160a01b03191690555b5f806130ea838886613d39565b9150915061310385602001516111db87606001516114d8565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f80613153612890565b600281015490915061ffff600160401b9091048116908616108061317c575061271061ffff8616115b156131a057604051635f12e6c360e11b815261ffff861660048201526024016108bc565b60028101546001600160401b0390811690851610156131dc576040516202a06d60e11b81526001600160401b03851660048201526024016108bc565b80548310806131ee5750806001015483115b1561320f5760405163222d164360e21b8152600481018490526024016108bc565b825f61321a826110a7565b90505f6132278983613de6565b5f818152600695909501602052604090942080546001600160b01b0319163317600160a01b61ffff9a909a16999099029890981767ffffffffffffffff60b01b1916600160b01b6001600160401b03989098169790970296909617875550506001909401805467ffffffffffffffff1916905550919392505050565b5f806132ad612890565b90505f6132b9846110a7565b90505f6132c587611ecf565b90506132d0876125c8565b6132f0576040516330efa98b60e01b8152600481018890526024016108bc565b60028151600581111561330557613305614ce0565b1461332657805160405163170cc93360e21b81526108bc9190600401614e72565b5f8282608001516133379190615588565b905083600201600a9054906101000a90046001600160401b03168260400151613360919061567b565b6001600160401b0316816001600160401b0316111561339d57604051636d51fe0560e11b81526001600160401b03821660048201526024016108bc565b5f806133a98a846135a8565b915091505f8a836040516020016133d792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a49a9950505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661352c57604051631afcd79f60e31b815260040160405180910390fd5b565b6135366134e3565b61353f8161430b565b613547614324565b6111fc6060820135608083013561356460c0850160a08601614c25565b61357460e0860160c087016156a6565b613585610100870160e088016156bf565b61010087013561359d61014089016101208a01614fd5565b886101400135614334565b5f8281525f80516020615a97833981519152602052604081206002015481905f80516020615a5783398151915290600160801b90046001600160401b03166135f08582614519565b5f6135fa8761473c565b5f888152600785016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156136a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526136ca9190810190614f7b565b6040518263ffffffff1660e01b81526004016136e69190614fac565b6020604051808303815f875af1158015613702573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137269190614fbe565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f80613789612890565b90505f6137998660400151611ecf565b90505f6003825160058111156137b1576137b1614ce0565b14806137cf57506004825160058111156137cd576137cd614ce0565b145b156137df575060c081015161381c565b6002825160058111156137f4576137f4614ce0565b0361380057504261381c565b815160405163170cc93360e21b81526108bc9190600401614e72565b86608001516001600160401b0316816001600160401b031611613844575f9350505050611b01565b600483015460608801515f916001600160a01b031690634f22429f90613869906114d8565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156138ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390e9190614fbe565b5f878152600886016020526040902081905590506001600160a01b03871615612885575f868152600985016020526040902080546001600160a01b0319166001600160a01b038916179055979650505050505050565b61396c614a49565b5f8281525f80516020615a978339815191526020526040808220815160e0810190925280545f80516020615a5783398151915293929190829060ff1660058111156139b9576139b9614ce0565b60058111156139ca576139ca614ce0565b81526020016001820180546139de90614e40565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0a90614e40565b8015613a555780601f10613a2c57610100808354040283529160200191613a55565b820191905f5260205f20905b815481529060010190602001808311613a3857829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613ac357613ac3614ce0565b14613af6575f8481526007830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614e72565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613b3a57613b3a614ce0565b021790555060208201516001820190613b539082615184565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613bf185826135a8565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613c94575f80fd5b505af115801561132f573d5f803e3d5ffd5b80471015613cc95760405163cd78605960e01b81523060048201526024016108bc565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613d12576040519150601f19603f3d011682016040523d82523d5f602084013e613d17565b606091505b505090508061073057604051630a12f52160e11b815260040160405180910390fd5b5f805f613d44612890565b5f86815260088201602052604081208054908290559192509081908015613dd8575f87815260068501602052604090205461271090613d8e90600160a01b900461ffff1683615288565b613d98919061545e565b91508184600a015f8981526020019081526020015f205f828254613dbc9190615253565b90915550613dcc905082826156df565b9250613dd88984613c48565b509097909650945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e2a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615a5783398151915242613e496060860160408701614c25565b6001600160401b0316111580613e835750613e676202a30042615253565b613e776060860160408701614c25565b6001600160401b031610155b15613ebd57613e986060850160408601614c25565b604051635879da1360e11b81526001600160401b0390911660048201526024016108bc565b613ed2613ecd60608601866156f2565b6147b1565b613ee2613ecd60808601866156f2565b6030613ef16020860186615706565b905014613f2357613f056020850185615706565b6040516326475b2f60e11b81526108bc925060040190815260200190565b613f2d8480615706565b90505f03613f5a57613f3f8480615706565b604051633e08a12560e11b81526004016108bc929190615748565b5f60088201613f698680615706565b604051613f77929190615579565b90815260200160405180910390205414613fb057613f958480615706565b60405163a41f772f60e01b81526004016108bc929190615748565b613fba835f614519565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613ff78a80615706565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061403f908b018b615706565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408860608b0160408c01614c25565b6001600160401b031681526020016140a360608b018b6156f2565b6140ac9061575b565b81526020016140be60808b018b6156f2565b6140c79061575b565b8152602001886001600160401b03168152506040518263ffffffff1660e01b81526004016140f59190615888565b5f60405180830381865af415801561410f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052614136919081019061593f565b5f828152600686016020526040902091935091506141548282615184565b5081600884016141648880615706565b604051614172929190615579565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141ae908590600401614fac565b6020604051808303815f875af11580156141ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ee9190614fbe565b5f8481526007860160205260409020805460ff1916600117905590506142148780615706565b5f858152600787016020526040902060010191614232919083615982565b505f83815260078501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff19169055806142918880615706565b60405161429f929190615579565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142dd9190614c25565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6143136134e3565b61431b61491a565b6111fc81614922565b61432c6134e3565b61352c614a0a565b61433c6134e3565b5f614345612890565b905061ffff8616158061435d575061271061ffff8716115b1561438157604051635f12e6c360e11b815261ffff871660048201526024016108bc565b878911156143a55760405163222d164360e21b8152600481018a90526024016108bc565b60ff851615806143b85750600a60ff8616115b156143db5760405163170db35960e31b815260ff861660048201526024016108bc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316876001600160401b03161015614442576040516202a06d60e11b81526001600160401b03881660048201526024016108bc565b835f036144625760405163a733007160e01b815260040160405180910390fd5b8161448357604051632f6bd1db60e01b8152600481018390526024016108bc565b97885560018801969096556002870180546001600160401b039690961669ffffffffffffffffffff1990961695909517600160401b61ffff95909516949094029390931767ffffffffffffffff60501b191660ff92909216600160501b029190911790925560038401919091556004830180546001600160a01b0319166001600160a01b03909216919091179055600590910155565b5f80516020615a578339815191525f6001600160401b03808416908516111561454d5761454683856155a8565b905061455a565b61455784846155a8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145bc5750600184015481516145b8916001600160401b031690615253565b8210155b156145e2576001600160401b038316606082015281815260408101516020820152614601565b82816060018181516145f49190615588565b6001600160401b03169052505b606081015161461190606461567b565b602082015160018601546001600160401b03929092169161463c9190600160401b900460ff16615288565b101561466c57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016108bc565b856001600160401b0316816040018181516146879190615253565b9052506040810180516001600160401b03871691906146a79083906156df565b905250600184015460408201516064916146cc91600160401b90910460ff1690615288565b10156146f3578060400151604051635943317f60e01b81526004016108bc91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a978339815191526020526040812060020180545f80516020615a57833981519152919060089061478690600160401b90046001600160401b0316615a3b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147be6020820182614bf8565b63ffffffff161580156147de57506147d96020820182614ff0565b151590505b15614825576147f06020820182614bf8565b6147fd6020830183614ff0565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016108bc565b6148326020820182614ff0565b90506148416020830183614bf8565b63ffffffff16111561485a576147f06020820182614bf8565b60015b61486a6020830183614ff0565b905081101561175a576148806020830183614ff0565b61488b6001846156df565b81811061489a5761489a615035565b90506020020160208101906148af9190614fd5565b6001600160a01b03166148c56020840184614ff0565b838181106148d5576148d5615035565b90506020020160208101906148ea9190614fd5565b6001600160a01b0316101561491257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161485d565b61352c6134e3565b61492a6134e3565b80355f80516020615a57833981519152908155601461494f60608401604085016156bf565b60ff16118061496e575061496960608301604084016156bf565b60ff16155b156149a25761498360608301604084016156bf565b604051634a59bbff60e11b815260ff90911660048201526024016108bc565b6149b260608301604084016156bf565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149e36040830160208401614c25565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612efd6134e3565b508054614a1e90614e40565b5f825580601f10614a2d575050565b601f0160209004905f5260205f20908101906111fc9190614a86565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614a9a575f8155600101614a87565b5090565b80151581146111fc575f80fd5b803563ffffffff81168114611eca575f80fd5b5f805f60608486031215614ad0575f80fd5b833592506020840135614ae281614a9e565b9150614af060408501614aab565b90509250925092565b5f60208284031215614b09575f80fd5b5035919050565b5f6101608284031215614b21575f80fd5b50919050565b5f8060408385031215614b38575f80fd5b82356001600160401b03811115614b4d575f80fd5b830160808186031215614b5e575f80fd5b9150614b6c60208401614aab565b90509250929050565b5f8060408385031215614b86575f80fd5b82359150614b6c60208401614aab565b6001600160a01b03811681146111fc575f80fd5b5f805f8060808587031215614bbd575f80fd5b843593506020850135614bcf81614a9e565b9250614bdd60408601614aab565b91506060850135614bed81614b96565b939692955090935050565b5f60208284031215614c08575f80fd5b611b0182614aab565b6001600160401b03811681146111fc575f80fd5b5f60208284031215614c35575f80fd5b8135611b0181614c11565b5f8060408385031215614c51575f80fd5b823591506020830135614c6381614b96565b809150509250929050565b803561ffff81168114611eca575f80fd5b5f805f60608486031215614c91575f80fd5b83356001600160401b03811115614ca6575f80fd5b840160a08187031215614cb7575f80fd5b9250614cc560208501614c6e565b91506040840135614cd581614c11565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60068110614d0457614d04614ce0565b9052565b5f5b83811015614d22578181015183820152602001614d0a565b50505f910152565b5f8151808452614d41816020860160208601614d08565b601f01601f19169290920160200192915050565b60208152614d67602082018351614cf4565b5f602083015160e06040840152614d82610100840182614d2a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614de6575f80fd5b82356001600160401b0380821115614dfc575f80fd5b818501915085601f830112614e0f575f80fd5b813581811115614e1d575f80fd5b866020828501011115614e2e575f80fd5b60209290920196919550909350505050565b600181811c90821680614e5457607f821691505b602082108103614b2157634e487b7160e01b5f52602260045260245ffd5b602081016110f58284614cf4565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614eb657614eb6614e80565b60405290565b604080519081016001600160401b0381118282101715614eb657614eb6614e80565b604051601f8201601f191681016001600160401b0381118282101715614f0657614f06614e80565b604052919050565b5f6001600160401b03821115614f2657614f26614e80565b50601f01601f191660200190565b5f82601f830112614f43575f80fd5b8151614f56614f5182614f0e565b614ede565b818152846020838601011115614f6a575f80fd5b6124aa826020830160208701614d08565b5f60208284031215614f8b575f80fd5b81516001600160401b03811115614fa0575f80fd5b6124aa84828501614f34565b602081525f611b016020830184614d2a565b5f60208284031215614fce575f80fd5b5051919050565b5f60208284031215614fe5575f80fd5b8135611b0181614b96565b5f808335601e19843603018112615005575f80fd5b8301803591506001600160401b0382111561501e575f80fd5b6020019150600581901b3603821315613778575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261505d575f80fd5b9190910192915050565b5f82601f830112615076575f80fd5b8135615084614f5182614f0e565b818152846020838601011115615098575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156150c4575f80fd5b6150cc614e94565b82356001600160401b03808211156150e2575f80fd5b6150ee36838701615067565b83526020850135915080821115615103575f80fd5b5061511036828601615067565b602083015250604083013561512481614c11565b604082015292915050565b5f825161505d818460208701614d08565b601f82111561073057805f5260205f20601f840160051c810160208510156151655750805b601f840160051c820191505b81811015611107575f8155600101615171565b81516001600160401b0381111561519d5761519d614e80565b6151b1816151ab8454614e40565b84615140565b602080601f8311600181146151e4575f84156151cd5750858301515b5f19600386901b1c1916600185901b17855561132f565b5f85815260208120601f198616915b82811015615212578886015182559484019460019091019084016151f3565b508582101561522f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808201808211156110f5576110f561523f565b5f63ffffffff80831681810361527e5761527e61523f565b6001019392505050565b80820281158282048414176110f5576110f561523f565b5f808335601e198436030181126152b4575f80fd5b83016020810192503590506001600160401b038111156152d2575f80fd5b803603821315613778575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b878110156153bd57848303601f19018952813536889003605e19018112615344575f80fd5b87016060615352828061529f565b82875261536283880182846152e0565b925050506153728683018361529f565b868303888801526153848382846152e0565b92505050604080830135925061539983614c11565b6001600160401b03929092169490910193909352978301979083019060010161531f565b5090979650505050505050565b6020815281356020820152602082013560408201525f60408301356153ee81614b96565b6001600160a01b031660608381019190915283013536849003601e19018112615415575f80fd5b83016020810190356001600160401b03811115615430575f80fd5b8060051b3603821315615441575f80fd5b60808085015261545560a085018284615308565b95945050505050565b5f8261547857634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061549157615491614ce0565b91905290565b5f805f606084860312156154a9575f80fd5b8351925060208401516154bb81614c11565b6040850151909250614cd581614c11565b5f80604083850312156154dd575f80fd5b825191506020830151614c6381614a9e565b5f60208083525f845461550181614e40565b806020870152604060018084165f8114615522576001811461553e5761556b565b60ff19851660408a0152604084151560051b8a0101955061556b565b895f5260205f205f5b858110156155625781548b8201860152908301908801615547565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156125c1576125c161523f565b6001600160401b038281168282160390808211156125c1576125c161523f565b5f80604083850312156155d9575f80fd5b82516001600160401b03808211156155ef575f80fd5b9084019060608287031215615602575f80fd5b61560a614e94565b82518152602083015161561c81614b96565b6020820152604083015182811115615632575f80fd5b61563e88828601614f34565b6040830152508094505050506020830151614c6381614a9e565b5f8060408385031215615669575f80fd5b825191506020830151614c6381614c11565b6001600160401b0381811683821602808216919082811461569e5761569e61523f565b505092915050565b5f602082840312156156b6575f80fd5b611b0182614c6e565b5f602082840312156156cf575f80fd5b813560ff81168114611b01575f80fd5b818103818111156110f5576110f561523f565b5f8235603e1983360301811261505d575f80fd5b5f808335601e1984360301811261571b575f80fd5b8301803591506001600160401b03821115615734575f80fd5b602001915036819003821315613778575f80fd5b602081525f6124aa6020830184866152e0565b5f6040823603121561576b575f80fd5b615773614ebc565b61577c83614aab565b81526020808401356001600160401b0380821115615798575f80fd5b9085019036601f8301126157aa575f80fd5b8135818111156157bc576157bc614e80565b8060051b91506157cd848301614ede565b81815291830184019184810190368411156157e6575f80fd5b938501935b83851015615810578435925061580083614b96565b82825293850193908501906157eb565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b8083101561587d5784516001600160a01b03168252938301936001929092019190830190615854565b509695505050505050565b60208152815160208201525f602083015160e060408401526158ae610100840182614d2a565b90506040840151601f19808584030160608601526158cc8383614d2a565b92506001600160401b03606087015116608086015260808601519150808584030160a08601526158fc8383615822565b925060a08601519150808584030160c08601525061591a8282615822565b91505060c084015161593760e08501826001600160401b03169052565b509392505050565b5f8060408385031215615950575f80fd5b8251915060208301516001600160401b0381111561596c575f80fd5b61597885828601614f34565b9150509250929050565b6001600160401b0383111561599957615999614e80565b6159ad836159a78354614e40565b83615140565b5f601f8411600181146159de575f85156159c75750838201355b5f19600387901b1c1916600186901b178355611107565b5f83815260208120601f198716915b82811015615a0d57868501358255602094850194600190920191016159ed565b5086821015615a29575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6001600160401b0380831681810361527e5761527e61523f56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a2646970667358221220168c54152bf7de40aa95a3e27ec4e2fa46fcebaad0a66212c9aab7234e8dd4a964736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"baseSettings\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structPoSValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615cb8380380615cb883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b6b8061014d5f395ff3fe608060405260043610610233575f3560e01c80637d8d2f7711610129578063b771b3bc116100a8578063c974d1b61161006d578063c974d1b614610690578063d5f20ff6146106a4578063df93d8de146106d0578063fb8b11dd146106e6578063fd7ac5e714610705575f80fd5b8063b771b3bc14610605578063ba3a4b971461061f578063bc5fbfec1461063e578063bee0a03f1461065e578063c599e24f1461067d575f80fd5b80639ae06447116100ee5780639ae0644714610581578063a3a65e48146105a0578063a9778a7a14610387578063af2f5feb146105bf578063afb98096146105d2575f80fd5b80637d8d2f77146104f157806380dd672f146105105780638280a25a1461052f5780638ef34c981461054357806393e2459814610562575f80fd5b806337b9be8f116101b557806360ad77841161017a57806360ad778414610454578063620658561461047357806366435abf146104a0578063732214f8146104bf57806376f78621146104d2575f80fd5b806337b9be8f146103af5780633a1cfff6146103ce578063467ef06f146103ed5780635dd6a6cb1461040c57806360305d621461042b575f80fd5b806320d91b7a116101fb57806320d91b7a146102e057806325e1c776146102ff5780632e2194d81461031e578063329c3e121461035557806335455ded14610387575f80fd5b80630118acc4146102375780630322ed98146102585780630ba512d114610277578063151d30d1146102965780631ec44724146102c1575b5f80fd5b348015610242575f80fd5b50610256610251366004614b3d565b610724565b005b348015610263575f80fd5b50610256610272366004614b78565b610735565b348015610282575f80fd5b50610256610291366004614b8f565b6109c5565b3480156102a1575f80fd5b506102aa600a81565b60405160ff90911681526020015b60405180910390f35b3480156102cc575f80fd5b506102566102db366004614b3d565b610aa2565b3480156102eb575f80fd5b506102566102fa366004614ba6565b610aae565b34801561030a575f80fd5b50610256610319366004614bf4565b611064565b348015610329575f80fd5b5061033d610338366004614b78565b6110d8565b6040516001600160401b0390911681526020016102b8565b348015610360575f80fd5b5061036f6001600160991b0181565b6040516001600160a01b0390911681526020016102b8565b348015610392575f80fd5b5061039c61271081565b60405161ffff90911681526020016102b8565b3480156103ba575f80fd5b506102566103c9366004614c29565b61112c565b3480156103d9575f80fd5b506102566103e8366004614b3d565b61113f565b3480156103f8575f80fd5b50610256610407366004614c77565b61114b565b348015610417575f80fd5b50610256610426366004614c29565b61121d565b348015610436575f80fd5b5061043f601481565b60405163ffffffff90911681526020016102b8565b34801561045f575f80fd5b5061025661046e366004614bf4565b611229565b34801561047e575f80fd5b5061049261048d366004614ca4565b6114f1565b6040519081526020016102b8565b3480156104ab575f80fd5b5061033d6104ba366004614b78565b611511565b3480156104ca575f80fd5b506104925f81565b3480156104dd575f80fd5b506102566104ec366004614b3d565b611525565b3480156104fc575f80fd5b5061025661050b366004614c29565b611531565b34801561051b575f80fd5b5061025661052a366004614bf4565b61153d565b34801561053a575f80fd5b506102aa603081565b34801561054e575f80fd5b5061025661055d366004614cbf565b611777565b34801561056d575f80fd5b5061025661057c366004614b78565b611828565b34801561058c575f80fd5b5061025661059b366004614c29565b6118bc565b3480156105ab575f80fd5b506102566105ba366004614c77565b6118c8565b6104926105cd366004614cfe565b611abe565b3480156105dd575f80fd5b506104927f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610610575f80fd5b5061036f6005600160991b0181565b34801561062a575f80fd5b50610256610639366004614b78565b611af2565b348015610649575f80fd5b506104925f80516020615ad683398151915281565b348015610669575f80fd5b50610256610678366004614b78565b611d4b565b61049261068b366004614b78565b611e87565b34801561069b575f80fd5b506102aa601481565b3480156106af575f80fd5b506106c36106be366004614b78565b611eb8565b6040516102b89190614dd4565b3480156106db575f80fd5b5061033d6202a30081565b3480156106f1575f80fd5b50610256610700366004614cbf565b612007565b348015610710575f80fd5b5061049261071f366004614e54565b61209e565b6107308383835f6120f9565b505050565b5f8181525f80516020615af68339815191526020526040808220815160e0810190925280545f80516020615ad683398151915293929190829060ff16600581111561078257610782614d5f565b600581111561079357610793614d5f565b81526020016001820180546107a790614ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546107d390614ebf565b801561081e5780601f106107f55761010080835404028352916020019161081e565b820191905f5260205f20905b81548152906001019060200180831161080157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561088957610889614d5f565b146108c5575f8381526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614ef1565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af415801561093c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109639190810190614ffa565b6040518263ffffffff1660e01b815260040161097f919061502b565b6020604051808303815f875af115801561099b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bf919061503d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0e575080546001600160401b03808416911610155b15610a2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5683612125565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6109bf8383835f612136565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615ad68339815191529060ff1615610b0057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b67919061503d565b836020013514610b90576040516372b0a7e760e11b8152602084013560048201526024016108bc565b30610ba16060850160408601615054565b6001600160a01b031614610be457610bbf6060840160408501615054565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016108bc565b5f610bf2606085018561506f565b905090505f805b828163ffffffff161015610e5a575f610c15606088018861506f565b8363ffffffff16818110610c2b57610c2b6150b4565b9050602002810190610c3d91906150c8565b610c4690615133565b80516040519192505f916006880191610c5e916151ae565b90815260200160405180910390205414610c8e57805160405163a41f772f60e01b81526108bc919060040161502b565b5f6002885f013584604051602001610cbd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610cd7916151ae565b602060405180830381855afa158015610cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d15919061503d565b90508086600601835f0151604051610d2d91906151ae565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610d6d9082615203565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610ded90856152d2565b8251604051919550610dfe916151ae565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610e53906152f2565b9050610bf9565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610e9d910460ff1683615314565b6001600160401b03161015610ed057604051633e1a785160e01b81526001600160401b03821660048201526024016108bc565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610ef48761246b565b604001516040518263ffffffff1660e01b8152600401610f14919061502b565b602060405180830381865af4158015610f2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f53919061503d565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610f8d919061546a565b5f60405180830381865af4158015610fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fce9190810190614ffa565b90505f600282604051610fe191906151ae565b602060405180830381855afa158015610ffc573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061101f919061503d565b905082811461104b5760405163baaea89d60e01b815260048101829052602481018490526044016108bc565b5050506007909201805460ff1916600117905550505050565b61106d82612581565b61108d576040516330efa98b60e01b8152600481018390526024016108bc565b5f61109783611eb8565b51905060028160058111156110ae576110ae614d5f565b146110ce578060405163170cc93360e21b81526004016108bc9190614ef1565b6109bf83836125aa565b5f806110e2612849565b600301546110f090846154fe565b905080158061110557506001600160401b0381115b156111265760405163222d164360e21b8152600481018490526024016108bc565b92915050565b61113884848484612136565b5050505050565b6109bf8383835f61286d565b611153612aaa565b5f61115c612849565b90505f8061116984612ae1565b9150915061117682612581565b61118257505050611204565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b039182169116806111c45750805b6004835160058111156111d9576111d9614d5f565b036111e8576111e88185612e99565b6111fe826111f985604001516114f1565b612ec3565b50505050505b61121a60015f80516020615b1683398151915255565b50565b6109bf84848484612ee9565b5f611232612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561126b5761126b614d5f565b600381111561127c5761127c614d5f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6112f282611eb8565b905060018351600381111561130957611309614d5f565b1461132a578251604051633b0d540d60e21b81526108bc919060040161551d565b60048151600581111561133f5761133f614d5f565b036113555761134d86612f15565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f61137a8961246b565b604001516040518263ffffffff1660e01b815260040161139a919061502b565b606060405180830381865af41580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d99190615537565b509150915081841461140657846040015160405163089938b360e11b81526004016108bc91815260200190565b806001600160401b031683606001516001600160401b0316108061143f5750806001600160401b03168560a001516001600160401b0316115b1561146857604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6114fa612849565b60030154611126906001600160401b03841661556c565b5f61151b82611eb8565b6080015192915050565b6107308383835f612ee9565b6111388484848461286d565b611545612aaa565b5f61154e612849565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561158757611587614d5f565b600381111561159857611598614d5f565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561161157611611614d5f565b14611632578051604051633b0d540d60e21b81526108bc919060040161551d565b60046116418260400151611eb8565b51600581111561165357611653614d5f565b14611752575f6116628461246b565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016116a1919061502b565b606060405180830381865af41580156116bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e09190615537565b50915091508184604001511461170c5760405163089938b360e11b8152600481018390526024016108bc565b806001600160401b03168460c001516001600160401b0316111561174e57604051632e19bc2d60e11b81526001600160401b03821660048201526024016108bc565b5050505b61175b84612f15565b505061177360015f80516020615b1683398151915255565b5050565b5f611780612849565b90506001600160a01b0382166117b45760405163caa903f960e01b81526001600160a01b03831660048201526024016108bc565b5f8381526006820160205260409020546001600160a01b031633146117fa57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016108bc565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f611831612849565b90505f61183d83611eb8565b519050600481600581111561185457611854614d5f565b14611874578060405163170cc93360e21b81526004016108bc9190614ef1565b5f8381526006830160205260409020546001600160a01b0316331461189957336117d5565b5f838152600683016020526040902054610730906001600160a01b031684612e99565b6109bf848484846120f9565b5f80516020615ad68339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6118fb8661246b565b604001516040518263ffffffff1660e01b815260040161191b919061502b565b6040805180830381865af4158015611935573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119599190615583565b915091508061197f57604051632d07135360e01b815281151560048201526024016108bc565b5f8281526004840160205260409020805461199990614ebf565b90505f036119bd5760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580860160205260409091205460ff16908111156119e4576119e4614d5f565b14611a17575f8281526005840160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614ef1565b5f8281526004840160205260408120611a2f91614a91565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f611ac7612aaa565b611ad38484843461310f565b9050611aeb60015f80516020615b1683398151915255565b9392505050565b5f611afb612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611b3457611b34614d5f565b6003811115611b4557611b45614d5f565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611bbe57611bbe614d5f565b14158015611bdf5750600381516003811115611bdc57611bdc614d5f565b14155b15611c00578051604051633b0d540d60e21b81526108bc919060040161551d565b5f611c0e8260400151611eb8565b905080606001516001600160401b03165f03611c40576040516339b894f960e21b8152600481018590526024016108bc565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611cae93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611cc8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cef9190810190614ffa565b6040518263ffffffff1660e01b8152600401611d0b919061502b565b6020604051808303815f875af1158015611d27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611138919061503d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615ad68339815191529190611d9290614ebf565b90505f03611db65760405163089938b360e11b8152600481018390526024016108bc565b60015f838152600580840160205260409091205460ff1690811115611ddd57611ddd614d5f565b14611e10575f8281526005820160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614ef1565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611e4792016155a6565b6020604051808303815f875af1158015611e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610730919061503d565b5f611e90612aaa565b611e9b823334613284565b9050611eb360015f80516020615b1683398151915255565b919050565b611ec0614ac8565b5f8281525f80516020615af6833981519152602052604090819020815160e0810190925280545f80516020615ad6833981519152929190829060ff166005811115611f0d57611f0d614d5f565b6005811115611f1e57611f1e614d5f565b8152602001600182018054611f3290614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90614ebf565b8015611fa95780601f10611f8057610100808354040283529160200191611fa9565b820191905f5260205f20905b815481529060010190602001808311611f8c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b0381166120395760405163caa903f960e01b81526001600160a01b03821660048201526024016108bc565b5f612042612849565b5f8481526007820160205260409020549091506001600160a01b0361010090910416331461207057336117d5565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615ad6833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906120e19086908690615630565b90815260200160405180910390205491505092915050565b61210584848484612136565b6109bf57604051631036cf9160e11b8152600481018590526024016108bc565b61212d6134c4565b61121a8161350f565b5f80612140612849565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561217957612179614d5f565b600381111561218a5761218a614d5f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61220082611eb8565b905060028351600381111561221757612217614d5f565b14612238578251604051633b0d540d60e21b81526108bc919060040161551d565b60208301516001600160a01b031633146122d4575f8281526006850160205260409020546001600160a01b0316331461227157336117d5565b5f82815260068501602052604090205460a08201516122a091600160b01b90046001600160401b0316906152d2565b6001600160401b03164210156122d45760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b6002815160058111156122e9576122e9614d5f565b0361240b576002840154608084015161230b916001600160401b0316906152d2565b6001600160401b031642101561233f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b87156123515761234f82886125aa565b505b5f8981526007850160205260409020805460ff191660031790556060830151608082015161238a918491612385919061563f565b613589565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123cd84888c613760565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a3151594506124639350505050565b60048151600581111561242057612420614d5f565b036124475761243083878b613760565b5061243a89612f15565b6001945050505050612463565b805160405163170cc93360e21b81526108bc9190600401614ef1565b949350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124cf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f6919081019061565f565b915091508061251857604051636b2f19e960e01b815260040160405180910390fd5b81511561253e578151604051636ba589a560e01b815260048101919091526024016108bc565b60208201516001600160a01b03161561257a576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5092915050565b5f8061258b612849565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261261c919081019061565f565b915091508061263e57604051636b2f19e960e01b815260040160405180910390fd5b5f612647612849565b6005810154845191925014612675578251604051636ba589a560e01b815260048101919091526024016108bc565b60208301516001600160a01b0316156126b1576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b60208301516001600160a01b0316156126ed576020830151604051624de75d60e31b81526001600160a01b0390911660048201526024016108bc565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b815260040161272a919061502b565b6040805180830381865af4158015612744573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276891906156ef565b9150915081881461278f5760405163089938b360e11b8152600481018990526024016108bc565b5f8881526006840160205260409020600101546001600160401b039081169082161115612820575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261283e565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f80612877612849565b90505f6128838761394e565b905061288e87612581565b61289d57600192505050612463565b5f8781526006830160205260409020546001600160a01b031633146128c257336117d5565b5f87815260068301602052604090205460a08201516128f191600160b01b90046001600160401b0316906152d2565b6001600160401b03168160c001516001600160401b031610156129385760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016108bc565b5f86156129505761294988876125aa565b905061296e565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f90612993906114f1565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156129fc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a20919061503d565b90506001600160a01b038616612a4c575f8981526006850160205260409020546001600160a01b031695505b5f898152600a8501602052604081208054839290612a6b908490615712565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615b16833981519152805460011901612adb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612aea614ac8565b5f80516020615ad68339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612b1d8861246b565b604001516040518263ffffffff1660e01b8152600401612b3d919061502b565b6040805180830381865af4158015612b57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7b9190615583565b915091508015612ba257604051632d07135360e01b815281151560048201526024016108bc565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612bd957612bd9614d5f565b6005811115612bea57612bea614d5f565b8152602001600182018054612bfe90614ebf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2a90614ebf565b8015612c755780601f10612c4c57610100808354040283529160200191612c75565b820191905f5260205f20905b815481529060010190602001808311612c5857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612ce057612ce0614d5f565b14158015612d015750600181516005811115612cfe57612cfe614d5f565b14155b15612d2257805160405163170cc93360e21b81526108bc9190600401614ef1565b600381516005811115612d3757612d37614d5f565b03612d455760048152612d4a565b600581525b836006018160200151604051612d6091906151ae565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612da357612da3614d5f565b021790555060208201516001820190612dbc9082615203565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e6257612e62614d5f565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612ea2612849565b5f838152600a82016020526040812080549190559091506109bf8482613c33565b6117736001600160a01b03831682613c91565b60015f80516020615b1683398151915255565b612ef58484848461286d565b6109bf57604051635bff683f60e11b8152600481018590526024016108bc565b5f612f1e612849565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f5757612f57614d5f565b6003811115612f6857612f68614d5f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091506130057fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b826080015161301491906152d2565b6001600160401b03164210156130485760405163fb6ce63f60e01b81526001600160401b03421660048201526024016108bc565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b0316806130a3575060208201515b5f806130b0838886613d24565b915091506130c985602001516111f987606001516114f1565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f80613119612849565b600281015490915061ffff600160401b90910481169086161080613142575061271061ffff8616115b1561316657604051635f12e6c360e11b815261ffff861660048201526024016108bc565b60028101546001600160401b0390811690851610156131a2576040516202a06d60e11b81526001600160401b03851660048201526024016108bc565b80548310806131b45750806001015483115b156131d55760405163222d164360e21b8152600481018490526024016108bc565b825f6131e0826110d8565b90505f6131ed8983613dd1565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b5f8061328e612849565b90505f61329a846110d8565b90505f6132a687611eb8565b90506132b187612581565b6132d1576040516330efa98b60e01b8152600481018890526024016108bc565b6002815160058111156132e6576132e6614d5f565b1461330757805160405163170cc93360e21b81526108bc9190600401614ef1565b5f82826080015161331891906152d2565b905083600201600a9054906101000a90046001600160401b031682604001516133419190615314565b6001600160401b0316816001600160401b0316111561337e57604051636d51fe0560e11b81526001600160401b03821660048201526024016108bc565b5f8061338a8a84613589565b915091505f8a836040516020016133b892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a49a9950505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661350d57604051631afcd79f60e31b815260040160405180910390fd5b565b6135176134c4565b61352081614343565b61352861435c565b61121a6060820135608083013561354560c0850160a08601614ca4565b61355560e0860160c08701615725565b613566610100870160e0880161573e565b61010087013561357e61014089016101208a01615054565b88610140013561436c565b5f8281525f80516020615af6833981519152602052604081206002015481905f80516020615ad683398151915290600160801b90046001600160401b03166135d18582614551565b5f6135db876147bb565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613684573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526136ab9190810190614ffa565b6040518263ffffffff1660e01b81526004016136c7919061502b565b6020604051808303815f875af11580156136e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613707919061503d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8061376a612849565b90505f61377a8660400151611eb8565b90505f60038251600581111561379257613792614d5f565b14806137b057506004825160058111156137ae576137ae614d5f565b145b156137c0575060c08101516137fd565b6002825160058111156137d5576137d5614d5f565b036137e15750426137fd565b815160405163170cc93360e21b81526108bc9190600401614ef1565b86608001516001600160401b0316816001600160401b031611613825575f9350505050611aeb565b600483015460608801515f916001600160a01b031690634f22429f9061384a906114f1565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156138cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ef919061503d565b90506001600160a01b03871661390757876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b613956614ac8565b5f8281525f80516020615af68339815191526020526040808220815160e0810190925280545f80516020615ad683398151915293929190829060ff1660058111156139a3576139a3614d5f565b60058111156139b4576139b4614d5f565b81526020016001820180546139c890614ebf565b80601f01602080910402602001604051908101604052809291908181526020018280546139f490614ebf565b8015613a3f5780601f10613a1657610100808354040283529160200191613a3f565b820191905f5260205f20905b815481529060010190602001808311613a2257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613aad57613aad614d5f565b14613ae0575f8481526005830160205260409081902054905163170cc93360e21b81526108bc9160ff1690600401614ef1565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff1916906001908490811115613b2557613b25614d5f565b021790555060208201516001820190613b3e9082615203565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613bdc8582613589565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613c7f575f80fd5b505af115801561134d573d5f803e3d5ffd5b80471015613cb45760405163cd78605960e01b81523060048201526024016108bc565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cfd576040519150601f19603f3d011682016040523d82523d5f602084013e613d02565b606091505b505090508061073057604051630a12f52160e11b815260040160405180910390fd5b5f805f613d2f612849565b5f86815260088201602052604081208054908290559192509081908015613dc3575f87815260068501602052604090205461271090613d7990600160a01b900461ffff168361556c565b613d8391906154fe565b91508184600a015f8981526020019081526020015f205f828254613da79190615712565b90915550613db79050828261575e565b9250613dc38984613c33565b509097909650945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613e1557604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ad683398151915242613e346060860160408701614ca4565b6001600160401b0316111580613e6e5750613e526202a30042615712565b613e626060860160408701614ca4565b6001600160401b031610155b15613ea857613e836060850160408601614ca4565b604051635879da1360e11b81526001600160401b0390911660048201526024016108bc565b60038101546001600160401b0390613ecb90600160401b90048216858316615712565b1115613ef557604051633e1a785160e01b81526001600160401b03841660048201526024016108bc565b613f0a613f056060860186615771565b614830565b613f1a613f056080860186615771565b6030613f296020860186615785565b905014613f5b57613f3d6020850185615785565b6040516326475b2f60e11b81526108bc925060040190815260200190565b613f658480615785565b90505f03613f9257613f778480615785565b604051633e08a12560e11b81526004016108bc9291906157c7565b5f60068201613fa18680615785565b604051613faf929190615630565b90815260200160405180910390205414613fe857613fcd8480615785565b60405163a41f772f60e01b81526004016108bc9291906157c7565b613ff2835f614551565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce51906020810161402f8a80615785565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614077908b018b615785565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140c060608b0160408c01614ca4565b6001600160401b031681526020016140db60608b018b615771565b6140e4906157da565b81526020016140f660808b018b615771565b6140ff906157da565b8152602001886001600160401b03168152506040518263ffffffff1660e01b815260040161412d9190615907565b5f60405180830381865af4158015614147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261416e91908101906159be565b5f8281526004860160205260409020919350915061418c8282615203565b50816006840161419c8880615785565b6040516141aa929190615630565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141e690859060040161502b565b6020604051808303815f875af1158015614202573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614226919061503d565b5f8481526005860160205260409020805460ff19166001179055905061424c8780615785565b5f85815260058701602052604090206001019161426a919083615a01565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff19169055806142c98880615785565b6040516142d7929190615630565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b60400160208101906143159190614ca4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61434b6134c4565b614353614999565b61121a816149a1565b6143646134c4565b61350d614a89565b6143746134c4565b5f61437d612849565b905061ffff86161580614395575061271061ffff8716115b156143b957604051635f12e6c360e11b815261ffff871660048201526024016108bc565b878911156143dd5760405163222d164360e21b8152600481018a90526024016108bc565b60ff851615806143f05750600a60ff8616115b156144135760405163170db35960e31b815260ff861660048201526024016108bc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316876001600160401b0316101561447a576040516202a06d60e11b81526001600160401b03881660048201526024016108bc565b835f0361449a5760405163a733007160e01b815260040160405180910390fd5b816144bb57604051632f6bd1db60e01b8152600481018390526024016108bc565b97885560018801969096556002870180546001600160401b039690961669ffffffffffffffffffff1990961695909517600160401b61ffff95909516949094029390931767ffffffffffffffff60501b191660ff92909216600160501b029190911790925560038401919091556004830180546001600160a01b0319166001600160a01b03909216919091179055600590910155565b5f80516020615ad68339815191525f6001600160401b0380841690851611156145855761457e838561563f565b9050614592565b61458f848461563f565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806145ff5750600184015481516145fb916001600160401b031690615712565b8210155b15614627576001600160401b0380841660608301528282526040820151166020820152614646565b828160600181815161463991906152d2565b6001600160401b03169052505b6060810151614656906064615314565b602082015160018601546001600160401b0392909216916146819190600160401b900460ff16615314565b6001600160401b031610156146ba57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016108bc565b85816040018181516146cc91906152d2565b6001600160401b03169052506040810180518691906146ec90839061563f565b6001600160401b03169052506001840154604082015160649161471a91600160401b90910460ff1690615314565b6001600160401b03161015614753576040808201519051633e1a785160e01b81526001600160401b0390911660048201526024016108bc565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615af68339815191526020526040812060020180545f80516020615ad6833981519152919060089061480590600160401b90046001600160401b0316615aba565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61483d6020820182614c77565b63ffffffff1615801561485d5750614858602082018261506f565b151590505b156148a45761486f6020820182614c77565b61487c602083018361506f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016108bc565b6148b1602082018261506f565b90506148c06020830183614c77565b63ffffffff1611156148d95761486f6020820182614c77565b60015b6148e9602083018361506f565b9050811015611773576148ff602083018361506f565b61490a60018461575e565b818110614919576149196150b4565b905060200201602081019061492e9190615054565b6001600160a01b0316614944602084018461506f565b83818110614954576149546150b4565b90506020020160208101906149699190615054565b6001600160a01b0316101561499157604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148dc565b61350d6134c4565b6149a96134c4565b80355f80516020615ad683398151915290815560146149ce606084016040850161573e565b60ff1611806149ed57506149e8606083016040840161573e565b60ff16155b15614a2157614a02606083016040840161573e565b604051634a59bbff60e11b815260ff90911660048201526024016108bc565b614a31606083016040840161573e565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a626040830160208401614ca4565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ed66134c4565b508054614a9d90614ebf565b5f825580601f10614aac575050565b601f0160209004905f5260205f209081019061121a9190614b05565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614b19575f8155600101614b06565b5090565b801515811461121a575f80fd5b803563ffffffff81168114611eb3575f80fd5b5f805f60608486031215614b4f575f80fd5b833592506020840135614b6181614b1d565b9150614b6f60408501614b2a565b90509250925092565b5f60208284031215614b88575f80fd5b5035919050565b5f6101608284031215614ba0575f80fd5b50919050565b5f8060408385031215614bb7575f80fd5b82356001600160401b03811115614bcc575f80fd5b830160808186031215614bdd575f80fd5b9150614beb60208401614b2a565b90509250929050565b5f8060408385031215614c05575f80fd5b82359150614beb60208401614b2a565b6001600160a01b038116811461121a575f80fd5b5f805f8060808587031215614c3c575f80fd5b843593506020850135614c4e81614b1d565b9250614c5c60408601614b2a565b91506060850135614c6c81614c15565b939692955090935050565b5f60208284031215614c87575f80fd5b611aeb82614b2a565b6001600160401b038116811461121a575f80fd5b5f60208284031215614cb4575f80fd5b8135611aeb81614c90565b5f8060408385031215614cd0575f80fd5b823591506020830135614ce281614c15565b809150509250929050565b803561ffff81168114611eb3575f80fd5b5f805f60608486031215614d10575f80fd5b83356001600160401b03811115614d25575f80fd5b840160a08187031215614d36575f80fd5b9250614d4460208501614ced565b91506040840135614d5481614c90565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60068110614d8357614d83614d5f565b9052565b5f5b83811015614da1578181015183820152602001614d89565b50505f910152565b5f8151808452614dc0816020860160208601614d87565b601f01601f19169290920160200192915050565b60208152614de6602082018351614d73565b5f602083015160e06040840152614e01610100840182614da9565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e65575f80fd5b82356001600160401b0380821115614e7b575f80fd5b818501915085601f830112614e8e575f80fd5b813581811115614e9c575f80fd5b866020828501011115614ead575f80fd5b60209290920196919550909350505050565b600181811c90821680614ed357607f821691505b602082108103614ba057634e487b7160e01b5f52602260045260245ffd5b602081016111268284614d73565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f3557614f35614eff565b60405290565b604080519081016001600160401b0381118282101715614f3557614f35614eff565b604051601f8201601f191681016001600160401b0381118282101715614f8557614f85614eff565b604052919050565b5f6001600160401b03821115614fa557614fa5614eff565b50601f01601f191660200190565b5f82601f830112614fc2575f80fd5b8151614fd5614fd082614f8d565b614f5d565b818152846020838601011115614fe9575f80fd5b612463826020830160208701614d87565b5f6020828403121561500a575f80fd5b81516001600160401b0381111561501f575f80fd5b61246384828501614fb3565b602081525f611aeb6020830184614da9565b5f6020828403121561504d575f80fd5b5051919050565b5f60208284031215615064575f80fd5b8135611aeb81614c15565b5f808335601e19843603018112615084575f80fd5b8301803591506001600160401b0382111561509d575f80fd5b6020019150600581901b3603821315613759575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150dc575f80fd5b9190910192915050565b5f82601f8301126150f5575f80fd5b8135615103614fd082614f8d565b818152846020838601011115615117575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615143575f80fd5b61514b614f13565b82356001600160401b0380821115615161575f80fd5b61516d368387016150e6565b83526020850135915080821115615182575f80fd5b5061518f368286016150e6565b60208301525060408301356151a381614c90565b604082015292915050565b5f82516150dc818460208701614d87565b601f82111561073057805f5260205f20601f840160051c810160208510156151e45750805b601f840160051c820191505b81811015611138575f81556001016151f0565b81516001600160401b0381111561521c5761521c614eff565b6152308161522a8454614ebf565b846151bf565b602080601f831160018114615263575f841561524c5750858301515b5f19600386901b1c1916600185901b17855561134d565b5f85815260208120601f198616915b8281101561529157888601518255948401946001909101908401615272565b50858210156152ae57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561257a5761257a6152be565b5f63ffffffff80831681810361530a5761530a6152be565b6001019392505050565b6001600160401b03818116838216028082169190828114615337576153376152be565b505092915050565b5f808335601e19843603018112615354575f80fd5b83016020810192503590506001600160401b03811115615372575f80fd5b803603821315613759575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561545d57848303601f19018952813536889003605e190181126153e4575f80fd5b870160606153f2828061533f565b8287526154028388018284615380565b925050506154128683018361533f565b86830388880152615424838284615380565b92505050604080830135925061543983614c90565b6001600160401b0392909216949091019390935297830197908301906001016153bf565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561548e81614c15565b6001600160a01b031660608381019190915283013536849003601e190181126154b5575f80fd5b83016020810190356001600160401b038111156154d0575f80fd5b8060051b36038213156154e1575f80fd5b6080808501526154f560a0850182846153a8565b95945050505050565b5f8261551857634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061553157615531614d5f565b91905290565b5f805f60608486031215615549575f80fd5b83519250602084015161555b81614c90565b6040850151909250614d5481614c90565b8082028115828204841417611126576111266152be565b5f8060408385031215615594575f80fd5b825191506020830151614ce281614b1d565b5f60208083525f84546155b881614ebf565b806020870152604060018084165f81146155d957600181146155f557615622565b60ff19851660408a0152604084151560051b8a01019550615622565b895f5260205f205f5b858110156156195781548b82018601529083019088016155fe565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0382811682821603908082111561257a5761257a6152be565b5f8060408385031215615670575f80fd5b82516001600160401b0380821115615686575f80fd5b9084019060608287031215615699575f80fd5b6156a1614f13565b8251815260208301516156b381614c15565b60208201526040830151828111156156c9575f80fd5b6156d588828601614fb3565b6040830152508094505050506020830151614ce281614b1d565b5f8060408385031215615700575f80fd5b825191506020830151614ce281614c90565b80820180821115611126576111266152be565b5f60208284031215615735575f80fd5b611aeb82614ced565b5f6020828403121561574e575f80fd5b813560ff81168114611aeb575f80fd5b81810381811115611126576111266152be565b5f8235603e198336030181126150dc575f80fd5b5f808335601e1984360301811261579a575f80fd5b8301803591506001600160401b038211156157b3575f80fd5b602001915036819003821315613759575f80fd5b602081525f612463602083018486615380565b5f604082360312156157ea575f80fd5b6157f2614f3b565b6157fb83614b2a565b81526020808401356001600160401b0380821115615817575f80fd5b9085019036601f830112615829575f80fd5b81358181111561583b5761583b614eff565b8060051b915061584c848301614f5d565b8181529183018401918481019036841115615865575f80fd5b938501935b8385101561588f578435925061587f83614c15565b828252938501939085019061586a565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156158fc5784516001600160a01b031682529383019360019290920191908301906158d3565b509695505050505050565b60208152815160208201525f602083015160e0604084015261592d610100840182614da9565b90506040840151601f198085840301606086015261594b8383614da9565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261597b83836158a1565b925060a08601519150808584030160c08601525061599982826158a1565b91505060c08401516159b660e08501826001600160401b03169052565b509392505050565b5f80604083850312156159cf575f80fd5b8251915060208301516001600160401b038111156159eb575f80fd5b6159f785828601614fb3565b9150509250929050565b6001600160401b03831115615a1857615a18614eff565b615a2c83615a268354614ebf565b836151bf565b5f601f841160018114615a5d575f8515615a465750838201355b5f19600387901b1c1916600186901b178355611138565b5f83815260208120601f198716915b82811015615a8c5786850135825560209485019460019092019101615a6c565b5086821015615aa8575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6001600160401b0380831681810361530a5761530a6152be56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212207abc1fd5ec71e5e5002fead0dcf876c17db7759874221198252a60249c9743a164736f6c63430008190033", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1986,13 +1986,13 @@ func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() erro type NativeTokenStakingManagerInitialValidatorCreated struct { ValidationID [32]byte NodeID common.Hash - Weight *big.Int + Weight uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} @@ -2011,9 +2011,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterIniti return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2057,9 +2057,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitia }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { event := new(NativeTokenStakingManagerInitialValidatorCreated) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -2420,14 +2420,14 @@ type NativeTokenStakingManagerValidationPeriodCreated struct { ValidationID [32]byte NodeID common.Hash RegisterValidationMessageID [32]byte - Weight *big.Int + Weight uint64 RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} @@ -2450,9 +2450,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid return &NativeTokenStakingManagerValidationPeriodCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2500,9 +2500,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*NativeTokenStakingManagerValidationPeriodCreated, error) { event := new(NativeTokenStakingManagerValidationPeriodCreated) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { @@ -2735,14 +2735,14 @@ func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Close() e // NativeTokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidationPeriodRegistered struct { ValidationID [32]byte - Weight *big.Int + Weight uint64 Timestamp *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodRegisteredIterator, error) { var validationIDRule []interface{} @@ -2757,9 +2757,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid return &NativeTokenStakingManagerValidationPeriodRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil } -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2799,9 +2799,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*NativeTokenStakingManagerValidationPeriodRegistered, error) { event := new(NativeTokenStakingManagerValidationPeriodRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { @@ -2882,14 +2882,14 @@ func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Close() type NativeTokenStakingManagerValidatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Weight *big.Int + Weight uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -2908,9 +2908,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid return &NativeTokenStakingManagerValidatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -2954,9 +2954,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerValidatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { @@ -3037,14 +3037,14 @@ func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Close() error type NativeTokenStakingManagerValidatorWeightUpdate struct { ValidationID [32]byte Nonce uint64 - ValidatorWeight uint64 + Weight uint64 SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } // FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerValidatorWeightUpdateIterator, error) { var validationIDRule []interface{} @@ -3065,7 +3065,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid // WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} @@ -3111,7 +3111,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida // ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*NativeTokenStakingManagerValidatorWeightUpdate, error) { event := new(NativeTokenStakingManagerValidatorWeightUpdate) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { @@ -3124,7 +3124,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x612160610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c3366004611904565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f0366004611904565b61044a565b604080519283526001600160401b039091166020830152016100d9565b610125610120366004611904565b61063b565b6040519081526020016100d9565b610146610141366004611904565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a561017936600461193d565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d991906119a1565b6101a56101c03660046119d5565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d366004611a0e565b610a1e565b610235610230366004611904565b610bff565b6040516100d99190611aaa565b6101a5610250366004611b61565b61154a565b6101a5610263366004611b93565b61158e565b61027b610276366004611ca1565b6115c4565b6040516100d9929190611d9d565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611dc9565b6102e6906008611ddc565b61ffff168582815181106102fc576102fc611df3565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611dc9565b61035f906008611ddc565b63ffffffff1686610371836002611e07565b8151811061038157610381611df3565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611dc9565b6103e2906008611ddc565b876103ee836006611e07565b815181106103fe576103fe611df3565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611df3565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611dc9565b6104a2906008611ddc565b61ffff168582815181106104b8576104b8611df3565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611dc9565b61051b906008611ddc565b63ffffffff168661052d836002611e07565b8151811061053d5761053d611df3565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611dc9565b61059c906008611ddc565b876105a8836006611e07565b815181106105b8576105b8611df3565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611dc9565b6105f2906008611ddc565b6001600160401b031688610607836026611e07565b8151811061061757610617611df3565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611dc9565b610692906008611ddc565b61ffff168482815181106106a8576106a8611df3565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611dc9565b61070b906008611ddc565b63ffffffff168561071d836002611e07565b8151811061072d5761072d611df3565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611dc9565b61078c906008611ddc565b86610798836006611e07565b815181106107a8576107a8611df3565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611dc9565b610821906008611ddc565b61ffff1686828151811061083757610837611df3565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611dc9565b61089a906008611ddc565b63ffffffff16876108ac836002611e07565b815181106108bc576108bc611df3565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611dc9565b61091d906008611ddc565b88610929836006611e07565b8151811061093957610939611df3565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611dc9565b610973906008611ddc565b6001600160401b031689610988836026611e07565b8151811061099857610998611df3565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611dc9565b6109d2906008611ddc565b6001600160401b03168a6109e783602e611e07565b815181106109f7576109f7611df3565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b60605f80833560208501356014610a3a87870160408901611e1a565b610a476060890189611e33565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b610acd6060850185611e33565b9050811015610bf85781610ae46060860186611e33565b83818110610af457610af4611df3565b9050602002810190610b069190611e7f565b610b109080611e9d565b9050610b1f6060870187611e33565b84818110610b2f57610b2f611df3565b9050602002810190610b419190611e7f565b610b4b9080611e9d565b610b586060890189611e33565b86818110610b6857610b68611df3565b9050602002810190610b7a9190611e7f565b610b88906020810190611e9d565b610b9560608b018b611e33565b88818110610ba557610ba5611df3565b9050602002810190610bb79190611e7f565b610bc8906060810190604001611edf565b604051602001610bde9796959493929190611ef8565b60408051601f198184030181529190529150600101610ac0565b5092915050565b610c076117b1565b5f610c106117b1565b5f805b6002811015610c6e57610c27816001611dc9565b610c32906008611ddc565b61ffff1686610c4763ffffffff871684611e07565b81518110610c5757610c57611df3565b016020015160f81c901b9190911790600101610c13565b5061ffff811615610c985760405163407b587360e01b815261ffff821660048201526024016102bb565b610ca3600284611f61565b9250505f805b6004811015610d0857610cbd816003611dc9565b610cc8906008611ddc565b63ffffffff16868563ffffffff1683610ce19190611e07565b81518110610cf157610cf1611df3565b016020015160f81c901b9190911790600101610ca9565b5063ffffffff8116600114610d3057604051635b60892f60e01b815260040160405180910390fd5b610d3b600484611f61565b9250505f805b6020811015610d9857610d5581601f611dc9565b610d60906008611ddc565b86610d7163ffffffff871684611e07565b81518110610d8157610d81611df3565b016020015160f81c901b9190911790600101610d41565b50808252610da7602084611f61565b9250505f805b6004811015610e0c57610dc1816003611dc9565b610dcc906008611ddc565b63ffffffff16868563ffffffff1683610de59190611e07565b81518110610df557610df5611df3565b016020015160f81c901b9190911790600101610dad565b50610e18600484611f61565b92505f8163ffffffff166001600160401b03811115610e3957610e3961180b565b6040519080825280601f01601f191660200182016040528015610e63576020820181803683370190505b5090505f5b8263ffffffff16811015610ed25786610e8763ffffffff871683611e07565b81518110610e9757610e97611df3565b602001015160f81c60f81b828281518110610eb457610eb4611df3565b60200101906001600160f81b03191690815f1a905350600101610e68565b5060208301819052610ee48285611f61565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610f705786610f2563ffffffff871683611e07565b81518110610f3557610f35611df3565b602001015160f81c60f81b828281518110610f5257610f52611df3565b60200101906001600160f81b03191690815f1a905350600101610f0b565b5060408301819052610f83603085611f61565b9350505f805b6008811015610fe957610f9d816007611dc9565b610fa8906008611ddc565b6001600160401b031687610fc263ffffffff881684611e07565b81518110610fd257610fd2611df3565b016020015160f81c901b9190911790600101610f89565b506001600160401b0381166060840152611004600885611f61565b9350505f805f5b600481101561106a5761101f816003611dc9565b61102a906008611ddc565b63ffffffff16888763ffffffff16836110439190611e07565b8151811061105357611053611df3565b016020015160f81c901b919091179060010161100b565b50611076600486611f61565b94505f5b60048110156110d95761108e816003611dc9565b611099906008611ddc565b63ffffffff16888763ffffffff16836110b29190611e07565b815181106110c2576110c2611df3565b016020015160f81c901b929092179160010161107a565b506110e5600486611f61565b94505f8263ffffffff166001600160401b038111156111065761110661180b565b60405190808252806020026020018201604052801561112f578160200160208202803683370190505b5090505f5b8363ffffffff16811015611217576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156111c9578a61117e63ffffffff8b1683611e07565b8151811061118e5761118e611df3565b602001015160f81c60f81b8282815181106111ab576111ab611df3565b60200101906001600160f81b03191690815f1a905350600101611164565b505f60148201519050808484815181106111e5576111e5611df3565b6001600160a01b039092166020928302919091019091015261120860148a611f61565b98505050806001019050611134565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156112995761124e816003611dc9565b611259906008611ddc565b63ffffffff16898863ffffffff16836112729190611e07565b8151811061128257611282611df3565b016020015160f81c901b919091179060010161123a565b506112a5600487611f61565b95505f5b6004811015611308576112bd816003611dc9565b6112c8906008611ddc565b63ffffffff16898863ffffffff16836112e19190611e07565b815181106112f1576112f1611df3565b016020015160f81c901b92909217916001016112a9565b50611314600487611f61565b95505f8263ffffffff166001600160401b038111156113355761133561180b565b60405190808252806020026020018201604052801561135e578160200160208202803683370190505b5090505f5b8363ffffffff16811015611446576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156113f8578b6113ad63ffffffff8c1683611e07565b815181106113bd576113bd611df3565b602001015160f81c60f81b8282815181106113da576113da611df3565b60200101906001600160f81b03191690815f1a905350600101611393565b505f601482015190508084848151811061141457611414611df3565b6001600160a01b039092166020928302919091019091015261143760148b611f61565b99505050806001019050611363565b506040805180820190915263ffffffff9092168252602082015260a08501525f6114708284611f61565b61147b906014611f7e565b61148685607a611f61565b6114909190611f61565b90508063ffffffff168851146114cc57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561152f576114e3816007611dc9565b6114ee906008611ddc565b6001600160401b03168a61150863ffffffff8b1684611e07565b8151811061151857611518611df3565b016020015160f81c901b91909117906001016114cf565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e01611576565b5f60608260400151516030146115ed5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861162e988a986001989297929690959094909390929101611fa6565b60405160208183030381529060405290505f5b846080015160200151518110156116a05781856080015160200151828151811061166d5761166d611df3565b6020026020010151604051602001611686929190612060565b60408051601f198184030181529190529150600101611641565b5060a08401518051602091820151516040516116c0938593929101612096565b60405160208183030381529060405290505f5b8460a00151602001515181101561173257818560a001516020015182815181106116ff576116ff611df3565b6020026020010151604051602001611718929190612060565b60408051601f1981840301815291905291506001016116d3565b5060c08401516040516117499183916020016120d1565b604051602081830303815290604052905060028160405161176a9190612102565b602060405180830381855afa158015611785573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117a89190612113565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156118415761184161180b565b60405290565b60405160e081016001600160401b03811182821017156118415761184161180b565b604051601f8201601f191681016001600160401b03811182821017156118915761189161180b565b604052919050565b5f82601f8301126118a8575f80fd5b81356001600160401b038111156118c1576118c161180b565b6118d4601f8201601f1916602001611869565b8181528460208386010111156118e8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611914575f80fd5b81356001600160401b03811115611929575f80fd5b61193584828501611899565b949350505050565b5f6020828403121561194d575f80fd5b5035919050565b5f5b8381101561196e578181015183820152602001611956565b50505f910152565b5f815180845261198d816020860160208601611954565b601f01601f19169290920160200192915050565b602081525f6119b36020830184611976565b9392505050565b80356001600160401b03811681146119d0575f80fd5b919050565b5f805f606084860312156119e7575f80fd5b833592506119f7602085016119ba565b9150611a05604085016119ba565b90509250925092565b5f60208284031215611a1e575f80fd5b81356001600160401b03811115611a33575f80fd5b8201608081850312156119b3575f80fd5b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611a9f5784516001600160a01b03168252938301936001929092019190830190611a76565b509695505050505050565b60208152815160208201525f602083015160e06040840152611ad0610100840182611976565b90506040840151601f1980858403016060860152611aee8383611976565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611b1e8383611a44565b925060a08601519150808584030160c086015250611b3c8282611a44565b91505060c0840151611b5960e08501826001600160401b03169052565b509392505050565b5f8060408385031215611b72575f80fd5b8235915060208301358015158114611b88575f80fd5b809150509250929050565b5f8060408385031215611ba4575f80fd5b82359150611bb4602084016119ba565b90509250929050565b80356001600160a01b03811681146119d0575f80fd5b5f60408284031215611be3575f80fd5b611beb61181f565b9050813563ffffffff81168114611c00575f80fd5b81526020828101356001600160401b0380821115611c1c575f80fd5b818501915085601f830112611c2f575f80fd5b813581811115611c4157611c4161180b565b8060051b9150611c52848301611869565b8181529183018401918481019088841115611c6b575f80fd5b938501935b83851015611c9057611c8185611bbd565b82529385019390850190611c70565b808688015250505050505092915050565b5f60208284031215611cb1575f80fd5b81356001600160401b0380821115611cc7575f80fd5b9083019060e08286031215611cda575f80fd5b611ce2611847565b82358152602083013582811115611cf7575f80fd5b611d0387828601611899565b602083015250604083013582811115611d1a575f80fd5b611d2687828601611899565b604083015250611d38606084016119ba565b6060820152608083013582811115611d4e575f80fd5b611d5a87828601611bd3565b60808301525060a083013582811115611d71575f80fd5b611d7d87828601611bd3565b60a083015250611d8f60c084016119ba565b60c082015295945050505050565b828152604060208201525f6119356040830184611976565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561158857611588611db5565b808202811582820484141761158857611588611db5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561158857611588611db5565b5f60208284031215611e2a575f80fd5b6119b382611bbd565b5f808335601e19843603018112611e48575f80fd5b8301803591506001600160401b03821115611e61575f80fd5b6020019150600581901b3603821315611e78575f80fd5b9250929050565b5f8235605e19833603018112611e93575f80fd5b9190910192915050565b5f808335601e19843603018112611eb2575f80fd5b8301803591506001600160401b03821115611ecb575f80fd5b602001915036819003821315611e78575f80fd5b5f60208284031215611eef575f80fd5b6119b3826119ba565b5f8851611f09818460208d01611954565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b63ffffffff818116838216019080821115610bf857610bf8611db5565b63ffffffff818116838216028082169190828114611f9e57611f9e611db5565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611fec81602a850160208b01611954565b86519083019061200381602a840160208b01611954565b60c087901b6001600160c01b031916602a9290910191820152612035603282018660e01b6001600160e01b0319169052565b61204e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351612071818460208801611954565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120a7818460208901611954565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120e2818460208801611954565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f8251611e93818460208701611954565b5f60208284031215612123575f80fd5b505191905056fea264697066735822122011621dfb91ec33af686b7db0125d7be205eba3545324b3431097bb320ce72c5764736f6c63430008190033", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea2646970667358221220c86fc0fb87c524ec5b0c98159450f3ea9dc01af042aec5aff977246d615450e664736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index c0f3e185a..f1c4a7cf3 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"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\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"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\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161374f38038061374f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136028061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b61014961014436600461273a565b610312565b005b610149610159366004612769565b6105a2565b61014961016c3660046127b7565b610b27565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a136600461273a565b610b35565b6040516001600160401b03909116815260200161018a565b610149610b49565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b61014961024736600461273a565b610b5c565b6101cd61025a3660046127e6565b610b71565b61014961026d3660046127b7565b610b8d565b6102216005600160991b0181565b6101cd5f8051602061358d83398151915281565b6101496102a236600461273a565b610d82565b6101e3601481565b6101496102bd36600461283f565b610ebf565b6102d56102d036600461273a565b610fcd565b60405161018a91906128fc565b6101a66202a30081565b6101496102fa36600461297c565b61111c565b6101cd61030d36600461299e565b611159565b5f8181525f805160206135ad8339815191526020526040808220815160e0810190925280545f8051602061358d83398151915293929190829060ff16600581111561035f5761035f61287b565b60058111156103705761037061287b565b815260200160018201805461038490612a09565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612a09565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156104665761046661287b565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612a41565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610519573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105409190810190612b52565b6040518263ffffffff1660e01b815260040161055c9190612b83565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190612b95565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061358d8339815191529060ff16156105f457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065b9190612b95565b836020013514610684576040516372b0a7e760e11b815260208401356004820152602401610499565b30610695606085016040860161297c565b6001600160a01b0316146106d8576106b3606084016040850161297c565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f6106e66060850185612bac565b905090505f805b828163ffffffff16101561094d575f6107096060880188612bac565b8363ffffffff1681811061071f5761071f612bf1565b90506020028101906107319190612c05565b61073a90612c70565b80516040519192505f91600888019161075291612ce9565b9081526020016040518091039020541461078257805160405163a41f772f60e01b81526104999190600401612b83565b5f6002885f0135846040516020016107b192919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107cb91612ce9565b602060405180830381855afa1580156107e6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108099190612b95565b90508086600801835f01516040516108219190612ce9565b90815260408051918290036020908101909220929092555f8381526007890190915220805460ff1916600217815582516001909101906108619082612d45565b50604080830180515f84815260078a01602052929092206002810180549251426001600160401b03908116600160c01b026001600160c01b03928216600160801b81026001600160c01b03199097169290971691909117949094171692909217909155600301805467ffffffffffffffff191690556108e09085612e18565b82516040519195506108f191612ce9565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094690612e2b565b90506106ed565b5060048301819055600183015460649061097190600160401b900460ff1683612e4d565b101561099357604051635943317f60e01b815260048101829052602401610499565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d8478846109b7876111b4565b604001516040518263ffffffff1660e01b81526004016109d79190612b83565b602060405180830381865af41580156109f2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a169190612b95565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610a509190612f87565b5f60405180830381865af4158015610a6a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a919190810190612b52565b90505f600282604051610aa49190612ce9565b602060405180830381855afa158015610abf573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ae29190612b95565b9050828114610b0e5760405163baaea89d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610b30816112ca565b505050565b5f610b3f82610fcd565b6080015192915050565b610b5161167d565b610b5a5f6116d8565b565b610b6461167d565b610b6d81611748565b5050565b5f610b7a61167d565b610b848383611a2c565b90505b92915050565b5f8051602061358d8339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f610bc0866111b4565b604001516040518263ffffffff1660e01b8152600401610be09190612b83565b6040805180830381865af4158015610bfa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1e919061302a565b9150915080610c4457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610c5e90612a09565b90505f03610c825760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610ca857610ca861287b565b14610cdb575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612a41565b5f8281526006840160205260408120610cf3916126ae565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061358d8339815191529190610dc990612a09565b90505f03610ded5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610e1357610e1361287b565b14610e46575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612a41565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e7f919060040161304b565b6020604051808303815f875af1158015610e9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b309190612b95565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f035750825b90505f826001600160401b03166001148015610f1e5750303b155b905081158015610f2c575080155b15610f4a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f7457845460ff60401b1916600160401b1785555b610f7e8787611f51565b8315610fc457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610fd56126e5565b5f8281525f805160206135ad833981519152602052604090819020815160e0810190925280545f8051602061358d833981519152929190829060ff1660058111156110225761102261287b565b60058111156110335761103361287b565b815260200160018201805461104790612a09565b80601f016020809104026020016040519081016040528092919081815260200182805461107390612a09565b80156110be5780601f10611095576101008083540402835291602001916110be565b820191905f5260205f20905b8154815290600101906020018083116110a157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b61112461167d565b6001600160a01b03811661114d57604051631e4fbdf760e01b81525f6004820152602401610499565b611156816116d8565b50565b6040515f905f8051602061358d833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061119c90869086906130d5565b90815260200160405180910390205491505092915050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611218573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261123f91908101906130e4565b915091508061126157604051636b2f19e960e01b815260040160405180910390fd5b815115611287578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156112c3576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f6112d36126e5565b5f8051602061358d8339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f611306886111b4565b604001516040518263ffffffff1660e01b81526004016113269190612b83565b6040805180830381865af4158015611340573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611364919061302a565b91509150801561138b57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156113bc576113bc61287b565b60058111156113cd576113cd61287b565b81526020016001820180546113e190612a09565b80601f016020809104026020016040519081016040528092919081815260200182805461140d90612a09565b80156114585780601f1061142f57610100808354040283529160200191611458565b820191905f5260205f20905b81548152906001019060200180831161143b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156114c3576114c361287b565b141580156114e457506001815160058111156114e1576114e161287b565b14155b1561150557805160405163170cc93360e21b81526104999190600401612a41565b60038151600581111561151a5761151a61287b565b03611528576004815261152d565b600581525b8360080181602001516040516115439190612ce9565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156115875761158761287b565b0217905550602082015160018201906115a09082612d45565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156116465761164661287b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336116af7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b5a5760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6117506126e5565b5f8281525f805160206135ad8339815191526020526040808220815160e0810190925280545f8051602061358d83398151915293929190829060ff16600581111561179d5761179d61287b565b60058111156117ae576117ae61287b565b81526020016001820180546117c290612a09565b80601f01602080910402602001604051908101604052809291908181526020018280546117ee90612a09565b80156118395780601f1061181057610100808354040283529160200191611839565b820191905f5260205f20905b81548152906001019060200180831161181c57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156118a7576118a761287b565b146118da575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612a41565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561191e5761191e61287b565b0217905550602082015160018201906119379082612d45565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6119d58582611f6b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a7057604051637fab81e560e01b815260040160405180910390fd5b5f8051602061358d83398151915242611a8f6060860160408701613171565b6001600160401b0316111580611ac95750611aad6202a30042612e18565b611abd6060860160408701613171565b6001600160401b031610155b15611b0357611ade6060850160408601613171565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611b18611b13606086018661318a565b612142565b611b28611b13608086018661318a565b6030611b37602086018661319e565b905014611b6957611b4b602085018561319e565b6040516326475b2f60e11b8152610499925060040190815260200190565b611b73848061319e565b90505f03611ba057611b85848061319e565b604051633e08a12560e11b81526004016104999291906131e0565b5f60088201611baf868061319e565b604051611bbd9291906130d5565b90815260200160405180910390205414611bf657611bdb848061319e565b60405163a41f772f60e01b81526004016104999291906131e0565b611c00835f6122ab565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101611c3d8a8061319e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611c85908b018b61319e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611cce60608b0160408c01613171565b6001600160401b03168152602001611ce960608b018b61318a565b611cf2906131f3565b8152602001611d0460808b018b61318a565b611d0d906131f3565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401611d3b9190613320565b5f60405180830381865af4158015611d55573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d7c91908101906133d7565b5f82815260068601602052604090209193509150611d9a8282612d45565b508160088401611daa888061319e565b604051611db89291906130d5565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611df4908590600401612b83565b6020604051808303815f875af1158015611e10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e349190612b95565b5f8481526007860160205260409020805460ff191660011790559050611e5a878061319e565b5f858152600787016020526040902060010191611e7891908361341a565b505f83815260078501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580611ed7888061319e565b604051611ee59291906130d5565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190611f239190613171565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f596124ce565b611f6282612517565b610b6d81612530565b5f8281525f805160206135ad833981519152602052604081206002015481905f8051602061358d83398151915290600160801b90046001600160401b0316611fb385826122ab565b5f611fbd87612541565b5f888152600785016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190612b52565b6040518263ffffffff1660e01b81526004016120a99190612b83565b6020604051808303815f875af11580156120c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e99190612b95565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b61214f60208201826127b7565b63ffffffff1615801561216f575061216a6020820182612bac565b151590505b156121b65761218160208201826127b7565b61218e6020830183612bac565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6121c36020820182612bac565b90506121d260208301836127b7565b63ffffffff1611156121eb5761218160208201826127b7565b60015b6121fb6020830183612bac565b9050811015610b6d576122116020830183612bac565b61221c6001846134d3565b81811061222b5761222b612bf1565b9050602002016020810190612240919061297c565b6001600160a01b03166122566020840184612bac565b8381811061226657612266612bf1565b905060200201602081019061227b919061297c565b6001600160a01b031610156122a357604051630dbc8d5f60e31b815260040160405180910390fd5b6001016121ee565b5f8051602061358d8339815191525f6001600160401b0380841690851611156122df576122d883856134e6565b90506122ec565b6122e984846134e6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061234e57506001840154815161234a916001600160401b031690612e18565b8210155b15612374576001600160401b038316606082015281815260408101516020820152612393565b82816060018181516123869190613506565b6001600160401b03169052505b60608101516123a3906064613526565b602082015160018601546001600160401b0392909216916123ce9190600160401b900460ff16612e4d565b10156123fe57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516124199190612e18565b9052506040810180516001600160401b03871691906124399083906134d3565b9052506001840154604082015160649161245e91600160401b90910460ff1690612e4d565b1015612485578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b5a57604051631afcd79f60e31b815260040160405180910390fd5b61251f6124ce565b6125276125b6565b611156816125be565b6125386124ce565b611156816126a6565b5f8181525f805160206135ad8339815191526020526040812060020180545f8051602061358d833981519152919060089061258b90600160401b90046001600160401b0316613551565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610b5a6124ce565b6125c66124ce565b80355f8051602061358d83398151915290815560146125eb606084016040850161356c565b60ff16118061260a5750612605606083016040840161356c565b60ff16155b1561263e5761261f606083016040840161356c565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b61264e606083016040840161356c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561267f6040830160208401613171565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6111246124ce565b5080546126ba90612a09565b5f825580601f106126c9575050565b601f0160209004905f5260205f20908101906111569190612722565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612736575f8155600101612723565b5090565b5f6020828403121561274a575f80fd5b5035919050565b803563ffffffff81168114612764575f80fd5b919050565b5f806040838503121561277a575f80fd5b82356001600160401b0381111561278f575f80fd5b8301608081860312156127a0575f80fd5b91506127ae60208401612751565b90509250929050565b5f602082840312156127c7575f80fd5b610b8482612751565b80356001600160401b0381168114612764575f80fd5b5f80604083850312156127f7575f80fd5b82356001600160401b0381111561280c575f80fd5b830160a0818603121561281d575f80fd5b91506127ae602084016127d0565b6001600160a01b0381168114611156575f80fd5b5f808284036080811215612851575f80fd5b606081121561285e575f80fd5b5082915060608301356128708161282b565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b600681106128ab57634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b838110156128c95781810151838201526020016128b1565b50505f910152565b5f81518084526128e88160208601602086016128af565b601f01601f19169290920160200192915050565b6020815261290e60208201835161288f565b5f602083015160e060408401526129296101008401826128d1565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f6020828403121561298c575f80fd5b81356129978161282b565b9392505050565b5f80602083850312156129af575f80fd5b82356001600160401b03808211156129c5575f80fd5b818501915085601f8301126129d8575f80fd5b8135818111156129e6575f80fd5b8660208285010111156129f7575f80fd5b60209290920196919550909350505050565b600181811c90821680612a1d57607f821691505b602082108103612a3b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610b87828461288f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a8557612a85612a4f565b60405290565b604080519081016001600160401b0381118282101715612a8557612a85612a4f565b604051601f8201601f191681016001600160401b0381118282101715612ad557612ad5612a4f565b604052919050565b5f6001600160401b03821115612af557612af5612a4f565b50601f01601f191660200190565b5f82601f830112612b12575f80fd5b8151612b25612b2082612add565b612aad565b818152846020838601011115612b39575f80fd5b612b4a8260208301602087016128af565b949350505050565b5f60208284031215612b62575f80fd5b81516001600160401b03811115612b77575f80fd5b612b4a84828501612b03565b602081525f610b8460208301846128d1565b5f60208284031215612ba5575f80fd5b5051919050565b5f808335601e19843603018112612bc1575f80fd5b8301803591506001600160401b03821115612bda575f80fd5b6020019150600581901b360382131561213b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612c19575f80fd5b9190910192915050565b5f82601f830112612c32575f80fd5b8135612c40612b2082612add565b818152846020838601011115612c54575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612c80575f80fd5b612c88612a63565b82356001600160401b0380821115612c9e575f80fd5b612caa36838701612c23565b83526020850135915080821115612cbf575f80fd5b50612ccc36828601612c23565b602083015250612cde604084016127d0565b604082015292915050565b5f8251612c198184602087016128af565b601f821115610b3057805f5260205f20601f840160051c81016020851015612d1f5750805b601f840160051c820191505b81811015612d3e575f8155600101612d2b565b5050505050565b81516001600160401b03811115612d5e57612d5e612a4f565b612d7281612d6c8454612a09565b84612cfa565b602080601f831160018114612da5575f8415612d8e5750858301515b5f19600386901b1c1916600185901b178555612dfc565b5f85815260208120601f198616915b82811015612dd357888601518255948401946001909101908401612db4565b5085821015612df057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b8757610b87612e04565b5f63ffffffff808316818103612e4357612e43612e04565b6001019392505050565b8082028115828204841417610b8757610b87612e04565b5f808335601e19843603018112612e79575f80fd5b83016020810192503590506001600160401b03811115612e97575f80fd5b80360382131561213b575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b87811015612f7a57848303601f19018952813536889003605e19018112612f09575f80fd5b87016060612f178280612e64565b828752612f278388018284612ea5565b92505050612f3786830183612e64565b86830388880152612f49838284612ea5565b9250505060406001600160401b03612f628285016127d0565b16950194909452509783019790830190600101612ee4565b5090979650505050505050565b6020815281356020820152602082013560408201525f6040830135612fab8161282b565b6001600160a01b031660608381019190915283013536849003601e19018112612fd2575f80fd5b83016020810190356001600160401b03811115612fed575f80fd5b8060051b3603821315612ffe575f80fd5b60808085015261301260a085018284612ecd565b95945050505050565b80518015158114612764575f80fd5b5f806040838503121561303b575f80fd5b825191506127ae6020840161301b565b5f60208083525f845461305d81612a09565b806020870152604060018084165f811461307e576001811461309a576130c7565b60ff19851660408a0152604084151560051b8a010195506130c7565b895f5260205f205f5b858110156130be5781548b82018601529083019088016130a3565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b5f80604083850312156130f5575f80fd5b82516001600160401b038082111561310b575f80fd5b908401906060828703121561311e575f80fd5b613126612a63565b8251815260208301516131388161282b565b602082015260408301518281111561314e575f80fd5b61315a88828601612b03565b60408301525093506127ae9150506020840161301b565b5f60208284031215613181575f80fd5b610b84826127d0565b5f8235603e19833603018112612c19575f80fd5b5f808335601e198436030181126131b3575f80fd5b8301803591506001600160401b038211156131cc575f80fd5b60200191503681900382131561213b575f80fd5b602081525f612b4a602083018486612ea5565b5f60408236031215613203575f80fd5b61320b612a8b565b61321483612751565b81526020808401356001600160401b0380821115613230575f80fd5b9085019036601f830112613242575f80fd5b81358181111561325457613254612a4f565b8060051b9150613265848301612aad565b818152918301840191848101903684111561327e575f80fd5b938501935b838510156132a857843592506132988361282b565b8282529385019390850190613283565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156133155784516001600160a01b031682529383019360019290920191908301906132ec565b509695505050505050565b60208152815160208201525f602083015160e060408401526133466101008401826128d1565b90506040840151601f198085840301606086015261336483836128d1565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261339483836132ba565b925060a08601519150808584030160c0860152506133b282826132ba565b91505060c08401516133cf60e08501826001600160401b03169052565b509392505050565b5f80604083850312156133e8575f80fd5b8251915060208301516001600160401b03811115613404575f80fd5b61341085828601612b03565b9150509250929050565b6001600160401b0383111561343157613431612a4f565b6134458361343f8354612a09565b83612cfa565b5f601f841160018114613476575f851561345f5750838201355b5f19600387901b1c1916600186901b178355612d3e565b5f83815260208120601f198716915b828110156134a55786850135825560209485019460019092019101613485565b50868210156134c1575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610b8757610b87612e04565b6001600160401b038281168282160390808211156112c3576112c3612e04565b6001600160401b038181168382160190808211156112c3576112c3612e04565b6001600160401b0381811683821602808216919082811461354957613549612e04565b505092915050565b5f6001600160401b03808316818103612e4357612e43612e04565b5f6020828403121561357c575f80fd5b813560ff81168114612997575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a26469706673582212209d9403351ec5ca49cca66f0c1b9df49f3f94eb72e1b7c71b94795fbe73670e3364736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"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\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"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\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161380838038061380883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136bb8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b61014961014436600461280a565b610312565b005b610149610159366004612839565b6105a2565b61014961016c366004612887565b610b5d565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a136600461280a565b610b6b565b6040516001600160401b03909116815260200161018a565b610149610b7f565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b61014961024736600461280a565b610b92565b6101cd61025a3660046128b6565b610ba7565b61014961026d366004612887565b610bc3565b6102216005600160991b0181565b6101cd5f8051602061364683398151915281565b6101496102a236600461280a565b610db9565b6101e3601481565b6101496102bd36600461290f565b610ef5565b6102d56102d036600461280a565b611003565b60405161018a91906129cc565b6101a66202a30081565b6101496102fa366004612a4c565b611152565b6101cd61030d366004612a6e565b61118f565b5f8181525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff16600581111561035f5761035f61294b565b60058111156103705761037061294b565b815260200160018201805461038490612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612ad9565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156104665761046661294b565b146104a2575f8381526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610519573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105409190810190612c22565b6040518263ffffffff1660e01b815260040161055c9190612c53565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190612c65565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f805160206136468339815191529060ff16156105f457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065b9190612c65565b836020013514610684576040516372b0a7e760e11b815260208401356004820152602401610499565b306106956060850160408601612a4c565b6001600160a01b0316146106d8576106b36060840160408501612a4c565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f6106e66060850185612c7c565b905090505f805b828163ffffffff16101561094e575f6107096060880188612c7c565b8363ffffffff1681811061071f5761071f612cc1565b90506020028101906107319190612cd5565b61073a90612d40565b80516040519192505f91600688019161075291612db9565b9081526020016040518091039020541461078257805160405163a41f772f60e01b81526104999190600401612c53565b5f6002885f0135846040516020016107b192919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107cb91612db9565b602060405180830381855afa1580156107e6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108099190612c65565b90508086600601835f01516040516108219190612db9565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff1916600217815582516001909101906108619082612e15565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff191690556108e19085612ee8565b82516040519195506108f291612db9565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a350508061094790612f08565b90506106ed565b506003830180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001840154606491610996910460ff1683612f2a565b6001600160401b031610156109c957604051633e1a785160e01b81526001600160401b0382166004820152602401610499565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d8478846109ed876111ea565b604001516040518263ffffffff1660e01b8152600401610a0d9190612c53565b602060405180830381865af4158015610a28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c9190612c65565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610a869190613078565b5f60405180830381865af4158015610aa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ac79190810190612c22565b90505f600282604051610ada9190612db9565b602060405180830381855afa158015610af5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b189190612c65565b9050828114610b445760405163baaea89d60e01b81526004810182905260248101849052604401610499565b5050506007909201805460ff1916600117905550505050565b610b6681611300565b505050565b5f610b7582611003565b6080015192915050565b610b876116b8565b610b905f611713565b565b610b9a6116b8565b610ba381611783565b5050565b5f610bb06116b8565b610bba8383611a68565b90505b92915050565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f610bf6866111ea565b604001516040518263ffffffff1660e01b8152600401610c169190612c53565b6040805180830381865af4158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c54919061311b565b9150915080610c7a57604051632d07135360e01b81528115156004820152602401610499565b5f82815260048401602052604090208054610c9490612ad9565b90505f03610cb85760405163089938b360e11b815260048101839052602401610499565b60015f838152600580860160205260409091205460ff1690811115610cdf57610cdf61294b565b14610d12575f8281526005840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004840160205260408120610d2a9161277e565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f805160206136468339815191529190610e0090612ad9565b90505f03610e245760405163089938b360e11b815260048101839052602401610499565b60015f838152600580840160205260409091205460ff1690811115610e4b57610e4b61294b565b14610e7e575f8281526005820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92610eb5920161313c565b6020604051808303815f875af1158015610ed1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190612c65565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f395750825b90505f826001600160401b03166001148015610f545750303b155b905081158015610f62575080155b15610f805760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610faa57845460ff60401b1916600160401b1785555b610fb48787611fda565b8315610ffa57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61100b6127b5565b5f8281525f80516020613666833981519152602052604090819020815160e0810190925280545f80516020613646833981519152929190829060ff1660058111156110585761105861294b565b60058111156110695761106961294b565b815260200160018201805461107d90612ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546110a990612ad9565b80156110f45780601f106110cb576101008083540402835291602001916110f4565b820191905f5260205f20905b8154815290600101906020018083116110d757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b61115a6116b8565b6001600160a01b03811661118357604051631e4fbdf760e01b81525f6004820152602401610499565b61118c81611713565b50565b6040515f905f80516020613646833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906111d290869086906131c6565b90815260200160405180910390205491505092915050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561124e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127591908101906131d5565b915091508061129757604051636b2f19e960e01b815260040160405180910390fd5b8151156112bd578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156112f9576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f6113096127b5565b5f805160206136468339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61133c886111ea565b604001516040518263ffffffff1660e01b815260040161135c9190612c53565b6040805180830381865af4158015611376573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139a919061311b565b9150915080156113c157604051632d07135360e01b81528115156004820152602401610499565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff909116908111156113f8576113f861294b565b60058111156114095761140961294b565b815260200160018201805461141d90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461144990612ad9565b80156114945780601f1061146b57610100808354040283529160200191611494565b820191905f5260205f20905b81548152906001019060200180831161147757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156114ff576114ff61294b565b14158015611520575060018151600581111561151d5761151d61294b565b14155b1561154157805160405163170cc93360e21b81526104999190600401612b11565b6003815160058111156115565761155661294b565b036115645760048152611569565b600581525b83600601816020015160405161157f9190612db9565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff19169060019084908111156115c2576115c261294b565b0217905550602082015160018201906115db9082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156116815761168161294b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336116ea7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b905760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61178b6127b5565b5f8281525f805160206136668339815191526020526040808220815160e0810190925280545f8051602061364683398151915293929190829060ff1660058111156117d8576117d861294b565b60058111156117e9576117e961294b565b81526020016001820180546117fd90612ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461182990612ad9565b80156118745780601f1061184b57610100808354040283529160200191611874565b820191905f5260205f20905b81548152906001019060200180831161185757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156118e2576118e261294b565b14611915575f8481526005830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612b11565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff191690600190849081111561195a5761195a61294b565b0217905550602082015160018201906119739082612e15565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611a118582611ff4565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16611aac57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061364683398151915242611acb6060860160408701613262565b6001600160401b0316111580611b055750611ae96202a3004261327b565b611af96060860160408701613262565b6001600160401b031610155b15611b3f57611b1a6060850160408601613262565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b60038101546001600160401b0390611b6290600160401b9004821685831661327b565b1115611b8c57604051633e1a785160e01b81526001600160401b0384166004820152602401610499565b611ba1611b9c606086018661328e565b6121cb565b611bb1611b9c608086018661328e565b6030611bc060208601866132a2565b905014611bf257611bd460208501856132a2565b6040516326475b2f60e11b8152610499925060040190815260200190565b611bfc84806132a2565b90505f03611c2957611c0e84806132a2565b604051633e08a12560e11b81526004016104999291906132e4565b5f60068201611c3886806132a2565b604051611c469291906131c6565b90815260200160405180910390205414611c7f57611c6484806132a2565b60405163a41f772f60e01b81526004016104999291906132e4565b611c89835f612334565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101611cc68a806132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611d0e908b018b6132a2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611d5760608b0160408c01613262565b6001600160401b03168152602001611d7260608b018b61328e565b611d7b906132f7565b8152602001611d8d60808b018b61328e565b611d96906132f7565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401611dc49190613424565b5f60405180830381865af4158015611dde573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0591908101906134db565b5f82815260048601602052604090209193509150611e238282612e15565b508160068401611e3388806132a2565b604051611e419291906131c6565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e7d908590600401612c53565b6020604051808303815f875af1158015611e99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebd9190612c65565b5f8481526005860160205260409020805460ff191660011790559050611ee387806132a2565b5f858152600587016020526040902060010191611f0191908361351e565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580611f6088806132a2565b604051611f6e9291906131c6565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b6040016020810190611fac9190613262565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611fe261259e565b611feb826125e7565b610ba381612600565b5f8281525f80516020613666833981519152602052604081206002015481905f8051602061364683398151915290600160801b90046001600160401b031661203c8582612334565b5f61204687612611565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156120ef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121169190810190612c22565b6040518263ffffffff1660e01b81526004016121329190612c53565b6020604051808303815f875af115801561214e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121729190612c65565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6121d86020820182612887565b63ffffffff161580156121f857506121f36020820182612c7c565b151590505b1561223f5761220a6020820182612887565b6122176020830183612c7c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b61224c6020820182612c7c565b905061225b6020830183612887565b63ffffffff1611156122745761220a6020820182612887565b60015b6122846020830183612c7c565b9050811015610ba35761229a6020830183612c7c565b6122a56001846135d7565b8181106122b4576122b4612cc1565b90506020020160208101906122c99190612a4c565b6001600160a01b03166122df6020840184612c7c565b838181106122ef576122ef612cc1565b90506020020160208101906123049190612a4c565b6001600160a01b0316101561232c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101612277565b5f805160206136468339815191525f6001600160401b0380841690851611156123685761236183856135ea565b9050612375565b61237284846135ea565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806123e25750600184015481516123de916001600160401b03169061327b565b8210155b1561240a576001600160401b0380841660608301528282526040820151166020820152612429565b828160600181815161241c9190612ee8565b6001600160401b03169052505b6060810151612439906064612f2a565b602082015160018601546001600160401b0392909216916124649190600160401b900460ff16612f2a565b6001600160401b0316101561249d57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b85816040018181516124af9190612ee8565b6001600160401b03169052506040810180518691906124cf9083906135ea565b6001600160401b0316905250600184015460408201516064916124fd91600160401b90910460ff1690612f2a565b6001600160401b03161015612536576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610499565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b9057604051631afcd79f60e31b815260040160405180910390fd5b6125ef61259e565b6125f7612686565b61118c8161268e565b61260861259e565b61118c81612776565b5f8181525f805160206136668339815191526020526040812060020180545f80516020613646833981519152919060089061265b90600160401b90046001600160401b031661360a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610b9061259e565b61269661259e565b80355f8051602061364683398151915290815560146126bb6060840160408501613625565b60ff1611806126da57506126d56060830160408401613625565b60ff16155b1561270e576126ef6060830160408401613625565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b61271e6060830160408401613625565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561274f6040830160208401613262565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61115a61259e565b50805461278a90612ad9565b5f825580601f10612799575050565b601f0160209004905f5260205f209081019061118c91906127f2565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612806575f81556001016127f3565b5090565b5f6020828403121561281a575f80fd5b5035919050565b803563ffffffff81168114612834575f80fd5b919050565b5f806040838503121561284a575f80fd5b82356001600160401b0381111561285f575f80fd5b830160808186031215612870575f80fd5b915061287e60208401612821565b90509250929050565b5f60208284031215612897575f80fd5b610bba82612821565b80356001600160401b0381168114612834575f80fd5b5f80604083850312156128c7575f80fd5b82356001600160401b038111156128dc575f80fd5b830160a081860312156128ed575f80fd5b915061287e602084016128a0565b6001600160a01b038116811461118c575f80fd5b5f808284036080811215612921575f80fd5b606081121561292e575f80fd5b508291506060830135612940816128fb565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6006811061297b57634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612999578181015183820152602001612981565b50505f910152565b5f81518084526129b881602086016020860161297f565b601f01601f19169290920160200192915050565b602081526129de60208201835161295f565b5f602083015160e060408401526129f96101008401826129a1565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612a5c575f80fd5b8135612a67816128fb565b9392505050565b5f8060208385031215612a7f575f80fd5b82356001600160401b0380821115612a95575f80fd5b818501915085601f830112612aa8575f80fd5b813581811115612ab6575f80fd5b866020828501011115612ac7575f80fd5b60209290920196919550909350505050565b600181811c90821680612aed57607f821691505b602082108103612b0b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610bbd828461295f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b5557612b55612b1f565b60405290565b604080519081016001600160401b0381118282101715612b5557612b55612b1f565b604051601f8201601f191681016001600160401b0381118282101715612ba557612ba5612b1f565b604052919050565b5f6001600160401b03821115612bc557612bc5612b1f565b50601f01601f191660200190565b5f82601f830112612be2575f80fd5b8151612bf5612bf082612bad565b612b7d565b818152846020838601011115612c09575f80fd5b612c1a82602083016020870161297f565b949350505050565b5f60208284031215612c32575f80fd5b81516001600160401b03811115612c47575f80fd5b612c1a84828501612bd3565b602081525f610bba60208301846129a1565b5f60208284031215612c75575f80fd5b5051919050565b5f808335601e19843603018112612c91575f80fd5b8301803591506001600160401b03821115612caa575f80fd5b6020019150600581901b36038213156121c4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612ce9575f80fd5b9190910192915050565b5f82601f830112612d02575f80fd5b8135612d10612bf082612bad565b818152846020838601011115612d24575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612d50575f80fd5b612d58612b33565b82356001600160401b0380821115612d6e575f80fd5b612d7a36838701612cf3565b83526020850135915080821115612d8f575f80fd5b50612d9c36828601612cf3565b602083015250612dae604084016128a0565b604082015292915050565b5f8251612ce981846020870161297f565b601f821115610b6657805f5260205f20601f840160051c81016020851015612def5750805b601f840160051c820191505b81811015612e0e575f8155600101612dfb565b5050505050565b81516001600160401b03811115612e2e57612e2e612b1f565b612e4281612e3c8454612ad9565b84612dca565b602080601f831160018114612e75575f8415612e5e5750858301515b5f19600386901b1c1916600185901b178555612ecc565b5f85815260208120601f198616915b82811015612ea357888601518255948401946001909101908401612e84565b5085821015612ec057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156112f9576112f9612ed4565b5f63ffffffff808316818103612f2057612f20612ed4565b6001019392505050565b6001600160401b03818116838216028082169190828114612f4d57612f4d612ed4565b505092915050565b5f808335601e19843603018112612f6a575f80fd5b83016020810192503590506001600160401b03811115612f88575f80fd5b8036038213156121c4575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561306b57848303601f19018952813536889003605e19018112612ffa575f80fd5b870160606130088280612f55565b8287526130188388018284612f96565b9250505061302886830183612f55565b8683038888015261303a838284612f96565b9250505060406001600160401b036130538285016128a0565b16950194909452509783019790830190600101612fd5565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561309c816128fb565b6001600160a01b031660608381019190915283013536849003601e190181126130c3575f80fd5b83016020810190356001600160401b038111156130de575f80fd5b8060051b36038213156130ef575f80fd5b60808085015261310360a085018284612fbe565b95945050505050565b80518015158114612834575f80fd5b5f806040838503121561312c575f80fd5b8251915061287e6020840161310c565b5f60208083525f845461314e81612ad9565b806020870152604060018084165f811461316f576001811461318b576131b8565b60ff19851660408a0152604084151560051b8a010195506131b8565b895f5260205f205f5b858110156131af5781548b8201860152908301908801613194565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b5f80604083850312156131e6575f80fd5b82516001600160401b03808211156131fc575f80fd5b908401906060828703121561320f575f80fd5b613217612b33565b825181526020830151613229816128fb565b602082015260408301518281111561323f575f80fd5b61324b88828601612bd3565b604083015250935061287e9150506020840161310c565b5f60208284031215613272575f80fd5b610bba826128a0565b80820180821115610bbd57610bbd612ed4565b5f8235603e19833603018112612ce9575f80fd5b5f808335601e198436030181126132b7575f80fd5b8301803591506001600160401b038211156132d0575f80fd5b6020019150368190038213156121c4575f80fd5b602081525f612c1a602083018486612f96565b5f60408236031215613307575f80fd5b61330f612b5b565b61331883612821565b81526020808401356001600160401b0380821115613334575f80fd5b9085019036601f830112613346575f80fd5b81358181111561335857613358612b1f565b8060051b9150613369848301612b7d565b8181529183018401918481019036841115613382575f80fd5b938501935b838510156133ac578435925061339c836128fb565b8282529385019390850190613387565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156134195784516001600160a01b031682529383019360019290920191908301906133f0565b509695505050505050565b60208152815160208201525f602083015160e0604084015261344a6101008401826129a1565b90506040840151601f198085840301606086015261346883836129a1565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261349883836133be565b925060a08601519150808584030160c0860152506134b682826133be565b91505060c08401516134d360e08501826001600160401b03169052565b509392505050565b5f80604083850312156134ec575f80fd5b8251915060208301516001600160401b03811115613508575f80fd5b61351485828601612bd3565b9150509250929050565b6001600160401b0383111561353557613535612b1f565b613549836135438354612ad9565b83612dca565b5f601f84116001811461357a575f85156135635750838201355b5f19600387901b1c1916600186901b178355612e0e565b5f83815260208120601f198716915b828110156135a95786850135825560209485019460019092019101613589565b50868210156135c5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610bbd57610bbd612ed4565b6001600160401b038281168282160390808211156112f9576112f9612ed4565b5f6001600160401b03808316818103612f2057612f20612ed4565b5f60208284031215613635575f80fd5b813560ff81168114612a67575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05a2646970667358221220af151af307feeeac5e40b113646536c32b85a1ad5c13d65fef1d00a670bfb92864736f6c63430008190033", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -886,13 +886,13 @@ func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { type PoAValidatorManagerInitialValidatorCreated struct { ValidationID [32]byte NodeID common.Hash - Weight *big.Int + Weight uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} @@ -911,9 +911,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorC return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -957,9 +957,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCr }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { event := new(PoAValidatorManagerInitialValidatorCreated) if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -1328,14 +1328,14 @@ type PoAValidatorManagerValidationPeriodCreated struct { ValidationID [32]byte NodeID common.Hash RegisterValidationMessageID [32]byte - Weight *big.Int + Weight uint64 RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} @@ -1358,9 +1358,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodC return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1408,9 +1408,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCr }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { event := new(PoAValidatorManagerValidationPeriodCreated) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { @@ -1643,14 +1643,14 @@ func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Close() error { // PoAValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the PoAValidatorManager contract. type PoAValidatorManagerValidationPeriodRegistered struct { ValidationID [32]byte - Weight *big.Int + Weight uint64 Timestamp *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodRegisteredIterator, error) { var validationIDRule []interface{} @@ -1665,9 +1665,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodR return &PoAValidatorManagerValidationPeriodRegisteredIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil } -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1707,9 +1707,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRe }), nil } -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*PoAValidatorManagerValidationPeriodRegistered, error) { event := new(PoAValidatorManagerValidationPeriodRegistered) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { @@ -1790,14 +1790,14 @@ func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Close() error type PoAValidatorManagerValidatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Weight *big.Int + Weight uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1816,9 +1816,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalI return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1862,9 +1862,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalIn }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { event := new(PoAValidatorManagerValidatorRemovalInitialized) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { @@ -1945,14 +1945,14 @@ func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Close() error { type PoAValidatorManagerValidatorWeightUpdate struct { ValidationID [32]byte Nonce uint64 - ValidatorWeight uint64 + Weight uint64 SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } // FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*PoAValidatorManagerValidatorWeightUpdateIterator, error) { var validationIDRule []interface{} @@ -1973,7 +1973,7 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUp // WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} @@ -2019,7 +2019,7 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpd // ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. // -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*PoAValidatorManagerValidatorWeightUpdate, error) { event := new(PoAValidatorManagerValidatorWeightUpdate) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { @@ -2032,7 +2032,7 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpd // ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. var ValidatorMessagesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x612160610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c3366004611904565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f0366004611904565b61044a565b604080519283526001600160401b039091166020830152016100d9565b610125610120366004611904565b61063b565b6040519081526020016100d9565b610146610141366004611904565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a561017936600461193d565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d991906119a1565b6101a56101c03660046119d5565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d366004611a0e565b610a1e565b610235610230366004611904565b610bff565b6040516100d99190611aaa565b6101a5610250366004611b61565b61154a565b6101a5610263366004611b93565b61158e565b61027b610276366004611ca1565b6115c4565b6040516100d9929190611d9d565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611dc9565b6102e6906008611ddc565b61ffff168582815181106102fc576102fc611df3565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611dc9565b61035f906008611ddc565b63ffffffff1686610371836002611e07565b8151811061038157610381611df3565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611dc9565b6103e2906008611ddc565b876103ee836006611e07565b815181106103fe576103fe611df3565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611df3565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611dc9565b6104a2906008611ddc565b61ffff168582815181106104b8576104b8611df3565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611dc9565b61051b906008611ddc565b63ffffffff168661052d836002611e07565b8151811061053d5761053d611df3565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611dc9565b61059c906008611ddc565b876105a8836006611e07565b815181106105b8576105b8611df3565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611dc9565b6105f2906008611ddc565b6001600160401b031688610607836026611e07565b8151811061061757610617611df3565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611dc9565b610692906008611ddc565b61ffff168482815181106106a8576106a8611df3565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611dc9565b61070b906008611ddc565b63ffffffff168561071d836002611e07565b8151811061072d5761072d611df3565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611dc9565b61078c906008611ddc565b86610798836006611e07565b815181106107a8576107a8611df3565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611dc9565b610821906008611ddc565b61ffff1686828151811061083757610837611df3565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611dc9565b61089a906008611ddc565b63ffffffff16876108ac836002611e07565b815181106108bc576108bc611df3565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611dc9565b61091d906008611ddc565b88610929836006611e07565b8151811061093957610939611df3565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611dc9565b610973906008611ddc565b6001600160401b031689610988836026611e07565b8151811061099857610998611df3565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611dc9565b6109d2906008611ddc565b6001600160401b03168a6109e783602e611e07565b815181106109f7576109f7611df3565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b60605f80833560208501356014610a3a87870160408901611e1a565b610a476060890189611e33565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b610acd6060850185611e33565b9050811015610bf85781610ae46060860186611e33565b83818110610af457610af4611df3565b9050602002810190610b069190611e7f565b610b109080611e9d565b9050610b1f6060870187611e33565b84818110610b2f57610b2f611df3565b9050602002810190610b419190611e7f565b610b4b9080611e9d565b610b586060890189611e33565b86818110610b6857610b68611df3565b9050602002810190610b7a9190611e7f565b610b88906020810190611e9d565b610b9560608b018b611e33565b88818110610ba557610ba5611df3565b9050602002810190610bb79190611e7f565b610bc8906060810190604001611edf565b604051602001610bde9796959493929190611ef8565b60408051601f198184030181529190529150600101610ac0565b5092915050565b610c076117b1565b5f610c106117b1565b5f805b6002811015610c6e57610c27816001611dc9565b610c32906008611ddc565b61ffff1686610c4763ffffffff871684611e07565b81518110610c5757610c57611df3565b016020015160f81c901b9190911790600101610c13565b5061ffff811615610c985760405163407b587360e01b815261ffff821660048201526024016102bb565b610ca3600284611f61565b9250505f805b6004811015610d0857610cbd816003611dc9565b610cc8906008611ddc565b63ffffffff16868563ffffffff1683610ce19190611e07565b81518110610cf157610cf1611df3565b016020015160f81c901b9190911790600101610ca9565b5063ffffffff8116600114610d3057604051635b60892f60e01b815260040160405180910390fd5b610d3b600484611f61565b9250505f805b6020811015610d9857610d5581601f611dc9565b610d60906008611ddc565b86610d7163ffffffff871684611e07565b81518110610d8157610d81611df3565b016020015160f81c901b9190911790600101610d41565b50808252610da7602084611f61565b9250505f805b6004811015610e0c57610dc1816003611dc9565b610dcc906008611ddc565b63ffffffff16868563ffffffff1683610de59190611e07565b81518110610df557610df5611df3565b016020015160f81c901b9190911790600101610dad565b50610e18600484611f61565b92505f8163ffffffff166001600160401b03811115610e3957610e3961180b565b6040519080825280601f01601f191660200182016040528015610e63576020820181803683370190505b5090505f5b8263ffffffff16811015610ed25786610e8763ffffffff871683611e07565b81518110610e9757610e97611df3565b602001015160f81c60f81b828281518110610eb457610eb4611df3565b60200101906001600160f81b03191690815f1a905350600101610e68565b5060208301819052610ee48285611f61565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610f705786610f2563ffffffff871683611e07565b81518110610f3557610f35611df3565b602001015160f81c60f81b828281518110610f5257610f52611df3565b60200101906001600160f81b03191690815f1a905350600101610f0b565b5060408301819052610f83603085611f61565b9350505f805b6008811015610fe957610f9d816007611dc9565b610fa8906008611ddc565b6001600160401b031687610fc263ffffffff881684611e07565b81518110610fd257610fd2611df3565b016020015160f81c901b9190911790600101610f89565b506001600160401b0381166060840152611004600885611f61565b9350505f805f5b600481101561106a5761101f816003611dc9565b61102a906008611ddc565b63ffffffff16888763ffffffff16836110439190611e07565b8151811061105357611053611df3565b016020015160f81c901b919091179060010161100b565b50611076600486611f61565b94505f5b60048110156110d95761108e816003611dc9565b611099906008611ddc565b63ffffffff16888763ffffffff16836110b29190611e07565b815181106110c2576110c2611df3565b016020015160f81c901b929092179160010161107a565b506110e5600486611f61565b94505f8263ffffffff166001600160401b038111156111065761110661180b565b60405190808252806020026020018201604052801561112f578160200160208202803683370190505b5090505f5b8363ffffffff16811015611217576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156111c9578a61117e63ffffffff8b1683611e07565b8151811061118e5761118e611df3565b602001015160f81c60f81b8282815181106111ab576111ab611df3565b60200101906001600160f81b03191690815f1a905350600101611164565b505f60148201519050808484815181106111e5576111e5611df3565b6001600160a01b039092166020928302919091019091015261120860148a611f61565b98505050806001019050611134565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156112995761124e816003611dc9565b611259906008611ddc565b63ffffffff16898863ffffffff16836112729190611e07565b8151811061128257611282611df3565b016020015160f81c901b919091179060010161123a565b506112a5600487611f61565b95505f5b6004811015611308576112bd816003611dc9565b6112c8906008611ddc565b63ffffffff16898863ffffffff16836112e19190611e07565b815181106112f1576112f1611df3565b016020015160f81c901b92909217916001016112a9565b50611314600487611f61565b95505f8263ffffffff166001600160401b038111156113355761133561180b565b60405190808252806020026020018201604052801561135e578160200160208202803683370190505b5090505f5b8363ffffffff16811015611446576040805160148082528183019092525f916020820181803683370190505090505f5b60148110156113f8578b6113ad63ffffffff8c1683611e07565b815181106113bd576113bd611df3565b602001015160f81c60f81b8282815181106113da576113da611df3565b60200101906001600160f81b03191690815f1a905350600101611393565b505f601482015190508084848151811061141457611414611df3565b6001600160a01b039092166020928302919091019091015261143760148b611f61565b99505050806001019050611363565b506040805180820190915263ffffffff9092168252602082015260a08501525f6114708284611f61565b61147b906014611f7e565b61148685607a611f61565b6114909190611f61565b90508063ffffffff168851146114cc57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561152f576114e3816007611dc9565b6114ee906008611ddc565b6001600160401b03168a61150863ffffffff8b1684611e07565b8151811061151857611518611df3565b016020015160f81c901b91909117906001016114cf565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e01611576565b5f60608260400151516030146115ed5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861162e988a986001989297929690959094909390929101611fa6565b60405160208183030381529060405290505f5b846080015160200151518110156116a05781856080015160200151828151811061166d5761166d611df3565b6020026020010151604051602001611686929190612060565b60408051601f198184030181529190529150600101611641565b5060a08401518051602091820151516040516116c0938593929101612096565b60405160208183030381529060405290505f5b8460a00151602001515181101561173257818560a001516020015182815181106116ff576116ff611df3565b6020026020010151604051602001611718929190612060565b60408051601f1981840301815291905291506001016116d3565b5060c08401516040516117499183916020016120d1565b604051602081830303815290604052905060028160405161176a9190612102565b602060405180830381855afa158015611785573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117a89190612113565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156118415761184161180b565b60405290565b60405160e081016001600160401b03811182821017156118415761184161180b565b604051601f8201601f191681016001600160401b03811182821017156118915761189161180b565b604052919050565b5f82601f8301126118a8575f80fd5b81356001600160401b038111156118c1576118c161180b565b6118d4601f8201601f1916602001611869565b8181528460208386010111156118e8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611914575f80fd5b81356001600160401b03811115611929575f80fd5b61193584828501611899565b949350505050565b5f6020828403121561194d575f80fd5b5035919050565b5f5b8381101561196e578181015183820152602001611956565b50505f910152565b5f815180845261198d816020860160208601611954565b601f01601f19169290920160200192915050565b602081525f6119b36020830184611976565b9392505050565b80356001600160401b03811681146119d0575f80fd5b919050565b5f805f606084860312156119e7575f80fd5b833592506119f7602085016119ba565b9150611a05604085016119ba565b90509250925092565b5f60208284031215611a1e575f80fd5b81356001600160401b03811115611a33575f80fd5b8201608081850312156119b3575f80fd5b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611a9f5784516001600160a01b03168252938301936001929092019190830190611a76565b509695505050505050565b60208152815160208201525f602083015160e06040840152611ad0610100840182611976565b90506040840151601f1980858403016060860152611aee8383611976565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611b1e8383611a44565b925060a08601519150808584030160c086015250611b3c8282611a44565b91505060c0840151611b5960e08501826001600160401b03169052565b509392505050565b5f8060408385031215611b72575f80fd5b8235915060208301358015158114611b88575f80fd5b809150509250929050565b5f8060408385031215611ba4575f80fd5b82359150611bb4602084016119ba565b90509250929050565b80356001600160a01b03811681146119d0575f80fd5b5f60408284031215611be3575f80fd5b611beb61181f565b9050813563ffffffff81168114611c00575f80fd5b81526020828101356001600160401b0380821115611c1c575f80fd5b818501915085601f830112611c2f575f80fd5b813581811115611c4157611c4161180b565b8060051b9150611c52848301611869565b8181529183018401918481019088841115611c6b575f80fd5b938501935b83851015611c9057611c8185611bbd565b82529385019390850190611c70565b808688015250505050505092915050565b5f60208284031215611cb1575f80fd5b81356001600160401b0380821115611cc7575f80fd5b9083019060e08286031215611cda575f80fd5b611ce2611847565b82358152602083013582811115611cf7575f80fd5b611d0387828601611899565b602083015250604083013582811115611d1a575f80fd5b611d2687828601611899565b604083015250611d38606084016119ba565b6060820152608083013582811115611d4e575f80fd5b611d5a87828601611bd3565b60808301525060a083013582811115611d71575f80fd5b611d7d87828601611bd3565b60a083015250611d8f60c084016119ba565b60c082015295945050505050565b828152604060208201525f6119356040830184611976565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561158857611588611db5565b808202811582820484141761158857611588611db5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561158857611588611db5565b5f60208284031215611e2a575f80fd5b6119b382611bbd565b5f808335601e19843603018112611e48575f80fd5b8301803591506001600160401b03821115611e61575f80fd5b6020019150600581901b3603821315611e78575f80fd5b9250929050565b5f8235605e19833603018112611e93575f80fd5b9190910192915050565b5f808335601e19843603018112611eb2575f80fd5b8301803591506001600160401b03821115611ecb575f80fd5b602001915036819003821315611e78575f80fd5b5f60208284031215611eef575f80fd5b6119b3826119ba565b5f8851611f09818460208d01611954565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b63ffffffff818116838216019080821115610bf857610bf8611db5565b63ffffffff818116838216028082169190828114611f9e57611f9e611db5565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611fec81602a850160208b01611954565b86519083019061200381602a840160208b01611954565b60c087901b6001600160c01b031916602a9290910191820152612035603282018660e01b6001600160e01b0319169052565b61204e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351612071818460208801611954565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120a7818460208901611954565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120e2818460208801611954565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f8251611e93818460208701611954565b5f60208284031215612123575f80fd5b505191905056fea264697066735822122011621dfb91ec33af686b7db0125d7be205eba3545324b3431097bb320ce72c5764736f6c63430008190033", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea2646970667358221220c86fc0fb87c524ec5b0c98159450f3ea9dc01af042aec5aff977246d615450e664736f6c63430008190033", } // ValidatorMessagesABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go b/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go new file mode 100644 index 000000000..4e0a0ede3 --- /dev/null +++ b/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager/IPoSValidatorManager.go @@ -0,0 +1,2316 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package iposvalidatormanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConversionData is an auto generated low-level Go binding around an user-defined struct. +type ConversionData struct { + L1ID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID []byte + BlsPublicKey []byte + Weight uint64 +} + +// IPoSValidatorManagerMetaData contains all meta data concerning the IPoSValidatorManager contract. +var IPoSValidatorManagerMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"DelegationEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"DelegatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"forceInitializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipientAddress\",\"type\":\"address\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// IPoSValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use IPoSValidatorManagerMetaData.ABI instead. +var IPoSValidatorManagerABI = IPoSValidatorManagerMetaData.ABI + +// IPoSValidatorManager is an auto generated Go binding around an Ethereum contract. +type IPoSValidatorManager struct { + IPoSValidatorManagerCaller // Read-only binding to the contract + IPoSValidatorManagerTransactor // Write-only binding to the contract + IPoSValidatorManagerFilterer // Log filterer for contract events +} + +// IPoSValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type IPoSValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IPoSValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IPoSValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IPoSValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IPoSValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IPoSValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IPoSValidatorManagerSession struct { + Contract *IPoSValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IPoSValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IPoSValidatorManagerCallerSession struct { + Contract *IPoSValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IPoSValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IPoSValidatorManagerTransactorSession struct { + Contract *IPoSValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IPoSValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type IPoSValidatorManagerRaw struct { + Contract *IPoSValidatorManager // Generic contract binding to access the raw methods on +} + +// IPoSValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IPoSValidatorManagerCallerRaw struct { + Contract *IPoSValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// IPoSValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IPoSValidatorManagerTransactorRaw struct { + Contract *IPoSValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIPoSValidatorManager creates a new instance of IPoSValidatorManager, bound to a specific deployed contract. +func NewIPoSValidatorManager(address common.Address, backend bind.ContractBackend) (*IPoSValidatorManager, error) { + contract, err := bindIPoSValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IPoSValidatorManager{IPoSValidatorManagerCaller: IPoSValidatorManagerCaller{contract: contract}, IPoSValidatorManagerTransactor: IPoSValidatorManagerTransactor{contract: contract}, IPoSValidatorManagerFilterer: IPoSValidatorManagerFilterer{contract: contract}}, nil +} + +// NewIPoSValidatorManagerCaller creates a new read-only instance of IPoSValidatorManager, bound to a specific deployed contract. +func NewIPoSValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*IPoSValidatorManagerCaller, error) { + contract, err := bindIPoSValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerCaller{contract: contract}, nil +} + +// NewIPoSValidatorManagerTransactor creates a new write-only instance of IPoSValidatorManager, bound to a specific deployed contract. +func NewIPoSValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IPoSValidatorManagerTransactor, error) { + contract, err := bindIPoSValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerTransactor{contract: contract}, nil +} + +// NewIPoSValidatorManagerFilterer creates a new log filterer instance of IPoSValidatorManager, bound to a specific deployed contract. +func NewIPoSValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IPoSValidatorManagerFilterer, error) { + contract, err := bindIPoSValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerFilterer{contract: contract}, nil +} + +// bindIPoSValidatorManager binds a generic wrapper to an already deployed contract. +func bindIPoSValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IPoSValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IPoSValidatorManager *IPoSValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IPoSValidatorManager.Contract.IPoSValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IPoSValidatorManager *IPoSValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.IPoSValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IPoSValidatorManager *IPoSValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.IPoSValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IPoSValidatorManager *IPoSValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IPoSValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// ChangeDelegatorRewardRecipient is a paid mutator transaction binding the contract method 0xfb8b11dd. +// +// Solidity: function changeDelegatorRewardRecipient(bytes32 delegationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ChangeDelegatorRewardRecipient(opts *bind.TransactOpts, delegationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "changeDelegatorRewardRecipient", delegationID, recipient) +} + +// ChangeDelegatorRewardRecipient is a paid mutator transaction binding the contract method 0xfb8b11dd. +// +// Solidity: function changeDelegatorRewardRecipient(bytes32 delegationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ChangeDelegatorRewardRecipient(delegationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ChangeDelegatorRewardRecipient(&_IPoSValidatorManager.TransactOpts, delegationID, recipient) +} + +// ChangeDelegatorRewardRecipient is a paid mutator transaction binding the contract method 0xfb8b11dd. +// +// Solidity: function changeDelegatorRewardRecipient(bytes32 delegationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ChangeDelegatorRewardRecipient(delegationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ChangeDelegatorRewardRecipient(&_IPoSValidatorManager.TransactOpts, delegationID, recipient) +} + +// ChangeValidatorRewardRecipient is a paid mutator transaction binding the contract method 0x8ef34c98. +// +// Solidity: function changeValidatorRewardRecipient(bytes32 validationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ChangeValidatorRewardRecipient(opts *bind.TransactOpts, validationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "changeValidatorRewardRecipient", validationID, recipient) +} + +// ChangeValidatorRewardRecipient is a paid mutator transaction binding the contract method 0x8ef34c98. +// +// Solidity: function changeValidatorRewardRecipient(bytes32 validationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ChangeValidatorRewardRecipient(validationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ChangeValidatorRewardRecipient(&_IPoSValidatorManager.TransactOpts, validationID, recipient) +} + +// ChangeValidatorRewardRecipient is a paid mutator transaction binding the contract method 0x8ef34c98. +// +// Solidity: function changeValidatorRewardRecipient(bytes32 validationID, address recipient) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ChangeValidatorRewardRecipient(validationID [32]byte, recipient common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ChangeValidatorRewardRecipient(&_IPoSValidatorManager.TransactOpts, validationID, recipient) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ClaimDelegationFees(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ClaimDelegationFees(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. +// +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "completeDelegatorRegistration", delegationID, messageIndex) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. +// +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteDelegatorRegistration(&_IPoSValidatorManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. +// +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteDelegatorRegistration(&_IPoSValidatorManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "completeEndDelegation", delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteEndValidation(&_IPoSValidatorManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteEndValidation(&_IPoSValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteValidatorRegistration(&_IPoSValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.CompleteValidatorRegistration(&_IPoSValidatorManager.TransactOpts, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ForceInitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "forceInitializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x37b9be8f. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ForceInitializeEndDelegation0(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "forceInitializeEndDelegation0", delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// ForceInitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x37b9be8f. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ForceInitializeEndDelegation0(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndDelegation0(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// ForceInitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x37b9be8f. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ForceInitializeEndDelegation0(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndDelegation0(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ForceInitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "forceInitializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndValidation(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndValidation(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation0 is a paid mutator transaction binding the contract method 0x7d8d2f77. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ForceInitializeEndValidation0(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "forceInitializeEndValidation0", validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// ForceInitializeEndValidation0 is a paid mutator transaction binding the contract method 0x7d8d2f77. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ForceInitializeEndValidation0(validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndValidation0(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// ForceInitializeEndValidation0 is a paid mutator transaction binding the contract method 0x7d8d2f77. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ForceInitializeEndValidation0(validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ForceInitializeEndValidation0(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndDelegation(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x9ae06447. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) InitializeEndDelegation0(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "initializeEndDelegation0", delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x9ae06447. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) InitializeEndDelegation0(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndDelegation0(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndDelegation0 is a paid mutator transaction binding the contract method 0x9ae06447. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) InitializeEndDelegation0(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndDelegation0(&_IPoSValidatorManager.TransactOpts, delegationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x5dd6a6cb. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x5dd6a6cb. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndValidation(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x5dd6a6cb. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex, address recipientAddress) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32, recipientAddress common.Address) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndValidation(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex, recipientAddress) +} + +// InitializeEndValidation0 is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) InitializeEndValidation0(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "initializeEndValidation0", validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation0 is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) InitializeEndValidation0(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndValidation0(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation0 is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) InitializeEndValidation0(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeEndValidation0(&_IPoSValidatorManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "initializeValidatorSet", conversionData, messsageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) InitializeValidatorSet(conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeValidatorSet(&_IPoSValidatorManager.TransactOpts, conversionData, messsageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) InitializeValidatorSet(conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.InitializeValidatorSet(&_IPoSValidatorManager.TransactOpts, conversionData, messsageIndex) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendEndValidatorMessage(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendEndValidatorMessage(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendRegisterValidatorMessage(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendRegisterValidatorMessage(&_IPoSValidatorManager.TransactOpts, validationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendUpdateDelegation(&_IPoSValidatorManager.TransactOpts, delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.ResendUpdateDelegation(&_IPoSValidatorManager.TransactOpts, delegationID) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactor) SubmitUptimeProof(opts *bind.TransactOpts, validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.contract.Transact(opts, "submitUptimeProof", validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.SubmitUptimeProof(&_IPoSValidatorManager.TransactOpts, validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_IPoSValidatorManager *IPoSValidatorManagerTransactorSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _IPoSValidatorManager.Contract.SubmitUptimeProof(&_IPoSValidatorManager.TransactOpts, validationID, messageIndex) +} + +// IPoSValidatorManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegationEndedIterator struct { + Event *IPoSValidatorManagerDelegationEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerDelegationEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegationEnded) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegationEnded) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerDelegationEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerDelegationEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerDelegationEnded represents a DelegationEnded event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegationEnded struct { + DelegationID [32]byte + ValidationID [32]byte + Rewards *big.Int + Fees *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*IPoSValidatorManagerDelegationEndedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerDelegationEndedIterator{contract: _IPoSValidatorManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil +} + +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerDelegationEnded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegationEnded", 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 +} + +// ParseDelegationEnded is a log parse operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseDelegationEnded(log types.Log) (*IPoSValidatorManagerDelegationEnded, error) { + event := new(IPoSValidatorManagerDelegationEnded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorAddedIterator struct { + Event *IPoSValidatorManagerDelegatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerDelegatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorAdded) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorAdded) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerDelegatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerDelegatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerDelegatorAdded represents a DelegatorAdded event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorAdded struct { + DelegationID [32]byte + ValidationID [32]byte + DelegatorAddress common.Address + Nonce uint64 + ValidatorWeight uint64 + DelegatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*IPoSValidatorManagerDelegatorAddedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerDelegatorAddedIterator{contract: _IPoSValidatorManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil +} + +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerDelegatorAdded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorAdded", 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 +} + +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseDelegatorAdded(log types.Log) (*IPoSValidatorManagerDelegatorAdded, error) { + event := new(IPoSValidatorManagerDelegatorAdded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorRegisteredIterator struct { + Event *IPoSValidatorManagerDelegatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerDelegatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorRegistered) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorRegistered) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerDelegatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerDelegatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerDelegatorRegistered represents a DelegatorRegistered event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorRegistered struct { + DelegationID [32]byte + ValidationID [32]byte + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*IPoSValidatorManagerDelegatorRegisteredIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerDelegatorRegisteredIterator{contract: _IPoSValidatorManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerDelegatorRegistered) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorRegistered", 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 +} + +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseDelegatorRegistered(log types.Log) (*IPoSValidatorManagerDelegatorRegistered, error) { + event := new(IPoSValidatorManagerDelegatorRegistered) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorRemovalInitializedIterator struct { + Event *IPoSValidatorManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerDelegatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorRemovalInitialized) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerDelegatorRemovalInitialized) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerDelegatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerDelegatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerDelegatorRemovalInitialized struct { + DelegationID [32]byte + ValidationID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*IPoSValidatorManagerDelegatorRemovalInitializedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerDelegatorRemovalInitializedIterator{contract: _IPoSValidatorManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerDelegatorRemovalInitialized) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", 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 +} + +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*IPoSValidatorManagerDelegatorRemovalInitialized, error) { + event := new(IPoSValidatorManagerDelegatorRemovalInitialized) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerInitialValidatorCreatedIterator struct { + Event *IPoSValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerInitialValidatorCreated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerInitialValidatorCreated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID common.Hash + Weight uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*IPoSValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerInitialValidatorCreatedIterator{contract: _IPoSValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerInitialValidatorCreated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", 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 +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*IPoSValidatorManagerInitialValidatorCreated, error) { + event := new(IPoSValidatorManagerInitialValidatorCreated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerUptimeUpdatedIterator is returned from FilterUptimeUpdated and is used to iterate over the raw logs and unpacked data for UptimeUpdated events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerUptimeUpdatedIterator struct { + Event *IPoSValidatorManagerUptimeUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerUptimeUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerUptimeUpdated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerUptimeUpdated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerUptimeUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerUptimeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerUptimeUpdated represents a UptimeUpdated event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerUptimeUpdated struct { + ValidationID [32]byte + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUptimeUpdated is a free log retrieval operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*IPoSValidatorManagerUptimeUpdatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerUptimeUpdatedIterator{contract: _IPoSValidatorManager.contract, event: "UptimeUpdated", logs: logs, sub: sub}, nil +} + +// WatchUptimeUpdated is a free log subscription operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchUptimeUpdated(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerUptimeUpdated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "UptimeUpdated", 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 +} + +// ParseUptimeUpdated is a log parse operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseUptimeUpdated(log types.Log) (*IPoSValidatorManagerUptimeUpdated, error) { + event := new(IPoSValidatorManagerUptimeUpdated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "UptimeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodCreatedIterator struct { + Event *IPoSValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodCreated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodCreated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID common.Hash + RegisterValidationMessageID [32]byte + Weight uint64 + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*IPoSValidatorManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerValidationPeriodCreatedIterator{contract: _IPoSValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerValidationPeriodCreated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", 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 +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*IPoSValidatorManagerValidationPeriodCreated, error) { + event := new(IPoSValidatorManagerValidationPeriodCreated) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodEndedIterator struct { + Event *IPoSValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodEnded) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodEnded) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*IPoSValidatorManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerValidationPeriodEndedIterator{contract: _IPoSValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerValidationPeriodEnded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", 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 +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*IPoSValidatorManagerValidationPeriodEnded, error) { + event := new(IPoSValidatorManagerValidationPeriodEnded) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodRegisteredIterator struct { + Event *IPoSValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodRegistered) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidationPeriodRegistered) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight uint64 + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*IPoSValidatorManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerValidationPeriodRegisteredIterator{contract: _IPoSValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerValidationPeriodRegistered) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", 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 +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*IPoSValidatorManagerValidationPeriodRegistered, error) { + event := new(IPoSValidatorManagerValidationPeriodRegistered) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidatorRemovalInitializedIterator struct { + Event *IPoSValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidatorRemovalInitialized) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidatorRemovalInitialized) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight uint64 + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*IPoSValidatorManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerValidatorRemovalInitializedIterator{contract: _IPoSValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerValidatorRemovalInitialized) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", 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 +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*IPoSValidatorManagerValidatorRemovalInitialized, error) { + event := new(IPoSValidatorManagerValidatorRemovalInitialized) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IPoSValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidatorWeightUpdateIterator struct { + Event *IPoSValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IPoSValidatorManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidatorWeightUpdate) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IPoSValidatorManagerValidatorWeightUpdate) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IPoSValidatorManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IPoSValidatorManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IPoSValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the IPoSValidatorManager contract. +type IPoSValidatorManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + Weight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*IPoSValidatorManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &IPoSValidatorManagerValidatorWeightUpdateIterator{contract: _IPoSValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *IPoSValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _IPoSValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IPoSValidatorManagerValidatorWeightUpdate) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", 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 +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IPoSValidatorManager *IPoSValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*IPoSValidatorManagerValidatorWeightUpdate, error) { + event := new(IPoSValidatorManagerValidatorWeightUpdate) + if err := _IPoSValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go b/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go new file mode 100644 index 000000000..82b2cc7aa --- /dev/null +++ b/abi-bindings/go/validator-manager/interfaces/IValidatorManager/IValidatorManager.go @@ -0,0 +1,1228 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ivalidatormanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConversionData is an auto generated low-level Go binding around an user-defined struct. +type ConversionData struct { + L1ID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID []byte + BlsPublicKey []byte + Weight uint64 +} + +// IValidatorManagerMetaData contains all meta data concerning the IValidatorManager contract. +var IValidatorManagerMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messsageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", +} + +// IValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use IValidatorManagerMetaData.ABI instead. +var IValidatorManagerABI = IValidatorManagerMetaData.ABI + +// IValidatorManager is an auto generated Go binding around an Ethereum contract. +type IValidatorManager struct { + IValidatorManagerCaller // Read-only binding to the contract + IValidatorManagerTransactor // Write-only binding to the contract + IValidatorManagerFilterer // Log filterer for contract events +} + +// IValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type IValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type IValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IValidatorManagerSession struct { + Contract *IValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IValidatorManagerCallerSession struct { + Contract *IValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IValidatorManagerTransactorSession struct { + Contract *IValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type IValidatorManagerRaw struct { + Contract *IValidatorManager // Generic contract binding to access the raw methods on +} + +// IValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IValidatorManagerCallerRaw struct { + Contract *IValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// IValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IValidatorManagerTransactorRaw struct { + Contract *IValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewIValidatorManager creates a new instance of IValidatorManager, bound to a specific deployed contract. +func NewIValidatorManager(address common.Address, backend bind.ContractBackend) (*IValidatorManager, error) { + contract, err := bindIValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IValidatorManager{IValidatorManagerCaller: IValidatorManagerCaller{contract: contract}, IValidatorManagerTransactor: IValidatorManagerTransactor{contract: contract}, IValidatorManagerFilterer: IValidatorManagerFilterer{contract: contract}}, nil +} + +// NewIValidatorManagerCaller creates a new read-only instance of IValidatorManager, bound to a specific deployed contract. +func NewIValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*IValidatorManagerCaller, error) { + contract, err := bindIValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IValidatorManagerCaller{contract: contract}, nil +} + +// NewIValidatorManagerTransactor creates a new write-only instance of IValidatorManager, bound to a specific deployed contract. +func NewIValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IValidatorManagerTransactor, error) { + contract, err := bindIValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IValidatorManagerTransactor{contract: contract}, nil +} + +// NewIValidatorManagerFilterer creates a new log filterer instance of IValidatorManager, bound to a specific deployed contract. +func NewIValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IValidatorManagerFilterer, error) { + contract, err := bindIValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IValidatorManagerFilterer{contract: contract}, nil +} + +// bindIValidatorManager binds a generic wrapper to an already deployed contract. +func bindIValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IValidatorManager *IValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IValidatorManager.Contract.IValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IValidatorManager *IValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IValidatorManager.Contract.IValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IValidatorManager *IValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IValidatorManager.Contract.IValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IValidatorManager *IValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IValidatorManager *IValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IValidatorManager *IValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.CompleteEndValidation(&_IValidatorManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.CompleteEndValidation(&_IValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.CompleteValidatorRegistration(&_IValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.CompleteValidatorRegistration(&_IValidatorManager.TransactOpts, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.contract.Transact(opts, "initializeValidatorSet", conversionData, messsageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IValidatorManager *IValidatorManagerSession) InitializeValidatorSet(conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.InitializeValidatorSet(&_IValidatorManager.TransactOpts, conversionData, messsageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messsageIndex) returns() +func (_IValidatorManager *IValidatorManagerTransactorSession) InitializeValidatorSet(conversionData ConversionData, messsageIndex uint32) (*types.Transaction, error) { + return _IValidatorManager.Contract.InitializeValidatorSet(&_IValidatorManager.TransactOpts, conversionData, messsageIndex) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.Contract.ResendEndValidatorMessage(&_IValidatorManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.Contract.ResendEndValidatorMessage(&_IValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.Contract.ResendRegisterValidatorMessage(&_IValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_IValidatorManager *IValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _IValidatorManager.Contract.ResendRegisterValidatorMessage(&_IValidatorManager.TransactOpts, validationID) +} + +// IValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the IValidatorManager contract. +type IValidatorManagerInitialValidatorCreatedIterator struct { + Event *IValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerInitialValidatorCreated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerInitialValidatorCreated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the IValidatorManager contract. +type IValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID common.Hash + Weight uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IValidatorManager *IValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*IValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &IValidatorManagerInitialValidatorCreatedIterator{contract: _IValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IValidatorManager *IValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *IValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerInitialValidatorCreated) + if err := _IValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", 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 +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_IValidatorManager *IValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*IValidatorManagerInitialValidatorCreated, error) { + event := new(IValidatorManagerInitialValidatorCreated) + if err := _IValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodCreatedIterator struct { + Event *IValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodCreated) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodCreated) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID common.Hash + RegisterValidationMessageID [32]byte + Weight uint64 + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IValidatorManager *IValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*IValidatorManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &IValidatorManagerValidationPeriodCreatedIterator{contract: _IValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IValidatorManager *IValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *IValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerValidationPeriodCreated) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", 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 +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_IValidatorManager *IValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*IValidatorManagerValidationPeriodCreated, error) { + event := new(IValidatorManagerValidationPeriodCreated) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodEndedIterator struct { + Event *IValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodEnded) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodEnded) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IValidatorManager *IValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*IValidatorManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &IValidatorManagerValidationPeriodEndedIterator{contract: _IValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IValidatorManager *IValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *IValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerValidationPeriodEnded) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", 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 +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_IValidatorManager *IValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*IValidatorManagerValidationPeriodEnded, error) { + event := new(IValidatorManagerValidationPeriodEnded) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodRegisteredIterator struct { + Event *IValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodRegistered) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidationPeriodRegistered) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the IValidatorManager contract. +type IValidatorManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight uint64 + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IValidatorManager *IValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*IValidatorManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &IValidatorManagerValidationPeriodRegisteredIterator{contract: _IValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IValidatorManager *IValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *IValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerValidationPeriodRegistered) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", 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 +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_IValidatorManager *IValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*IValidatorManagerValidationPeriodRegistered, error) { + event := new(IValidatorManagerValidationPeriodRegistered) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the IValidatorManager contract. +type IValidatorManagerValidatorRemovalInitializedIterator struct { + Event *IValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidatorRemovalInitialized) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidatorRemovalInitialized) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the IValidatorManager contract. +type IValidatorManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight uint64 + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IValidatorManager *IValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*IValidatorManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &IValidatorManagerValidatorRemovalInitializedIterator{contract: _IValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IValidatorManager *IValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *IValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerValidatorRemovalInitialized) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", 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 +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_IValidatorManager *IValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*IValidatorManagerValidatorRemovalInitialized, error) { + event := new(IValidatorManagerValidatorRemovalInitialized) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the IValidatorManager contract. +type IValidatorManagerValidatorWeightUpdateIterator struct { + Event *IValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IValidatorManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidatorWeightUpdate) + 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 + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IValidatorManagerValidatorWeightUpdate) + 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() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IValidatorManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IValidatorManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the IValidatorManager contract. +type IValidatorManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + Weight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IValidatorManager *IValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*IValidatorManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _IValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &IValidatorManagerValidatorWeightUpdateIterator{contract: _IValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IValidatorManager *IValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *IValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _IValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IValidatorManagerValidatorWeightUpdate) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", 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 +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_IValidatorManager *IValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*IValidatorManagerValidatorWeightUpdate, error) { + event := new(IValidatorManagerValidatorWeightUpdate) + if err := _IValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/README.md b/contracts/README.md index 121d71e29..12d85f932 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -10,3 +10,10 @@ This directory is set up as a [Foundry](https://github.com/foundry-rs/foundry) p ## Generate documentation - Documentation can be generated by running `forge doc --build` from this repository. By default, this will generate documentation to `contracts/docs/`, and an HTML book to `contracts/docs/book/`. It's also possible to serve this book locally by running `forge doc --serve `. + +## Audits + +In general, the contracts in this repository have been audited. Any unaudited contracts will be explicitly marked as such. Note that the `main` branch may contain unaudited code. Please check [here](../audits/README.md) for which versions of each contract have been audited. + +> [!CAUTION] +> DO NOT USE UN-AUDITED CODE IN PRODUCTION! \ No newline at end of file diff --git a/contracts/ictt/README.md b/contracts/ictt/README.md index 5925dbc82..464943bb9 100644 --- a/contracts/ictt/README.md +++ b/contracts/ictt/README.md @@ -19,13 +19,6 @@ The token transferrer also supports "multi-hop" transfers, where tokens can be t In addition to supporting basic token transfers, the token transferrer contracts offer a `sendAndCall` interface for transferring tokens and using them in a smart contract interaction all within a single ICM message. If the call to the recipient smart contract fails, the transferred tokens are sent to a fallback recipient address on the destination chain of the transfer. The `sendAndCall` interface enables the direct use of transferred tokens in dApps on other chains, such as performing swaps, using the tokens to pay for fees when invoking services, etc. -A breakdown of the structure of the contracts that implement this function can be found under `./contracts` [here](./contracts/README.md). - -## Audits - -Some contracts in this repository have been audited. The `main` branch may contain unaudited code. Please check [here](./audits/README.md) for which versions of each contract have been audited. -DO NOT USE UN-AUDITED CODE IN PRODUCTION! - ## Upgradability The token transferrer contracts implement both upgradeable and non-upgradeable versions. The non-upgradeable versions are extensions of their respective upgradeable token transferrer contract, and has a `constructor` that calls the `initialize` function of the upgradeable version. The upgradeable contracts are ERC7201 compliant, and use namespace storage to store the state of the contract. diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index 64e7fff2a..a5e6af656 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -119,6 +119,13 @@ contract ERC20TokenStakingManager is return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } + /** + * @notice Returns the ERC20 token being staked + */ + function erc20() external view returns (IERC20Mintable) { + return _getERC20StakingManagerStorage()._token; + } + /** * @notice See {PoSValidatorManager-_lock} * Note: Must be guarded with reentrancy guard for safe transfer from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 1388ffc86..c4a3752d9 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -289,11 +289,7 @@ abstract contract PoSValidatorManager is revert UnauthorizedOwner(_msgSender()); } - if (rewardRecipient == _msgSender()) { - delete $._rewardRecipients[validationID]; - } else { - $._rewardRecipients[validationID] = rewardRecipient; - } + $._rewardRecipients[validationID] = rewardRecipient; } function changeDelegatorRewardRecipient( @@ -310,11 +306,7 @@ abstract contract PoSValidatorManager is revert UnauthorizedOwner(_msgSender()); } - if (rewardRecipient == _msgSender()) { - delete $._delegatorRewardRecipients[delegationID]; - } else { - $._delegatorRewardRecipients[delegationID] = rewardRecipient; - } + $._delegatorRewardRecipients[delegationID] = rewardRecipient; } /** @@ -365,12 +357,14 @@ abstract contract PoSValidatorManager is stakingEndTime: validator.endedAt, uptimeSeconds: uptimeSeconds }); - $._redeemableValidatorRewards[validationID] += reward; - if (rewardRecipient != address(0)) { - $._rewardRecipients[validationID] = rewardRecipient; + if (rewardRecipient == address(0)) { + rewardRecipient = $._posValidatorInfo[validationID].owner; } + $._redeemableValidatorRewards[validationID] += reward; + $._rewardRecipients[validationID] = rewardRecipient; + return (reward > 0); } @@ -389,13 +383,12 @@ abstract contract PoSValidatorManager is } address owner = $._posValidatorInfo[validationID].owner; - address rewardRecipient = $._rewardRecipients[validationID]; + delete $._rewardRecipients[validationID]; + // the reward-recipient should always be set, but just in case it isn't, we won't burn the reward if (rewardRecipient == address(0)) { rewardRecipient = owner; - } else { - delete $._rewardRecipients[validationID]; } // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. @@ -479,10 +472,14 @@ abstract contract PoSValidatorManager is uint64 weight = valueToWeight(lockedValue); bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); - $._posValidatorInfo[validationID].owner = _msgSender(); + address owner = _msgSender(); + + $._posValidatorInfo[validationID].owner = owner; $._posValidatorInfo[validationID].delegationFeeBips = delegationFeeBips; $._posValidatorInfo[validationID].minStakeDuration = minStakeDuration; $._posValidatorInfo[validationID].uptimeSeconds = 0; + $._rewardRecipients[validationID] = owner; + return validationID; } @@ -782,6 +779,7 @@ abstract contract PoSValidatorManager is } else if (validator.status == ValidatorStatus.Active) { delegationEndTime = uint64(block.timestamp); } else { + // Should be unreachable. revert InvalidValidatorStatus(validator.status); } @@ -798,12 +796,13 @@ abstract contract PoSValidatorManager is uptimeSeconds: $._posValidatorInfo[delegator.validationID].uptimeSeconds }); - $._redeemableDelegatorRewards[delegationID] = reward; - - if (rewardRecipient != address(0)) { - $._delegatorRewardRecipients[delegationID] = rewardRecipient; + if (rewardRecipient == address(0)) { + rewardRecipient = delegator.owner; } + $._redeemableDelegatorRewards[delegationID] = reward; + $._delegatorRewardRecipients[delegationID] = rewardRecipient; + return reward; } @@ -824,6 +823,7 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(delegator.validationID); if (validator.messageNonce == 0) { + // Should be unreachable. revert InvalidDelegationID(delegationID); } @@ -890,11 +890,10 @@ abstract contract PoSValidatorManager is delete $._delegatorStakes[delegationID]; address rewardRecipient = $._delegatorRewardRecipients[delegationID]; + delete $._delegatorRewardRecipients[delegationID]; if (rewardRecipient == address(0)) { rewardRecipient = delegator.owner; - } else { - delete $._delegatorRewardRecipients[delegationID]; } (uint256 delegationRewards, uint256 validatorFees) = diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 8a4a54cc9..91b7658fc 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -1,8 +1,5 @@ # Validator Manager Contract -> [!CAUTION] -> The contracts in this directory are still under active development, are unaudited, and should not be used in production. - The contracts in this directory define the Validator Manager used to manage Avalanche L1 validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). `ValidatorManager.sol` is the top-level abstract contract that provides the basic functionality. The other contracts are related as follows: ```mermaid diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 689c0f99b..2ed3ceecd 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -75,7 +75,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error InvalidBLSKeyLength(uint256 length); error InvalidNodeID(bytes nodeID); error InvalidConversionID(bytes32 encodedConversionID, bytes32 expectedConversionID); - error InvalidTotalWeight(uint256 weight); + error InvalidTotalWeight(uint64 weight); error InvalidValidationID(bytes32 validationID); error InvalidValidatorStatus(ValidatorStatus status); error InvalidWarpMessage(); @@ -160,7 +160,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint256 numInitialValidators = conversionData.initialValidators.length; - uint256 totalWeight; + uint64 totalWeight; for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = conversionData.initialValidators[i]; if ($._registeredValidators[initialValidator.nodeID] != bytes32(0)) { @@ -246,6 +246,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidRegistrationExpiry(input.registrationExpiry); } + // Ensure the new validator doesn't overflow the total weight + if (uint256(weight) + uint256($._churnTracker.totalWeight) > type(uint64).max) { + revert InvalidTotalWeight(weight); + } + _validatePChainOwner(input.remainingBalanceOwner); _validatePChainOwner(input.disableOwner); @@ -520,7 +525,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida emit ValidatorWeightUpdate({ validationID: validationID, nonce: nonce, - validatorWeight: newWeight, + weight: newWeight, setWeightMessageID: messageID }); diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index b54b51e38..ef06f022d 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -152,7 +152,7 @@ library ValidatorMessages { * @param conversionData The struct representing data to pack into the message. * @return The packed message. */ - function packConversionData(ConversionData calldata conversionData) + function packConversionData(ConversionData memory conversionData) external pure returns (bytes memory) diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 53304dccd..841f7d362 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -153,7 +153,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice See {IPoSValidatorManager-initializeEndValidation} for details of the first three parameters - * @param recipientAddress The address to receive the rewards + * @param recipientAddress The address to receive the rewards. If the 0-address is provided, the rewards will be sent to the validator. */ function initializeEndValidation( bytes32 validationID, @@ -226,7 +226,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice See {IPoSValidatorManager-initializeEndDelegation} for details of the first three parameters - * @param recipientAddress The address to receive the rewards. + * @param recipientAddress The address to receive the rewards. If the 0-address is provided, the rewards will be sent to the delegator. */ function initializeEndDelegation( bytes32 delegationID, diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index b568cd82d..5e0304ea3 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -44,8 +44,8 @@ struct Validator { */ struct ValidatorChurnPeriod { uint256 startedAt; - uint256 initialWeight; - uint256 totalWeight; + uint64 initialWeight; + uint64 totalWeight; uint64 churnAmount; } @@ -114,12 +114,12 @@ interface IValidatorManager { bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, - uint256 weight, + uint64 weight, uint64 registrationExpiry ); event InitialValidatorCreated( - bytes32 indexed validationID, bytes indexed nodeID, uint256 weight + bytes32 indexed validationID, bytes indexed nodeID, uint64 weight ); /** @@ -130,7 +130,7 @@ interface IValidatorManager { * @param timestamp The time at which the validation period was registered with the contract. */ event ValidationPeriodRegistered( - bytes32 indexed validationID, uint256 weight, uint256 timestamp + bytes32 indexed validationID, uint64 weight, uint256 timestamp ); /** @@ -145,7 +145,7 @@ interface IValidatorManager { event ValidatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - uint256 weight, + uint64 weight, uint256 endTime ); @@ -161,13 +161,13 @@ interface IValidatorManager { * @notice Event emitted when validator weight is updated. * @param validationID The ID of the validation period being updated * @param nonce The message nonce used to update the validator weight - * @param validatorWeight The updated validator weight that is sent to the P-Chain + * @param weight The updated validator weight that is sent to the P-Chain * @param setWeightMessageID The ID of the ICM message that updates the validator's weight on the P-Chain */ event ValidatorWeightUpdate( bytes32 indexed validationID, uint64 indexed nonce, - uint64 validatorWeight, + uint64 weight, bytes32 setWeightMessageID ); diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 95ad503aa..013398a6c 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -7,20 +7,15 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; -import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {PoSValidatorManager, PoSValidatorManagerSettings} from "../PoSValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; -import { - ValidatorManagerSettings, - ValidatorRegistrationInput, - IValidatorManager -} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { @@ -38,29 +33,31 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initializeValidatorSet(_defaultConversionData(), 0); } + function testDisableInitialization() public { + app = new ERC20TokenStakingManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + app.initialize(_defaultPoSSettings(), token); + } + + function testZeroTokenAddress() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert( + abi.encodeWithSelector( + ERC20TokenStakingManager.InvalidTokenAddress.selector, address(0) + ) + ); + app.initialize(_defaultPoSSettings(), IERC20Mintable(address(0))); + } + function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: 0, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumDelegationFeeBips = 0; + app.initialize(defaultPoSSettings, token); } function testMaxMinimumDelegationFee() public { @@ -71,24 +68,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: minimumDelegationFeeBips, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; + app.initialize(defaultPoSSettings, token); } function testInvalidStakeAmountRange() public { @@ -98,24 +81,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; + defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; + app.initialize(defaultPoSSettings, token); } function testZeroMaxStakeMultiplier() public { @@ -123,52 +93,24 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: 0, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.maximumStakeMultiplier = 0; + app.initialize(defaultPoSSettings, token); } function testMinStakeDurationTooLow() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - uint64 minStakeDuration = DEFAULT_CHURN_PERIOD - 1; + uint64 minimumStakeDuration = DEFAULT_CHURN_PERIOD - 1; vm.expectRevert( abi.encodeWithSelector( - PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration + PoSValidatorManager.InvalidMinStakeDuration.selector, minimumStakeDuration ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: minStakeDuration, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumStakeDuration = minimumStakeDuration; + app.initialize(defaultPoSSettings, token); } function testMaxStakeMultiplierOverLimit() public { @@ -179,24 +121,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: maximumStakeMultiplier, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; + app.initialize(defaultPoSSettings, token); } function testZeroWeightToValueFactor() public { @@ -204,24 +132,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: 0, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.weightToValueFactor = 0; + app.initialize(defaultPoSSettings, token); } function testInvalidValidatorMinStakeDuration() public { @@ -309,24 +223,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: rewardCalculator, - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }), - token - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.rewardCalculator = rewardCalculator; + app.initialize(defaultPoSSettings, token); + validatorManager = app; posValidatorManager = app; diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 9e4c56563..c1c80fcbb 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -8,19 +8,14 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import {PoSValidatorManager} from "../PoSValidatorManager.sol"; -import { - ValidatorManagerSettings, - ValidatorRegistrationInput, - IValidatorManager -} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {PoSValidatorManager, PoSValidatorManagerSettings} from "../PoSValidatorManager.sol"; +import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {INativeMinter} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { NativeTokenStakingManager public app; @@ -34,28 +29,22 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initializeValidatorSet(_defaultConversionData(), 0); } + function testDisableInitialization() public { + app = new NativeTokenStakingManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + + app.initialize(_defaultPoSSettings()); + } + function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: 0, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumDelegationFeeBips = 0; + app.initialize(defaultPoSSettings); } function testMaxMinimumDelegationFee() public { @@ -66,23 +55,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: minimumDelegationFeeBips, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; + app.initialize(defaultPoSSettings); } function testInvalidStakeAmountRange() public { @@ -92,23 +68,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; + defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; + app.initialize(defaultPoSSettings); } function testZeroMaxStakeMultiplier() public { @@ -116,23 +80,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: 0, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.maximumStakeMultiplier = 0; + app.initialize(defaultPoSSettings); } function testMaxStakeMultiplierOverLimit() public { @@ -143,23 +94,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: maximumStakeMultiplier, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; + app.initialize(defaultPoSSettings); } function testZeroWeightToValueFactor() public { @@ -167,23 +105,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: 0, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.weightToValueFactor = 0; + app.initialize(defaultPoSSettings); } function testMinStakeDurationTooLow() public { @@ -194,23 +119,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: minStakeDuration, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.minimumStakeDuration = minStakeDuration; + app.initialize(defaultPoSSettings); } // Helpers @@ -267,23 +179,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // Construct the object under test app = new TestableNativeTokenStakingManager(ICMInitializable.Allowed); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - l1ID: DEFAULT_L1_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: rewardCalculator, - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }) - ); + + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); + defaultPoSSettings.rewardCalculator = rewardCalculator; + app.initialize(defaultPoSSettings); + validatorManager = app; posValidatorManager = app; return app; diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index 1432dcc54..0469fa359 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -5,17 +5,18 @@ pragma solidity 0.8.25; -import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoAValidatorManager} from "../PoAValidatorManager.sol"; -import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import { ValidatorManagerSettings, ValidatorRegistrationInput, IValidatorManager } from "../interfaces/IValidatorManager.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; +import {ValidatorManager} from "../ValidatorManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; -import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; contract PoAValidatorManagerTest is ValidatorManagerTest { PoAValidatorManager public app; @@ -31,6 +32,19 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app.initializeValidatorSet(_defaultConversionData(), 0); } + function testDisableInitialization() public { + app = new PoAValidatorManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + app.initialize( + ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + address(this) + ); + } + function testInvalidOwnerRegistration() public { vm.prank(vm.addr(1)); vm.expectRevert( @@ -50,6 +64,28 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { ); } + // This test applies to all ValidatorManagers, but we test it here to avoid + // having to source UINT64MAX funds for PoSValidatorManagers. + function testTotalWeightOverflow() public { + uint64 weight = type(uint64).max; + + bytes memory nodeID = _newNodeID(); + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidTotalWeight.selector, weight) + ); + + _initializeValidatorRegistration( + ValidatorRegistrationInput({ + nodeID: nodeID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: DEFAULT_EXPIRY + }), + weight + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index a3f96a8c1..933566045 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -8,13 +8,20 @@ pragma solidity 0.8.25; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import { + DelegatorStatus, PoSValidatorManagerSettings +} from "../interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "../ValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput, + ValidatorStatus +} from "../interfaces/IValidatorManager.sol"; +import {ValidatorMessages} from "../ValidatorMessages.sol"; import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -40,6 +47,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; IRewardCalculator public rewardCalculator; + ValidatorRegistrationInput public defaultRegistrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationExpiry: DEFAULT_EXPIRY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER + }); + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); event DelegatorAdded( @@ -61,7 +76,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidatorWeightUpdate( bytes32 indexed validationID, uint64 indexed nonce, - uint64 validatorWeight, + uint64 weight, bytes32 setWeightMessageID ); @@ -72,13 +87,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); function testDelegationFeeBipsTooLow() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidDelegationFee.selector, @@ -86,7 +94,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -94,13 +102,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testDelegationFeeBipsTooHigh() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; vm.expectRevert( abi.encodeWithSelector( @@ -109,7 +110,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, delegationFeeBips, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -117,13 +118,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidMinStakeDuration() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidMinStakeDuration.selector, @@ -131,7 +125,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -139,20 +133,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testStakeAmountTooLow() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 @@ -160,20 +147,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testStakeAmountTooHigh() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 @@ -195,7 +175,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); _mockGetUptimeWarpMessage(new bytes(0), false); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert(ValidatorManager.InvalidWarpMessage.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -219,7 +199,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector( ValidatorManager.InvalidWarpOriginSenderAddress.selector, address(this) @@ -247,7 +227,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, validationID) ); @@ -593,44 +573,67 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - _initializeEndDelegationValidatorActiveWithChecks({ - validationID: validationID, + _completeDefaultDelegator(validationID, delegationID); + } + + function testClaimDelegationFeesInvalidValidatorStatus() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _completeDefaultDelegator(validationID, delegationID); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.Active + ) + ); + + posValidatorManager.claimDelegationFees(validationID); + } + + function testClaimDelegationFeesInvalidSender() public { + bytes32 validationID = _registerDefaultValidator(); + _registerDefaultDelegator(validationID); + + _endDefaultValidatorWithChecks(validationID, 2); + + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.UnauthorizedOwner.selector, address(123)) + ); + + vm.prank(address(123)); + posValidatorManager.claimDelegationFees(validationID); + } + + function testClaimDelegationFees() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + address rewardRecipient = address(42); + + _endDefaultValidatorWithChecks(validationID, 2); + + // Validator is Completed, so this will also complete the delegation. + _initializeEndDelegation({ sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2, includeUptime: true, force: false, - rewardRecipient: address(0) + rewardRecipient: rewardRecipient }); uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); - uint256 expectedValidatorFees = - _calculateValidatorFeesFromDelegator(expectedTotalReward, DEFAULT_DELEGATION_FEE_BIPS); - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; - address delegator = DEFAULT_DELEGATOR_ADDRESS; - - _completeEndDelegationWithChecks({ - validationID: validationID, - delegationID: delegationID, - delegator: delegator, - delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedValidatorFees: expectedValidatorFees, - expectedDelegatorReward: expectedDelegatorReward, - validatorWeight: DEFAULT_WEIGHT, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2, - rewardRecipient: delegator - }); + _expectRewardIssuance( + address(this), expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000 + ); + posValidatorManager.claimDelegationFees(validationID); } function testCompleteEndDelegationWithNonDelegatorRewardRecipient() public { @@ -874,15 +877,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); - uint64 validatorEndTime = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; bytes memory setWeightMessage = ValidatorMessages.packL1ValidatorWeightMessage(validationID, 2, 0); bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( - validationID, validatorEndTime - DEFAULT_REGISTRATION_TIMESTAMP + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP ); _initializeEndValidation({ validationID: validationID, - completionTimestamp: validatorEndTime, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, setWeightMessage: setWeightMessage, includeUptime: true, uptimeMessage: uptimeMessage, @@ -892,7 +894,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteDelegatorRegistrationWithChecks( validationID, delegationID, - validatorEndTime + 1, + DEFAULT_COMPLETION_TIMESTAMP + 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); @@ -991,7 +993,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testInitializeDelegatorRegistrationValidatorCompleted() public { bytes32 validationID = _registerDefaultValidator(); - _endDefaultValidator(validationID, 1); + _endDefaultValidatorWithChecks(validationID, 1); _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); @@ -1010,7 +1012,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); - _endDefaultValidator(validationID, 2); + _endDefaultValidatorWithChecks(validationID, 2); // completeDelegatorRegistration should fall through to _completeEndDelegation and refund the stake vm.expectEmit(true, true, true, true, address(validatorManager)); @@ -1034,7 +1036,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - _endDefaultValidator(validationID, 2); + _endDefaultValidatorWithChecks(validationID, 2); uint64 delegationEndTime = DEFAULT_COMPLETION_TIMESTAMP + 1; @@ -1088,17 +1090,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { rewardRecipient: address(0) }); - _endDefaultValidator(validationID, 3); + _endDefaultValidatorWithChecks(validationID, 3); - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP - }); + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); - uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedValidatorFees = (expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS) / 10000; uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -1233,13 +1229,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { rewardRecipient: address(0) }); - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP - }); + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); uint256 expectedValidatorFees = _calculateValidatorFeesFromDelegator(expectedTotalReward, DEFAULT_DELEGATION_FEE_BIPS); @@ -1500,8 +1490,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit an uptime proof via submitUptime uint64 uptimePercentage1 = 80; - uint64 uptime1 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) - * uptimePercentage1 / 100; + uint64 uptime1 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 + ) / 100; bytes memory uptimeMsg1 = ValidatorMessages.packValidationUptimeMessage(validationID, uptime1); _mockGetUptimeWarpMessage(uptimeMsg1, true); @@ -1513,8 +1504,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit a second uptime proof via initializeEndValidation. This one is not sufficient for rewards // Submit an uptime proof via submitUptime uint64 uptimePercentage2 = 79; - uint64 uptime2 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) - * uptimePercentage2 / 100; + uint64 uptime2 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage2 + ) / 100; bytes memory uptimeMsg2 = ValidatorMessages.packValidationUptimeMessage(validationID, uptime2); _mockGetUptimeWarpMessage(uptimeMsg2, true); @@ -1527,6 +1519,35 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation(validationID, true, address(0)); } + function testInitializeEndValidationWithoutNewUptime() public { + bytes32 validationID = _registerDefaultValidator(); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + + // Submit an uptime proof via submitUptime + uint64 uptimePercentage1 = 80; + uint64 uptime1 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 + ) / 100; + bytes memory uptimeMsg1 = + ValidatorMessages.packValidationUptimeMessage(validationID, uptime1); + _mockGetUptimeWarpMessage(uptimeMsg1, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit UptimeUpdated(validationID, uptime1); + posValidatorManager.submitUptimeProof(validationID, 0); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + + _initializeEndValidation(validationID, false, address(0)); + } + function testInitializeEndValidationInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 79; @@ -1538,7 +1559,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, - (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ((DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage) + / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); @@ -1551,19 +1573,288 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation(validationID, true, address(0)); } - function testInitializeEndValidationPoAValidator() public { + function testSubmitUptimeProofPoaValidator() public { bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_L1_ID, uint32(1))); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorNotPoS.selector, defaultInitialValidationID + ) + ); + posValidatorManager.submitUptimeProof(defaultInitialValidationID, 0); + } + + function testSubmitUptimeProofInactiveValidator() public { + bytes32 validationID = _registerDefaultValidator(); + + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + ); + + _initializeEndValidation({ + validationID: validationID, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + setWeightMessage: setWeightMessage, + includeUptime: true, + uptimeMessage: uptimeMessage, + force: false + }); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); + posValidatorManager.submitUptimeProof(validationID, 0); + } + + function testEndValidationPoAValidator() public { + bytes32 validationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packL1ValidatorWeightMessage(defaultInitialValidationID, 1, 0); + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized( - defaultInitialValidationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + + _initializeEndValidation(validationID, false, address(0)); + + uint256 balanceBefore = _getStakeAssetBalance(address(this)); + + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + + posValidatorManager.completeEndValidation(0); + + assertEq(_getStakeAssetBalance(address(this)), balanceBefore); + } + + function testDelegationToPoAValidator() public { + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorNotPoS.selector, defaultInitialValidationID + ) + ); + + _initializeDelegatorRegistration( + defaultInitialValidationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT + ); + } + + function testDelegationOverWeightLimit() public { + bytes32 validationID = _registerDefaultValidator(); + + uint64 delegatorWeight = DEFAULT_WEIGHT * DEFAULT_MAXIMUM_STAKE_MULTIPLIER + 1; + + _beforeSend(_weightToValue(delegatorWeight), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MaxWeightExceeded.selector, delegatorWeight + DEFAULT_WEIGHT + ) + ); + + _initializeDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS, delegatorWeight); + } + + function testCompleteDelegatorRegistrationAlreadyRegistered() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) + ); + + posValidatorManager.completeDelegatorRegistration(delegationID, 0); + } + + function testCompleteDelegatorRegistrationWrongValidationID() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + bytes memory setValidatorWeightPayload = ValidatorMessages.packL1ValidatorWeightMessage( + delegationID, 2, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + ); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); + + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, validationID) + ); + + vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + posValidatorManager.completeDelegatorRegistration(delegationID, 0); + } + + function testCompleteEndDelegationWrongValidationID() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false, + rewardRecipient: address(this) + }); + + bytes memory setValidatorWeightPayload = + ValidatorMessages.packL1ValidatorWeightMessage(delegationID, 2, DEFAULT_WEIGHT); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); + + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, delegationID) + ); + + posValidatorManager.completeEndDelegation(delegationID, 0); + } + + function testInitializeEndDelegationNotRegistered() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.PendingAdded + ) + ); + + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testInitializeEndDelegationWrongSender() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.UnauthorizedOwner.selector, address(123)) + ); + + vm.prank(address(123)); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testCompleteDelegatorRegistrationForDelegatorRegisteredWhileValidatorPendingRemoved() + public + { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 2, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + ); + + _initializeEndValidation({ + validationID: validationID, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + setWeightMessage: setWeightMessage, + includeUptime: true, + uptimeMessage: uptimeMessage, + force: false + }); + + _setUpCompleteDelegatorRegistrationWithChecks( + validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 + ); + + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + }); + + _completeEndValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT, + rewardRecipient: address(this) + }); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1 + DEFAULT_MINIMUM_STAKE_DURATION); + _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testCompleteEndDelegationWhileActive() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) ); - _initializeEndValidation(defaultInitialValidationID, false, address(0)); + posValidatorManager.completeEndDelegation(delegationID, 0); + } + + function testCompleteDelegatorRegistrationValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 2, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + ); + + _initializeEndValidation({ + validationID: validationID, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + setWeightMessage: setWeightMessage, + includeUptime: true, + uptimeMessage: uptimeMessage, + force: false + }); + + _setUpCompleteDelegatorRegistrationWithChecks( + validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 + ); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); + + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + } + + function testResendEndDelegationWhileActive() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) + ); + + posValidatorManager.resendUpdateDelegation(delegationID); } function testForceInitializeEndValidation() public { @@ -1594,7 +1885,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, - (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ((DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage) + / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); @@ -1790,6 +2082,39 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function _completeDefaultDelegator(bytes32 validationID, bytes32 delegationID) internal { + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false, + rewardRecipient: address(this) + }); + + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); + uint256 expectedValidatorFees = + _calculateValidatorFeesFromDelegator(expectedTotalReward, DEFAULT_DELEGATION_FEE_BIPS); + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; + + _completeEndDelegationWithChecks({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedValidatorFees: expectedValidatorFees, + expectedDelegatorReward: expectedDelegatorReward, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + rewardRecipient: address(this) + }); + } + function _registerDelegator( bytes32 validationID, address delegatorAddress, @@ -1839,7 +2164,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit ValidatorWeightUpdate({ validationID: validationID, nonce: expectedNonce, - validatorWeight: expectedValidatorWeight, + weight: expectedValidatorWeight, setWeightMessageID: bytes32(0) }); @@ -1904,6 +2229,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } } + function _endDefaultValidatorWithChecks(bytes32 validationID, uint64 expectedNonce) internal { + _endValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + completeRegistrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + validatorWeight: DEFAULT_WEIGHT, + expectedNonce: expectedNonce, + rewardRecipient: address(this) + }); + } + function _endDefaultValidator(bytes32 validationID, uint64 expectedNonce) internal { address validatorOwner = address(this); _endValidationWithChecks({ @@ -2103,6 +2440,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _expectStakeUnlock(address account, uint256 amount) internal virtual; function _expectRewardIssuance(address account, uint256 amount) internal virtual; + function _defaultDelegatorExpectedTotalReward() internal view returns (uint256) { + return rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + }); + } + + function _defaultPoSSettings() internal pure returns (PoSValidatorManagerSettings memory) { + return PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, + rewardCalculator: IRewardCalculator(address(0)), + uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID + }); + } + function _calculateValidatorFeesFromDelegator( uint256 totalReward, uint64 delegationFeeBips diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 5f5e8cc8e..409e2a74f 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -42,6 +42,8 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_WEIGHT = 1e6; // Set the default weight to 1e10 to avoid churn issues uint64 public constant DEFAULT_INITIAL_VALIDATOR_WEIGHT = DEFAULT_WEIGHT * 1e4; + uint64 public constant DEFAULT_INITIAL_TOTAL_WEIGHT = + DEFAULT_INITIAL_VALIDATOR_WEIGHT + DEFAULT_WEIGHT; uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; @@ -64,18 +66,22 @@ abstract contract ValidatorManagerTest is Test { bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, - uint256 weight, + uint64 weight, uint64 registrationExpiry ); + event InitialValidatorCreated( + bytes32 indexed validationID, bytes indexed nodeID, uint64 weight + ); + event ValidationPeriodRegistered( - bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp + bytes32 indexed validationID, uint64 weight, uint256 timestamp ); event ValidatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - uint256 stakeAmount, + uint64 weight, uint256 endTime ); @@ -623,6 +629,14 @@ abstract contract ValidatorManagerTest is Test { weight: DEFAULT_WEIGHT, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); + + // Confirm the total initial weight + uint64 initialWeight; + for (uint256 i = 0; i < initialValidators.length; i++) { + initialWeight += initialValidators[i].weight; + } + assertEq(initialWeight, DEFAULT_INITIAL_TOTAL_WEIGHT); + return ConversionData({ l1ID: DEFAULT_L1_ID, validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index a3db54089..5bfc7d82b 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -7,13 +7,15 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {PChainOwner} from "../interfaces/IValidatorManager.sol"; +import {PChainOwner, ConversionData, InitialValidator} from "../interfaces/IValidatorManager.sol"; contract ValidatorMessagesTest is Test { bytes32 public constant DEFAULT_L1_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_NODE_ID = bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32 public constant DEFAULT_SUBNET_CONVERSION_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); @@ -23,13 +25,227 @@ contract ValidatorMessagesTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; // solhint-disable-next-line var-name-mixedcase PChainOwner public DEFAULT_P_CHAIN_OWNER; + address public constant DEFAULT_OWNER = 0x1234567812345678123456781234567812345678; function setUp() public { address[] memory addresses = new address[](1); - addresses[0] = 0x1234567812345678123456781234567812345678; + addresses[0] = DEFAULT_OWNER; DEFAULT_P_CHAIN_OWNER = PChainOwner({threshold: 1, addresses: addresses}); } + function testSubnetConversionMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 37, 38) + ); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked); + } + + function testSubnetConversionMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked2); + } + + function testSubnetConversionMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked3); + } + + function testRegisterSubnetValidatorMessageInvalidBLSKey() public { + vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); + // 47 bytes + bytes memory invalidBLSKey = bytes( + hex"3456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + ); + ValidatorMessages.packRegisterL1ValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: invalidBLSKey, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + } + + function testRegisterSubnetValidatorMessageInvalidInputLength() public { + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector( + ValidatorMessages.InvalidMessageLength.selector, uint32(193), uint32(194) + ) + ); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked); + } + + function testRegisterSubnetValidatorMessageInvalidCodecID() public { + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); + } + + function testRegisterSubnetValidatorMessageInvalidTypeID() public { + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x00; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); + } + + function testSubnetValidatorRegistrationMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 38, 39) + ); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked); + } + + function testSubnetValidatorRegistrationMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked2); + } + + function testSubnetValidatorRegistrationMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked3); + } + + function testValidationUptimeMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 45, 46) + ); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked); + } + + function testValidationUptimeMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked2); + } + + function testValidationUptimeMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked3); + } + + function testSetSubnetValidatorWeightMessageInvalidInputLength() public { + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 53, 54) + ); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked); + } + + function testSetSubnetValidatorWeightMessageInvalidCodecID() public { + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked2); + } + + function testSetSubnetValidatorWeightMessageInvalidTypeID() public { + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked3); + } + function testRegisterSubnetValidatorMessage() public view { (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterL1ValidatorMessage( @@ -56,6 +272,32 @@ contract ValidatorMessagesTest is Test { assertEq(recoveredID, validationID); } + function testSubnetConversionMessage() public pure { + bytes memory packed = + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + bytes32 conversionID = ValidatorMessages.unpackSubnetToL1ConversionMessage(packed); + assertEq(conversionID, DEFAULT_SUBNET_CONVERSION_ID); + } + + function testPackL1ConversionData() public pure { + InitialValidator[] memory initialValidators = new InitialValidator[](1); + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + bytes memory packed = ValidatorMessages.packConversionData( + ConversionData({ + subnetID: DEFAULT_SUBNET_ID, + validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, + validatorManagerAddress: DEFAULT_OWNER, + initialValidators: initialValidators + }) + ); + + assertEq(packed.length, 186); + } + function testSubnetValidatorRegistrationMessage() public pure { bytes memory packed = ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); @@ -76,7 +318,7 @@ contract ValidatorMessagesTest is Test { assertEq(weight, DEFAULT_WEIGHT); } - function testSubnetValidatorWeightUpdateMessag() public pure { + function testSubnetValidatorWeightUpdateMessage() public pure { bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -95,4 +337,19 @@ contract ValidatorMessagesTest is Test { assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(uptime, 100); } + + function _getPackedRegisterL1ValidatorMessage() internal returns (bytes memory) { + (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + return packed; + } } diff --git a/go.mod b/go.mod index 33e4cae11..46c13bdbc 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,20 @@ module github.com/ava-labs/teleporter go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.12.0-initial-poc.9 + github.com/ava-labs/avalanchego v1.12.0-initial-poc.9.0.20241122192639-7c3ad181c928 github.com/supranational/blst v0.3.13 // indirect ) require ( - github.com/ava-labs/awm-relayer v1.4.1-0.20241114185359-5cd5a982832d - github.com/ava-labs/subnet-evm v0.6.12-rc.0 + github.com/ava-labs/awm-relayer v1.4.1-0.20241122202209-75359d908260 + github.com/ava-labs/subnet-evm v0.6.12 github.com/ethereum/go-ethereum v1.13.14 github.com/onsi/ginkgo/v2 v2.22.0 - github.com/onsi/gomega v1.35.1 + github.com/onsi/gomega v1.36.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.20.5 github.com/spf13/cobra v1.8.1 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 go.uber.org/zap v1.27.0 golang.org/x/tools v0.27.0 google.golang.org/protobuf v1.35.2 @@ -26,7 +26,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/ava-labs/coreth v0.13.8 // indirect + github.com/ava-labs/coreth v0.13.9-rc.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect diff --git a/go.sum b/go.sum index 442b696a7..075cebcf9 100644 --- a/go.sum +++ b/go.sum @@ -58,14 +58,14 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.9 h1:dQhb+KlPoud+AkRV3A0suKCTodlUSzflGcZElESeVKo= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.9/go.mod h1:86tO6F1FT8emclUwdQ2WCwAtAerqjm5A4IbV6XxNUyM= -github.com/ava-labs/awm-relayer v1.4.1-0.20241114185359-5cd5a982832d h1:Sgn2uD8axkyafPty1iY2ZkPVmT2eVoYgJEAPxkYNYqw= -github.com/ava-labs/awm-relayer v1.4.1-0.20241114185359-5cd5a982832d/go.mod h1:xrZ8FX+mC0PBvUL9yTVqmvCIA9rYYfmdDDY9oTTI6n8= -github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= -github.com/ava-labs/coreth v0.13.8/go.mod h1:t3BSv/eQv0AlDPMfEDCMMoD/jq1RkUsbFzQAFg5qBcE= -github.com/ava-labs/subnet-evm v0.6.12-rc.0 h1:I7s4QkUO8bjg+JB/KTwrmDH8Q2mQYVTKF8mFUSDqk+E= -github.com/ava-labs/subnet-evm v0.6.12-rc.0/go.mod h1:Pf122zopW1fELpOsw0PrdX4u6K/4VOWU2p5C3cHsYAs= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.9.0.20241122192639-7c3ad181c928 h1:th+K+wWgAYL/NsrFJyO+/sThLRdEDE0+I4vgbPLoWQQ= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.9.0.20241122192639-7c3ad181c928/go.mod h1:yhD5dpZyStIVbxQ550EDi5w5SL7DQ/xGE6TIxosb7U0= +github.com/ava-labs/awm-relayer v1.4.1-0.20241122202209-75359d908260 h1:VRNzoY1xvXHphcXXmuXMrUFp5Gm/eiipVJMmNV+UN9c= +github.com/ava-labs/awm-relayer v1.4.1-0.20241122202209-75359d908260/go.mod h1:/hrQpd8P3BfShbRoDE1vD1WZXBchu7r8CQPTEb5tWOQ= +github.com/ava-labs/coreth v0.13.9-rc.1 h1:qIICpC/OZGYUP37QnLgIqqwGmxnLwLpZaUlqJNI85vU= +github.com/ava-labs/coreth v0.13.9-rc.1/go.mod h1:7aMsRIo/3GBE44qWZMjnfqdqfcfZ5yShTTm2LObLaYo= +github.com/ava-labs/subnet-evm v0.6.12 h1:jL3FmjdFcNfS0qwbehwN6DkAg9y7zexB1riiGBxRsM0= +github.com/ava-labs/subnet-evm v0.6.12/go.mod h1:vffwL4UqAh7ibpWjveUuUhamm3a9w75q92bG5vXdX5k= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -497,8 +497,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/gomega v1.36.0 h1:Pb12RlruUtj4XUuPUqeEWc6j5DkVVVA49Uf6YLfC95Y= +github.com/onsi/gomega v1.36.0/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= @@ -578,8 +578,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 8a79ff82a..762af320d 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -17,8 +17,8 @@ export ARCH=$(uname -m) echo "ARCH set to $ARCH" DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 ExampleRewardCalculator TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager -TokenHome TokenRemote ERC20TokenHome ERC20TokenHomeUpgradeable ERC20TokenRemote ERC20TokenRemoteUpgradeable NativeTokenHome NativeTokenHomeUpgradeable NativeTokenRemote NativeTokenRemoteUpgradeable WrappedNativeToken MockERC20SendAndCallReceiver MockNativeSendAndCallReceiver ExampleERC20Decimals" - +TokenHome TokenRemote ERC20TokenHome ERC20TokenHomeUpgradeable ERC20TokenRemote ERC20TokenRemoteUpgradeable NativeTokenHome NativeTokenHomeUpgradeable NativeTokenRemote NativeTokenRemoteUpgradeable +WrappedNativeToken MockERC20SendAndCallReceiver MockNativeSendAndCallReceiver ExampleERC20Decimals IValidatorManager IPoSValidatorManager" PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" SUBNET_EVM_LIST="INativeMinter" @@ -139,21 +139,30 @@ function generate_bindings() { # Filter out the contract we are generating bindings for filtered_contracts=$(remove_matching_string $contracts $contract_name) - - # Filter out external libraries - for lib in $EXTERNAL_LIBS; do - filtered_contracts=$(remove_matching_string $filtered_contracts $lib) - done - - echo "Generating Go bindings for $contract_name..." + gen_path=$TELEPORTER_PATH/abi-bindings/go/$dir/$contract_name mkdir -p $gen_path - - $GOPATH/bin/abigen --pkg $(convertToLower $contract_name) \ - --combined-json $combined_json \ - --type $contract_name \ - --out $gen_path/$contract_name.go \ - --exc $filtered_contracts + echo "Generating Go bindings for $contract_name..." + + if [ -z "$filtered_contracts" ]; then + echo "No external libraries found" + $GOPATH/bin/abigen --pkg $(convertToLower $contract_name) \ + --combined-json $combined_json \ + --type $contract_name \ + --out $gen_path/$contract_name.go + else + # Filter out external libraries + for lib in $EXTERNAL_LIBS; do + filtered_contracts=$(remove_matching_string $filtered_contracts $lib) + done + + $GOPATH/bin/abigen --pkg $(convertToLower $contract_name) \ + --combined-json $combined_json \ + --type $contract_name \ + --out $gen_path/$contract_name.go \ + --exc $filtered_contracts + fi + echo "Done generating Go bindings for $contract_name." done } diff --git a/scripts/versions.sh b/scripts/versions.sh index b34659f58..a2fd7cbce 100755 --- a/scripts/versions.sh +++ b/scripts/versions.sh @@ -34,6 +34,8 @@ AWM_RELAYER_VERSION=${AWM_RELAYER_VERSION:-'v1.0.0'} # Don't export them as they're used in the context of other calls AVALANCHEGO_VERSION=${AVALANCHEGO_VERSION:-$(extract_commit "$(getDepVersion github.com/ava-labs/avalanchego)")} +# Temporarily hardcode the Avalanchego version until outbound networking relaxation is available +AVALANCHEGO_VERSION=v1.12.0-fuji GINKGO_VERSION=${GINKGO_VERSION:-$(extract_commit "$(getDepVersion github.com/onsi/ginkgo/v2)")} SUBNET_EVM_VERSION=${SUBNET_EVM_VERSION:-$(extract_commit "$(getDepVersion github.com/ava-labs/subnet-evm)")} diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 8b6851fdd..8031d7951 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -3,7 +3,6 @@ package governance import ( "context" "math/big" - "time" "github.com/ava-labs/subnet-evm/accounts/abi/bind" validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" @@ -141,14 +140,14 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { // Restart nodes with new chain config network.SetChainConfigs(chainConfigs) - restartCtx, cancel := context.WithTimeout(ctx, time.Second*30) - defer cancel() - network.RestartNodes(restartCtx, nil) // ************************************************************************************************ // Test Case 1: validatorChain (L1B) != targetChain (L1A) // ************************************************************************************************ + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Execute the ValidatorSetSig executeCall and wait for acceptance receipt := utils.ExecuteValidatorSetSigCallAndVerify( ctx, @@ -157,6 +156,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { validatorSetSigContractAddress, fundedKey, &offchainMessages[0], + aggregator, true, ) @@ -179,6 +179,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { validatorSetSigContractAddress, fundedKey, &offchainMessages[0], + network.GetSignatureAggregator(), false, ) @@ -195,6 +196,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { validatorSetSigContractAddress, fundedKey, &offchainMessages[1], + network.GetSignatureAggregator(), true, ) @@ -226,6 +228,7 @@ func ValidatorSetSig(network *localnetwork.LocalNetwork) { validatorSetSigContractAddress2, fundedKey, &offchainMessages[2], + network.GetSignatureAggregator(), true, ) diff --git a/tests/flows/ictt/erc20_home_erc20_remote.go b/tests/flows/ictt/erc20_home_erc20_remote.go index e32cf424e..c559219fa 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote.go +++ b/tests/flows/ictt/erc20_home_erc20_remote.go @@ -71,6 +71,9 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + utils.RegisterERC20TokenRemoteOnHome( ctx, teleporter, @@ -79,6 +82,7 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport l1AInfo, erc20TokenRemoteAddress, fundedKey, + aggregator, ) // Generate new recipient to receive transferred tokens @@ -117,6 +121,8 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -168,6 +174,8 @@ func ERC20TokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, teleport cChainInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenHomeWithdrawal( diff --git a/tests/flows/ictt/erc20_home_erc20_remote_multihop.go b/tests/flows/ictt/erc20_home_erc20_remote_multihop.go index 031f09a6e..0e759934c 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote_multihop.go +++ b/tests/flows/ictt/erc20_home_erc20_remote_multihop.go @@ -86,6 +86,9 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register both ERC20TokenRemote instances on the ERC20TokenHome utils.RegisterERC20TokenRemoteOnHome( ctx, @@ -95,6 +98,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1AInfo, erc20TokenRemoteAddressA, fundedKey, + aggregator, ) utils.RegisterERC20TokenRemoteOnHome( ctx, @@ -104,6 +108,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1BInfo, erc20TokenRemoteAddressB, fundedKey, + aggregator, ) // Generate new recipient to receive transferred tokens @@ -142,6 +147,8 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -175,6 +182,7 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, cChainInfo, transferredAmount, secondaryFeeAmount, + aggregator, ) // Multi-hop transfer back to L1 A @@ -195,5 +203,6 @@ func ERC20TokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, cChainInfo, transferredAmount, secondaryFeeAmount, + aggregator, ) } diff --git a/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go b/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go index bbd05e62a..b2dd8db86 100644 --- a/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go +++ b/tests/flows/ictt/erc20_home_erc20_remote_send_and_call.go @@ -87,6 +87,9 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + utils.RegisterERC20TokenRemoteOnHome( ctx, teleporter, @@ -95,6 +98,7 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( l1AInfo, erc20TokenRemoteAddress, fundedKey, + aggregator, ) // Generate new recipient to receive transferred tokens @@ -145,6 +149,8 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( l1AInfo, true, fundedKey, + nil, + aggregator, ) event, err := utils.GetEventFromLogs(receipt.Logs, erc20TokenRemote.ParseCallSucceeded) @@ -195,6 +201,8 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -252,6 +260,8 @@ func ERC20TokenHomeERC20TokenRemoteSendAndCall( cChainInfo, true, fundedKey, + nil, + aggregator, ) homeEvent, err := utils.GetEventFromLogs(receipt.Logs, erc20TokenHome.ParseCallSucceeded) diff --git a/tests/flows/ictt/erc20_home_native_remote.go b/tests/flows/ictt/erc20_home_native_remote.go index bf5f6fe6b..18a60ce34 100644 --- a/tests/flows/ictt/erc20_home_native_remote.go +++ b/tests/flows/ictt/erc20_home_native_remote.go @@ -74,6 +74,9 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor burnedFeesReportingRewardPercentage, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + collateralAmount := utils.RegisterTokenRemoteOnHome( ctx, teleporter, @@ -85,6 +88,7 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) utils.AddCollateralToERC20TokenHome( @@ -136,6 +140,8 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor l1AInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens @@ -170,6 +176,8 @@ func ERC20TokenHomeNativeTokenRemote(network *localnetwork.LocalNetwork, telepor cChainInfo, true, fundedKey, + nil, + aggregator, ) // Check that the recipient received the tokens diff --git a/tests/flows/ictt/erc20_home_native_remote_multihop.go b/tests/flows/ictt/erc20_home_native_remote_multihop.go index ad66308ed..3a55e1df2 100644 --- a/tests/flows/ictt/erc20_home_native_remote_multihop.go +++ b/tests/flows/ictt/erc20_home_native_remote_multihop.go @@ -78,6 +78,9 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, burnedFeesReportingRewardPercentage, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register both NativeTokenDestinations on the ERC20TokenHome collateralAmountA := utils.RegisterTokenRemoteOnHome( ctx, @@ -90,6 +93,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) collateralAmountB := utils.RegisterTokenRemoteOnHome( @@ -103,6 +107,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) // Add collateral for both NativeTokenDestinations @@ -168,6 +173,8 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1AInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens @@ -203,6 +210,8 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1BInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens @@ -226,6 +235,7 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, cChainInfo, amountToSend, big.NewInt(0), + aggregator, ) // Multi-hop transfer back to L1 A @@ -244,5 +254,6 @@ func ERC20TokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork, cChainInfo, amountToSend, secondaryFeeAmount, + aggregator, ) } diff --git a/tests/flows/ictt/native_home_erc20_remote.go b/tests/flows/ictt/native_home_erc20_remote.go index 52a308ef7..f95640bd8 100644 --- a/tests/flows/ictt/native_home_erc20_remote.go +++ b/tests/flows/ictt/native_home_erc20_remote.go @@ -67,6 +67,9 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + utils.RegisterERC20TokenRemoteOnHome( ctx, teleporter, @@ -75,6 +78,7 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor l1AInfo, erc20TokenRemoteAddress, fundedKey, + aggregator, ) // Generate new recipient to receive transferred tokens @@ -114,6 +118,8 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -165,6 +171,8 @@ func NativeTokenHomeERC20TokenRemote(network *localnetwork.LocalNetwork, telepor cChainInfo, true, fundedKey, + nil, + aggregator, ) // Check that the recipient received the tokens diff --git a/tests/flows/ictt/native_home_erc20_remote_multihop.go b/tests/flows/ictt/native_home_erc20_remote_multihop.go index 1b115939c..628878f8b 100644 --- a/tests/flows/ictt/native_home_erc20_remote_multihop.go +++ b/tests/flows/ictt/native_home_erc20_remote_multihop.go @@ -81,6 +81,9 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register both ERC20Destinations on the NativeTokenHome utils.RegisterERC20TokenRemoteOnHome( ctx, @@ -90,6 +93,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1AInfo, erc20TokenRemoteAddressA, fundedKey, + aggregator, ) utils.RegisterERC20TokenRemoteOnHome( @@ -100,6 +104,7 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1BInfo, erc20TokenRemoteAddressB, fundedKey, + aggregator, ) // Generate new recipient to receive transferred tokens @@ -139,6 +144,8 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -171,5 +178,6 @@ func NativeTokenHomeERC20TokenRemoteMultiHop(network *localnetwork.LocalNetwork, cChainInfo, transferredAmount, secondaryFeeAmount, + aggregator, ) } diff --git a/tests/flows/ictt/native_home_native_remote.go b/tests/flows/ictt/native_home_native_remote.go index 4f79aa153..a44c41b71 100644 --- a/tests/flows/ictt/native_home_native_remote.go +++ b/tests/flows/ictt/native_home_native_remote.go @@ -57,6 +57,9 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo burnedFeesReportingRewardPercentage, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register the NativeTokenRemote on the NativeTokenHome collateralAmount := utils.RegisterTokenRemoteOnHome( ctx, @@ -69,6 +72,7 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo big.NewInt(1), multiplyOnRemote, fundedKey, + aggregator, ) utils.AddCollateralToNativeTokenHome( @@ -119,6 +123,8 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckBalance( @@ -160,6 +166,8 @@ func NativeTokenHomeNativeDestination(network *localnetwork.LocalNetwork, telepo cChainInfo, true, fundedKey, + nil, + aggregator, ) // Check that the recipient received the tokens diff --git a/tests/flows/ictt/native_home_native_remote_multihop.go b/tests/flows/ictt/native_home_native_remote_multihop.go index 3206b1179..ac0400cc7 100644 --- a/tests/flows/ictt/native_home_native_remote_multihop.go +++ b/tests/flows/ictt/native_home_native_remote_multihop.go @@ -77,6 +77,9 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork burnedFeesReportingRewardPercentage, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register both NativeTokenDestinations on the NativeTokenHome collateralAmountA := utils.RegisterTokenRemoteOnHome( ctx, @@ -89,6 +92,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) collateralAmountB := utils.RegisterTokenRemoteOnHome( @@ -102,6 +106,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) // Add collateral for both NativeTokenDestinations @@ -164,6 +169,8 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork l1AInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens @@ -198,6 +205,8 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork l1BInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens @@ -221,6 +230,7 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork cChainInfo, amountToSendA, big.NewInt(0), + aggregator, ) // Again, send half of the received amount to account for gas expenses @@ -242,5 +252,6 @@ func NativeTokenHomeNativeTokenRemoteMultiHop(network *localnetwork.LocalNetwork cChainInfo, amountToSendB, secondaryFeeAmount, + aggregator, ) } diff --git a/tests/flows/ictt/registration_and_collateral_check.go b/tests/flows/ictt/registration_and_collateral_check.go index bafde23ea..bf669966b 100644 --- a/tests/flows/ictt/registration_and_collateral_check.go +++ b/tests/flows/ictt/registration_and_collateral_check.go @@ -98,6 +98,9 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport Expect(err).Should(BeNil()) utils.ExpectBigEqual(balance, initialBalance) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Register the NativeTokenRemote to the ERC20TokenHome collateralNeeded := utils.RegisterTokenRemoteOnHome( ctx, @@ -110,6 +113,7 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport utils.GetTokenMultiplier(decimalsShift), multiplyOnRemote, fundedKey, + aggregator, ) // Try sending again and expect failure since remote is not collateralized @@ -188,6 +192,8 @@ func RegistrationAndCollateralCheck(network *localnetwork.LocalNetwork, teleport l1AInfo, true, fundedKey, + nil, + aggregator, ) // Verify the recipient received the tokens diff --git a/tests/flows/ictt/transparent_proxy_upgradeability.go b/tests/flows/ictt/transparent_proxy_upgradeability.go index 275b24895..357824cac 100644 --- a/tests/flows/ictt/transparent_proxy_upgradeability.go +++ b/tests/flows/ictt/transparent_proxy_upgradeability.go @@ -62,13 +62,14 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter utils.WaitForTransactionSuccess(ctx, cChainInfo, tx.Hash()) // Deploy a TransparentUpgradeableProxy contract on primary network for the ERC20TokenHome logic contract - erc20TokenHomeAddress, proxyAdmin, erc20TokenHome := utils.DeployTransparentUpgradeableProxy( + erc20TokenHomeAddress, proxyAdmin := utils.DeployTransparentUpgradeableProxy( ctx, cChainInfo, fundedKey, implAddress, - erc20tokenhome.NewERC20TokenHome, ) + erc20TokenHome, err := erc20tokenhome.NewERC20TokenHome(erc20TokenHomeAddress, cChainInfo.RPCClient) + Expect(err).Should(BeNil()) tx, err = erc20TokenHome.Initialize( opts, @@ -96,6 +97,9 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter tokenDecimals, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + utils.RegisterERC20TokenRemoteOnHome( ctx, teleporter, @@ -104,6 +108,7 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter l1AInfo, erc20TokenRemoteAddress, fundedKey, + aggregator, ) // Send a transfer from primary network to L1 A @@ -142,6 +147,8 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter l1AInfo, true, fundedKey, + nil, + aggregator, ) utils.CheckERC20TokenRemoteWithdrawal( @@ -206,6 +213,8 @@ func TransparentUpgradeableProxy(network *localnetwork.LocalNetwork, teleporter cChainInfo, true, fundedKey, + nil, + aggregator, ) // Check that the transfer was successful, and expected balances are correct diff --git a/tests/flows/teleporter/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go index a1576956d..0a3156eb9 100644 --- a/tests/flows/teleporter/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -79,6 +79,8 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte l1BInfo, true, fundedKey, + nil, + network.GetSignatureAggregator(), ) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, @@ -109,10 +111,20 @@ func AddFeeAmount(network *localnetwork.LocalNetwork, teleporter utils.Teleporte Amount: big.NewInt(0), }, []common.Address{}, - fundedKey) + fundedKey, + ) - // Relay message containing the specific receipt from L1 B to L1 A - teleporter.RelayTeleporterMessage(ctx, sendSpecificReceiptsReceipt, l1BInfo, l1AInfo, true, fundedKey) + // Relay message containing the specific receipt from Subnet B to Subnet A + teleporter.RelayTeleporterMessage( + ctx, + sendSpecificReceiptsReceipt, + l1BInfo, + l1AInfo, + true, + fundedKey, + nil, + network.GetSignatureAggregator(), + ) // Check message delivered delivered, err = teleporter.TeleporterMessenger(l1AInfo).MessageReceived( diff --git a/tests/flows/teleporter/basic_send_receive.go b/tests/flows/teleporter/basic_send_receive.go index 664de47bb..0387e9699 100644 --- a/tests/flows/teleporter/basic_send_receive.go +++ b/tests/flows/teleporter/basic_send_receive.go @@ -22,10 +22,13 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep // Send a transaction to L1 A to issue an ICM Message from the Teleporter contract to L1 B ctx := context.Background() + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Clear the receipt queue from L1 B -> L1 A to have a clean slate for the test flow. // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. - teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo) + teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo, aggregator) feeAmount := big.NewInt(1) feeTokenAddress, feeToken := utils.DeployExampleERC20( @@ -66,10 +69,20 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep expectedReceiptID := teleporterMessageID // Relay the message to the destination - deliveryReceipt := teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + deliveryReceipt := teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage, + ) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination @@ -92,7 +105,16 @@ func BasicSendReceive(network *localnetwork.LocalNetwork, teleporter utils.Telep ) // Relay the message to the destination - deliveryReceipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1BInfo, l1AInfo, true, fundedKey) + deliveryReceipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1BInfo, + l1AInfo, + true, + fundedKey, + nil, + aggregator, + ) Expect(utils.CheckReceiptReceived( deliveryReceipt, diff --git a/tests/flows/teleporter/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go index 008975169..7d4ac61a4 100644 --- a/tests/flows/teleporter/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -87,8 +87,21 @@ func DeliverToNonExistentContract(network *localnetwork.LocalNetwork, teleporter // // Relay the message to the destination // + + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + log.Info("Relaying the message to the destination") - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) receiveEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(l1AInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/deliver_to_wrong_chain.go b/tests/flows/teleporter/deliver_to_wrong_chain.go index d1acf1643..fc905dc0e 100644 --- a/tests/flows/teleporter/deliver_to_wrong_chain.go +++ b/tests/flows/teleporter/deliver_to_wrong_chain.go @@ -57,7 +57,19 @@ func DeliverToWrongChain(network *localnetwork.LocalNetwork, teleporter utils.Te fundedKey, ) - teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, L1CInfo, false, fundedKey) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + + teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + L1CInfo, + false, + fundedKey, + nil, + aggregator, + ) // // Check that the message was not received on the L1 C diff --git a/tests/flows/teleporter/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go index 957722a32..3cdac7cf4 100644 --- a/tests/flows/teleporter/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -55,8 +55,20 @@ func InsufficientGas(network *localnetwork.LocalNetwork, teleporter utils.Telepo messageID := event.MessageID - // Relay message from L1A to L1B - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + + // Relay message from SubnetA to SubnetB + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) // Check Teleporter message received on the destination delivered, err := diff --git a/tests/flows/teleporter/registry/pause_teleporter.go b/tests/flows/teleporter/registry/pause_teleporter.go index a1b1528a0..22679303e 100644 --- a/tests/flows/teleporter/registry/pause_teleporter.go +++ b/tests/flows/teleporter/registry/pause_teleporter.go @@ -52,6 +52,9 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo Expect(err).Should(BeNil()) Expect(isPaused).Should(BeTrue()) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Send a message from subnet A to subnet B, which should fail teleporter.SendExampleCrossChainMessageAndVerify( ctx, @@ -62,6 +65,7 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo testMessengerB, fundedKey, "message_1", + aggregator, false, ) @@ -88,6 +92,7 @@ func PauseTeleporter(network *localnetwork.LocalNetwork, teleporter utils.Telepo testMessengerB, fundedKey, "message_2", + aggregator, true, ) } diff --git a/tests/flows/teleporter/registry/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go index f1b3a9e7e..bd9cb4b2d 100644 --- a/tests/flows/teleporter/registry/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -2,7 +2,6 @@ package registry import ( "context" - "time" "github.com/ava-labs/subnet-evm/accounts/abi/bind" localnetwork "github.com/ava-labs/teleporter/tests/network" @@ -87,9 +86,9 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel // Restart nodes with new chain config network.SetChainConfigs(chainConfigs) - restartCtx, cancel := context.WithTimeout(ctx, 30*time.Second) - defer cancel() - network.RestartNodes(restartCtx, nil) + + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() // Call addProtocolVersion on subnetB to register the new Teleporter version teleporter.AddProtocolVersionAndWaitForAcceptance( @@ -98,6 +97,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel newTeleporterAddress, fundedKey, offchainMessageB, + aggregator, ) // Send a message using old Teleporter version to test messenger using new Teleporter version. @@ -111,6 +111,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel testMessengerB, fundedKey, "message_1", + aggregator, true, ) @@ -147,6 +148,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel testMessengerB, fundedKey, "message_2", + aggregator, false, ) @@ -165,6 +167,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel testMessengerC, fundedKey, "message_3", + aggregator, false, ) @@ -175,6 +178,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel newTeleporterAddress, fundedKey, offchainMessageC, + aggregator, ) // Send a message from A->B, which previously failed, but now using the new Teleporter version. @@ -188,6 +192,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel testMessengerC, fundedKey, "message_4", + aggregator, true, ) @@ -199,6 +204,7 @@ func TeleporterRegistry(network *localnetwork.LocalNetwork, teleporter utils.Tel newTeleporterAddress, fundedKey, offchainMessageA, + aggregator, ) latestVersionA, err := teleporter.TeleporterRegistry(l1AInfo).LatestVersion(&bind.CallOpts{}) diff --git a/tests/flows/teleporter/relay_message_twice.go b/tests/flows/teleporter/relay_message_twice.go index ed87ff21c..ecb672bda 100644 --- a/tests/flows/teleporter/relay_message_twice.go +++ b/tests/flows/teleporter/relay_message_twice.go @@ -41,13 +41,30 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele "destinationBlockchainID", l1BInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey, + ctx, + teleporter.TeleporterMessenger(l1AInfo), + l1AInfo, + l1BInfo, + sendCrossChainMessageInput, + fundedKey, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // // Relay the message to the destination // - teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) // // Check Teleporter message received on the destination @@ -63,5 +80,14 @@ func RelayMessageTwice(network *localnetwork.LocalNetwork, teleporter utils.Tele // Attempt to send the same message again, should fail // log.Info("Relaying the same Teleporter message again on the destination") - teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, false, fundedKey) + teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + false, + fundedKey, + nil, + aggregator, + ) } diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index 43de0997e..27febf628 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -78,7 +78,17 @@ func relayAlteredMessage( ) Expect(err).Should(BeNil()) - signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + + signedWarpMessage := utils.ConstructSignedWarpMessage( + ctx, + sourceReceipt, + source, + destination, + nil, + aggregator, + ) // Construct the transaction to send the Warp message to the destination chain _, fundedKey := network.GetFundedAccountInfo() diff --git a/tests/flows/teleporter/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go index a19ac47d0..fab98c08f 100644 --- a/tests/flows/teleporter/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -36,8 +36,20 @@ func ResubmitAlteredMessage(network *localnetwork.LocalNetwork, teleporter utils receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Relay the message to the destination - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) log.Info("Checking the message was received on the destination") delivered, err := teleporter.TeleporterMessenger(l1BInfo).MessageReceived(&bind.CallOpts{}, messageID) diff --git a/tests/flows/teleporter/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go index 98887157f..6be466c4d 100644 --- a/tests/flows/teleporter/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -65,10 +65,22 @@ func RetrySuccessfulExecution(network *localnetwork.LocalNetwork, teleporter uti teleporterMessageID := event.MessageID + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // // Relay the message to the destination // - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) receiveEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(l1BInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go index c34ee0532..f9b0b5085 100644 --- a/tests/flows/teleporter/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -3,6 +3,7 @@ package teleporter import ( "bytes" "context" + goLog "log" "math/big" "github.com/ava-labs/avalanchego/ids" @@ -26,8 +27,11 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T _, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Clear the receipt queue from Subnet B -> Subnet A to have a clean slate for the test flow. - teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo) + teleporter.ClearReceiptQueue(ctx, fundedKey, l1BInfo, l1AInfo, aggregator) // Use mock token as the fee token mockTokenAddress, mockToken := utils.DeployExampleERC20( @@ -57,11 +61,13 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T AllowedRelayerAddresses: []common.Address{}, Message: []byte{1, 2, 3, 4}, } + goLog.Println("Sending two messages from L1 A to L1 B") // Send first message from L1 A to L1 B with fee amount 5 sendCrossChainMsgReceipt, messageID1 := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, l1ATeleporterMessenger, l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) + goLog.Println("Relaying the first message from L1 A to L1 B") // Relay the message from L1A to L1B deliveryReceipt1 := teleporter.RelayTeleporterMessage( ctx, @@ -70,10 +76,13 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T l1BInfo, true, fundedKey, + nil, + aggregator, ) receiveEvent1, err := utils.GetEventFromLogs( deliveryReceipt1.Logs, - l1BTeleporterMessenger.ParseReceiveCrossChainMessage) + l1BTeleporterMessenger.ParseReceiveCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(receiveEvent1.MessageID[:]).Should(Equal(messageID1[:])) @@ -82,11 +91,13 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) + goLog.Println("Sending the second message from L1 A to L1 B") // Send second message from L1 A to L1 B with fee amount 5 sendCrossChainMsgReceipt, messageID2 := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, l1ATeleporterMessenger, l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey) - // Relay the message from L1A to L1B + goLog.Println("Relaying the second message from L1 A to L1 B") + // Relay the message from L1 A to L1 B deliveryReceipt2 := teleporter.RelayTeleporterMessage( ctx, sendCrossChainMsgReceipt, @@ -94,6 +105,8 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T l1BInfo, true, fundedKey, + nil, + aggregator, ) receiveEvent2, err := utils.GetEventFromLogs( deliveryReceipt2.Logs, @@ -107,6 +120,7 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T Expect(delivered).Should(BeTrue()) // Call send specific receipts to get reward of relaying two messages + goLog.Println("Sending specific receipts from Subnet B to Subnet A") receipt, messageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, l1BTeleporterMessenger, @@ -121,8 +135,18 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T fundedKey, ) - // Relay message from L1 B to L1 A - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1BInfo, l1AInfo, true, fundedKey) + // Relay message from Subnet B to Subnet A + goLog.Println("Relaying the specific receipts from Subnet B to Subnet A") + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1BInfo, + l1AInfo, + true, + fundedKey, + nil, + aggregator, + ) // Check that the message back to L1 A was delivered delivered, err = l1ATeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) @@ -160,12 +184,23 @@ func SendSpecificReceipts(network *localnetwork.LocalNetwork, teleporter utils.T Message: []byte{1, 2, 3, 4}, } + goLog.Println("Sending a message from Subnet B to Subnet A to trigger receipts") // This message will also have the same receipts as the previous message receipt, messageID = utils.SendCrossChainMessageAndWaitForAcceptance( ctx, l1BTeleporterMessenger, l1BInfo, l1AInfo, sendCrossChainMessageInput, fundedKey) - // Relay message from L1 B to L1 A - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, l1BInfo, l1AInfo, true, fundedKey) + goLog.Println("Relaying the message from L1 B to L1 A") + // Relay message from Subnet B to Subnet A + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1BInfo, + l1AInfo, + true, + fundedKey, + nil, + aggregator, + ) // Check delivered delivered, err = l1ATeleporterMessenger.MessageReceived( &bind.CallOpts{}, diff --git a/tests/flows/teleporter/unallowed_relayer.go b/tests/flows/teleporter/unallowed_relayer.go index 27643d11a..193afc66a 100644 --- a/tests/flows/teleporter/unallowed_relayer.go +++ b/tests/flows/teleporter/unallowed_relayer.go @@ -46,10 +46,22 @@ func UnallowedRelayer(network *localnetwork.LocalNetwork, teleporter utils.Telep ctx, teleporter.TeleporterMessenger(l1AInfo), l1AInfo, l1BInfo, sendCrossChainMessageInput, fundedKey, ) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // // Relay the message to the destination // - teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, false, fundedKey) + teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + false, + fundedKey, + nil, + aggregator, + ) // // Check Teleporter message was not received on the destination diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 7fb612aba..9c64549eb 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -5,9 +5,11 @@ import ( "math/big" "time" + "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/subnet-evm/accounts/abi/bind" subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" localnetwork "github.com/ava-labs/teleporter/tests/network" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/common" @@ -15,7 +17,10 @@ import ( . "github.com/onsi/gomega" ) -const newNodeCount = 2 +const ( + newNodeCount = 2 + sleepPeriodSeconds = 5 +) func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.TeleporterTestInfo) { l1AInfo, l1BInfo := network.GetTwoL1s() @@ -56,17 +61,60 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor Expect(err).Should(BeNil()) sentTeleporterMessage := sendEvent.Message + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Construct the signed warp message - signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, receipt, l1AInfo, l1BInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + nil, + aggregator, + ) // // Modify the validator set on L1 A // // Add new nodes to the validator set - addValidatorsCtx, cancel := context.WithTimeout(ctx, 60*time.Second) + addValidatorsCtx, cancel := context.WithTimeout(ctx, (90+sleepPeriodSeconds)*newNodeCount*time.Second) defer cancel() - network.AddL1Validators(addValidatorsCtx, l1AInfo.L1ID, newNodeCount) + newNodes := network.GetExtraNodes(newNodeCount) + validatorManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) + validatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1AInfo.RPCClient) + pChainInfo := utils.GetPChainInfo(network.GetPrimaryNetworkInfo()) + Expect(err).Should(BeNil()) + + l1AInfo = network.AddSubnetValidators(newNodes, l1AInfo) + + for i := 0; i < newNodeCount; i++ { + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) + pop, err := newNodes[i].GetProofOfPossession() + Expect(err).Should(BeNil()) + node := utils.Node{ + NodeID: newNodes[i].NodeID, + NodePoP: pop, + Weight: units.Schmeckle, + } + utils.InitializeAndCompletePoAValidatorRegistration( + addValidatorsCtx, + aggregator, + fundedKey, + fundedKey, + l1AInfo, + pChainInfo, + validatorManager, + validatorManagerAddress, + expiry, + node, + network.GetPChainWallet(), + network.GetNetworkID(), + ) + // Sleep to ensure the validator manager uses a new churn tracking period + time.Sleep(sleepPeriodSeconds * time.Second) + } // Refresh the L1 info l1AInfo, l1BInfo = network.GetTwoL1s() @@ -118,7 +166,16 @@ func ValidatorChurn(network *localnetwork.LocalNetwork, teleporter utils.Telepor // Wait for the transaction to be mined receipt = utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) - teleporter.RelayTeleporterMessage(ctx, receipt, l1AInfo, l1BInfo, true, fundedKey) + teleporter.RelayTeleporterMessage( + ctx, + receipt, + l1AInfo, + l1BInfo, + true, + fundedKey, + nil, + aggregator, + ) // Verify the message was delivered delivered, err = teleporter.TeleporterMessenger(l1BInfo).MessageReceived( diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index da0720890..94e65a91d 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -7,7 +7,11 @@ import ( "time" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" + erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ERC20TokenStakingManager" + iposvalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager" localnetwork "github.com/ava-labs/teleporter/tests/network" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -44,46 +48,37 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { ) ctx := context.Background() - // Deploy the staking manager contract - stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( - ctx, - fundedKey, - l1AInfo, - pChainInfo, - ) - - nodes := utils.ConvertSubnet( + nodes, initialValidationIDs, _ := network.ConvertSubnet( ctx, l1AInfo, - network.GetPChainWallet(), - stakingManagerAddress, + utils.ERC20TokenStakingManager, + []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits fundedKey, + false, ) - - // Initialize the validator set on the L1 - log.Println("Initializing validator set") - initialValidationIDs := utils.InitializeERC20TokenValidatorSet( - ctx, - fundedKey, - l1AInfo, - pChainInfo, - stakingManager, + stakingManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) + erc20StakingManager, err := erc20tokenstakingmanager.NewERC20TokenStakingManager( stakingManagerAddress, - network.GetNetworkID(), - signatureAggregator, - nodes, + l1AInfo.RPCClient, ) + Expect(err).Should(BeNil()) + erc20Address, err := erc20StakingManager.Erc20(&bind.CallOpts{}) + Expect(err).Should(BeNil()) + erc20, err := exampleerc20.NewExampleERC20(erc20Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) // // Delist one initial validator // - utils.InitializeAndCompleteEndInitialERC20Validation( + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + utils.InitializeAndCompleteEndInitialPoSValidation( ctx, signatureAggregator, fundedKey, l1AInfo, pChainInfo, - stakingManager, + posStakingManager, stakingManagerAddress, initialValidationIDs[0], 0, @@ -102,7 +97,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { fundedKey, l1AInfo, pChainInfo, - stakingManager, + erc20StakingManager, stakingManagerAddress, erc20, expiry, @@ -118,13 +113,13 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { var delegationID ids.ID { log.Println("Registering delegator") - delegatorStake, err := stakingManager.WeightToValue( + delegatorStake, err := erc20StakingManager.WeightToValue( &bind.CallOpts{}, nodes[0].Weight, ) Expect(err).Should(BeNil()) delegatorStake.Div(delegatorStake, big.NewInt(10)) - delegatorWeight, err := stakingManager.ValueToWeight( + delegatorWeight, err := erc20StakingManager.ValueToWeight( &bind.CallOpts{}, delegatorStake, ) @@ -141,25 +136,35 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { delegatorStake, erc20, stakingManagerAddress, - stakingManager, + erc20StakingManager, ) initRegistrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorAdded, + erc20StakingManager.ParseDelegatorAdded, ) Expect(err).Should(BeNil()) delegationID = initRegistrationEvent.DelegationID + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, l1AInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage( + context.Background(), + receipt, + l1AInfo, + pChainInfo, + nil, + aggregator, + ) // Issue a tx to update the validator's weight on the P-Chain - network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct an L1ValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructL1ValidatorWeightUpdateMessage( validationID, nonce, newValidatorWeight, @@ -170,7 +175,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { ) // Deliver the Warp message to the L1 - receipt = utils.CompleteERC20DelegatorRegistration( + receipt = utils.CompleteDelegatorRegistration( ctx, fundedKey, delegationID, @@ -181,7 +186,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { // Check that the validator is registered in the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorRegistered, + erc20StakingManager.ParseDelegatorRegistered, ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) @@ -194,33 +199,43 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { { log.Println("Delisting delegator") nonce := uint64(2) - receipt := utils.InitializeEndERC20Delegation( + receipt := utils.InitializeEndDelegation( ctx, fundedKey, l1AInfo, - stakingManager, + stakingManagerAddress, delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorRemovalInitialized, + erc20StakingManager.ParseDelegatorRemovalInitialized, ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, l1AInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage( + context.Background(), + receipt, + l1AInfo, + pChainInfo, + nil, + aggregator, + ) Expect(err).Should(BeNil()) // Issue a tx to update the validator's weight on the P-Chain - network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct an L1ValidatorWeightUpdateMessage Warp message from the P-Chain + signedMessage := utils.ConstructL1ValidatorWeightUpdateMessage( validationID, nonce, nodes[0].Weight, @@ -231,7 +246,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { ) // Deliver the Warp message to the L1 - receipt = utils.CompleteEndERC20Delegation( + receipt = utils.CompleteEndDelegation( ctx, fundedKey, delegationID, @@ -243,7 +258,7 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { // Check that the delegator has been delisted from the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegationEnded, + erc20StakingManager.ParseDelegationEnded, ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) @@ -253,13 +268,13 @@ func ERC20TokenStakingManager(network *localnetwork.LocalNetwork) { // // Delist the validator // - utils.InitializeAndCompleteEndERC20Validation( + utils.InitializeAndCompleteEndPoSValidation( ctx, signatureAggregator, fundedKey, l1AInfo, pChainInfo, - stakingManager, + posStakingManager, stakingManagerAddress, validationID, expiry, diff --git a/tests/flows/validator-manager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go index 4368a7c5f..4f8928ce5 100644 --- a/tests/flows/validator-manager/native_token_staking.go +++ b/tests/flows/validator-manager/native_token_staking.go @@ -7,7 +7,10 @@ import ( "time" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" + iposvalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager" localnetwork "github.com/ava-labs/teleporter/tests/network" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -44,48 +47,34 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { ) ctx := context.Background() - // Deploy the staking manager contract - stakingManagerAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( - ctx, - fundedKey, - l1AInfo, - pChainInfo, - ) - - utils.AddNativeMinterAdmin(ctx, l1AInfo, fundedKey, stakingManagerAddress) - - nodes := utils.ConvertSubnet( + nodes, initialValidationIDs, _ := network.ConvertSubnet( ctx, l1AInfo, - network.GetPChainWallet(), - stakingManagerAddress, + utils.NativeTokenStakingManager, + []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits fundedKey, + false, ) - - // Initialize the validator set on the L1 - log.Println("Initializing validator set") - initialValidationIDs := utils.InitializeNativeTokenValidatorSet( - ctx, - fundedKey, - l1AInfo, - pChainInfo, - stakingManager, + stakingManagerAddress := network.GetValidatorManager(l1AInfo.L1ID) + nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( stakingManagerAddress, - network.GetNetworkID(), - signatureAggregator, - nodes, + l1AInfo.RPCClient, ) + Expect(err).Should(BeNil()) + utils.AddNativeMinterAdmin(ctx, l1AInfo, fundedKey, stakingManagerAddress) // // Delist one initial validator // - utils.InitializeAndCompleteEndInitialNativeValidation( + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + utils.InitializeAndCompleteEndInitialPoSValidation( ctx, signatureAggregator, fundedKey, l1AInfo, pChainInfo, - stakingManager, + posStakingManager, stakingManagerAddress, initialValidationIDs[0], 0, @@ -104,7 +93,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { fundedKey, l1AInfo, pChainInfo, - stakingManager, + nativeStakingManager, stakingManagerAddress, expiry, nodes[0], @@ -119,13 +108,13 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { var delegationID ids.ID { log.Println("Registering delegator") - delegatorStake, err := stakingManager.WeightToValue( + delegatorStake, err := nativeStakingManager.WeightToValue( &bind.CallOpts{}, nodes[0].Weight, ) Expect(err).Should(BeNil()) delegatorStake.Div(delegatorStake, big.NewInt(10)) - delegatorWeight, err := stakingManager.ValueToWeight( + delegatorWeight, err := nativeStakingManager.ValueToWeight( &bind.CallOpts{}, delegatorStake, ) @@ -141,25 +130,35 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { validationID, delegatorStake, stakingManagerAddress, - stakingManager, + nativeStakingManager, ) initRegistrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorAdded, + nativeStakingManager.ParseDelegatorAdded, ) Expect(err).Should(BeNil()) delegationID = initRegistrationEvent.DelegationID + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, l1AInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage( + context.Background(), + receipt, + l1AInfo, + pChainInfo, + nil, + aggregator, + ) // Issue a tx to update the validator's weight on the P-Chain - network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + // Construct a L1ValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructL1ValidatorWeightUpdateMessage( validationID, nonce, newValidatorWeight, @@ -170,7 +169,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { ) // Deliver the Warp message to the L1 - receipt = utils.CompleteNativeDelegatorRegistration( + receipt = utils.CompleteDelegatorRegistration( ctx, fundedKey, delegationID, @@ -181,7 +180,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { // Check that the validator is registered in the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorRegistered, + nativeStakingManager.ParseDelegatorRegistered, ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) @@ -193,33 +192,43 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { { log.Println("Delisting delegator") nonce := uint64(2) - receipt := utils.InitializeEndNativeDelegation( + receipt := utils.InitializeEndDelegation( ctx, fundedKey, l1AInfo, - stakingManager, + stakingManagerAddress, delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegatorRemovalInitialized, + nativeStakingManager.ParseDelegatorRemovalInitialized, ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) + aggregator := network.GetSignatureAggregator() + defer aggregator.Shutdown() + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, l1AInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage( + context.Background(), + receipt, + l1AInfo, + pChainInfo, + nil, + aggregator, + ) Expect(err).Should(BeNil()) // Issue a tx to update the validator's weight on the P-Chain - network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + network.GetPChainWallet().IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network.GetPChainWallet()) utils.AdvanceProposerVM(ctx, l1AInfo, fundedKey, 5) // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + signedMessage := utils.ConstructL1ValidatorWeightUpdateMessage( validationID, nonce, nodes[0].Weight, @@ -230,7 +239,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { ) // Deliver the Warp message to the L1 - receipt = utils.CompleteEndNativeDelegation( + receipt = utils.CompleteEndDelegation( ctx, fundedKey, delegationID, @@ -242,7 +251,7 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { // Check that the delegator has been delisted from the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, - stakingManager.ParseDelegationEnded, + nativeStakingManager.ParseDelegationEnded, ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) @@ -252,13 +261,13 @@ func NativeTokenStakingManager(network *localnetwork.LocalNetwork) { // // Delist the validator // - utils.InitializeAndCompleteEndNativeValidation( + utils.InitializeAndCompleteEndPoSValidation( ctx, signatureAggregator, fundedKey, l1AInfo, pChainInfo, - stakingManager, + posStakingManager, stakingManagerAddress, validationID, expiry, diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 26d4f0027..4d7b228b9 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -2,14 +2,15 @@ package staking import ( "context" - "log" "math/big" "time" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/subnet-evm/accounts/abi/bind" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" + iposvalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager" localnetwork "github.com/ava-labs/teleporter/tests/network" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" @@ -66,60 +67,18 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { fundAmount, ) - // Deploy PoAValidatorManager contract - implAddress, _ := utils.DeployPoAValidatorManager( - ctx, - fundedKey, - l1AInfo, - ) - - // Deploy TransparentUpgradeableProxy contract pointing to PoAValidatorManager - proxyAddress, proxyAdmin, poaValidatorManager := utils.DeployTransparentUpgradeableProxy( + // Deploy PoAValidatorManager contract with a proxy + nodes, initialValidationIDs, proxyAdmin := network.ConvertSubnet( ctx, l1AInfo, - fundedKey, - implAddress, - poavalidatormanager.NewPoAValidatorManager, - ) - opts, err := bind.NewKeyedTransactorWithChainID( - fundedKey, - l1AInfo.EVMChainID, - ) - Expect(err).Should(BeNil()) - - tx, err := poaValidatorManager.Initialize( - opts, - poavalidatormanager.ValidatorManagerSettings{ - L1ID: l1AInfo.L1ID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), - }, - ownerAddress, + utils.PoAValidatorManager, + []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits + ownerKey, + true, ) + proxyAddress := network.GetValidatorManager(l1AInfo.L1ID) + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(proxyAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) - - nodes := utils.ConvertSubnet( - ctx, - l1AInfo, - network.GetPChainWallet(), - proxyAddress, - fundedKey, - ) - - // Initialize the validator set on the L1 - log.Println("Initializing validator set") - initialValidationIDs := utils.InitializePoAValidatorSet( - ctx, - fundedKey, - l1AInfo, - pChainInfo, - poaValidatorManager, - proxyAddress, - network.GetNetworkID(), - signatureAggregator, - nodes, - ) // // Delist one initial validator @@ -141,7 +100,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { ) // Try to call with invalid owner - opts, err = bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) _, err = poaValidatorManager.InitializeValidatorRegistration( @@ -184,19 +143,22 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { */ // Deploy PoSValidatorManager contract - newImplAddress, _ := utils.DeployNativeTokenStakingManager( + newImplAddress, _ := utils.DeployValidatorManager( ctx, fundedKey, l1AInfo, + utils.NativeTokenStakingManager, ) // Upgrade the TransparentUpgradeableProxy contract to use the new logic contract - tx, err = proxyAdmin.UpgradeAndCall(opts, proxyAddress, newImplAddress, []byte{}) + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := proxyAdmin.UpgradeAndCall(opts, proxyAddress, newImplAddress, []byte{}) Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) // Change the proxy contract type to NativeTokenStakingManager and initialize it - posValidatorManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( + nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( proxyAddress, l1AInfo.RPCClient, ) @@ -211,7 +173,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { uint64(10), ) - tx, err = posValidatorManager.Initialize( + tx, err = nativeStakingManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ @@ -233,21 +195,22 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) // Check that previous validator is still registered - validationID, err := posValidatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) + validationID, err := nativeStakingManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) // // Remove the PoA validator and re-register as a PoS validator // - - utils.InitializeAndCompleteEndNativeValidation( + posStakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(proxyAddress, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + utils.InitializeAndCompleteEndPoSValidation( ctx, signatureAggregator, ownerKey, l1AInfo, pChainInfo, - posValidatorManager, + posStakingManager, proxyAddress, poaValidationID, expiry, @@ -266,7 +229,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { fundedKey, l1AInfo, pChainInfo, - posValidatorManager, + nativeStakingManager, proxyAddress, expiry2, nodes[0], @@ -276,13 +239,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { validatorStartTime := time.Now() // Delist the PoS validator - utils.InitializeAndCompleteEndNativeValidation( + utils.InitializeAndCompleteEndPoSValidation( ctx, signatureAggregator, fundedKey, l1AInfo, pChainInfo, - posValidatorManager, + posStakingManager, proxyAddress, posValidationID, expiry2, diff --git a/tests/network/network.go b/tests/network/network.go index 18054a5d3..ccb95bccc 100644 --- a/tests/network/network.go +++ b/tests/network/network.go @@ -3,25 +3,31 @@ package network import ( "context" "crypto/ecdsa" - "encoding/base64" "encoding/hex" "encoding/json" + goLog "log" "os" - "slices" + "sort" "time" "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/config" + "github.com/ava-labs/avalanchego/genesis" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" - "github.com/ava-labs/avalanchego/upgrade" "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" + "github.com/ava-labs/avalanchego/utils/formatting/address" + "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/platformvm" + "github.com/ava-labs/avalanchego/vms/platformvm/txs" + warpMessage "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" "github.com/ava-labs/avalanchego/vms/secp256k1fx" pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" "github.com/ava-labs/avalanchego/wallet/subnet/primary" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/ethclient" subnetEvmTestUtils "github.com/ava-labs/subnet-evm/tests/utils" + proxyadmin "github.com/ava-labs/teleporter/abi-bindings/go/ProxyAdmin" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -35,10 +41,10 @@ import ( type LocalNetwork struct { tmpnet.Network - extraNodes []*tmpnet.Node // to add as more l1 validators in the tests - primaryNetworkValidators []ids.NodeID - globalFundedKey *ecdsa.PrivateKey - pChainWallet pwallet.Wallet + extraNodes []*tmpnet.Node // to add as more L1 validators in the tests + primaryNetworkValidators []*tmpnet.Node + globalFundedKey *secp256k1.PrivateKey + validatorManagers map[ids.ID]common.Address } const ( @@ -62,16 +68,15 @@ func NewLocalNetwork( name string, warpGenesisTemplateFile string, l1Specs []L1Spec, + numPrimaryNetworkValidators int, extraNodeCount int, // for use by tests, eg to add new L1 validators ) *LocalNetwork { - var err error + // There must be at least one primary network validator per L1 + Expect(numPrimaryNetworkValidators).Should(BeNumerically(">=", len(l1Specs))) // Create extra nodes to be used to add more validators later extraNodes := subnetEvmTestUtils.NewTmpnetNodes(extraNodeCount) - var allNodes []*tmpnet.Node - allNodes = append(allNodes, extraNodes...) // to be appended w/ L1 validators - fundedKey, err := hex.DecodeString(fundedKeyStr) Expect(err).Should(BeNil()) globalFundedKey, err := secp256k1.ToPrivateKey(fundedKey) @@ -81,48 +86,53 @@ func NewLocalNetwork( Expect(err).Should(BeNil()) var l1s []*tmpnet.Subnet - for _, subnetSpec := range l1Specs { - nodes := subnetEvmTestUtils.NewTmpnetNodes(subnetSpec.NodeCount) - allNodes = append(allNodes, nodes...) + bootstrapNodes := subnetEvmTestUtils.NewTmpnetNodes(numPrimaryNetworkValidators) + for i, l1Spec := range l1Specs { + // Create a single bootstrap node. This will be removed from the L1 validator set after it is converted, + // but will remain a primary network validator + initialL1Bootstrapper := bootstrapNodes[i] // One bootstrap node per L1 + + // Create validators to specify as the initial vdr set in the L1 conversion, and store them as extra nodes + initialVdrNodes := subnetEvmTestUtils.NewTmpnetNodes(l1Spec.NodeCount) + extraNodes = append(extraNodes, initialVdrNodes...) l1 := subnetEvmTestUtils.NewTmpnetSubnet( - subnetSpec.Name, + l1Spec.Name, utils.InstantiateGenesisTemplate( warpGenesisTemplateFile, - subnetSpec.EVMChainID, - subnetSpec.TeleporterContractAddress, - subnetSpec.TeleporterDeployedBytecode, - subnetSpec.TeleporterDeployerAddress, + l1Spec.EVMChainID, + l1Spec.TeleporterContractAddress, + l1Spec.TeleporterDeployedBytecode, + l1Spec.TeleporterDeployerAddress, ), utils.WarpEnabledChainConfig, - nodes..., + initialL1Bootstrapper, ) l1.OwningKey = globalFundedKey l1s = append(l1s, l1) } - network := subnetEvmTestUtils.NewTmpnetNetwork( name, - allNodes, + bootstrapNodes, utils.WarpEnabledChainConfig, l1s..., ) Expect(network).ShouldNot(BeNil()) - // Activate Etna - upgrades := upgrade.Default - upgrades.EtnaTime = time.Now().Add(-1 * time.Minute) - upgradeJSON, err := json.Marshal(upgrades) - Expect(err).Should(BeNil()) - - upgradeBase64 := base64.StdEncoding.EncodeToString(upgradeJSON) - network.DefaultFlags.SetDefaults(tmpnet.FlagsMap{ - config.UpgradeFileContentKey: upgradeBase64, - }) - avalancheGoBuildPath, ok := os.LookupEnv("AVALANCHEGO_BUILD_PATH") Expect(ok).Should(Equal(true)) + // Specify only a subset of the nodes to be bootstrapped + keysToFund := []*secp256k1.PrivateKey{ + genesis.VMRQKey, + genesis.EWOQKey, + tmpnet.HardhatKey, + } + keysToFund = append(keysToFund, network.PreFundedKeys...) + genesis, err := tmpnet.NewTestGenesis(88888, bootstrapNodes, keysToFund) + Expect(err).Should(BeNil()) + network.Genesis = genesis + ctx, cancelBootstrap := context.WithCancel(ctx) defer cancelBootstrap() err = tmpnet.BootstrapNewNetwork( @@ -134,6 +144,7 @@ func NewLocalNetwork( avalancheGoBuildPath+"/plugins", ) Expect(err).Should(BeNil()) + goLog.Println("Network bootstrapped") // Issue transactions to activate the proposerVM fork on the chains for _, l1 := range network.Subnets { @@ -141,43 +152,187 @@ func NewLocalNetwork( } // All nodes are specified as bootstrap validators - var primaryNetworkValidators []ids.NodeID - for _, node := range network.Nodes { - primaryNetworkValidators = append(primaryNetworkValidators, node.NodeID) - } + var primaryNetworkValidators []*tmpnet.Node + primaryNetworkValidators = append(primaryNetworkValidators, network.Nodes...) localNetwork := &LocalNetwork{ Network: *network, extraNodes: extraNodes, - globalFundedKey: globalFundedECDSAKey, + globalFundedKey: globalFundedKey, primaryNetworkValidators: primaryNetworkValidators, + validatorManagers: make(map[ids.ID]common.Address), } - // Create the P-Chain wallet to issue transactions - kc := secp256k1fx.NewKeychain(globalFundedKey) + return localNetwork +} + +func (n *LocalNetwork) ConvertSubnet( + ctx context.Context, + l1 interfaces.L1TestInfo, + managerType utils.ValidatorManagerConcreteType, + weights []uint64, + senderKey *ecdsa.PrivateKey, + proxy bool, +) ([]utils.Node, []ids.ID, *proxyadmin.ProxyAdmin) { + goLog.Println("Converting l1", l1.L1ID) + cChainInfo := n.GetPrimaryNetworkInfo() + pClient := platformvm.NewClient(cChainInfo.NodeURIs[0]) + currentValidators, err := pClient.GetCurrentValidators(ctx, l1.L1ID, nil) + Expect(err).Should(BeNil()) + + vdrManagerAddress, proxyAdmin := utils.DeployAndInitializeValidatorManager( + ctx, + senderKey, + l1, + managerType, + proxy, + ) + n.validatorManagers[l1.L1ID] = vdrManagerAddress + + tmpnetNodes := n.GetExtraNodes(len(weights)) + sort.Slice(tmpnetNodes, func(i, j int) bool { + return string(tmpnetNodes[i].NodeID.Bytes()) < string(tmpnetNodes[j].NodeID.Bytes()) + }) + + var nodes []utils.Node + // Construct the converted l1 info + destAddr, err := address.ParseToID(utils.DefaultPChainAddress) + Expect(err).Should(BeNil()) + vdrs := make([]*txs.ConvertSubnetToL1Validator, len(tmpnetNodes)) + for i, node := range tmpnetNodes { + signer, err := node.GetProofOfPossession() + Expect(err).Should(BeNil()) + nodes = append(nodes, utils.Node{ + NodeID: node.NodeID, + NodePoP: signer, + Weight: weights[i], + }) + vdrs[i] = &txs.ConvertSubnetToL1Validator{ + NodeID: node.NodeID.Bytes(), + Weight: weights[i], + Balance: units.Avax * 100, + Signer: *signer, + RemainingBalanceOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + } + } + pChainWallet := n.GetPChainWallet() + _, err = pChainWallet.IssueConvertSubnetToL1Tx( + l1.L1ID, + l1.BlockchainID, + vdrManagerAddress[:], + vdrs, + ) + Expect(err).Should(BeNil()) + + l1 = n.AddSubnetValidators(tmpnetNodes, l1) + + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + aggregator := n.GetSignatureAggregator() + defer aggregator.Shutdown() + validationIDs := utils.InitializeValidatorSet( + ctx, + senderKey, + l1, + utils.GetPChainInfo(cChainInfo), + vdrManagerAddress, + n.GetNetworkID(), + aggregator, + nodes, + ) + + // Remove the bootstrap nodes as l1 validators + for _, vdr := range currentValidators { + _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, l1.L1ID) + Expect(err).Should(BeNil()) + for _, node := range n.Network.Nodes { + if node.NodeID == vdr.NodeID { + goLog.Println("Restarting bootstrap node", node.NodeID) + n.Network.RestartNode(ctx, os.Stdout, node) + } + } + } + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + return nodes, validationIDs, proxyAdmin +} + +func (n *LocalNetwork) AddSubnetValidators( + nodes []*tmpnet.Node, + l1 interfaces.L1TestInfo, +) interfaces.L1TestInfo { + // Modify the each node's config to track the l1 + for _, node := range nodes { + goLog.Printf("Adding node %s @ %s to l1 %s", node.NodeID, node.URI, l1.L1ID) + existingTrackedSubnets, err := node.Flags.GetStringVal(config.TrackSubnetsKey) + Expect(err).Should(BeNil()) + if existingTrackedSubnets == l1.L1ID.String() { + goLog.Printf("Node %s @ %s already tracking l1 %s\n", node.NodeID, node.URI, l1.L1ID) + continue + } + node.Flags[config.TrackSubnetsKey] = l1.L1ID.String() + + // Add the node to the network + n.Network.Nodes = append(n.Network.Nodes, node) + } + err := n.Network.StartNodes(context.Background(), os.Stdout, nodes...) + Expect(err).Should(BeNil()) + + // Update the tmpnet Subnet struct + for _, tmpnetSubnet := range n.Network.Subnets { + if tmpnetSubnet.SubnetID == l1.L1ID { + for _, tmpnetNode := range nodes { + tmpnetSubnet.ValidatorIDs = append(tmpnetSubnet.ValidatorIDs, tmpnetNode.NodeID) + } + } + } + + // Refresh the l1 info after restarting the nodes + return n.GetL1Info(l1.L1ID) +} + +func (n *LocalNetwork) GetValidatorManager(l1ID ids.ID) common.Address { + return n.validatorManagers[l1ID] +} + +func (n *LocalNetwork) GetSignatureAggregator() *aggregator.SignatureAggregator { var l1IDs []ids.ID - for _, l1 := range localNetwork.GetL1Infos() { + for _, l1 := range n.GetL1Infos() { l1IDs = append(l1IDs, l1.L1ID) } - wallet, err := primary.MakeWallet(ctx, &primary.WalletConfig{ - URI: localNetwork.GetPrimaryNetworkInfo().NodeURIs[0], - AVAXKeychain: kc, - EthKeychain: kc, - SubnetIDs: l1IDs, - }) - Expect(err).Should(BeNil()) - localNetwork.pChainWallet = wallet.P() + return utils.NewSignatureAggregator( + n.GetPrimaryNetworkInfo().NodeURIs[0], + l1IDs, + ) +} - return localNetwork +func (n *LocalNetwork) GetExtraNodes(count int) []*tmpnet.Node { + Expect(len(n.extraNodes) >= count).Should( + BeTrue(), + "not enough extra nodes to use", + ) + nodes := n.extraNodes[0:count] + n.extraNodes = n.extraNodes[count:] + return nodes +} + +func (n *LocalNetwork) GetPrimaryNetworkValidators() []*tmpnet.Node { + return n.primaryNetworkValidators } func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.L1TestInfo { var nodeURIs []string - for _, nodeID := range n.primaryNetworkValidators { - uri, err := n.Network.GetURIForNodeID(nodeID) - Expect(err).Should(BeNil()) - - nodeURIs = append(nodeURIs, uri) + for _, node := range n.primaryNetworkValidators { + nodeURIs = append(nodeURIs, node.URI) } infoClient := info.NewClient(nodeURIs[0]) cChainBlockchainID, err := infoClient.GetBlockchainID(context.Background(), "C") @@ -201,7 +356,38 @@ func (n *LocalNetwork) GetPrimaryNetworkInfo() interfaces.L1TestInfo { } } -// Returns all L1 info sorted in lexicographic order of L1Name. +func (n *LocalNetwork) GetL1Info(l1ID ids.ID) interfaces.L1TestInfo { + for _, l1 := range n.Network.Subnets { + if l1.SubnetID == l1ID { + var nodeURIs []string + for _, nodeID := range l1.ValidatorIDs { + uri, err := n.Network.GetURIForNodeID(nodeID) + Expect(err).Should(BeNil()) + + nodeURIs = append(nodeURIs, uri) + } + blockchainID := l1.Chains[0].ChainID + wsClient, err := ethclient.Dial(utils.HttpToWebsocketURI(nodeURIs[0], blockchainID.String())) + Expect(err).Should(BeNil()) + + rpcClient, err := ethclient.Dial(utils.HttpToRPCURI(nodeURIs[0], blockchainID.String())) + Expect(err).Should(BeNil()) + evmChainID, err := rpcClient.ChainID(context.Background()) + Expect(err).Should(BeNil()) + return interfaces.L1TestInfo{ + L1ID: l1ID, + BlockchainID: blockchainID, + NodeURIs: nodeURIs, + WSClient: wsClient, + RPCClient: rpcClient, + EVMChainID: evmChainID, + } + } + } + return interfaces.L1TestInfo{} +} + +// Returns all l1 info sorted in lexicographic order of L1Name. func (n *LocalNetwork) GetL1Infos() []interfaces.L1TestInfo { l1s := make([]interfaces.L1TestInfo, len(n.Network.Subnets)) for i, l1 := range n.Network.Subnets { @@ -239,8 +425,9 @@ func (n *LocalNetwork) GetAllL1Infos() []interfaces.L1TestInfo { } func (n *LocalNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { - fundedAddress := crypto.PubkeyToAddress(n.globalFundedKey.PublicKey) - return fundedAddress, n.globalFundedKey + ecdsaKey := n.globalFundedKey.ToECDSA() + fundedAddress := crypto.PubkeyToAddress(ecdsaKey.PublicKey) + return fundedAddress, ecdsaKey } func (n *LocalNetwork) TearDownNetwork() { @@ -250,89 +437,6 @@ func (n *LocalNetwork) TearDownNetwork() { Expect(n.Network.Stop(context.Background())).Should(BeNil()) } -func (n *LocalNetwork) AddL1Validators(ctx context.Context, l1ID ids.ID, count uint) { - Expect(count > 0).Should(BeTrue(), "can't add 0 validators") - Expect(uint(len(n.extraNodes)) >= count).Should( - BeTrue(), - "not enough extra nodes to use", - ) - - l1 := n.Network.Subnets[slices.IndexFunc( - n.Network.Subnets, - func(s *tmpnet.Subnet) bool { return s.SubnetID == l1ID }, - )] - - // consume some of the extraNodes - var newValidatorNodes []*tmpnet.Node - newValidatorNodes = append(newValidatorNodes, n.extraNodes[0:count]...) - n.extraNodes = n.extraNodes[count:] - - apiURI, err := n.Network.GetURIForNodeID(l1.ValidatorIDs[0]) - Expect(err).Should(BeNil()) - - ctx, cancel := context.WithCancel(ctx) - defer cancel() - err = l1.AddValidators( - ctx, - os.Stdout, - apiURI, - newValidatorNodes..., - ) - Expect(err).Should(BeNil()) - - for _, node := range newValidatorNodes { - l1.ValidatorIDs = append(l1.ValidatorIDs, node.NodeID) - node.Flags[config.TrackSubnetsKey] = l1ID.String() - } - - tmpnet.WaitForActiveValidators(ctx, os.Stdout, platformvm.NewClient(n.Network.Nodes[0].URI), l1) - - nodeIdsToRestart := make([]ids.NodeID, len(newValidatorNodes)) - for i, node := range newValidatorNodes { - n.primaryNetworkValidators = append(n.primaryNetworkValidators, node.NodeID) - nodeIdsToRestart[i] = node.NodeID - } - n.RestartNodes(ctx, nodeIdsToRestart) -} - -// Restarts the nodes with the given nodeIDs. If nodeIDs is empty, restarts all nodes. -func (n *LocalNetwork) RestartNodes(ctx context.Context, nodeIDs []ids.NodeID) { - log.Info("Restarting nodes", "nodeIDs", nodeIDs) - var nodes []*tmpnet.Node - if len(nodeIDs) == 0 { - nodes = n.Network.Nodes - } else { - for _, nodeID := range nodeIDs { - for _, node := range n.Network.Nodes { - if node.NodeID == nodeID { - nodes = append(nodes, node) - } - } - } - } - - for _, node := range nodes { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - err := node.SaveAPIPort() - Expect(err).Should(BeNil()) - - err = node.Stop(ctx) - Expect(err).Should(BeNil()) - - err = n.Network.StartNode(ctx, os.Stdout, node) - Expect(err).Should(BeNil()) - } - - log.Info("Waiting for all nodes to report healthy") - ctx, cancel := context.WithTimeout(ctx, 30*time.Second) - defer cancel() - for _, node := range nodes { - err := tmpnet.WaitForHealthy(ctx, node) - Expect(err).Should(BeNil()) - } -} - func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { for chainIDStr, chainConfig := range chainConfigs { if chainIDStr == utils.CChainPathSpecifier { @@ -368,6 +472,12 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { log.Error("failed to write L1s", "error", err) } } + + // Restart the network to apply the new chain configs + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(60*len(n.Network.Nodes))*time.Second) + defer cancel() + err = n.Network.Restart(ctx, os.Stdout) + Expect(err).Should(BeNil()) } func (n *LocalNetwork) GetNetworkID() uint32 { @@ -379,7 +489,20 @@ func (n *LocalNetwork) Dir() string { } func (n *LocalNetwork) GetPChainWallet() pwallet.Wallet { - return n.pChainWallet + // Create the P-Chain wallet to issue transactions + kc := secp256k1fx.NewKeychain(n.globalFundedKey) + var l1IDs []ids.ID + for _, l1 := range n.GetL1Infos() { + l1IDs = append(l1IDs, l1.L1ID) + } + wallet, err := primary.MakeWallet(context.Background(), &primary.WalletConfig{ + URI: n.GetPrimaryNetworkInfo().NodeURIs[0], + AVAXKeychain: kc, + EthKeychain: kc, + SubnetIDs: l1IDs, + }) + Expect(err).Should(BeNil()) + return wallet.P() } func (n *LocalNetwork) GetTwoL1s() ( diff --git a/tests/suites/governance/governance_suite_test.go b/tests/suites/governance/governance_suite_test.go index 3a91fb569..d0c944dc8 100644 --- a/tests/suites/governance/governance_suite_test.go +++ b/tests/suites/governance/governance_suite_test.go @@ -53,6 +53,7 @@ var _ = ginkgo.BeforeSuite(func() { }, }, 2, + 2, ) log.Info("Started local network") }) diff --git a/tests/suites/ictt/ictt_suite_test.go b/tests/suites/ictt/ictt_suite_test.go index 10c9c0016..61ae87ca1 100644 --- a/tests/suites/ictt/ictt_suite_test.go +++ b/tests/suites/ictt/ictt_suite_test.go @@ -84,6 +84,7 @@ var _ = ginkgo.BeforeSuite(func() { }, }, 2, + 2, ) TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllL1Infos()) log.Info("Started local network") diff --git a/tests/suites/teleporter/teleporter_suite_test.go b/tests/suites/teleporter/teleporter_suite_test.go index 3de0063a3..35fd31b47 100644 --- a/tests/suites/teleporter/teleporter_suite_test.go +++ b/tests/suites/teleporter/teleporter_suite_test.go @@ -9,9 +9,10 @@ import ( "testing" "time" + "github.com/ava-labs/avalanchego/utils/units" teleporterFlows "github.com/ava-labs/teleporter/tests/flows/teleporter" registryFlows "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" - localnetwork "github.com/ava-labs/teleporter/tests/network" + "github.com/ava-labs/teleporter/tests/network" "github.com/ava-labs/teleporter/tests/utils" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" @@ -29,7 +30,7 @@ const ( ) var ( - LocalNetworkInstance *localnetwork.LocalNetwork + LocalNetworkInstance *network.LocalNetwork TeleporterInfo utils.TeleporterTestInfo ) @@ -57,21 +58,21 @@ var _ = ginkgo.BeforeSuite(func() { Expect(err).Should(BeNil()) // Create the local network instance - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 240*2*time.Second) defer cancel() - LocalNetworkInstance = localnetwork.NewLocalNetwork( + LocalNetworkInstance = network.NewLocalNetwork( ctx, "teleporter-test-local-network", warpGenesisTemplateFile, - []localnetwork.L1Spec{ + []network.L1Spec{ { Name: "A", EVMChainID: 12345, TeleporterContractAddress: teleporterContractAddress, TeleporterDeployedBytecode: teleporterDeployedBytecode, TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + NodeCount: 5, }, { Name: "B", @@ -79,10 +80,11 @@ var _ = ginkgo.BeforeSuite(func() { TeleporterContractAddress: teleporterContractAddress, TeleporterDeployedBytecode: teleporterDeployedBytecode, TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + NodeCount: 5, }, }, 2, + 2, ) TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllL1Infos()) log.Info("Started local network") @@ -104,6 +106,17 @@ var _ = ginkgo.BeforeSuite(func() { TeleporterInfo.DeployTeleporterRegistry(l1, fundedKey) } + for _, subnet := range LocalNetworkInstance.GetL1Infos() { + // Choose weights such that we can test validator churn + LocalNetworkInstance.ConvertSubnet( + ctx, + subnet, + utils.PoAValidatorManager, + []uint64{units.Schmeckle, units.Schmeckle, units.Schmeckle, units.Schmeckle, units.Schmeckle}, + fundedKey, + false) + } + log.Info("Set up ginkgo before suite") }) diff --git a/tests/suites/validator-manager/validator_manager_suite_test.go b/tests/suites/validator-manager/validator_manager_suite_test.go index b7cc1e84a..5013682f5 100644 --- a/tests/suites/validator-manager/validator_manager_suite_test.go +++ b/tests/suites/validator-manager/validator_manager_suite_test.go @@ -34,7 +34,7 @@ func TestValidatorManager(t *testing.T) { // Define the before and after suite functions. var _ = ginkgo.BeforeEach(func() { // Create the local network instance - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 240*time.Second) defer cancel() LocalNetworkInstance = localnetwork.NewLocalNetwork( ctx, @@ -53,6 +53,7 @@ var _ = ginkgo.BeforeEach(func() { }, }, 2, + 2, ) log.Info("Started local network") }) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index a3870f709..a00e43725 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -36,7 +36,6 @@ import ( "github.com/ava-labs/subnet-evm/precompile/contracts/nativeminter" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" - warpBackend "github.com/ava-labs/subnet-evm/warp" nativeMinter "github.com/ava-labs/teleporter/abi-bindings/go/INativeMinter" "github.com/ava-labs/teleporter/tests/interfaces" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" @@ -541,10 +540,7 @@ func InstantiateGenesisTemplate( return l1GenesisFile.Name() } -// // Aggregator utils -// - func NewSignatureAggregator(apiUri string, l1IDs []ids.ID) *aggregator.SignatureAggregator { cfg := sigAggConfig.Config{ PChainAPI: &relayerConfig.APIConfig{ @@ -557,8 +553,16 @@ func NewSignatureAggregator(apiUri string, l1IDs []ids.ID) *aggregator.Signature trackedL1s := set.NewSet[ids.ID](len(l1IDs)) trackedL1s.Add(l1IDs...) registry := prometheus.NewRegistry() + messageCreator, err := message.NewCreator( + logging.NoLog{}, + registry, + constants.DefaultNetworkCompressionType, + constants.DefaultNetworkMaximumInboundTimeout, + ) + Expect(err).Should(BeNil()) + appRequestNetwork, err := peers.NewNetwork( - logging.Info, + logging.Error, registry, trackedL1s, nil, @@ -566,19 +570,12 @@ func NewSignatureAggregator(apiUri string, l1IDs []ids.ID) *aggregator.Signature ) Expect(err).Should(BeNil()) - messageCreator, err := message.NewCreator( - logging.NoLog{}, - registry, - constants.DefaultNetworkCompressionType, - constants.DefaultNetworkMaximumInboundTimeout, - ) - Expect(err).Should(BeNil()) agg, err := aggregator.NewSignatureAggregator( appRequestNetwork, logging.NoLog{}, + messageCreator, 1024, metrics.NewSignatureAggregatorMetrics(prometheus.NewRegistry()), - messageCreator, // Setting the etnaTime to a minute ago so that the post-etna code path is used in the test time.Now().Add(-1*time.Minute), ) @@ -657,17 +654,11 @@ func ConstructSignedWarpMessage( sourceReceipt *types.Receipt, source interfaces.L1TestInfo, destination interfaces.L1TestInfo, + justification []byte, + signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { unsignedMsg := ExtractWarpMessageFromLog(ctx, sourceReceipt, source) - // Set local variables for the duration of the test - unsignedWarpMessageID := unsignedMsg.ID() - log.Info( - "Parsed unsignedWarpMsg", - "unsignedWarpMessageID", unsignedWarpMessageID, - "unsignedWarpMessage", unsignedMsg, - ) - // Loop over each client on source chain to ensure they all have time to accept the block. // Note: if we did not confirm this here, the next stage could be racy since it assumes every node // has accepted the block. @@ -675,37 +666,30 @@ func ConstructSignedWarpMessage( // Get the aggregate signature for the Warp message log.Info("Fetching aggregate signature from the source chain validators") - return GetSignedMessage(ctx, source, destination, unsignedWarpMessageID) + return GetSignedMessage(source, destination, unsignedMsg, justification, signatureAggregator) } func GetSignedMessage( - ctx context.Context, source interfaces.L1TestInfo, destination interfaces.L1TestInfo, - unsignedWarpMessageID ids.ID, + unsignedWarpMessage *avalancheWarp.UnsignedMessage, + justification []byte, + signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) - warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) - Expect(err).Should(BeNil()) - signingL1ID := source.L1ID if source.L1ID == constants.PrimaryNetworkID { signingL1ID = destination.L1ID } - // Get the aggregate signature for the Warp message - signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( - ctx, - unsignedWarpMessageID, + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedWarpMessage, + justification, + signingL1ID, warp.WarpDefaultQuorumNumerator, - signingL1ID.String(), ) Expect(err).Should(BeNil()) - signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) - Expect(err).Should(BeNil()) - - return signedWarpMsg + return signedWarpMessage } func SetupProposerVM(ctx context.Context, fundedKey *ecdsa.PrivateKey, network *tmpnet.Network, L1ID ids.ID) { diff --git a/tests/utils/governance.go b/tests/utils/governance.go index b65243e0d..0e9b84db4 100644 --- a/tests/utils/governance.go +++ b/tests/utils/governance.go @@ -6,6 +6,7 @@ import ( avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" @@ -37,7 +38,7 @@ func DeployValidatorSetSig( } // Returns Receipt for the transaction unlike TeleporterRegistry version since this is a non-teleporter case -// and we don't want to add the ValidatorSetSig ABI to the l1Info +// and we don't want to add the ValidatorSetSig ABI to the L1Info func ExecuteValidatorSetSigCallAndVerify( ctx context.Context, source interfaces.L1TestInfo, @@ -45,9 +46,10 @@ func ExecuteValidatorSetSigCallAndVerify( validatorSetSigAddress common.Address, senderKey *ecdsa.PrivateKey, unsignedMessage *avalancheWarp.UnsignedMessage, + signatureAggregator *aggregator.SignatureAggregator, expectSuccess bool, ) *types.Receipt { - signedWarpMsg := GetSignedMessage(ctx, source, destination, unsignedMessage.ID()) + signedWarpMsg := GetSignedMessage(source, destination, unsignedMessage, nil, signatureAggregator) log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) signedPredicateTx := CreateExecuteCallPredicateTransaction( diff --git a/tests/utils/ictt.go b/tests/utils/ictt.go index da7427b4d..946f73d66 100644 --- a/tests/utils/ictt.go +++ b/tests/utils/ictt.go @@ -10,6 +10,7 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" erc20tokenhome "github.com/ava-labs/teleporter/abi-bindings/go/ictt/TokenHome/ERC20TokenHome" @@ -307,6 +308,7 @@ func RegisterERC20TokenRemoteOnHome( remoteL1 interfaces.L1TestInfo, remoteAddress common.Address, fundedKey *ecdsa.PrivateKey, + signatureAggregator *aggregator.SignatureAggregator, ) { RegisterTokenRemoteOnHome( ctx, @@ -319,6 +321,7 @@ func RegisterERC20TokenRemoteOnHome( big.NewInt(1), false, fundedKey, + signatureAggregator, ) } @@ -333,6 +336,7 @@ func RegisterTokenRemoteOnHome( expectedTokenMultiplier *big.Int, expectedmultiplyOnRemote bool, fundedKey *ecdsa.PrivateKey, + signatureAggregator *aggregator.SignatureAggregator, ) *big.Int { // Call the remote to send a register message to the home tokenRemote, err := tokenremote.NewTokenRemote( @@ -374,7 +378,16 @@ func RegisterTokenRemoteOnHome( receipt := WaitForTransactionSuccess(ctx, remoteL1, sendRegisterTx.Hash()) // Relay the register message to the home - receipt = teleporter.RelayTeleporterMessage(ctx, receipt, remoteL1, homeL1, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage( + ctx, + receipt, + remoteL1, + homeL1, + true, + fundedKey, + nil, + signatureAggregator, + ) _, err = GetEventFromLogs( receipt.Logs, teleporter.TeleporterMessenger(homeL1).ParseMessageExecuted, @@ -836,6 +849,7 @@ func SendNativeMultiHopAndVerify( cChainInfo interfaces.L1TestInfo, amount *big.Int, secondaryFeeAmount *big.Int, + signatureAggregator *aggregator.SignatureAggregator, ) { input := nativetokenremote.SendTokensInput{ DestinationBlockchainID: toL1.BlockchainID, @@ -868,6 +882,8 @@ func SendNativeMultiHopAndVerify( cChainInfo, true, sendingKey, + nil, + signatureAggregator, ) initialBalance, err := toL1.RPCClient.BalanceAt(ctx, recipientAddress, nil) @@ -883,6 +899,8 @@ func SendNativeMultiHopAndVerify( toL1, true, sendingKey, + nil, + signatureAggregator, ) transferredAmount := big.NewInt(0).Sub(amount, input.SecondaryFee) @@ -909,6 +927,7 @@ func SendERC20TokenMultiHopAndVerify( cChainInfo interfaces.L1TestInfo, amount *big.Int, secondaryFeeAmount *big.Int, + signatureAggregator *aggregator.SignatureAggregator, ) { // Send tokens to the sender address to have gas for submitting the send tokens transaction SendNativeTransfer( @@ -949,6 +968,8 @@ func SendERC20TokenMultiHopAndVerify( cChainInfo, true, fundedKey, + nil, + signatureAggregator, ) _, err := GetEventFromLogs( intermediateReceipt.Logs, @@ -971,6 +992,8 @@ func SendERC20TokenMultiHopAndVerify( toL1, true, fundedKey, + nil, + signatureAggregator, ) _, err = GetEventFromLogs(remoteReceipt.Logs, teleporter.TeleporterMessenger(toL1).ParseMessageExecuted) if err != nil { diff --git a/tests/utils/proxy.go b/tests/utils/proxy.go index 101fc6175..becee3a35 100644 --- a/tests/utils/proxy.go +++ b/tests/utils/proxy.go @@ -13,13 +13,12 @@ import ( . "github.com/onsi/gomega" ) -func DeployTransparentUpgradeableProxy[T any]( +func DeployTransparentUpgradeableProxy( ctx context.Context, l1 interfaces.L1TestInfo, senderKey *ecdsa.PrivateKey, implAddress common.Address, - newInstance func(address common.Address, backend bind.ContractBackend) (*T, error), -) (common.Address, *proxyadmin.ProxyAdmin, *T) { +) (common.Address, *proxyadmin.ProxyAdmin) { opts, err := bind.NewKeyedTransactorWithChainID( senderKey, l1.EVMChainID, @@ -42,8 +41,5 @@ func DeployTransparentUpgradeableProxy[T any]( proxyAdmin, err := proxyadmin.NewProxyAdmin(proxyAdminEvent.NewAdmin, l1.RPCClient) Expect(err).Should(BeNil()) - contract, err := newInstance(proxyAddress, l1.RPCClient) - Expect(err).Should(BeNil()) - - return proxyAddress, proxyAdmin, contract + return proxyAddress, proxyAdmin } diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index fa175e3ea..5ca244a9c 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -9,6 +9,7 @@ import ( "github.com/ava-labs/avalanchego/ids" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" @@ -154,12 +155,21 @@ func (t TeleporterTestInfo) RelayTeleporterMessage( destination interfaces.L1TestInfo, expectSuccess bool, fundedKey *ecdsa.PrivateKey, + justification []byte, + signatureAggregator *aggregator.SignatureAggregator, ) *types.Receipt { // Fetch the Teleporter message from the logs sendEvent, err := GetEventFromLogs(sourceReceipt.Logs, t.TeleporterMessenger(source).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) - signedWarpMessage := ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) + signedWarpMessage := ConstructSignedWarpMessage( + ctx, + sourceReceipt, + source, + destination, + justification, + signatureAggregator, + ) // Construct the transaction to send the Warp message to the destination chain signedTx := CreateReceiveCrossChainMessageTransaction( @@ -197,6 +207,7 @@ func (t TeleporterTestInfo) SendExampleCrossChainMessageAndVerify( destExampleMessenger *testmessenger.TestMessenger, senderKey *ecdsa.PrivateKey, message string, + signatureAggregator *aggregator.SignatureAggregator, expectSuccess bool, ) { // Call the example messenger contract on Subnet A @@ -228,7 +239,7 @@ func (t TeleporterTestInfo) SendExampleCrossChainMessageAndVerify( // // Relay the message to the destination // - receipt = t.RelayTeleporterMessage(ctx, receipt, source, destination, true, senderKey) + receipt = t.RelayTeleporterMessage(ctx, receipt, source, destination, true, senderKey, nil, signatureAggregator) // // Check Teleporter message received on the destination @@ -275,8 +286,9 @@ func (t TeleporterTestInfo) AddProtocolVersionAndWaitForAcceptance( newTeleporterAddress common.Address, senderKey *ecdsa.PrivateKey, unsignedMessage *avalancheWarp.UnsignedMessage, + signatureAggregator *aggregator.SignatureAggregator, ) { - signedWarpMsg := GetSignedMessage(ctx, l1, l1, unsignedMessage.ID()) + signedWarpMsg := GetSignedMessage(l1, l1, unsignedMessage, nil, signatureAggregator) log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) // Construct tx to add protocol version and send to destination chain @@ -316,6 +328,7 @@ func (t TeleporterTestInfo) ClearReceiptQueue( fundedKey *ecdsa.PrivateKey, source interfaces.L1TestInfo, destination interfaces.L1TestInfo, + signatureAggregator *aggregator.SignatureAggregator, ) { sourceTeleporterMessenger := t.TeleporterMessenger(source) outstandReceiptCount := GetOutstandingReceiptCount( @@ -344,7 +357,7 @@ func (t TeleporterTestInfo) ClearReceiptQueue( ctx, sourceTeleporterMessenger, source, destination, sendCrossChainMessageInput, fundedKey) // Relay message - t.RelayTeleporterMessage(ctx, receipt, source, destination, true, fundedKey) + t.RelayTeleporterMessage(ctx, receipt, source, destination, true, fundedKey, nil, signatureAggregator) outstandReceiptCount = GetOutstandingReceiptCount(sourceTeleporterMessenger, destination.BlockchainID) } diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 51c15fea7..d93042cf4 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -9,10 +9,8 @@ import ( "log" "math/big" "reflect" - "sort" "time" - "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/proto/pb/platformvm" "github.com/ava-labs/avalanchego/utils/crypto/bls" @@ -20,7 +18,6 @@ import ( "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/components/avax" "github.com/ava-labs/avalanchego/vms/platformvm/stakeable" - "github.com/ava-labs/avalanchego/vms/platformvm/txs" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" warpMessage "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" @@ -33,11 +30,14 @@ import ( predicateutils "github.com/ava-labs/subnet-evm/predicate" subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" "github.com/ava-labs/subnet-evm/warp/messages" + proxyadmin "github.com/ava-labs/teleporter/abi-bindings/go/ProxyAdmin" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ERC20TokenStakingManager" examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" + iposvalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/interfaces/IPoSValidatorManager" + ivalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/interfaces/IValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" "google.golang.org/protobuf/proto" @@ -57,202 +57,188 @@ const ( DefaultPChainAddress string = "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" ) +type ValidatorManagerConcreteType int + +const ( + PoAValidatorManager ValidatorManagerConcreteType = iota + ERC20TokenStakingManager + NativeTokenStakingManager +) + // // Deployment utils // -func DeployNativeTokenStakingManager( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, -) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { - // Reset the global binary data for better test isolation - nativetokenstakingmanager.NativeTokenStakingManagerBin = - nativetokenstakingmanager.NativeTokenStakingManagerMetaData.Bin - - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - address, tx, stakingManager, err := nativetokenstakingmanager.DeployNativeTokenStakingManager( - opts, - l1.RPCClient, - 0, // ICMInitializable.Allowed - ) - Expect(err).Should(BeNil()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - return address, stakingManager -} - -func DeployAndInitializeNativeTokenStakingManager( +func DeployValidatorManager( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, -) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { - stakingManagerContractAddress, stakingManager := DeployNativeTokenStakingManager( - ctx, - senderKey, - l1, - ) - rewardCalculatorAddress, _ := DeployExampleRewardCalculator( - ctx, - senderKey, - l1, - uint64(10), - ) + managerType ValidatorManagerConcreteType, +) (common.Address, *ivalidatormanager.IValidatorManager) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.Initialize( - opts, - nativetokenstakingmanager.PoSValidatorManagerSettings{ - BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - L1ID: l1.L1ID, - ChurnPeriodSeconds: DefaultChurnPeriodSeconds, - MaximumChurnPercentage: DefaultMaxChurnPercentage, - }, - MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), - MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), - MinimumStakeDuration: DefaultMinStakeDurationSeconds, - MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, - MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), - RewardCalculator: rewardCalculatorAddress, - UptimeBlockchainID: l1.BlockchainID, - }, + var ( + tx *types.Transaction + address common.Address + validatorManager *ivalidatormanager.IValidatorManager ) - Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, l1, tx.Hash()) + switch managerType { + case PoAValidatorManager: + // Reset the global binary data for better test isolation + poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin - return stakingManagerContractAddress, stakingManager -} + address, tx, _, err = poavalidatormanager.DeployPoAValidatorManager( + opts, + l1.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + case ERC20TokenStakingManager: + // Reset the global binary data for better test isolation + erc20tokenstakingmanager.ERC20TokenStakingManagerBin = + erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.Bin + + address, tx, _, err = erc20tokenstakingmanager.DeployERC20TokenStakingManager( + opts, + l1.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + case NativeTokenStakingManager: + // Reset the global binary data for better test isolation + nativetokenstakingmanager.NativeTokenStakingManagerBin = + nativetokenstakingmanager.NativeTokenStakingManagerMetaData.Bin -func DeployERC20TokenStakingManager( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, -) (common.Address, *erc20tokenstakingmanager.ERC20TokenStakingManager) { - // Reset the global binary data for better test isolation - erc20tokenstakingmanager.ERC20TokenStakingManagerBin = - erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.Bin + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, _, err = nativetokenstakingmanager.DeployNativeTokenStakingManager( + opts, + l1.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + } - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - address, tx, stakingManager, err := erc20tokenstakingmanager.DeployERC20TokenStakingManager( - opts, - l1.RPCClient, - 0, // ICMInitializable.Allowed - ) + validatorManager, err = ivalidatormanager.NewIValidatorManager(address, l1.RPCClient) Expect(err).Should(BeNil()) // Wait for the transaction to be mined WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - return address, stakingManager + return address, validatorManager } -func DeployAndInitializeERC20TokenStakingManager( +// The senderKey is used as the owner of proxy and PoAValidatorManager contracts +func DeployAndInitializeValidatorManager( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, -) ( - common.Address, - *erc20tokenstakingmanager.ERC20TokenStakingManager, - common.Address, - *exampleerc20.ExampleERC20, -) { - stakingManagerContractAddress, stakingManager := DeployERC20TokenStakingManager( + managerType ValidatorManagerConcreteType, + proxy bool, +) (common.Address, *proxyadmin.ProxyAdmin) { + validatorManagerAddress, _ := DeployValidatorManager( ctx, senderKey, l1, - ) - - erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, l1) - rewardCalculatorAddress, _ := DeployExampleRewardCalculator( - ctx, - senderKey, - l1, - uint64(10), + managerType, ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.Initialize( - opts, - erc20tokenstakingmanager.PoSValidatorManagerSettings{ - BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ - L1ID: l1.L1ID, - ChurnPeriodSeconds: DefaultChurnPeriodSeconds, - MaximumChurnPercentage: DefaultMaxChurnPercentage, - }, - MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), - MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), - MinimumStakeDuration: DefaultMinStakeDurationSeconds, - MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, - MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), - RewardCalculator: rewardCalculatorAddress, - UptimeBlockchainID: l1.BlockchainID, - }, - erc20Address, - ) - Expect(err).Should(BeNil()) - WaitForTransactionSuccess(ctx, l1, tx.Hash()) - return stakingManagerContractAddress, stakingManager, erc20Address, erc20 -} - -func DeployPoAValidatorManager( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, -) (common.Address, *poavalidatormanager.PoAValidatorManager) { - // Reset the global binary data for better test isolation - poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin - - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - address, tx, validatorManager, err := poavalidatormanager.DeployPoAValidatorManager( - opts, - l1.RPCClient, - 0, // ICMInitializable.Allowed + var ( + tx *types.Transaction + proxyAdmin *proxyadmin.ProxyAdmin ) - Expect(err).Should(BeNil()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - return address, validatorManager -} + if proxy { + // Overwrite the manager address with the proxy address + validatorManagerAddress, proxyAdmin = DeployTransparentUpgradeableProxy( + ctx, + l1, + senderKey, + validatorManagerAddress, + ) + } -func DeployAndInitializePoAValidatorManager( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - ownerAddress common.Address, -) (common.Address, *poavalidatormanager.PoAValidatorManager) { - validatorManagerAddress, validatorManager := DeployPoAValidatorManager( - ctx, - senderKey, - l1, - ) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := validatorManager.Initialize( - opts, - poavalidatormanager.ValidatorManagerSettings{ - L1ID: l1.L1ID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), - }, - ownerAddress, - ) - Expect(err).Should(BeNil()) + switch managerType { + case PoAValidatorManager: + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1.RPCClient) + Expect(err).Should(BeNil()) + tx, err = poaValidatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + L1ID: l1.L1ID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), + }, + PrivateKeyToAddress(senderKey), + ) + Expect(err).Should(BeNil()) + case ERC20TokenStakingManager: + erc20Address, _ := DeployExampleERC20(ctx, senderKey, l1) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + l1, + uint64(10), + ) + erc20StakingManager, err := erc20tokenstakingmanager.NewERC20TokenStakingManager( + validatorManagerAddress, + l1.RPCClient, + ) + Expect(err).Should(BeNil()) + tx, err = erc20StakingManager.Initialize( + opts, + erc20tokenstakingmanager.PoSValidatorManagerSettings{ + BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ + L1ID: l1.L1ID, + ChurnPeriodSeconds: DefaultChurnPeriodSeconds, + MaximumChurnPercentage: DefaultMaxChurnPercentage, + }, + MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), + MinimumStakeDuration: DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, + MaximumStakeMultiplier: DefaultMaxStakeMultiplier, + WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), + RewardCalculator: rewardCalculatorAddress, + UptimeBlockchainID: l1.BlockchainID, + }, + erc20Address, + ) + Expect(err).Should(BeNil()) + case NativeTokenStakingManager: + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + l1, + uint64(10), + ) + nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( + validatorManagerAddress, + l1.RPCClient, + ) + Expect(err).Should(BeNil()) + tx, err = nativeStakingManager.Initialize( + opts, + nativetokenstakingmanager.PoSValidatorManagerSettings{ + BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ + L1ID: l1.L1ID, + ChurnPeriodSeconds: DefaultChurnPeriodSeconds, + MaximumChurnPercentage: DefaultMaxChurnPercentage, + }, + MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), + MinimumStakeDuration: DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, + MaximumStakeMultiplier: DefaultMaxStakeMultiplier, + WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), + RewardCalculator: rewardCalculatorAddress, + UptimeBlockchainID: l1.BlockchainID, + }, + ) + Expect(err).Should(BeNil()) + } WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - return validatorManagerAddress, validatorManager + return validatorManagerAddress, proxyAdmin } func DeployExampleRewardCalculator( @@ -280,282 +266,92 @@ func DeployExampleRewardCalculator( // Validator Set Initialization utils // -func InitializeNativeTokenValidatorSet( +func InitializeValidatorSet( ctx context.Context, senderKey *ecdsa.PrivateKey, l1Info interfaces.L1TestInfo, pChainInfo interfaces.L1TestInfo, - validatorManager *nativetokenstakingmanager.NativeTokenStakingManager, validatorManagerAddress common.Address, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, nodes []Node, ) []ids.ID { - initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) - initialValidatorsABI := make([]nativetokenstakingmanager.InitialValidator, len(nodes)) + log.Println("Initializing validator set", "l1", l1Info.L1ID) + initialValidators := make([]warpMessage.SubnetToL1ConverstionValidatorData, len(nodes)) + initialValidatorsABI := make([]ivalidatormanager.InitialValidator, len(nodes)) for i, node := range nodes { - initialValidators[i] = warpMessage.SubnetConversionValidatorData{ + initialValidators[i] = warpMessage.SubnetToL1ConverstionValidatorData{ NodeID: node.NodeID.Bytes(), BLSPublicKey: node.NodePoP.PublicKey, Weight: nodes[i].Weight, } - initialValidatorsABI[i] = nativetokenstakingmanager.InitialValidator{ + initialValidatorsABI[i] = ivalidatormanager.InitialValidator{ NodeID: node.NodeID.Bytes(), BlsPublicKey: node.NodePoP.PublicKey[:], Weight: nodes[i].Weight, } } - l1ConversionData := warpMessage.SubnetConversionData{ + l1ConversionData := warpMessage.SubnetToL1ConversionData{ SubnetID: l1Info.L1ID, ManagerChainID: l1Info.BlockchainID, ManagerAddress: validatorManagerAddress[:], Validators: initialValidators, } - l1ConversionDataABI := nativetokenstakingmanager.ConversionData{ + l1ConversionDataABI := ivalidatormanager.ConversionData{ L1ID: l1Info.L1ID, ValidatorManagerBlockchainID: l1Info.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, InitialValidators: initialValidatorsABI, } - l1ConversionID, err := warpMessage.SubnetConversionID(l1ConversionData) + l1ConversionID, err := warpMessage.SubnetToL1ConversionID(l1ConversionData) Expect(err).Should(BeNil()) - l1ConversionSignedMessage := ConstructSubnetConversionMessage( + l1ConversionSignedMessage := ConstructL1ConversionMessage( l1ConversionID, l1Info, pChainInfo, networkID, signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt := DeliverNativeTokenSubnetConversion( - ctx, - senderKey, - l1Info, - validatorManagerAddress, - l1ConversionSignedMessage, - l1ConversionDataABI, - ) - initialValidatorCreatedEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseInitialValidatorCreated, - ) - Expect(err).Should(BeNil()) - var validationIDs []ids.ID - for i := range nodes { - validationIDs = append(validationIDs, l1Info.L1ID.Append(uint32(i))) - } - - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) - emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(validationIDs[0])) - - return validationIDs -} - -func InitializeERC20TokenValidatorSet( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - validatorManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - validatorManagerAddress common.Address, - networkID uint32, - signatureAggregator *aggregator.SignatureAggregator, - nodes []Node, -) []ids.ID { - initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) - initialValidatorsABI := make([]erc20tokenstakingmanager.InitialValidator, len(nodes)) - for i, node := range nodes { - initialValidators[i] = warpMessage.SubnetConversionValidatorData{ - NodeID: node.NodeID.Bytes(), - BLSPublicKey: node.NodePoP.PublicKey, - Weight: nodes[i].Weight, - } - initialValidatorsABI[i] = erc20tokenstakingmanager.InitialValidator{ - NodeID: node.NodeID.Bytes(), - BlsPublicKey: node.NodePoP.PublicKey[:], - Weight: nodes[i].Weight, - } - } - - l1ConversionData := warpMessage.SubnetConversionData{ - SubnetID: l1Info.L1ID, - ManagerChainID: l1Info.BlockchainID, - ManagerAddress: validatorManagerAddress[:], - Validators: initialValidators, - } - l1ConversionDataABI := erc20tokenstakingmanager.ConversionData{ - L1ID: l1Info.L1ID, - ValidatorManagerBlockchainID: l1Info.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: initialValidatorsABI, - } - l1ConversionID, err := warpMessage.SubnetConversionID(l1ConversionData) - Expect(err).Should(BeNil()) - l1ConversionSignedMessage := ConstructSubnetConversionMessage( - l1ConversionID, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the l1 - receipt := DeliverERC20TokenSubnetConversion( + // Deliver the Warp message to the L1 + receipt := DeliverL1Conversion( ctx, senderKey, l1Info, validatorManagerAddress, l1ConversionSignedMessage, - l1ConversionDataABI, - ) - initialValidatorCreatedEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseInitialValidatorCreated, - ) - Expect(err).Should(BeNil()) - var validationIDs []ids.ID - for i := range nodes { - validationIDs = append(validationIDs, l1Info.L1ID.Append(uint32(i))) - } - - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) - - emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(validationIDs[0])) - - return validationIDs -} - -func InitializePoAValidatorSet( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - validatorManager *poavalidatormanager.PoAValidatorManager, - validatorManagerAddress common.Address, - networkID uint32, - signatureAggregator *aggregator.SignatureAggregator, - nodes []Node, -) []ids.ID { - initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) - initialValidatorsABI := make([]poavalidatormanager.InitialValidator, len(nodes)) - for i, node := range nodes { - initialValidators[i] = warpMessage.SubnetConversionValidatorData{ - NodeID: node.NodeID.Bytes(), - BLSPublicKey: node.NodePoP.PublicKey, - Weight: nodes[i].Weight, - } - initialValidatorsABI[i] = poavalidatormanager.InitialValidator{ - NodeID: node.NodeID.Bytes(), - BlsPublicKey: node.NodePoP.PublicKey[:], - Weight: nodes[i].Weight, - } - } - - l1ConversionData := warpMessage.SubnetConversionData{ - SubnetID: l1Info.L1ID, - ManagerChainID: l1Info.BlockchainID, - ManagerAddress: validatorManagerAddress[:], - Validators: initialValidators, - } - l1ConversionDataABI := poavalidatormanager.ConversionData{ - L1ID: l1Info.L1ID, - ValidatorManagerBlockchainID: l1Info.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: initialValidatorsABI, - } - l1ConversionID, err := warpMessage.SubnetConversionID(l1ConversionData) - Expect(err).Should(BeNil()) - l1ConversionSignedMessage := ConstructSubnetConversionMessage( - l1ConversionID, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - // Deliver the Warp message to the l1 - receipt := DeliverPoASubnetConversion( - ctx, - senderKey, - l1Info, - validatorManagerAddress, - l1ConversionSignedMessage, - l1ConversionDataABI, - ) - initialValidatorCreatedEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseInitialValidatorCreated, - ) - Expect(err).Should(BeNil()) - var validationIDs []ids.ID - for i := range nodes { - validationIDs = append(validationIDs, l1Info.L1ID.Append(uint32(i))) - } - - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) - - emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(validationIDs[0])) - - return validationIDs -} - -func DeliverNativeTokenSubnetConversion( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - validatorManagerAddress common.Address, - l1ConversionSignedMessage *avalancheWarp.Message, - l1ConversionData nativetokenstakingmanager.ConversionData, -) *types.Receipt { - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeValidatorSet", l1ConversionData, uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - validatorManagerAddress, - l1ConversionSignedMessage.Bytes(), - ) -} - -func DeliverERC20TokenSubnetConversion( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - validatorManagerAddress common.Address, - l1ConversionSignedMessage *avalancheWarp.Message, - l1ConversionData erc20tokenstakingmanager.ConversionData, -) *types.Receipt { - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeValidatorSet", l1ConversionData, uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - validatorManagerAddress, - l1ConversionSignedMessage.Bytes(), + l1ConversionDataABI, + ) + manager, err := ivalidatormanager.NewIValidatorManager(validatorManagerAddress, l1Info.RPCClient) + Expect(err).Should(BeNil()) + initialValidatorCreatedEvent, err := GetEventFromLogs( + receipt.Logs, + manager.ParseInitialValidatorCreated, ) + Expect(err).Should(BeNil()) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, l1Info.L1ID.Append(uint32(i))) + } + + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(nodes[0].Weight)) + + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) + + return validationIDs } -func DeliverPoASubnetConversion( +func DeliverL1Conversion( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, validatorManagerAddress common.Address, l1ConversionSignedMessage *avalancheWarp.Message, - l1ConversionData poavalidatormanager.ConversionData, + l1ConversionData ivalidatormanager.ConversionData, ) *types.Receipt { - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + abi, err := ivalidatormanager.IValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) callData, err := abi.Pack("initializeValidatorSet", l1ConversionData, uint32(0)) Expect(err).Should(BeNil()) @@ -680,35 +476,14 @@ func InitializePoAValidatorRegistration( return receipt, ids.ID(registrationInitiatedEvent.ValidationID) } -func CompleteNativeValidatorRegistration( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManagerContractAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerContractAddress, - registrationSignedMessage.Bytes(), - ) -} - -func CompleteERC20ValidatorRegistration( +func CompleteValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, ) *types.Receipt { - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + abi, err := ivalidatormanager.IValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) Expect(err).Should(BeNil()) @@ -722,27 +497,6 @@ func CompleteERC20ValidatorRegistration( ) } -func CompletePoAValidatorRegistration( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - validatorManagerAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - validatorManagerAddress, - registrationSignedMessage.Bytes(), - ) -} - // Calls a method that retreived a signed Warp message from the transaction's access list func CallWarpReceiver( ctx context.Context, @@ -799,11 +553,11 @@ func InitializeAndCompleteNativeValidatorRegistration( stakingManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) - _, err = pchainWallet.IssueRegisterSubnetValidatorTx( + _, err = pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, node.NodePoP.ProofOfPossession, signedWarpMessage.Bytes(), @@ -812,12 +566,11 @@ func InitializeAndCompleteNativeValidatorRegistration( PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, - expiry, - node, + 0, true, l1Info, pChainInfo, @@ -825,8 +578,8 @@ func InitializeAndCompleteNativeValidatorRegistration( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteNativeValidatorRegistration( + // Deliver the Warp message to the L1 + receipt = CompleteValidatorRegistration( ctx, fundedKey, l1Info, @@ -878,10 +631,10 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakingManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo) + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) - _, err = pchainWallet.IssueRegisterSubnetValidatorTx( + _, err = pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, node.NodePoP.ProofOfPossession, signedWarpMessage.Bytes(), @@ -890,12 +643,11 @@ func InitializeAndCompleteERC20ValidatorRegistration( PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, - expiry, - node, + 0, true, l1Info, pChainInfo, @@ -903,8 +655,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteERC20ValidatorRegistration( + // Deliver the Warp message to the L1 + receipt = CompleteValidatorRegistration( ctx, fundedKey, l1Info, @@ -946,10 +698,10 @@ func InitializeAndCompletePoAValidatorRegistration( validatorManager, ) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo) + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) - _, err := pchainWallet.IssueRegisterSubnetValidatorTx( + _, err := pchainWallet.IssueRegisterL1ValidatorTx( 100*units.Avax, node.NodePoP.ProofOfPossession, signedWarpMessage.Bytes(), @@ -958,12 +710,11 @@ func InitializeAndCompletePoAValidatorRegistration( PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, - expiry, - node, + 0, true, l1Info, pChainInfo, @@ -971,8 +722,8 @@ func InitializeAndCompletePoAValidatorRegistration( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompletePoAValidatorRegistration( + // Deliver the Warp message to the L1 + receipt = CompleteValidatorRegistration( ctx, fundedKey, l1Info, @@ -990,76 +741,35 @@ func InitializeAndCompletePoAValidatorRegistration( return validationID } -func ConstructUptimeProofMessage( - validationID ids.ID, - uptime uint64, - l1 interfaces.L1TestInfo, - networkID uint32, - signatureAggregator *aggregator.SignatureAggregator, -) *avalancheWarp.Message { - uptimePayload, err := messages.NewValidatorUptime(validationID, uptime) - Expect(err).Should(BeNil()) - addressedCall, err := warpPayload.NewAddressedCall(nil, uptimePayload.Bytes()) - Expect(err).Should(BeNil()) - uptimeProofUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( - networkID, - l1.BlockchainID, - addressedCall.Bytes(), - ) - Expect(err).Should(BeNil()) - - uptimeProofSignedMessage, err := signatureAggregator.CreateSignedMessage( - uptimeProofUnsignedMessage, - nil, - l1.L1ID, - 67, - ) - Expect(err).Should(BeNil()) - return uptimeProofSignedMessage -} - -func InitializeEndNativeValidationWithUptime( +func InitializeEndPoSValidation( ctx context.Context, - networkID uint32, - signatureAggregator *aggregator.SignatureAggregator, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - stakingManagerAddress common.Address, + stakingManager *iposvalidatormanager.IPoSValidatorManager, validationID ids.ID, - uptime uint64, ) *types.Receipt { - uptimeMsg := ConstructUptimeProofMessage( + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.InitializeEndValidation0( + opts, validationID, - uptime, - l1, - networkID, - signatureAggregator, + false, + 0, ) - - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeEndValidation", validationID, true, uint32(0)) Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerAddress, - uptimeMsg.Bytes(), - ) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } -func InitializeEndNativeValidation( +func ForceInitializeEndPoSValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManager *iposvalidatormanager.IPoSValidatorManager, validationID ids.ID, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndValidation0( + tx, err := stakingManager.ForceInitializeEndValidation( opts, validationID, false, @@ -1069,58 +779,35 @@ func InitializeEndNativeValidation( return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } -func ForceInitializeEndNativeValidationWithUptime( - ctx context.Context, - networkID uint32, - signatureAggregator *aggregator.SignatureAggregator, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManagerAddress common.Address, +func ConstructUptimeProofMessage( validationID ids.ID, uptime uint64, -) *types.Receipt { - uptimeMsg := ConstructUptimeProofMessage( - validationID, - uptime, - l1, - networkID, - signatureAggregator, - ) - - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + l1 interfaces.L1TestInfo, + networkID uint32, + signatureAggregator *aggregator.SignatureAggregator, +) *avalancheWarp.Message { + uptimePayload, err := messages.NewValidatorUptime(validationID, uptime) Expect(err).Should(BeNil()) - callData, err := abi.Pack("forceInitializeEndValidation", validationID, true, uint32(0)) + addressedCall, err := warpPayload.NewAddressedCall(nil, uptimePayload.Bytes()) Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerAddress, - uptimeMsg.Bytes(), + uptimeProofUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + networkID, + l1.BlockchainID, + addressedCall.Bytes(), ) -} - -func ForceInitializeEndNativeValidation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, - validationID ids.ID, -) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.ForceInitializeEndValidation( - opts, - validationID, - false, - 0, + + uptimeProofSignedMessage, err := signatureAggregator.CreateSignedMessage( + uptimeProofUnsignedMessage, + nil, + l1.L1ID, + 67, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, l1, tx.Hash()) + return uptimeProofSignedMessage } -func InitializeEndERC20ValidationWithUptime( +func ForceInitializeEndPoSValidationWithUptime( ctx context.Context, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, @@ -1138,9 +825,9 @@ func InitializeEndERC20ValidationWithUptime( signatureAggregator, ) - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + abi, err := iposvalidatormanager.IPoSValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeEndValidation", validationID, true, uint32(0)) + callData, err := abi.Pack("forceInitializeEndValidation", validationID, true, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, @@ -1152,26 +839,7 @@ func InitializeEndERC20ValidationWithUptime( ) } -func InitializeEndERC20Validation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - validationID ids.ID, -) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndValidation0( - opts, - validationID, - false, - 0, - ) - Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, l1, tx.Hash()) -} - -func ForceInitializeEndERC20ValidationWithUptime( +func InitializeEndPoSValidationWithUptime( ctx context.Context, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, @@ -1189,9 +857,9 @@ func ForceInitializeEndERC20ValidationWithUptime( signatureAggregator, ) - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + abi, err := iposvalidatormanager.IPoSValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("forceInitializeEndValidation", validationID, true, uint32(0)) + callData, err := abi.Pack("initializeEndValidation", validationID, true, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, @@ -1203,25 +871,6 @@ func ForceInitializeEndERC20ValidationWithUptime( ) } -func ForceInitializeEndERC20Validation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - validationID ids.ID, -) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := stakingManager.ForceInitializeEndValidation( - opts, - validationID, - false, - 0, - ) - Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, l1, tx.Hash()) -} - func InitializeEndPoAValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, @@ -1236,59 +885,17 @@ func InitializeEndPoAValidation( validationID, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, l1, tx.Hash()) -} - -func CompleteEndNativeValidation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManagerContractAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerContractAddress, - registrationSignedMessage.Bytes(), - ) -} - -func CompleteEndERC20Validation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManagerContractAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerContractAddress, - registrationSignedMessage.Bytes(), - ) + return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } -func CompleteEndPoAValidation( +func CompleteEndValidation( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - validatorManagerAddress common.Address, + stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, ) *types.Receipt { - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + abi, err := ivalidatormanager.IValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) @@ -1297,7 +904,7 @@ func CompleteEndPoAValidation( callData, senderKey, l1, - validatorManagerAddress, + stakingManagerContractAddress, registrationSignedMessage.Bytes(), ) } @@ -1339,70 +946,6 @@ func InitializeERC20DelegatorRegistration( return receipt } -func CompleteERC20DelegatorRegistration( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - delegationID ids.ID, - l1 interfaces.L1TestInfo, - stakingManagerContractAddress common.Address, - signedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", delegationID, uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerContractAddress, - signedMessage.Bytes(), - ) -} - -func InitializeEndERC20Delegation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1 interfaces.L1TestInfo, - stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - delegationID ids.ID, -) *types.Receipt { - WaitMinStakeDuration(ctx, l1, senderKey) - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := stakingManager.ForceInitializeEndDelegation( - opts, - delegationID, - false, - 0, - ) - Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, l1, tx.Hash()) -} - -func CompleteEndERC20Delegation( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - delegationID ids.ID, - l1 interfaces.L1TestInfo, - stakingManagerContractAddress common.Address, - signedMessage *avalancheWarp.Message, -) *types.Receipt { - abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", delegationID, uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - ctx, - callData, - senderKey, - l1, - stakingManagerContractAddress, - signedMessage.Bytes(), - ) -} - func InitializeNativeDelegatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, @@ -1430,7 +973,7 @@ func InitializeNativeDelegatorRegistration( return receipt } -func CompleteNativeDelegatorRegistration( +func CompleteDelegatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, delegationID ids.ID, @@ -1438,7 +981,7 @@ func CompleteNativeDelegatorRegistration( stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + abi, err := iposvalidatormanager.IPoSValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) callData, err := abi.Pack("completeDelegatorRegistration", delegationID, uint32(0)) Expect(err).Should(BeNil()) @@ -1452,13 +995,15 @@ func CompleteNativeDelegatorRegistration( ) } -func InitializeEndNativeDelegation( +func InitializeEndDelegation( ctx context.Context, senderKey *ecdsa.PrivateKey, l1 interfaces.L1TestInfo, - stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManagerAddress common.Address, delegationID ids.ID, ) *types.Receipt { + stakingManager, err := iposvalidatormanager.NewIPoSValidatorManager(stakingManagerAddress, l1.RPCClient) + Expect(err).Should(BeNil()) WaitMinStakeDuration(ctx, l1, senderKey) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) Expect(err).Should(BeNil()) @@ -1472,7 +1017,7 @@ func InitializeEndNativeDelegation( return WaitForTransactionSuccess(ctx, l1, tx.Hash()) } -func CompleteEndNativeDelegation( +func CompleteEndDelegation( ctx context.Context, senderKey *ecdsa.PrivateKey, delegationID ids.ID, @@ -1480,7 +1025,7 @@ func CompleteEndNativeDelegation( stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + abi, err := iposvalidatormanager.IPoSValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) callData, err := abi.Pack("completeEndDelegation", delegationID, uint32(0)) Expect(err).Should(BeNil()) @@ -1494,13 +1039,13 @@ func CompleteEndNativeDelegation( ) } -func InitializeAndCompleteEndInitialNativeValidation( +func InitializeAndCompleteEndInitialPoSValidation( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, l1Info interfaces.L1TestInfo, pChainInfo interfaces.L1TestInfo, - stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManager *iposvalidatormanager.IPoSValidatorManager, stakingManagerAddress common.Address, validationID ids.ID, index uint32, @@ -1510,7 +1055,7 @@ func InitializeAndCompleteEndInitialNativeValidation( ) { log.Println("Initializing initial validator removal") WaitMinStakeDuration(ctx, l1Info, fundedKey) - receipt := ForceInitializeEndNativeValidation( + receipt := ForceInitializeEndPoSValidation( ctx, fundedKey, l1Info, @@ -1523,9 +1068,9 @@ func InitializeAndCompleteEndInitialNativeValidation( ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( @@ -1537,13 +1082,13 @@ func InitializeAndCompleteEndInitialNativeValidation( Expect(err).Should(BeNil()) // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, index, false, @@ -1553,8 +1098,8 @@ func InitializeAndCompleteEndInitialNativeValidation( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteEndNativeValidation( + // Deliver the Warp message to the L1 + receipt = CompleteEndValidation( ctx, fundedKey, l1Info, @@ -1571,13 +1116,13 @@ func InitializeAndCompleteEndInitialNativeValidation( Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) } -func InitializeAndCompleteEndNativeValidation( +func InitializeAndCompleteEndPoSValidation( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, l1Info interfaces.L1TestInfo, pChainInfo interfaces.L1TestInfo, - stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManager *iposvalidatormanager.IPoSValidatorManager, stakingManagerAddress common.Address, validationID ids.ID, expiry uint64, @@ -1594,7 +1139,7 @@ func InitializeAndCompleteEndNativeValidation( var receipt *types.Receipt if includeUptime { uptime := uint64(time.Since(validatorStartTime).Seconds()) - receipt = ForceInitializeEndNativeValidationWithUptime( + receipt = ForceInitializeEndPoSValidationWithUptime( ctx, networkID, signatureAggregator, @@ -1605,7 +1150,7 @@ func InitializeAndCompleteEndNativeValidation( uptime, ) } else { - receipt = ForceInitializeEndNativeValidation( + receipt = ForceInitializeEndPoSValidation( ctx, fundedKey, l1Info, @@ -1620,9 +1165,9 @@ func InitializeAndCompleteEndNativeValidation( ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(node.Weight)) + Expect(validatorRemovalEvent.Weight).Should(Equal(node.Weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, @@ -1633,16 +1178,15 @@ func InitializeAndCompleteEndNativeValidation( Expect(err).Should(BeNil()) // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, - expiry, - node, + 0, false, l1Info, pChainInfo, @@ -1650,8 +1194,8 @@ func InitializeAndCompleteEndNativeValidation( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteEndNativeValidation( + // Deliver the Warp message to the L1 + receipt = CompleteEndValidation( ctx, fundedKey, l1Info, @@ -1668,178 +1212,6 @@ func InitializeAndCompleteEndNativeValidation( Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } -func InitializeAndCompleteEndInitialERC20Validation( - ctx context.Context, - signatureAggregator *aggregator.SignatureAggregator, - fundedKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - stakingManagerAddress common.Address, - validationID ids.ID, - index uint32, - weight uint64, - pchainWallet pwallet.Wallet, - networkID uint32, -) { - log.Println("Initializing initial validator removal") - WaitMinStakeDuration(ctx, l1Info, fundedKey) - receipt := ForceInitializeEndERC20Validation( - ctx, - fundedKey, - l1Info, - stakingManager, - validationID, - ) - validatorRemovalEvent, err := GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) - signedWarpMessage, err := signatureAggregator.CreateSignedMessage( - unsignedMessage, - nil, - l1Info.L1ID, - 67, - ) - Expect(err).Should(BeNil()) - - // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) - PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( - validationID, - index, - false, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the l1 - receipt = CompleteEndERC20Validation( - ctx, - fundedKey, - l1Info, - stakingManagerAddress, - registrationSignedMessage, - ) - - // Check that the validator is has been delisted from the staking contract - validationEndedEvent, err := GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodEnded, - ) - Expect(err).Should(BeNil()) - Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) -} - -func InitializeAndCompleteEndERC20Validation( - ctx context.Context, - signatureAggregator *aggregator.SignatureAggregator, - fundedKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - stakingManagerAddress common.Address, - validationID ids.ID, - expiry uint64, - node Node, - nonce uint64, - includeUptime bool, - validatorStartTime time.Time, - pchainWallet pwallet.Wallet, - networkID uint32, -) { - log.Println("Initializing validator removal") - WaitMinStakeDuration(ctx, l1Info, fundedKey) - var receipt *types.Receipt - if includeUptime { - uptime := uint64(time.Since(validatorStartTime).Seconds()) - receipt = ForceInitializeEndERC20ValidationWithUptime( - ctx, - networkID, - signatureAggregator, - fundedKey, - l1Info, - stakingManagerAddress, - validationID, - uptime, - ) - } else { - receipt = ForceInitializeEndERC20Validation( - ctx, - fundedKey, - l1Info, - stakingManager, - validationID, - ) - } - validatorRemovalEvent, err := GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(node.Weight)) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) - signedWarpMessage, err := signatureAggregator.CreateSignedMessage( - unsignedMessage, - nil, - l1Info.L1ID, - 67, - ) - Expect(err).Should(BeNil()) - - // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) - PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - log.Println("Completing validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( - validationID, - expiry, - node, - false, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the l1 - receipt = CompleteEndERC20Validation( - ctx, - fundedKey, - l1Info, - stakingManagerAddress, - registrationSignedMessage, - ) - - // Check that the validator is has been delisted from the staking contract - validationEndedEvent, err := GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodEnded, - ) - Expect(err).Should(BeNil()) - Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) -} - func InitializeAndCompleteEndInitialPoAValidation( ctx context.Context, signatureAggregator *aggregator.SignatureAggregator, @@ -1870,9 +1242,9 @@ func InitializeAndCompleteEndInitialPoAValidation( ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( @@ -1884,13 +1256,13 @@ func InitializeAndCompleteEndInitialPoAValidation( Expect(err).Should(BeNil()) // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(pchainWallet) AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, index, false, @@ -1900,8 +1272,8 @@ func InitializeAndCompleteEndInitialPoAValidation( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteEndPoAValidation( + // Deliver the Warp message to the L1 + receipt = CompleteEndValidation( ctx, fundedKey, l1Info, @@ -1945,21 +1317,20 @@ func InitializeAndCompleteEndPoAValidation( ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + ValidateL1ValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID, 0, - Node{}, false, l1Info, pChainInfo, @@ -1967,8 +1338,8 @@ func InitializeAndCompleteEndPoAValidation( signatureAggregator, ) - // Deliver the Warp message to the l1 - receipt = CompleteEndPoAValidation( + // Deliver the Warp message to the L1 + receipt = CompleteEndValidation( ctx, ownerKey, l1Info, @@ -1989,7 +1360,7 @@ func InitializeAndCompleteEndPoAValidation( // P-Chain utils // -func ConstructSubnetValidatorRegistrationMessageForInitialValidator( +func ConstructL1ValidatorRegistrationMessageForInitialValidator( validationID ids.ID, index uint32, valid bool, @@ -1998,9 +1369,9 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - justification := platformvm.SubnetValidatorRegistrationJustification{ - Preimage: &platformvm.SubnetValidatorRegistrationJustification_ConvertSubnetTxData{ - ConvertSubnetTxData: &platformvm.SubnetIDIndex{ + justification := platformvm.L1ValidatorRegistrationJustification{ + Preimage: &platformvm.L1ValidatorRegistrationJustification_ConvertSubnetToL1TxData{ + ConvertSubnetToL1TxData: &platformvm.SubnetIDIndex{ SubnetId: l1.L1ID[:], Index: index, }, @@ -2009,7 +1380,7 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( justificationBytes, err := proto.Marshal(&justification) Expect(err).Should(BeNil()) - registrationPayload, err := warpMessage.NewSubnetValidatorRegistration(validationID, valid) + registrationPayload, err := warpMessage.NewL1ValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) Expect(err).Should(BeNil()) @@ -2031,7 +1402,7 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( return registrationSignedMessage } -func ConstructSubnetValidatorRegistrationMessage( +func ConstructL1ValidatorRegistrationMessage( validationID ids.ID, expiry uint64, node Node, @@ -2041,7 +1412,7 @@ func ConstructSubnetValidatorRegistrationMessage( networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - msg, err := warpMessage.NewRegisterSubnetValidator( + msg, err := warpMessage.NewRegisterL1Validator( l1.L1ID, node.NodeID, node.NodePoP.PublicKey, @@ -2051,15 +1422,15 @@ func ConstructSubnetValidatorRegistrationMessage( node.Weight, ) Expect(err).Should(BeNil()) - justification := platformvm.SubnetValidatorRegistrationJustification{ - Preimage: &platformvm.SubnetValidatorRegistrationJustification_RegisterSubnetValidatorMessage{ - RegisterSubnetValidatorMessage: msg.Bytes(), + justification := platformvm.L1ValidatorRegistrationJustification{ + Preimage: &platformvm.L1ValidatorRegistrationJustification_RegisterL1ValidatorMessage{ + RegisterL1ValidatorMessage: msg.Bytes(), }, } justificationBytes, err := proto.Marshal(&justification) Expect(err).Should(BeNil()) - registrationPayload, err := warpMessage.NewSubnetValidatorRegistration(validationID, valid) + registrationPayload, err := warpMessage.NewL1ValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) Expect(err).Should(BeNil()) @@ -2081,7 +1452,7 @@ func ConstructSubnetValidatorRegistrationMessage( return registrationSignedMessage } -func ConstructSubnetValidatorWeightUpdateMessage( +func ConstructL1ValidatorWeightUpdateMessage( validationID ids.ID, nonce uint64, weight uint64, @@ -2090,7 +1461,7 @@ func ConstructSubnetValidatorWeightUpdateMessage( signatureAggregator *aggregator.SignatureAggregator, networkID uint32, ) *avalancheWarp.Message { - payload, err := warpMessage.NewSubnetValidatorWeight(validationID, nonce, weight) + payload, err := warpMessage.NewL1ValidatorWeight(validationID, nonce, weight) Expect(err).Should(BeNil()) updateAddressedCall, err := warpPayload.NewAddressedCall(nil, payload.Bytes()) Expect(err).Should(BeNil()) @@ -2111,14 +1482,14 @@ func ConstructSubnetValidatorWeightUpdateMessage( return updateSignedMessage } -func ConstructSubnetConversionMessage( +func ConstructL1ConversionMessage( l1ConversionID ids.ID, l1 interfaces.L1TestInfo, pChainInfo interfaces.L1TestInfo, networkID uint32, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - l1ConversionPayload, err := warpMessage.NewSubnetConversion(l1ConversionID) + l1ConversionPayload, err := warpMessage.NewSubnetToL1Conversion(l1ConversionID) Expect(err).Should(BeNil()) l1ConversionAddressedCall, err := warpPayload.NewAddressedCall( nil, @@ -2147,7 +1518,7 @@ func ConstructSubnetConversionMessage( // These will be replaced by the actual implementation on the P-Chain in the future // -func ValidateRegisterSubnetValidatorMessage( +func ValidateRegisterL1ValidatorMessage( signedWarpMessage *avalancheWarp.Message, nodeID ids.ID, weight uint64, @@ -2161,7 +1532,7 @@ func ValidateRegisterSubnetValidatorMessage( var payloadInterface warpMessage.Payload ver, err := warpMessage.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - payload, ok := payloadInterface.(*warpMessage.RegisterSubnetValidator) + payload, ok := payloadInterface.(*warpMessage.RegisterL1Validator) Expect(ok).Should(BeTrue()) Expect(ver).Should(Equal(uint16(warpMessage.CodecVersion))) @@ -2171,7 +1542,7 @@ func ValidateRegisterSubnetValidatorMessage( Expect(payload.BLSPublicKey[:]).Should(Equal(blsPublicKey[:])) } -func ValidateSubnetValidatorWeightMessage( +func ValidateL1ValidatorWeightMessage( signedWarpMessage *avalancheWarp.Message, validationID ids.ID, weight uint64, @@ -2183,7 +1554,7 @@ func ValidateSubnetValidatorWeightMessage( var payloadInterface warpMessage.Payload ver, err := warpMessage.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - payload, ok := payloadInterface.(*warpMessage.SubnetValidatorWeight) + payload, ok := payloadInterface.(*warpMessage.L1ValidatorWeight) Expect(ok).Should(BeTrue()) Expect(ver).Should(Equal(uint16(warpMessage.CodecVersion))) @@ -2211,7 +1582,7 @@ func WaitMinStakeDuration( ) } -func CalculateSubnetConversionValidationId(l1ID ids.ID, validatorIdx uint32) ids.ID { +func CalculateL1ConversionValidationId(l1ID ids.ID, validatorIdx uint32) ids.ID { preImage := make([]byte, 36) copy(preImage[0:32], l1ID[:]) binary.BigEndian.PutUint32(preImage[32:36], validatorIdx) @@ -2397,6 +1768,7 @@ func AdvanceProposerVM( fundedKey *ecdsa.PrivateKey, blocks int, ) { + log.Println("Advancing proposer VM") for i := 0; i < blocks; i++ { err := subnetEvmUtils.IssueTxsToActivateProposerVMFork( ctx, l1.EVMChainID, fundedKey, l1.WSClient, @@ -2404,77 +1776,3 @@ func AdvanceProposerVM( Expect(err).Should(BeNil()) } } - -func ConvertSubnet( - ctx context.Context, - l1Info interfaces.L1TestInfo, - pchainWallet pwallet.Wallet, - stakingManagerAddress common.Address, - fundedKey *ecdsa.PrivateKey, -) []Node { - // Remove the current validators before converting the l1 - var nodes []Node - for _, uri := range l1Info.NodeURIs { - infoClient := info.NewClient(uri) - nodeID, nodePoP, err := infoClient.GetNodeID(ctx) - Expect(err).Should(BeNil()) - nodes = append(nodes, Node{ - NodeID: nodeID, - NodePoP: nodePoP, - }) - - _, err = pchainWallet.IssueRemoveSubnetValidatorTx( - nodeID, - l1Info.L1ID, - ) - Expect(err).Should(BeNil()) - } - - // Sort the nodeIDs so that the l1 conversion ID matches the P-Chain - sort.Slice(nodes, func(i, j int) bool { - return string(nodes[i].NodeID.Bytes()) < string(nodes[j].NodeID.Bytes()) - }) - - totalWeight := uint64(len(nodes)-1) * units.Schmeckle - for i := 0; i < len(nodes)-1; i++ { - nodes[i].Weight = units.Schmeckle - totalWeight += units.Schmeckle - } - // Set the last node's weight such that removing any other node will not violate the churn limit - nodes[len(nodes)-1].Weight = 4 * totalWeight - - // Construct the convert l1 info - destAddr, err := address.ParseToID(DefaultPChainAddress) - Expect(err).Should(BeNil()) - vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) - for i, node := range nodes { - vdrs[i] = &txs.ConvertSubnetValidator{ - NodeID: node.NodeID.Bytes(), - Weight: nodes[i].Weight, - Balance: units.Avax * 100, - Signer: *node.NodePoP, - RemainingBalanceOwner: warpMessage.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - DeactivationOwner: warpMessage.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - } - } - - log.Println("Issuing ConvertSubnetTx") - _, err = pchainWallet.IssueConvertSubnetTx( - l1Info.L1ID, - l1Info.BlockchainID, - stakingManagerAddress[:], - vdrs, - ) - Expect(err).Should(BeNil()) - - PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - - return nodes -}