From 22416b48f5849957faed3ed3968b07ac24cf34ef Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 21:36:33 -0500 Subject: [PATCH 1/9] delegationID wip --- .../staking/ERC20TokenStakingManager.sol | 2 +- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/PoSValidatorManager.sol | 103 ++++++++------- .../interfaces/IERC20TokenStakingManager.sol | 2 +- .../interfaces/INativeTokenStakingManager.sol | 2 +- .../interfaces/IPoSValidatorManager.sol | 41 +++--- .../tests/ERC20TokenStakingManagerTests.t.sol | 5 +- .../NativeTokenStakingManagerTests.t.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 117 ++++++++++-------- 9 files changed, 150 insertions(+), 128 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 312a9af89..33f8efe5f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -108,7 +108,7 @@ contract ERC20TokenStakingManager is function initializeDelegatorRegistration( bytes32 validationID, uint256 delegationAmount - ) external { + ) external returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 3baa0c19c..e93333437 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -66,7 +66,7 @@ contract NativeTokenStakingManager is * @notice Begins the delegator registration process. Locks the provided native asset in the contract as the delegated stake. * @param validationID The ID of the validation period being delegated to. */ - function initializeDelegatorRegistration(bytes32 validationID) external payable { + function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 599a3db8e..5c7e908eb 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -29,12 +29,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the validationID to a mapping of delegator address to delegator information. - mapping(bytes32 validationID => mapping(address delegator => Delegator)) _delegatorStakes; + mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. - mapping(bytes32 validationID => mapping(address delegator => bytes)) + mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. - mapping(bytes32 validationID => mapping(address delegator => bytes)) + mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -145,11 +145,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; + // TODO: Updating the nonce in this function call DOES work as expected + function foo(bytes32 validationID) external { + _getAndIncrementNonce(validationID); + } + function _initializeDelegatorRegistration( bytes32 validationID, address delegator, uint256 delegationAmount - ) internal nonReentrant { + ) internal nonReentrant returns (bytes32) { uint64 weight = valueToWeight(_lock(delegationAmount)); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -158,10 +163,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); + // TODO: This function call seems to not update the validator manager's state, + // but ONLY when called from here. The same call in other methods does appear to + // update the validator manager's state as expected. + uint64 nonce = _getAndIncrementNonce(validationID); + + bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); // Ensure the delegator is not already registered require( - $._delegatorStakes[validationID][delegator].weight == 0, + $._delegatorStakes[delegationID].weight == 0, "PoSValidatorManager: delegator already registered" ); @@ -172,15 +183,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidator(validationID, validator); // Submit the message to the Warp precompile. - uint64 nonce = _getAndIncrementNonce(validationID); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); - $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; + $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Store the delegator information - $._delegatorStakes[validationID][delegator] = Delegator({ + $._delegatorStakes[delegationID] = Delegator({ status: DelegatorStatus.PendingAdded, + owner: delegator, + validationID: validationID, weight: weight, startedAt: 0, endedAt: 0, @@ -191,29 +203,30 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegatorAdded({ validationID: validationID, setWeightMessageID: messageID, - delegator: delegator, + delegationID: delegationID, delegatorWeight: weight, validatorWeight: validator.weight, nonce: nonce }); + return delegationID; } - function resendDelegatorRegistration(bytes32 validationID, address delegator) external { - _checkPendingRegisterDelegatorMessages(validationID, delegator); + function resendDelegatorRegistration(bytes32 delegationID) external { + _checkPendingRegisterDelegatorMessages(delegationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Submit the message to the Warp precompile. - WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[validationID][delegator]); + WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[delegationID]); } - function completeDelegatorRegistration(uint32 messageIndex, address delegator) external { + function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingRegisterDelegatorMessages(validationID, delegator); - delete $._pendingRegisterDelegatorMessages[validationID][delegator]; + _checkPendingRegisterDelegatorMessages(delegationID); + delete $._pendingRegisterDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); @@ -221,31 +234,33 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // It should also be greater than or equal to the delegator's starting nonce require( - $._delegatorStakes[validationID][delegator].startingNonce <= nonce, + $._delegatorStakes[delegationID].startingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); require( - $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, "PoSValidatorManager: delegator not pending added" ); // Update the delegator status - $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; - $._delegatorStakes[validationID][delegator].startedAt = uint64(block.timestamp); - + $._delegatorStakes[delegationID].status = DelegatorStatus.Active; + $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); emit DelegatorRegistered({ validationID: validationID, - delegator: delegator, + delegationID: delegationID, nonce: nonce, startTime: block.timestamp }); } function initializeEndDelegation( - bytes32 validationID, + bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex ) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + bytes32 validationID = $._delegatorStakes[delegationID].validationID; + uint64 uptime; if (includeUptimeProof) { uptime = _getUptime(validationID, messageIndex); @@ -253,10 +268,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // TODO: Calculate the delegator's reward, but do not unlock it - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - // Ensure the delegator is active - Delegator memory delegator = $._delegatorStakes[validationID][_msgSender()]; + Delegator memory delegator = $._delegatorStakes[delegationID]; require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" ); @@ -265,7 +278,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.endedAt = uint64(block.timestamp); delegator.endingNonce = nonce; - $._delegatorStakes[validationID][_msgSender()] = delegator; + $._delegatorStakes[delegationID] = delegator; Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); @@ -275,77 +288,75 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); - $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; + $._pendingEndDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); emit DelegatorRemovalInitialized({ validationID: validationID, setWeightMessageID: messageID, - delegator: _msgSender(), + delegationID: delegationID, validatorWeight: validator.weight, nonce: nonce, endTime: block.timestamp }); } - function resendEndDelegation(bytes32 validationID, address delegator) external { - _checkPendingEndDelegatorMessage(validationID, delegator); + function resendEndDelegation(bytes32 delegationID) external { + _checkPendingEndDelegatorMessage(delegationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[validationID][delegator]); + WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[delegationID]); } - function completeEndDelegation(uint32 messageIndex, address delegator) external { + function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingEndDelegatorMessage(validationID, delegator); - delete $._pendingEndDelegatorMessages[validationID][delegator]; + _checkPendingEndDelegatorMessage(delegationID); + delete $._pendingEndDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // It should also be greater than or equal to the delegator's ending nonce require( - $._delegatorStakes[validationID][delegator].endingNonce <= nonce, + $._delegatorStakes[delegationID].endingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); require( - $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegator not pending added" ); // Update the delegator status - $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; + $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; // TODO: Unlock the delegator's stake and their reward - emit DelegationEnded(validationID, delegator, nonce); + emit DelegationEnded(validationID, delegationID, nonce); } function _checkPendingEndDelegatorMessage( - bytes32 validationID, - address delegator + bytes32 delegationID ) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + $._pendingEndDelegatorMessages[delegationID].length > 0 + && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegator removal not pending" ); } function _checkPendingRegisterDelegatorMessages( - bytes32 validationID, - address delegator + bytes32 delegationID ) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + $._pendingRegisterDelegatorMessages[delegationID].length > 0 + && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, "PoSValidatorManager: delegator registration not pending" ); } diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 338bac25c..432f2ae01 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -21,5 +21,5 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external; + function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external returns (bytes32); } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 3a72c380b..de26398f1 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -20,5 +20,5 @@ interface INativeTokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external payable returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID) external payable; + function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index c82cdb5d7..09b1c3e9f 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -26,6 +26,8 @@ struct PoSValidatorManagerSettings { struct Delegator { DelegatorStatus status; + address owner; + bytes32 validationID; uint64 weight; uint64 startedAt; uint64 endedAt; @@ -34,11 +36,12 @@ struct Delegator { } interface IPoSValidatorManager is IValidatorManager { + // TODO: Decide what to include in the events. /** * @notice Event emitted when a delegator registration is initiated * @param validationID The ID of the validation period * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param delegatorWeight The weight of the delegator * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param nonce The message nonce used to update the validator weight @@ -46,7 +49,7 @@ interface IPoSValidatorManager is IValidatorManager { event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce @@ -55,13 +58,13 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is completed * @param validationID The ID of the validation period - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( bytes32 indexed validationID, - address indexed delegator, + bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime ); @@ -70,7 +73,7 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when delegator removal is initiated * @param validationID The ID of the validation period * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param nonce The message nonce used to update the validator weight * @param endTime The time at which the removal was initiated @@ -78,7 +81,7 @@ interface IPoSValidatorManager is IValidatorManager { event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime @@ -87,11 +90,11 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when delegator removal is completed * @param validationID The ID of the validation period - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce + bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce ); /** @@ -113,10 +116,9 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Resubmits a delegator registration message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. - * @param validationID The ID of the validation period being registered. - * @param delegator The address of the delegator being registered. + * @param delegationID The ID of the delegation being registered. */ - function resendDelegatorRegistration(bytes32 validationID, address delegator) external; + function resendDelegatorRegistration(bytes32 delegationID) external; /** * @notice Completes the delegator registration process by returning an acknowledgement of the registration of a @@ -124,21 +126,21 @@ interface IPoSValidatorManager is IValidatorManager { * Any P-Chain acknowledgement with a nonce greater than or equal to the nonce used to initialize registration of the * delegator is valid, as long as that nonce has been sent by the contract. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. - * @param delegator The address of the delegator being registered. + * @param delegationID The ID of the delegation being registered. */ - function completeDelegatorRegistration(uint32 messageIndex, address delegator) external; + function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; /** * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously * registered with the given validationID. - * @param validationID The ID of the validation period being removed. + * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. * If no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ function initializeEndDelegation( - bytes32 validationID, + bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex ) external; @@ -146,10 +148,9 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Resubmits a delegator end message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. - * @param validationID The ID of the validation period being ended. - * @param delegator The address of the delegator being removed. + * @param delegationID The ID of the delegation being removed. */ - function resendEndDelegation(bytes32 validationID, address delegator) external; + function resendEndDelegation(bytes32 delegationID) external; /** * @notice Completes the process of ending a delegation by receiving an acknowledgement from the P-Chain. @@ -157,7 +158,7 @@ interface IPoSValidatorManager is IValidatorManager { * Any P-Chain acknowledgement with a nonce greater than or equal to the nonce used to initialize the end of the * delegator's delegation is valid, as long as that nonce has been sent by the contract. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. - * @param delegator The address of the delegator being removed. + * @param delegationID The ID of the delegation being removed. */ - function completeEndDelegation(uint32 messageIndex, address delegator) external; + function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 4fe44b642..6e2904024 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -60,11 +60,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override { + ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); vm.startPrank(delegator); - app.initializeDelegatorRegistration(validationID, value); + bytes32 delegationID = app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); + return delegationID; } function _beforeSend(uint64 weight, address spender) internal override { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 3096ab12f..3d549da29 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -53,11 +53,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override { + ) internal virtual override returns (bytes32){ uint256 value = app.weightToValue(weight); vm.prank(delegator); vm.deal(delegator, value); - app.initializeDelegatorRegistration{value: value}(validationID); + return app.initializeDelegatorRegistration{value: value}(validationID); } function _beforeSend(uint64 weight, address spender) internal override { diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index c98c054fa..b320060e7 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -27,7 +27,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce @@ -35,7 +35,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorRegistered( bytes32 indexed validationID, - address indexed delegator, + bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime ); @@ -43,14 +43,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime ); event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce + bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce ); function testInvalidUptimeWarpMessage() public { @@ -174,7 +174,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -187,7 +187,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.resendDelegatorRegistration(delegationID); } function testCompleteDelegatorRegistration() public { @@ -199,7 +199,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -209,7 +209,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -236,7 +236,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -256,7 +256,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeDelegatorRegistration(0, delegator2); + posValidatorManager.completeDelegatorRegistration(0, delegationID_2); } function testCompleteDelegatorRegistrationImplicitNonce() public { @@ -270,7 +270,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -291,7 +291,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -307,7 +307,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -317,7 +317,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -325,6 +325,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, 2 @@ -340,7 +341,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -350,7 +351,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -358,6 +359,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, 2 @@ -365,7 +367,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendEndDelegation(validationID, DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.resendEndDelegation(delegationID); } function testCompleteEndDelegation() public { @@ -377,7 +379,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -385,26 +387,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); + // TODO: Remove this once the nonce update bug is fixed + posValidatorManager.foo(validationID); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); _setUpCompleteEndDelegation( - validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 + validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } - function testCompleteEndDelegationWrongNonce() public { + function testCompleteEndblahDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -415,7 +420,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -425,13 +430,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -442,7 +447,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator2, + delegationID_2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -452,6 +457,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator1, + delegationID_1, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 3 @@ -459,6 +465,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator2, + delegationID_2, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, DEFAULT_WEIGHT, 4 @@ -473,10 +480,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeEndDelegation(0, delegator2); + posValidatorManager.completeEndDelegation(0, delegationID_2); } - function testCompleteEndDelegationImplicitNonce() public { + function testCompleteEndDeblahlegationImplicitNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -487,7 +494,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -497,13 +504,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 =_setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -514,7 +521,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator2, + delegationID_2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -524,6 +531,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator1, + delegationID_1, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 3 @@ -531,13 +539,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator2, + delegationID_2, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, DEFAULT_WEIGHT, 4 ); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegator1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation(validationID, delegationID_1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } function testValueToWeight() public view { @@ -568,7 +577,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual; + ) internal virtual returns (bytes32); // // Delegation setup utilities @@ -592,19 +601,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorAdded({ validationID: validationID, setWeightMessageID: bytes32(0), - delegator: delegator, + delegationID: sha256(abi.encodePacked(validationID, delegator, expectedNonce)), delegatorWeight: weight, validatorWeight: expectedValidatorWeight, nonce: expectedNonce }); - _initializeDelegatorRegistration(validationID, delegator, weight); - return validationID; + return _initializeDelegatorRegistration(validationID, delegator, weight); } function _setUpCompleteDelegatorRegistration( bytes32 validationID, - address delegator, + bytes32 delegationID, uint64 completeRegistrationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -619,17 +627,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRegistered({ validationID: validationID, - delegator: delegator, + delegationID: delegationID, nonce: expectedNonce, startTime: completeRegistrationTimestamp }); - posValidatorManager.completeDelegatorRegistration(0, delegator); - return validationID; + posValidatorManager.completeDelegatorRegistration(0, delegationID); + return delegationID; } function _setUpInitializeEndDelegation( bytes32 validationID, address delegator, + bytes32 delegationID, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -643,19 +652,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorRemovalInitialized({ validationID: validationID, setWeightMessageID: bytes32(0), - delegator: delegator, + delegationID: delegationID, validatorWeight: expectedValidatorWeight, nonce: expectedNonce, endTime: endDelegationTimestamp }); vm.prank(delegator); - posValidatorManager.initializeEndDelegation(validationID, false, 0); - return validationID; + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + return delegationID; } function _setUpCompleteEndDelegation( bytes32 validationID, - address delegator, + bytes32 delegationID, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -666,10 +675,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator, expectedNonce); - posValidatorManager.completeEndDelegation(0, delegator); + emit DelegationEnded(validationID, delegationID, expectedNonce); + posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); - return validationID; + return delegationID; } function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { From 83191a9847355e9a82a246509755a06771b9acf4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 22:01:46 -0500 Subject: [PATCH 2/9] properly update state --- contracts/staking/PoSValidatorManager.sol | 17 ++++------------- .../tests/PoSValidatorManagerTests.t.sol | 7 ++----- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 5c7e908eb..aa3d6d85d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -145,11 +145,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; - // TODO: Updating the nonce in this function call DOES work as expected - function foo(bytes32 validationID) external { - _getAndIncrementNonce(validationID); - } - function _initializeDelegatorRegistration( bytes32 validationID, address delegator, @@ -163,11 +158,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); - // TODO: This function call seems to not update the validator manager's state, - // but ONLY when called from here. The same call in other methods does appear to - // update the validator manager's state as expected. - uint64 nonce = _getAndIncrementNonce(validationID); + // Update the validator weight + validator.weight += weight; + _setValidator(validationID, validator); + uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); // Ensure the delegator is not already registered @@ -178,10 +173,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); - // Update the validator weight - validator.weight += weight; - _setValidator(validationID, validator); - // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b320060e7..be1d98c02 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -387,8 +387,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - // TODO: Remove this once the nonce update bug is fixed - posValidatorManager.foo(validationID); _setUpCompleteDelegatorRegistration( validationID, delegationID, @@ -408,8 +406,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } - - function testCompleteEndblahDelegationWrongNonce() public { + function testCompleteEndDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -483,7 +480,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.completeEndDelegation(0, delegationID_2); } - function testCompleteEndDeblahlegationImplicitNonce() public { + function testCompleteEndDelegationImplicitNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, From 328a4259a2a5915aaa5d2ca1bff5dbbadc8c0ca5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 22:07:44 -0500 Subject: [PATCH 3/9] format --- .../ERC20TokenStakingManager.go | 260 +++++++++--------- .../NativeTokenStakingManager.go | 260 +++++++++--------- .../staking/NativeTokenStakingManager.sol | 6 +- contracts/staking/PoSValidatorManager.sol | 14 +- .../interfaces/IERC20TokenStakingManager.sol | 5 +- .../interfaces/INativeTokenStakingManager.sol | 5 +- .../NativeTokenStakingManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 129 +++++---- 8 files changed, 342 insertions(+), 339 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8fc3b66b2..27017da0f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148aa3803806148aa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61475d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063d61bed74146102c3575f80fd5b806366435abf146102185780636a7e3d831461022b57806376f786211461023e578063872fda6414610251575f80fd5b80630cdd0985116100e45780630cdd09851461016357806327f39ca8146101b45780632e2194d8146101c7578063467ef06f146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630915204e1461013d5780630b77f69314610150575b5f80fd5b610128610123366004613d74565b6102d6565b005b610128610138366004613daf565b610700565b61012861014b366004613dda565b61085c565b61012861015e366004613e0f565b610a1c565b6101a1610171366004613daf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101286101c2366004613e32565b610ae4565b6101da6101d5366004613daf565b610bc8565b6040516001600160401b0390911681526020016101ab565b610128610200366004613e64565b610bde565b6101a1610213366004613e93565b610f3a565b6101da610226366004613daf565b610f53565b610128610239366004613e0f565b610f67565b61012861024c366004613d74565b610fe9565b6101a161025f366004613f3e565b611004565b610128610272366004613fda565b611029565b610128610285366004613e64565b611038565b6102986005600160991b0181565b6040516001600160a01b0390911681526020016101ab565b6101286102be366004613daf565b6111f1565b6101286102d1366004613dda565b6112c0565b5f82156102ea576102e784836114af565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206146d183398151915293929190829060ff16600481111561035557610355613ffa565b600481111561036657610366613ffa565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a09091015290506002815160048111156103d0576103d0613ffa565b146104345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61043e8761174b565b9050600382819052506001600160401b034281166060840152811660a08301525f878152600384016020526040812083916104763390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360048111156104ac576104ac613ffa565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f610556886117c6565b905082602001516001600160401b031681608001516001600160401b0316116105cd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161042b565b8260200151816080018181516105e39190614022565b6001600160401b03169052506105f988826118c1565b5f610609898484608001516119b0565b5f8a81526005870160209081526040808320338452909152902090915061063082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061065d9085906004016141ad565b6020604051808303815f875af1158015610679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069d91906141df565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146f183398151915292919061074890614049565b905011801561077a575060035f83815260078301602052604090205460ff16600581111561077857610778613ffa565b145b6107de5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161042b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081791906004016141f6565b6020604051808303815f875af1158015610833573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085791906141df565b505050565b5f805160206146d18339815191525f61087484611bcf565b90505f806108858360400151611db0565b50915091506108948286611feb565b5f82815260058501602090815260408083206001600160a01b038916845290915281206108c091613d05565b5f6108ca836117c6565b9050816001600160401b031681606001516001600160401b031610156109025760405162461bcd60e51b815260040161042b90614280565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b90920416111561095b5760405162461bcd60e51b815260040161042b906142c2565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561099557610995613ffa565b146109b25760405162461bcd60e51b815260040161042b9061430b565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610a2682826120f4565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206146d1833981519152916005600160991b019163ee5b48eb91610a9e916004016141f6565b6020604051808303815f875af1158015610aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ade91906141df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b2d575080546001600160401b03808416911610155b15610b4b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b768484612208565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610bd864e8d4a510008361436f565b92915050565b5f805160206146f18339815191525f610bf683611bcf565b90505f80610c078360400151612222565b915091508015610c6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161042b565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610c9d57610c9d613ffa565b6005811115610cae57610cae613ffa565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610d2757610d27613ffa565b1480610d455750600182516005811115610d4357610d43613ffa565b145b610da45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161042b565b600382516005811115610db957610db9613ffa565b03610de057505f8381526006860160205260408120600491610ddb9190613d05565b610de4565b5060055b6020808301515f90815260088801909152604081205581816005811115610e0d57610e0d613ffa565b90816005811115610e2057610e20613ffa565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610e5457610e54613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610f0757610f07613ffa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610bd86001600160401b03831664e8d4a51000614382565b5f610f5d826117c6565b6080015192915050565b610f718282611feb565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206146d1833981519152916005600160991b019163ee5b48eb91610a9e916004016141f6565b8115610ffb57610ff983826114af565b505b610857836123c3565b5f8061100f86612754565b905061101d85828686612801565b9150505b949350505050565b611034823383612c35565b5050565b5f805160206146f18339815191525f61105083611bcf565b90505f806110618360400151612222565b91509150806110c35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161042b565b5f828152600585016020526040812080546110dd90614049565b905011801561110f575060015f83815260078601602052604090205460ff16600581111561110d5761110d613ffa565b145b61112b5760405162461bcd60e51b815260040161042b90614399565b5f828152600585016020526040812061114391613d05565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146f183398151915292919061123990614049565b905011801561126b575060015f83815260078301602052604090205460ff16600581111561126957611269613ffa565b145b6112875760405162461bcd60e51b815260040161042b90614399565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081791906004016141f6565b5f805160206146d18339815191525f6112d884611bcf565b90505f806112e98360400151611db0565b50915091506112f882866120f4565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061132491613d05565b5f61132e836117c6565b9050816001600160401b031681606001516001600160401b031610156113665760405162461bcd60e51b815260040161042b90614280565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156113b85760405162461bcd60e51b815260040161042b906142c2565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156113f2576113f2613ffa565b1461140f5760405162461bcd60e51b815260040161042b9061430b565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6910160405180910390a450505050505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114fa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152191908101906143eb565b91509150806115845760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161042b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115eb91906141df565b82511461164f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161042b565b60208201516001600160a01b0316156116c55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161042b565b5f806116d4846040015161300a565b915091508187146117415760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161042b565b9695505050505050565b5f8181525f805160206147318339815191526020526040812060020180545f805160206146f183398151915291600160a01b9091046001600160401b03169081906014611797836144bd565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061473183398151915290528390208351918201909352825491925f805160206146f183398151915292829060ff16600581111561184657611846613ffa565b600581111561185757611857613ffa565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061473183398151915260205260409020815181545f805160206146f18339815191529284929091829060ff1916600183600581111561190b5761190b613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a29576119e98160016144e2565b6119f4906008614382565b5081515f90839083908110611a0b57611a0b6144f5565b60200101906001600160f81b03191690815f1a9053506001016119d5565b505f5b6004811015611a8c57611a408160036144e2565b611a4b906008614382565b6001901c60f81b82611a5e836002614509565b81518110611a6e57611a6e6144f5565b60200101906001600160f81b03191690815f1a905350600101611a2c565b505f5b6020811015611aee57611aa381601f6144e2565b611aae906008614382565b86901c60f81b82611ac0836006614509565b81518110611ad057611ad06144f5565b60200101906001600160f81b03191690815f1a905350600101611a8f565b505f5b6008811015611b5957611b058160076144e2565b611b10906008614382565b6001600160401b038616901c60f81b82611b2b836026614509565b81518110611b3b57611b3b6144f5565b60200101906001600160f81b03191690815f1a905350600101611af1565b505f5b6008811015611bc457611b708160076144e2565b611b7b906008614382565b6001600160401b038516901c60f81b82611b9683602e614509565b81518110611ba657611ba66144f5565b60200101906001600160f81b03191690815f1a905350600101611b5c565b5090505b9392505050565b60408051606080820183525f8083526020830181905292820152905f805160206146f18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c6b91908101906143eb565b9150915080611cd25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161042b565b8254825114611d355760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161042b565b60208201516001600160a01b031615611da85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161042b565b509392505050565b5f805f8351603614611dd45760405162461bcd60e51b815260040161042b9061451c565b5f805b6002811015611e2357611deb8160016144e2565b611df6906008614382565b61ffff16868281518110611e0c57611e0c6144f5565b016020015160f81c901b9190911790600101611dd7565b5061ffff811615611e465760405162461bcd60e51b815260040161042b90614565565b5f805b6004811015611ea157611e5d8160036144e2565b611e68906008614382565b63ffffffff1687611e7a836002614509565b81518110611e8a57611e8a6144f5565b016020015160f81c901b9190911790600101611e49565b5063ffffffff8116600314611ec85760405162461bcd60e51b815260040161042b906145a8565b5f805b6020811015611f1d57611edf81601f6144e2565b611eea906008614382565b88611ef6836006614509565b81518110611f0657611f066144f5565b016020015160f81c901b9190911790600101611ecb565b505f805b6008811015611f7c57611f358160076144e2565b611f40906008614382565b6001600160401b031689611f55836026614509565b81518110611f6557611f656144f5565b016020015160f81c901b9190911790600101611f21565b505f805b6008811015611fdb57611f948160076144e2565b611f9f906008614382565b6001600160401b03168a611fb483602e614509565b81518110611fc457611fc46144f5565b016020015160f81c901b9190911790600101611f80565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206146d183398151915292919061204790614049565b905011801561208d575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561208b5761208b613ffa565b145b6108575760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161042b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206146d183398151915292919061215090614049565b9050118015612196575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561219457612194613ffa565b145b6108575760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161042b565b6122106131e2565b6122198261322d565b61103481613273565b5f8082516027146122455760405162461bcd60e51b815260040161042b9061451c565b5f805b60028110156122945761225c8160016144e2565b612267906008614382565b61ffff1685828151811061227d5761227d6144f5565b016020015160f81c901b9190911790600101612248565b5061ffff8116156122b75760405162461bcd60e51b815260040161042b90614565565b5f805b6004811015612312576122ce8160036144e2565b6122d9906008614382565b63ffffffff16866122eb836002614509565b815181106122fb576122fb6144f5565b016020015160f81c901b91909117906001016122ba565b5063ffffffff81166002146123395760405162461bcd60e51b815260040161042b906145a8565b5f805b602081101561238e5761235081601f6144e2565b61235b906008614382565b87612367836006614509565b81518110612377576123776144f5565b016020015160f81c901b919091179060010161233c565b505f866026815181106123a3576123a36144f5565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206147318339815191526020526040808220815160e0810190925280545f805160206146f183398151915293929190829060ff16600581111561241057612410613ffa565b600581111561242157612421613ffa565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561249b5761249b613ffa565b146124f75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161042b565b60408101516001600160a01b0316336001600160a01b0316146125715760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161042b565b61257e8160800151613327565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125c2576125c2613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f612676846126708161174b565b5f6119b0565b5f858152600685016020526040902090915061269282826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126bf9085906004016141ad565b6020604051808303815f875af11580156126db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ff91906141df565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146d18339815191528161276d846134c8565b90505f61277982610bc8565b83549091506001600160401b038216108015906127a357508260010154816001600160401b031611155b6110215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161042b565b5f61280a6134fe565b5f805160206146f1833981519152426001600160401b03851611801561284457506001600160401b038416612842426202a300614509565b115b6128a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161042b565b856128fd5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161042b565b5f8681526008820160205260409020541561296b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161042b565b82516030146129d25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161042b565b6129db85613327565b5f80612a226040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613535565b5f82815260058601602052604090209193509150612a4082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a6d9085906004016141ad565b6020604051808303815f875af1158015612a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aad91906141df565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612b2657612b26613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612bcf8361174b565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061102160015f8051602061471183398151915255565b612c3d6134fe565b5f612c4a6101d5836134c8565b90505f805160206146d18339815191525f612c64866117c6565b9050600281516005811115612c7b57612c7b613ffa565b14612cda5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161042b565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612d735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161042b565b612d7c83613327565b8281608001818151612d8e91906145ef565b6001600160401b0316905250612da486826118c1565b5f612dae8761174b565b90505f612dc0888385608001516119b0565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612df082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e1d9085906004016141ad565b6020604051808303815f875af1158015612e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e5d91906141df565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612ede57612ede613ffa565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612fe6918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061085760015f8051602061471183398151915255565b5f808251602e1461302d5760405162461bcd60e51b815260040161042b9061451c565b5f805b600281101561307c576130448160016144e2565b61304f906008614382565b61ffff16858281518110613065576130656144f5565b016020015160f81c901b9190911790600101613030565b5061ffff81161561309f5760405162461bcd60e51b815260040161042b90614565565b5f805b60048110156130fa576130b68160036144e2565b6130c1906008614382565b63ffffffff16866130d3836002614509565b815181106130e3576130e36144f5565b016020015160f81c901b91909117906001016130a2565b5063ffffffff81166004146131215760405162461bcd60e51b815260040161042b906145a8565b5f805b60208110156131765761313881601f6144e2565b613143906008614382565b8761314f836006614509565b8151811061315f5761315f6144f5565b016020015160f81c901b9190911790600101613124565b505f805b60088110156131d55761318e8160076144e2565b613199906008614382565b6001600160401b0316886131ae836026614509565b815181106131be576131be6144f5565b016020015160f81c901b919091179060010161317a565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322b57604051631afcd79f60e31b815260040160405180910390fd5b565b6132356131e2565b61323e816138ed565b6132706060820135608083013561325b60c0850160a08601613e93565b61326b60e0860160c0870161460f565b61390e565b50565b61327b6131e2565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133075760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161042b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146f18339815191529060ff165f03613365575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ad90836144e2565b106133c9576001600160401b03841660408301528082526133e8565b83826040018181516133db91906145ef565b6001600160401b03169052505b5f8260200151836040015160646133ff919061462a565b6134099190614655565b600285015490915060ff90811690821611156134845760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161042b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610bd8827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613969565b5f8051602061471183398151915280546001190161352f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461359f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161042b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613616576135d68160016144e2565b6135e1906008614382565b5081515f908390839081106135f8576135f86144f5565b60200101906001600160f81b03191690815f1a9053506001016135c2565b505f5b60048110156136745761362d8160036144e2565b613638906008614382565b505f82613646836002614509565b81518110613656576136566144f5565b60200101906001600160f81b03191690815f1a905350600101613619565b505f5b60208110156136d15784518160208110613693576136936144f5565b1a60f81b826136a3836006614509565b815181106136b3576136b36144f5565b60200101906001600160f81b03191690815f1a905350600101613677565b505f5b602081101561373157846020015181602081106136f3576136f36144f5565b1a60f81b82613703836026614509565b81518110613713576137136144f5565b60200101906001600160f81b03191690815f1a9053506001016136d4565b505f5b60088110156137a5576137488160076144e2565b613753906008614382565b60ff1685604001516001600160401b0316901c60f81b828260466137779190614509565b81518110613787576137876144f5565b60200101906001600160f81b03191690815f1a905350600101613734565b505f5b603081101561381057846080015181815181106137c7576137c76144f5565b01602001516001600160f81b031916826137e283604e614509565b815181106137f2576137f26144f5565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b6008811015613882576138278160076144e2565b613832906008614382565b60608601516001600160401b0390811691161c60f81b8261385483607e614509565b81518110613864576138646144f5565b60200101906001600160f81b03191690815f1a905350600101613813565b50600281604051613893919061467a565b602060405180830381855afa1580156138ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138d191906141df565b94909350915050565b60015f8051602061471183398151915255565b6138f56131e2565b6138fd613acb565b613905613adb565b61327081613ae3565b6139166131e2565b5f5f805160206146d1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d391906141df565b90506139ea6001600160a01b038516333086613b4f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5291906141df565b9050818111613ab85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161042b565b613ac282826144e2565b95945050505050565b613ad36131e2565b61322b613ba9565b61322b6131e2565b613aeb6131e2565b80355f805160206146f183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b356060830160408401614695565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ade908590613bb1565b6138da6131e2565b5f613bc56001600160a01b03841683613c12565b905080515f14158015613be9575080806020019051810190613be791906146b5565b155b1561085757604051635274afe760e01b81526001600160a01b038416600482015260240161042b565b6060611bc883835f845f80856001600160a01b03168486604051613c36919061467a565b5f6040518083038185875af1925050503d805f8114613c70576040519150601f19603f3d011682016040523d82523d5f602084013e613c75565b606091505b5091509150611741868383606082613c9557613c9082613cdc565b611bc8565b8151158015613cac57506001600160a01b0384163b155b15613cd557604051639996b31560e01b81526001600160a01b038516600482015260240161042b565b5080611bc8565b805115613cec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d1190614049565b5f825580601f10613d20575050565b601f0160209004905f5260205f209081019061327091905b80821115613d4b575f8155600101613d38565b5090565b8015158114613270575f80fd5b803563ffffffff81168114613d6f575f80fd5b919050565b5f805f60608486031215613d86575f80fd5b833592506020840135613d9881613d4f565b9150613da660408501613d5c565b90509250925092565b5f60208284031215613dbf575f80fd5b5035919050565b6001600160a01b0381168114613270575f80fd5b5f8060408385031215613deb575f80fd5b613df483613d5c565b91506020830135613e0481613dc6565b809150509250929050565b5f8060408385031215613e20575f80fd5b823591506020830135613e0481613dc6565b5f80828403610100811215613e45575f80fd5b60e0811215613e52575f80fd5b5082915060e0830135613e0481613dc6565b5f60208284031215613e74575f80fd5b611bc882613d5c565b80356001600160401b0381168114613d6f575f80fd5b5f60208284031215613ea3575f80fd5b611bc882613e7d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ee257613ee2613eac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f1057613f10613eac565b604052919050565b5f6001600160401b03821115613f3057613f30613eac565b50601f01601f191660200190565b5f805f8060808587031215613f51575f80fd5b8435935060208501359250613f6860408601613e7d565b915060608501356001600160401b03811115613f82575f80fd5b8501601f81018713613f92575f80fd5b8035613fa5613fa082613f18565b613ee8565b818152886020838501011115613fb9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613feb575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140425761404261400e565b5092915050565b600181811c9082168061405d57607f821691505b60208210810361407b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561085757805f5260205f20601f840160051c810160208510156140a65750805b601f840160051c820191505b818110156140c5575f81556001016140b2565b5050505050565b81516001600160401b038111156140e5576140e5613eac565b6140f9816140f38454614049565b84614081565b602080601f83116001811461412c575f84156141155750858301515b5f19600386901b1c1916600185901b178555614183565b5f85815260208120601f198616915b8281101561415a5788860151825594840194600190910190840161413b565b508582101561417757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141a557818101518382015260200161418d565b50505f910152565b602081525f82518060208401526141cb81604085016020870161418b565b601f01601f19169190910160400192915050565b5f602082840312156141ef575f80fd5b5051919050565b5f60208083525f845461420881614049565b806020870152604060018084165f8114614229576001811461424557614272565b60ff19851660408a0152604084151560051b8a01019550614272565b895f5260205f205f5b858110156142695781548b820186015290830190880161424e565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261437d5761437d61435b565b500490565b8082028115828204841417610bd857610bd861400e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6f81613d4f565b5f80604083850312156143fc575f80fd5b82516001600160401b0380821115614412575f80fd5b9084019060608287031215614425575f80fd5b61442d613ec0565b8251815260208084015161444081613dc6565b82820152604084015183811115614455575f80fd5b80850194505087601f850112614469575f80fd5b83519250614479613fa084613f18565b838152888285870101111561448c575f80fd5b61449b8483830184880161418b565b806040840152508195506144b08188016143e0565b9450505050509250929050565b5f6001600160401b038083168181036144d8576144d861400e565b6001019392505050565b81810381811115610bd857610bd861400e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bd857610bd861400e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140425761404261400e565b5f6020828403121561461f575f80fd5b8135611bc881613dc6565b6001600160401b0381811683821602808216919082811461464d5761464d61400e565b505092915050565b5f6001600160401b038084168061466e5761466e61435b565b92169190910492915050565b5f825161468b81846020870161418b565b9190910192915050565b5f602082840312156146a5575f80fd5b813560ff81168114611bc8575f80fd5b5f602082840312156146c5575f80fd5b8151611bc881613d4f56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147e13803806147e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613cd0565b6102d6565b005b610128610138366004613d0b565b61071f565b61017b61014b366004613d0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d0b565b61087b565b6101286101af366004613d36565b6108e8565b6101c76101c2366004613d0b565b6109cc565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d73565b6109e2565b610128610200366004613d8c565b610d3e565b61017b610213366004613dca565b610ee3565b6101c7610226366004613d0b565b610efc565b610128610239366004613d0b565b610f10565b61012861024c366004613cd0565b610f7d565b61017b61025f366004613e75565b610f98565b610128610272366004613d8c565b610fbd565b61017b610285366004613f11565b611126565b610128610298366004613d73565b611139565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d0b565b6112ed565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146088339815191529184156103285761032582856113bc565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f31565b600481111561036b5761036b613f31565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f31565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611658565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613f31565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116d3565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b82606001518160800181815161060c9190613f59565b6001600160401b031690525061062285826117ce565b5f610632868484608001516118bd565b5f8b8152600589016020526040902090915061064e8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061067b9085906004016140e4565b6020604051808303815f875af1158015610697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bb9190614116565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462883398151915292919061076790613f80565b9050118015610799575060035f83815260078301602052604090205460ff16600581111561079757610797613f31565b145b6107fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6020604051808303815f875af1158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190614116565b505050565b61088481611ada565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610931575080546001600160401b03808416911610155b1561094f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561097a8484611bbf565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dc64e8d4a51000836141cb565b92915050565b5f805160206146288339815191525f6109fa83611bd9565b90505f80610a0b8360400151611dba565b915091508015610a705760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aa157610aa1613f31565b6005811115610ab257610ab2613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b2b57610b2b613f31565b1480610b495750600182516005811115610b4757610b47613f31565b145b610ba85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610bbd57610bbd613f31565b03610be457505f8381526006860160205260408120600491610bdf9190613c61565b610be8565b5060055b6020808301515f90815260088801909152604081205581816005811115610c1157610c11613f31565b90816005811115610c2457610c24613f31565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c5857610c58613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d0b57610d0b613f31565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146088339815191525f610d5684611bd9565b90505f80610d678360400151611f5b565b5091509150610d7585612196565b5f8581526004850160205260408120610d8d91613c61565b5f610d97836116d3565b9050816001600160401b031681606001516001600160401b03161015610dcf5760405162461bcd60e51b815260040161044d906141de565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e145760405162461bcd60e51b815260040161044d90614220565b60015f87815260038701602052604090205460ff166004811115610e3a57610e3a613f31565b14610e575760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109dc6001600160401b03831664e8d4a510006142b9565b5f610f06826116d3565b6080015192915050565b610f1981612196565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b8115610f8f57610f8d83826113bc565b505b61087683612282565b5f80610fa386612613565b9050610fb1858286866126c0565b9150505b949350505050565b5f805160206146088339815191525f610fd584611bd9565b90505f80610fe68360400151611f5b565b5091509150610ff485611ada565b5f858152600585016020526040812061100c91613c61565b5f611016836116d3565b9050816001600160401b031681606001516001600160401b0316101561104e5760405162461bcd60e51b815260040161044d906141de565b5f8681526003808701602052604090912001546001600160401b038084169116111561108c5760405162461bcd60e51b815260040161044d90614220565b60035f87815260038701602052604090205460ff1660048111156110b2576110b2613f31565b146110cf5760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611132833384612af4565b9392505050565b5f805160206146288339815191525f61115183611bd9565b90505f806111628360400151611dba565b91509150806111c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111de90613f80565b9050118015611210575060015f83815260078601602052604090205460ff16600581111561120e5761120e613f31565b145b61122c5760405162461bcd60e51b815260040161044d906142d0565b5f828152600585016020526040812061124491613c61565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462883398151915292919061133590613f80565b9050118015611367575060015f83815260078301602052604090205460ff16600581111561136557611365613f31565b145b6113835760405162461bcd60e51b815260040161044d906142d0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611407573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261142e9190810190614322565b91509150806114915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f89190614116565b82511461155c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115d25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115e18460400151612f60565b9150915081871461164e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206146688339815191526020526040812060020180545f8051602061462883398151915291600160a01b9091046001600160401b031690819060146116a4836143f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466883398151915290528390208351918201909352825491925f8051602061462883398151915292829060ff16600581111561175357611753613f31565b600581111561176457611764613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466883398151915260205260409020815181545f805160206146288339815191529284929091829060ff1916600183600581111561181857611818613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611936576118f6816001614419565b6119019060086142b9565b5081515f908390839081106119185761191861442c565b60200101906001600160f81b03191690815f1a9053506001016118e2565b505f5b60048110156119995761194d816003614419565b6119589060086142b9565b6001901c60f81b8261196b836002614440565b8151811061197b5761197b61442c565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b60208110156119fb576119b081601f614419565b6119bb9060086142b9565b86901c60f81b826119cd836006614440565b815181106119dd576119dd61442c565b60200101906001600160f81b03191690815f1a90535060010161199c565b505f5b6008811015611a6657611a12816007614419565b611a1d9060086142b9565b6001600160401b038616901c60f81b82611a38836026614440565b81518110611a4857611a4861442c565b60200101906001600160f81b03191690815f1a9053506001016119fe565b505f5b6008811015611ad157611a7d816007614419565b611a889060086142b9565b6001600160401b038516901c60f81b82611aa383602e614440565b81518110611ab357611ab361442c565b60200101906001600160f81b03191690815f1a905350600101611a69565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614608833981519152929190611b2290613f80565b9050118015611b54575060035f83815260038301602052604090205460ff166004811115611b5257611b52613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611bc7613138565b611bd082613183565b611bbb816131c9565b60408051606080820183525f8083526020830181905292820152905f805160206146288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c759190810190614322565b9150915080611cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611d3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611db25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611ddd5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611e2c57611df4816001614419565b611dff9060086142b9565b61ffff16858281518110611e1557611e1561442c565b016020015160f81c901b9190911790600101611de0565b5061ffff811615611e4f5760405162461bcd60e51b815260040161044d9061449c565b5f805b6004811015611eaa57611e66816003614419565b611e719060086142b9565b63ffffffff1686611e83836002614440565b81518110611e9357611e9361442c565b016020015160f81c901b9190911790600101611e52565b5063ffffffff8116600214611ed15760405162461bcd60e51b815260040161044d906144df565b5f805b6020811015611f2657611ee881601f614419565b611ef39060086142b9565b87611eff836006614440565b81518110611f0f57611f0f61442c565b016020015160f81c901b9190911790600101611ed4565b505f86602681518110611f3b57611f3b61442c565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f7f5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611fce57611f96816001614419565b611fa19060086142b9565b61ffff16868281518110611fb757611fb761442c565b016020015160f81c901b9190911790600101611f82565b5061ffff811615611ff15760405162461bcd60e51b815260040161044d9061449c565b5f805b600481101561204c57612008816003614419565b6120139060086142b9565b63ffffffff1687612025836002614440565b815181106120355761203561442c565b016020015160f81c901b9190911790600101611ff4565b5063ffffffff81166003146120735760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156120c85761208a81601f614419565b6120959060086142b9565b886120a1836006614440565b815181106120b1576120b161442c565b016020015160f81c901b9190911790600101612076565b505f805b6008811015612127576120e0816007614419565b6120eb9060086142b9565b6001600160401b031689612100836026614440565b815181106121105761211061442c565b016020015160f81c901b91909117906001016120cc565b505f805b60088110156121865761213f816007614419565b61214a9060086142b9565b6001600160401b03168a61215f83602e614440565b8151811061216f5761216f61442c565b016020015160f81c901b919091179060010161212b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146088339815191529291906121de90613f80565b9050118015612210575060015f83815260038301602052604090205460ff16600481111561220e5761220e613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206146688339815191526020526040808220815160e0810190925280545f8051602061462883398151915293929190829060ff1660058111156122cf576122cf613f31565b60058111156122e0576122e0613f31565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235a5761235a613f31565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61243d816080015161327d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248157612481613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125358461252f81611658565b5f6118bd565b5f85815260068501602052604090209091506125518282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061257e9085906004016140e4565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190614116565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146088339815191528161262c8461341e565b90505f612638826109cc565b83549091506001600160401b0382161080159061266257508260010154816001600160401b031611155b610fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f6126c9613454565b5f80516020614628833981519152426001600160401b03851611801561270357506001600160401b038416612701426202a300614440565b115b6127655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856127bc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f8681526008820160205260409020541561282a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146128915760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b61289a8561327d565b5f806128e16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061348b565b5f828152600586016020526040902091935091506128ff8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061292c9085906004016140e4565b6020604051808303815f875af1158015612948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296c9190614116565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129e5576129e5613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8e83611658565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fb560015f8051602061464883398151915255565b5f612afd613454565b5f612b0a6101c28461341e565b90505f805160206146088339815191525f612b24876116d3565b9050600281516005811115612b3b57612b3b613f31565b14612b9a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b8281608001818151612bac9190614526565b6001600160401b0316905250612bc287826117ce565b5f612bcc88611658565b90505f6002898984604051602001612c169392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c3091614546565b602060405180830381855afa158015612c4b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c6e9190614116565b5f8181526003860160205260409020600201549091506001600160401b031615612cf45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612cfd8561327d565b5f612d0d8a8486608001516118bd565b5f8381526004870160205260409020909150612d298282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d569085906004016140e4565b6020604051808303815f875af1158015612d72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d969190614116565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff19166001836004811115612e1e57612e1e613f31565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061113260015f8051602061464883398151915255565b5f808251602e14612f835760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015612fd257612f9a816001614419565b612fa59060086142b9565b61ffff16858281518110612fbb57612fbb61442c565b016020015160f81c901b9190911790600101612f86565b5061ffff811615612ff55760405162461bcd60e51b815260040161044d9061449c565b5f805b60048110156130505761300c816003614419565b6130179060086142b9565b63ffffffff1686613029836002614440565b815181106130395761303961442c565b016020015160f81c901b9190911790600101612ff8565b5063ffffffff81166004146130775760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156130cc5761308e81601f614419565b6130999060086142b9565b876130a5836006614440565b815181106130b5576130b561442c565b016020015160f81c901b919091179060010161307a565b505f805b600881101561312b576130e4816007614419565b6130ef9060086142b9565b6001600160401b031688613104836026614440565b815181106131145761311461442c565b016020015160f81c901b91909117906001016130d0565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318157604051631afcd79f60e31b815260040160405180910390fd5b565b61318b613138565b61319481613843565b6131c6606082013560808301356131b160c0850160a08601613dca565b6131c160e0860160c08701614561565b613864565b50565b6131d1613138565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661325d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146288339815191529060ff165f036132bb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133039083614419565b1061331f576001600160401b038416604083015280825261333e565b83826040018181516133319190614526565b6001600160401b03169052505b5f826020015183604001516064613355919061457c565b61335f91906145a7565b600285015490915060ff90811690821611156133da5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109dc827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138bf565b5f8051602061464883398151915280546001190161348557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134f55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561356c5761352c816001614419565b6135379060086142b9565b5081515f9083908390811061354e5761354e61442c565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60048110156135ca57613583816003614419565b61358e9060086142b9565b505f8261359c836002614440565b815181106135ac576135ac61442c565b60200101906001600160f81b03191690815f1a90535060010161356f565b505f5b602081101561362757845181602081106135e9576135e961442c565b1a60f81b826135f9836006614440565b815181106136095761360961442c565b60200101906001600160f81b03191690815f1a9053506001016135cd565b505f5b602081101561368757846020015181602081106136495761364961442c565b1a60f81b82613659836026614440565b815181106136695761366961442c565b60200101906001600160f81b03191690815f1a90535060010161362a565b505f5b60088110156136fb5761369e816007614419565b6136a99060086142b9565b60ff1685604001516001600160401b0316901c60f81b828260466136cd9190614440565b815181106136dd576136dd61442c565b60200101906001600160f81b03191690815f1a90535060010161368a565b505f5b6030811015613766578460800151818151811061371d5761371d61442c565b01602001516001600160f81b0319168261373883604e614440565b815181106137485761374861442c565b60200101906001600160f81b03191690815f1a9053506001016136fe565b505f5b60088110156137d85761377d816007614419565b6137889060086142b9565b60608601516001600160401b0390811691161c60f81b826137aa83607e614440565b815181106137ba576137ba61442c565b60200101906001600160f81b03191690815f1a905350600101613769565b506002816040516137e99190614546565b602060405180830381855afa158015613804573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138279190614116565b94909350915050565b60015f8051602061464883398151915255565b61384b613138565b613853613a21565b61385b613a31565b6131c681613a39565b61386c613138565b5f5f80516020614608833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139299190614116565b90506139406001600160a01b038516333086613aa5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a89190614116565b9050818111613a0e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b613a188282614419565b95945050505050565b613a29613138565b613181613b05565b613181613138565b613a41613138565b80355f8051602061462883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a8b60608301604084016145cc565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613aff908590613b0d565b50505050565b613830613138565b5f613b216001600160a01b03841683613b6e565b905080515f14158015613b45575080806020019051810190613b4391906145ec565b155b1561087657604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061113283835f845f80856001600160a01b03168486604051613b929190614546565b5f6040518083038185875af1925050503d805f8114613bcc576040519150601f19603f3d011682016040523d82523d5f602084013e613bd1565b606091505b509150915061164e868383606082613bf157613bec82613c38565b611132565b8151158015613c0857506001600160a01b0384163b155b15613c3157604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b5080611132565b805115613c485780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c6d90613f80565b5f825580601f10613c7c575050565b601f0160209004905f5260205f20908101906131c691905b80821115613ca7575f8155600101613c94565b5090565b80151581146131c6575f80fd5b803563ffffffff81168114613ccb575f80fd5b919050565b5f805f60608486031215613ce2575f80fd5b833592506020840135613cf481613cab565b9150613d0260408501613cb8565b90509250925092565b5f60208284031215613d1b575f80fd5b5035919050565b6001600160a01b03811681146131c6575f80fd5b5f80828403610100811215613d49575f80fd5b60e0811215613d56575f80fd5b5082915060e0830135613d6881613d22565b809150509250929050565b5f60208284031215613d83575f80fd5b61113282613cb8565b5f8060408385031215613d9d575f80fd5b613da683613cb8565b946020939093013593505050565b80356001600160401b0381168114613ccb575f80fd5b5f60208284031215613dda575f80fd5b61113282613db4565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e1957613e19613de3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e4757613e47613de3565b604052919050565b5f6001600160401b03821115613e6757613e67613de3565b50601f01601f191660200190565b5f805f8060808587031215613e88575f80fd5b8435935060208501359250613e9f60408601613db4565b915060608501356001600160401b03811115613eb9575f80fd5b8501601f81018713613ec9575f80fd5b8035613edc613ed782613e4f565b613e1f565b818152886020838501011115613ef0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f22575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f7957613f79613f45565b5092915050565b600181811c90821680613f9457607f821691505b602082108103613fb257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561087657805f5260205f20601f840160051c81016020851015613fdd5750805b601f840160051c820191505b81811015613ffc575f8155600101613fe9565b5050505050565b81516001600160401b0381111561401c5761401c613de3565b6140308161402a8454613f80565b84613fb8565b602080601f831160018114614063575f841561404c5750858301515b5f19600386901b1c1916600185901b1785556140ba565b5f85815260208120601f198616915b8281101561409157888601518255948401946001909101908401614072565b50858210156140ae57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140dc5781810151838201526020016140c4565b50505f910152565b602081525f82518060208401526141028160408501602087016140c2565b601f01601f19169190910160400192915050565b5f60208284031215614126575f80fd5b5051919050565b5f60208083525f845461413f81613f80565b806020870152604060018084165f8114614160576001811461417c576141a9565b60ff19851660408a0152604084151560051b8a010195506141a9565b895f5260205f205f5b858110156141a05781548b8201860152908301908801614185565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141d9576141d96141b7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109dc576109dc613f45565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ccb81613cab565b5f8060408385031215614333575f80fd5b82516001600160401b0380821115614349575f80fd5b908401906060828703121561435c575f80fd5b614364613df7565b8251815260208084015161437781613d22565b8282015260408401518381111561438c575f80fd5b80850194505087601f8501126143a0575f80fd5b835192506143b0613ed784613e4f565b83815288828587010111156143c3575f80fd5b6143d2848383018488016140c2565b806040840152508195506143e7818801614317565b9450505050509250929050565b5f6001600160401b0380831681810361440f5761440f613f45565b6001019392505050565b818103818111156109dc576109dc613f45565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109dc576109dc613f45565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f7957613f79613f45565b5f82516145578184602087016140c2565b9190910192915050565b5f60208284031215614571575f80fd5b813561113281613d22565b6001600160401b0381811683821602808216919082811461459f5761459f613f45565b505092915050565b5f6001600160401b03808416806145c0576145c06141b7565b92169190910492915050565b5f602082840312156145dc575f80fd5b813560ff81168114611132575f80fd5b5f602082840312156145fc575f80fd5b815161113281613cab56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -373,46 +373,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -480,44 +480,44 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. @@ -562,46 +562,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -716,55 +716,55 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -796,9 +796,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -879,17 +879,17 @@ func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { type ERC20TokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte DelegatorWeight uint64 ValidatorWeight uint64 Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -899,22 +899,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -924,12 +924,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -961,9 +961,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { event := new(ERC20TokenStakingManagerDelegatorAdded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1043,56 +1043,56 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -1124,9 +1124,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1207,17 +1207,17 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte ValidatorWeight uint64 Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1227,22 +1227,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1252,12 +1252,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -1289,9 +1289,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 210c8c23e..ddee60b49 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144e93803806144e983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61439c8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102f3578063bee0a03f14610325578063c599e24f14610344578063d61bed7414610357578063f40797d714610376575f80fd5b806366435abf146102775780636a7e3d831461029657806376f78621146102b5578063a3a65e48146102d4575f80fd5b80630b77f693116100d85780630b77f693146101865780630cdd0985146101a55780632e2194d814610202578063467ef06f146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630915204e14610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139ee565b610389565b005b348015610134575f80fd5b50610127610143366004613a29565b61046b565b348015610153575f80fd5b50610127610162366004613a64565b610895565b348015610172575f80fd5b50610127610181366004613a8f565b6109f1565b348015610191575f80fd5b506101276101a0366004613ac4565b610bb1565b3480156101b0575f80fd5b506101ef6101bf366004613a64565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b5061022161021c366004613a64565b610c79565b6040516001600160401b0390911681526020016101f9565b348015610244575f80fd5b50610127610253366004613ae7565b610c8f565b348015610263575f80fd5b506101ef610272366004613b1d565b610feb565b348015610282575f80fd5b50610221610291366004613a64565b611004565b3480156102a1575f80fd5b506101276102b0366004613ac4565b611018565b3480156102c0575f80fd5b506101276102cf366004613a29565b61109a565b3480156102df575f80fd5b506101276102ee366004613ae7565b6110b5565b3480156102fe575f80fd5b5061030d6005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b348015610330575f80fd5b5061012761033f366004613a64565b61126e565b610127610352366004613a64565b61133d565b348015610362575f80fd5b50610127610371366004613a8f565b61134b565b6101ef610384366004613bc8565b61153a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361155c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f821561047f5761047c848361156d565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f8051602061431083398151915293929190829060ff1660048111156104ea576104ea613c5a565b60048111156104fb576104fb613c5a565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561056557610565613c5a565b146105c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105d387611809565b9050600382819052506001600160401b034281166060840152811660a08301525f8781526003840160205260408120839161060b3390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561064157610641613c5a565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6106eb88611884565b905082602001516001600160401b031681608001516001600160401b0316116107625760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105c0565b8260200151816080018181516107789190613c82565b6001600160401b031690525061078e888261197f565b5f61079e89848460800151611a6e565b5f8a8152600587016020908152604080832033845290915290209091506107c58282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107f2908590600401613e07565b6020604051808303815f875af115801561080e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108329190613e39565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143308339815191529291906108dd90613ca9565b905011801561090f575060035f83815260078301602052604090205460ff16600581111561090d5761090d613c5a565b145b6109735760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105c0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109ac9190600401613e50565b6020604051808303815f875af11580156109c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ec9190613e39565b505050565b5f805160206143108339815191525f610a0984611c8b565b90505f80610a1a8360400151611e6c565b5091509150610a2982866120a7565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610a55916139a4565b5f610a5f83611884565b9050816001600160401b031681606001516001600160401b03161015610a975760405162461bcd60e51b81526004016105c090613eda565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b909204161115610af05760405162461bcd60e51b81526004016105c090613f1c565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff166004811115610b2a57610b2a613c5a565b14610b475760405162461bcd60e51b81526004016105c090613f65565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610bbb82826121b0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614310833981519152916005600160991b019163ee5b48eb91610c3391600401613e50565b6020604051808303815f875af1158015610c4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c739190613e39565b50505050565b5f610c8964e8d4a5100083613fc9565b92915050565b5f805160206143308339815191525f610ca783611c8b565b90505f80610cb883604001516122c4565b915091508015610d1d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105c0565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610d4e57610d4e613c5a565b6005811115610d5f57610d5f613c5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610dd857610dd8613c5a565b1480610df65750600182516005811115610df457610df4613c5a565b145b610e555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105c0565b600382516005811115610e6a57610e6a613c5a565b03610e9157505f8381526006860160205260408120600491610e8c91906139a4565b610e95565b5060055b6020808301515f90815260088801909152604081205581816005811115610ebe57610ebe613c5a565b90816005811115610ed157610ed1613c5a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f0557610f05613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610fb857610fb8613c5a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610c896001600160401b03831664e8d4a51000613fdc565b5f61100e82611884565b6080015192915050565b61102282826120a7565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614310833981519152916005600160991b019163ee5b48eb91610c3391600401613e50565b81156110ac576110aa838261156d565b505b6109ec83612465565b5f805160206143308339815191525f6110cd83611c8b565b90505f806110de83604001516122c4565b91509150806111405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105c0565b5f8281526005850160205260408120805461115a90613ca9565b905011801561118c575060015f83815260078601602052604090205460ff16600581111561118a5761118a613c5a565b145b6111a85760405162461bcd60e51b81526004016105c090613ff3565b5f82815260058501602052604081206111c0916139a4565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206143308339815191529291906112b690613ca9565b90501180156112e8575060015f83815260078301602052604090205460ff1660058111156112e6576112e6613c5a565b145b6113045760405162461bcd60e51b81526004016105c090613ff3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109ac9190600401613e50565b6113488133346127f6565b50565b5f805160206143108339815191525f61136384611c8b565b90505f806113748360400151611e6c565b509150915061138382866121b0565b5f82815260048501602090815260408083206001600160a01b038916845290915281206113af916139a4565b5f6113b983611884565b9050816001600160401b031681606001516001600160401b031610156113f15760405162461bcd60e51b81526004016105c090613eda565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156114435760405162461bcd60e51b81526004016105c090613f1c565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561147d5761147d613c5a565b1461149a5760405162461bcd60e51b81526004016105c090613f65565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6910160405180910390a450505050505050565b5f8061154534612bc8565b905061155385828686612c72565b95945050505050565b6115646130a6565b611348816130f1565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115df9190810190614045565b91509150806116425760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a99190613e39565b82511461170d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105c0565b60208201516001600160a01b0316156117835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105c0565b5f806117928460400151613134565b915091508187146117ff5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105c0565b9695505050505050565b5f8181525f805160206143708339815191526020526040812060020180545f8051602061433083398151915291600160a01b9091046001600160401b0316908190601461185583614117565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061437083398151915290528390208351918201909352825491925f8051602061433083398151915292829060ff16600581111561190457611904613c5a565b600581111561191557611915613c5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061437083398151915260205260409020815181545f805160206143308339815191529284929091829060ff191660018360058111156119c9576119c9613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ae757611aa781600161413c565b611ab2906008613fdc565b5081515f90839083908110611ac957611ac961414f565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6004811015611b4a57611afe81600361413c565b611b09906008613fdc565b6001901c60f81b82611b1c836002614163565b81518110611b2c57611b2c61414f565b60200101906001600160f81b03191690815f1a905350600101611aea565b505f5b6020811015611bac57611b6181601f61413c565b611b6c906008613fdc565b86901c60f81b82611b7e836006614163565b81518110611b8e57611b8e61414f565b60200101906001600160f81b03191690815f1a905350600101611b4d565b505f5b6008811015611c1757611bc381600761413c565b611bce906008613fdc565b6001600160401b038616901c60f81b82611be9836026614163565b81518110611bf957611bf961414f565b60200101906001600160f81b03191690815f1a905350600101611baf565b505f5b6008811015611c8257611c2e81600761413c565b611c39906008613fdc565b6001600160401b038516901c60f81b82611c5483602e614163565b81518110611c6457611c6461414f565b60200101906001600160f81b03191690815f1a905350600101611c1a565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206143308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d00573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d279190810190614045565b9150915080611d8e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105c0565b8254825114611df15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105c0565b60208201516001600160a01b031615611e645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105c0565b509392505050565b5f805f8351603614611e905760405162461bcd60e51b81526004016105c090614176565b5f805b6002811015611edf57611ea781600161413c565b611eb2906008613fdc565b61ffff16868281518110611ec857611ec861414f565b016020015160f81c901b9190911790600101611e93565b5061ffff811615611f025760405162461bcd60e51b81526004016105c0906141bf565b5f805b6004811015611f5d57611f1981600361413c565b611f24906008613fdc565b63ffffffff1687611f36836002614163565b81518110611f4657611f4661414f565b016020015160f81c901b9190911790600101611f05565b5063ffffffff8116600314611f845760405162461bcd60e51b81526004016105c090614202565b5f805b6020811015611fd957611f9b81601f61413c565b611fa6906008613fdc565b88611fb2836006614163565b81518110611fc257611fc261414f565b016020015160f81c901b9190911790600101611f87565b505f805b600881101561203857611ff181600761413c565b611ffc906008613fdc565b6001600160401b031689612011836026614163565b815181106120215761202161414f565b016020015160f81c901b9190911790600101611fdd565b505f805b60088110156120975761205081600761413c565b61205b906008613fdc565b6001600160401b03168a61207083602e614163565b815181106120805761208061414f565b016020015160f81c901b919091179060010161203c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061431083398151915292919061210390613ca9565b9050118015612149575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561214757612147613c5a565b145b6109ec5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105c0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061431083398151915292919061220c90613ca9565b9050118015612252575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561225057612250613c5a565b145b6109ec5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105c0565b5f8082516027146122e75760405162461bcd60e51b81526004016105c090614176565b5f805b6002811015612336576122fe81600161413c565b612309906008613fdc565b61ffff1685828151811061231f5761231f61414f565b016020015160f81c901b91909117906001016122ea565b5061ffff8116156123595760405162461bcd60e51b81526004016105c0906141bf565b5f805b60048110156123b45761237081600361413c565b61237b906008613fdc565b63ffffffff168661238d836002614163565b8151811061239d5761239d61414f565b016020015160f81c901b919091179060010161235c565b5063ffffffff81166002146123db5760405162461bcd60e51b81526004016105c090614202565b5f805b6020811015612430576123f281601f61413c565b6123fd906008613fdc565b87612409836006614163565b815181106124195761241961414f565b016020015160f81c901b91909117906001016123de565b505f866026815181106124455761244561414f565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206143708339815191526020526040808220815160e0810190925280545f8051602061433083398151915293929190829060ff1660058111156124b2576124b2613c5a565b60058111156124c3576124c3613c5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561253d5761253d613c5a565b146125995760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105c0565b60408101516001600160a01b0316336001600160a01b0316146126135760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105c0565b612620816080015161330c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561266457612664613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6127188461271281611809565b5f611a6e565b5f85815260068501602052604090209091506127348282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612761908590600401613e07565b6020604051808303815f875af115801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190613e39565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6127fe6134ad565b5f61280882610c79565b90505f805160206143108339815191525f61282286611884565b905060028151600581111561283957612839613c5a565b146128985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105c0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b0316156129315760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105c0565b61293a8361330c565b828160800181815161294c9190614249565b6001600160401b0316905250612962868261197f565b5f61296c87611809565b90505f61297e88838560800151611a6e565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506129ae8282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129db908590600401613e07565b6020604051808303815f875af11580156129f7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1b9190613e39565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612a9c57612a9c613c5a565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612ba4918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506109ec60015f8051602061435083398151915255565b5f5f805160206143108339815191528282612be282610c79565b83549091506001600160401b03821610801590612c0c57508260010154816001600160401b031611155b612c6a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105c0565b949350505050565b5f612c7b6134ad565b5f80516020614330833981519152426001600160401b038516118015612cb557506001600160401b038416612cb3426202a300614163565b115b612d175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105c0565b85612d6e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105c0565b5f86815260088201602052604090205415612ddc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105c0565b8251603014612e435760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105c0565b612e4c8561330c565b5f80612e936040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f7565b5f82815260058601602052604090209193509150612eb18282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ede908590600401613e07565b6020604051808303815f875af1158015612efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1e9190613e39565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f9757612f97613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561304083611809565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c6a60015f8051602061435083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130ef57604051631afcd79f60e31b815260040160405180910390fd5b565b6130f96130a6565b6131028161389c565b6113486060820135608083013561311f60c0850160a08601613b1d565b61312f60e0860160c08701614269565b6138bd565b5f808251602e146131575760405162461bcd60e51b81526004016105c090614176565b5f805b60028110156131a65761316e81600161413c565b613179906008613fdc565b61ffff1685828151811061318f5761318f61414f565b016020015160f81c901b919091179060010161315a565b5061ffff8116156131c95760405162461bcd60e51b81526004016105c0906141bf565b5f805b6004811015613224576131e081600361413c565b6131eb906008613fdc565b63ffffffff16866131fd836002614163565b8151811061320d5761320d61414f565b016020015160f81c901b91909117906001016131cc565b5063ffffffff811660041461324b5760405162461bcd60e51b81526004016105c090614202565b5f805b60208110156132a05761326281601f61413c565b61326d906008613fdc565b87613279836006614163565b815181106132895761328961414f565b016020015160f81c901b919091179060010161324e565b505f805b60088110156132ff576132b881600761413c565b6132c3906008613fdc565b6001600160401b0316886132d8836026614163565b815181106132e8576132e861414f565b016020015160f81c901b91909117906001016132a4565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143308339815191529060ff165f0361334a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613392908361413c565b106133ae576001600160401b03841660408301528082526133cd565b83826040018181516133c09190614249565b6001600160401b03169052505b5f8260200151836040015160646133e49190614284565b6133ee91906142af565b600285015490915060ff90811690821611156134695760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105c0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206143508339815191528054600119016134de57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061435083398151915255565b5f60608260800151516030146135615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d85761359881600161413c565b6135a3906008613fdc565b5081515f908390839081106135ba576135ba61414f565b60200101906001600160f81b03191690815f1a905350600101613584565b505f5b6004811015613636576135ef81600361413c565b6135fa906008613fdc565b505f82613608836002614163565b815181106136185761361861414f565b60200101906001600160f81b03191690815f1a9053506001016135db565b505f5b602081101561369357845181602081106136555761365561414f565b1a60f81b82613665836006614163565b815181106136755761367561414f565b60200101906001600160f81b03191690815f1a905350600101613639565b505f5b60208110156136f357846020015181602081106136b5576136b561414f565b1a60f81b826136c5836026614163565b815181106136d5576136d561414f565b60200101906001600160f81b03191690815f1a905350600101613696565b505f5b60088110156137675761370a81600761413c565b613715906008613fdc565b60ff1685604001516001600160401b0316901c60f81b828260466137399190614163565b815181106137495761374961414f565b60200101906001600160f81b03191690815f1a9053506001016136f6565b505f5b60308110156137d257846080015181815181106137895761378961414f565b01602001516001600160f81b031916826137a483604e614163565b815181106137b4576137b461414f565b60200101906001600160f81b03191690815f1a90535060010161376a565b505f5b6008811015613844576137e981600761413c565b6137f4906008613fdc565b60608601516001600160401b0390811691161c60f81b8261381683607e614163565b815181106138265761382661414f565b60200101906001600160f81b03191690815f1a9053506001016137d5565b5060028160405161385591906142d4565b602060405180830381855afa158015613870573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138939190613e39565b94909350915050565b6138a46130a6565b6138ac613918565b6138b4613928565b61134881613930565b6138c56130a6565b5f5f80516020614310833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139206130a6565b6130ef61399c565b6130ef6130a6565b6139386130a6565b80355f8051602061433083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561398260608301604084016142ef565b600291909101805460ff191660ff90921691909117905550565b6134e46130a6565b5080546139b090613ca9565b5f825580601f106139bf575050565b601f0160209004905f5260205f209081019061134891905b808211156139ea575f81556001016139d7565b5090565b5f60e082840312156139fe575f80fd5b50919050565b8015158114611348575f80fd5b803563ffffffff81168114613a24575f80fd5b919050565b5f805f60608486031215613a3b575f80fd5b833592506020840135613a4d81613a04565b9150613a5b60408501613a11565b90509250925092565b5f60208284031215613a74575f80fd5b5035919050565b6001600160a01b0381168114611348575f80fd5b5f8060408385031215613aa0575f80fd5b613aa983613a11565b91506020830135613ab981613a7b565b809150509250929050565b5f8060408385031215613ad5575f80fd5b823591506020830135613ab981613a7b565b5f60208284031215613af7575f80fd5b613b0082613a11565b9392505050565b80356001600160401b0381168114613a24575f80fd5b5f60208284031215613b2d575f80fd5b613b0082613b07565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b6c57613b6c613b36565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b9a57613b9a613b36565b604052919050565b5f6001600160401b03821115613bba57613bba613b36565b50601f01601f191660200190565b5f805f60608486031215613bda575f80fd5b83359250613bea60208501613b07565b915060408401356001600160401b03811115613c04575f80fd5b8401601f81018613613c14575f80fd5b8035613c27613c2282613ba2565b613b72565b818152876020838501011115613c3b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ca257613ca2613c6e565b5092915050565b600181811c90821680613cbd57607f821691505b6020821081036139fe57634e487b7160e01b5f52602260045260245ffd5b601f8211156109ec57805f5260205f20601f840160051c81016020851015613d005750805b601f840160051c820191505b81811015613d1f575f8155600101613d0c565b5050505050565b81516001600160401b03811115613d3f57613d3f613b36565b613d5381613d4d8454613ca9565b84613cdb565b602080601f831160018114613d86575f8415613d6f5750858301515b5f19600386901b1c1916600185901b178555613ddd565b5f85815260208120601f198616915b82811015613db457888601518255948401946001909101908401613d95565b5085821015613dd157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dff578181015183820152602001613de7565b50505f910152565b602081525f8251806020840152613e25816040850160208701613de5565b601f01601f19169190910160400192915050565b5f60208284031215613e49575f80fd5b5051919050565b5f60208083525f8454613e6281613ca9565b806020870152604060018084165f8114613e835760018114613e9f57613ecc565b60ff19851660408a0152604084151560051b8a01019550613ecc565b895f5260205f205f5b85811015613ec35781548b8201860152908301908801613ea8565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613fd757613fd7613fb5565b500490565b8082028115828204841417610c8957610c89613c6e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613a2481613a04565b5f8060408385031215614056575f80fd5b82516001600160401b038082111561406c575f80fd5b908401906060828703121561407f575f80fd5b614087613b4a565b8251815260208084015161409a81613a7b565b828201526040840151838111156140af575f80fd5b80850194505087601f8501126140c3575f80fd5b835192506140d3613c2284613ba2565b83815288828587010111156140e6575f80fd5b6140f584838301848801613de5565b8060408401525081955061410a81880161403a565b9450505050509250929050565b5f6001600160401b0380831681810361413257614132613c6e565b6001019392505050565b81810381811115610c8957610c89613c6e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610c8957610c89613c6e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ca257613ca2613c6e565b5f60208284031215614279575f80fd5b8135613b0081613a7b565b6001600160401b038181168382160280821691908281146142a7576142a7613c6e565b505092915050565b5f6001600160401b03808416806142c8576142c8613fb5565b92169190910492915050565b5f82516142e5818460208701613de5565b9190910192915050565b5f602082840312156142ff575f80fd5b813560ff81168114613b00575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161440938038061440983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142bc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613945565b610389565b005b348015610134575f80fd5b50610127610143366004613980565b61046b565b348015610153575f80fd5b506101276101623660046139bb565b6108b4565b348015610172575f80fd5b506101b16101813660046139bb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139bb565b610a10565b3480156101ee575f80fd5b506102026101fd3660046139bb565b610a7d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139d2565b610a93565b348015610244575f80fd5b506101276102533660046139eb565b610def565b348015610263575f80fd5b506101b1610272366004613a29565b610f94565b348015610282575f80fd5b506102026102913660046139bb565b610fad565b3480156102a1575f80fd5b506101276102b03660046139bb565b610fc1565b3480156102c0575f80fd5b506101276102cf366004613980565b61102e565b3480156102df575f80fd5b506101276102ee3660046139eb565b611049565b3480156102fe575f80fd5b5061012761030d3660046139d2565b6111b2565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139bb565b611366565b6101b16103713660046139bb565b611435565b6101b1610384366004613ad4565b611441565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611465565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142308339815191529184156104bd576104ba8285611479565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b66565b600481111561050057610500613b66565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b66565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611715565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613b66565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61071485611790565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b8260600151816080018181516107a19190613b8e565b6001600160401b03169052506107b7858261188b565b5f6107c78684846080015161197a565b5f8b815260058901602052604090209091506107e38282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610810908590600401613d13565b6020604051808303815f875af115801561082c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108509190613d45565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142508339815191529291906108fc90613bb5565b905011801561092e575060035f83815260078301602052604090205460ff16600581111561092c5761092c613b66565b145b6109925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613d45565b505050565b610a1981611b97565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b5f610a8d64e8d4a5100083613dfa565b92915050565b5f805160206142508339815191525f610aab83611c7c565b90505f80610abc8360400151611e5d565b915091508015610b215760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b5257610b52613b66565b6005811115610b6357610b63613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bdc57610bdc613b66565b1480610bfa5750600182516005811115610bf857610bf8613b66565b145b610c595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c6e57610c6e613b66565b03610c9557505f8381526006860160205260408120600491610c9091906138fb565b610c99565b5060055b6020808301515f90815260088801909152604081205581816005811115610cc257610cc2613b66565b90816005811115610cd557610cd5613b66565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d0957610d09613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610dbc57610dbc613b66565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142308339815191525f610e0784611c7c565b90505f80610e188360400151611ffe565b5091509150610e2685612239565b5f8581526004850160205260408120610e3e916138fb565b5f610e4883611790565b9050816001600160401b031681606001516001600160401b03161015610e805760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610ec55760405162461bcd60e51b81526004016105e290613e4f565b60015f87815260038701602052604090205460ff166004811115610eeb57610eeb613b66565b14610f085760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8d6001600160401b03831664e8d4a51000613ee8565b5f610fb782611790565b6080015192915050565b610fca81612239565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b81156110405761103e8382611479565b505b610a0b83612325565b5f805160206142308339815191525f61106184611c7c565b90505f806110728360400151611ffe565b509150915061108085611b97565b5f8581526005850160205260408120611098916138fb565b5f6110a283611790565b9050816001600160401b031681606001516001600160401b031610156110da5760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003808701602052604090912001546001600160401b03808416911611156111185760405162461bcd60e51b81526004016105e290613e4f565b60035f87815260038701602052604090205460ff16600481111561113e5761113e613b66565b1461115b5760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142508339815191525f6111ca83611c7c565b90505f806111db8360400151611e5d565b915091508061123d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461125790613bb5565b9050118015611289575060015f83815260078601602052604090205460ff16600581111561128757611287613b66565b145b6112a55760405162461bcd60e51b81526004016105e290613eff565b5f82815260058501602052604081206112bd916138fb565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142508339815191529291906113ae90613bb5565b90501180156113e0575060015f83815260078301602052604090205460ff1660058111156113de576113de613b66565b145b6113fc5760405162461bcd60e51b81526004016105e290613eff565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b5f610a8d8233346126b6565b5f8061144c34612b1f565b905061145a85828686612bc9565b9150505b9392505050565b61146d612ffd565b61147681613048565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114eb9190810190613f65565b915091508061154e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b59190613d45565b8251146116195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561168f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061169e846040015161308b565b9150915081871461170b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206142908339815191526020526040812060020180545f8051602061425083398151915291600160a01b9091046001600160401b0316908190601461176183614037565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061429083398151915290528390208351918201909352825491925f8051602061425083398151915292829060ff16600581111561181057611810613b66565b600581111561182157611821613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061429083398151915260205260409020815181545f805160206142508339815191529284929091829060ff191660018360058111156118d5576118d5613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f3576119b381600161405c565b6119be906008613ee8565b5081515f908390839081106119d5576119d561406f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6004811015611a5657611a0a81600361405c565b611a15906008613ee8565b6001901c60f81b82611a28836002614083565b81518110611a3857611a3861406f565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6020811015611ab857611a6d81601f61405c565b611a78906008613ee8565b86901c60f81b82611a8a836006614083565b81518110611a9a57611a9a61406f565b60200101906001600160f81b03191690815f1a905350600101611a59565b505f5b6008811015611b2357611acf81600761405c565b611ada906008613ee8565b6001600160401b038616901c60f81b82611af5836026614083565b81518110611b0557611b0561406f565b60200101906001600160f81b03191690815f1a905350600101611abb565b505f5b6008811015611b8e57611b3a81600761405c565b611b45906008613ee8565b6001600160401b038516901c60f81b82611b6083602e614083565b81518110611b7057611b7061406f565b60200101906001600160f81b03191690815f1a905350600101611b26565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614230833981519152929190611bdf90613bb5565b9050118015611c11575060035f83815260038301602052604090205460ff166004811115611c0f57611c0f613b66565b145b611c785760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d189190810190613f65565b9150915080611d7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611de25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611e555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611e805760405162461bcd60e51b81526004016105e290614096565b5f805b6002811015611ecf57611e9781600161405c565b611ea2906008613ee8565b61ffff16858281518110611eb857611eb861406f565b016020015160f81c901b9190911790600101611e83565b5061ffff811615611ef25760405162461bcd60e51b81526004016105e2906140df565b5f805b6004811015611f4d57611f0981600361405c565b611f14906008613ee8565b63ffffffff1686611f26836002614083565b81518110611f3657611f3661406f565b016020015160f81c901b9190911790600101611ef5565b5063ffffffff8116600214611f745760405162461bcd60e51b81526004016105e290614122565b5f805b6020811015611fc957611f8b81601f61405c565b611f96906008613ee8565b87611fa2836006614083565b81518110611fb257611fb261406f565b016020015160f81c901b9190911790600101611f77565b505f86602681518110611fde57611fde61406f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120225760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156120715761203981600161405c565b612044906008613ee8565b61ffff1686828151811061205a5761205a61406f565b016020015160f81c901b9190911790600101612025565b5061ffff8116156120945760405162461bcd60e51b81526004016105e2906140df565b5f805b60048110156120ef576120ab81600361405c565b6120b6906008613ee8565b63ffffffff16876120c8836002614083565b815181106120d8576120d861406f565b016020015160f81c901b9190911790600101612097565b5063ffffffff81166003146121165760405162461bcd60e51b81526004016105e290614122565b5f805b602081101561216b5761212d81601f61405c565b612138906008613ee8565b88612144836006614083565b815181106121545761215461406f565b016020015160f81c901b9190911790600101612119565b505f805b60088110156121ca5761218381600761405c565b61218e906008613ee8565b6001600160401b0316896121a3836026614083565b815181106121b3576121b361406f565b016020015160f81c901b919091179060010161216f565b505f805b6008811015612229576121e281600761405c565b6121ed906008613ee8565b6001600160401b03168a61220283602e614083565b815181106122125761221261406f565b016020015160f81c901b91909117906001016121ce565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061423083398151915292919061228190613bb5565b90501180156122b3575060015f83815260038301602052604090205460ff1660048111156122b1576122b1613b66565b145b611c785760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206142908339815191526020526040808220815160e0810190925280545f8051602061425083398151915293929190829060ff16600581111561237257612372613b66565b600581111561238357612383613b66565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123fd576123fd613b66565b146124595760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b0316146124d35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b6124e08160800151613263565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561252457612524613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125d8846125d281611715565b5f61197a565b5f85815260068501602052604090209091506125f48282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612621908590600401613d13565b6020604051808303815f875af115801561263d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126619190613d45565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126bf613404565b5f6126c983610a7d565b90505f805160206142308339815191525f6126e387611790565b90506002815160058111156126fa576126fa613b66565b146127595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b828160800181815161276b9190614169565b6001600160401b0316905250612781878261188b565b5f61278b88611715565b90505f60028989846040516020016127d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127ef91614189565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190613d45565b5f8181526003860160205260409020600201549091506001600160401b0316156128b35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6128bc85613263565b5f6128cc8a84866080015161197a565b5f83815260048701602052604090209091506128e88282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612915908590600401613d13565b6020604051808303815f875af1158015612931573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129559190613d45565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff191660018360048111156129dd576129dd613b66565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061145e60015f8051602061427083398151915255565b5f5f805160206142308339815191528282612b3982610a7d565b83549091506001600160401b03821610801590612b6357508260010154816001600160401b031611155b612bc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612bd2613404565b5f80516020614250833981519152426001600160401b038516118015612c0c57506001600160401b038416612c0a426202a300614083565b115b612c6e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612cc55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612d335760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612d9a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612da385613263565b5f80612dea6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344e565b5f82815260058601602052604090209193509150612e088282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e35908590600401613d13565b6020604051808303815f875af1158015612e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e759190613d45565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eee57612eee613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612f9783611715565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bc160015f8051602061427083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661304657604051631afcd79f60e31b815260040160405180910390fd5b565b613050612ffd565b613059816137f3565b6114766060820135608083013561307660c0850160a08601613a29565b61308660e0860160c087016141a4565b613814565b5f808251602e146130ae5760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156130fd576130c581600161405c565b6130d0906008613ee8565b61ffff168582815181106130e6576130e661406f565b016020015160f81c901b91909117906001016130b1565b5061ffff8116156131205760405162461bcd60e51b81526004016105e2906140df565b5f805b600481101561317b5761313781600361405c565b613142906008613ee8565b63ffffffff1686613154836002614083565b815181106131645761316461406f565b016020015160f81c901b9190911790600101613123565b5063ffffffff81166004146131a25760405162461bcd60e51b81526004016105e290614122565b5f805b60208110156131f7576131b981601f61405c565b6131c4906008613ee8565b876131d0836006614083565b815181106131e0576131e061406f565b016020015160f81c901b91909117906001016131a5565b505f805b60088110156132565761320f81600761405c565b61321a906008613ee8565b6001600160401b03168861322f836026614083565b8151811061323f5761323f61406f565b016020015160f81c901b91909117906001016131fb565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142508339815191529060ff165f036132a1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132e9908361405c565b10613305576001600160401b0384166040830152808252613324565b83826040018181516133179190614169565b6001600160401b03169052505b5f82602001518360400151606461333b91906141bf565b61334591906141ea565b600285015490915060ff90811690821611156133c05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061427083398151915280546001190161343557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061427083398151915255565b5f60608260800151516030146134b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561352f576134ef81600161405c565b6134fa906008613ee8565b5081515f908390839081106135115761351161406f565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b600481101561358d5761354681600361405c565b613551906008613ee8565b505f8261355f836002614083565b8151811061356f5761356f61406f565b60200101906001600160f81b03191690815f1a905350600101613532565b505f5b60208110156135ea57845181602081106135ac576135ac61406f565b1a60f81b826135bc836006614083565b815181106135cc576135cc61406f565b60200101906001600160f81b03191690815f1a905350600101613590565b505f5b602081101561364a578460200151816020811061360c5761360c61406f565b1a60f81b8261361c836026614083565b8151811061362c5761362c61406f565b60200101906001600160f81b03191690815f1a9053506001016135ed565b505f5b60088110156136be5761366181600761405c565b61366c906008613ee8565b60ff1685604001516001600160401b0316901c60f81b828260466136909190614083565b815181106136a0576136a061406f565b60200101906001600160f81b03191690815f1a90535060010161364d565b505f5b603081101561372957846080015181815181106136e0576136e061406f565b01602001516001600160f81b031916826136fb83604e614083565b8151811061370b5761370b61406f565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b600881101561379b5761374081600761405c565b61374b906008613ee8565b60608601516001600160401b0390811691161c60f81b8261376d83607e614083565b8151811061377d5761377d61406f565b60200101906001600160f81b03191690815f1a90535060010161372c565b506002816040516137ac9190614189565b602060405180830381855afa1580156137c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ea9190613d45565b94909350915050565b6137fb612ffd565b61380361386f565b61380b61387f565b61147681613887565b61381c612ffd565b5f5f80516020614230833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613877612ffd565b6130466138f3565b613046612ffd565b61388f612ffd565b80355f8051602061425083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138d9606083016040840161420f565b600291909101805460ff191660ff90921691909117905550565b61343b612ffd565b50805461390790613bb5565b5f825580601f10613916575050565b601f0160209004905f5260205f209081019061147691905b80821115613941575f815560010161392e565b5090565b5f60e08284031215613955575f80fd5b50919050565b8015158114611476575f80fd5b803563ffffffff8116811461397b575f80fd5b919050565b5f805f60608486031215613992575f80fd5b8335925060208401356139a48161395b565b91506139b260408501613968565b90509250925092565b5f602082840312156139cb575f80fd5b5035919050565b5f602082840312156139e2575f80fd5b61145e82613968565b5f80604083850312156139fc575f80fd5b613a0583613968565b946020939093013593505050565b80356001600160401b038116811461397b575f80fd5b5f60208284031215613a39575f80fd5b61145e82613a13565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a7857613a78613a42565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613aa657613aa6613a42565b604052919050565b5f6001600160401b03821115613ac657613ac6613a42565b50601f01601f191660200190565b5f805f60608486031215613ae6575f80fd5b83359250613af660208501613a13565b915060408401356001600160401b03811115613b10575f80fd5b8401601f81018613613b20575f80fd5b8035613b33613b2e82613aae565b613a7e565b818152876020838501011115613b47575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bae57613bae613b7a565b5092915050565b600181811c90821680613bc957607f821691505b60208210810361395557634e487b7160e01b5f52602260045260245ffd5b601f821115610a0b57805f5260205f20601f840160051c81016020851015613c0c5750805b601f840160051c820191505b81811015613c2b575f8155600101613c18565b5050505050565b81516001600160401b03811115613c4b57613c4b613a42565b613c5f81613c598454613bb5565b84613be7565b602080601f831160018114613c92575f8415613c7b5750858301515b5f19600386901b1c1916600185901b178555613ce9565b5f85815260208120601f198616915b82811015613cc057888601518255948401946001909101908401613ca1565b5085821015613cdd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d0b578181015183820152602001613cf3565b50505f910152565b602081525f8251806020840152613d31816040850160208701613cf1565b601f01601f19169190910160400192915050565b5f60208284031215613d55575f80fd5b5051919050565b5f60208083525f8454613d6e81613bb5565b806020870152604060018084165f8114613d8f5760018114613dab57613dd8565b60ff19851660408a0152604084151560051b8a01019550613dd8565b895f5260205f205f5b85811015613dcf5781548b8201860152908301908801613db4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e0857613e08613de6565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a8d57610a8d613b7a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611476575f80fd5b805161397b8161395b565b5f8060408385031215613f76575f80fd5b82516001600160401b0380821115613f8c575f80fd5b9084019060608287031215613f9f575f80fd5b613fa7613a56565b82518152602080840151613fba81613f46565b82820152604084015183811115613fcf575f80fd5b80850194505087601f850112613fe3575f80fd5b83519250613ff3613b2e84613aae565b8381528882858701011115614006575f80fd5b61401584838301848801613cf1565b8060408401525081955061402a818801613f5a565b9450505050509250929050565b5f6001600160401b0380831681810361405257614052613b7a565b6001019392505050565b81810381811115610a8d57610a8d613b7a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8d57610a8d613b7a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bae57613bae613b7a565b5f825161419a818460208701613cf1565b9190910192915050565b5f602082840312156141b4575f80fd5b813561145e81613f46565b6001600160401b038181168382160280821691908281146141e2576141e2613b7a565b505092915050565b5f6001600160401b038084168061420357614203613de6565b92169190910492915050565b5f6020828403121561421f575f80fd5b813560ff8116811461145e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -373,46 +373,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -480,44 +480,44 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. @@ -562,46 +562,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -716,55 +716,55 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -796,9 +796,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -879,17 +879,17 @@ func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { type NativeTokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte DelegatorWeight uint64 ValidatorWeight uint64 Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -899,22 +899,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -924,12 +924,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -961,9 +961,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { event := new(NativeTokenStakingManagerDelegatorAdded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1043,56 +1043,56 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -1124,9 +1124,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1207,17 +1207,17 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() type NativeTokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte ValidatorWeight uint64 Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1227,22 +1227,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1252,12 +1252,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -1289,9 +1289,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index e93333437..c0c1f2e59 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -66,7 +66,11 @@ contract NativeTokenStakingManager is * @notice Begins the delegator registration process. Locks the provided native asset in the contract as the delegated stake. * @param validationID The ID of the validation period being delegated to. */ - function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32) { + function initializeDelegatorRegistration(bytes32 validationID) + external + payable + returns (bytes32) + { return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index aa3d6d85d..1e19b1611 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -31,11 +31,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the validationID to a mapping of delegator address to delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. - mapping(bytes32 delegationID => bytes) - _pendingRegisterDelegatorMessages; + mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. - mapping(bytes32 delegationID => bytes) - _pendingEndDelegatorMessages; + mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -330,9 +328,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegationEnded(validationID, delegationID, nonce); } - function _checkPendingEndDelegatorMessage( - bytes32 delegationID - ) private view { + function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( $._pendingEndDelegatorMessages[delegationID].length > 0 @@ -341,9 +337,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); } - function _checkPendingRegisterDelegatorMessages( - bytes32 delegationID - ) private view { + function _checkPendingRegisterDelegatorMessages(bytes32 delegationID) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( $._pendingRegisterDelegatorMessages[delegationID].length > 0 diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 432f2ae01..2d59cfb83 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -21,5 +21,8 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external returns (bytes32); + function initializeDelegatorRegistration( + bytes32 validationID, + uint256 stakeAmount + ) external returns (bytes32); } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index de26398f1..947d146bc 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -20,5 +20,8 @@ interface INativeTokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external payable returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32); + function initializeDelegatorRegistration(bytes32 validationID) + external + payable + returns (bytes32); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 3d549da29..fcb2292d7 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -53,7 +53,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override returns (bytes32){ + ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); vm.prank(delegator); vm.deal(delegator, value); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index be1d98c02..1607c81b3 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -236,7 +236,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -256,7 +256,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeDelegatorRegistration(0, delegationID_2); + posValidatorManager.completeDelegatorRegistration(0, delegationID2); } function testCompleteDelegatorRegistrationImplicitNonce() public { @@ -270,7 +270,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -291,7 +291,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -322,14 +322,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - delegationID, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); } function testResendEndDelegation() public { @@ -356,14 +356,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - delegationID, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -402,10 +402,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - _setUpCompleteEndDelegation( - validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 - ); + _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); } + function testCompleteEndDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -417,7 +416,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -427,13 +426,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -444,29 +443,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_2, + delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation( - validationID, - delegator1, - delegationID_1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 3 - ); - _setUpInitializeEndDelegation( - validationID, - delegator2, - delegationID_2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, - DEFAULT_WEIGHT, - 4 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator1, + delegationID: delegationID1, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 3 + }); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator2, + delegationID: delegationID2, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); // Complete ending delegator2 with delegator1's nonce // Note that ending delegator1 with delegator2's nonce is valid @@ -477,7 +476,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeEndDelegation(0, delegationID_2); + posValidatorManager.completeEndDelegation(0, delegationID2); } function testCompleteEndDelegationImplicitNonce() public { @@ -491,7 +490,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -501,13 +500,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 =_setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -518,32 +517,32 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_2, + delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation( - validationID, - delegator1, - delegationID_1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 3 - ); - _setUpInitializeEndDelegation( - validationID, - delegator2, - delegationID_2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, - DEFAULT_WEIGHT, - 4 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator1, + delegationID: delegationID1, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 3 + }); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator2, + delegationID: delegationID2, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID_1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } function testValueToWeight() public view { From 2eb14fb41c62176f2fa1a6dd309b8acaa7eeb961 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 09:52:47 -0500 Subject: [PATCH 4/9] remove validator setter --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 16 ++++++++-------- contracts/staking/ValidatorManager.sol | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 27017da0f..8af3e812e 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147e13803806147e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613cd0565b6102d6565b005b610128610138366004613d0b565b61071f565b61017b61014b366004613d0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d0b565b61087b565b6101286101af366004613d36565b6108e8565b6101c76101c2366004613d0b565b6109cc565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d73565b6109e2565b610128610200366004613d8c565b610d3e565b61017b610213366004613dca565b610ee3565b6101c7610226366004613d0b565b610efc565b610128610239366004613d0b565b610f10565b61012861024c366004613cd0565b610f7d565b61017b61025f366004613e75565b610f98565b610128610272366004613d8c565b610fbd565b61017b610285366004613f11565b611126565b610128610298366004613d73565b611139565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d0b565b6112ed565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146088339815191529184156103285761032582856113bc565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f31565b600481111561036b5761036b613f31565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f31565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611658565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613f31565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116d3565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b82606001518160800181815161060c9190613f59565b6001600160401b031690525061062285826117ce565b5f610632868484608001516118bd565b5f8b8152600589016020526040902090915061064e8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061067b9085906004016140e4565b6020604051808303815f875af1158015610697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bb9190614116565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462883398151915292919061076790613f80565b9050118015610799575060035f83815260078301602052604090205460ff16600581111561079757610797613f31565b145b6107fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6020604051808303815f875af1158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190614116565b505050565b61088481611ada565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610931575080546001600160401b03808416911610155b1561094f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561097a8484611bbf565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dc64e8d4a51000836141cb565b92915050565b5f805160206146288339815191525f6109fa83611bd9565b90505f80610a0b8360400151611dba565b915091508015610a705760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aa157610aa1613f31565b6005811115610ab257610ab2613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b2b57610b2b613f31565b1480610b495750600182516005811115610b4757610b47613f31565b145b610ba85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610bbd57610bbd613f31565b03610be457505f8381526006860160205260408120600491610bdf9190613c61565b610be8565b5060055b6020808301515f90815260088801909152604081205581816005811115610c1157610c11613f31565b90816005811115610c2457610c24613f31565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c5857610c58613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d0b57610d0b613f31565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146088339815191525f610d5684611bd9565b90505f80610d678360400151611f5b565b5091509150610d7585612196565b5f8581526004850160205260408120610d8d91613c61565b5f610d97836116d3565b9050816001600160401b031681606001516001600160401b03161015610dcf5760405162461bcd60e51b815260040161044d906141de565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e145760405162461bcd60e51b815260040161044d90614220565b60015f87815260038701602052604090205460ff166004811115610e3a57610e3a613f31565b14610e575760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109dc6001600160401b03831664e8d4a510006142b9565b5f610f06826116d3565b6080015192915050565b610f1981612196565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b8115610f8f57610f8d83826113bc565b505b61087683612282565b5f80610fa386612613565b9050610fb1858286866126c0565b9150505b949350505050565b5f805160206146088339815191525f610fd584611bd9565b90505f80610fe68360400151611f5b565b5091509150610ff485611ada565b5f858152600585016020526040812061100c91613c61565b5f611016836116d3565b9050816001600160401b031681606001516001600160401b0316101561104e5760405162461bcd60e51b815260040161044d906141de565b5f8681526003808701602052604090912001546001600160401b038084169116111561108c5760405162461bcd60e51b815260040161044d90614220565b60035f87815260038701602052604090205460ff1660048111156110b2576110b2613f31565b146110cf5760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611132833384612af4565b9392505050565b5f805160206146288339815191525f61115183611bd9565b90505f806111628360400151611dba565b91509150806111c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111de90613f80565b9050118015611210575060015f83815260078601602052604090205460ff16600581111561120e5761120e613f31565b145b61122c5760405162461bcd60e51b815260040161044d906142d0565b5f828152600585016020526040812061124491613c61565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462883398151915292919061133590613f80565b9050118015611367575060015f83815260078301602052604090205460ff16600581111561136557611365613f31565b145b6113835760405162461bcd60e51b815260040161044d906142d0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611407573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261142e9190810190614322565b91509150806114915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f89190614116565b82511461155c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115d25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115e18460400151612f60565b9150915081871461164e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206146688339815191526020526040812060020180545f8051602061462883398151915291600160a01b9091046001600160401b031690819060146116a4836143f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466883398151915290528390208351918201909352825491925f8051602061462883398151915292829060ff16600581111561175357611753613f31565b600581111561176457611764613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466883398151915260205260409020815181545f805160206146288339815191529284929091829060ff1916600183600581111561181857611818613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611936576118f6816001614419565b6119019060086142b9565b5081515f908390839081106119185761191861442c565b60200101906001600160f81b03191690815f1a9053506001016118e2565b505f5b60048110156119995761194d816003614419565b6119589060086142b9565b6001901c60f81b8261196b836002614440565b8151811061197b5761197b61442c565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b60208110156119fb576119b081601f614419565b6119bb9060086142b9565b86901c60f81b826119cd836006614440565b815181106119dd576119dd61442c565b60200101906001600160f81b03191690815f1a90535060010161199c565b505f5b6008811015611a6657611a12816007614419565b611a1d9060086142b9565b6001600160401b038616901c60f81b82611a38836026614440565b81518110611a4857611a4861442c565b60200101906001600160f81b03191690815f1a9053506001016119fe565b505f5b6008811015611ad157611a7d816007614419565b611a889060086142b9565b6001600160401b038516901c60f81b82611aa383602e614440565b81518110611ab357611ab361442c565b60200101906001600160f81b03191690815f1a905350600101611a69565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614608833981519152929190611b2290613f80565b9050118015611b54575060035f83815260038301602052604090205460ff166004811115611b5257611b52613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611bc7613138565b611bd082613183565b611bbb816131c9565b60408051606080820183525f8083526020830181905292820152905f805160206146288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c759190810190614322565b9150915080611cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611d3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611db25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611ddd5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611e2c57611df4816001614419565b611dff9060086142b9565b61ffff16858281518110611e1557611e1561442c565b016020015160f81c901b9190911790600101611de0565b5061ffff811615611e4f5760405162461bcd60e51b815260040161044d9061449c565b5f805b6004811015611eaa57611e66816003614419565b611e719060086142b9565b63ffffffff1686611e83836002614440565b81518110611e9357611e9361442c565b016020015160f81c901b9190911790600101611e52565b5063ffffffff8116600214611ed15760405162461bcd60e51b815260040161044d906144df565b5f805b6020811015611f2657611ee881601f614419565b611ef39060086142b9565b87611eff836006614440565b81518110611f0f57611f0f61442c565b016020015160f81c901b9190911790600101611ed4565b505f86602681518110611f3b57611f3b61442c565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f7f5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611fce57611f96816001614419565b611fa19060086142b9565b61ffff16868281518110611fb757611fb761442c565b016020015160f81c901b9190911790600101611f82565b5061ffff811615611ff15760405162461bcd60e51b815260040161044d9061449c565b5f805b600481101561204c57612008816003614419565b6120139060086142b9565b63ffffffff1687612025836002614440565b815181106120355761203561442c565b016020015160f81c901b9190911790600101611ff4565b5063ffffffff81166003146120735760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156120c85761208a81601f614419565b6120959060086142b9565b886120a1836006614440565b815181106120b1576120b161442c565b016020015160f81c901b9190911790600101612076565b505f805b6008811015612127576120e0816007614419565b6120eb9060086142b9565b6001600160401b031689612100836026614440565b815181106121105761211061442c565b016020015160f81c901b91909117906001016120cc565b505f805b60088110156121865761213f816007614419565b61214a9060086142b9565b6001600160401b03168a61215f83602e614440565b8151811061216f5761216f61442c565b016020015160f81c901b919091179060010161212b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146088339815191529291906121de90613f80565b9050118015612210575060015f83815260038301602052604090205460ff16600481111561220e5761220e613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206146688339815191526020526040808220815160e0810190925280545f8051602061462883398151915293929190829060ff1660058111156122cf576122cf613f31565b60058111156122e0576122e0613f31565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235a5761235a613f31565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61243d816080015161327d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248157612481613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125358461252f81611658565b5f6118bd565b5f85815260068501602052604090209091506125518282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061257e9085906004016140e4565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190614116565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146088339815191528161262c8461341e565b90505f612638826109cc565b83549091506001600160401b0382161080159061266257508260010154816001600160401b031611155b610fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f6126c9613454565b5f80516020614628833981519152426001600160401b03851611801561270357506001600160401b038416612701426202a300614440565b115b6127655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856127bc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f8681526008820160205260409020541561282a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146128915760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b61289a8561327d565b5f806128e16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061348b565b5f828152600586016020526040902091935091506128ff8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061292c9085906004016140e4565b6020604051808303815f875af1158015612948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296c9190614116565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129e5576129e5613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8e83611658565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fb560015f8051602061464883398151915255565b5f612afd613454565b5f612b0a6101c28461341e565b90505f805160206146088339815191525f612b24876116d3565b9050600281516005811115612b3b57612b3b613f31565b14612b9a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b8281608001818151612bac9190614526565b6001600160401b0316905250612bc287826117ce565b5f612bcc88611658565b90505f6002898984604051602001612c169392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c3091614546565b602060405180830381855afa158015612c4b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c6e9190614116565b5f8181526003860160205260409020600201549091506001600160401b031615612cf45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612cfd8561327d565b5f612d0d8a8486608001516118bd565b5f8381526004870160205260409020909150612d298282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d569085906004016140e4565b6020604051808303815f875af1158015612d72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d969190614116565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff19166001836004811115612e1e57612e1e613f31565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061113260015f8051602061464883398151915255565b5f808251602e14612f835760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015612fd257612f9a816001614419565b612fa59060086142b9565b61ffff16858281518110612fbb57612fbb61442c565b016020015160f81c901b9190911790600101612f86565b5061ffff811615612ff55760405162461bcd60e51b815260040161044d9061449c565b5f805b60048110156130505761300c816003614419565b6130179060086142b9565b63ffffffff1686613029836002614440565b815181106130395761303961442c565b016020015160f81c901b9190911790600101612ff8565b5063ffffffff81166004146130775760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156130cc5761308e81601f614419565b6130999060086142b9565b876130a5836006614440565b815181106130b5576130b561442c565b016020015160f81c901b919091179060010161307a565b505f805b600881101561312b576130e4816007614419565b6130ef9060086142b9565b6001600160401b031688613104836026614440565b815181106131145761311461442c565b016020015160f81c901b91909117906001016130d0565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318157604051631afcd79f60e31b815260040160405180910390fd5b565b61318b613138565b61319481613843565b6131c6606082013560808301356131b160c0850160a08601613dca565b6131c160e0860160c08701614561565b613864565b50565b6131d1613138565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661325d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146288339815191529060ff165f036132bb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133039083614419565b1061331f576001600160401b038416604083015280825261333e565b83826040018181516133319190614526565b6001600160401b03169052505b5f826020015183604001516064613355919061457c565b61335f91906145a7565b600285015490915060ff90811690821611156133da5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109dc827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138bf565b5f8051602061464883398151915280546001190161348557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134f55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561356c5761352c816001614419565b6135379060086142b9565b5081515f9083908390811061354e5761354e61442c565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60048110156135ca57613583816003614419565b61358e9060086142b9565b505f8261359c836002614440565b815181106135ac576135ac61442c565b60200101906001600160f81b03191690815f1a90535060010161356f565b505f5b602081101561362757845181602081106135e9576135e961442c565b1a60f81b826135f9836006614440565b815181106136095761360961442c565b60200101906001600160f81b03191690815f1a9053506001016135cd565b505f5b602081101561368757846020015181602081106136495761364961442c565b1a60f81b82613659836026614440565b815181106136695761366961442c565b60200101906001600160f81b03191690815f1a90535060010161362a565b505f5b60088110156136fb5761369e816007614419565b6136a99060086142b9565b60ff1685604001516001600160401b0316901c60f81b828260466136cd9190614440565b815181106136dd576136dd61442c565b60200101906001600160f81b03191690815f1a90535060010161368a565b505f5b6030811015613766578460800151818151811061371d5761371d61442c565b01602001516001600160f81b0319168261373883604e614440565b815181106137485761374861442c565b60200101906001600160f81b03191690815f1a9053506001016136fe565b505f5b60088110156137d85761377d816007614419565b6137889060086142b9565b60608601516001600160401b0390811691161c60f81b826137aa83607e614440565b815181106137ba576137ba61442c565b60200101906001600160f81b03191690815f1a905350600101613769565b506002816040516137e99190614546565b602060405180830381855afa158015613804573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138279190614116565b94909350915050565b60015f8051602061464883398151915255565b61384b613138565b613853613a21565b61385b613a31565b6131c681613a39565b61386c613138565b5f5f80516020614608833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139299190614116565b90506139406001600160a01b038516333086613aa5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a89190614116565b9050818111613a0e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b613a188282614419565b95945050505050565b613a29613138565b613181613b05565b613181613138565b613a41613138565b80355f8051602061462883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a8b60608301604084016145cc565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613aff908590613b0d565b50505050565b613830613138565b5f613b216001600160a01b03841683613b6e565b905080515f14158015613b45575080806020019051810190613b4391906145ec565b155b1561087657604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061113283835f845f80856001600160a01b03168486604051613b929190614546565b5f6040518083038185875af1925050503d805f8114613bcc576040519150601f19603f3d011682016040523d82523d5f602084013e613bd1565b606091505b509150915061164e868383606082613bf157613bec82613c38565b611132565b8151158015613c0857506001600160a01b0384163b155b15613c3157604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b5080611132565b805115613c485780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c6d90613f80565b5f825580601f10613c7c575050565b601f0160209004905f5260205f20908101906131c691905b80821115613ca7575f8155600101613c94565b5090565b80151581146131c6575f80fd5b803563ffffffff81168114613ccb575f80fd5b919050565b5f805f60608486031215613ce2575f80fd5b833592506020840135613cf481613cab565b9150613d0260408501613cb8565b90509250925092565b5f60208284031215613d1b575f80fd5b5035919050565b6001600160a01b03811681146131c6575f80fd5b5f80828403610100811215613d49575f80fd5b60e0811215613d56575f80fd5b5082915060e0830135613d6881613d22565b809150509250929050565b5f60208284031215613d83575f80fd5b61113282613cb8565b5f8060408385031215613d9d575f80fd5b613da683613cb8565b946020939093013593505050565b80356001600160401b0381168114613ccb575f80fd5b5f60208284031215613dda575f80fd5b61113282613db4565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e1957613e19613de3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e4757613e47613de3565b604052919050565b5f6001600160401b03821115613e6757613e67613de3565b50601f01601f191660200190565b5f805f8060808587031215613e88575f80fd5b8435935060208501359250613e9f60408601613db4565b915060608501356001600160401b03811115613eb9575f80fd5b8501601f81018713613ec9575f80fd5b8035613edc613ed782613e4f565b613e1f565b818152886020838501011115613ef0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f22575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f7957613f79613f45565b5092915050565b600181811c90821680613f9457607f821691505b602082108103613fb257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561087657805f5260205f20601f840160051c81016020851015613fdd5750805b601f840160051c820191505b81811015613ffc575f8155600101613fe9565b5050505050565b81516001600160401b0381111561401c5761401c613de3565b6140308161402a8454613f80565b84613fb8565b602080601f831160018114614063575f841561404c5750858301515b5f19600386901b1c1916600185901b1785556140ba565b5f85815260208120601f198616915b8281101561409157888601518255948401946001909101908401614072565b50858210156140ae57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140dc5781810151838201526020016140c4565b50505f910152565b602081525f82518060208401526141028160408501602087016140c2565b601f01601f19169190910160400192915050565b5f60208284031215614126575f80fd5b5051919050565b5f60208083525f845461413f81613f80565b806020870152604060018084165f8114614160576001811461417c576141a9565b60ff19851660408a0152604084151560051b8a010195506141a9565b895f5260205f205f5b858110156141a05781548b8201860152908301908801614185565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141d9576141d96141b7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109dc576109dc613f45565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ccb81613cab565b5f8060408385031215614333575f80fd5b82516001600160401b0380821115614349575f80fd5b908401906060828703121561435c575f80fd5b614364613df7565b8251815260208084015161437781613d22565b8282015260408401518381111561438c575f80fd5b80850194505087601f8501126143a0575f80fd5b835192506143b0613ed784613e4f565b83815288828587010111156143c3575f80fd5b6143d2848383018488016140c2565b806040840152508195506143e7818801614317565b9450505050509250929050565b5f6001600160401b0380831681810361440f5761440f613f45565b6001019392505050565b818103818111156109dc576109dc613f45565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109dc576109dc613f45565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f7957613f79613f45565b5f82516145578184602087016140c2565b9190910192915050565b5f60208284031215614571575f80fd5b813561113281613d22565b6001600160401b0381811683821602808216919082811461459f5761459f613f45565b505092915050565b5f6001600160401b03808416806145c0576145c06141b7565b92169190910492915050565b5f602082840312156145dc575f80fd5b813560ff81168114611132575f80fd5b5f602082840312156145fc575f80fd5b815161113281613cab56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161472c38038061472c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145df8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c1b565b6102d6565b005b610128610138366004613c56565b61070c565b61017b61014b366004613c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613c56565b610868565b6101286101af366004613c81565b6108d5565b6101c76101c2366004613c56565b6109b9565b6040516001600160401b039091168152602001610185565b6101286101ed366004613cbe565b6109cf565b610128610200366004613cd7565b610d2b565b61017b610213366004613d15565b610ed0565b6101c7610226366004613c56565b610ee9565b610128610239366004613c56565b610efd565b61012861024c366004613c1b565b610f6a565b61017b61025f366004613dc0565b610f85565b610128610272366004613cd7565b610faa565b61017b610285366004613e5c565b611113565b610128610298366004613cbe565b611126565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613c56565b6112da565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145538339815191529184156103285761032582856113a9565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613e7c565b600481111561036b5761036b613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613e7c565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611645565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116c0565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b5f8360600151826080015161060b9190613ea4565b905061061786826117bb565b5f6106238785846117f8565b5f8c815260058a016020526040902090915061063f8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061066c90859060040161402f565b6020604051808303815f875af1158015610688573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ac9190614061565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061457383398151915292919061075490613ecb565b9050118015610786575060035f83815260078301602052604090205460ff16600581111561078457610784613e7c565b145b6107ea5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6020604051808303815f875af115801561083f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108639190614061565b505050565b61087181611a15565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061091e575080546001600160401b03808416911610155b1561093c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109678484611afa565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109c964e8d4a5100083614116565b92915050565b5f805160206145738339815191525f6109e783611b14565b90505f806109f88360400151611cf5565b915091508015610a5d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610a8e57610a8e613e7c565b6005811115610a9f57610a9f613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b1857610b18613e7c565b1480610b365750600182516005811115610b3457610b34613e7c565b145b610b955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610baa57610baa613e7c565b03610bd157505f8381526006860160205260408120600491610bcc9190613bac565b610bd5565b5060055b6020808301515f90815260088801909152604081205581816005811115610bfe57610bfe613e7c565b90816005811115610c1157610c11613e7c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c4557610c45613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610cf857610cf8613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145538339815191525f610d4384611b14565b90505f80610d548360400151611e96565b5091509150610d62856120d1565b5f8581526004850160205260408120610d7a91613bac565b5f610d84836116c0565b9050816001600160401b031681606001516001600160401b03161015610dbc5760405162461bcd60e51b815260040161044d90614129565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e015760405162461bcd60e51b815260040161044d9061416b565b60015f87815260038701602052604090205460ff166004811115610e2757610e27613e7c565b14610e445760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c96001600160401b03831664e8d4a51000614204565b5f610ef3826116c0565b6080015192915050565b610f06816120d1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b8115610f7c57610f7a83826113a9565b505b610863836121bd565b5f80610f908661254e565b9050610f9e858286866125fb565b9150505b949350505050565b5f805160206145538339815191525f610fc284611b14565b90505f80610fd38360400151611e96565b5091509150610fe185611a15565b5f8581526005850160205260408120610ff991613bac565b5f611003836116c0565b9050816001600160401b031681606001516001600160401b0316101561103b5760405162461bcd60e51b815260040161044d90614129565b5f8681526003808701602052604090912001546001600160401b03808416911611156110795760405162461bcd60e51b815260040161044d9061416b565b60035f87815260038701602052604090205460ff16600481111561109f5761109f613e7c565b146110bc5760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61111f833384612a2f565b9392505050565b5f805160206145738339815191525f61113e83611b14565b90505f8061114f8360400151611cf5565b91509150806111b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111cb90613ecb565b90501180156111fd575060015f83815260078601602052604090205460ff1660058111156111fb576111fb613e7c565b145b6112195760405162461bcd60e51b815260040161044d9061421b565b5f828152600585016020526040812061123191613bac565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061457383398151915292919061132290613ecb565b9050118015611354575060015f83815260078301602052604090205460ff16600581111561135257611352613e7c565b145b6113705760405162461bcd60e51b815260040161044d9061421b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261141b919081019061426d565b915091508061147e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e59190614061565b8251146115495760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115ce8460400151612eab565b9150915081871461163b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206145b38339815191526020526040812060020180545f8051602061457383398151915291600160a01b9091046001600160401b031690819060146116918361433f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206145b383398151915290528390208351918201909352825491925f8051602061457383398151915292829060ff16600581111561174057611740613e7c565b600581111561175157611751613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206145b38339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561187157611831816001614364565b61183c906008614204565b5081515f9083908390811061185357611853614377565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60048110156118d457611888816003614364565b611893906008614204565b6001901c60f81b826118a683600261438b565b815181106118b6576118b6614377565b60200101906001600160f81b03191690815f1a905350600101611874565b505f5b6020811015611936576118eb81601f614364565b6118f6906008614204565b86901c60f81b8261190883600661438b565b8151811061191857611918614377565b60200101906001600160f81b03191690815f1a9053506001016118d7565b505f5b60088110156119a15761194d816007614364565b611958906008614204565b6001600160401b038616901c60f81b8261197383602661438b565b8151811061198357611983614377565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b6008811015611a0c576119b8816007614364565b6119c3906008614204565b6001600160401b038516901c60f81b826119de83602e61438b565b815181106119ee576119ee614377565b60200101906001600160f81b03191690815f1a9053506001016119a4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614553833981519152929190611a5d90613ecb565b9050118015611a8f575060035f83815260038301602052604090205460ff166004811115611a8d57611a8d613e7c565b145b611af65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611b02613083565b611b0b826130ce565b611af681613114565b60408051606080820183525f8083526020830181905292820152905f805160206145738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611b89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611bb0919081019061426d565b9150915080611c175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611c7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611ced5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611d185760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611d6757611d2f816001614364565b611d3a906008614204565b61ffff16858281518110611d5057611d50614377565b016020015160f81c901b9190911790600101611d1b565b5061ffff811615611d8a5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611de557611da1816003614364565b611dac906008614204565b63ffffffff1686611dbe83600261438b565b81518110611dce57611dce614377565b016020015160f81c901b9190911790600101611d8d565b5063ffffffff8116600214611e0c5760405162461bcd60e51b815260040161044d9061442a565b5f805b6020811015611e6157611e2381601f614364565b611e2e906008614204565b87611e3a83600661438b565b81518110611e4a57611e4a614377565b016020015160f81c901b9190911790600101611e0f565b505f86602681518110611e7657611e76614377565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611eba5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611f0957611ed1816001614364565b611edc906008614204565b61ffff16868281518110611ef257611ef2614377565b016020015160f81c901b9190911790600101611ebd565b5061ffff811615611f2c5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611f8757611f43816003614364565b611f4e906008614204565b63ffffffff1687611f6083600261438b565b81518110611f7057611f70614377565b016020015160f81c901b9190911790600101611f2f565b5063ffffffff8116600314611fae5760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561200357611fc581601f614364565b611fd0906008614204565b88611fdc83600661438b565b81518110611fec57611fec614377565b016020015160f81c901b9190911790600101611fb1565b505f805b60088110156120625761201b816007614364565b612026906008614204565b6001600160401b03168961203b83602661438b565b8151811061204b5761204b614377565b016020015160f81c901b9190911790600101612007565b505f805b60088110156120c15761207a816007614364565b612085906008614204565b6001600160401b03168a61209a83602e61438b565b815181106120aa576120aa614377565b016020015160f81c901b9190911790600101612066565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061455383398151915292919061211990613ecb565b905011801561214b575060015f83815260038301602052604090205460ff16600481111561214957612149613e7c565b145b611af65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206145b38339815191526020526040808220815160e0810190925280545f8051602061457383398151915293929190829060ff16600581111561220a5761220a613e7c565b600581111561221b5761221b613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229557612295613e7c565b146122f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b03161461236b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61237881608001516131c8565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123bc576123bc613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124708461246a81611645565b5f6117f8565b5f858152600685016020526040902090915061248c8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124b990859060040161402f565b6020604051808303815f875af11580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190614061565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145538339815191528161256784613369565b90505f612573826109b9565b83549091506001600160401b0382161080159061259d57508260010154816001600160401b031611155b610fa25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f61260461339f565b5f80516020614573833981519152426001600160401b03851611801561263e57506001600160401b03841661263c426202a30061438b565b115b6126a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856126f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f868152600882016020526040902054156127655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146127cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b6127d5856131c8565b5f8061281c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133d6565b5f8281526005860160205260409020919350915061283a8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061286790859060040161402f565b6020604051808303815f875af1158015612883573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a79190614061565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561292057612920613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129c983611645565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fa260015f8051602061459383398151915255565b5f612a3861339f565b5f612a456101c284613369565b90505f805160206145538339815191525f612a5f876116c0565b9050600281516005811115612a7657612a76613e7c565b14612ad55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b5f838260800151612ae69190614471565b9050612af288826117bb565b5f612afc89611645565b90505f60028a8a84604051602001612b469392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612b6091614491565b602060405180830381855afa158015612b7b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b9e9190614061565b5f8181526003870160205260409020600201549091506001600160401b031615612c245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612c2d866131c8565b5f612c398b84866117f8565b5f8381526004880160205260409020909150612c558282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c8290859060040161402f565b6020604051808303815f875af1158015612c9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc29190614061565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d7157612d71613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061111f60015f8051602061459383398151915255565b5f808251602e14612ece5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015612f1d57612ee5816001614364565b612ef0906008614204565b61ffff16858281518110612f0657612f06614377565b016020015160f81c901b9190911790600101612ed1565b5061ffff811615612f405760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015612f9b57612f57816003614364565b612f62906008614204565b63ffffffff1686612f7483600261438b565b81518110612f8457612f84614377565b016020015160f81c901b9190911790600101612f43565b5063ffffffff8116600414612fc25760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561301757612fd981601f614364565b612fe4906008614204565b87612ff083600661438b565b8151811061300057613000614377565b016020015160f81c901b9190911790600101612fc5565b505f805b60088110156130765761302f816007614364565b61303a906008614204565b6001600160401b03168861304f83602661438b565b8151811061305f5761305f614377565b016020015160f81c901b919091179060010161301b565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cc57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d6613083565b6130df8161378e565b613111606082013560808301356130fc60c0850160a08601613d15565b61310c60e0860160c087016144ac565b6137af565b50565b61311c613083565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131a85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145738339815191529060ff165f03613206575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061324e9083614364565b1061326a576001600160401b0384166040830152808252613289565b838260400181815161327c9190614471565b6001600160401b03169052505b5f8260200151836040015160646132a091906144c7565b6132aa91906144f2565b600285015490915060ff90811690821611156133255760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109c9827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061380a565b5f805160206145938339815191528054600119016133d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134405760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134b757613477816001614364565b613482906008614204565b5081515f9083908390811061349957613499614377565b60200101906001600160f81b03191690815f1a905350600101613463565b505f5b6004811015613515576134ce816003614364565b6134d9906008614204565b505f826134e783600261438b565b815181106134f7576134f7614377565b60200101906001600160f81b03191690815f1a9053506001016134ba565b505f5b6020811015613572578451816020811061353457613534614377565b1a60f81b8261354483600661438b565b8151811061355457613554614377565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60208110156135d2578460200151816020811061359457613594614377565b1a60f81b826135a483602661438b565b815181106135b4576135b4614377565b60200101906001600160f81b03191690815f1a905350600101613575565b505f5b6008811015613646576135e9816007614364565b6135f4906008614204565b60ff1685604001516001600160401b0316901c60f81b82826046613618919061438b565b8151811061362857613628614377565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b60308110156136b1578460800151818151811061366857613668614377565b01602001516001600160f81b0319168261368383604e61438b565b8151811061369357613693614377565b60200101906001600160f81b03191690815f1a905350600101613649565b505f5b6008811015613723576136c8816007614364565b6136d3906008614204565b60608601516001600160401b0390811691161c60f81b826136f583607e61438b565b8151811061370557613705614377565b60200101906001600160f81b03191690815f1a9053506001016136b4565b506002816040516137349190614491565b602060405180830381855afa15801561374f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137729190614061565b94909350915050565b60015f8051602061459383398151915255565b613796613083565b61379e61396c565b6137a661397c565b61311181613984565b6137b7613083565b5f5f80516020614553833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138749190614061565b905061388b6001600160a01b0385163330866139f0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156138cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f39190614061565b90508181116139595760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b6139638282614364565b95945050505050565b613974613083565b6130cc613a50565b6130cc613083565b61398c613083565b80355f8051602061457383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139d66060830160408401614517565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613a4a908590613a58565b50505050565b61377b613083565b5f613a6c6001600160a01b03841683613ab9565b905080515f14158015613a90575080806020019051810190613a8e9190614537565b155b1561086357604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061111f83835f845f80856001600160a01b03168486604051613add9190614491565b5f6040518083038185875af1925050503d805f8114613b17576040519150601f19603f3d011682016040523d82523d5f602084013e613b1c565b606091505b509150915061163b868383606082613b3c57613b3782613b83565b61111f565b8151158015613b5357506001600160a01b0384163b155b15613b7c57604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b508061111f565b805115613b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bb890613ecb565b5f825580601f10613bc7575050565b601f0160209004905f5260205f209081019061311191905b80821115613bf2575f8155600101613bdf565b5090565b8015158114613111575f80fd5b803563ffffffff81168114613c16575f80fd5b919050565b5f805f60608486031215613c2d575f80fd5b833592506020840135613c3f81613bf6565b9150613c4d60408501613c03565b90509250925092565b5f60208284031215613c66575f80fd5b5035919050565b6001600160a01b0381168114613111575f80fd5b5f80828403610100811215613c94575f80fd5b60e0811215613ca1575f80fd5b5082915060e0830135613cb381613c6d565b809150509250929050565b5f60208284031215613cce575f80fd5b61111f82613c03565b5f8060408385031215613ce8575f80fd5b613cf183613c03565b946020939093013593505050565b80356001600160401b0381168114613c16575f80fd5b5f60208284031215613d25575f80fd5b61111f82613cff565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d6457613d64613d2e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d9257613d92613d2e565b604052919050565b5f6001600160401b03821115613db257613db2613d2e565b50601f01601f191660200190565b5f805f8060808587031215613dd3575f80fd5b8435935060208501359250613dea60408601613cff565b915060608501356001600160401b03811115613e04575f80fd5b8501601f81018713613e14575f80fd5b8035613e27613e2282613d9a565b613d6a565b818152886020838501011115613e3b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e6d575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613efd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561086357805f5260205f20601f840160051c81016020851015613f285750805b601f840160051c820191505b81811015613f47575f8155600101613f34565b5050505050565b81516001600160401b03811115613f6757613f67613d2e565b613f7b81613f758454613ecb565b84613f03565b602080601f831160018114613fae575f8415613f975750858301515b5f19600386901b1c1916600185901b178555614005565b5f85815260208120601f198616915b82811015613fdc57888601518255948401946001909101908401613fbd565b5085821015613ff957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561402757818101518382015260200161400f565b50505f910152565b602081525f825180602084015261404d81604085016020870161400d565b601f01601f19169190910160400192915050565b5f60208284031215614071575f80fd5b5051919050565b5f60208083525f845461408a81613ecb565b806020870152604060018084165f81146140ab57600181146140c7576140f4565b60ff19851660408a0152604084151560051b8a010195506140f4565b895f5260205f205f5b858110156140eb5781548b82018601529083019088016140d0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261412457614124614102565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109c9576109c9613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c1681613bf6565b5f806040838503121561427e575f80fd5b82516001600160401b0380821115614294575f80fd5b90840190606082870312156142a7575f80fd5b6142af613d42565b825181526020808401516142c281613c6d565b828201526040840151838111156142d7575f80fd5b80850194505087601f8501126142eb575f80fd5b835192506142fb613e2284613d9a565b838152888285870101111561430e575f80fd5b61431d8483830184880161400d565b80604084015250819550614332818801614262565b9450505050509250929050565b5f6001600160401b0380831681810361435a5761435a613e90565b6001019392505050565b818103818111156109c9576109c9613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c9576109c9613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b5f82516144a281846020870161400d565b9190910192915050565b5f602082840312156144bc575f80fd5b813561111f81613c6d565b6001600160401b038181168382160280821691908281146144ea576144ea613e90565b505092915050565b5f6001600160401b038084168061450b5761450b614102565b92169190910492915050565b5f60208284031215614527575f80fd5b813560ff8116811461111f575f80fd5b5f60208284031215614547575f80fd5b815161111f81613bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ddee60b49..560a9b9f6 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161440938038061440983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142bc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613945565b610389565b005b348015610134575f80fd5b50610127610143366004613980565b61046b565b348015610153575f80fd5b506101276101623660046139bb565b6108b4565b348015610172575f80fd5b506101b16101813660046139bb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139bb565b610a10565b3480156101ee575f80fd5b506102026101fd3660046139bb565b610a7d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139d2565b610a93565b348015610244575f80fd5b506101276102533660046139eb565b610def565b348015610263575f80fd5b506101b1610272366004613a29565b610f94565b348015610282575f80fd5b506102026102913660046139bb565b610fad565b3480156102a1575f80fd5b506101276102b03660046139bb565b610fc1565b3480156102c0575f80fd5b506101276102cf366004613980565b61102e565b3480156102df575f80fd5b506101276102ee3660046139eb565b611049565b3480156102fe575f80fd5b5061012761030d3660046139d2565b6111b2565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139bb565b611366565b6101b16103713660046139bb565b611435565b6101b1610384366004613ad4565b611441565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611465565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142308339815191529184156104bd576104ba8285611479565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b66565b600481111561050057610500613b66565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b66565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611715565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613b66565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61071485611790565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b8260600151816080018181516107a19190613b8e565b6001600160401b03169052506107b7858261188b565b5f6107c78684846080015161197a565b5f8b815260058901602052604090209091506107e38282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610810908590600401613d13565b6020604051808303815f875af115801561082c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108509190613d45565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142508339815191529291906108fc90613bb5565b905011801561092e575060035f83815260078301602052604090205460ff16600581111561092c5761092c613b66565b145b6109925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613d45565b505050565b610a1981611b97565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b5f610a8d64e8d4a5100083613dfa565b92915050565b5f805160206142508339815191525f610aab83611c7c565b90505f80610abc8360400151611e5d565b915091508015610b215760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b5257610b52613b66565b6005811115610b6357610b63613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bdc57610bdc613b66565b1480610bfa5750600182516005811115610bf857610bf8613b66565b145b610c595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c6e57610c6e613b66565b03610c9557505f8381526006860160205260408120600491610c9091906138fb565b610c99565b5060055b6020808301515f90815260088801909152604081205581816005811115610cc257610cc2613b66565b90816005811115610cd557610cd5613b66565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d0957610d09613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610dbc57610dbc613b66565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142308339815191525f610e0784611c7c565b90505f80610e188360400151611ffe565b5091509150610e2685612239565b5f8581526004850160205260408120610e3e916138fb565b5f610e4883611790565b9050816001600160401b031681606001516001600160401b03161015610e805760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610ec55760405162461bcd60e51b81526004016105e290613e4f565b60015f87815260038701602052604090205460ff166004811115610eeb57610eeb613b66565b14610f085760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8d6001600160401b03831664e8d4a51000613ee8565b5f610fb782611790565b6080015192915050565b610fca81612239565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b81156110405761103e8382611479565b505b610a0b83612325565b5f805160206142308339815191525f61106184611c7c565b90505f806110728360400151611ffe565b509150915061108085611b97565b5f8581526005850160205260408120611098916138fb565b5f6110a283611790565b9050816001600160401b031681606001516001600160401b031610156110da5760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003808701602052604090912001546001600160401b03808416911611156111185760405162461bcd60e51b81526004016105e290613e4f565b60035f87815260038701602052604090205460ff16600481111561113e5761113e613b66565b1461115b5760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142508339815191525f6111ca83611c7c565b90505f806111db8360400151611e5d565b915091508061123d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461125790613bb5565b9050118015611289575060015f83815260078601602052604090205460ff16600581111561128757611287613b66565b145b6112a55760405162461bcd60e51b81526004016105e290613eff565b5f82815260058501602052604081206112bd916138fb565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142508339815191529291906113ae90613bb5565b90501180156113e0575060015f83815260078301602052604090205460ff1660058111156113de576113de613b66565b145b6113fc5760405162461bcd60e51b81526004016105e290613eff565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b5f610a8d8233346126b6565b5f8061144c34612b1f565b905061145a85828686612bc9565b9150505b9392505050565b61146d612ffd565b61147681613048565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114eb9190810190613f65565b915091508061154e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b59190613d45565b8251146116195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561168f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061169e846040015161308b565b9150915081871461170b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206142908339815191526020526040812060020180545f8051602061425083398151915291600160a01b9091046001600160401b0316908190601461176183614037565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061429083398151915290528390208351918201909352825491925f8051602061425083398151915292829060ff16600581111561181057611810613b66565b600581111561182157611821613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061429083398151915260205260409020815181545f805160206142508339815191529284929091829060ff191660018360058111156118d5576118d5613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f3576119b381600161405c565b6119be906008613ee8565b5081515f908390839081106119d5576119d561406f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6004811015611a5657611a0a81600361405c565b611a15906008613ee8565b6001901c60f81b82611a28836002614083565b81518110611a3857611a3861406f565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6020811015611ab857611a6d81601f61405c565b611a78906008613ee8565b86901c60f81b82611a8a836006614083565b81518110611a9a57611a9a61406f565b60200101906001600160f81b03191690815f1a905350600101611a59565b505f5b6008811015611b2357611acf81600761405c565b611ada906008613ee8565b6001600160401b038616901c60f81b82611af5836026614083565b81518110611b0557611b0561406f565b60200101906001600160f81b03191690815f1a905350600101611abb565b505f5b6008811015611b8e57611b3a81600761405c565b611b45906008613ee8565b6001600160401b038516901c60f81b82611b6083602e614083565b81518110611b7057611b7061406f565b60200101906001600160f81b03191690815f1a905350600101611b26565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614230833981519152929190611bdf90613bb5565b9050118015611c11575060035f83815260038301602052604090205460ff166004811115611c0f57611c0f613b66565b145b611c785760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d189190810190613f65565b9150915080611d7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611de25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611e555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611e805760405162461bcd60e51b81526004016105e290614096565b5f805b6002811015611ecf57611e9781600161405c565b611ea2906008613ee8565b61ffff16858281518110611eb857611eb861406f565b016020015160f81c901b9190911790600101611e83565b5061ffff811615611ef25760405162461bcd60e51b81526004016105e2906140df565b5f805b6004811015611f4d57611f0981600361405c565b611f14906008613ee8565b63ffffffff1686611f26836002614083565b81518110611f3657611f3661406f565b016020015160f81c901b9190911790600101611ef5565b5063ffffffff8116600214611f745760405162461bcd60e51b81526004016105e290614122565b5f805b6020811015611fc957611f8b81601f61405c565b611f96906008613ee8565b87611fa2836006614083565b81518110611fb257611fb261406f565b016020015160f81c901b9190911790600101611f77565b505f86602681518110611fde57611fde61406f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120225760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156120715761203981600161405c565b612044906008613ee8565b61ffff1686828151811061205a5761205a61406f565b016020015160f81c901b9190911790600101612025565b5061ffff8116156120945760405162461bcd60e51b81526004016105e2906140df565b5f805b60048110156120ef576120ab81600361405c565b6120b6906008613ee8565b63ffffffff16876120c8836002614083565b815181106120d8576120d861406f565b016020015160f81c901b9190911790600101612097565b5063ffffffff81166003146121165760405162461bcd60e51b81526004016105e290614122565b5f805b602081101561216b5761212d81601f61405c565b612138906008613ee8565b88612144836006614083565b815181106121545761215461406f565b016020015160f81c901b9190911790600101612119565b505f805b60088110156121ca5761218381600761405c565b61218e906008613ee8565b6001600160401b0316896121a3836026614083565b815181106121b3576121b361406f565b016020015160f81c901b919091179060010161216f565b505f805b6008811015612229576121e281600761405c565b6121ed906008613ee8565b6001600160401b03168a61220283602e614083565b815181106122125761221261406f565b016020015160f81c901b91909117906001016121ce565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061423083398151915292919061228190613bb5565b90501180156122b3575060015f83815260038301602052604090205460ff1660048111156122b1576122b1613b66565b145b611c785760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206142908339815191526020526040808220815160e0810190925280545f8051602061425083398151915293929190829060ff16600581111561237257612372613b66565b600581111561238357612383613b66565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123fd576123fd613b66565b146124595760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b0316146124d35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b6124e08160800151613263565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561252457612524613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125d8846125d281611715565b5f61197a565b5f85815260068501602052604090209091506125f48282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612621908590600401613d13565b6020604051808303815f875af115801561263d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126619190613d45565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126bf613404565b5f6126c983610a7d565b90505f805160206142308339815191525f6126e387611790565b90506002815160058111156126fa576126fa613b66565b146127595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b828160800181815161276b9190614169565b6001600160401b0316905250612781878261188b565b5f61278b88611715565b90505f60028989846040516020016127d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127ef91614189565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190613d45565b5f8181526003860160205260409020600201549091506001600160401b0316156128b35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6128bc85613263565b5f6128cc8a84866080015161197a565b5f83815260048701602052604090209091506128e88282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612915908590600401613d13565b6020604051808303815f875af1158015612931573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129559190613d45565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff191660018360048111156129dd576129dd613b66565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061145e60015f8051602061427083398151915255565b5f5f805160206142308339815191528282612b3982610a7d565b83549091506001600160401b03821610801590612b6357508260010154816001600160401b031611155b612bc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612bd2613404565b5f80516020614250833981519152426001600160401b038516118015612c0c57506001600160401b038416612c0a426202a300614083565b115b612c6e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612cc55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612d335760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612d9a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612da385613263565b5f80612dea6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344e565b5f82815260058601602052604090209193509150612e088282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e35908590600401613d13565b6020604051808303815f875af1158015612e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e759190613d45565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eee57612eee613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612f9783611715565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bc160015f8051602061427083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661304657604051631afcd79f60e31b815260040160405180910390fd5b565b613050612ffd565b613059816137f3565b6114766060820135608083013561307660c0850160a08601613a29565b61308660e0860160c087016141a4565b613814565b5f808251602e146130ae5760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156130fd576130c581600161405c565b6130d0906008613ee8565b61ffff168582815181106130e6576130e661406f565b016020015160f81c901b91909117906001016130b1565b5061ffff8116156131205760405162461bcd60e51b81526004016105e2906140df565b5f805b600481101561317b5761313781600361405c565b613142906008613ee8565b63ffffffff1686613154836002614083565b815181106131645761316461406f565b016020015160f81c901b9190911790600101613123565b5063ffffffff81166004146131a25760405162461bcd60e51b81526004016105e290614122565b5f805b60208110156131f7576131b981601f61405c565b6131c4906008613ee8565b876131d0836006614083565b815181106131e0576131e061406f565b016020015160f81c901b91909117906001016131a5565b505f805b60088110156132565761320f81600761405c565b61321a906008613ee8565b6001600160401b03168861322f836026614083565b8151811061323f5761323f61406f565b016020015160f81c901b91909117906001016131fb565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142508339815191529060ff165f036132a1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132e9908361405c565b10613305576001600160401b0384166040830152808252613324565b83826040018181516133179190614169565b6001600160401b03169052505b5f82602001518360400151606461333b91906141bf565b61334591906141ea565b600285015490915060ff90811690821611156133c05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061427083398151915280546001190161343557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061427083398151915255565b5f60608260800151516030146134b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561352f576134ef81600161405c565b6134fa906008613ee8565b5081515f908390839081106135115761351161406f565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b600481101561358d5761354681600361405c565b613551906008613ee8565b505f8261355f836002614083565b8151811061356f5761356f61406f565b60200101906001600160f81b03191690815f1a905350600101613532565b505f5b60208110156135ea57845181602081106135ac576135ac61406f565b1a60f81b826135bc836006614083565b815181106135cc576135cc61406f565b60200101906001600160f81b03191690815f1a905350600101613590565b505f5b602081101561364a578460200151816020811061360c5761360c61406f565b1a60f81b8261361c836026614083565b8151811061362c5761362c61406f565b60200101906001600160f81b03191690815f1a9053506001016135ed565b505f5b60088110156136be5761366181600761405c565b61366c906008613ee8565b60ff1685604001516001600160401b0316901c60f81b828260466136909190614083565b815181106136a0576136a061406f565b60200101906001600160f81b03191690815f1a90535060010161364d565b505f5b603081101561372957846080015181815181106136e0576136e061406f565b01602001516001600160f81b031916826136fb83604e614083565b8151811061370b5761370b61406f565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b600881101561379b5761374081600761405c565b61374b906008613ee8565b60608601516001600160401b0390811691161c60f81b8261376d83607e614083565b8151811061377d5761377d61406f565b60200101906001600160f81b03191690815f1a90535060010161372c565b506002816040516137ac9190614189565b602060405180830381855afa1580156137c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ea9190613d45565b94909350915050565b6137fb612ffd565b61380361386f565b61380b61387f565b61147681613887565b61381c612ffd565b5f5f80516020614230833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613877612ffd565b6130466138f3565b613046612ffd565b61388f612ffd565b80355f8051602061425083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138d9606083016040840161420f565b600291909101805460ff191660ff90921691909117905550565b61343b612ffd565b50805461390790613bb5565b5f825580601f10613916575050565b601f0160209004905f5260205f209081019061147691905b80821115613941575f815560010161392e565b5090565b5f60e08284031215613955575f80fd5b50919050565b8015158114611476575f80fd5b803563ffffffff8116811461397b575f80fd5b919050565b5f805f60608486031215613992575f80fd5b8335925060208401356139a48161395b565b91506139b260408501613968565b90509250925092565b5f602082840312156139cb575f80fd5b5035919050565b5f602082840312156139e2575f80fd5b61145e82613968565b5f80604083850312156139fc575f80fd5b613a0583613968565b946020939093013593505050565b80356001600160401b038116811461397b575f80fd5b5f60208284031215613a39575f80fd5b61145e82613a13565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a7857613a78613a42565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613aa657613aa6613a42565b604052919050565b5f6001600160401b03821115613ac657613ac6613a42565b50601f01601f191660200190565b5f805f60608486031215613ae6575f80fd5b83359250613af660208501613a13565b915060408401356001600160401b03811115613b10575f80fd5b8401601f81018613613b20575f80fd5b8035613b33613b2e82613aae565b613a7e565b818152876020838501011115613b47575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bae57613bae613b7a565b5092915050565b600181811c90821680613bc957607f821691505b60208210810361395557634e487b7160e01b5f52602260045260245ffd5b601f821115610a0b57805f5260205f20601f840160051c81016020851015613c0c5750805b601f840160051c820191505b81811015613c2b575f8155600101613c18565b5050505050565b81516001600160401b03811115613c4b57613c4b613a42565b613c5f81613c598454613bb5565b84613be7565b602080601f831160018114613c92575f8415613c7b5750858301515b5f19600386901b1c1916600185901b178555613ce9565b5f85815260208120601f198616915b82811015613cc057888601518255948401946001909101908401613ca1565b5085821015613cdd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d0b578181015183820152602001613cf3565b50505f910152565b602081525f8251806020840152613d31816040850160208701613cf1565b601f01601f19169190910160400192915050565b5f60208284031215613d55575f80fd5b5051919050565b5f60208083525f8454613d6e81613bb5565b806020870152604060018084165f8114613d8f5760018114613dab57613dd8565b60ff19851660408a0152604084151560051b8a01019550613dd8565b895f5260205f205f5b85811015613dcf5781548b8201860152908301908801613db4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e0857613e08613de6565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a8d57610a8d613b7a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611476575f80fd5b805161397b8161395b565b5f8060408385031215613f76575f80fd5b82516001600160401b0380821115613f8c575f80fd5b9084019060608287031215613f9f575f80fd5b613fa7613a56565b82518152602080840151613fba81613f46565b82820152604084015183811115613fcf575f80fd5b80850194505087601f850112613fe3575f80fd5b83519250613ff3613b2e84613aae565b8381528882858701011115614006575f80fd5b61401584838301848801613cf1565b8060408401525081955061402a818801613f5a565b9450505050509250929050565b5f6001600160401b0380831681810361405257614052613b7a565b6001019392505050565b81810381811115610a8d57610a8d613b7a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8d57610a8d613b7a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bae57613bae613b7a565b5f825161419a818460208701613cf1565b9190910192915050565b5f602082840312156141b4575f80fd5b813561145e81613f46565b6001600160401b038181168382160280821691908281146141e2576141e2613b7a565b505092915050565b5f6001600160401b038084168061420357614203613de6565b92169190910492915050565b5f6020828403121561421f575f80fd5b813560ff8116811461145e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161435438038061435483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142078061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613890565b610389565b005b348015610134575f80fd5b506101276101433660046138cb565b61046b565b348015610153575f80fd5b50610127610162366004613906565b6108a1565b348015610172575f80fd5b506101b1610181366004613906565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613906565b6109fd565b3480156101ee575f80fd5b506102026101fd366004613906565b610a6a565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b5061012761023436600461391d565b610a80565b348015610244575f80fd5b50610127610253366004613936565b610ddc565b348015610263575f80fd5b506101b1610272366004613974565b610f81565b348015610282575f80fd5b50610202610291366004613906565b610f9a565b3480156102a1575f80fd5b506101276102b0366004613906565b610fae565b3480156102c0575f80fd5b506101276102cf3660046138cb565b61101b565b3480156102df575f80fd5b506101276102ee366004613936565b611036565b3480156102fe575f80fd5b5061012761030d36600461391d565b61119f565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613906565b611353565b6101b1610371366004613906565b611422565b6101b1610384366004613a1f565b61142e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611452565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061417b8339815191529184156104bd576104ba8285611466565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613ab1565b600481111561050057610500613ab1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613ab1565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611702565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613ab1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107148561177d565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b5f836060015182608001516107a09190613ad9565b90506107ac8682611878565b5f6107b88785846118b5565b5f8c815260058a01602052604090209091506107d48282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610801908590600401613c5e565b6020604051808303815f875af115801561081d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108419190613c90565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061419b8339815191529291906108e990613b00565b905011801561091b575060035f83815260078301602052604090205460ff16600581111561091957610919613ab1565b145b61097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190613c90565b505050565b610a0681611ad2565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b5f610a7a64e8d4a5100083613d45565b92915050565b5f8051602061419b8339815191525f610a9883611bb7565b90505f80610aa98360400151611d98565b915091508015610b0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b3f57610b3f613ab1565b6005811115610b5057610b50613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bc957610bc9613ab1565b1480610be75750600182516005811115610be557610be5613ab1565b145b610c465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c5b57610c5b613ab1565b03610c8257505f8381526006860160205260408120600491610c7d9190613846565b610c86565b5060055b6020808301515f90815260088801909152604081205581816005811115610caf57610caf613ab1565b90816005811115610cc257610cc2613ab1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cf657610cf6613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610da957610da9613ab1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061417b8339815191525f610df484611bb7565b90505f80610e058360400151611f39565b5091509150610e1385612174565b5f8581526004850160205260408120610e2b91613846565b5f610e358361177d565b9050816001600160401b031681606001516001600160401b03161015610e6d5760405162461bcd60e51b81526004016105e290613d58565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eb25760405162461bcd60e51b81526004016105e290613d9a565b60015f87815260038701602052604090205460ff166004811115610ed857610ed8613ab1565b14610ef55760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a7a6001600160401b03831664e8d4a51000613e33565b5f610fa48261177d565b6080015192915050565b610fb781612174565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b811561102d5761102b8382611466565b505b6109f883612260565b5f8051602061417b8339815191525f61104e84611bb7565b90505f8061105f8360400151611f39565b509150915061106d85611ad2565b5f858152600585016020526040812061108591613846565b5f61108f8361177d565b9050816001600160401b031681606001516001600160401b031610156110c75760405162461bcd60e51b81526004016105e290613d58565b5f8681526003808701602052604090912001546001600160401b03808416911611156111055760405162461bcd60e51b81526004016105e290613d9a565b60035f87815260038701602052604090205460ff16600481111561112b5761112b613ab1565b146111485760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061419b8339815191525f6111b783611bb7565b90505f806111c88360400151611d98565b915091508061122a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461124490613b00565b9050118015611276575060015f83815260078601602052604090205460ff16600581111561127457611274613ab1565b145b6112925760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058501602052604081206112aa91613846565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419b83398151915292919061139b90613b00565b90501180156113cd575060015f83815260078301602052604090205460ff1660058111156113cb576113cb613ab1565b145b6113e95760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b5f610a7a8233346125f1565b5f8061143934612a6a565b905061144785828686612b14565b9150505b9392505050565b61145a612f48565b61146381612f93565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d89190810190613eb0565b915091508061153b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a29190613c90565b8251146116065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561167c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061168b8460400151612fd6565b915091508187146116f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206141db8339815191526020526040812060020180545f8051602061419b83398151915291600160a01b9091046001600160401b0316908190601461174e83613f82565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206141db83398151915290528390208351918201909352825491925f8051602061419b83398151915292829060ff1660058111156117fd576117fd613ab1565b600581111561180e5761180e613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206141db8339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561192e576118ee816001613fa7565b6118f9906008613e33565b5081515f9083908390811061191057611910613fba565b60200101906001600160f81b03191690815f1a9053506001016118da565b505f5b600481101561199157611945816003613fa7565b611950906008613e33565b6001901c60f81b82611963836002613fce565b8151811061197357611973613fba565b60200101906001600160f81b03191690815f1a905350600101611931565b505f5b60208110156119f3576119a881601f613fa7565b6119b3906008613e33565b86901c60f81b826119c5836006613fce565b815181106119d5576119d5613fba565b60200101906001600160f81b03191690815f1a905350600101611994565b505f5b6008811015611a5e57611a0a816007613fa7565b611a15906008613e33565b6001600160401b038616901c60f81b82611a30836026613fce565b81518110611a4057611a40613fba565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6008811015611ac957611a75816007613fa7565b611a80906008613e33565b6001600160401b038516901c60f81b82611a9b83602e613fce565b81518110611aab57611aab613fba565b60200101906001600160f81b03191690815f1a905350600101611a61565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061417b833981519152929190611b1a90613b00565b9050118015611b4c575060035f83815260038301602052604090205460ff166004811115611b4a57611b4a613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061419b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c2c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c539190810190613eb0565b9150915080611cba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611d1d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611d905760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611dbb5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611e0a57611dd2816001613fa7565b611ddd906008613e33565b61ffff16858281518110611df357611df3613fba565b016020015160f81c901b9190911790600101611dbe565b5061ffff811615611e2d5760405162461bcd60e51b81526004016105e29061402a565b5f805b6004811015611e8857611e44816003613fa7565b611e4f906008613e33565b63ffffffff1686611e61836002613fce565b81518110611e7157611e71613fba565b016020015160f81c901b9190911790600101611e30565b5063ffffffff8116600214611eaf5760405162461bcd60e51b81526004016105e29061406d565b5f805b6020811015611f0457611ec681601f613fa7565b611ed1906008613e33565b87611edd836006613fce565b81518110611eed57611eed613fba565b016020015160f81c901b9190911790600101611eb2565b505f86602681518110611f1957611f19613fba565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f5d5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611fac57611f74816001613fa7565b611f7f906008613e33565b61ffff16868281518110611f9557611f95613fba565b016020015160f81c901b9190911790600101611f60565b5061ffff811615611fcf5760405162461bcd60e51b81526004016105e29061402a565b5f805b600481101561202a57611fe6816003613fa7565b611ff1906008613e33565b63ffffffff1687612003836002613fce565b8151811061201357612013613fba565b016020015160f81c901b9190911790600101611fd2565b5063ffffffff81166003146120515760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156120a65761206881601f613fa7565b612073906008613e33565b8861207f836006613fce565b8151811061208f5761208f613fba565b016020015160f81c901b9190911790600101612054565b505f805b6008811015612105576120be816007613fa7565b6120c9906008613e33565b6001600160401b0316896120de836026613fce565b815181106120ee576120ee613fba565b016020015160f81c901b91909117906001016120aa565b505f805b60088110156121645761211d816007613fa7565b612128906008613e33565b6001600160401b03168a61213d83602e613fce565b8151811061214d5761214d613fba565b016020015160f81c901b9190911790600101612109565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061417b8339815191529291906121bc90613b00565b90501180156121ee575060015f83815260038301602052604090205460ff1660048111156121ec576121ec613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206141db8339815191526020526040808220815160e0810190925280545f8051602061419b83398151915293929190829060ff1660058111156122ad576122ad613ab1565b60058111156122be576122be613ab1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561233857612338613ab1565b146123945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b03161461240e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b61241b81608001516131ae565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561245f5761245f613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125138461250d81611702565b5f6118b5565b5f858152600685016020526040902090915061252f8282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061255c908590600401613c5e565b6020604051808303815f875af1158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190613c90565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6125fa61334f565b5f61260483610a6a565b90505f8051602061417b8339815191525f61261e8761177d565b905060028151600581111561263557612635613ab1565b146126945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b5f8382608001516126a591906140b4565b90506126b18882611878565b5f6126bb89611702565b90505f60028a8a846040516020016127059392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261271f916140d4565b602060405180830381855afa15801561273a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275d9190613c90565b5f8181526003870160205260409020600201549091506001600160401b0316156127e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6127ec866131ae565b5f6127f88b84866118b5565b5f83815260048801602052604090209091506128148282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612841908590600401613c5e565b6020604051808303815f875af115801561285d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128819190613c90565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561293057612930613ab1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061144b60015f805160206141bb83398151915255565b5f5f8051602061417b8339815191528282612a8482610a6a565b83549091506001600160401b03821610801590612aae57508260010154816001600160401b031611155b612b0c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612b1d61334f565b5f8051602061419b833981519152426001600160401b038516118015612b5757506001600160401b038416612b55426202a300613fce565b115b612bb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612c105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612ce55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612cee856131ae565b5f80612d356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613399565b5f82815260058601602052604090209193509150612d538282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d80908590600401613c5e565b6020604051808303815f875af1158015612d9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc09190613c90565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612e3957612e39613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612ee283611702565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b0c60015f805160206141bb83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f9157604051631afcd79f60e31b815260040160405180910390fd5b565b612f9b612f48565b612fa48161373e565b61146360608201356080830135612fc160c0850160a08601613974565b612fd160e0860160c087016140ef565b61375f565b5f808251602e14612ff95760405162461bcd60e51b81526004016105e290613fe1565b5f805b600281101561304857613010816001613fa7565b61301b906008613e33565b61ffff1685828151811061303157613031613fba565b016020015160f81c901b9190911790600101612ffc565b5061ffff81161561306b5760405162461bcd60e51b81526004016105e29061402a565b5f805b60048110156130c657613082816003613fa7565b61308d906008613e33565b63ffffffff168661309f836002613fce565b815181106130af576130af613fba565b016020015160f81c901b919091179060010161306e565b5063ffffffff81166004146130ed5760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156131425761310481601f613fa7565b61310f906008613e33565b8761311b836006613fce565b8151811061312b5761312b613fba565b016020015160f81c901b91909117906001016130f0565b505f805b60088110156131a15761315a816007613fa7565b613165906008613e33565b6001600160401b03168861317a836026613fce565b8151811061318a5761318a613fba565b016020015160f81c901b9190911790600101613146565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061419b8339815191529060ff165f036131ec575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132349083613fa7565b10613250576001600160401b038416604083015280825261326f565b838260400181815161326291906140b4565b6001600160401b03169052505b5f826020015183604001516064613286919061410a565b6132909190614135565b600285015490915060ff908116908216111561330b5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141bb83398151915280546001190161338057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141bb83398151915255565b5f60608260800151516030146134035760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561347a5761343a816001613fa7565b613445906008613e33565b5081515f9083908390811061345c5761345c613fba565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60048110156134d857613491816003613fa7565b61349c906008613e33565b505f826134aa836002613fce565b815181106134ba576134ba613fba565b60200101906001600160f81b03191690815f1a90535060010161347d565b505f5b602081101561353557845181602081106134f7576134f7613fba565b1a60f81b82613507836006613fce565b8151811061351757613517613fba565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b6020811015613595578460200151816020811061355757613557613fba565b1a60f81b82613567836026613fce565b8151811061357757613577613fba565b60200101906001600160f81b03191690815f1a905350600101613538565b505f5b6008811015613609576135ac816007613fa7565b6135b7906008613e33565b60ff1685604001516001600160401b0316901c60f81b828260466135db9190613fce565b815181106135eb576135eb613fba565b60200101906001600160f81b03191690815f1a905350600101613598565b505f5b6030811015613674578460800151818151811061362b5761362b613fba565b01602001516001600160f81b0319168261364683604e613fce565b8151811061365657613656613fba565b60200101906001600160f81b03191690815f1a90535060010161360c565b505f5b60088110156136e65761368b816007613fa7565b613696906008613e33565b60608601516001600160401b0390811691161c60f81b826136b883607e613fce565b815181106136c8576136c8613fba565b60200101906001600160f81b03191690815f1a905350600101613677565b506002816040516136f791906140d4565b602060405180830381855afa158015613712573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137359190613c90565b94909350915050565b613746612f48565b61374e6137ba565b6137566137ca565b611463816137d2565b613767612f48565b5f5f8051602061417b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137c2612f48565b612f9161383e565b612f91612f48565b6137da612f48565b80355f8051602061419b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613824606083016040840161415a565b600291909101805460ff191660ff90921691909117905550565b613386612f48565b50805461385290613b00565b5f825580601f10613861575050565b601f0160209004905f5260205f209081019061146391905b8082111561388c575f8155600101613879565b5090565b5f60e082840312156138a0575f80fd5b50919050565b8015158114611463575f80fd5b803563ffffffff811681146138c6575f80fd5b919050565b5f805f606084860312156138dd575f80fd5b8335925060208401356138ef816138a6565b91506138fd604085016138b3565b90509250925092565b5f60208284031215613916575f80fd5b5035919050565b5f6020828403121561392d575f80fd5b61144b826138b3565b5f8060408385031215613947575f80fd5b613950836138b3565b946020939093013593505050565b80356001600160401b03811681146138c6575f80fd5b5f60208284031215613984575f80fd5b61144b8261395e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139c3576139c361398d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139f1576139f161398d565b604052919050565b5f6001600160401b03821115613a1157613a1161398d565b50601f01601f191660200190565b5f805f60608486031215613a31575f80fd5b83359250613a416020850161395e565b915060408401356001600160401b03811115613a5b575f80fd5b8401601f81018613613a6b575f80fd5b8035613a7e613a79826139f9565b6139c9565b818152876020838501011115613a92575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613af957613af9613ac5565b5092915050565b600181811c90821680613b1457607f821691505b6020821081036138a057634e487b7160e01b5f52602260045260245ffd5b601f8211156109f857805f5260205f20601f840160051c81016020851015613b575750805b601f840160051c820191505b81811015613b76575f8155600101613b63565b5050505050565b81516001600160401b03811115613b9657613b9661398d565b613baa81613ba48454613b00565b84613b32565b602080601f831160018114613bdd575f8415613bc65750858301515b5f19600386901b1c1916600185901b178555613c34565b5f85815260208120601f198616915b82811015613c0b57888601518255948401946001909101908401613bec565b5085821015613c2857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613c56578181015183820152602001613c3e565b50505f910152565b602081525f8251806020840152613c7c816040850160208701613c3c565b601f01601f19169190910160400192915050565b5f60208284031215613ca0575f80fd5b5051919050565b5f60208083525f8454613cb981613b00565b806020870152604060018084165f8114613cda5760018114613cf657613d23565b60ff19851660408a0152604084151560051b8a01019550613d23565b895f5260205f205f5b85811015613d1a5781548b8201860152908301908801613cff565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613d5357613d53613d31565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a7a57610a7a613ac5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611463575f80fd5b80516138c6816138a6565b5f8060408385031215613ec1575f80fd5b82516001600160401b0380821115613ed7575f80fd5b9084019060608287031215613eea575f80fd5b613ef26139a1565b82518152602080840151613f0581613e91565b82820152604084015183811115613f1a575f80fd5b80850194505087601f850112613f2e575f80fd5b83519250613f3e613a79846139f9565b8381528882858701011115613f51575f80fd5b613f6084838301848801613c3c565b80604084015250819550613f75818801613ea5565b9450505050509250929050565b5f6001600160401b03808316818103613f9d57613f9d613ac5565b6001019392505050565b81810381811115610a7a57610a7a613ac5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a7a57610a7a613ac5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613af957613af9613ac5565b5f82516140e5818460208701613c3c565b9190910192915050565b5f602082840312156140ff575f80fd5b813561144b81613e91565b6001600160401b0381811683821602808216919082811461412d5761412d613ac5565b505092915050565b5f6001600160401b038084168061414e5761414e613d31565b92169190910492915050565b5f6020828403121561416a575f80fd5b813560ff8116811461144b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1e19b1611..06cd6f52d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -157,8 +157,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); // Update the validator weight - validator.weight += weight; - _setValidator(validationID, validator); + uint64 newValidatorWeight = validator.weight + weight; + _setValidatorWeight(validationID, newValidatorWeight); uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); @@ -173,7 +173,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -194,7 +194,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager setWeightMessageID: messageID, delegationID: delegationID, delegatorWeight: weight, - validatorWeight: validator.weight, + validatorWeight: newValidatorWeight, nonce: nonce }); return delegationID; @@ -271,12 +271,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); - validator.weight -= delegator.weight; - _setValidator(validationID, validator); + uint64 newValidatorWeight = validator.weight - delegator.weight; + _setValidatorWeight(validationID, newValidatorWeight); // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); $._pendingEndDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -284,7 +284,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID: validationID, setWeightMessageID: messageID, delegationID: delegationID, - validatorWeight: validator.weight, + validatorWeight: newValidatorWeight, nonce: nonce, endTime: block.timestamp }); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index e8d8923de..b1f16d0b6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -378,8 +378,8 @@ abstract contract ValidatorManager is return $._validationPeriods[validationID]; } - function _setValidator(bytes32 validationID, Validator memory validator) internal { + function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._validationPeriods[validationID] = validator; + $._validationPeriods[validationID].weight = weight; } } From 57256e9b64a0fea2d794aab181eed9d164e7610b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 10:02:14 -0500 Subject: [PATCH 5/9] require init end callable by owner --- contracts/staking/PoSValidatorManager.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 06cd6f52d..cb915ea92 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -259,6 +259,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[delegationID]; + require( + delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" + ); require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" ); From 7616bb51b107b65e7335cac76f0007071960d52d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 11:08:38 -0500 Subject: [PATCH 6/9] revamp delegation events --- .../ERC20TokenStakingManager.go | 179 +++++++++--------- .../NativeTokenStakingManager.go | 179 +++++++++--------- contracts/staking/PoSValidatorManager.sol | 47 ++--- .../interfaces/IPoSValidatorManager.sol | 38 ++-- .../tests/ERC20TokenStakingManagerTests.t.sol | 4 +- .../NativeTokenStakingManagerTests.t.sol | 6 +- .../tests/PoSValidatorManagerTests.t.sol | 96 +++++----- 7 files changed, 276 insertions(+), 273 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8af3e812e..ef0e5baa2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161472c38038061472c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145df8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c1b565b6102d6565b005b610128610138366004613c56565b61070c565b61017b61014b366004613c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613c56565b610868565b6101286101af366004613c81565b6108d5565b6101c76101c2366004613c56565b6109b9565b6040516001600160401b039091168152602001610185565b6101286101ed366004613cbe565b6109cf565b610128610200366004613cd7565b610d2b565b61017b610213366004613d15565b610ed0565b6101c7610226366004613c56565b610ee9565b610128610239366004613c56565b610efd565b61012861024c366004613c1b565b610f6a565b61017b61025f366004613dc0565b610f85565b610128610272366004613cd7565b610faa565b61017b610285366004613e5c565b611113565b610128610298366004613cbe565b611126565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613c56565b6112da565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145538339815191529184156103285761032582856113a9565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613e7c565b600481111561036b5761036b613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613e7c565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611645565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116c0565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b5f8360600151826080015161060b9190613ea4565b905061061786826117bb565b5f6106238785846117f8565b5f8c815260058a016020526040902090915061063f8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061066c90859060040161402f565b6020604051808303815f875af1158015610688573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ac9190614061565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061457383398151915292919061075490613ecb565b9050118015610786575060035f83815260078301602052604090205460ff16600581111561078457610784613e7c565b145b6107ea5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6020604051808303815f875af115801561083f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108639190614061565b505050565b61087181611a15565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061091e575080546001600160401b03808416911610155b1561093c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109678484611afa565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109c964e8d4a5100083614116565b92915050565b5f805160206145738339815191525f6109e783611b14565b90505f806109f88360400151611cf5565b915091508015610a5d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610a8e57610a8e613e7c565b6005811115610a9f57610a9f613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b1857610b18613e7c565b1480610b365750600182516005811115610b3457610b34613e7c565b145b610b955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610baa57610baa613e7c565b03610bd157505f8381526006860160205260408120600491610bcc9190613bac565b610bd5565b5060055b6020808301515f90815260088801909152604081205581816005811115610bfe57610bfe613e7c565b90816005811115610c1157610c11613e7c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c4557610c45613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610cf857610cf8613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145538339815191525f610d4384611b14565b90505f80610d548360400151611e96565b5091509150610d62856120d1565b5f8581526004850160205260408120610d7a91613bac565b5f610d84836116c0565b9050816001600160401b031681606001516001600160401b03161015610dbc5760405162461bcd60e51b815260040161044d90614129565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e015760405162461bcd60e51b815260040161044d9061416b565b60015f87815260038701602052604090205460ff166004811115610e2757610e27613e7c565b14610e445760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c96001600160401b03831664e8d4a51000614204565b5f610ef3826116c0565b6080015192915050565b610f06816120d1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b8115610f7c57610f7a83826113a9565b505b610863836121bd565b5f80610f908661254e565b9050610f9e858286866125fb565b9150505b949350505050565b5f805160206145538339815191525f610fc284611b14565b90505f80610fd38360400151611e96565b5091509150610fe185611a15565b5f8581526005850160205260408120610ff991613bac565b5f611003836116c0565b9050816001600160401b031681606001516001600160401b0316101561103b5760405162461bcd60e51b815260040161044d90614129565b5f8681526003808701602052604090912001546001600160401b03808416911611156110795760405162461bcd60e51b815260040161044d9061416b565b60035f87815260038701602052604090205460ff16600481111561109f5761109f613e7c565b146110bc5760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61111f833384612a2f565b9392505050565b5f805160206145738339815191525f61113e83611b14565b90505f8061114f8360400151611cf5565b91509150806111b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111cb90613ecb565b90501180156111fd575060015f83815260078601602052604090205460ff1660058111156111fb576111fb613e7c565b145b6112195760405162461bcd60e51b815260040161044d9061421b565b5f828152600585016020526040812061123191613bac565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061457383398151915292919061132290613ecb565b9050118015611354575060015f83815260078301602052604090205460ff16600581111561135257611352613e7c565b145b6113705760405162461bcd60e51b815260040161044d9061421b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261141b919081019061426d565b915091508061147e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e59190614061565b8251146115495760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115ce8460400151612eab565b9150915081871461163b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206145b38339815191526020526040812060020180545f8051602061457383398151915291600160a01b9091046001600160401b031690819060146116918361433f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206145b383398151915290528390208351918201909352825491925f8051602061457383398151915292829060ff16600581111561174057611740613e7c565b600581111561175157611751613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206145b38339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561187157611831816001614364565b61183c906008614204565b5081515f9083908390811061185357611853614377565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60048110156118d457611888816003614364565b611893906008614204565b6001901c60f81b826118a683600261438b565b815181106118b6576118b6614377565b60200101906001600160f81b03191690815f1a905350600101611874565b505f5b6020811015611936576118eb81601f614364565b6118f6906008614204565b86901c60f81b8261190883600661438b565b8151811061191857611918614377565b60200101906001600160f81b03191690815f1a9053506001016118d7565b505f5b60088110156119a15761194d816007614364565b611958906008614204565b6001600160401b038616901c60f81b8261197383602661438b565b8151811061198357611983614377565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b6008811015611a0c576119b8816007614364565b6119c3906008614204565b6001600160401b038516901c60f81b826119de83602e61438b565b815181106119ee576119ee614377565b60200101906001600160f81b03191690815f1a9053506001016119a4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614553833981519152929190611a5d90613ecb565b9050118015611a8f575060035f83815260038301602052604090205460ff166004811115611a8d57611a8d613e7c565b145b611af65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611b02613083565b611b0b826130ce565b611af681613114565b60408051606080820183525f8083526020830181905292820152905f805160206145738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611b89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611bb0919081019061426d565b9150915080611c175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611c7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611ced5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611d185760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611d6757611d2f816001614364565b611d3a906008614204565b61ffff16858281518110611d5057611d50614377565b016020015160f81c901b9190911790600101611d1b565b5061ffff811615611d8a5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611de557611da1816003614364565b611dac906008614204565b63ffffffff1686611dbe83600261438b565b81518110611dce57611dce614377565b016020015160f81c901b9190911790600101611d8d565b5063ffffffff8116600214611e0c5760405162461bcd60e51b815260040161044d9061442a565b5f805b6020811015611e6157611e2381601f614364565b611e2e906008614204565b87611e3a83600661438b565b81518110611e4a57611e4a614377565b016020015160f81c901b9190911790600101611e0f565b505f86602681518110611e7657611e76614377565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611eba5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611f0957611ed1816001614364565b611edc906008614204565b61ffff16868281518110611ef257611ef2614377565b016020015160f81c901b9190911790600101611ebd565b5061ffff811615611f2c5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611f8757611f43816003614364565b611f4e906008614204565b63ffffffff1687611f6083600261438b565b81518110611f7057611f70614377565b016020015160f81c901b9190911790600101611f2f565b5063ffffffff8116600314611fae5760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561200357611fc581601f614364565b611fd0906008614204565b88611fdc83600661438b565b81518110611fec57611fec614377565b016020015160f81c901b9190911790600101611fb1565b505f805b60088110156120625761201b816007614364565b612026906008614204565b6001600160401b03168961203b83602661438b565b8151811061204b5761204b614377565b016020015160f81c901b9190911790600101612007565b505f805b60088110156120c15761207a816007614364565b612085906008614204565b6001600160401b03168a61209a83602e61438b565b815181106120aa576120aa614377565b016020015160f81c901b9190911790600101612066565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061455383398151915292919061211990613ecb565b905011801561214b575060015f83815260038301602052604090205460ff16600481111561214957612149613e7c565b145b611af65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206145b38339815191526020526040808220815160e0810190925280545f8051602061457383398151915293929190829060ff16600581111561220a5761220a613e7c565b600581111561221b5761221b613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229557612295613e7c565b146122f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b03161461236b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61237881608001516131c8565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123bc576123bc613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124708461246a81611645565b5f6117f8565b5f858152600685016020526040902090915061248c8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124b990859060040161402f565b6020604051808303815f875af11580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190614061565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145538339815191528161256784613369565b90505f612573826109b9565b83549091506001600160401b0382161080159061259d57508260010154816001600160401b031611155b610fa25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f61260461339f565b5f80516020614573833981519152426001600160401b03851611801561263e57506001600160401b03841661263c426202a30061438b565b115b6126a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856126f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f868152600882016020526040902054156127655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146127cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b6127d5856131c8565b5f8061281c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133d6565b5f8281526005860160205260409020919350915061283a8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061286790859060040161402f565b6020604051808303815f875af1158015612883573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a79190614061565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561292057612920613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129c983611645565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fa260015f8051602061459383398151915255565b5f612a3861339f565b5f612a456101c284613369565b90505f805160206145538339815191525f612a5f876116c0565b9050600281516005811115612a7657612a76613e7c565b14612ad55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b5f838260800151612ae69190614471565b9050612af288826117bb565b5f612afc89611645565b90505f60028a8a84604051602001612b469392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612b6091614491565b602060405180830381855afa158015612b7b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b9e9190614061565b5f8181526003870160205260409020600201549091506001600160401b031615612c245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612c2d866131c8565b5f612c398b84866117f8565b5f8381526004880160205260409020909150612c558282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c8290859060040161402f565b6020604051808303815f875af1158015612c9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc29190614061565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d7157612d71613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061111f60015f8051602061459383398151915255565b5f808251602e14612ece5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015612f1d57612ee5816001614364565b612ef0906008614204565b61ffff16858281518110612f0657612f06614377565b016020015160f81c901b9190911790600101612ed1565b5061ffff811615612f405760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015612f9b57612f57816003614364565b612f62906008614204565b63ffffffff1686612f7483600261438b565b81518110612f8457612f84614377565b016020015160f81c901b9190911790600101612f43565b5063ffffffff8116600414612fc25760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561301757612fd981601f614364565b612fe4906008614204565b87612ff083600661438b565b8151811061300057613000614377565b016020015160f81c901b9190911790600101612fc5565b505f805b60088110156130765761302f816007614364565b61303a906008614204565b6001600160401b03168861304f83602661438b565b8151811061305f5761305f614377565b016020015160f81c901b919091179060010161301b565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cc57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d6613083565b6130df8161378e565b613111606082013560808301356130fc60c0850160a08601613d15565b61310c60e0860160c087016144ac565b6137af565b50565b61311c613083565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131a85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145738339815191529060ff165f03613206575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061324e9083614364565b1061326a576001600160401b0384166040830152808252613289565b838260400181815161327c9190614471565b6001600160401b03169052505b5f8260200151836040015160646132a091906144c7565b6132aa91906144f2565b600285015490915060ff90811690821611156133255760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109c9827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061380a565b5f805160206145938339815191528054600119016133d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134405760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134b757613477816001614364565b613482906008614204565b5081515f9083908390811061349957613499614377565b60200101906001600160f81b03191690815f1a905350600101613463565b505f5b6004811015613515576134ce816003614364565b6134d9906008614204565b505f826134e783600261438b565b815181106134f7576134f7614377565b60200101906001600160f81b03191690815f1a9053506001016134ba565b505f5b6020811015613572578451816020811061353457613534614377565b1a60f81b8261354483600661438b565b8151811061355457613554614377565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60208110156135d2578460200151816020811061359457613594614377565b1a60f81b826135a483602661438b565b815181106135b4576135b4614377565b60200101906001600160f81b03191690815f1a905350600101613575565b505f5b6008811015613646576135e9816007614364565b6135f4906008614204565b60ff1685604001516001600160401b0316901c60f81b82826046613618919061438b565b8151811061362857613628614377565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b60308110156136b1578460800151818151811061366857613668614377565b01602001516001600160f81b0319168261368383604e61438b565b8151811061369357613693614377565b60200101906001600160f81b03191690815f1a905350600101613649565b505f5b6008811015613723576136c8816007614364565b6136d3906008614204565b60608601516001600160401b0390811691161c60f81b826136f583607e61438b565b8151811061370557613705614377565b60200101906001600160f81b03191690815f1a9053506001016136b4565b506002816040516137349190614491565b602060405180830381855afa15801561374f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137729190614061565b94909350915050565b60015f8051602061459383398151915255565b613796613083565b61379e61396c565b6137a661397c565b61311181613984565b6137b7613083565b5f5f80516020614553833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138749190614061565b905061388b6001600160a01b0385163330866139f0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156138cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f39190614061565b90508181116139595760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b6139638282614364565b95945050505050565b613974613083565b6130cc613a50565b6130cc613083565b61398c613083565b80355f8051602061457383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139d66060830160408401614517565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613a4a908590613a58565b50505050565b61377b613083565b5f613a6c6001600160a01b03841683613ab9565b905080515f14158015613a90575080806020019051810190613a8e9190614537565b155b1561086357604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061111f83835f845f80856001600160a01b03168486604051613add9190614491565b5f6040518083038185875af1925050503d805f8114613b17576040519150601f19603f3d011682016040523d82523d5f602084013e613b1c565b606091505b509150915061163b868383606082613b3c57613b3782613b83565b61111f565b8151158015613b5357506001600160a01b0384163b155b15613b7c57604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b508061111f565b805115613b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bb890613ecb565b5f825580601f10613bc7575050565b601f0160209004905f5260205f209081019061311191905b80821115613bf2575f8155600101613bdf565b5090565b8015158114613111575f80fd5b803563ffffffff81168114613c16575f80fd5b919050565b5f805f60608486031215613c2d575f80fd5b833592506020840135613c3f81613bf6565b9150613c4d60408501613c03565b90509250925092565b5f60208284031215613c66575f80fd5b5035919050565b6001600160a01b0381168114613111575f80fd5b5f80828403610100811215613c94575f80fd5b60e0811215613ca1575f80fd5b5082915060e0830135613cb381613c6d565b809150509250929050565b5f60208284031215613cce575f80fd5b61111f82613c03565b5f8060408385031215613ce8575f80fd5b613cf183613c03565b946020939093013593505050565b80356001600160401b0381168114613c16575f80fd5b5f60208284031215613d25575f80fd5b61111f82613cff565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d6457613d64613d2e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d9257613d92613d2e565b604052919050565b5f6001600160401b03821115613db257613db2613d2e565b50601f01601f191660200190565b5f805f8060808587031215613dd3575f80fd5b8435935060208501359250613dea60408601613cff565b915060608501356001600160401b03811115613e04575f80fd5b8501601f81018713613e14575f80fd5b8035613e27613e2282613d9a565b613d6a565b818152886020838501011115613e3b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e6d575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613efd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561086357805f5260205f20601f840160051c81016020851015613f285750805b601f840160051c820191505b81811015613f47575f8155600101613f34565b5050505050565b81516001600160401b03811115613f6757613f67613d2e565b613f7b81613f758454613ecb565b84613f03565b602080601f831160018114613fae575f8415613f975750858301515b5f19600386901b1c1916600185901b178555614005565b5f85815260208120601f198616915b82811015613fdc57888601518255948401946001909101908401613fbd565b5085821015613ff957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561402757818101518382015260200161400f565b50505f910152565b602081525f825180602084015261404d81604085016020870161400d565b601f01601f19169190910160400192915050565b5f60208284031215614071575f80fd5b5051919050565b5f60208083525f845461408a81613ecb565b806020870152604060018084165f81146140ab57600181146140c7576140f4565b60ff19851660408a0152604084151560051b8a010195506140f4565b895f5260205f205f5b858110156140eb5781548b82018601529083019088016140d0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261412457614124614102565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109c9576109c9613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c1681613bf6565b5f806040838503121561427e575f80fd5b82516001600160401b0380821115614294575f80fd5b90840190606082870312156142a7575f80fd5b6142af613d42565b825181526020808401516142c281613c6d565b828201526040840151838111156142d7575f80fd5b80850194505087601f8501126142eb575f80fd5b835192506142fb613e2284613d9a565b838152888285870101111561430e575f80fd5b61431d8483830184880161400d565b80604084015250819550614332818801614262565b9450505050509250929050565b5f6001600160401b0380831681810361435a5761435a613e90565b6001019392505050565b818103818111156109c9576109c9613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c9576109c9613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b5f82516144a281846020870161400d565b9190910192915050565b5f602082840312156144bc575f80fd5b813561111f81613c6d565b6001600160401b038181168382160280821691908281146144ea576144ea613e90565b505092915050565b5f6001600160401b038084168061450b5761450b614102565b92169190910492915050565b5f60208284031215614527575f80fd5b813560ff8116811461111f575f80fd5b5f60208284031215614547575f80fd5b815161111f81613bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147c23803806147c283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146758061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613ce1565b6102d6565b005b610128610138366004613d1c565b61076a565b61017b61014b366004613d1c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d1c565b6108c6565b6101286101af366004613d47565b610933565b6101c76101c2366004613d1c565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d84565b610a2d565b610128610200366004613d9d565b610d89565b61017b610213366004613ddb565b610f7a565b6101c7610226366004613d1c565b610f93565b610128610239366004613d1c565b610fa7565b61012861024c366004613ce1565b611014565b61017b61025f366004613e86565b61102f565b610128610272366004613d9d565b611054565b61017b610285366004613f22565b6111f4565b610128610298366004613d84565b611207565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d1c565b6113bb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145c983398151915291841561032857610325828561148a565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f42565b600481111561036b5761036b613f42565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f805160206145e98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613f42565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f805160206145e98339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611726565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613f42565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117a1565b905082606001516001600160401b031681608001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f836060015182608001516106679190613f6a565b9050610673868261189c565b5f61067f8785846118d9565b5f8c815260058a016020526040902090915061069b8282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c89085906004016140f5565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107089190614127565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146098339815191529291906107b290613f91565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613f42565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610881919060040161413e565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c19190614127565b505050565b6108cf81611af6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206145c9833981519152916005600160991b019163ee5b48eb916108819160040161413e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611bc9565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a51000836141dc565b92915050565b5f805160206146098339815191525f610a4583611be3565b90505f80610a568360400151611dc4565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aec57610aec613f42565b6005811115610afd57610afd613f42565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b7657610b76613f42565b1480610b945750600182516005811115610b9257610b92613f42565b145b610bf35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c0857610c08613f42565b03610c2f57505f8381526006860160205260408120600491610c2a9190613c72565b610c33565b5060055b6020808301515f90815260088801909152604081205581816005811115610c5c57610c5c613f42565b90816005811115610c6f57610c6f613f42565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca357610ca3613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d5657610d56613f42565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145c98339815191525f610da184611be3565b90505f80610db28360400151611f65565b5091509150610dc0856121a0565b5f8581526004850160205260408120610dd891613c72565b5f610de2836117a1565b9050816001600160401b031681606001516001600160401b03161015610e1a5760405162461bcd60e51b8152600401610447906141ef565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e5f5760405162461bcd60e51b815260040161044790614231565b60015f87815260038701602052604090205460ff166004811115610e8557610e85613f42565b14610eee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a5100061427a565b5f610f9d826117a1565b6080015192915050565b610fb0816121a0565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206145c9833981519152916005600160991b019163ee5b48eb916108819160040161413e565b811561102657611024838261148a565b505b6108c183612279565b5f8061103a8661260a565b9050611048858286866126b7565b9150505b949350505050565b5f805160206145c98339815191525f61106c84611be3565b90505f8061107d8360400151611f65565b509150915061108b85611af6565b5f85815260058501602052604081206110a391613c72565b5f6110ad836117a1565b9050816001600160401b031681606001516001600160401b031610156110e55760405162461bcd60e51b8152600401610447906141ef565b5f8681526003808701602052604090912001546001600160401b03808416911611156111235760405162461bcd60e51b815260040161044790614231565b60035f87815260038701602052604090205460ff16600481111561114957611149613f42565b1461119d5760405162461bcd60e51b815260206004820152603160248201525f805160206145e98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611200833384612aeb565b9392505050565b5f805160206146098339815191525f61121f83611be3565b90505f806112308360400151611dc4565b91509150806112925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112ac90613f91565b90501180156112de575060015f83815260078601602052604090205460ff1660058111156112dc576112dc613f42565b145b6112fa5760405162461bcd60e51b815260040161044790614291565b5f828152600585016020526040812061131291613c72565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061460983398151915292919061140390613f91565b9050118015611435575060015f83815260078301602052604090205460ff16600581111561143357611433613f42565b145b6114515760405162461bcd60e51b815260040161044790614291565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610881919060040161413e565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114fc91908101906142e3565b915091508061155f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190614127565b82511461162a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116a05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116af8460400151612f71565b9150915081871461171c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146498339815191526020526040812060020180545f8051602061460983398151915291600160a01b9091046001600160401b03169081906014611772836143b5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061464983398151915290528390208351918201909352825491925f8051602061460983398151915292829060ff16600581111561182157611821613f42565b600581111561183257611832613f42565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206146498339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611952576119128160016143da565b61191d90600861427a565b5081515f90839083908110611934576119346143ed565b60200101906001600160f81b03191690815f1a9053506001016118fe565b505f5b60048110156119b5576119698160036143da565b61197490600861427a565b6001901c60f81b82611987836002614401565b81518110611997576119976143ed565b60200101906001600160f81b03191690815f1a905350600101611955565b505f5b6020811015611a17576119cc81601f6143da565b6119d790600861427a565b86901c60f81b826119e9836006614401565b815181106119f9576119f96143ed565b60200101906001600160f81b03191690815f1a9053506001016119b8565b505f5b6008811015611a8257611a2e8160076143da565b611a3990600861427a565b6001600160401b038616901c60f81b82611a54836026614401565b81518110611a6457611a646143ed565b60200101906001600160f81b03191690815f1a905350600101611a1a565b505f5b6008811015611aed57611a998160076143da565b611aa490600861427a565b6001600160401b038516901c60f81b82611abf83602e614401565b81518110611acf57611acf6143ed565b60200101906001600160f81b03191690815f1a905350600101611a85565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206145c9833981519152929190611b3e90613f91565b9050118015611b70575060035f83815260038301602052604090205460ff166004811115611b6e57611b6e613f42565b145b611bc55760405162461bcd60e51b815260206004820152603360248201525f805160206145e983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611bd1613149565b611bda82613194565b611bc5816131da565b60408051606080820183525f8083526020830181905292820152905f805160206146098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c7f91908101906142e3565b9150915080611ce65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d495760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611dbc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611de75760405162461bcd60e51b815260040161044790614414565b5f805b6002811015611e3657611dfe8160016143da565b611e0990600861427a565b61ffff16858281518110611e1f57611e1f6143ed565b016020015160f81c901b9190911790600101611dea565b5061ffff811615611e595760405162461bcd60e51b81526004016104479061445d565b5f805b6004811015611eb457611e708160036143da565b611e7b90600861427a565b63ffffffff1686611e8d836002614401565b81518110611e9d57611e9d6143ed565b016020015160f81c901b9190911790600101611e5c565b5063ffffffff8116600214611edb5760405162461bcd60e51b8152600401610447906144a0565b5f805b6020811015611f3057611ef281601f6143da565b611efd90600861427a565b87611f09836006614401565b81518110611f1957611f196143ed565b016020015160f81c901b9190911790600101611ede565b505f86602681518110611f4557611f456143ed565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f895760405162461bcd60e51b815260040161044790614414565b5f805b6002811015611fd857611fa08160016143da565b611fab90600861427a565b61ffff16868281518110611fc157611fc16143ed565b016020015160f81c901b9190911790600101611f8c565b5061ffff811615611ffb5760405162461bcd60e51b81526004016104479061445d565b5f805b6004811015612056576120128160036143da565b61201d90600861427a565b63ffffffff168761202f836002614401565b8151811061203f5761203f6143ed565b016020015160f81c901b9190911790600101611ffe565b5063ffffffff811660031461207d5760405162461bcd60e51b8152600401610447906144a0565b5f805b60208110156120d25761209481601f6143da565b61209f90600861427a565b886120ab836006614401565b815181106120bb576120bb6143ed565b016020015160f81c901b9190911790600101612080565b505f805b6008811015612131576120ea8160076143da565b6120f590600861427a565b6001600160401b03168961210a836026614401565b8151811061211a5761211a6143ed565b016020015160f81c901b91909117906001016120d6565b505f805b6008811015612190576121498160076143da565b61215490600861427a565b6001600160401b03168a61216983602e614401565b81518110612179576121796143ed565b016020015160f81c901b9190911790600101612135565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206145c98339815191529291906121e890613f91565b905011801561221a575060015f83815260038301602052604090205460ff16600481111561221857612218613f42565b145b611bc55760405162461bcd60e51b815260206004820152603860248201525f805160206145e983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f805160206146498339815191526020526040808220815160e0810190925280545f8051602061460983398151915293929190829060ff1660058111156122c6576122c6613f42565b60058111156122d7576122d7613f42565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235157612351613f42565b146123ad5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124275760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b612434816080015161328e565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561247857612478613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61252c8461252681611726565b5f6118d9565b5f85815260068501602052604090209091506125488282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125759085906004016140f5565b6020604051808303815f875af1158015612591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125b59190614127565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145c9833981519152816126238461342f565b90505f61262f82610a17565b83549091506001600160401b0382161080159061265957508260010154816001600160401b031611155b61104c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f6126c0613465565b5f80516020614609833981519152426001600160401b0385161180156126fa57506001600160401b0384166126f8426202a300614401565b115b61275c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856127b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b6128918561328e565b5f806128d86040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061349c565b5f828152600586016020526040902091935091506128f68282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129239085906004016140f5565b6020604051808303815f875af115801561293f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129639190614127565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129dc576129dc613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8583611726565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061104c60015f8051602061462983398151915255565b5f612af4613465565b5f612b016101c28461342f565b90505f805160206145c98339815191525f612b1b876117a1565b9050600281516005811115612b3257612b32613f42565b14612b915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260800151612ba291906144e7565b9050612bae888261189c565b5f612bb889611726565b90505f60028a8a84604051602001612c029392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c1c91614507565b602060405180830381855afa158015612c37573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c5a9190614127565b5f8181526003870160205260409020600201549091506001600160401b031615612ce35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b6064820152608401610447565b612cec8661328e565b5f612cf88b84866118d9565b5f8381526004880160205260409020909150612d148282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d419085906004016140f5565b6020604051808303815f875af1158015612d5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d819190614127565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612e3057612e30613f42565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061120060015f8051602061462983398151915255565b5f808251602e14612f945760405162461bcd60e51b815260040161044790614414565b5f805b6002811015612fe357612fab8160016143da565b612fb690600861427a565b61ffff16858281518110612fcc57612fcc6143ed565b016020015160f81c901b9190911790600101612f97565b5061ffff8116156130065760405162461bcd60e51b81526004016104479061445d565b5f805b60048110156130615761301d8160036143da565b61302890600861427a565b63ffffffff168661303a836002614401565b8151811061304a5761304a6143ed565b016020015160f81c901b9190911790600101613009565b5063ffffffff81166004146130885760405162461bcd60e51b8152600401610447906144a0565b5f805b60208110156130dd5761309f81601f6143da565b6130aa90600861427a565b876130b6836006614401565b815181106130c6576130c66143ed565b016020015160f81c901b919091179060010161308b565b505f805b600881101561313c576130f58160076143da565b61310090600861427a565b6001600160401b031688613115836026614401565b81518110613125576131256143ed565b016020015160f81c901b91909117906001016130e1565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661319257604051631afcd79f60e31b815260040160405180910390fd5b565b61319c613149565b6131a581613854565b6131d7606082013560808301356131c260c0850160a08601613ddb565b6131d260e0860160c08701614522565b613875565b50565b6131e2613149565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661326e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146098339815191529060ff165f036132cc575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061331490836143da565b10613330576001600160401b038416604083015280825261334f565b838260400181815161334291906144e7565b6001600160401b03169052505b5f826020015183604001516064613366919061453d565b6133709190614568565b600285015490915060ff90811690821611156133eb5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138d0565b5f8051602061462983398151915280546001190161349657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561357d5761353d8160016143da565b61354890600861427a565b5081515f9083908390811061355f5761355f6143ed565b60200101906001600160f81b03191690815f1a905350600101613529565b505f5b60048110156135db576135948160036143da565b61359f90600861427a565b505f826135ad836002614401565b815181106135bd576135bd6143ed565b60200101906001600160f81b03191690815f1a905350600101613580565b505f5b602081101561363857845181602081106135fa576135fa6143ed565b1a60f81b8261360a836006614401565b8151811061361a5761361a6143ed565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b6020811015613698578460200151816020811061365a5761365a6143ed565b1a60f81b8261366a836026614401565b8151811061367a5761367a6143ed565b60200101906001600160f81b03191690815f1a90535060010161363b565b505f5b600881101561370c576136af8160076143da565b6136ba90600861427a565b60ff1685604001516001600160401b0316901c60f81b828260466136de9190614401565b815181106136ee576136ee6143ed565b60200101906001600160f81b03191690815f1a90535060010161369b565b505f5b6030811015613777578460800151818151811061372e5761372e6143ed565b01602001516001600160f81b0319168261374983604e614401565b81518110613759576137596143ed565b60200101906001600160f81b03191690815f1a90535060010161370f565b505f5b60088110156137e95761378e8160076143da565b61379990600861427a565b60608601516001600160401b0390811691161c60f81b826137bb83607e614401565b815181106137cb576137cb6143ed565b60200101906001600160f81b03191690815f1a90535060010161377a565b506002816040516137fa9190614507565b602060405180830381855afa158015613815573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138389190614127565b94909350915050565b60015f8051602061462983398151915255565b61385c613149565b613864613a32565b61386c613a42565b6131d781613a4a565b61387d613149565b5f5f805160206145c9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393a9190614127565b90506139516001600160a01b038516333086613ab6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b99190614127565b9050818111613a1f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b613a2982826143da565b95945050505050565b613a3a613149565b613192613b16565b613192613149565b613a52613149565b80355f8051602061460983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a9c606083016040840161458d565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613b10908590613b1e565b50505050565b613841613149565b5f613b326001600160a01b03841683613b7f565b905080515f14158015613b56575080806020019051810190613b5491906145ad565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061120083835f845f80856001600160a01b03168486604051613ba39190614507565b5f6040518083038185875af1925050503d805f8114613bdd576040519150601f19603f3d011682016040523d82523d5f602084013e613be2565b606091505b509150915061171c868383606082613c0257613bfd82613c49565b611200565b8151158015613c1957506001600160a01b0384163b155b15613c4257604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611200565b805115613c595780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c7e90613f91565b5f825580601f10613c8d575050565b601f0160209004905f5260205f20908101906131d791905b80821115613cb8575f8155600101613ca5565b5090565b80151581146131d7575f80fd5b803563ffffffff81168114613cdc575f80fd5b919050565b5f805f60608486031215613cf3575f80fd5b833592506020840135613d0581613cbc565b9150613d1360408501613cc9565b90509250925092565b5f60208284031215613d2c575f80fd5b5035919050565b6001600160a01b03811681146131d7575f80fd5b5f80828403610100811215613d5a575f80fd5b60e0811215613d67575f80fd5b5082915060e0830135613d7981613d33565b809150509250929050565b5f60208284031215613d94575f80fd5b61120082613cc9565b5f8060408385031215613dae575f80fd5b613db783613cc9565b946020939093013593505050565b80356001600160401b0381168114613cdc575f80fd5b5f60208284031215613deb575f80fd5b61120082613dc5565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e2a57613e2a613df4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e5857613e58613df4565b604052919050565b5f6001600160401b03821115613e7857613e78613df4565b50601f01601f191660200190565b5f805f8060808587031215613e99575f80fd5b8435935060208501359250613eb060408601613dc5565b915060608501356001600160401b03811115613eca575f80fd5b8501601f81018713613eda575f80fd5b8035613eed613ee882613e60565b613e30565b818152886020838501011115613f01575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f33575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f8a57613f8a613f56565b5092915050565b600181811c90821680613fa557607f821691505b602082108103613fc357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c81016020851015613fee5750805b601f840160051c820191505b8181101561400d575f8155600101613ffa565b5050505050565b81516001600160401b0381111561402d5761402d613df4565b6140418161403b8454613f91565b84613fc9565b602080601f831160018114614074575f841561405d5750858301515b5f19600386901b1c1916600185901b1785556140cb565b5f85815260208120601f198616915b828110156140a257888601518255948401946001909101908401614083565b50858210156140bf57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ed5781810151838201526020016140d5565b50505f910152565b602081525f82518060208401526141138160408501602087016140d3565b601f01601f19169190910160400192915050565b5f60208284031215614137575f80fd5b5051919050565b5f60208083525f845461415081613f91565b806020870152604060018084165f8114614171576001811461418d576141ba565b60ff19851660408a0152604084151560051b8a010195506141ba565b895f5260205f205f5b858110156141b15781548b8201860152908301908801614196565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141ea576141ea6141c8565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613f56565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613cdc81613cbc565b5f80604083850312156142f4575f80fd5b82516001600160401b038082111561430a575f80fd5b908401906060828703121561431d575f80fd5b614325613e08565b8251815260208084015161433881613d33565b8282015260408401518381111561434d575f80fd5b80850194505087601f850112614361575f80fd5b83519250614371613ee884613e60565b8381528882858701011115614384575f80fd5b614393848383018488016140d3565b806040840152508195506143a88188016142d8565b9450505050509250929050565b5f6001600160401b038083168181036143d0576143d0613f56565b6001019392505050565b81810381811115610a2757610a27613f56565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613f56565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f8a57613f8a613f56565b5f82516145188184602087016140d3565b9190910192915050565b5f60208284031215614532575f80fd5b813561120081613d33565b6001600160401b0381811683821602808216919082811461456057614560613f56565b505092915050565b5f6001600160401b0380841680614581576145816141c8565b92169190910492915050565b5f6020828403121561459d575f80fd5b813560ff81168114611200575f80fd5b5f602082840312156145bd575f80fd5b815161120081613cbc56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -715,31 +715,31 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } // FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -748,23 +748,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat // WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -798,7 +798,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati // ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -877,59 +877,60 @@ func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { // ERC20TokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorAdded struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - DelegatorWeight uint64 - ValidatorWeight uint64 + 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 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, 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 setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } @@ -961,9 +962,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { event := new(ERC20TokenStakingManagerDelegatorAdded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1042,8 +1043,8 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos @@ -1051,23 +1052,23 @@ type ERC20TokenStakingManagerDelegatorRegistered struct { // FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1076,23 +1077,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat // WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1126,7 +1127,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato // ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1205,59 +1206,59 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e // ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - ValidatorWeight uint64 + ValidationID [32]byte Nonce uint64 + ValidatorWeight uint64 EndTime *big.Int + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (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 setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1289,9 +1290,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 560a9b9f6..18d0cd25b 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161435438038061435483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142078061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613890565b610389565b005b348015610134575f80fd5b506101276101433660046138cb565b61046b565b348015610153575f80fd5b50610127610162366004613906565b6108a1565b348015610172575f80fd5b506101b1610181366004613906565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613906565b6109fd565b3480156101ee575f80fd5b506102026101fd366004613906565b610a6a565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b5061012761023436600461391d565b610a80565b348015610244575f80fd5b50610127610253366004613936565b610ddc565b348015610263575f80fd5b506101b1610272366004613974565b610f81565b348015610282575f80fd5b50610202610291366004613906565b610f9a565b3480156102a1575f80fd5b506101276102b0366004613906565b610fae565b3480156102c0575f80fd5b506101276102cf3660046138cb565b61101b565b3480156102df575f80fd5b506101276102ee366004613936565b611036565b3480156102fe575f80fd5b5061012761030d36600461391d565b61119f565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613906565b611353565b6101b1610371366004613906565b611422565b6101b1610384366004613a1f565b61142e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611452565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061417b8339815191529184156104bd576104ba8285611466565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613ab1565b600481111561050057610500613ab1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613ab1565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611702565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613ab1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107148561177d565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b5f836060015182608001516107a09190613ad9565b90506107ac8682611878565b5f6107b88785846118b5565b5f8c815260058a01602052604090209091506107d48282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610801908590600401613c5e565b6020604051808303815f875af115801561081d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108419190613c90565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061419b8339815191529291906108e990613b00565b905011801561091b575060035f83815260078301602052604090205460ff16600581111561091957610919613ab1565b145b61097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190613c90565b505050565b610a0681611ad2565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b5f610a7a64e8d4a5100083613d45565b92915050565b5f8051602061419b8339815191525f610a9883611bb7565b90505f80610aa98360400151611d98565b915091508015610b0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b3f57610b3f613ab1565b6005811115610b5057610b50613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bc957610bc9613ab1565b1480610be75750600182516005811115610be557610be5613ab1565b145b610c465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c5b57610c5b613ab1565b03610c8257505f8381526006860160205260408120600491610c7d9190613846565b610c86565b5060055b6020808301515f90815260088801909152604081205581816005811115610caf57610caf613ab1565b90816005811115610cc257610cc2613ab1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cf657610cf6613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610da957610da9613ab1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061417b8339815191525f610df484611bb7565b90505f80610e058360400151611f39565b5091509150610e1385612174565b5f8581526004850160205260408120610e2b91613846565b5f610e358361177d565b9050816001600160401b031681606001516001600160401b03161015610e6d5760405162461bcd60e51b81526004016105e290613d58565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eb25760405162461bcd60e51b81526004016105e290613d9a565b60015f87815260038701602052604090205460ff166004811115610ed857610ed8613ab1565b14610ef55760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a7a6001600160401b03831664e8d4a51000613e33565b5f610fa48261177d565b6080015192915050565b610fb781612174565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b811561102d5761102b8382611466565b505b6109f883612260565b5f8051602061417b8339815191525f61104e84611bb7565b90505f8061105f8360400151611f39565b509150915061106d85611ad2565b5f858152600585016020526040812061108591613846565b5f61108f8361177d565b9050816001600160401b031681606001516001600160401b031610156110c75760405162461bcd60e51b81526004016105e290613d58565b5f8681526003808701602052604090912001546001600160401b03808416911611156111055760405162461bcd60e51b81526004016105e290613d9a565b60035f87815260038701602052604090205460ff16600481111561112b5761112b613ab1565b146111485760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061419b8339815191525f6111b783611bb7565b90505f806111c88360400151611d98565b915091508061122a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461124490613b00565b9050118015611276575060015f83815260078601602052604090205460ff16600581111561127457611274613ab1565b145b6112925760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058501602052604081206112aa91613846565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419b83398151915292919061139b90613b00565b90501180156113cd575060015f83815260078301602052604090205460ff1660058111156113cb576113cb613ab1565b145b6113e95760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b5f610a7a8233346125f1565b5f8061143934612a6a565b905061144785828686612b14565b9150505b9392505050565b61145a612f48565b61146381612f93565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d89190810190613eb0565b915091508061153b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a29190613c90565b8251146116065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561167c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061168b8460400151612fd6565b915091508187146116f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206141db8339815191526020526040812060020180545f8051602061419b83398151915291600160a01b9091046001600160401b0316908190601461174e83613f82565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206141db83398151915290528390208351918201909352825491925f8051602061419b83398151915292829060ff1660058111156117fd576117fd613ab1565b600581111561180e5761180e613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206141db8339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561192e576118ee816001613fa7565b6118f9906008613e33565b5081515f9083908390811061191057611910613fba565b60200101906001600160f81b03191690815f1a9053506001016118da565b505f5b600481101561199157611945816003613fa7565b611950906008613e33565b6001901c60f81b82611963836002613fce565b8151811061197357611973613fba565b60200101906001600160f81b03191690815f1a905350600101611931565b505f5b60208110156119f3576119a881601f613fa7565b6119b3906008613e33565b86901c60f81b826119c5836006613fce565b815181106119d5576119d5613fba565b60200101906001600160f81b03191690815f1a905350600101611994565b505f5b6008811015611a5e57611a0a816007613fa7565b611a15906008613e33565b6001600160401b038616901c60f81b82611a30836026613fce565b81518110611a4057611a40613fba565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6008811015611ac957611a75816007613fa7565b611a80906008613e33565b6001600160401b038516901c60f81b82611a9b83602e613fce565b81518110611aab57611aab613fba565b60200101906001600160f81b03191690815f1a905350600101611a61565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061417b833981519152929190611b1a90613b00565b9050118015611b4c575060035f83815260038301602052604090205460ff166004811115611b4a57611b4a613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061419b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c2c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c539190810190613eb0565b9150915080611cba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611d1d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611d905760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611dbb5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611e0a57611dd2816001613fa7565b611ddd906008613e33565b61ffff16858281518110611df357611df3613fba565b016020015160f81c901b9190911790600101611dbe565b5061ffff811615611e2d5760405162461bcd60e51b81526004016105e29061402a565b5f805b6004811015611e8857611e44816003613fa7565b611e4f906008613e33565b63ffffffff1686611e61836002613fce565b81518110611e7157611e71613fba565b016020015160f81c901b9190911790600101611e30565b5063ffffffff8116600214611eaf5760405162461bcd60e51b81526004016105e29061406d565b5f805b6020811015611f0457611ec681601f613fa7565b611ed1906008613e33565b87611edd836006613fce565b81518110611eed57611eed613fba565b016020015160f81c901b9190911790600101611eb2565b505f86602681518110611f1957611f19613fba565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f5d5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611fac57611f74816001613fa7565b611f7f906008613e33565b61ffff16868281518110611f9557611f95613fba565b016020015160f81c901b9190911790600101611f60565b5061ffff811615611fcf5760405162461bcd60e51b81526004016105e29061402a565b5f805b600481101561202a57611fe6816003613fa7565b611ff1906008613e33565b63ffffffff1687612003836002613fce565b8151811061201357612013613fba565b016020015160f81c901b9190911790600101611fd2565b5063ffffffff81166003146120515760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156120a65761206881601f613fa7565b612073906008613e33565b8861207f836006613fce565b8151811061208f5761208f613fba565b016020015160f81c901b9190911790600101612054565b505f805b6008811015612105576120be816007613fa7565b6120c9906008613e33565b6001600160401b0316896120de836026613fce565b815181106120ee576120ee613fba565b016020015160f81c901b91909117906001016120aa565b505f805b60088110156121645761211d816007613fa7565b612128906008613e33565b6001600160401b03168a61213d83602e613fce565b8151811061214d5761214d613fba565b016020015160f81c901b9190911790600101612109565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061417b8339815191529291906121bc90613b00565b90501180156121ee575060015f83815260038301602052604090205460ff1660048111156121ec576121ec613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206141db8339815191526020526040808220815160e0810190925280545f8051602061419b83398151915293929190829060ff1660058111156122ad576122ad613ab1565b60058111156122be576122be613ab1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561233857612338613ab1565b146123945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b03161461240e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b61241b81608001516131ae565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561245f5761245f613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125138461250d81611702565b5f6118b5565b5f858152600685016020526040902090915061252f8282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061255c908590600401613c5e565b6020604051808303815f875af1158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190613c90565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6125fa61334f565b5f61260483610a6a565b90505f8051602061417b8339815191525f61261e8761177d565b905060028151600581111561263557612635613ab1565b146126945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b5f8382608001516126a591906140b4565b90506126b18882611878565b5f6126bb89611702565b90505f60028a8a846040516020016127059392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261271f916140d4565b602060405180830381855afa15801561273a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275d9190613c90565b5f8181526003870160205260409020600201549091506001600160401b0316156127e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6127ec866131ae565b5f6127f88b84866118b5565b5f83815260048801602052604090209091506128148282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612841908590600401613c5e565b6020604051808303815f875af115801561285d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128819190613c90565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561293057612930613ab1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061144b60015f805160206141bb83398151915255565b5f5f8051602061417b8339815191528282612a8482610a6a565b83549091506001600160401b03821610801590612aae57508260010154816001600160401b031611155b612b0c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612b1d61334f565b5f8051602061419b833981519152426001600160401b038516118015612b5757506001600160401b038416612b55426202a300613fce565b115b612bb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612c105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612ce55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612cee856131ae565b5f80612d356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613399565b5f82815260058601602052604090209193509150612d538282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d80908590600401613c5e565b6020604051808303815f875af1158015612d9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc09190613c90565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612e3957612e39613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612ee283611702565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b0c60015f805160206141bb83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f9157604051631afcd79f60e31b815260040160405180910390fd5b565b612f9b612f48565b612fa48161373e565b61146360608201356080830135612fc160c0850160a08601613974565b612fd160e0860160c087016140ef565b61375f565b5f808251602e14612ff95760405162461bcd60e51b81526004016105e290613fe1565b5f805b600281101561304857613010816001613fa7565b61301b906008613e33565b61ffff1685828151811061303157613031613fba565b016020015160f81c901b9190911790600101612ffc565b5061ffff81161561306b5760405162461bcd60e51b81526004016105e29061402a565b5f805b60048110156130c657613082816003613fa7565b61308d906008613e33565b63ffffffff168661309f836002613fce565b815181106130af576130af613fba565b016020015160f81c901b919091179060010161306e565b5063ffffffff81166004146130ed5760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156131425761310481601f613fa7565b61310f906008613e33565b8761311b836006613fce565b8151811061312b5761312b613fba565b016020015160f81c901b91909117906001016130f0565b505f805b60088110156131a15761315a816007613fa7565b613165906008613e33565b6001600160401b03168861317a836026613fce565b8151811061318a5761318a613fba565b016020015160f81c901b9190911790600101613146565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061419b8339815191529060ff165f036131ec575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132349083613fa7565b10613250576001600160401b038416604083015280825261326f565b838260400181815161326291906140b4565b6001600160401b03169052505b5f826020015183604001516064613286919061410a565b6132909190614135565b600285015490915060ff908116908216111561330b5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141bb83398151915280546001190161338057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141bb83398151915255565b5f60608260800151516030146134035760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561347a5761343a816001613fa7565b613445906008613e33565b5081515f9083908390811061345c5761345c613fba565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60048110156134d857613491816003613fa7565b61349c906008613e33565b505f826134aa836002613fce565b815181106134ba576134ba613fba565b60200101906001600160f81b03191690815f1a90535060010161347d565b505f5b602081101561353557845181602081106134f7576134f7613fba565b1a60f81b82613507836006613fce565b8151811061351757613517613fba565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b6020811015613595578460200151816020811061355757613557613fba565b1a60f81b82613567836026613fce565b8151811061357757613577613fba565b60200101906001600160f81b03191690815f1a905350600101613538565b505f5b6008811015613609576135ac816007613fa7565b6135b7906008613e33565b60ff1685604001516001600160401b0316901c60f81b828260466135db9190613fce565b815181106135eb576135eb613fba565b60200101906001600160f81b03191690815f1a905350600101613598565b505f5b6030811015613674578460800151818151811061362b5761362b613fba565b01602001516001600160f81b0319168261364683604e613fce565b8151811061365657613656613fba565b60200101906001600160f81b03191690815f1a90535060010161360c565b505f5b60088110156136e65761368b816007613fa7565b613696906008613e33565b60608601516001600160401b0390811691161c60f81b826136b883607e613fce565b815181106136c8576136c8613fba565b60200101906001600160f81b03191690815f1a905350600101613677565b506002816040516136f791906140d4565b602060405180830381855afa158015613712573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137359190613c90565b94909350915050565b613746612f48565b61374e6137ba565b6137566137ca565b611463816137d2565b613767612f48565b5f5f8051602061417b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137c2612f48565b612f9161383e565b612f91612f48565b6137da612f48565b80355f8051602061419b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613824606083016040840161415a565b600291909101805460ff191660ff90921691909117905550565b613386612f48565b50805461385290613b00565b5f825580601f10613861575050565b601f0160209004905f5260205f209081019061146391905b8082111561388c575f8155600101613879565b5090565b5f60e082840312156138a0575f80fd5b50919050565b8015158114611463575f80fd5b803563ffffffff811681146138c6575f80fd5b919050565b5f805f606084860312156138dd575f80fd5b8335925060208401356138ef816138a6565b91506138fd604085016138b3565b90509250925092565b5f60208284031215613916575f80fd5b5035919050565b5f6020828403121561392d575f80fd5b61144b826138b3565b5f8060408385031215613947575f80fd5b613950836138b3565b946020939093013593505050565b80356001600160401b03811681146138c6575f80fd5b5f60208284031215613984575f80fd5b61144b8261395e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139c3576139c361398d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139f1576139f161398d565b604052919050565b5f6001600160401b03821115613a1157613a1161398d565b50601f01601f191660200190565b5f805f60608486031215613a31575f80fd5b83359250613a416020850161395e565b915060408401356001600160401b03811115613a5b575f80fd5b8401601f81018613613a6b575f80fd5b8035613a7e613a79826139f9565b6139c9565b818152876020838501011115613a92575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613af957613af9613ac5565b5092915050565b600181811c90821680613b1457607f821691505b6020821081036138a057634e487b7160e01b5f52602260045260245ffd5b601f8211156109f857805f5260205f20601f840160051c81016020851015613b575750805b601f840160051c820191505b81811015613b76575f8155600101613b63565b5050505050565b81516001600160401b03811115613b9657613b9661398d565b613baa81613ba48454613b00565b84613b32565b602080601f831160018114613bdd575f8415613bc65750858301515b5f19600386901b1c1916600185901b178555613c34565b5f85815260208120601f198616915b82811015613c0b57888601518255948401946001909101908401613bec565b5085821015613c2857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613c56578181015183820152602001613c3e565b50505f910152565b602081525f8251806020840152613c7c816040850160208701613c3c565b601f01601f19169190910160400192915050565b5f60208284031215613ca0575f80fd5b5051919050565b5f60208083525f8454613cb981613b00565b806020870152604060018084165f8114613cda5760018114613cf657613d23565b60ff19851660408a0152604084151560051b8a01019550613d23565b895f5260205f205f5b85811015613d1a5781548b8201860152908301908801613cff565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613d5357613d53613d31565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a7a57610a7a613ac5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611463575f80fd5b80516138c6816138a6565b5f8060408385031215613ec1575f80fd5b82516001600160401b0380821115613ed7575f80fd5b9084019060608287031215613eea575f80fd5b613ef26139a1565b82518152602080840151613f0581613e91565b82820152604084015183811115613f1a575f80fd5b80850194505087601f850112613f2e575f80fd5b83519250613f3e613a79846139f9565b8381528882858701011115613f51575f80fd5b613f6084838301848801613c3c565b80604084015250819550613f75818801613ea5565b9450505050509250929050565b5f6001600160401b03808316818103613f9d57613f9d613ac5565b6001019392505050565b81810381811115610a7a57610a7a613ac5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a7a57610a7a613ac5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613af957613af9613ac5565b5f82516140e5818460208701613c3c565b9190910192915050565b5f602082840312156140ff575f80fd5b813561144b81613e91565b6001600160401b0381811683821602808216919082811461412d5761412d613ac5565b505092915050565b5f6001600160401b038084168061414e5761414e613d31565b92169190910492915050565b5f6020828403121561416a575f80fd5b813560ff8116811461144b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516143ea3803806143ea83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61429d8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613956565b610389565b005b348015610134575f80fd5b50610127610143366004613991565b61046b565b348015610153575f80fd5b506101276101623660046139cc565b6108ff565b348015610172575f80fd5b506101b16101813660046139cc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139cc565b610a5b565b3480156101ee575f80fd5b506102026101fd3660046139cc565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139e3565b610ade565b348015610244575f80fd5b506101276102533660046139fc565b610e3a565b348015610263575f80fd5b506101b1610272366004613a3a565b61102b565b348015610282575f80fd5b506102026102913660046139cc565b611044565b3480156102a1575f80fd5b506101276102b03660046139cc565b611058565b3480156102c0575f80fd5b506101276102cf366004613991565b6110c5565b3480156102df575f80fd5b506101276102ee3660046139fc565b6110e0565b3480156102fe575f80fd5b5061012761030d3660046139e3565b611280565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139cc565b611434565b6101b16103713660046139cc565b611503565b6101b1610384366004613ae5565b61150f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611533565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141f18339815191529184156104bd576104ba8285611547565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b77565b600481111561050057610500613b77565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206142118339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613b77565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206142118339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f610651846117e3565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613b77565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107708561185e565b905082606001516001600160401b031681608001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f836060015182608001516107fc9190613b9f565b90506108088682611959565b5f610814878584611996565b5f8c815260058a01602052604090209091506108308282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613d24565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613d56565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061423183398151915292919061094790613bc6565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613b77565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d6d565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613d56565b505050565b610a6481611bb3565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141f1833981519152916005600160991b019163ee5b48eb91610a1691600401613d6d565b5f610ad864e8d4a5100083613e0b565b92915050565b5f805160206142318339815191525f610af683611c86565b90505f80610b078360400151611e67565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b9d57610b9d613b77565b6005811115610bae57610bae613b77565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610c2757610c27613b77565b1480610c455750600182516005811115610c4357610c43613b77565b145b610ca45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cb957610cb9613b77565b03610ce057505f8381526006860160205260408120600491610cdb919061390c565b610ce4565b5060055b6020808301515f90815260088801909152604081205581816005811115610d0d57610d0d613b77565b90816005811115610d2057610d20613b77565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d5457610d54613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610e0757610e07613b77565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141f18339815191525f610e5284611c86565b90505f80610e638360400151612008565b5091509150610e7185612243565b5f8581526004850160205260408120610e899161390c565b5f610e938361185e565b9050816001600160401b031681606001516001600160401b03161015610ecb5760405162461bcd60e51b81526004016105dc90613e1e565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f105760405162461bcd60e51b81526004016105dc90613e60565b60015f87815260038701602052604090205460ff166004811115610f3657610f36613b77565b14610f9f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613ea9565b5f61104e8261185e565b6080015192915050565b61106181612243565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141f1833981519152916005600160991b019163ee5b48eb91610a1691600401613d6d565b81156110d7576110d58382611547565b505b610a568361231c565b5f805160206141f18339815191525f6110f884611c86565b90505f806111098360400151612008565b509150915061111785611bb3565b5f858152600585016020526040812061112f9161390c565b5f6111398361185e565b9050816001600160401b031681606001516001600160401b031610156111715760405162461bcd60e51b81526004016105dc90613e1e565b5f8681526003808701602052604090912001546001600160401b03808416911611156111af5760405162461bcd60e51b81526004016105dc90613e60565b60035f87815260038701602052604090205460ff1660048111156111d5576111d5613b77565b146112295760405162461bcd60e51b815260206004820152603160248201525f805160206142118339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142318339815191525f61129883611c86565b90505f806112a98360400151611e67565b915091508061130b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461132590613bc6565b9050118015611357575060015f83815260078601602052604090205460ff16600581111561135557611355613b77565b145b6113735760405162461bcd60e51b81526004016105dc90613ec0565b5f828152600585016020526040812061138b9161390c565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061423183398151915292919061147c90613bc6565b90501180156114ae575060015f83815260078301602052604090205460ff1660058111156114ac576114ac613b77565b145b6114ca5760405162461bcd60e51b81526004016105dc90613ec0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d6d565b5f610ad88233346126ad565b5f8061151a34612b30565b905061152885828686612bda565b9150505b9392505050565b61153b61300e565b61154481613059565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611592573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115b99190810190613f26565b915091508061161c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116839190613d56565b8251146116e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561175d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061176c846040015161309c565b915091508187146117d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206142718339815191526020526040812060020180545f8051602061423183398151915291600160a01b9091046001600160401b0316908190601461182f83613ff8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061427183398151915290528390208351918201909352825491925f8051602061423183398151915292829060ff1660058111156118de576118de613b77565b60058111156118ef576118ef613b77565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206142718339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a0f576119cf81600161401d565b6119da906008613ea9565b5081515f908390839081106119f1576119f1614030565b60200101906001600160f81b03191690815f1a9053506001016119bb565b505f5b6004811015611a7257611a2681600361401d565b611a31906008613ea9565b6001901c60f81b82611a44836002614044565b81518110611a5457611a54614030565b60200101906001600160f81b03191690815f1a905350600101611a12565b505f5b6020811015611ad457611a8981601f61401d565b611a94906008613ea9565b86901c60f81b82611aa6836006614044565b81518110611ab657611ab6614030565b60200101906001600160f81b03191690815f1a905350600101611a75565b505f5b6008811015611b3f57611aeb81600761401d565b611af6906008613ea9565b6001600160401b038616901c60f81b82611b11836026614044565b81518110611b2157611b21614030565b60200101906001600160f81b03191690815f1a905350600101611ad7565b505f5b6008811015611baa57611b5681600761401d565b611b61906008613ea9565b6001600160401b038516901c60f81b82611b7c83602e614044565b81518110611b8c57611b8c614030565b60200101906001600160f81b03191690815f1a905350600101611b42565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141f1833981519152929190611bfb90613bc6565b9050118015611c2d575060035f83815260038301602052604090205460ff166004811115611c2b57611c2b613b77565b145b611c825760405162461bcd60e51b815260206004820152603360248201525f8051602061421183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142318339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cfb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d229190810190613f26565b9150915080611d895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611dec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611e5f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611e8a5760405162461bcd60e51b81526004016105dc90614057565b5f805b6002811015611ed957611ea181600161401d565b611eac906008613ea9565b61ffff16858281518110611ec257611ec2614030565b016020015160f81c901b9190911790600101611e8d565b5061ffff811615611efc5760405162461bcd60e51b81526004016105dc906140a0565b5f805b6004811015611f5757611f1381600361401d565b611f1e906008613ea9565b63ffffffff1686611f30836002614044565b81518110611f4057611f40614030565b016020015160f81c901b9190911790600101611eff565b5063ffffffff8116600214611f7e5760405162461bcd60e51b81526004016105dc906140e3565b5f805b6020811015611fd357611f9581601f61401d565b611fa0906008613ea9565b87611fac836006614044565b81518110611fbc57611fbc614030565b016020015160f81c901b9190911790600101611f81565b505f86602681518110611fe857611fe8614030565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461202c5760405162461bcd60e51b81526004016105dc90614057565b5f805b600281101561207b5761204381600161401d565b61204e906008613ea9565b61ffff1686828151811061206457612064614030565b016020015160f81c901b919091179060010161202f565b5061ffff81161561209e5760405162461bcd60e51b81526004016105dc906140a0565b5f805b60048110156120f9576120b581600361401d565b6120c0906008613ea9565b63ffffffff16876120d2836002614044565b815181106120e2576120e2614030565b016020015160f81c901b91909117906001016120a1565b5063ffffffff81166003146121205760405162461bcd60e51b81526004016105dc906140e3565b5f805b60208110156121755761213781601f61401d565b612142906008613ea9565b8861214e836006614044565b8151811061215e5761215e614030565b016020015160f81c901b9190911790600101612123565b505f805b60088110156121d45761218d81600761401d565b612198906008613ea9565b6001600160401b0316896121ad836026614044565b815181106121bd576121bd614030565b016020015160f81c901b9190911790600101612179565b505f805b6008811015612233576121ec81600761401d565b6121f7906008613ea9565b6001600160401b03168a61220c83602e614044565b8151811061221c5761221c614030565b016020015160f81c901b91909117906001016121d8565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141f183398151915292919061228b90613bc6565b90501180156122bd575060015f83815260038301602052604090205460ff1660048111156122bb576122bb613b77565b145b611c825760405162461bcd60e51b815260206004820152603860248201525f8051602061421183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f805160206142718339815191526020526040808220815160e0810190925280545f8051602061423183398151915293929190829060ff16600581111561236957612369613b77565b600581111561237a5761237a613b77565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123f4576123f4613b77565b146124505760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146124ca5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6124d78160800151613274565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561251b5761251b613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125cf846125c9816117e3565b5f611996565b5f85815260068501602052604090209091506125eb8282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612618908590600401613d24565b6020604051808303815f875af1158015612634573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126589190613d56565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126b6613415565b5f6126c083610ac8565b90505f805160206141f18339815191525f6126da8761185e565b90506002815160058111156126f1576126f1613b77565b146127505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260800151612761919061412a565b905061276d8882611959565b5f612777896117e3565b90505f60028a8a846040516020016127c19392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127db9161414a565b602060405180830381855afa1580156127f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128199190613d56565b5f8181526003870160205260409020600201549091506001600160401b0316156128a25760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b60648201526084016105dc565b6128ab86613274565b5f6128b78b8486611996565b5f83815260048801602052604090209091506128d38282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612900908590600401613d24565b6020604051808303815f875af115801561291c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129409190613d56565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156129ef576129ef613b77565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061152c60015f8051602061425183398151915255565b5f5f805160206141f18339815191528282612b4a82610ac8565b83549091506001600160401b03821610801590612b7457508260010154816001600160401b031611155b612bd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612be3613415565b5f80516020614231833981519152426001600160401b038516118015612c1d57506001600160401b038416612c1b426202a300614044565b115b612c7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612cd65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612d445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612dab5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612db485613274565b5f80612dfb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061345f565b5f82815260058601602052604090209193509150612e198282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e46908590600401613d24565b6020604051808303815f875af1158015612e62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e869190613d56565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eff57612eff613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612fa8836117e3565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bd260015f8051602061425183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661305757604051631afcd79f60e31b815260040160405180910390fd5b565b61306161300e565b61306a81613804565b6115446060820135608083013561308760c0850160a08601613a3a565b61309760e0860160c08701614165565b613825565b5f808251602e146130bf5760405162461bcd60e51b81526004016105dc90614057565b5f805b600281101561310e576130d681600161401d565b6130e1906008613ea9565b61ffff168582815181106130f7576130f7614030565b016020015160f81c901b91909117906001016130c2565b5061ffff8116156131315760405162461bcd60e51b81526004016105dc906140a0565b5f805b600481101561318c5761314881600361401d565b613153906008613ea9565b63ffffffff1686613165836002614044565b8151811061317557613175614030565b016020015160f81c901b9190911790600101613134565b5063ffffffff81166004146131b35760405162461bcd60e51b81526004016105dc906140e3565b5f805b6020811015613208576131ca81601f61401d565b6131d5906008613ea9565b876131e1836006614044565b815181106131f1576131f1614030565b016020015160f81c901b91909117906001016131b6565b505f805b60088110156132675761322081600761401d565b61322b906008613ea9565b6001600160401b031688613240836026614044565b8151811061325057613250614030565b016020015160f81c901b919091179060010161320c565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142318339815191529060ff165f036132b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132fa908361401d565b10613316576001600160401b0384166040830152808252613335565b8382604001818151613328919061412a565b6001600160401b03169052505b5f82602001518360400151606461334c9190614180565b61335691906141ab565b600285015490915060ff90811690821611156133d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061425183398151915280546001190161344657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061425183398151915255565b5f60608260800151516030146134c95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135405761350081600161401d565b61350b906008613ea9565b5081515f9083908390811061352257613522614030565b60200101906001600160f81b03191690815f1a9053506001016134ec565b505f5b600481101561359e5761355781600361401d565b613562906008613ea9565b505f82613570836002614044565b8151811061358057613580614030565b60200101906001600160f81b03191690815f1a905350600101613543565b505f5b60208110156135fb57845181602081106135bd576135bd614030565b1a60f81b826135cd836006614044565b815181106135dd576135dd614030565b60200101906001600160f81b03191690815f1a9053506001016135a1565b505f5b602081101561365b578460200151816020811061361d5761361d614030565b1a60f81b8261362d836026614044565b8151811061363d5761363d614030565b60200101906001600160f81b03191690815f1a9053506001016135fe565b505f5b60088110156136cf5761367281600761401d565b61367d906008613ea9565b60ff1685604001516001600160401b0316901c60f81b828260466136a19190614044565b815181106136b1576136b1614030565b60200101906001600160f81b03191690815f1a90535060010161365e565b505f5b603081101561373a57846080015181815181106136f1576136f1614030565b01602001516001600160f81b0319168261370c83604e614044565b8151811061371c5761371c614030565b60200101906001600160f81b03191690815f1a9053506001016136d2565b505f5b60088110156137ac5761375181600761401d565b61375c906008613ea9565b60608601516001600160401b0390811691161c60f81b8261377e83607e614044565b8151811061378e5761378e614030565b60200101906001600160f81b03191690815f1a90535060010161373d565b506002816040516137bd919061414a565b602060405180830381855afa1580156137d8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137fb9190613d56565b94909350915050565b61380c61300e565b613814613880565b61381c613890565b61154481613898565b61382d61300e565b5f5f805160206141f1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61388861300e565b613057613904565b61305761300e565b6138a061300e565b80355f8051602061423183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138ea60608301604084016141d0565b600291909101805460ff191660ff90921691909117905550565b61344c61300e565b50805461391890613bc6565b5f825580601f10613927575050565b601f0160209004905f5260205f209081019061154491905b80821115613952575f815560010161393f565b5090565b5f60e08284031215613966575f80fd5b50919050565b8015158114611544575f80fd5b803563ffffffff8116811461398c575f80fd5b919050565b5f805f606084860312156139a3575f80fd5b8335925060208401356139b58161396c565b91506139c360408501613979565b90509250925092565b5f602082840312156139dc575f80fd5b5035919050565b5f602082840312156139f3575f80fd5b61152c82613979565b5f8060408385031215613a0d575f80fd5b613a1683613979565b946020939093013593505050565b80356001600160401b038116811461398c575f80fd5b5f60208284031215613a4a575f80fd5b61152c82613a24565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a8957613a89613a53565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ab757613ab7613a53565b604052919050565b5f6001600160401b03821115613ad757613ad7613a53565b50601f01601f191660200190565b5f805f60608486031215613af7575f80fd5b83359250613b0760208501613a24565b915060408401356001600160401b03811115613b21575f80fd5b8401601f81018613613b31575f80fd5b8035613b44613b3f82613abf565b613a8f565b818152876020838501011115613b58575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bbf57613bbf613b8b565b5092915050565b600181811c90821680613bda57607f821691505b60208210810361396657634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613c1d5750805b601f840160051c820191505b81811015613c3c575f8155600101613c29565b5050505050565b81516001600160401b03811115613c5c57613c5c613a53565b613c7081613c6a8454613bc6565b84613bf8565b602080601f831160018114613ca3575f8415613c8c5750858301515b5f19600386901b1c1916600185901b178555613cfa565b5f85815260208120601f198616915b82811015613cd157888601518255948401946001909101908401613cb2565b5085821015613cee57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d1c578181015183820152602001613d04565b50505f910152565b602081525f8251806020840152613d42816040850160208701613d02565b601f01601f19169190910160400192915050565b5f60208284031215613d66575f80fd5b5051919050565b5f60208083525f8454613d7f81613bc6565b806020870152604060018084165f8114613da05760018114613dbc57613de9565b60ff19851660408a0152604084151560051b8a01019550613de9565b895f5260205f205f5b85811015613de05781548b8201860152908301908801613dc5565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e1957613e19613df7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613b8b565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611544575f80fd5b805161398c8161396c565b5f8060408385031215613f37575f80fd5b82516001600160401b0380821115613f4d575f80fd5b9084019060608287031215613f60575f80fd5b613f68613a67565b82518152602080840151613f7b81613f07565b82820152604084015183811115613f90575f80fd5b80850194505087601f850112613fa4575f80fd5b83519250613fb4613b3f84613abf565b8381528882858701011115613fc7575f80fd5b613fd684838301848801613d02565b80604084015250819550613feb818801613f1b565b9450505050509250929050565b5f6001600160401b0380831681810361401357614013613b8b565b6001019392505050565b81810381811115610ad857610ad8613b8b565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613b8b565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bbf57613bbf613b8b565b5f825161415b818460208701613d02565b9190910192915050565b5f60208284031215614175575f80fd5b813561152c81613f07565b6001600160401b038181168382160280821691908281146141a3576141a3613b8b565b505092915050565b5f6001600160401b03808416806141c4576141c4613df7565b92169190910492915050565b5f602082840312156141e0575f80fd5b813560ff8116811461152c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -715,31 +715,31 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } // FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -748,23 +748,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg // WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -798,7 +798,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega // ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -877,59 +877,60 @@ func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { // NativeTokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorAdded struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - DelegatorWeight uint64 - ValidatorWeight uint64 + 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 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, 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 setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } @@ -961,9 +962,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { event := new(NativeTokenStakingManagerDelegatorAdded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1042,8 +1043,8 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos @@ -1051,23 +1052,23 @@ type NativeTokenStakingManagerDelegatorRegistered struct { // FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1076,23 +1077,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg // WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + 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 := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1126,7 +1127,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega // ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1205,59 +1206,59 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() // NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - ValidatorWeight uint64 + ValidationID [32]byte Nonce uint64 + ValidatorWeight uint64 EndTime *big.Int + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (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 setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1289,9 +1290,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index cb915ea92..c16fae9df 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -145,7 +145,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint256 delegationAmount ) internal nonReentrant returns (bytes32) { uint64 weight = valueToWeight(_lock(delegationAmount)); @@ -161,12 +161,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidatorWeight(validationID, newValidatorWeight); uint64 nonce = _getAndIncrementNonce(validationID); - bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); + bytes32 delegationID = sha256(abi.encodePacked(validationID, delegatorAddress, nonce)); - // Ensure the delegator is not already registered + // Ensure the delegationID is not already registered require( $._delegatorStakes[delegationID].weight == 0, - "PoSValidatorManager: delegator already registered" + "PoSValidatorManager: delegationID already registered" ); _checkAndUpdateChurnTracker(weight); @@ -177,10 +177,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); - // Store the delegator information + // Store the delegation information $._delegatorStakes[delegationID] = Delegator({ status: DelegatorStatus.PendingAdded, - owner: delegator, + owner: delegatorAddress, validationID: validationID, weight: weight, startedAt: 0, @@ -190,12 +190,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager }); emit DelegatorAdded({ - validationID: validationID, - setWeightMessageID: messageID, delegationID: delegationID, - delegatorWeight: weight, + validationID: validationID, + delegatorAddress: delegatorAddress, + nonce: nonce, validatorWeight: newValidatorWeight, - nonce: nonce + delegatorWeight: weight, + setWeightMessageID: messageID }); return delegationID; } @@ -221,7 +222,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // It should also be greater than or equal to the delegator's starting nonce + // It should also be greater than or equal to the delegationID's starting nonce require( $._delegatorStakes[delegationID].startingNonce <= nonce, "PoSValidatorManager: nonce does not match" @@ -229,14 +230,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegator not pending added" + "PoSValidatorManager: delegationID not pending added" ); - // Update the delegator status + // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); emit DelegatorRegistered({ - validationID: validationID, delegationID: delegationID, + validationID: validationID, nonce: nonce, startTime: block.timestamp }); @@ -263,7 +264,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); require( - delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" + delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); uint64 nonce = _getAndIncrementNonce(validationID); delegator.status = DelegatorStatus.PendingRemoved; @@ -284,12 +285,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); emit DelegatorRemovalInitialized({ - validationID: validationID, - setWeightMessageID: messageID, delegationID: delegationID, - validatorWeight: newValidatorWeight, + validationID: validationID, nonce: nonce, - endTime: block.timestamp + validatorWeight: newValidatorWeight, + endTime: block.timestamp, + setWeightMessageID: messageID }); } @@ -320,7 +321,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegator not pending added" + "PoSValidatorManager: delegation not pending added" ); // Update the delegator status @@ -328,7 +329,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // TODO: Unlock the delegator's stake and their reward - emit DelegationEnded(validationID, delegationID, nonce); + emit DelegationEnded(delegationID, validationID, nonce); } function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { @@ -336,7 +337,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._pendingEndDelegatorMessages[delegationID].length > 0 && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegator removal not pending" + "PoSValidatorManager: delegation removal not pending" ); } @@ -345,7 +346,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._pendingRegisterDelegatorMessages[delegationID].length > 0 && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegator registration not pending" + "PoSValidatorManager: delegation registration not pending" ); } } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 09b1c3e9f..aae3b8b3b 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -36,65 +36,63 @@ struct Delegator { } interface IPoSValidatorManager is IValidatorManager { - // TODO: Decide what to include in the events. /** * @notice Event emitted when a delegator registration is initiated - * @param validationID The ID of the validation period - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegationID The ID of the delegation - * @param delegatorWeight The weight of the delegator - * @param validatorWeight The updated validator weight that is sent to the P-Chain + * @param validationID The ID of the validation period + * @param delegatorAddress The address of the delegator * @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 delegatorWeight The weight of the delegator + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain */ event DelegatorAdded( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, - uint64 delegatorWeight, + bytes32 indexed validationID, + address indexed delegatorAddress, + uint64 nonce, uint64 validatorWeight, - uint64 nonce + uint64 delegatorWeight, + bytes32 setWeightMessageID ); /** * @notice Event emitted when a delegator registration is completed - * @param validationID The ID of the validation period * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( - bytes32 indexed validationID, bytes32 indexed delegationID, + bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime ); /** * @notice Event emitted when delegator removal is initiated - * @param validationID The ID of the validation period - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegationID The ID of the delegation - * @param validatorWeight The updated validator weight that is sent to the P-Chain * @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 endTime The time at which the removal was initiated + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain */ event DelegatorRemovalInitialized( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, uint64 validatorWeight, - uint64 nonce, - uint256 endTime + uint256 endTime, + bytes32 setWeightMessageID ); /** * @notice Event emitted when delegator removal is completed - * @param validationID The ID of the validation period * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce + bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); /** diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 6e2904024..dd8f8bdbd 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -58,11 +58,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); - vm.startPrank(delegator); + vm.startPrank(delegatorAddress); bytes32 delegationID = app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); return delegationID; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index fcb2292d7..cd97aee36 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -51,12 +51,12 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); - vm.prank(delegator); - vm.deal(delegator, value); + vm.prank(delegatorAddress); + vm.deal(delegatorAddress, value); return app.initializeDelegatorRegistration{value: value}(validationID); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1607c81b3..1fe85d75c 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -25,32 +25,33 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; event DelegatorAdded( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, - uint64 delegatorWeight, + bytes32 indexed validationID, + address indexed delegatorAddress, + uint64 nonce, uint64 validatorWeight, - uint64 nonce + uint64 delegatorWeight, + bytes32 setWeightMessageID ); event DelegatorRegistered( - bytes32 indexed validationID, bytes32 indexed delegationID, + bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime ); event DelegatorRemovalInitialized( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, uint64 validatorWeight, - uint64 nonce, - uint256 endTime + uint256 endTime, + bytes32 setWeightMessageID ); event DelegationEnded( - bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce + bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); function testInvalidUptimeWarpMessage() public { @@ -157,7 +158,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -176,7 +177,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -201,7 +202,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -229,7 +230,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -238,7 +239,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -272,7 +273,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -281,7 +282,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -309,7 +310,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -324,7 +325,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -343,7 +344,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -358,7 +359,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -381,7 +382,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -396,7 +397,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -418,7 +419,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -434,7 +435,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -452,7 +453,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -460,7 +461,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -492,7 +493,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -508,7 +509,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -526,7 +527,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -534,7 +535,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -571,7 +572,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual returns (bytes32); @@ -580,7 +581,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // function _setUpInitializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight, uint64 registrationTimestamp, uint64 expectedValidatorWeight, @@ -591,19 +592,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); - _beforeSend(weight, delegator); + _beforeSend(weight, delegatorAddress); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ + delegationID: sha256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), validationID: validationID, - setWeightMessageID: bytes32(0), - delegationID: sha256(abi.encodePacked(validationID, delegator, expectedNonce)), - delegatorWeight: weight, + delegatorAddress: delegatorAddress, + nonce: expectedNonce, validatorWeight: expectedValidatorWeight, - nonce: expectedNonce + delegatorWeight: weight, + setWeightMessageID: bytes32(0) }); - return _initializeDelegatorRegistration(validationID, delegator, weight); + return _initializeDelegatorRegistration(validationID, delegatorAddress, weight); } function _setUpCompleteDelegatorRegistration( @@ -622,8 +624,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(completeRegistrationTimestamp); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRegistered({ - validationID: validationID, delegationID: delegationID, + validationID: validationID, nonce: expectedNonce, startTime: completeRegistrationTimestamp }); @@ -633,7 +635,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpInitializeEndDelegation( bytes32 validationID, - address delegator, + address delegatorAddress, bytes32 delegationID, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, @@ -646,14 +648,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRemovalInitialized({ - validationID: validationID, - setWeightMessageID: bytes32(0), delegationID: delegationID, - validatorWeight: expectedValidatorWeight, + validationID: validationID, nonce: expectedNonce, - endTime: endDelegationTimestamp + validatorWeight: expectedValidatorWeight, + endTime: endDelegationTimestamp, + setWeightMessageID: bytes32(0) }); - vm.prank(delegator); + vm.prank(delegatorAddress); posValidatorManager.initializeEndDelegation(delegationID, false, 0); return delegationID; } @@ -671,7 +673,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegationID, expectedNonce); + emit DelegationEnded(delegationID, validationID, expectedNonce); posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); return delegationID; From 0a4ae92f2bc841ace1ac58c23ee8a81be2027b3d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 11:32:12 -0500 Subject: [PATCH 7/9] fix e2e --- tests/flows/staking/erc20_delegation.go | 21 ++++++++++++++------- tests/flows/staking/native_delegation.go | 21 ++++++++++++++------- tests/utils/staking.go | 24 ++++++++++++------------ 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 8ab39c331..9f8c7485f 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -28,7 +28,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -115,6 +115,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // // Register a delegator // + var delegationID ids.ID { delegatorStake := big.NewInt(1e17) delegatorWeight, err := stakingManager.ValueToWeight( @@ -135,6 +136,12 @@ func ERC20Delegation(network interfaces.LocalNetwork) { stakingManagerAddress, stakingManager, ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -162,7 +169,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteERC20DelegatorRegistration( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, registrationSignedMessage, @@ -174,7 +181,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } // // Delist the delegator @@ -185,7 +192,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { fundedKey, subnetAInfo, stakingManager, - validationID, + delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, @@ -193,7 +200,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -217,7 +224,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndERC20Delegation( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, signedMessage, @@ -230,6 +237,6 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } } diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index a322f000d..2dc915c5c 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -28,7 +28,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -112,6 +112,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // // Register a delegator // + var delegationID ids.ID { delegatorStake := big.NewInt(1e17) delegatorWeight, err := stakingManager.ValueToWeight( @@ -131,6 +132,12 @@ func NativeDelegation(network interfaces.LocalNetwork) { stakingManagerAddress, stakingManager, ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -158,7 +165,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteNativeDelegatorRegistration( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, registrationSignedMessage, @@ -170,7 +177,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } // // Delist the delegator @@ -181,7 +188,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { fundedKey, subnetAInfo, stakingManager, - validationID, + delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, @@ -189,7 +196,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -213,7 +220,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndNativeDelegation( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, signedMessage, @@ -226,6 +233,6 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } } diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 2a90b4819..31dde39f1 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -716,14 +716,14 @@ func InitializeERC20DelegatorRegistration( func CompleteERC20DelegatorRegistration( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -738,13 +738,13 @@ func InitializeEndERC20Delegation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - validationID ids.ID, + delegationID ids.ID, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, - validationID, + delegationID, false, 0, ) @@ -754,14 +754,14 @@ func InitializeEndERC20Delegation( func CompleteEndERC20Delegation( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -799,14 +799,14 @@ func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, func CompleteNativeDelegatorRegistration( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -821,13 +821,13 @@ func InitializeEndNativeDelegation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, - validationID ids.ID, + delegationID ids.ID, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, - validationID, + delegationID, false, 0, ) @@ -837,14 +837,14 @@ func InitializeEndNativeDelegation( func CompleteEndNativeDelegation( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, From e9db5269172d7b1b0300a479fa58c4093d938e23 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 14:06:18 -0500 Subject: [PATCH 8/9] update mapping descriptions --- contracts/staking/PoSValidatorManager.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index c16fae9df..50ade4f1d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,11 +28,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; - /// @notice Maps the validationID to a mapping of delegator address to delegator information. + /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. + /// @notice Maps the delegationID to pending register delegator messages. mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; - /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. + /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore From aed4ed7c7941ce23fc8345c56020b1d66292efa0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 14:28:59 -0500 Subject: [PATCH 9/9] delegationID w/keccak; remove unnecessary check --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 10 +++------- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index bf8803839..d57c7ca9f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161485438038061485483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147078061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d73565b6102d6565b005b610128610138366004613dae565b61076a565b61017b61014b366004613dae565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613dae565b6108c6565b6101286101af366004613dd9565b610933565b6101c76101c2366004613dae565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e16565b610a2d565b610128610200366004613e2f565b610db0565b61017b610213366004613e6d565b610fa1565b6101c7610226366004613dae565b610fba565b610128610239366004613dae565b610fce565b61012861024c366004613d73565b61103b565b61017b61025f366004613f18565b611056565b610128610272366004613e2f565b61107b565b61017b610285366004613fb4565b61121b565b610128610298366004613e16565b61122e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613dae565b6113eb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061465b8339815191529184156103285761032582856114ba565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fd4565b600481111561036b5761036b613fd4565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f8051602061467b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613fd4565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f8051602061467b8339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611756565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613fd4565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117ca565b905082606001516001600160401b03168160a001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f83606001518260a001516106679190613ffc565b905061067386826118db565b5f61067f878584611923565b5f8c815260058a016020526040902090915061069b82826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c8908590600401614187565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906141b9565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061469b8339815191529291906107b290614023565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613fd4565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088191906004016141d0565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c191906141b9565b505050565b6108cf81611b40565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061465b833981519152916005600160991b019163ee5b48eb91610881916004016141d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611c13565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a510008361426e565b92915050565b5f8051602061469b8339815191525f610a4583611c2d565b90505f80610a568360400151611e0e565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610aed57610aed613fd4565b6005811115610afe57610afe613fd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b8557610b85613fd4565b1480610ba35750600182516005811115610ba157610ba1613fd4565b145b610c025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c1757610c17613fd4565b03610c3e57505f8381526006860160205260408120600491610c399190613d04565b610c42565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6b57610c6b613fd4565b90816005811115610c7e57610c7e613fd4565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cb257610cb2613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7d57610d7d613fd4565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061465b8339815191525f610dc884611c2d565b90505f80610dd98360400151611faf565b5091509150610de7856121ea565b5f8581526004850160205260408120610dff91613d04565b5f610e09836117ca565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b815260040161044790614281565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e865760405162461bcd60e51b8152600401610447906142c3565b60015f87815260038701602052604090205460ff166004811115610eac57610eac613fd4565b14610f155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a5100061430c565b5f610fc4826117ca565b60a0015192915050565b610fd7816121ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061465b833981519152916005600160991b019163ee5b48eb91610881916004016141d0565b811561104d5761104b83826114ba565b505b6108c1836122c3565b5f806110618661267b565b905061106f85828686612728565b9150505b949350505050565b5f8051602061465b8339815191525f61109384611c2d565b90505f806110a48360400151611faf565b50915091506110b285611b40565b5f85815260058501602052604081206110ca91613d04565b5f6110d4836117ca565b9050816001600160401b031681608001516001600160401b0316101561110c5760405162461bcd60e51b815260040161044790614281565b5f8681526003808701602052604090912001546001600160401b038084169116111561114a5760405162461bcd60e51b8152600401610447906142c3565b60035f87815260038701602052604090205460ff16600481111561117057611170613fd4565b146111c45760405162461bcd60e51b815260206004820152603160248201525f8051602061467b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611227833384612b7d565b9392505050565b5f8051602061469b8339815191525f61124683611c2d565b90505f806112578360400151611e0e565b91509150806112b95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112d390614023565b9050118015611305575060015f83815260078601602052604090205460ff16600581111561130357611303613fd4565b145b6113215760405162461bcd60e51b815260040161044790614323565b5f828152600585016020526040812061133991613d04565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061469b83398151915292919061143390614023565b9050118015611465575060015f83815260078301602052604090205460ff16600581111561146357611463613fd4565b145b6114815760405162461bcd60e51b815260040161044790614323565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088191906004016141d0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152c9190810190614375565b915091508061158f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f691906141b9565b82511461165a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116d05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116df8460400151613003565b9150915081871461174c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146db8339815191526020526040812060030180545f8051602061469b833981519152916001600160401b039091169081908461179b83614447565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206146db83398151915290528390208351918201909352825491925f8051602061469b83398151915292829060ff16600581111561185257611852613fd4565b600581111561186357611863613fd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146db833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199c5761195c81600161446c565b61196790600861430c565b5081515f9083908390811061197e5761197e61447f565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b60048110156119ff576119b381600361446c565b6119be90600861430c565b6001901c60f81b826119d1836002614493565b815181106119e1576119e161447f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6020811015611a6157611a1681601f61446c565b611a2190600861430c565b86901c60f81b82611a33836006614493565b81518110611a4357611a4361447f565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611acc57611a7881600761446c565b611a8390600861430c565b6001600160401b038616901c60f81b82611a9e836026614493565b81518110611aae57611aae61447f565b60200101906001600160f81b03191690815f1a905350600101611a64565b505f5b6008811015611b3757611ae381600761446c565b611aee90600861430c565b6001600160401b038516901c60f81b82611b0983602e614493565b81518110611b1957611b1961447f565b60200101906001600160f81b03191690815f1a905350600101611acf565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061465b833981519152929190611b8890614023565b9050118015611bba575060035f83815260038301602052604090205460ff166004811115611bb857611bb8613fd4565b145b611c0f5760405162461bcd60e51b815260206004820152603360248201525f8051602061467b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611c1b6131db565b611c2482613226565b611c0f8161326c565b60408051606080820183525f8083526020830181905292820152905f8051602061469b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc99190810190614375565b9150915080611d305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611e065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611e315760405162461bcd60e51b8152600401610447906144a6565b5f805b6002811015611e8057611e4881600161446c565b611e5390600861430c565b61ffff16858281518110611e6957611e6961447f565b016020015160f81c901b9190911790600101611e34565b5061ffff811615611ea35760405162461bcd60e51b8152600401610447906144ef565b5f805b6004811015611efe57611eba81600361446c565b611ec590600861430c565b63ffffffff1686611ed7836002614493565b81518110611ee757611ee761447f565b016020015160f81c901b9190911790600101611ea6565b5063ffffffff8116600214611f255760405162461bcd60e51b815260040161044790614532565b5f805b6020811015611f7a57611f3c81601f61446c565b611f4790600861430c565b87611f53836006614493565b81518110611f6357611f6361447f565b016020015160f81c901b9190911790600101611f28565b505f86602681518110611f8f57611f8f61447f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd35760405162461bcd60e51b8152600401610447906144a6565b5f805b600281101561202257611fea81600161446c565b611ff590600861430c565b61ffff1686828151811061200b5761200b61447f565b016020015160f81c901b9190911790600101611fd6565b5061ffff8116156120455760405162461bcd60e51b8152600401610447906144ef565b5f805b60048110156120a05761205c81600361446c565b61206790600861430c565b63ffffffff1687612079836002614493565b815181106120895761208961447f565b016020015160f81c901b9190911790600101612048565b5063ffffffff81166003146120c75760405162461bcd60e51b815260040161044790614532565b5f805b602081101561211c576120de81601f61446c565b6120e990600861430c565b886120f5836006614493565b815181106121055761210561447f565b016020015160f81c901b91909117906001016120ca565b505f805b600881101561217b5761213481600761446c565b61213f90600861430c565b6001600160401b031689612154836026614493565b815181106121645761216461447f565b016020015160f81c901b9190911790600101612120565b505f805b60088110156121da5761219381600761446c565b61219e90600861430c565b6001600160401b03168a6121b383602e614493565b815181106121c3576121c361447f565b016020015160f81c901b919091179060010161217f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061465b83398151915292919061223290614023565b9050118015612264575060015f83815260038301602052604090205460ff16600481111561226257612262613fd4565b145b611c0f5760405162461bcd60e51b815260206004820152603860248201525f8051602061467b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f805160206146db83398151915260205260408082208151610100810190925280545f8051602061469b83398151915293929190829060ff16600581111561231157612311613fd4565b600581111561232257612322613fd4565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123aa576123aa613fd4565b146124065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b61248d8160a00151613320565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124d1576124d1613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61259d8461259781611756565b5f611923565b5f85815260068501602052604090209091506125b982826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125e6908590600401614187565b6020604051808303815f875af1158015612602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262691906141b9565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061465b83398151915281612694846134c1565b90505f6126a082610a17565b83549091506001600160401b038216108015906126ca57508260010154816001600160401b031611155b6110735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f6127316134f7565b5f8051602061469b833981519152426001600160401b03851611801561276b57506001600160401b038416612769426202a300614493565b115b6127cd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856128245760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b61290285613320565b5f806129496040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352e565b5f8281526005860160205260409020919350915061296782826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612994908590600401614187565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906141b9565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a5657612a56613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b1783611756565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107360015f805160206146bb83398151915255565b5f612b866134f7565b5f612b936101c2846134c1565b90505f8051602061465b8339815191525f612bad876117ca565b9050600281516005811115612bc457612bc4613fd4565b14612c235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260a00151612c349190614579565b9050612c4088826118db565b5f612c4a89611756565b90505f60028a8a84604051602001612c949392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612cae91614599565b602060405180830381855afa158015612cc9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612cec91906141b9565b5f8181526003870160205260409020600201549091506001600160401b031615612d755760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b6064820152608401610447565b612d7e86613320565b5f612d8a8b8486611923565b5f8381526004880160205260409020909150612da682826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dd3908590600401614187565b6020604051808303815f875af1158015612def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1391906141b9565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ec257612ec2613fd4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122760015f805160206146bb83398151915255565b5f808251602e146130265760405162461bcd60e51b8152600401610447906144a6565b5f805b60028110156130755761303d81600161446c565b61304890600861430c565b61ffff1685828151811061305e5761305e61447f565b016020015160f81c901b9190911790600101613029565b5061ffff8116156130985760405162461bcd60e51b8152600401610447906144ef565b5f805b60048110156130f3576130af81600361446c565b6130ba90600861430c565b63ffffffff16866130cc836002614493565b815181106130dc576130dc61447f565b016020015160f81c901b919091179060010161309b565b5063ffffffff811660041461311a5760405162461bcd60e51b815260040161044790614532565b5f805b602081101561316f5761313181601f61446c565b61313c90600861430c565b87613148836006614493565b815181106131585761315861447f565b016020015160f81c901b919091179060010161311d565b505f805b60088110156131ce5761318781600761446c565b61319290600861430c565b6001600160401b0316886131a7836026614493565b815181106131b7576131b761447f565b016020015160f81c901b9190911790600101613173565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322457604051631afcd79f60e31b815260040160405180910390fd5b565b61322e6131db565b613237816138e6565b6132696060820135608083013561325460c0850160a08601613e6d565b61326460e0860160c087016145b4565b613907565b50565b6132746131db565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133005760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061469b8339815191529060ff165f0361335e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a6908361446c565b106133c2576001600160401b03841660408301528082526133e1565b83826040018181516133d49190614579565b6001600160401b03169052505b5f8260200151836040015160646133f891906145cf565b61340291906145fa565b600285015490915060ff908116908216111561347d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613962565b5f805160206146bb83398151915280546001190161352857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135985760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360f576135cf81600161446c565b6135da90600861430c565b5081515f908390839081106135f1576135f161447f565b60200101906001600160f81b03191690815f1a9053506001016135bb565b505f5b600481101561366d5761362681600361446c565b61363190600861430c565b505f8261363f836002614493565b8151811061364f5761364f61447f565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b60208110156136ca578451816020811061368c5761368c61447f565b1a60f81b8261369c836006614493565b815181106136ac576136ac61447f565b60200101906001600160f81b03191690815f1a905350600101613670565b505f5b602081101561372a57846020015181602081106136ec576136ec61447f565b1a60f81b826136fc836026614493565b8151811061370c5761370c61447f565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f5b600881101561379e5761374181600761446c565b61374c90600861430c565b60ff1685604001516001600160401b0316901c60f81b828260466137709190614493565b815181106137805761378061447f565b60200101906001600160f81b03191690815f1a90535060010161372d565b505f5b603081101561380957846080015181815181106137c0576137c061447f565b01602001516001600160f81b031916826137db83604e614493565b815181106137eb576137eb61447f565b60200101906001600160f81b03191690815f1a9053506001016137a1565b505f5b600881101561387b5761382081600761446c565b61382b90600861430c565b60608601516001600160401b0390811691161c60f81b8261384d83607e614493565b8151811061385d5761385d61447f565b60200101906001600160f81b03191690815f1a90535060010161380c565b5060028160405161388c9190614599565b602060405180830381855afa1580156138a7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ca91906141b9565b94909350915050565b60015f805160206146bb83398151915255565b6138ee6131db565b6138f6613ac4565b6138fe613ad4565b61326981613adc565b61390f6131db565b5f5f8051602061465b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139cc91906141b9565b90506139e36001600160a01b038516333086613b48565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4b91906141b9565b9050818111613ab15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b613abb828261446c565b95945050505050565b613acc6131db565b613224613ba8565b6132246131db565b613ae46131db565b80355f8051602061469b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b2e606083016040840161461f565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ba2908590613bb0565b50505050565b6138d36131db565b5f613bc46001600160a01b03841683613c11565b905080515f14158015613be8575080806020019051810190613be6919061463f565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061122783835f845f80856001600160a01b03168486604051613c359190614599565b5f6040518083038185875af1925050503d805f8114613c6f576040519150601f19603f3d011682016040523d82523d5f602084013e613c74565b606091505b509150915061174c868383606082613c9457613c8f82613cdb565b611227565b8151158015613cab57506001600160a01b0384163b155b15613cd457604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611227565b805115613ceb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d1090614023565b5f825580601f10613d1f575050565b601f0160209004905f5260205f209081019061326991905b80821115613d4a575f8155600101613d37565b5090565b8015158114613269575f80fd5b803563ffffffff81168114613d6e575f80fd5b919050565b5f805f60608486031215613d85575f80fd5b833592506020840135613d9781613d4e565b9150613da560408501613d5b565b90509250925092565b5f60208284031215613dbe575f80fd5b5035919050565b6001600160a01b0381168114613269575f80fd5b5f80828403610100811215613dec575f80fd5b60e0811215613df9575f80fd5b5082915060e0830135613e0b81613dc5565b809150509250929050565b5f60208284031215613e26575f80fd5b61122782613d5b565b5f8060408385031215613e40575f80fd5b613e4983613d5b565b946020939093013593505050565b80356001600160401b0381168114613d6e575f80fd5b5f60208284031215613e7d575f80fd5b61122782613e57565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ebc57613ebc613e86565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613eea57613eea613e86565b604052919050565b5f6001600160401b03821115613f0a57613f0a613e86565b50601f01601f191660200190565b5f805f8060808587031215613f2b575f80fd5b8435935060208501359250613f4260408601613e57565b915060608501356001600160401b03811115613f5c575f80fd5b8501601f81018713613f6c575f80fd5b8035613f7f613f7a82613ef2565b613ec2565b818152886020838501011115613f93575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fc5575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561401c5761401c613fe8565b5092915050565b600181811c9082168061403757607f821691505b60208210810361405557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c810160208510156140805750805b601f840160051c820191505b8181101561409f575f815560010161408c565b5050505050565b81516001600160401b038111156140bf576140bf613e86565b6140d3816140cd8454614023565b8461405b565b602080601f831160018114614106575f84156140ef5750858301515b5f19600386901b1c1916600185901b17855561415d565b5f85815260208120601f198616915b8281101561413457888601518255948401946001909101908401614115565b508582101561415157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561417f578181015183820152602001614167565b50505f910152565b602081525f82518060208401526141a5816040850160208701614165565b601f01601f19169190910160400192915050565b5f602082840312156141c9575f80fd5b5051919050565b5f60208083525f84546141e281614023565b806020870152604060018084165f8114614203576001811461421f5761424c565b60ff19851660408a0152604084151560051b8a0101955061424c565b895f5260205f205f5b858110156142435781548b8201860152908301908801614228565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261427c5761427c61425a565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613fe8565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6e81613d4e565b5f8060408385031215614386575f80fd5b82516001600160401b038082111561439c575f80fd5b90840190606082870312156143af575f80fd5b6143b7613e9a565b825181526020808401516143ca81613dc5565b828201526040840151838111156143df575f80fd5b80850194505087601f8501126143f3575f80fd5b83519250614403613f7a84613ef2565b8381528882858701011115614416575f80fd5b61442584838301848801614165565b8060408401525081955061443a81880161436a565b9450505050509250929050565b5f6001600160401b0380831681810361446257614462613fe8565b6001019392505050565b81810381811115610a2757610a27613fe8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613fe8565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561401c5761401c613fe8565b5f82516145aa818460208701614165565b9190910192915050565b5f602082840312156145c4575f80fd5b813561122781613dc5565b6001600160401b038181168382160280821691908281146145f2576145f2613fe8565b505092915050565b5f6001600160401b03808416806146135761461361425a565b92169190910492915050565b5f6020828403121561462f575f80fd5b813560ff81168114611227575f80fd5b5f6020828403121561464f575f80fd5b815161122781613d4e56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161478938038061478983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61463c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613ca8565b6102d6565b005b610128610138366004613ce3565b61076a565b61017b61014b366004613ce3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ce3565b6108c6565b6101286101af366004613d0e565b610933565b6101c76101c2366004613ce3565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d4b565b610a2d565b610128610200366004613d64565b610db0565b61017b610213366004613da2565b610fa1565b6101c7610226366004613ce3565b610fba565b610128610239366004613ce3565b610fce565b61012861024c366004613ca8565b61103b565b61017b61025f366004613e4d565b611056565b610128610272366004613d64565b61107b565b61017b610285366004613ee9565b61121b565b610128610298366004613d4b565b61122e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613ce3565b6113eb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145908339815191529184156103285761032582856114ba565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f09565b600481111561036b5761036b613f09565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f805160206145b08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613f09565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f805160206145b08339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611756565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613f09565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117ca565b905082606001516001600160401b03168160a001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f83606001518260a001516106679190613f31565b905061067386826118db565b5f61067f878584611923565b5f8c815260058a016020526040902090915061069b8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c89085906004016140bc565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906140ee565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145d08339815191529291906107b290613f58565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613f09565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c191906140ee565b505050565b6108cf81611b40565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611c13565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a51000836141a3565b92915050565b5f805160206145d08339815191525f610a4583611c2d565b90505f80610a568360400151611e0e565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610aed57610aed613f09565b6005811115610afe57610afe613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b8557610b85613f09565b1480610ba35750600182516005811115610ba157610ba1613f09565b145b610c025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c1757610c17613f09565b03610c3e57505f8381526006860160205260408120600491610c399190613c39565b610c42565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6b57610c6b613f09565b90816005811115610c7e57610c7e613f09565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cb257610cb2613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7d57610d7d613f09565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145908339815191525f610dc884611c2d565b90505f80610dd98360400151611faf565b5091509150610de7856121ea565b5f8581526004850160205260408120610dff91613c39565b5f610e09836117ca565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b8152600401610447906141b6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e865760405162461bcd60e51b8152600401610447906141f8565b60015f87815260038701602052604090205460ff166004811115610eac57610eac613f09565b14610f155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a51000614241565b5f610fc4826117ca565b60a0015192915050565b610fd7816121ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b811561104d5761104b83826114ba565b505b6108c1836122c3565b5f806110618661267b565b905061106f85828686612728565b9150505b949350505050565b5f805160206145908339815191525f61109384611c2d565b90505f806110a48360400151611faf565b50915091506110b285611b40565b5f85815260058501602052604081206110ca91613c39565b5f6110d4836117ca565b9050816001600160401b031681608001516001600160401b0316101561110c5760405162461bcd60e51b8152600401610447906141b6565b5f8681526003808701602052604090912001546001600160401b038084169116111561114a5760405162461bcd60e51b8152600401610447906141f8565b60035f87815260038701602052604090205460ff16600481111561117057611170613f09565b146111c45760405162461bcd60e51b815260206004820152603160248201525f805160206145b08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611227833384612b7d565b9392505050565b5f805160206145d08339815191525f61124683611c2d565b90505f806112578360400151611e0e565b91509150806112b95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112d390613f58565b9050118015611305575060015f83815260078601602052604090205460ff16600581111561130357611303613f09565b145b6113215760405162461bcd60e51b815260040161044790614258565b5f828152600585016020526040812061133991613c39565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145d083398151915292919061143390613f58565b9050118015611465575060015f83815260078301602052604090205460ff16600581111561146357611463613f09565b145b6114815760405162461bcd60e51b815260040161044790614258565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152c91908101906142aa565b915091508061158f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f691906140ee565b82511461165a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116d05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116df8460400151612f38565b9150915081871461174c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146108339815191526020526040812060030180545f805160206145d0833981519152916001600160401b039091169081908461179b8361437c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061461083398151915290528390208351918201909352825491925f805160206145d083398151915292829060ff16600581111561185257611852613f09565b600581111561186357611863613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614610833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199c5761195c8160016143a1565b611967906008614241565b5081515f9083908390811061197e5761197e6143b4565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b60048110156119ff576119b38160036143a1565b6119be906008614241565b6001901c60f81b826119d18360026143c8565b815181106119e1576119e16143b4565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6020811015611a6157611a1681601f6143a1565b611a21906008614241565b86901c60f81b82611a338360066143c8565b81518110611a4357611a436143b4565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611acc57611a788160076143a1565b611a83906008614241565b6001600160401b038616901c60f81b82611a9e8360266143c8565b81518110611aae57611aae6143b4565b60200101906001600160f81b03191690815f1a905350600101611a64565b505f5b6008811015611b3757611ae38160076143a1565b611aee906008614241565b6001600160401b038516901c60f81b82611b0983602e6143c8565b81518110611b1957611b196143b4565b60200101906001600160f81b03191690815f1a905350600101611acf565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614590833981519152929190611b8890613f58565b9050118015611bba575060035f83815260038301602052604090205460ff166004811115611bb857611bb8613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603360248201525f805160206145b083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611c1b613110565b611c248261315b565b611c0f816131a1565b60408051606080820183525f8083526020830181905292820152905f805160206145d08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc991908101906142aa565b9150915080611d305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611e065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611e315760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015611e8057611e488160016143a1565b611e53906008614241565b61ffff16858281518110611e6957611e696143b4565b016020015160f81c901b9190911790600101611e34565b5061ffff811615611ea35760405162461bcd60e51b815260040161044790614424565b5f805b6004811015611efe57611eba8160036143a1565b611ec5906008614241565b63ffffffff1686611ed78360026143c8565b81518110611ee757611ee76143b4565b016020015160f81c901b9190911790600101611ea6565b5063ffffffff8116600214611f255760405162461bcd60e51b815260040161044790614467565b5f805b6020811015611f7a57611f3c81601f6143a1565b611f47906008614241565b87611f538360066143c8565b81518110611f6357611f636143b4565b016020015160f81c901b9190911790600101611f28565b505f86602681518110611f8f57611f8f6143b4565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd35760405162461bcd60e51b8152600401610447906143db565b5f805b600281101561202257611fea8160016143a1565b611ff5906008614241565b61ffff1686828151811061200b5761200b6143b4565b016020015160f81c901b9190911790600101611fd6565b5061ffff8116156120455760405162461bcd60e51b815260040161044790614424565b5f805b60048110156120a05761205c8160036143a1565b612067906008614241565b63ffffffff16876120798360026143c8565b81518110612089576120896143b4565b016020015160f81c901b9190911790600101612048565b5063ffffffff81166003146120c75760405162461bcd60e51b815260040161044790614467565b5f805b602081101561211c576120de81601f6143a1565b6120e9906008614241565b886120f58360066143c8565b81518110612105576121056143b4565b016020015160f81c901b91909117906001016120ca565b505f805b600881101561217b576121348160076143a1565b61213f906008614241565b6001600160401b0316896121548360266143c8565b81518110612164576121646143b4565b016020015160f81c901b9190911790600101612120565b505f805b60088110156121da576121938160076143a1565b61219e906008614241565b6001600160401b03168a6121b383602e6143c8565b815181106121c3576121c36143b4565b016020015160f81c901b919091179060010161217f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061459083398151915292919061223290613f58565b9050118015612264575060015f83815260038301602052604090205460ff16600481111561226257612262613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603860248201525f805160206145b083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f8051602061461083398151915260205260408082208151610100810190925280545f805160206145d083398151915293929190829060ff16600581111561231157612311613f09565b600581111561232257612322613f09565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123aa576123aa613f09565b146124065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b61248d8160a00151613255565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124d1576124d1613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61259d8461259781611756565b5f611923565b5f85815260068501602052604090209091506125b98282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125e69085906004016140bc565b6020604051808303815f875af1158015612602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262691906140ee565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061459083398151915281612694846133f6565b90505f6126a082610a17565b83549091506001600160401b038216108015906126ca57508260010154816001600160401b031611155b6110735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f61273161342c565b5f805160206145d0833981519152426001600160401b03851611801561276b57506001600160401b038416612769426202a3006143c8565b115b6127cd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856128245760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b61290285613255565b5f806129496040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613463565b5f828152600586016020526040902091935091506129678282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129949085906004016140bc565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906140ee565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a5657612a56613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b1783611756565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107360015f805160206145f083398151915255565b5f612b8661342c565b5f612b936101c2846133f6565b90505f805160206145908339815191525f612bad876117ca565b9050600281516005811115612bc457612bc4613f09565b14612c235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260a00151612c3491906144ae565b9050612c4088826118db565b5f612c4a89611756565b90505f898983604051602001612c929392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612cb386613255565b5f612cbf8b8486611923565b5f8381526004880160205260409020909150612cdb8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d089085906004016140bc565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4891906140ee565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612df757612df7613f09565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122760015f805160206145f083398151915255565b5f808251602e14612f5b5760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015612faa57612f728160016143a1565b612f7d906008614241565b61ffff16858281518110612f9357612f936143b4565b016020015160f81c901b9190911790600101612f5e565b5061ffff811615612fcd5760405162461bcd60e51b815260040161044790614424565b5f805b600481101561302857612fe48160036143a1565b612fef906008614241565b63ffffffff16866130018360026143c8565b81518110613011576130116143b4565b016020015160f81c901b9190911790600101612fd0565b5063ffffffff811660041461304f5760405162461bcd60e51b815260040161044790614467565b5f805b60208110156130a45761306681601f6143a1565b613071906008614241565b8761307d8360066143c8565b8151811061308d5761308d6143b4565b016020015160f81c901b9190911790600101613052565b505f805b6008811015613103576130bc8160076143a1565b6130c7906008614241565b6001600160401b0316886130dc8360266143c8565b815181106130ec576130ec6143b4565b016020015160f81c901b91909117906001016130a8565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315957604051631afcd79f60e31b815260040160405180910390fd5b565b613163613110565b61316c8161381b565b61319e6060820135608083013561318960c0850160a08601613da2565b61319960e0860160c087016144ce565b61383c565b50565b6131a9613110565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132355760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145d08339815191529060ff165f03613293575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132db90836143a1565b106132f7576001600160401b0384166040830152808252613316565b838260400181815161330991906144ae565b6001600160401b03169052505b5f82602001518360400151606461332d91906144e9565b6133379190614514565b600285015490915060ff90811690821611156133b25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613897565b5f805160206145f083398151915280546001190161345d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134cd5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613544576135048160016143a1565b61350f906008614241565b5081515f90839083908110613526576135266143b4565b60200101906001600160f81b03191690815f1a9053506001016134f0565b505f5b60048110156135a25761355b8160036143a1565b613566906008614241565b505f826135748360026143c8565b81518110613584576135846143b4565b60200101906001600160f81b03191690815f1a905350600101613547565b505f5b60208110156135ff57845181602081106135c1576135c16143b4565b1a60f81b826135d18360066143c8565b815181106135e1576135e16143b4565b60200101906001600160f81b03191690815f1a9053506001016135a5565b505f5b602081101561365f5784602001518160208110613621576136216143b4565b1a60f81b826136318360266143c8565b81518110613641576136416143b4565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136d3576136768160076143a1565b613681906008614241565b60ff1685604001516001600160401b0316901c60f81b828260466136a591906143c8565b815181106136b5576136b56143b4565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b603081101561373e57846080015181815181106136f5576136f56143b4565b01602001516001600160f81b0319168261371083604e6143c8565b81518110613720576137206143b4565b60200101906001600160f81b03191690815f1a9053506001016136d6565b505f5b60088110156137b0576137558160076143a1565b613760906008614241565b60608601516001600160401b0390811691161c60f81b8261378283607e6143c8565b81518110613792576137926143b4565b60200101906001600160f81b03191690815f1a905350600101613741565b506002816040516137c19190614539565b602060405180830381855afa1580156137dc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ff91906140ee565b94909350915050565b60015f805160206145f083398151915255565b613823613110565b61382b6139f9565b613833613a09565b61319e81613a11565b613844613110565b5f5f80516020614590833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390191906140ee565b90506139186001600160a01b038516333086613a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561395c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398091906140ee565b90508181116139e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b6139f082826143a1565b95945050505050565b613a01613110565b613159613add565b613159613110565b613a19613110565b80355f805160206145d083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a636060830160408401614554565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ad7908590613ae5565b50505050565b613808613110565b5f613af96001600160a01b03841683613b46565b905080515f14158015613b1d575080806020019051810190613b1b9190614574565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061122783835f845f80856001600160a01b03168486604051613b6a9190614539565b5f6040518083038185875af1925050503d805f8114613ba4576040519150601f19603f3d011682016040523d82523d5f602084013e613ba9565b606091505b509150915061174c868383606082613bc957613bc482613c10565b611227565b8151158015613be057506001600160a01b0384163b155b15613c0957604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611227565b805115613c205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c4590613f58565b5f825580601f10613c54575050565b601f0160209004905f5260205f209081019061319e91905b80821115613c7f575f8155600101613c6c565b5090565b801515811461319e575f80fd5b803563ffffffff81168114613ca3575f80fd5b919050565b5f805f60608486031215613cba575f80fd5b833592506020840135613ccc81613c83565b9150613cda60408501613c90565b90509250925092565b5f60208284031215613cf3575f80fd5b5035919050565b6001600160a01b038116811461319e575f80fd5b5f80828403610100811215613d21575f80fd5b60e0811215613d2e575f80fd5b5082915060e0830135613d4081613cfa565b809150509250929050565b5f60208284031215613d5b575f80fd5b61122782613c90565b5f8060408385031215613d75575f80fd5b613d7e83613c90565b946020939093013593505050565b80356001600160401b0381168114613ca3575f80fd5b5f60208284031215613db2575f80fd5b61122782613d8c565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613df157613df1613dbb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1f57613e1f613dbb565b604052919050565b5f6001600160401b03821115613e3f57613e3f613dbb565b50601f01601f191660200190565b5f805f8060808587031215613e60575f80fd5b8435935060208501359250613e7760408601613d8c565b915060608501356001600160401b03811115613e91575f80fd5b8501601f81018713613ea1575f80fd5b8035613eb4613eaf82613e27565b613df7565b818152886020838501011115613ec8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613efa575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f5157613f51613f1d565b5092915050565b600181811c90821680613f6c57607f821691505b602082108103613f8a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c81016020851015613fb55750805b601f840160051c820191505b81811015613fd4575f8155600101613fc1565b5050505050565b81516001600160401b03811115613ff457613ff4613dbb565b614008816140028454613f58565b84613f90565b602080601f83116001811461403b575f84156140245750858301515b5f19600386901b1c1916600185901b178555614092565b5f85815260208120601f198616915b828110156140695788860151825594840194600190910190840161404a565b508582101561408657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140b457818101518382015260200161409c565b50505f910152565b602081525f82518060208401526140da81604085016020870161409a565b601f01601f19169190910160400192915050565b5f602082840312156140fe575f80fd5b5051919050565b5f60208083525f845461411781613f58565b806020870152604060018084165f8114614138576001811461415457614181565b60ff19851660408a0152604084151560051b8a01019550614181565b895f5260205f205f5b858110156141785781548b820186015290830190880161415d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141b1576141b161418f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613f1d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ca381613c83565b5f80604083850312156142bb575f80fd5b82516001600160401b03808211156142d1575f80fd5b90840190606082870312156142e4575f80fd5b6142ec613dcf565b825181526020808401516142ff81613cfa565b82820152604084015183811115614314575f80fd5b80850194505087601f850112614328575f80fd5b83519250614338613eaf84613e27565b838152888285870101111561434b575f80fd5b61435a8483830184880161409a565b8060408401525081955061436f81880161429f565b9450505050509250929050565b5f6001600160401b0380831681810361439757614397613f1d565b6001019392505050565b81810381811115610a2757610a27613f1d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613f1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f5157613f51613f1d565b5f602082840312156144de575f80fd5b813561122781613cfa565b6001600160401b0381811683821602808216919082811461450c5761450c613f1d565b505092915050565b5f6001600160401b038084168061452d5761452d61418f565b92169190910492915050565b5f825161454a81846020870161409a565b9190910192915050565b5f60208284031215614564575f80fd5b813560ff81168114611227575f80fd5b5f60208284031215614584575f80fd5b815161122781613c8356fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 6cd44c303..dc2baffd2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161447c38038061447c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61432f8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139e8565b610389565b005b348015610134575f80fd5b50610127610143366004613a23565b61046b565b348015610153575f80fd5b50610127610162366004613a5e565b6108ff565b348015610172575f80fd5b506101b1610181366004613a5e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a5e565b610a5b565b3480156101ee575f80fd5b506102026101fd366004613a5e565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a75565b610ade565b348015610244575f80fd5b50610127610253366004613a8e565b610e61565b348015610263575f80fd5b506101b1610272366004613acc565b611052565b348015610282575f80fd5b50610202610291366004613a5e565b61106b565b3480156102a1575f80fd5b506101276102b0366004613a5e565b61107f565b3480156102c0575f80fd5b506101276102cf366004613a23565b6110ec565b3480156102df575f80fd5b506101276102ee366004613a8e565b611107565b3480156102fe575f80fd5b5061012761030d366004613a75565b6112a7565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a5e565b611464565b6101b1610371366004613a5e565b611533565b6101b1610384366004613b77565b61153f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611563565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142838339815191529184156104bd576104ba8285611577565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c09565b600481111561050057610500613c09565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206142a38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613c09565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206142a38339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f61065184611813565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613c09565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61077085611887565b905082606001516001600160401b03168160a001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f83606001518260a001516107fc9190613c31565b90506108088682611998565b5f6108148785846119e0565b5f8c815260058a01602052604090209091506108308282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613db6565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613de8565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142c383398151915292919061094790613c58565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613c09565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613dff565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613de8565b505050565b610a6481611bfd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614283833981519152916005600160991b019163ee5b48eb91610a1691600401613dff565b5f610ad864e8d4a5100083613e9d565b92915050565b5f805160206142c38339815191525f610af683611cd0565b90505f80610b078360400151611eb1565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9e57610b9e613c09565b6005811115610baf57610baf613c09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c3657610c36613c09565b1480610c545750600182516005811115610c5257610c52613c09565b145b610cb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cc857610cc8613c09565b03610cef57505f8381526006860160205260408120600491610cea919061399e565b610cf3565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1c57610d1c613c09565b90816005811115610d2f57610d2f613c09565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d6357610d63613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2e57610e2e613c09565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142838339815191525f610e7984611cd0565b90505f80610e8a8360400151612052565b5091509150610e988561228d565b5f8581526004850160205260408120610eb09161399e565b5f610eba83611887565b9050816001600160401b031681608001516001600160401b03161015610ef25760405162461bcd60e51b81526004016105dc90613eb0565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f375760405162461bcd60e51b81526004016105dc90613ef2565b60015f87815260038701602052604090205460ff166004811115610f5d57610f5d613c09565b14610fc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613f3b565b5f61107582611887565b60a0015192915050565b6110888161228d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614283833981519152916005600160991b019163ee5b48eb91610a1691600401613dff565b81156110fe576110fc8382611577565b505b610a5683612366565b5f805160206142838339815191525f61111f84611cd0565b90505f806111308360400151612052565b509150915061113e85611bfd565b5f85815260058501602052604081206111569161399e565b5f61116083611887565b9050816001600160401b031681608001516001600160401b031610156111985760405162461bcd60e51b81526004016105dc90613eb0565b5f8681526003808701602052604090912001546001600160401b03808416911611156111d65760405162461bcd60e51b81526004016105dc90613ef2565b60035f87815260038701602052604090205460ff1660048111156111fc576111fc613c09565b146112505760405162461bcd60e51b815260206004820152603160248201525f805160206142a38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142c38339815191525f6112bf83611cd0565b90505f806112d08360400151611eb1565b91509150806113325760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461134c90613c58565b905011801561137e575060015f83815260078601602052604090205460ff16600581111561137c5761137c613c09565b145b61139a5760405162461bcd60e51b81526004016105dc90613f52565b5f82815260058501602052604081206113b29161399e565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142c38339815191529291906114ac90613c58565b90501180156114de575060015f83815260078301602052604090205460ff1660058111156114dc576114dc613c09565b145b6114fa5760405162461bcd60e51b81526004016105dc90613f52565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613dff565b5f610ad882333461271e565b5f8061154a34612ba1565b905061155885828686612c4b565b9150505b9392505050565b61156b6130a0565b611574816130eb565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e99190810190613fb8565b915091508061164c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b39190613de8565b8251146117175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561178d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061179c846040015161312e565b915091508187146118095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206143038339815191526020526040812060030180545f805160206142c3833981519152916001600160401b03909116908190846118588361408a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061430383398151915290528390208351918201909352825491925f805160206142c383398151915292829060ff16600581111561190f5761190f613c09565b600581111561192057611920613c09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614303833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5957611a198160016140af565b611a24906008613f3b565b5081515f90839083908110611a3b57611a3b6140c2565b60200101906001600160f81b03191690815f1a905350600101611a05565b505f5b6004811015611abc57611a708160036140af565b611a7b906008613f3b565b6001901c60f81b82611a8e8360026140d6565b81518110611a9e57611a9e6140c2565b60200101906001600160f81b03191690815f1a905350600101611a5c565b505f5b6020811015611b1e57611ad381601f6140af565b611ade906008613f3b565b86901c60f81b82611af08360066140d6565b81518110611b0057611b006140c2565b60200101906001600160f81b03191690815f1a905350600101611abf565b505f5b6008811015611b8957611b358160076140af565b611b40906008613f3b565b6001600160401b038616901c60f81b82611b5b8360266140d6565b81518110611b6b57611b6b6140c2565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6008811015611bf457611ba08160076140af565b611bab906008613f3b565b6001600160401b038516901c60f81b82611bc683602e6140d6565b81518110611bd657611bd66140c2565b60200101906001600160f81b03191690815f1a905350600101611b8c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614283833981519152929190611c4590613c58565b9050118015611c77575060035f83815260038301602052604090205460ff166004811115611c7557611c75613c09565b145b611ccc5760405162461bcd60e51b815260206004820152603360248201525f805160206142a383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142c38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d45573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6c9190810190613fb8565b9150915080611dd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611e365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611ea95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611ed45760405162461bcd60e51b81526004016105dc906140e9565b5f805b6002811015611f2357611eeb8160016140af565b611ef6906008613f3b565b61ffff16858281518110611f0c57611f0c6140c2565b016020015160f81c901b9190911790600101611ed7565b5061ffff811615611f465760405162461bcd60e51b81526004016105dc90614132565b5f805b6004811015611fa157611f5d8160036140af565b611f68906008613f3b565b63ffffffff1686611f7a8360026140d6565b81518110611f8a57611f8a6140c2565b016020015160f81c901b9190911790600101611f49565b5063ffffffff8116600214611fc85760405162461bcd60e51b81526004016105dc90614175565b5f805b602081101561201d57611fdf81601f6140af565b611fea906008613f3b565b87611ff68360066140d6565b81518110612006576120066140c2565b016020015160f81c901b9190911790600101611fcb565b505f86602681518110612032576120326140c2565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120765760405162461bcd60e51b81526004016105dc906140e9565b5f805b60028110156120c55761208d8160016140af565b612098906008613f3b565b61ffff168682815181106120ae576120ae6140c2565b016020015160f81c901b9190911790600101612079565b5061ffff8116156120e85760405162461bcd60e51b81526004016105dc90614132565b5f805b6004811015612143576120ff8160036140af565b61210a906008613f3b565b63ffffffff168761211c8360026140d6565b8151811061212c5761212c6140c2565b016020015160f81c901b91909117906001016120eb565b5063ffffffff811660031461216a5760405162461bcd60e51b81526004016105dc90614175565b5f805b60208110156121bf5761218181601f6140af565b61218c906008613f3b565b886121988360066140d6565b815181106121a8576121a86140c2565b016020015160f81c901b919091179060010161216d565b505f805b600881101561221e576121d78160076140af565b6121e2906008613f3b565b6001600160401b0316896121f78360266140d6565b81518110612207576122076140c2565b016020015160f81c901b91909117906001016121c3565b505f805b600881101561227d576122368160076140af565b612241906008613f3b565b6001600160401b03168a61225683602e6140d6565b81518110612266576122666140c2565b016020015160f81c901b9190911790600101612222565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206142838339815191529291906122d590613c58565b9050118015612307575060015f83815260038301602052604090205460ff16600481111561230557612305613c09565b145b611ccc5760405162461bcd60e51b815260206004820152603860248201525f805160206142a383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f8051602061430383398151915260205260408082208151610100810190925280545f805160206142c383398151915293929190829060ff1660058111156123b4576123b4613c09565b60058111156123c5576123c5613c09565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244d5761244d613c09565b146124a95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146125235760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6125308160a00151613306565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561257457612574613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126408461263a81611813565b5f6119e0565b5f858152600685016020526040902090915061265c8282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612689908590600401613db6565b6020604051808303815f875af11580156126a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c99190613de8565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127276134a7565b5f61273183610ac8565b90505f805160206142838339815191525f61274b87611887565b905060028151600581111561276257612762613c09565b146127c15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260a001516127d291906141bc565b90506127de8882611998565b5f6127e889611813565b90505f60028a8a846040516020016128329392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261284c916141dc565b602060405180830381855afa158015612867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061288a9190613de8565b5f8181526003870160205260409020600201549091506001600160401b0316156129135760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b60648201526084016105dc565b61291c86613306565b5f6129288b84866119e0565b5f83815260048801602052604090209091506129448282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612971908590600401613db6565b6020604051808303815f875af115801561298d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129b19190613de8565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a6057612a60613c09565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155c60015f805160206142e383398151915255565b5f5f805160206142838339815191528282612bbb82610ac8565b83549091506001600160401b03821610801590612be557508260010154816001600160401b031611155b612c435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612c546134a7565b5f805160206142c3833981519152426001600160401b038516118015612c8e57506001600160401b038416612c8c426202a3006140d6565b115b612cf05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612d475760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612db55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612e1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612e2585613306565b5f80612e6c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f1565b5f82815260058601602052604090209193509150612e8a8282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612eb7908590600401613db6565b6020604051808303815f875af1158015612ed3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef79190613de8565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f7957612f79613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561303a83611813565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4360015f805160206142e383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130e957604051631afcd79f60e31b815260040160405180910390fd5b565b6130f36130a0565b6130fc81613896565b6115746060820135608083013561311960c0850160a08601613acc565b61312960e0860160c087016141f7565b6138b7565b5f808251602e146131515760405162461bcd60e51b81526004016105dc906140e9565b5f805b60028110156131a0576131688160016140af565b613173906008613f3b565b61ffff16858281518110613189576131896140c2565b016020015160f81c901b9190911790600101613154565b5061ffff8116156131c35760405162461bcd60e51b81526004016105dc90614132565b5f805b600481101561321e576131da8160036140af565b6131e5906008613f3b565b63ffffffff16866131f78360026140d6565b81518110613207576132076140c2565b016020015160f81c901b91909117906001016131c6565b5063ffffffff81166004146132455760405162461bcd60e51b81526004016105dc90614175565b5f805b602081101561329a5761325c81601f6140af565b613267906008613f3b565b876132738360066140d6565b81518110613283576132836140c2565b016020015160f81c901b9190911790600101613248565b505f805b60088110156132f9576132b28160076140af565b6132bd906008613f3b565b6001600160401b0316886132d28360266140d6565b815181106132e2576132e26140c2565b016020015160f81c901b919091179060010161329e565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142c38339815191529060ff165f03613344575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061338c90836140af565b106133a8576001600160401b03841660408301528082526133c7565b83826040018181516133ba91906141bc565b6001600160401b03169052505b5f8260200151836040015160646133de9190614212565b6133e8919061423d565b600285015490915060ff90811690821611156134635760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142e38339815191528054600119016134d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142e383398151915255565b5f606082608001515160301461355b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d2576135928160016140af565b61359d906008613f3b565b5081515f908390839081106135b4576135b46140c2565b60200101906001600160f81b03191690815f1a90535060010161357e565b505f5b6004811015613630576135e98160036140af565b6135f4906008613f3b565b505f826136028360026140d6565b81518110613612576136126140c2565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b602081101561368d578451816020811061364f5761364f6140c2565b1a60f81b8261365f8360066140d6565b8151811061366f5761366f6140c2565b60200101906001600160f81b03191690815f1a905350600101613633565b505f5b60208110156136ed57846020015181602081106136af576136af6140c2565b1a60f81b826136bf8360266140d6565b815181106136cf576136cf6140c2565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b6008811015613761576137048160076140af565b61370f906008613f3b565b60ff1685604001516001600160401b0316901c60f81b8282604661373391906140d6565b81518110613743576137436140c2565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60308110156137cc5784608001518181518110613783576137836140c2565b01602001516001600160f81b0319168261379e83604e6140d6565b815181106137ae576137ae6140c2565b60200101906001600160f81b03191690815f1a905350600101613764565b505f5b600881101561383e576137e38160076140af565b6137ee906008613f3b565b60608601516001600160401b0390811691161c60f81b8261381083607e6140d6565b81518110613820576138206140c2565b60200101906001600160f81b03191690815f1a9053506001016137cf565b5060028160405161384f91906141dc565b602060405180830381855afa15801561386a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388d9190613de8565b94909350915050565b61389e6130a0565b6138a6613912565b6138ae613922565b6115748161392a565b6138bf6130a0565b5f5f80516020614283833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61391a6130a0565b6130e9613996565b6130e96130a0565b6139326130a0565b80355f805160206142c383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561397c6060830160408401614262565b600291909101805460ff191660ff90921691909117905550565b6134de6130a0565b5080546139aa90613c58565b5f825580601f106139b9575050565b601f0160209004905f5260205f209081019061157491905b808211156139e4575f81556001016139d1565b5090565b5f60e082840312156139f8575f80fd5b50919050565b8015158114611574575f80fd5b803563ffffffff81168114613a1e575f80fd5b919050565b5f805f60608486031215613a35575f80fd5b833592506020840135613a47816139fe565b9150613a5560408501613a0b565b90509250925092565b5f60208284031215613a6e575f80fd5b5035919050565b5f60208284031215613a85575f80fd5b61155c82613a0b565b5f8060408385031215613a9f575f80fd5b613aa883613a0b565b946020939093013593505050565b80356001600160401b0381168114613a1e575f80fd5b5f60208284031215613adc575f80fd5b61155c82613ab6565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b1b57613b1b613ae5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b4957613b49613ae5565b604052919050565b5f6001600160401b03821115613b6957613b69613ae5565b50601f01601f191660200190565b5f805f60608486031215613b89575f80fd5b83359250613b9960208501613ab6565b915060408401356001600160401b03811115613bb3575f80fd5b8401601f81018613613bc3575f80fd5b8035613bd6613bd182613b51565b613b21565b818152876020838501011115613bea575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c5157613c51613c1d565b5092915050565b600181811c90821680613c6c57607f821691505b6020821081036139f857634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613caf5750805b601f840160051c820191505b81811015613cce575f8155600101613cbb565b5050505050565b81516001600160401b03811115613cee57613cee613ae5565b613d0281613cfc8454613c58565b84613c8a565b602080601f831160018114613d35575f8415613d1e5750858301515b5f19600386901b1c1916600185901b178555613d8c565b5f85815260208120601f198616915b82811015613d6357888601518255948401946001909101908401613d44565b5085821015613d8057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dae578181015183820152602001613d96565b50505f910152565b602081525f8251806020840152613dd4816040850160208701613d94565b601f01601f19169190910160400192915050565b5f60208284031215613df8575f80fd5b5051919050565b5f60208083525f8454613e1181613c58565b806020870152604060018084165f8114613e325760018114613e4e57613e7b565b60ff19851660408a0152604084151560051b8a01019550613e7b565b895f5260205f205f5b85811015613e725781548b8201860152908301908801613e57565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613eab57613eab613e89565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613c1d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611574575f80fd5b8051613a1e816139fe565b5f8060408385031215613fc9575f80fd5b82516001600160401b0380821115613fdf575f80fd5b9084019060608287031215613ff2575f80fd5b613ffa613af9565b8251815260208084015161400d81613f99565b82820152604084015183811115614022575f80fd5b80850194505087601f850112614036575f80fd5b83519250614046613bd184613b51565b8381528882858701011115614059575f80fd5b61406884838301848801613d94565b8060408401525081955061407d818801613fad565b9450505050509250929050565b5f6001600160401b038083168181036140a5576140a5613c1d565b6001019392505050565b81810381811115610ad857610ad8613c1d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613c1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c5157613c51613c1d565b5f82516141ed818460208701613d94565b9190910192915050565b5f60208284031215614207575f80fd5b813561155c81613f99565b6001600160401b0381811683821602808216919082811461423557614235613c1d565b505092915050565b5f6001600160401b038084168061425657614256613e89565b92169190910492915050565b5f60208284031215614272575f80fd5b813560ff8116811461155c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516143b13803806143b183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142648061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b5061012761012236600461391d565b610389565b005b348015610134575f80fd5b50610127610143366004613958565b61046b565b348015610153575f80fd5b50610127610162366004613993565b6108ff565b348015610172575f80fd5b506101b1610181366004613993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613993565b610a5b565b3480156101ee575f80fd5b506102026101fd366004613993565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139aa565b610ade565b348015610244575f80fd5b506101276102533660046139c3565b610e61565b348015610263575f80fd5b506101b1610272366004613a01565b611052565b348015610282575f80fd5b50610202610291366004613993565b61106b565b3480156102a1575f80fd5b506101276102b0366004613993565b61107f565b3480156102c0575f80fd5b506101276102cf366004613958565b6110ec565b3480156102df575f80fd5b506101276102ee3660046139c3565b611107565b3480156102fe575f80fd5b5061012761030d3660046139aa565b6112a7565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613993565b611464565b6101b1610371366004613993565b611533565b6101b1610384366004613aac565b61153f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611563565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141b88339815191529184156104bd576104ba8285611577565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b3e565b600481111561050057610500613b3e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206141d88339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613b3e565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206141d88339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f61065184611813565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613b3e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61077085611887565b905082606001516001600160401b03168160a001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f83606001518260a001516107fc9190613b66565b90506108088682611998565b5f6108148785846119e0565b5f8c815260058a01602052604090209091506108308282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613ceb565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613d1d565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141f883398151915292919061094790613b8d565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613b3e565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613d1d565b505050565b610a6481611bfd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b5f610ad864e8d4a5100083613dd2565b92915050565b5f805160206141f88339815191525f610af683611cd0565b90505f80610b078360400151611eb1565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9e57610b9e613b3e565b6005811115610baf57610baf613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c3657610c36613b3e565b1480610c545750600182516005811115610c5257610c52613b3e565b145b610cb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cc857610cc8613b3e565b03610cef57505f8381526006860160205260408120600491610cea91906138d3565b610cf3565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1c57610d1c613b3e565b90816005811115610d2f57610d2f613b3e565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d6357610d63613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2e57610e2e613b3e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141b88339815191525f610e7984611cd0565b90505f80610e8a8360400151612052565b5091509150610e988561228d565b5f8581526004850160205260408120610eb0916138d3565b5f610eba83611887565b9050816001600160401b031681608001516001600160401b03161015610ef25760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f375760405162461bcd60e51b81526004016105dc90613e27565b60015f87815260038701602052604090205460ff166004811115610f5d57610f5d613b3e565b14610fc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613e70565b5f61107582611887565b60a0015192915050565b6110888161228d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b81156110fe576110fc8382611577565b505b610a5683612366565b5f805160206141b88339815191525f61111f84611cd0565b90505f806111308360400151612052565b509150915061113e85611bfd565b5f8581526005850160205260408120611156916138d3565b5f61116083611887565b9050816001600160401b031681608001516001600160401b031610156111985760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003808701602052604090912001546001600160401b03808416911611156111d65760405162461bcd60e51b81526004016105dc90613e27565b60035f87815260038701602052604090205460ff1660048111156111fc576111fc613b3e565b146112505760405162461bcd60e51b815260206004820152603160248201525f805160206141d88339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141f88339815191525f6112bf83611cd0565b90505f806112d08360400151611eb1565b91509150806113325760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461134c90613b8d565b905011801561137e575060015f83815260078601602052604090205460ff16600581111561137c5761137c613b3e565b145b61139a5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058501602052604081206113b2916138d3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141f88339815191529291906114ac90613b8d565b90501180156114de575060015f83815260078301602052604090205460ff1660058111156114dc576114dc613b3e565b145b6114fa5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b5f610ad882333461271e565b5f8061154a34612ad6565b905061155885828686612b80565b9150505b9392505050565b61156b612fd5565b61157481613020565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e99190810190613eed565b915091508061164c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b39190613d1d565b8251146117175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561178d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061179c8460400151613063565b915091508187146118095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206142388339815191526020526040812060030180545f805160206141f8833981519152916001600160401b039091169081908461185883613fbf565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061423883398151915290528390208351918201909352825491925f805160206141f883398151915292829060ff16600581111561190f5761190f613b3e565b600581111561192057611920613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614238833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5957611a19816001613fe4565b611a24906008613e70565b5081515f90839083908110611a3b57611a3b613ff7565b60200101906001600160f81b03191690815f1a905350600101611a05565b505f5b6004811015611abc57611a70816003613fe4565b611a7b906008613e70565b6001901c60f81b82611a8e83600261400b565b81518110611a9e57611a9e613ff7565b60200101906001600160f81b03191690815f1a905350600101611a5c565b505f5b6020811015611b1e57611ad381601f613fe4565b611ade906008613e70565b86901c60f81b82611af083600661400b565b81518110611b0057611b00613ff7565b60200101906001600160f81b03191690815f1a905350600101611abf565b505f5b6008811015611b8957611b35816007613fe4565b611b40906008613e70565b6001600160401b038616901c60f81b82611b5b83602661400b565b81518110611b6b57611b6b613ff7565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6008811015611bf457611ba0816007613fe4565b611bab906008613e70565b6001600160401b038516901c60f81b82611bc683602e61400b565b81518110611bd657611bd6613ff7565b60200101906001600160f81b03191690815f1a905350600101611b8c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141b8833981519152929190611c4590613b8d565b9050118015611c77575060035f83815260038301602052604090205460ff166004811115611c7557611c75613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603360248201525f805160206141d883398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141f88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d45573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6c9190810190613eed565b9150915080611dd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611e365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611ea95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611ed45760405162461bcd60e51b81526004016105dc9061401e565b5f805b6002811015611f2357611eeb816001613fe4565b611ef6906008613e70565b61ffff16858281518110611f0c57611f0c613ff7565b016020015160f81c901b9190911790600101611ed7565b5061ffff811615611f465760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015611fa157611f5d816003613fe4565b611f68906008613e70565b63ffffffff1686611f7a83600261400b565b81518110611f8a57611f8a613ff7565b016020015160f81c901b9190911790600101611f49565b5063ffffffff8116600214611fc85760405162461bcd60e51b81526004016105dc906140aa565b5f805b602081101561201d57611fdf81601f613fe4565b611fea906008613e70565b87611ff683600661400b565b8151811061200657612006613ff7565b016020015160f81c901b9190911790600101611fcb565b505f8660268151811061203257612032613ff7565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120765760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156120c55761208d816001613fe4565b612098906008613e70565b61ffff168682815181106120ae576120ae613ff7565b016020015160f81c901b9190911790600101612079565b5061ffff8116156120e85760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015612143576120ff816003613fe4565b61210a906008613e70565b63ffffffff168761211c83600261400b565b8151811061212c5761212c613ff7565b016020015160f81c901b91909117906001016120eb565b5063ffffffff811660031461216a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156121bf5761218181601f613fe4565b61218c906008613e70565b8861219883600661400b565b815181106121a8576121a8613ff7565b016020015160f81c901b919091179060010161216d565b505f805b600881101561221e576121d7816007613fe4565b6121e2906008613e70565b6001600160401b0316896121f783602661400b565b8151811061220757612207613ff7565b016020015160f81c901b91909117906001016121c3565b505f805b600881101561227d57612236816007613fe4565b612241906008613e70565b6001600160401b03168a61225683602e61400b565b8151811061226657612266613ff7565b016020015160f81c901b9190911790600101612222565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141b88339815191529291906122d590613b8d565b9050118015612307575060015f83815260038301602052604090205460ff16600481111561230557612305613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603860248201525f805160206141d883398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f8051602061423883398151915260205260408082208151610100810190925280545f805160206141f883398151915293929190829060ff1660058111156123b4576123b4613b3e565b60058111156123c5576123c5613b3e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244d5761244d613b3e565b146124a95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146125235760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6125308160a0015161323b565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561257457612574613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126408461263a81611813565b5f6119e0565b5f858152600685016020526040902090915061265c8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612689908590600401613ceb565b6020604051808303815f875af11580156126a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c99190613d1d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127276133dc565b5f61273183610ac8565b90505f805160206141b88339815191525f61274b87611887565b905060028151600581111561276257612762613b3e565b146127c15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260a001516127d291906140f1565b90506127de8882611998565b5f6127e889611813565b90505f8989836040516020016128309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128518661323b565b5f61285d8b84866119e0565b5f83815260048801602052604090209091506128798282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a6908590600401613ceb565b6020604051808303815f875af11580156128c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e69190613d1d565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299557612995613b3e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155c60015f8051602061421883398151915255565b5f5f805160206141b88339815191528282612af082610ac8565b83549091506001600160401b03821610801590612b1a57508260010154816001600160401b031611155b612b785760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612b896133dc565b5f805160206141f8833981519152426001600160401b038516118015612bc357506001600160401b038416612bc1426202a30061400b565b115b612c255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612c7c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612cea5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612d515760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612d5a8561323b565b5f80612da16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613426565b5f82815260058601602052604090209193509150612dbf8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dec908590600401613ceb565b6020604051808303815f875af1158015612e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613d1d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eae57612eae613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f6f83611813565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b7860015f8051602061421883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301e57604051631afcd79f60e31b815260040160405180910390fd5b565b613028612fd5565b613031816137cb565b6115746060820135608083013561304e60c0850160a08601613a01565b61305e60e0860160c08701614111565b6137ec565b5f808251602e146130865760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156130d55761309d816001613fe4565b6130a8906008613e70565b61ffff168582815181106130be576130be613ff7565b016020015160f81c901b9190911790600101613089565b5061ffff8116156130f85760405162461bcd60e51b81526004016105dc90614067565b5f805b60048110156131535761310f816003613fe4565b61311a906008613e70565b63ffffffff168661312c83600261400b565b8151811061313c5761313c613ff7565b016020015160f81c901b91909117906001016130fb565b5063ffffffff811660041461317a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156131cf5761319181601f613fe4565b61319c906008613e70565b876131a883600661400b565b815181106131b8576131b8613ff7565b016020015160f81c901b919091179060010161317d565b505f805b600881101561322e576131e7816007613fe4565b6131f2906008613e70565b6001600160401b03168861320783602661400b565b8151811061321757613217613ff7565b016020015160f81c901b91909117906001016131d3565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141f88339815191529060ff165f03613279575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c19083613fe4565b106132dd576001600160401b03841660408301528082526132fc565b83826040018181516132ef91906140f1565b6001600160401b03169052505b5f826020015183604001516064613313919061412c565b61331d9190614157565b600285015490915060ff90811690821611156133985760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061421883398151915280546001190161340d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061421883398151915255565b5f60608260800151516030146134905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613507576134c7816001613fe4565b6134d2906008613e70565b5081515f908390839081106134e9576134e9613ff7565b60200101906001600160f81b03191690815f1a9053506001016134b3565b505f5b60048110156135655761351e816003613fe4565b613529906008613e70565b505f8261353783600261400b565b8151811061354757613547613ff7565b60200101906001600160f81b03191690815f1a90535060010161350a565b505f5b60208110156135c2578451816020811061358457613584613ff7565b1a60f81b8261359483600661400b565b815181106135a4576135a4613ff7565b60200101906001600160f81b03191690815f1a905350600101613568565b505f5b602081101561362257846020015181602081106135e4576135e4613ff7565b1a60f81b826135f483602661400b565b8151811061360457613604613ff7565b60200101906001600160f81b03191690815f1a9053506001016135c5565b505f5b600881101561369657613639816007613fe4565b613644906008613e70565b60ff1685604001516001600160401b0316901c60f81b82826046613668919061400b565b8151811061367857613678613ff7565b60200101906001600160f81b03191690815f1a905350600101613625565b505f5b603081101561370157846080015181815181106136b8576136b8613ff7565b01602001516001600160f81b031916826136d383604e61400b565b815181106136e3576136e3613ff7565b60200101906001600160f81b03191690815f1a905350600101613699565b505f5b600881101561377357613718816007613fe4565b613723906008613e70565b60608601516001600160401b0390811691161c60f81b8261374583607e61400b565b8151811061375557613755613ff7565b60200101906001600160f81b03191690815f1a905350600101613704565b50600281604051613784919061417c565b602060405180830381855afa15801561379f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137c29190613d1d565b94909350915050565b6137d3612fd5565b6137db613847565b6137e3613857565b6115748161385f565b6137f4612fd5565b5f5f805160206141b8833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61384f612fd5565b61301e6138cb565b61301e612fd5565b613867612fd5565b80355f805160206141f883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138b16060830160408401614197565b600291909101805460ff191660ff90921691909117905550565b613413612fd5565b5080546138df90613b8d565b5f825580601f106138ee575050565b601f0160209004905f5260205f209081019061157491905b80821115613919575f8155600101613906565b5090565b5f60e0828403121561392d575f80fd5b50919050565b8015158114611574575f80fd5b803563ffffffff81168114613953575f80fd5b919050565b5f805f6060848603121561396a575f80fd5b83359250602084013561397c81613933565b915061398a60408501613940565b90509250925092565b5f602082840312156139a3575f80fd5b5035919050565b5f602082840312156139ba575f80fd5b61155c82613940565b5f80604083850312156139d4575f80fd5b6139dd83613940565b946020939093013593505050565b80356001600160401b0381168114613953575f80fd5b5f60208284031215613a11575f80fd5b61155c826139eb565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a5057613a50613a1a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7e57613a7e613a1a565b604052919050565b5f6001600160401b03821115613a9e57613a9e613a1a565b50601f01601f191660200190565b5f805f60608486031215613abe575f80fd5b83359250613ace602085016139eb565b915060408401356001600160401b03811115613ae8575f80fd5b8401601f81018613613af8575f80fd5b8035613b0b613b0682613a86565b613a56565b818152876020838501011115613b1f575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b8657613b86613b52565b5092915050565b600181811c90821680613ba157607f821691505b60208210810361392d57634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613be45750805b601f840160051c820191505b81811015613c03575f8155600101613bf0565b5050505050565b81516001600160401b03811115613c2357613c23613a1a565b613c3781613c318454613b8d565b84613bbf565b602080601f831160018114613c6a575f8415613c535750858301515b5f19600386901b1c1916600185901b178555613cc1565b5f85815260208120601f198616915b82811015613c9857888601518255948401946001909101908401613c79565b5085821015613cb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ce3578181015183820152602001613ccb565b50505f910152565b602081525f8251806020840152613d09816040850160208701613cc9565b601f01601f19169190910160400192915050565b5f60208284031215613d2d575f80fd5b5051919050565b5f60208083525f8454613d4681613b8d565b806020870152604060018084165f8114613d675760018114613d8357613db0565b60ff19851660408a0152604084151560051b8a01019550613db0565b895f5260205f205f5b85811015613da75781548b8201860152908301908801613d8c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613de057613de0613dbe565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613b52565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611574575f80fd5b805161395381613933565b5f8060408385031215613efe575f80fd5b82516001600160401b0380821115613f14575f80fd5b9084019060608287031215613f27575f80fd5b613f2f613a2e565b82518152602080840151613f4281613ece565b82820152604084015183811115613f57575f80fd5b80850194505087601f850112613f6b575f80fd5b83519250613f7b613b0684613a86565b8381528882858701011115613f8e575f80fd5b613f9d84838301848801613cc9565b80604084015250819550613fb2818801613ee2565b9450505050509250929050565b5f6001600160401b03808316818103613fda57613fda613b52565b6001019392505050565b81810381811115610ad857610ad8613b52565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613b52565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b8657613b86613b52565b5f60208284031215614121575f80fd5b813561155c81613ece565b6001600160401b0381811683821602808216919082811461414f5761414f613b52565b505092915050565b5f6001600160401b038084168061417057614170613dbe565b92169190910492915050565b5f825161418d818460208701613cc9565b9190910192915050565b5f602082840312156141a7575f80fd5b813560ff8116811461155c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 50ade4f1d..1b737ea7e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -160,14 +160,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 newValidatorWeight = validator.weight + weight; _setValidatorWeight(validationID, newValidatorWeight); + // Construct the delegation ID. This is guaranteed to be unique since it is + // constructed using a new nonce. uint64 nonce = _getAndIncrementNonce(validationID); - bytes32 delegationID = sha256(abi.encodePacked(validationID, delegatorAddress, nonce)); - - // Ensure the delegationID is not already registered - require( - $._delegatorStakes[delegationID].weight == 0, - "PoSValidatorManager: delegationID already registered" - ); + bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); _checkAndUpdateChurnTracker(weight); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1fe85d75c..6dedd8b98 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -596,7 +596,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ - delegationID: sha256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), + delegationID: keccak256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), validationID: validationID, delegatorAddress: delegatorAddress, nonce: expectedNonce,