From 4de241570e1740e8f0a807274356bdfc8630f232 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 16:38:25 -0500 Subject: [PATCH 01/15] basic test passing --- .../validator-manager/PoSValidatorManager.sol | 78 +++++++++++++++++-- .../interfaces/IPoSValidatorManager.sol | 7 ++ .../tests/PoSValidatorManagerTests.t.sol | 43 +++++++++- .../tests/ValidatorManagerTests.t.sol | 3 +- 4 files changed, 122 insertions(+), 9 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index e9f598152..b20c013d0 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -228,19 +228,26 @@ abstract contract PoSValidatorManager is } // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 uptimeSeconds; + uint64 totalUptime; if (includeUptimeProof) { - uptimeSeconds = _updateUptime(validationID, messageIndex); + totalUptime = _updateUptime(validationID, messageIndex); } else { - uptimeSeconds = $._posValidatorInfo[validationID].uptimeSeconds; + totalUptime = $._posValidatorInfo[validationID].uptimeSeconds; + } + uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; + uptime += $._posValidatorInfo[validationID].lastClaimTime; // offset by last claim time + + uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; + if (lastClaimTime == 0) { + lastClaimTime = validator.startedAt; } uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), - validatorStartTime: validator.startedAt, - stakingStartTime: validator.startedAt, + validatorStartTime: lastClaimTime, + stakingStartTime: lastClaimTime, stakingEndTime: validator.endedAt, - uptimeSeconds: uptimeSeconds, + uptimeSeconds: uptime, initialSupply: 0, endSupply: 0 }); @@ -265,12 +272,67 @@ abstract contract PoSValidatorManager is uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; _reward(owner, rewards); + + emit ValidationRewardsClaimed(validationID, rewards); } // We unlock the stake whether the validation period is completed or invalidated. _unlock(owner, weightToValue(validator.startingWeight)); } + function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external nonReentrant { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = getValidator(validationID); + if (validator.status != ValidatorStatus.Active) { + revert InvalidValidatorStatus(validator.status); + } + + // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. + if (!_isPoSValidator(validationID)) { + revert ValidatorNotPoS(validationID); + } + + // Rewards can only be claimed by the validator owner. + if ($._posValidatorInfo[validationID].owner != _msgSender()) { + revert UnauthorizedOwner(_msgSender()); + } + + // Check that minimum stake duration has passed. + uint64 claimTime = uint64(block.timestamp); + if ( + claimTime + < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration + ) { + revert MinStakeDurationNotPassed(claimTime); + } + + // Uptime proofs include the absolute number of seconds the validator has been active. + uint64 totalUptime = _updateUptime(validationID, messageIndex); + uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; + uptime += $._posValidatorInfo[validationID].lastClaimTime; // offset by last claim time + + uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; + if (lastClaimTime == 0) { + lastClaimTime = validator.startedAt; + } + + uint256 reward = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: lastClaimTime, + stakingStartTime: lastClaimTime, + stakingEndTime: claimTime, + uptimeSeconds: uptime, + initialSupply: 0, + endSupply: 0 + }); + $._posValidatorInfo[validationID].lastClaimUptime = totalUptime; + $._posValidatorInfo[validationID].lastClaimTime = claimTime; + _reward($._posValidatorInfo[validationID].owner, reward); + + emit ValidationRewardsClaimed(validationID, reward); + } + // Helper function that extracts the uptime from a ValidationUptimeMessage Warp message // If the uptime is greater than the stored uptime, update the stored uptime function _updateUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { @@ -338,7 +400,9 @@ abstract contract PoSValidatorManager is owner: _msgSender(), delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration, - uptimeSeconds: 0 + uptimeSeconds: 0, + lastClaimUptime: 0, + lastClaimTime: 0 // TODONOW: This should be initialized to validator.startedAt }); return validationID; } diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 7a2eb9dbd..b11d5e3f7 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -52,6 +52,8 @@ struct PoSValidatorInfo { uint16 delegationFeeBips; uint64 minStakeDuration; uint64 uptimeSeconds; + uint64 lastClaimUptime; + uint64 lastClaimTime; } /** @@ -113,6 +115,8 @@ interface IPoSValidatorManager is IValidatorManager { */ event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward); + /** * @notice Updates the uptime of the validationID if the submitted proof is greated than the stored uptime. * Anybody may call this function to ensure the stored uptime is accurate. Callable only when the validation period is active. @@ -233,4 +237,7 @@ interface IPoSValidatorManager is IValidatorManager { * @param validationID The ID of the validation being ended. */ function claimDelegationFees(bytes32 validationID) external; + + // TODONOW: Consistent placement of messageIndex across interfaces + function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external; } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index dc083471e..97dbbbb7d 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -70,6 +70,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward); + function testDelegationFeeBipsTooLow() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, @@ -1110,6 +1112,39 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } + function testClaimValidationReward() public { + bytes32 validationID = _registerDefaultValidator(); + uint64 uptimePercentage = 80; + + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); + } + + function testClaimValidationRewardInsufficientUptime() public view {} + + function testClaimValidationRewardWithDelegation() public view {} + + function testEndValidationPreviouslyClaimedReward() public view {} + function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, uint16 delegationFeeBips, @@ -1401,6 +1436,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function _expectValidationRewardsIssuance(bytes32 validationID, address account, uint256 amount) internal { + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationRewardsClaimed(validationID, amount); + _expectRewardIssuance(account, amount); + } + function _completeEndValidationWithChecks( bytes32 validationID, address validatorOwner, @@ -1412,7 +1453,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 balanceBefore = _getStakeAssetBalance(validatorOwner); _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); - _expectRewardIssuance(validatorOwner, expectedReward); + _expectValidationRewardsIssuance(validationID, validatorOwner, expectedReward); _completeEndValidation(validationID); diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 6de1e94f5..3c5b8aa5f 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -49,7 +49,8 @@ abstract contract ValidatorManagerTest is Test { uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10 + DEFAULT_WEIGHT; - uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 100_000; + uint64 public constant DEFAULT_MINIMUM_VALIDATION_DURATION = 24 hours; + uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_VALIDATION_DURATION; // solhint-disable-next-line var-name-mixedcase PChainOwner public DEFAULT_P_CHAIN_OWNER; From 2af772920b16c0bf346aa9112aaa544ef81e906e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 17:20:33 -0500 Subject: [PATCH 02/15] revert if no reward claimable --- contracts/validator-manager/PoSValidatorManager.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index b20c013d0..99c64a5e9 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -326,6 +326,9 @@ abstract contract PoSValidatorManager is initialSupply: 0, endSupply: 0 }); + if (reward == 0) { + revert ValidatorIneligibleForRewards(validationID); + } $._posValidatorInfo[validationID].lastClaimUptime = totalUptime; $._posValidatorInfo[validationID].lastClaimTime = claimTime; _reward($._posValidatorInfo[validationID].owner, reward); From 1717d366bf373d7fce05267bbb38cdf75895ac26 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 17:20:51 -0500 Subject: [PATCH 03/15] claimValidatorRewards remaining unit tests --- .../tests/PoSValidatorManagerTests.t.sol | 206 +++++++++++++++++- 1 file changed, 201 insertions(+), 5 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 97dbbbb7d..d599e0953 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1115,17 +1115,80 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testClaimValidationReward() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 80; + uint64 claimTime = DEFAULT_COMPLETION_TIMESTAMP; + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: claimTime, + uptimeSeconds: claimTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + + + vm.warp(claimTime); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); + } + + function testClaimSubsequentValidationReward() public { + bytes32 validationID = _registerDefaultValidator(); + uint64 uptimePercentage = 80; + uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, - uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: firstClaimTime, + uptimeSeconds: firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, initialSupply: 0, endSupply: 0 }); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(firstClaimTime); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); + + // Claim rewards again + uint64 secondClaimTime = firstClaimTime+1000; + expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: firstClaimTime, + stakingStartTime: firstClaimTime, + stakingEndTime: secondClaimTime, + uptimeSeconds: secondClaimTime - firstClaimTime, + initialSupply: 0, + endSupply: 0 + }); + uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (secondClaimTime - firstClaimTime) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(secondClaimTime); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); + } + + function testClaimValidationRewardInsufficientUptime() public { + bytes32 validationID = _registerDefaultValidator(); + uint64 uptimePercentage = 79; + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 @@ -1135,15 +1198,148 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID + ) + ); + posValidatorManager.claimValidationRewards(validationID, 0); + } + + function testClaimValidationRewardWithDelegation() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + // Claim validator rewards + uint64 uptimePercentage = 80; + uint64 claimTime = DEFAULT_COMPLETION_TIMESTAMP; + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: claimTime, + uptimeSeconds: claimTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + + + vm.warp(claimTime); _expectValidationRewardsIssuance(validationID, address(this), expectedReward); posValidatorManager.claimValidationRewards(validationID, 0); + + // End the delegation and claim rewards + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + + _completeEndDelegationWithChecks({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); } - function testClaimValidationRewardInsufficientUptime() public view {} + function testEndValidationPreviouslyClaimedReward() public { + bytes32 validationID = _registerDefaultValidator(); + uint64 uptimePercentage = 80; + uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: firstClaimTime, + uptimeSeconds: firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(firstClaimTime); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); - function testClaimValidationRewardWithDelegation() public view {} + // End the validation and claim rewards again + uint64 secondClaimTime = firstClaimTime+1000; + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: firstClaimTime, + completionTimestamp: secondClaimTime, + expectedNonce: 1, + includeUptime: true, + force: false + }); - function testEndValidationPreviouslyClaimedReward() public view {} + uint256 secondExpectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: firstClaimTime, + stakingStartTime: firstClaimTime, + stakingEndTime: secondClaimTime, + uptimeSeconds: secondClaimTime - firstClaimTime, + initialSupply: 0, + endSupply: 0 + }); + + _completeEndValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: secondExpectedReward, + validatorWeight: DEFAULT_WEIGHT + }); + + // Confirm the pro-rated rewards match the total expected reward + uint256 totalExpectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: secondClaimTime, + uptimeSeconds: secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + // Off-by one errors are possible due to integer rounding + if (totalExpectedReward > expectedReward + secondExpectedReward) { + assertTrue(totalExpectedReward - (expectedReward + secondExpectedReward) <= 1); + } else { + assertTrue((expectedReward + secondExpectedReward) - totalExpectedReward <= 1); + } + } function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, From 8220a73e4daab549603561f7dbc266a2c2a9509d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 14:25:32 -0500 Subject: [PATCH 04/15] correct uptime period calculation --- .../validator-manager/PoSValidatorManager.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 77 +++++++++++++++++-- 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 99c64a5e9..cb23da6db 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -235,7 +235,6 @@ abstract contract PoSValidatorManager is totalUptime = $._posValidatorInfo[validationID].uptimeSeconds; } uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; - uptime += $._posValidatorInfo[validationID].lastClaimTime; // offset by last claim time uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; if (lastClaimTime == 0) { @@ -310,7 +309,6 @@ abstract contract PoSValidatorManager is // Uptime proofs include the absolute number of seconds the validator has been active. uint64 totalUptime = _updateUptime(validationID, messageIndex); uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; - uptime += $._posValidatorInfo[validationID].lastClaimTime; // offset by last claim time uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; if (lastClaimTime == 0) { @@ -329,7 +327,7 @@ abstract contract PoSValidatorManager is if (reward == 0) { revert ValidatorIneligibleForRewards(validationID); } - $._posValidatorInfo[validationID].lastClaimUptime = totalUptime; + $._posValidatorInfo[validationID].lastClaimUptime = (claimTime-lastClaimTime) * 80 / 100; // TODONOW: placeholder $._posValidatorInfo[validationID].lastClaimTime = claimTime; _reward($._posValidatorInfo[validationID].owner, reward); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index d599e0953..2af03cd60 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1139,6 +1139,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); } + // TODONOW: consolidate these tests into helpers function testClaimSubsequentValidationReward() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 80; @@ -1170,13 +1171,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: firstClaimTime, stakingStartTime: firstClaimTime, stakingEndTime: secondClaimTime, - uptimeSeconds: secondClaimTime - firstClaimTime, + uptimeSeconds: secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, initialSupply: 0, endSupply: 0 }); uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, - (secondClaimTime - firstClaimTime) * uptimePercentage / 100 + (secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1185,6 +1186,56 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); } + function testClaimValidationRewardStaleUptime() public { + uint64 validationStartTime = 0; + bytes32 validationID = _registerValidator({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: validationStartTime + }); + uint64 uptimePercentage = 80; + + uint64 firstClaimTime = DEFAULT_MINIMUM_VALIDATION_DURATION+1; // 24 hours + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: validationStartTime, + stakingStartTime: validationStartTime, + stakingEndTime: firstClaimTime, + uptimeSeconds: firstClaimTime - validationStartTime, + initialSupply: 0, + endSupply: 0 + }); + + // uptime = 24 hours * 80% = 19.2 hours + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, + ((firstClaimTime - validationStartTime) * uptimePercentage / 100) + 1 + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(firstClaimTime); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + posValidatorManager.claimValidationRewards(validationID, 0); + + // Attempt to claim rewards again, but by submitting the same uptime + // Total validation time = 24 + 30 hours = 54 hours + // Collection period time = 30 hours + // Required uptime = 24*80% + 30*80% = 43.2 hours + uint64 secondClaimTime = firstClaimTime+5 hours; + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(secondClaimTime); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID + ) + ); + posValidatorManager.claimValidationRewards(validationID, 0); + } + function testClaimValidationRewardInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 79; @@ -1236,6 +1287,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); // End the delegation and claim rewards + // TODONOW: add a delegation helper _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, @@ -1295,11 +1347,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectValidationRewardsIssuance(validationID, address(this), expectedReward); posValidatorManager.claimValidationRewards(validationID, 0); - // End the validation and claim rewards again - uint64 secondClaimTime = firstClaimTime+1000; + // Try to end the validation with a stale uptime + uint64 secondClaimTime = firstClaimTime+5 hours; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID + ) + ); + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: secondClaimTime, + expectedNonce: 1, + includeUptime: false, + force: false + }); + + // Try again with the correct uptime _initializeEndValidation({ validationID: validationID, - registrationTimestamp: firstClaimTime, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: secondClaimTime, expectedNonce: 1, includeUptime: true, From 2025630ab90550c975c956ef0d3c86ca34e028b0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 15:57:52 -0500 Subject: [PATCH 05/15] move uptime threshold check to PoSValidatorManager --- .../ExampleRewardCalculator.sol | 15 +-- .../validator-manager/PoSValidatorManager.sol | 111 ++++++++++++------ .../interfaces/IPoSValidatorManager.sol | 11 +- ...sol => ExampleRewardCalculatorTests.t.sol} | 13 -- .../tests/PoSValidatorManagerTests.t.sol | 92 +++++++-------- .../tests/ValidatorManagerTests.t.sol | 3 +- 6 files changed, 132 insertions(+), 113 deletions(-) rename contracts/validator-manager/tests/{ExamplesRewardCalculatorTests.t.sol => ExampleRewardCalculatorTests.t.sol} (74%) diff --git a/contracts/validator-manager/ExampleRewardCalculator.sol b/contracts/validator-manager/ExampleRewardCalculator.sol index 79740d61a..8d704e456 100644 --- a/contracts/validator-manager/ExampleRewardCalculator.sol +++ b/contracts/validator-manager/ExampleRewardCalculator.sol @@ -10,8 +10,6 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; - uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; - uint64 public immutable rewardBasisPoints; constructor(uint64 rewardBasisPoints_) { @@ -23,22 +21,13 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 validatorStartTime, + uint64, // validatorStartTime uint64 stakingStartTime, uint64 stakingEndTime, - uint64 uptimeSeconds, + uint64, // uptimeSeconds uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - // Equivalent to uptimeSeconds/(validator.endedAt - validator.startedAt) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 - // Rearranged to prevent integer division truncation. - if ( - uptimeSeconds * 100 - < (stakingEndTime - validatorStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - return 0; - } - return (stakeAmount * rewardBasisPoints * (stakingEndTime - stakingStartTime)) / SECONDS_IN_YEAR / 10000; } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index cb23da6db..02dda25b5 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -75,6 +75,8 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + error InvalidDelegationFee(uint16 delegationFeeBips); error InvalidDelegationID(bytes32 delegationID); error InvalidDelegatorStatus(DelegatorStatus status); @@ -183,9 +185,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - if (!_initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex)) { - revert ValidatorIneligibleForRewards(validationID); - } + _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex, true); } function forceInitializeEndValidation( @@ -193,8 +193,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - // Ignore the return value here to force end validation, regardless of possible missed rewards - _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex); + _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex, false); } // Helper function that initializes the end of a PoS validation period. @@ -203,15 +202,16 @@ abstract contract PoSValidatorManager is function _initializeEndPoSValidation( bytes32 validationID, bool includeUptimeProof, - uint32 messageIndex - ) internal returns (bool) { + uint32 messageIndex, + bool requireSufficientUptime + ) internal { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Validator memory validator = _initializeEndValidation(validationID); // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. if (!_isPoSValidator(validationID)) { - return true; + return; } // PoS validations can only be ended by their owners. @@ -234,12 +234,17 @@ abstract contract PoSValidatorManager is } else { totalUptime = $._posValidatorInfo[validationID].uptimeSeconds; } - uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; - + uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimMinUptime; uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; if (lastClaimTime == 0) { lastClaimTime = validator.startedAt; } + if ( + requireSufficientUptime + && !_validateSufficientUptime(uptime, lastClaimTime, validator.endedAt) + ) { + revert ValidatorIneligibleForRewards(validationID); + } uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), @@ -251,7 +256,6 @@ abstract contract PoSValidatorManager is endSupply: 0 }); $._redeemableValidatorRewards[validationID] += reward; - return (reward > 0); } function completeEndValidation(uint32 messageIndex) external nonReentrant { @@ -279,7 +283,34 @@ abstract contract PoSValidatorManager is _unlock(owner, weightToValue(validator.startingWeight)); } - function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external nonReentrant { + function _validateSufficientUptime( + uint64 uptimeSeconds, + uint64 periodStartTime, + uint64 periodEndTime + ) internal pure returns (bool) { + // Equivalent to uptimeSeconds/(periodEndTime - periodStartTime) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 + // Rearranged to prevent integer division truncation. + if ( + uptimeSeconds * 100 + < (periodEndTime - periodStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + return false; + } + return true; + } + + /** + * @notice Claim pro-rated validation rewards. Rewards are calculated from the last time rewards were claimed, + * or the beginning of the validation period, whichever is later. Reward eligibility is determined by the + * submitted uptime proof. + * + * + * @dev See {IPoSValidatorManager-claimValidationRewards}. + */ + function claimValidationRewards( + bytes32 validationID, + uint32 messageIndex + ) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Validator memory validator = getValidator(validationID); @@ -299,21 +330,26 @@ abstract contract PoSValidatorManager is // Check that minimum stake duration has passed. uint64 claimTime = uint64(block.timestamp); - if ( - claimTime - < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration - ) { + if (claimTime < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration) { revert MinStakeDurationNotPassed(claimTime); } - // Uptime proofs include the absolute number of seconds the validator has been active. + // The claim's uptime is the difference between the total uptime and the minimum possible uptime from the last claim. + // We use the minimum uptime to get a lower bound on the required uptime for this claim uint64 totalUptime = _updateUptime(validationID, messageIndex); - uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimUptime; + uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimMinUptime; + // If no rewards have yet been claimed, use the validator's start time uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; if (lastClaimTime == 0) { lastClaimTime = validator.startedAt; } + // Validate the uptime for this claim. Given that all previous claims have been similarly validated, + // this is equivalent to validating the uptime of the entire validation period up to this point, due + // to the linearity of the uptime threshold calculation. + if (!_validateSufficientUptime(uptime, lastClaimTime, claimTime)) { + revert ValidatorIneligibleForRewards(validationID); + } uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), @@ -324,10 +360,8 @@ abstract contract PoSValidatorManager is initialSupply: 0, endSupply: 0 }); - if (reward == 0) { - revert ValidatorIneligibleForRewards(validationID); - } - $._posValidatorInfo[validationID].lastClaimUptime = (claimTime-lastClaimTime) * 80 / 100; // TODONOW: placeholder + + $._posValidatorInfo[validationID].lastClaimMinUptime = (claimTime - lastClaimTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; $._posValidatorInfo[validationID].lastClaimTime = claimTime; _reward($._posValidatorInfo[validationID].owner, reward); @@ -402,7 +436,7 @@ abstract contract PoSValidatorManager is delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration, uptimeSeconds: 0, - lastClaimUptime: 0, + lastClaimMinUptime: 0, lastClaimTime: 0 // TODONOW: This should be initialized to validator.startedAt }); return validationID; @@ -524,9 +558,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - if (!_initializeEndDelegation(delegationID, includeUptimeProof, messageIndex)) { - revert DelegatorIneligibleForRewards(delegationID); - } + _initializeEndDelegation(delegationID, includeUptimeProof, messageIndex, true); } function forceInitializeEndDelegation( @@ -534,8 +566,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - // Ignore the return value here to force end delegation, regardless of possible missed rewards - _initializeEndDelegation(delegationID, includeUptimeProof, messageIndex); + _initializeEndDelegation(delegationID, includeUptimeProof, messageIndex, false); } // Helper function that initializes the end of a PoS delegation period. @@ -544,8 +575,9 @@ abstract contract PoSValidatorManager is function _initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, - uint32 messageIndex - ) internal returns (bool) { + uint32 messageIndex, + bool requireSufficientUptime + ) internal { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; @@ -576,20 +608,21 @@ abstract contract PoSValidatorManager is _setValidatorWeight(validationID, validator.weight - delegator.weight); uint256 reward = _calculateDelegationReward(delegator); + if (requireSufficientUptime && reward == 0) { + revert DelegatorIneligibleForRewards(delegationID); + } $._redeemableDelegatorRewards[delegationID] = reward; emit DelegatorRemovalInitialized({ delegationID: delegationID, validationID: validationID }); - return (reward > 0); } else if (validator.status == ValidatorStatus.Completed) { + // If the validator has completed, then no further uptimes may be submitted, so we always + // end the delegation $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); _completeEndDelegation(delegationID); - // If the validator has completed, then no further uptimes may be submitted, so we always - // end the delegation - return true; } else { revert InvalidValidatorStatus(validator.status); } @@ -622,6 +655,16 @@ abstract contract PoSValidatorManager is return 0; } + if ( + !_validateSufficientUptime( + $._posValidatorInfo[delegator.validationID].uptimeSeconds, + validator.startedAt, + delegationEndTime + ) + ) { + return 0; + } + return $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(delegator.weight), validatorStartTime: validator.startedAt, diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index b11d5e3f7..425a026eb 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -52,7 +52,7 @@ struct PoSValidatorInfo { uint16 delegationFeeBips; uint64 minStakeDuration; uint64 uptimeSeconds; - uint64 lastClaimUptime; + uint64 lastClaimMinUptime; uint64 lastClaimTime; } @@ -238,6 +238,13 @@ interface IPoSValidatorManager is IValidatorManager { */ function claimDelegationFees(bytes32 validationID) external; - // TODONOW: Consistent placement of messageIndex across interfaces + /** + * @notice Withdraws pro-rated rewards for an active validation to the owner of the validator. + * Uses the uptime proof provided in the Warp message to determine rewards eligibility. Reverts if the uptime is not eligible for rewards. + * Rewards are calculated from the last time this function was called, or the beginning of the + * validation, whichever is later. + * @param validationID The ID of the validation being claimed. + * @param messageIndex The index of the Warp message to be received providing the uptime proof. + */ function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external; } diff --git a/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol similarity index 74% rename from contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol rename to contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol index 87b18020c..1193cb271 100644 --- a/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol @@ -34,17 +34,4 @@ contract ExampleRewardCalculatorTest is Test { }); assertEq(output, 42e8); } - - function testInsufficientUptime() public view { - uint256 output = exampleRewardCalculator.calculateReward({ - stakeAmount: DEFAULT_STAKE_AMOUNT, - validatorStartTime: DEFAULT_START_TIME, - stakingStartTime: DEFAULT_START_TIME, - stakingEndTime: DEFAULT_END_TIME, - uptimeSeconds: DEFAULT_UPTIME - 1, - initialSupply: 0, - endSupply: 0 - }); - assertEq(output, 0); - } } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 2af03cd60..b6fd9cf6e 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1085,33 +1085,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _forceInitializeEndValidation(validationID, true); } - function testValueToWeight() public view { - uint64 w1 = posValidatorManager.valueToWeight(1e12); - uint64 w2 = posValidatorManager.valueToWeight(1e18); - uint64 w3 = posValidatorManager.valueToWeight(1e27); - - assertEq(w1, 1); - assertEq(w2, 1e6); - assertEq(w3, 1e15); - } - - function testWeightToValue() public view { - uint256 v1 = posValidatorManager.weightToValue(1); - uint256 v2 = posValidatorManager.weightToValue(1e6); - uint256 v3 = posValidatorManager.weightToValue(1e15); - - assertEq(v1, 1e12); - assertEq(v2, 1e18); - assertEq(v3, 1e27); - } - - function testPoSValidatorManagerStorageSlot() public view { - assertEq( - _erc7201StorageSlot("PoSValidatorManager"), - posValidatorManager.POS_VALIDATOR_MANAGER_STORAGE_LOCATION() - ); - } - function testClaimValidationReward() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 80; @@ -1127,13 +1100,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, - (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); - vm.warp(claimTime); _expectValidationRewardsIssuance(validationID, address(this), expectedReward); posValidatorManager.claimValidationRewards(validationID, 0); @@ -1155,8 +1126,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, - (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1165,7 +1135,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); // Claim rewards again - uint64 secondClaimTime = firstClaimTime+1000; + uint64 secondClaimTime = firstClaimTime + 1000; expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: firstClaimTime, @@ -1197,8 +1167,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: validationStartTime }); uint64 uptimePercentage = 80; - - uint64 firstClaimTime = DEFAULT_MINIMUM_VALIDATION_DURATION+1; // 24 hours + + uint64 firstClaimTime = DEFAULT_MINIMUM_VALIDATION_DURATION + 1; // 24 hours uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: validationStartTime, @@ -1209,10 +1179,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - // uptime = 24 hours * 80% = 19.2 hours bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, - ((firstClaimTime - validationStartTime) * uptimePercentage / 100) + 1 + validationID, ((firstClaimTime - validationStartTime) * uptimePercentage / 100) + 1 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1221,10 +1189,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); // Attempt to claim rewards again, but by submitting the same uptime - // Total validation time = 24 + 30 hours = 54 hours - // Collection period time = 30 hours - // Required uptime = 24*80% + 30*80% = 43.2 hours - uint64 secondClaimTime = firstClaimTime+5 hours; + uint64 secondClaimTime = firstClaimTime + 5 hours; _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); vm.warp(secondClaimTime); @@ -1247,7 +1212,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); - vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector( @@ -1275,13 +1239,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, - (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); - vm.warp(claimTime); _expectValidationRewardsIssuance(validationID, address(this), expectedReward); posValidatorManager.claimValidationRewards(validationID, 0); @@ -1338,8 +1300,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, - (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1348,7 +1309,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); // Try to end the validation with a stale uptime - uint64 secondClaimTime = firstClaimTime+5 hours; + uint64 secondClaimTime = firstClaimTime + 5 hours; vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID @@ -1408,6 +1369,33 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } } + function testValueToWeight() public view { + uint64 w1 = posValidatorManager.valueToWeight(1e12); + uint64 w2 = posValidatorManager.valueToWeight(1e18); + uint64 w3 = posValidatorManager.valueToWeight(1e27); + + assertEq(w1, 1); + assertEq(w2, 1e6); + assertEq(w3, 1e15); + } + + function testWeightToValue() public view { + uint256 v1 = posValidatorManager.weightToValue(1); + uint256 v2 = posValidatorManager.weightToValue(1e6); + uint256 v3 = posValidatorManager.weightToValue(1e15); + + assertEq(v1, 1e12); + assertEq(v2, 1e18); + assertEq(v3, 1e27); + } + + function testPoSValidatorManagerStorageSlot() public view { + assertEq( + _erc7201StorageSlot("PoSValidatorManager"), + posValidatorManager.POS_VALIDATOR_MANAGER_STORAGE_LOCATION() + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, uint16 delegationFeeBips, @@ -1699,7 +1687,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } - function _expectValidationRewardsIssuance(bytes32 validationID, address account, uint256 amount) internal { + function _expectValidationRewardsIssuance( + bytes32 validationID, + address account, + uint256 amount + ) internal { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationRewardsClaimed(validationID, amount); _expectRewardIssuance(account, amount); diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 3c5b8aa5f..1314b13b6 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -50,7 +50,8 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10 + DEFAULT_WEIGHT; uint64 public constant DEFAULT_MINIMUM_VALIDATION_DURATION = 24 hours; - uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_VALIDATION_DURATION; + uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = + DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_VALIDATION_DURATION; // solhint-disable-next-line var-name-mixedcase PChainOwner public DEFAULT_P_CHAIN_OWNER; From 32f05d94633e9fc0d9d43bbde202531c6bca884f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 16:36:27 -0500 Subject: [PATCH 06/15] remove unused reward sparams --- .../tests/ExampleRewardCalculatorTests.t.sol | 5 +- .../tests/PoSValidatorManagerTests.t.sol | 64 +++++++++---------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol b/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol index 1193cb271..122ab6508 100644 --- a/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol +++ b/contracts/validator-manager/tests/ExampleRewardCalculatorTests.t.sol @@ -15,7 +15,6 @@ contract ExampleRewardCalculatorTest is Test { uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; uint64 public constant DEFAULT_START_TIME = 1000; uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds - uint64 public constant DEFAULT_UPTIME = (DEFAULT_END_TIME - DEFAULT_START_TIME) * 80 / 100; uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { @@ -25,10 +24,10 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { uint256 output = exampleRewardCalculator.calculateReward({ stakeAmount: DEFAULT_STAKE_AMOUNT, - validatorStartTime: DEFAULT_START_TIME, + validatorStartTime: 0, stakingStartTime: DEFAULT_START_TIME, stakingEndTime: DEFAULT_END_TIME, - uptimeSeconds: DEFAULT_UPTIME, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index b6fd9cf6e..94911086c 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -509,10 +509,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -641,10 +641,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: validationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -713,10 +713,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, - uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -766,10 +766,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -907,10 +907,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -942,10 +942,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, - uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1091,10 +1091,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 claimTime = DEFAULT_COMPLETION_TIMESTAMP; uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: claimTime, - uptimeSeconds: claimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1117,10 +1117,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: firstClaimTime, - uptimeSeconds: firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1138,10 +1138,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 secondClaimTime = firstClaimTime + 1000; expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: firstClaimTime, + validatorStartTime: 0, stakingStartTime: firstClaimTime, stakingEndTime: secondClaimTime, - uptimeSeconds: secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1171,10 +1171,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 firstClaimTime = DEFAULT_MINIMUM_VALIDATION_DURATION + 1; // 24 hours uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: validationStartTime, + validatorStartTime: 0, stakingStartTime: validationStartTime, stakingEndTime: firstClaimTime, - uptimeSeconds: firstClaimTime - validationStartTime, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1230,10 +1230,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 claimTime = DEFAULT_COMPLETION_TIMESTAMP; uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: claimTime, - uptimeSeconds: claimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1264,10 +1264,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1291,10 +1291,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: firstClaimTime, - uptimeSeconds: firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1336,10 +1336,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 secondExpectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: firstClaimTime, + validatorStartTime: 0, stakingStartTime: firstClaimTime, stakingEndTime: secondClaimTime, - uptimeSeconds: secondClaimTime - firstClaimTime, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1354,10 +1354,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Confirm the pro-rated rewards match the total expected reward uint256 totalExpectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: secondClaimTime, - uptimeSeconds: secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); @@ -1671,10 +1671,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(validatorWeight), - validatorStartTime: completeRegistrationTimestamp, + validatorStartTime: 0, stakingStartTime: completeRegistrationTimestamp, stakingEndTime: completionTimestamp, - uptimeSeconds: completionTimestamp - completeRegistrationTimestamp, + uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); From b61b8b2b1766e10bde266176205308187429083c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 16:58:45 -0500 Subject: [PATCH 07/15] add testing helpers --- .../validator-manager/PoSValidatorManager.sol | 11 +- .../tests/PoSValidatorManagerTests.t.sol | 291 ++++++++---------- 2 files changed, 137 insertions(+), 165 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 02dda25b5..22bec0bae 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -299,10 +299,10 @@ abstract contract PoSValidatorManager is return true; } - /** + /** * @notice Claim pro-rated validation rewards. Rewards are calculated from the last time rewards were claimed, - * or the beginning of the validation period, whichever is later. Reward eligibility is determined by the - * submitted uptime proof. + * or the beginning of the validation period, whichever is later. Reward eligibility is determined by the + * submitted uptime proof. * * * @dev See {IPoSValidatorManager-claimValidationRewards}. @@ -361,7 +361,8 @@ abstract contract PoSValidatorManager is endSupply: 0 }); - $._posValidatorInfo[validationID].lastClaimMinUptime = (claimTime - lastClaimTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; + $._posValidatorInfo[validationID].lastClaimMinUptime = + (claimTime - lastClaimTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; $._posValidatorInfo[validationID].lastClaimTime = claimTime; _reward($._posValidatorInfo[validationID].owner, reward); @@ -437,7 +438,7 @@ abstract contract PoSValidatorManager is minStakeDuration: minStakeDuration, uptimeSeconds: 0, lastClaimMinUptime: 0, - lastClaimTime: 0 // TODONOW: This should be initialized to validator.startedAt + lastClaimTime: 0 }); return validationID; } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 94911086c..787870384 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -494,40 +494,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testCompleteEndDelegation() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - - _initializeEndDelegationValidatorActiveWithChecks({ - validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - delegationID: delegationID, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2, - includeUptime: true, - force: false - }); - - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: 0, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); - - _completeEndDelegationWithChecks({ - validationID: validationID, - delegationID: delegationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, - delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedTotalReward: expectedTotalReward, - delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, - validatorWeight: DEFAULT_WEIGHT, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 - }); + _initializeAndCompleteEndDelegationWithChecks(validationID, delegationID); } // Delegator registration is not allowed when Validator is pending removed. @@ -1110,50 +1077,36 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.claimValidationRewards(validationID, 0); } - // TODONOW: consolidate these tests into helpers function testClaimSubsequentValidationReward() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 80; uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; - uint256 expectedReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingEndTime: firstClaimTime, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); - bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(firstClaimTime); - _expectValidationRewardsIssuance(validationID, address(this), expectedReward); - posValidatorManager.claimValidationRewards(validationID, 0); + _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: firstClaimTime, + lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + success: true + }); // Claim rewards again uint64 secondClaimTime = firstClaimTime + 1000; - expectedReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: firstClaimTime, - stakingEndTime: secondClaimTime, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(secondClaimTime); - _expectValidationRewardsIssuance(validationID, address(this), expectedReward); - posValidatorManager.claimValidationRewards(validationID, 0); + _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: secondClaimTime, + lastClaimTime: firstClaimTime, + success: true + }); } function testClaimValidationRewardStaleUptime() public { @@ -1167,38 +1120,30 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: validationStartTime }); uint64 uptimePercentage = 80; - uint64 firstClaimTime = DEFAULT_MINIMUM_VALIDATION_DURATION + 1; // 24 hours - uint256 expectedReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: validationStartTime, - stakingEndTime: firstClaimTime, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, ((firstClaimTime - validationStartTime) * uptimePercentage / 100) + 1 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(firstClaimTime); - _expectValidationRewardsIssuance(validationID, address(this), expectedReward); - posValidatorManager.claimValidationRewards(validationID, 0); + _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: validationStartTime, + claimTime: firstClaimTime, + lastClaimTime: validationStartTime, + success: true + }); // Attempt to claim rewards again, but by submitting the same uptime uint64 secondClaimTime = firstClaimTime + 5 hours; - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(secondClaimTime); - vm.expectRevert( - abi.encodeWithSelector( - PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID - ) - ); - posValidatorManager.claimValidationRewards(validationID, 0); + _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: validationStartTime, + claimTime: secondClaimTime, + lastClaimTime: firstClaimTime, + success: false + }); } function testClaimValidationRewardInsufficientUptime() public { @@ -1209,16 +1154,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - - vm.warp(DEFAULT_COMPLETION_TIMESTAMP); - vm.expectRevert( - abi.encodeWithSelector( - PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID - ) - ); - posValidatorManager.claimValidationRewards(validationID, 0); + _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: DEFAULT_COMPLETION_TIMESTAMP, + lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + success: false + }); } function testClaimValidationRewardWithDelegation() public { @@ -1228,85 +1171,39 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Claim validator rewards uint64 uptimePercentage = 80; uint64 claimTime = DEFAULT_COMPLETION_TIMESTAMP; - uint256 expectedReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingEndTime: claimTime, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); - bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (claimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(claimTime); - _expectValidationRewardsIssuance(validationID, address(this), expectedReward); - posValidatorManager.claimValidationRewards(validationID, 0); - - // End the delegation and claim rewards - // TODONOW: add a delegation helper - _initializeEndDelegationValidatorActiveWithChecks({ + _claimRewards({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - delegationID: delegationID, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2, - includeUptime: true, - force: false - }); - - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: 0, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: claimTime, + lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + success: true }); - _completeEndDelegationWithChecks({ - validationID: validationID, - delegationID: delegationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, - delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedTotalReward: expectedTotalReward, - delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, - validatorWeight: DEFAULT_WEIGHT, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 - }); + // End the delegation and claim rewards + _initializeAndCompleteEndDelegationWithChecks(validationID, delegationID); } function testEndValidationPreviouslyClaimedReward() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 80; uint64 firstClaimTime = DEFAULT_COMPLETION_TIMESTAMP; - uint256 expectedReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingEndTime: firstClaimTime, - uptimeSeconds: 0, - initialSupply: 0, - endSupply: 0 - }); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - vm.warp(firstClaimTime); - _expectValidationRewardsIssuance(validationID, address(this), expectedReward); - posValidatorManager.claimValidationRewards(validationID, 0); + uint256 expectedReward = _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: firstClaimTime, + lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + success: true + }); // Try to end the validation with a stale uptime uint64 secondClaimTime = firstClaimTime + 5 hours; @@ -1772,6 +1669,80 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.completeEndDelegation(0, delegationID); } + function _initializeAndCompleteEndDelegationWithChecks( + bytes32 validationID, + bytes32 delegationID + ) internal { + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: 0, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: 0, + initialSupply: 0, + endSupply: 0 + }); + + _completeEndDelegationWithChecks({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); + } + + function _claimRewards( + bytes32 validationID, + bytes memory uptimeMsg, + uint64 validationStartTime, + uint64 claimTime, + uint64 lastClaimTime, + bool success + ) internal returns (uint256) { + uint256 expectedReward; + if (success) { + expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: validationStartTime, + stakingStartTime: lastClaimTime, + stakingEndTime: claimTime, + uptimeSeconds: 0, + initialSupply: 0, + endSupply: 0 + }); + _expectValidationRewardsIssuance(validationID, address(this), expectedReward); + } else { + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID + ) + ); + } + + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + vm.warp(claimTime); + posValidatorManager.claimValidationRewards(validationID, 0); + return expectedReward; + } + function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; function _expectRewardIssuance(address account, uint256 amount) internal virtual; From 776c72da11762b7f8914fff0bf77d41d2df8393a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 17:00:44 -0500 Subject: [PATCH 08/15] reorder methods --- .../validator-manager/PoSValidatorManager.sol | 32 +++++++++---------- .../interfaces/IPoSValidatorManager.sol | 20 ++++++------ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 22bec0bae..672446dd0 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -283,22 +283,6 @@ abstract contract PoSValidatorManager is _unlock(owner, weightToValue(validator.startingWeight)); } - function _validateSufficientUptime( - uint64 uptimeSeconds, - uint64 periodStartTime, - uint64 periodEndTime - ) internal pure returns (bool) { - // Equivalent to uptimeSeconds/(periodEndTime - periodStartTime) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 - // Rearranged to prevent integer division truncation. - if ( - uptimeSeconds * 100 - < (periodEndTime - periodStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - return false; - } - return true; - } - /** * @notice Claim pro-rated validation rewards. Rewards are calculated from the last time rewards were claimed, * or the beginning of the validation period, whichever is later. Reward eligibility is determined by the @@ -369,6 +353,22 @@ abstract contract PoSValidatorManager is emit ValidationRewardsClaimed(validationID, reward); } + function _validateSufficientUptime( + uint64 uptimeSeconds, + uint64 periodStartTime, + uint64 periodEndTime + ) internal pure returns (bool) { + // Equivalent to uptimeSeconds/(periodEndTime - periodStartTime) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 + // Rearranged to prevent integer division truncation. + if ( + uptimeSeconds * 100 + < (periodEndTime - periodStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + return false; + } + return true; + } + // Helper function that extracts the uptime from a ValidationUptimeMessage Warp message // If the uptime is greater than the stored uptime, update the stored uptime function _updateUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 425a026eb..edd475935 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -158,6 +158,16 @@ interface IPoSValidatorManager is IValidatorManager { uint32 messageIndex ) external; + /** + * @notice Withdraws pro-rated rewards for an active validation to the owner of the validator. + * Uses the uptime proof provided in the Warp message to determine rewards eligibility. Reverts if the uptime is not eligible for rewards. + * Rewards are calculated from the last time this function was called, or the beginning of the + * validation, whichever is later. + * @param validationID The ID of the validation being claimed. + * @param messageIndex The index of the Warp message to be received providing the uptime proof. + */ + function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external; + /** * @notice Completes the delegator registration process by returning an acknowledgement of the registration of a * validationID from the P-Chain. After this function is called, the validator's weight is updated in the contract state. @@ -237,14 +247,4 @@ interface IPoSValidatorManager is IValidatorManager { * @param validationID The ID of the validation being ended. */ function claimDelegationFees(bytes32 validationID) external; - - /** - * @notice Withdraws pro-rated rewards for an active validation to the owner of the validator. - * Uses the uptime proof provided in the Warp message to determine rewards eligibility. Reverts if the uptime is not eligible for rewards. - * Rewards are calculated from the last time this function was called, or the beginning of the - * validation, whichever is later. - * @param validationID The ID of the validation being claimed. - * @param messageIndex The index of the Warp message to be received providing the uptime proof. - */ - function claimValidationRewards(bytes32 validationID, uint32 messageIndex) external; } From dd390a940b555a78dda84c85115056dbbac8d318 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 17:04:19 -0500 Subject: [PATCH 09/15] consistent messageIndex placement --- contracts/validator-manager/PoSValidatorManager.sol | 6 +++--- .../interfaces/IPoSValidatorManager.sol | 8 ++++---- .../tests/PoSValidatorManagerTests.t.sol | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 672446dd0..a2e1fb622 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -507,7 +507,7 @@ abstract contract PoSValidatorManager is return delegationID; } - function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { + function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; @@ -705,8 +705,8 @@ abstract contract PoSValidatorManager is } function completeEndDelegation( - uint32 messageIndex, - bytes32 delegationID + bytes32 delegationID, + uint32 messageIndex ) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index edd475935..b8901535c 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -176,10 +176,10 @@ interface IPoSValidatorManager is IValidatorManager { * the delegation is considered active after this function is called. * Note: only the specified delegation will be marked as registered, even if the validator weight update * message implicitly includes multiple weight changes. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegationID The ID of the delegation being registered. + * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ - function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; + function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) external; /** * @notice Begins the process of removing a delegator from a validation period, and reverts if the delegation is not eligible for rewards. @@ -236,10 +236,10 @@ interface IPoSValidatorManager is IValidatorManager { * weight change pertaining to the delegation ending is included in any subsequent validator weight update messages. * Note: only the specified delegation will be marked as completed, even if the validator weight update * message implicitly includes multiple weight changes. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegationID The ID of the delegation being removed. + * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ - function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; + function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) external; /** * @notice Withdraws the delegation fees from completed delegations to the owner of the validator. diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 787870384..40f5f3b28 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -342,7 +342,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert(abi.encodeWithSelector(PoSValidatorManager.InvalidNonce.selector, nonce)); - posValidatorManager.completeDelegatorRegistration(0, delegationID2); + posValidatorManager.completeDelegatorRegistration(delegationID2, 0); } function testCompleteDelegatorRegistrationImplicitNonce() public { @@ -662,7 +662,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // warp to right after validator ended vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1); - posValidatorManager.completeDelegatorRegistration(0, delegationID); + posValidatorManager.completeDelegatorRegistration(delegationID, 0); assertEq( _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS), @@ -753,7 +753,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); _expectRewardIssuance(DEFAULT_DELEGATOR_ADDRESS, expectedDelegatorReward); - posValidatorManager.completeEndDelegation(0, delegationID); + posValidatorManager.completeEndDelegation(delegationID, 0); assertEq( _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS), @@ -819,7 +819,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.expectRevert(abi.encodeWithSelector(PoSValidatorManager.InvalidNonce.selector, nonce)); - posValidatorManager.completeEndDelegation(0, delegationID2); + posValidatorManager.completeEndDelegation(delegationID2, 0); } function testCompleteEndDelegationImplicitNonce() public { @@ -1366,7 +1366,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); - posValidatorManager.completeDelegatorRegistration(0, delegationID); + posValidatorManager.completeDelegatorRegistration(delegationID, 0); } function _setUpCompleteDelegatorRegistrationWithChecks( @@ -1666,7 +1666,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _mockGetPChainWarpMessage(weightUpdateMessage, true); - posValidatorManager.completeEndDelegation(0, delegationID); + posValidatorManager.completeEndDelegation(delegationID, 0); } function _initializeAndCompleteEndDelegationWithChecks( From 5a608bc946b0a7c18037595f47264b1b4b911d55 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 17:06:11 -0500 Subject: [PATCH 10/15] update abi --- .../ERC20TokenStakingManager.go | 257 ++++++++++++++++-- .../ExampleRewardCalculator.go | 53 +--- .../NativeTokenStakingManager.go | 257 ++++++++++++++++-- 3 files changed, 473 insertions(+), 94 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f62018b5b..565826686 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput 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\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"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\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f02380380615f0283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615db58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614fd3565b6104a8565b005b61020961021936600461500e565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614fd3565b6106eb565b61020961025e366004615025565b6106f6565b610209610271366004615073565b610be2565b61028961028436600461500e565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614fd3565b610c6c565b6102096102de366004615094565b610c77565b6102f66102f13660046150d4565b610d39565b604051908152602001610234565b610209610312366004615139565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615161565b610fd9565b61028961035536600461500e565b610ff2565b6102f65f81565b61020961036f366004614fd3565b611006565b610226603081565b61020961038a36600461500e565b611031565b61020961039d366004615139565b6110fc565b6102f66103b036600461517a565b6112d4565b6102096103c3366004615094565b611300565b6102f65f80516020615d2983398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b61020961041036600461500e565b611489565b6102f65f80516020615d4983398151915281565b61020961043736600461500e565b611672565b610226601481565b61045761045236600461500e565b6117af565b604051610234919061520f565b6102896202a30081565b6102f65f80516020615d0983398151915281565b6102096104903660046152a3565b6118fe565b6102f66104a33660046152e1565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff16600581111561052a5761052a61519a565b600581111561053b5761053b61519a565b815260200160018201805461054f9061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061534c565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161519a565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615392565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906153a4565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615d498339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906153a4565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016153bb565b6001600160a01b03161461082c5761080760608401604085016153bb565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856153d6565b905090505f805b828163ffffffff161015610b22575f61085d60608801886153d6565b8363ffffffff168181106108735761087361541b565b9050602002810190610885919061542f565b61088e90615553565b80516040519192505f9160088801916108a6916155cc565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615392565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f916155cc565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906153a4565b90508086600801835f015160405161097591906155cc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761519a565b021790555060208201516001820190610a109082615621565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab59116856156f0565b8251604051919550610ac6916155cc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615703565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f91906155cc565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906153a4565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612189565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61519a565b14610c4c578060405163170cc93360e21b81526004016104cf9190615384565b6106e583836121c4565b5f610c6664e8d4a5100083615725565b92915050565b6106e583838361243e565b610c7f612637565b5f80516020615d298339815191525f80610c988461266e565b91509150610ca582612189565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061519a565b03610d05575f83815260078501602052604081208054919055610d0382826129ac565b505b610d1b81610d168460400151610fd9565b612a22565b505050505b610d3660015f80516020615d6983398151915255565b50565b5f610d42612637565b610d4e85858585612a58565b9050610d6660015f80516020615d6983398151915255565b949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115610dbb57610dbb61519a565b6003811115610dcc57610dcc61519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961519a565b14610e7a578251604051633b0d540d60e21b81526104cf9190600401615744565b600481516005811115610e8f57610e8f61519a565b03610ea557610e9d85612c31565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e18565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a5100061575e565b5f610ffc826117af565b6080015192915050565b61101183838361243e565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615d298339815191525f611049836117af565b51905060048160058111156110605761106061519a565b14611080578060405163170cc93360e21b81526004016104cf9190615384565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b0316826129ac565b611104612637565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156111515761115161519a565b60038111156111625761116261519a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61519a565b146111fc578051604051633b0d540d60e21b81526104cf9190600401615744565b600461120b82604001516117af565b51600581111561121d5761121d61519a565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e18565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c31565b50506112d060015f80516020615d6983398151915255565b5050565b5f6112dd612637565b6112e883338461306e565b9050610c6660015f80516020615d6983398151915255565b5f80516020615d498339815191525f8061132561131c85611d0c565b60400151613346565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113659061534c565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61519a565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068401602052604081206113fa91614f22565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156114d6576114d661519a565b60038111156114e7576114e761519a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061519a565b14158015611581575060038151600381111561157e5761157e61519a565b14155b156115a2578051604051633b0d540d60e21b81526104cf9190600401615744565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615392565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906153a4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615d4983398151915291906116b99061534c565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361519a565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f9190600401615775565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906153a4565b6117b7614f59565b5f8281525f80516020615d89833981519152602052604090819020815160e0810190925280545f80516020615d49833981519152929190829060ff1660058111156118045761180461519a565b60058111156118155761181561519a565b81526020016001820180546118299061534c565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061534c565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613502565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615d49833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2090869086906157ff565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d298339815191529284929091829060ff166003811115611a8657611a8661519a565b6003811115611a9757611a9761519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461519a565b14611b45578251604051633b0d540d60e21b81526104cf9190600401615744565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461519a565b03611c51578615611b8b57611b8982876121c4565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf919061580e565b61351c565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c0584613673565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661519a565b03611c9a57611c7483613673565b5f898152600686016020526040902055611c8d88612c31565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf9190600401615384565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d979190810190615839565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e81600161590b565b611e7990600861575e565b61ffff16848281518110611e8f57611e8f61541b565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee781600361590b565b611ef290600861575e565b63ffffffff1685611f048360026156f0565b81518110611f1457611f1461541b565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f61590b565b611f7390600861575e565b86611f7f8360066156f0565b81518110611f8f57611f8f61541b565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb878701604089016153bb565b611fd860608901896153d6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e60608501856153d6565b9050811015611e1b578161207560608601866153d6565b838181106120855761208561541b565b9050602002810190612097919061542f565b6120a1908061591e565b90506120b060608701876153d6565b848181106120c0576120c061541b565b90506020028101906120d2919061542f565b6120dc908061591e565b6120e960608901896153d6565b868181106120f9576120f961541b565b905060200281019061210b919061542f565b61211990602081019061591e565b61212660608b018b6153d6565b888181106121365761213661541b565b9050602002810190612148919061542f565b612159906060810190604001615161565b60405160200161216f9796959493929190615960565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561220f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122369190810190615839565b915091508061225857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bf91906153a4565b8251146122e5578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612321576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f80612330846040015161381f565b915091508187146123575760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615d29833981519152906001600160401b039081169083161115612414575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612433565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d298339815191528161245786613a10565b905061246286612189565b61247157600192505050611cb6565b5f8681526004830160205260409020546001600160a01b0316331461249657336110a1565b5f86815260048301602052604090205460a08201516124c591600160b01b90046001600160401b0316906159c9565b6001600160401b03168160c001516001600160401b0316101561250c5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125245761251d87866121c4565b9050612542565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061256790610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156125dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260191906153a4565b905080846007015f8a81526020019081526020015f205f82825461262591906156f0565b90915550501515979650505050505050565b5f80516020615d6983398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612677614f59565b5f80516020615d498339815191525f8061269361131c87611d0c565b9150915080156126ba57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156126eb576126eb61519a565b60058111156126fc576126fc61519a565b81526020016001820180546127109061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461273c9061534c565b80156127875780601f1061275e57610100808354040283529160200191612787565b820191905f5260205f20905b81548152906001019060200180831161276a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156127f2576127f261519a565b1415801561281357506001815160058111156128105761281061519a565b14155b1561283457805160405163170cc93360e21b81526104cf9190600401615384565b6003815160058111156128495761284961519a565b03612857576004815261285c565b600581525b83600801816020015160405161287291906155cc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128b6576128b661519a565b0217905550602082015160018201906128cf9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129755761297561519a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d0983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a07575f80fd5b505af1158015612a19573d5f803e3d5ffd5b50505050505050565b5f80516020615d09833981519152546112d0906001600160a01b03168383613cf4565b60015f80516020615d6983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d2983398151915290600160401b900461ffff9081169086161080612aac575061271061ffff8616115b15612ad057604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b0c576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b1e5750806001015483115b15612b3f5760405163222d164360e21b8152600481018490526024016104cf565b5f612b4984613d53565b90505f612b5582610c56565b90505f612b628983613d76565b90506040518060800160405280612b763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115612c7e57612c7e61519a565b6003811115612c8f57612c8f61519a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbd575f84815260048701602052604090205461271090612d6f90600160a01b900461ffff168561575e565b612d799190615725565b915081866007015f8681526020019081526020015f205f828254612d9d91906156f0565b90915550612dad9050828461590b565b9050612dbd8560200151826129ac565b612dd28560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612e9e57612e6681600161590b565b612e7190600861575e565b61ffff16868281518110612e8757612e8761541b565b016020015160f81c901b9190911790600101612e52565b5061ffff811615612ec85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f2357612edf81600361590b565b612eea90600861575e565b63ffffffff1687612efc8360026156f0565b81518110612f0c57612f0c61541b565b016020015160f81c901b9190911790600101612ecb565b5063ffffffff8116600314612f4b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa057612f6281601f61590b565b612f6d90600861575e565b88612f798360066156f0565b81518110612f8957612f8961541b565b016020015160f81c901b9190911790600101612f4e565b505f805b6008811015612fff57612fb881600761590b565b612fc390600861575e565b6001600160401b031689612fd88360266156f0565b81518110612fe857612fe861541b565b016020015160f81c901b9190911790600101612fa4565b505f805b600881101561305e5761301781600761590b565b61302290600861575e565b6001600160401b03168a61303783602e6156f0565b815181106130475761304761541b565b016020015160f81c901b9190911790600101613003565b5091989097509095509350505050565b5f5f80516020615d298339815191528161308a61028485613d53565b90505f613096876117af565b90506130a187612189565b6130c1576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156130d6576130d661519a565b146130f757805160405163170cc93360e21b81526104cf9190600401615384565b5f82826080015161310891906159c9565b905083600201600a9054906101000a90046001600160401b0316826040015161313191906159e9565b6001600160401b0316816001600160401b0316111561316e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061317a8a8461351c565b915091505f8a836040516020016131a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561323b5761323b61519a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461337c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156133cb5761339381600161590b565b61339e90600861575e565b61ffff168582815181106133b4576133b461541b565b016020015160f81c901b919091179060010161337f565b5061ffff8116156133f55760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134505761340c81600361590b565b61341790600861575e565b63ffffffff16866134298360026156f0565b815181106134395761343961541b565b016020015160f81c901b91909117906001016133f8565b5063ffffffff811660021461347857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134cd5761348f81601f61590b565b61349a90600861575e565b876134a68360066156f0565b815181106134b6576134b661541b565b016020015160f81c901b919091179060010161347b565b505f866026815181106134e2576134e261541b565b016020015191976001600160f81b03199092161515965090945050505050565b61350a6142ee565b61351382614339565b6112d0816143a7565b5f8281525f80516020615d89833981519152602052604081206002015481905f80516020615d4983398151915290600160801b90046001600160401b0316613564858261440f565b5f61356e876145e9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135be8a858b611cbd565b6040518263ffffffff1660e01b81526004016135da9190615392565b6020604051808303815f875af11580156135f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361a91906153a4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d2983398151915290505f61369384604001516117af565b90505f6003825160058111156136ab576136ab61519a565b14806136c957506004825160058111156136c7576136c761519a565b145b156136d9575060c0810151613716565b6002825160058111156136ee576136ee61519a565b036136fa575042613716565b815160405163170cc93360e21b81526104cf9190600401615384565b84608001516001600160401b0316816001600160401b03161161373d57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061376290610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156137f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381691906153a4565b95945050505050565b5f808251602e1461385557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156138a45761386c81600161590b565b61387790600861575e565b61ffff1685828151811061388d5761388d61541b565b016020015160f81c901b9190911790600101613858565b5061ffff8116156138ce5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613929576138e581600361590b565b6138f090600861575e565b63ffffffff16866139028360026156f0565b815181106139125761391261541b565b016020015160f81c901b91909117906001016138d1565b5063ffffffff81161561394f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139a45761396681601f61590b565b61397190600861575e565b8761397d8360066156f0565b8151811061398d5761398d61541b565b016020015160f81c901b9190911790600101613952565b505f805b6008811015613a03576139bc81600761590b565b6139c790600861575e565b6001600160401b0316886139dc8360266156f0565b815181106139ec576139ec61541b565b016020015160f81c901b91909117906001016139a8565b5090969095509350505050565b613a18614f59565b5f8281525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff166005811115613a6557613a6561519a565b6005811115613a7657613a7661519a565b8152602001600182018054613a8a9061534c565b80601f0160208091040260200160405190810160405280929190818152602001828054613ab69061534c565b8015613b015780601f10613ad857610100808354040283529160200191613b01565b820191905f5260205f20905b815481529060010190602001808311613ae457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b6f57613b6f61519a565b14613ba2575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613be657613be661519a565b021790555060208201516001820190613bff9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c9d858261351c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061465e565b5f610c66825f80516020615d09833981519152546001600160a01b0316906146bf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613dba57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d4983398151915242613dd96060860160408701615161565b6001600160401b0316111580613e135750613df76202a300426156f0565b613e076060860160408701615161565b6001600160401b031610155b15613e4d57613e286060850160408601615161565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613e62613e5d6060860186615a14565b614818565b613e72613e5d6080860186615a14565b6030613e81602086018661591e565b905014613eb357613e95602085018561591e565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613ebd848061591e565b90505f03613eea57613ecf848061591e565b604051633e08a12560e11b81526004016104cf929190615a28565b5f60088201613ef9868061591e565b604051613f079291906157ff565b90815260200160405180910390205414613f4057613f25848061591e565b60405163a41f772f60e01b81526004016104cf929190615a28565b613f4a835f61440f565b6040805160e08101909152815481525f9081906140569060208101613f6f898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613fb7908a018a61591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161400060608a0160408b01615161565b6001600160401b0316815260200161401b60608a018a615a14565b61402490615a56565b815260200161403660808a018a615a14565b61403f90615a56565b8152602001876001600160401b0316815250614981565b5f828152600686016020526040902091935091506140748282615621565b508160088401614084888061591e565b6040516140929291906157ff565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140ce908590600401615392565b6020604051808303815f875af11580156140ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061410e91906153a4565b6040805160e08101909152909150806001815260200161412e898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141bd576141bd61519a565b0217905550602082015160018201906141d69082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614274888061591e565b6040516142829291906157ff565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142c09190615161565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661433757604051631afcd79f60e31b815260040160405180910390fd5b565b6143416142ee565b61434a81614b6e565b614352614b87565b610d366060820135608083013561436f60c0850160a08601615161565b61437f60e0860160c08701615b1d565b614390610100870160e08801615b36565b6143a2610120880161010089016153bb565b614b97565b6143af6142ee565b5f80516020615d098339815191526001600160a01b0382166143ef57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615d498339815191525f6001600160401b0380841690851611156144435761443c838561580e565b9050614450565b61444d848461580e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144b25750600184015481516144ae916001600160401b0316906156f0565b8210155b156144d8576001600160401b0383166060820152818152604081015160208201526144f7565b82816060018181516144ea91906159c9565b6001600160401b03169052505b60608101516145079060646159e9565b602082015160018601546001600160401b0392909216916145329190600160401b900460ff1661575e565b101561456257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b03168160400181815161457d91906156f0565b9052506040810180516001600160401b038716919061459d90839061590b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d898339815191526020526040812060020180545f80516020615d49833981519152919060089061463390600160401b90046001600160401b0316615b56565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146726001600160a01b03841683614cc6565b905080515f141580156146965750808060200190518101906146949190615b71565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614705573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472991906153a4565b90506147406001600160a01b038516333086614cd3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906153a4565b905081811161480e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b613816828261590b565b6148256020820182615094565b63ffffffff16158015614845575061484060208201826153d6565b151590505b1561488c576148576020820182615094565b61486460208301836153d6565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61489960208201826153d6565b90506148a86020830183615094565b63ffffffff1611156148c1576148576020820182615094565b60015b6148d160208301836153d6565b90508110156112d0576148e760208301836153d6565b6148f260018461590b565b8181106149015761490161541b565b905060200201602081019061491691906153bb565b6001600160a01b031661492c60208401846153d6565b8381811061493c5761493c61541b565b905060200201602081019061495191906153bb565b6001600160a01b0316101561497957604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148c4565b5f60608260400151516030146149aa5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986149eb988a986001989297929690959094909390929101615b8c565b60405160208183030381529060405290505f5b84608001516020015151811015614a5d57818560800151602001518281518110614a2a57614a2a61541b565b6020026020010151604051602001614a43929190615c46565b60408051601f1981840301815291905291506001016149fe565b5060a0840151805160209182015151604051614a7d938593929101615c7c565b60405160208183030381529060405290505f5b8460a001516020015151811015614aef57818560a00151602001518281518110614abc57614abc61541b565b6020026020010151604051602001614ad5929190615c46565b60408051601f198184030181529190529150600101614a90565b5060c0840151604051614b06918391602001615cb7565b6040516020818303038152906040529050600281604051614b2791906155cc565b602060405180830381855afa158015614b42573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b6591906153a4565b94909350915050565b614b766142ee565b614b7e614d0c565b610d3681614d14565b614b8f6142ee565b614337614dfc565b614b9f6142ee565b5f80516020615d2983398151915261ffff84161580614bc3575061271061ffff8516115b15614be757604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c0b5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614c1e5750600a60ff8416115b15614c415760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614e04565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d21565b6143376142ee565b614d1c6142ee565b80355f80516020615d498339815191529081556014614d416060840160408501615b36565b60ff161180614d605750614d5b6060830160408401615b36565b60ff16155b15614d9457614d756060830160408401615b36565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614da46060830160408401615b36565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd56040830160208401615161565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a456142ee565b606081471015614e295760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614e4491906155cc565b5f6040518083038185875af1925050503d805f8114614e7e576040519150601f19603f3d011682016040523d82523d5f602084013e614e83565b606091505b5091509150614e93868383614e9d565b9695505050505050565b606082614eb257614ead82614ef9565b611cb6565b8151158015614ec957506001600160a01b0384163b155b15614ef257604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614f095780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f2e9061534c565b5f825580601f10614f3d575050565b601f0160209004905f5260205f2090810190610d369190614f96565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614faa575f8155600101614f97565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614fce575f80fd5b919050565b5f805f60608486031215614fe5575f80fd5b833592506020840135614ff781614fae565b915061500560408501614fbb565b90509250925092565b5f6020828403121561501e575f80fd5b5035919050565b5f8060408385031215615036575f80fd5b82356001600160401b0381111561504b575f80fd5b83016080818603121561505c575f80fd5b915061506a60208401614fbb565b90509250929050565b5f8060408385031215615084575f80fd5b8235915061506a60208401614fbb565b5f602082840312156150a4575f80fd5b611cb682614fbb565b803561ffff81168114614fce575f80fd5b80356001600160401b0381168114614fce575f80fd5b5f805f80608085870312156150e7575f80fd5b84356001600160401b038111156150fc575f80fd5b850160a0818803121561510d575f80fd5b935061511b602086016150ad565b9250615129604086016150be565b9396929550929360600135925050565b5f806040838503121561514a575f80fd5b61515383614fbb565b946020939093013593505050565b5f60208284031215615171575f80fd5b611cb6826150be565b5f806040838503121561518b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106151be576151be61519a565b9052565b5f5b838110156151dc5781810151838201526020016151c4565b50505f910152565b5f81518084526151fb8160208601602086016151c2565b601f01601f19169290920160200192915050565b602081526152216020820183516151ae565b5f602083015160e0604084015261523c6101008401826151e4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156152b6575f80fd5b610120808212156152c5575f80fd5b84935083013590506152d68161528f565b809150509250929050565b5f80602083850312156152f2575f80fd5b82356001600160401b0380821115615308575f80fd5b818501915085601f83011261531b575f80fd5b813581811115615329575f80fd5b86602082850101111561533a575f80fd5b60209290920196919550909350505050565b600181811c9082168061536057607f821691505b60208210810361537e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846151ae565b602081525f611cb660208301846151e4565b5f602082840312156153b4575f80fd5b5051919050565b5f602082840312156153cb575f80fd5b8135611cb68161528f565b5f808335601e198436030181126153eb575f80fd5b8301803591506001600160401b03821115615404575f80fd5b6020019150600581901b360382131561366c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615443575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154835761548361544d565b60405290565b604080519081016001600160401b03811182821017156154835761548361544d565b604051601f8201601f191681016001600160401b03811182821017156154d3576154d361544d565b604052919050565b5f6001600160401b038211156154f3576154f361544d565b50601f01601f191660200190565b5f82601f830112615510575f80fd5b813561552361551e826154db565b6154ab565b818152846020838601011115615537575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615563575f80fd5b61556b615461565b82356001600160401b0380821115615581575f80fd5b61558d36838701615501565b835260208501359150808211156155a2575f80fd5b506155af36828601615501565b6020830152506155c1604084016150be565b604082015292915050565b5f82516154438184602087016151c2565b601f8211156104d857805f5260205f20601f840160051c810160208510156156025750805b601f840160051c820191505b8181101561166b575f815560010161560e565b81516001600160401b0381111561563a5761563a61544d565b61564e81615648845461534c565b846155dd565b602080601f831160018114615681575f841561566a5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156156af57888601518255948401946001909101908401615690565b50858210156156cc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c666156dc565b5f63ffffffff80831681810361571b5761571b6156dc565b6001019392505050565b5f8261573f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157585761575861519a565b91905290565b8082028115828204841417610c6657610c666156dc565b5f60208083525f84546157878161534c565b806020870152604060018084165f81146157a857600181146157c4576157f1565b60ff19851660408a0152604084151560051b8a010195506157f1565b895f5260205f205f5b858110156157e85781548b82018601529083019088016157cd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b6156dc565b8051614fce81614fae565b5f806040838503121561584a575f80fd5b82516001600160401b0380821115615860575f80fd5b9084019060608287031215615873575f80fd5b61587b615461565b8251815260208084015161588e8161528f565b828201526040840151838111156158a3575f80fd5b80850194505087601f8501126158b7575f80fd5b835192506158c761551e846154db565b83815288828587010111156158da575f80fd5b6158e9848383018488016151c2565b806040840152508195506158fe81880161582e565b9450505050509250929050565b81810381811115610c6657610c666156dc565b5f808335601e19843603018112615933575f80fd5b8301803591506001600160401b0382111561594c575f80fd5b60200191503681900382131561366c575f80fd5b5f8851615971818460208d016151c2565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b6156dc565b6001600160401b03818116838216028082169190828114615a0c57615a0c6156dc565b505092915050565b5f8235603e19833603018112615443575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a66575f80fd5b615a6e615489565b615a7783614fbb565b81526020808401356001600160401b0380821115615a93575f80fd5b9085019036601f830112615aa5575f80fd5b813581811115615ab757615ab761544d565b8060051b9150615ac88483016154ab565b8181529183018401918481019036841115615ae1575f80fd5b938501935b83851015615b0b5784359250615afb8361528f565b8282529385019390850190615ae6565b94860194909452509295945050505050565b5f60208284031215615b2d575f80fd5b611cb6826150ad565b5f60208284031215615b46575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b0380831681810361571b5761571b6156dc565b5f60208284031215615b81575f80fd5b8151611cb681614fae565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bd281602a850160208b016151c2565b865190830190615be981602a840160208b016151c2565b60c087901b6001600160c01b031916602a9290910191820152615c1b603282018660e01b6001600160e01b0319169052565b615c34603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c578184602088016151c2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c8d8184602089016151c2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cc88184602088016151c2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimValidationRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"ValidationRewardsClaimed\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"reward\",\"type\":\"uint256\",\"indexed\":true,\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"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\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516163c93803806163c983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61627c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610208575f3560e01c806376f786211161011f578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610475578063df93d8de14610495578063e4a63c401461049f578063f09969ae146104b3578063fd7ac5e7146104c6575f80fd5b8063ba3a4b9714610433578063bc5fbfec14610446578063bee0a03f1461045a578063c974d1b61461046d575f80fd5b80639e1bc4ef116100ef5780639e1bc4ef146103cb578063a3a65e48146103de578063afb98096146103f1578063afba878a14610405578063b771b3bc1461040d575f80fd5b806376f786211461038a57806380dd672f1461039d5780638280a25a146103b057806393e24598146103b8575f80fd5b806335455ded116101a057806360305d621161017057806360305d621461032d57806360ad77841461034a578063620658561461035d57806366435abf14610370578063732214f814610383575f80fd5b806335455ded146102ca5780633a1cfff6146102e6578063467ef06f146102f95780634bee00401461030c575f80fd5b806320d91b7a116101db57806320d91b7a1461026657806325e1c776146102795780632893d0771461028c5780632e2194d81461029f575f80fd5b80630118acc41461020c5780630322ed9814610221578063151d30d1146102345780631ec4472414610253575b5f80fd5b61021f61021a366004615457565b6104d9565b005b61021f61022f366004615492565b6104eb565b61023c600a81565b60405160ff90911681526020015b60405180910390f35b61021f610261366004615457565b610702565b61021f6102743660046154a9565b61070e565b61021f6102873660046154f7565b610bfa565b61021f61029a3660046154f7565b610c6e565b6102b26102ad366004615492565b610fb5565b6040516001600160401b03909116815260200161024a565b6102d361271081565b60405161ffff909116815260200161024a565b61021f6102f4366004615457565b610fcb565b61021f610307366004615518565b610fd7565b61031f61031a366004615558565b6110c5565b60405190815260200161024a565b610335601481565b60405163ffffffff909116815260200161024a565b61021f6103583660046154f7565b6110fa565b61031f61036b3660046155bd565b611365565b6102b261037e366004615492565b61137e565b61031f5f81565b61021f610398366004615457565b611392565b61021f6103ab3660046154f7565b61139f565b61023c603081565b61021f6103c6366004615492565b611573565b61031f6103d93660046155d6565b61161d565b61021f6103ec366004615518565b611649565b61031f5f805160206161f083398151915281565b61023c605081565b61041b6005600160991b0181565b6040516001600160a01b03909116815260200161024a565b61021f610441366004615492565b6117d2565b61031f5f8051602061621083398151915281565b61021f610468366004615492565b6119bb565b61023c601481565b610488610483366004615492565b611af8565b60405161024a919061566b565b6102b26202a30081565b61031f5f805160206161d083398151915281565b61021f6104c13660046156ff565b611c47565b61031f6104d436600461573d565b611d26565b6104e68383836001611d81565b505050565b5f8181525f805160206162508339815191526020526040808220815160e0810190925280545f8051602061621083398151915293929190829060ff166005811115610538576105386155f6565b6005811115610549576105496155f6565b815260200160018201805461055d906157a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610589906157a8565b80156105d45780601f106105ab576101008083540402835291602001916105d4565b820191905f5260205f20905b8154815290600101906020018083116105b757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063f5761063f6155f6565b1461067b575f8381526007830160205260409081902054905163170cc93360e21b81526106729160ff16906004016157e0565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6106a08584606001515f612024565b6040518263ffffffff1660e01b81526004016106bc91906157ee565b6020604051808303815f875af11580156106d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc9190615800565b50505050565b6104e68383835f611d81565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162108339815191529060ff161561076057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c79190615800565b8360200135146107f0576040516372b0a7e760e11b815260208401356004820152602401610672565b306108016060850160408601615817565b6001600160a01b0316146108445761081f6060840160408501615817565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610672565b5f6108526060850185615832565b905090505f805b828163ffffffff161015610b3a575f6108756060880188615832565b8363ffffffff1681811061088b5761088b615877565b905060200281019061089d919061588b565b6108a6906159af565b80516040519192505f9160088801916108be91615a28565b908152602001604051809103902054146108ee57805160405163a41f772f60e01b815261067291906004016157ee565b5f6002885f01358460405160200161091d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261093791615a28565b602060405180830381855afa158015610952573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109759190615800565b90508086600801835f015160405161098d9190615a28565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0f57610a0f6155f6565b021790555060208201516001820190610a289082615a7d565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610acd911685615b4c565b8251604051919550610ade91615a28565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b3390615b5f565b9050610859565b50600483018190555f610b58610b4f8661207b565b60400151612191565b90505f610b648761231e565b90505f600282604051610b779190615a28565b602060405180830381855afa158015610b92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bb59190615800565b9050828114610be157604051631872fc8d60e01b81526004810182905260248101849052604401610672565b5050506009909201805460ff1916600117905550505050565b610c03826124f8565b610c23576040516330efa98b60e01b815260048101839052602401610672565b5f610c2d83611af8565b5190506002816005811115610c4457610c446155f6565b14610c64578060405163170cc93360e21b815260040161067291906157e0565b6106fc8383612533565b610c766127ad565b5f805160206161f08339815191525f610c8e84611af8565b9050600281516005811115610ca557610ca56155f6565b14610cc657805160405163170cc93360e21b815261067291906004016157e0565b610ccf846124f8565b610cef576040516330efa98b60e01b815260048101859052602401610672565b5f8481526004830160205260409020546001600160a01b03163314610d3557335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610672565b5f84815260048301602052604090205460a08201514291610d6791600160b01b9091046001600160401b031690615b81565b6001600160401b0316816001600160401b03161015610da45760405163fb6ce63f60e01b81526001600160401b0382166004820152602401610672565b5f610daf8686612533565b5f87815260048601602052604081206001015491925090610de090600160401b90046001600160401b031683615ba1565b5f888152600487016020526040812060010154919250600160801b9091046001600160401b031690819003610e16575060a08401515b610e218282866127e4565b610e4157604051635bff683f60e11b815260048101899052602401610672565b600386015460408601515f916001600160a01b03169063778c06b590610e6690611365565b848589885f806040518863ffffffff1660e01b8152600401610e8e9796959493929190615bc1565b602060405180830381865afa158015610ea9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190615800565b905060646050610edd8488615ba1565b610ee79190615bff565b610ef19190615c3e565b5f8a8152600489016020526040902060018101805477ffffffffffffffffffffffffffffffff00000000000000001916600160401b6001600160401b039485160267ffffffffffffffff60801b191617600160801b938916939093029290921790915554610f68906001600160a01b03168261282f565b60405181908a907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a350505050505050610fb160015f8051602061623083398151915255565b5050565b5f610fc564e8d4a5100083615c63565b92915050565b6104e68383835f6128b8565b610fdf6127ad565b5f805160206161f08339815191525f80610ff884612b19565b91509150611005826124f8565b611011575050506110ac565b5f82815260048085016020526040909120546001600160a01b03169082516005811115611040576110406155f6565b03611091575f83815260078501602052604081208054919055611063828261282f565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b6110a7816110a28460400151611365565b612e57565b505050505b6110c260015f8051602061623083398151915255565b50565b5f6110ce6127ad565b6110da85858585612e7a565b90506110f260015f8051602061623083398151915255565b949350505050565b5f8281525f805160206161b08339815191526020526040808220815160e0810190925280545f805160206161f083398151915293929190829060ff166003811115611147576111476155f6565b6003811115611158576111586155f6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6111ce82611af8565b90506001835160038111156111e5576111e56155f6565b14611206578251604051633b0d540d60e21b81526106729190600401615c76565b60048151600581111561121b5761121b6155f6565b036112315761122986613098565b505050505050565b5f8061124861123f8861207b565b6040015161327f565b509150915081841461127557846040015160405163089938b360e11b815260040161067291815260200190565b806001600160401b031683606001516001600160401b031610806112ae5750806001600160401b03168560a001516001600160401b0316115b156112d757604051632e19bc2d60e11b81526001600160401b0382166004820152602401610672565b5f888152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610fc56001600160401b03831664e8d4a51000615c90565b5f61138882611af8565b6080015192915050565b6104e683838360016128b8565b6113a76127ad565b5f8281525f805160206161b08339815191526020526040808220815160e0810190925280545f805160206161f083398151915293929190829060ff1660038111156113f4576113f46155f6565b6003811115611405576114056155f6565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561147e5761147e6155f6565b1461149f578051604051633b0d540d60e21b81526106729190600401615c76565b60046114ae8260400151611af8565b5160058111156114c0576114c06155f6565b14611552575f6114cf8461207b565b90505f806114e0836040015161327f565b50915091508184604001511461150c5760405163089938b360e11b815260048101839052602401610672565b806001600160401b03168460c001516001600160401b0316111561154e57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610672565b5050505b61155b84613098565b5050610fb160015f8051602061623083398151915255565b5f805160206161f08339815191525f61158b83611af8565b51905060048160058111156115a2576115a26155f6565b146115c2578060405163170cc93360e21b815260040161067291906157e0565b5f8381526004830160205260409020546001600160a01b031633146115e75733610d10565b5f838152600783016020908152604080832080549084905560048601909252909120546106fc906001600160a01b03168261282f565b5f6116266127ad565b6116318333846134d5565b9050610fc560015f8051602061623083398151915255565b5f805160206162108339815191525f8061166e6116658561207b565b604001516137ad565b915091508061169457604051632d07135360e01b81528115156004820152602401610672565b5f828152600684016020526040902080546116ae906157a8565b90505f036116d25760405163089938b360e11b815260048101839052602401610672565b60015f83815260078501602052604090205460ff1660058111156116f8576116f86155f6565b1461172b575f8281526007840160205260409081902054905163170cc93360e21b81526106729160ff16906004016157e0565b5f8281526006840160205260408120611743916153a6565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206161b08339815191526020526040808220815160e0810190925280545f805160206161f083398151915293929190829060ff16600381111561181f5761181f6155f6565b6003811115611830576118306155f6565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118a9576118a96155f6565b141580156118ca57506003815160038111156118c7576118c76155f6565b14155b156118eb578051604051633b0d540d60e21b81526106729190600401615c76565b5f6118f98260400151611af8565b905080606001516001600160401b03165f0361192b576040516339b894f960e21b815260048101859052602401610672565b6005600160991b016001600160a01b031663ee5b48eb611958846040015184606001518560800151612024565b6040518263ffffffff1660e01b815260040161197491906157ee565b6020604051808303815f875af1158015611990573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b49190615800565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206162108339815191529190611a02906157a8565b90505f03611a265760405163089938b360e11b815260048101839052602401610672565b60015f83815260078301602052604090205460ff166005811115611a4c57611a4c6155f6565b14611a7f575f8281526007820160205260409081902054905163170cc93360e21b81526106729160ff16906004016157e0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ab89190600401615ca7565b6020604051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e69190615800565b611b006153dd565b5f8281525f80516020616250833981519152602052604090819020815160e0810190925280545f80516020616210833981519152929190829060ff166005811115611b4d57611b4d6155f6565b6005811115611b5e57611b5e6155f6565b8152602001600182018054611b72906157a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9e906157a8565b8015611be95780601f10611bc057610100808354040283529160200191611be9565b820191905f5260205f20905b815481529060010190602001808311611bcc57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c90575080546001600160401b03808416911610155b15611cae5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611cd98484613969565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020616210833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611d699086908690615d31565b90815260200160405180910390205491505092915050565b5f8481525f805160206161b08339815191526020526040808220815160e0810190925280545f805160206161f083398151915293929190829060ff166003811115611dce57611dce6155f6565b6003811115611ddf57611ddf6155f6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e5582611af8565b9050600283516003811115611e6c57611e6c6155f6565b14611e8d578251604051633b0d540d60e21b81526106729190600401615c76565b60208301516001600160a01b03163314611ea75733610d10565b600281516005811115611ebc57611ebc6155f6565b03611fbd578615611ed357611ed18287612533565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611f0c918491611f079190615ba1565b613983565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611f4d84613ada565b9050858015611f5a575080155b15611f7b57604051631036cf9160e11b8152600481018a9052602401610672565b5f8981526006860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a35061201a565b600481516005811115611fd257611fd26155f6565b03611ffe57611fe083613ada565b5f898152600686016020526040902055611ff988613098565b61201a565b805160405163170cc93360e21b815261067291906004016157e0565b5050505050505050565b6040515f6020820152600360e01b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120df573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121069190810190615d4b565b915091508061212857604051636b2f19e960e01b815260040160405180910390fd5b81511561214e578151604051636ba589a560e01b81526004810191909152602401610672565b60208201516001600160a01b03161561218a576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610672565b5092915050565b5f81516026146121c657815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610672565b5f805b6002811015612215576121dd816001615e1d565b6121e8906008615c90565b61ffff168482815181106121fe576121fe615877565b016020015160f81c901b91909117906001016121c9565b5061ffff81161561223f5760405163407b587360e01b815261ffff82166004820152602401610672565b5f805b600481101561229a57612256816003615e1d565b612261906008615c90565b63ffffffff1685612273836002615b4c565b8151811061228357612283615877565b016020015160f81c901b9190911790600101612242565b5063ffffffff8116156122c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612315576122d781601f615e1d565b6122e2906008615c90565b866122ee836006615b4c565b815181106122fe576122fe615877565b016020015160f81c901b91909117906001016122c3565b50949350505050565b60605f8083356020850135601461233a87870160408901615817565b6123476060890189615832565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123cd6060850185615832565b905081101561218a57816123e46060860186615832565b838181106123f4576123f4615877565b9050602002810190612406919061588b565b6124109080615e30565b905061241f6060870187615832565b8481811061242f5761242f615877565b9050602002810190612441919061588b565b61244b9080615e30565b6124586060890189615832565b8681811061246857612468615877565b905060200281019061247a919061588b565b612488906020810190615e30565b61249560608b018b615832565b888181106124a5576124a5615877565b90506020028101906124b7919061588b565b6124c89060608101906040016155bd565b6040516020016124de9796959493929190615e72565b60408051601f1981840301815291905291506001016123c0565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561257e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125a59190810190615d4b565b91509150806125c757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561260a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262e9190615800565b825114612654578151604051636ba589a560e01b81526004810191909152602401610672565b60208201516001600160a01b031615612690576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610672565b5f8061269f8460400151613ca3565b915091508187146126c65760405163089938b360e11b815260048101889052602401610672565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206161f0833981519152906001600160401b039081169083161115612783575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26127a2565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f805160206162308339815191528054600119016127de57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60506127f18484615ba1565b6127fb9190615bff565b6001600160401b031661280f856064615bff565b6001600160401b0316101561282557505f612074565b5060019392505050565b5f5f805160206161d083398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561288a575f80fd5b505af115801561289c573d5f803e3d5ffd5b50505050505050565b60015f8051602061623083398151915255565b5f805160206161f08339815191525f6128d086613e94565b90506128db866124f8565b6128e65750506106fc565b5f8681526004830160205260409020546001600160a01b0316331461290b5733610d10565b5f86815260048301602052604090205460a082015161293a91600160b01b90046001600160401b031690615b81565b6001600160401b03168160c001516001600160401b031610156129815760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610672565b5f8515612999576129928786612533565b90506129b7565b505f8681526004830160205260409020600101546001600160401b03165b5f8781526004840160205260408120600101546129e490600160401b90046001600160401b031683615ba1565b5f898152600486016020526040812060010154919250600160801b9091046001600160401b031690819003612a1a575060a08301515b858015612a335750612a3182828660c001516127e4565b155b15612a5457604051635bff683f60e11b8152600481018a9052602401610672565b600385015460408501515f916001600160a01b03169063778c06b590612a7990611365565b84858960c00151885f806040518863ffffffff1660e01b8152600401612aa59796959493929190615bc1565b602060405180830381865afa158015612ac0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae49190615800565b905080866007015f8c81526020019081526020015f205f828254612b089190615b4c565b909155505050505050505050505050565b5f612b226153dd565b5f805160206162108339815191525f80612b3e6116658761207b565b915091508015612b6557604051632d07135360e01b81528115156004820152602401610672565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612b9657612b966155f6565b6005811115612ba757612ba76155f6565b8152602001600182018054612bbb906157a8565b80601f0160208091040260200160405190810160405280929190818152602001828054612be7906157a8565b8015612c325780601f10612c0957610100808354040283529160200191612c32565b820191905f5260205f20905b815481529060010190602001808311612c1557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612c9d57612c9d6155f6565b14158015612cbe5750600181516005811115612cbb57612cbb6155f6565b14155b15612cdf57805160405163170cc93360e21b815261067291906004016157e0565b600381516005811115612cf457612cf46155f6565b03612d025760048152612d07565b600581525b836008018160200151604051612d1d9190615a28565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612d6157612d616155f6565b021790555060208201516001820190612d7a9082615a7d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e2057612e206155f6565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f805160206161d083398151915254610fb1906001600160a01b03168383614178565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206161f083398151915290600160401b900461ffff9081169086161080612ece575061271061ffff8616115b15612ef257604051635f12e6c360e11b815261ffff86166004820152602401610672565b60028101546001600160401b039081169085161015612f2e576040516202a06d60e11b81526001600160401b0385166004820152602401610672565b8054831080612f405750806001015483115b15612f615760405163222d164360e21b815260048101849052602401610672565b5f612f6b846141d7565b90505f612f7782610fb5565b90505f612f8489836141fa565b90506040518060c00160405280612f983390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f6060808801829052608080890183905260a09889018390528a83526004909d0185529082902088518154958a0151938a01518516600160b01b0267ffffffffffffffff60b01b1994909716600160a01b026001600160b01b03199096169716969096179390931716929092178355840151600190920180549885015194909301518116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990991692909116919091179690961791909116949094179093555090915050949350505050565b5f8181525f805160206161b08339815191526020526040808220815160e0810190925280545f805160206161f083398151915293929190829060ff1660038111156130e5576130e56155f6565b60038111156130f6576130f66155f6565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215613224575f848152600487016020526040902054612710906131d690600160a01b900461ffff1685615c90565b6131e09190615c63565b915081866007015f8681526020019081526020015f205f8282546132049190615b4c565b9091555061321490508284615e1d565b905061322485602001518261282f565b61323985602001516110a28760600151611365565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f83516036146132b657835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610672565b5f805b6002811015613305576132cd816001615e1d565b6132d8906008615c90565b61ffff168682815181106132ee576132ee615877565b016020015160f81c901b91909117906001016132b9565b5061ffff81161561332f5760405163407b587360e01b815261ffff82166004820152602401610672565b5f805b600481101561338a57613346816003615e1d565b613351906008615c90565b63ffffffff1687613363836002615b4c565b8151811061337357613373615877565b016020015160f81c901b9190911790600101613332565b5063ffffffff81166003146133b257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613407576133c981601f615e1d565b6133d4906008615c90565b886133e0836006615b4c565b815181106133f0576133f0615877565b016020015160f81c901b91909117906001016133b5565b505f805b60088110156134665761341f816007615e1d565b61342a906008615c90565b6001600160401b03168961343f836026615b4c565b8151811061344f5761344f615877565b016020015160f81c901b919091179060010161340b565b505f805b60088110156134c55761347e816007615e1d565b613489906008615c90565b6001600160401b03168a61349e83602e615b4c565b815181106134ae576134ae615877565b016020015160f81c901b919091179060010161346a565b5091989097509095509350505050565b5f5f805160206161f0833981519152816134f16102ad856141d7565b90505f6134fd87611af8565b9050613508876124f8565b613528576040516330efa98b60e01b815260048101889052602401610672565b60028151600581111561353d5761353d6155f6565b1461355e57805160405163170cc93360e21b815261067291906004016157e0565b5f82826080015161356f9190615b81565b905083600201600a9054906101000a90046001600160401b031682604001516135989190615bff565b6001600160401b0316816001600160401b031611156135d557604051636d51fe0560e11b81526001600160401b0382166004820152602401610672565b5f806135e18a84613983565b915091505f8a8360405160200161360f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136a2576136a26155f6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137e357825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610672565b5f805b6002811015613832576137fa816001615e1d565b613805906008615c90565b61ffff1685828151811061381b5761381b615877565b016020015160f81c901b91909117906001016137e6565b5061ffff81161561385c5760405163407b587360e01b815261ffff82166004820152602401610672565b5f805b60048110156138b757613873816003615e1d565b61387e906008615c90565b63ffffffff1686613890836002615b4c565b815181106138a0576138a0615877565b016020015160f81c901b919091179060010161385f565b5063ffffffff81166002146138df57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613934576138f681601f615e1d565b613901906008615c90565b8761390d836006615b4c565b8151811061391d5761391d615877565b016020015160f81c901b91909117906001016138e2565b505f8660268151811061394957613949615877565b016020015191976001600160f81b03199092161515965090945050505050565b613971614772565b61397a826147bd565b610fb18161482b565b5f8281525f80516020616250833981519152602052604081206002015481905f8051602061621083398151915290600160801b90046001600160401b03166139cb8582614893565b5f6139d587614a6d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613a258a858b612024565b6040518263ffffffff1660e01b8152600401613a4191906157ee565b6020604051808303815f875af1158015613a5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a819190615800565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206161f083398151915290505f613afa8460400151611af8565b90505f600382516005811115613b1257613b126155f6565b1480613b305750600482516005811115613b2e57613b2e6155f6565b145b15613b40575060c0810151613b7d565b600282516005811115613b5557613b556155f6565b03613b61575042613b7d565b815160405163170cc93360e21b815261067291906004016157e0565b84608001516001600160401b0316816001600160401b031611613ba457505f949350505050565b6040808601515f90815260048501602052206001015460a0830151613bd3916001600160401b031690836127e4565b613be157505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613c0690611365565b60a085015160808901516040808b01515f9081526004808b016020528282206001015492516001600160e01b031960e089901b168152613c5b969594938a936001600160401b03909116929091829101615bc1565b602060405180830381865afa158015613c76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c9a9190615800565b95945050505050565b5f808251602e14613cd957825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610672565b5f805b6002811015613d2857613cf0816001615e1d565b613cfb906008615c90565b61ffff16858281518110613d1157613d11615877565b016020015160f81c901b9190911790600101613cdc565b5061ffff811615613d525760405163407b587360e01b815261ffff82166004820152602401610672565b5f805b6004811015613dad57613d69816003615e1d565b613d74906008615c90565b63ffffffff1686613d86836002615b4c565b81518110613d9657613d96615877565b016020015160f81c901b9190911790600101613d55565b5063ffffffff811615613dd357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613e2857613dea81601f615e1d565b613df5906008615c90565b87613e01836006615b4c565b81518110613e1157613e11615877565b016020015160f81c901b9190911790600101613dd6565b505f805b6008811015613e8757613e40816007615e1d565b613e4b906008615c90565b6001600160401b031688613e60836026615b4c565b81518110613e7057613e70615877565b016020015160f81c901b9190911790600101613e2c565b5090969095509350505050565b613e9c6153dd565b5f8281525f805160206162508339815191526020526040808220815160e0810190925280545f8051602061621083398151915293929190829060ff166005811115613ee957613ee96155f6565b6005811115613efa57613efa6155f6565b8152602001600182018054613f0e906157a8565b80601f0160208091040260200160405190810160405280929190818152602001828054613f3a906157a8565b8015613f855780601f10613f5c57610100808354040283529160200191613f85565b820191905f5260205f20905b815481529060010190602001808311613f6857829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613ff357613ff36155f6565b14614026575f8481526007830160205260409081902054905163170cc93360e21b81526106729160ff16906004016157e0565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561406a5761406a6155f6565b0217905550602082015160018201906140839082615a7d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6141218582613983565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ae2565b5f610fc5825f805160206161d0833981519152546001600160a01b031690614b43565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661423e57604051637fab81e560e01b815260040160405180910390fd5b5f805160206162108339815191524261425d60608601604087016155bd565b6001600160401b0316111580614297575061427b6202a30042615b4c565b61428b60608601604087016155bd565b6001600160401b031610155b156142d1576142ac60608501604086016155bd565b604051635879da1360e11b81526001600160401b039091166004820152602401610672565b6142e66142e16060860186615edb565b614c9c565b6142f66142e16080860186615edb565b60306143056020860186615e30565b905014614337576143196020850185615e30565b6040516326475b2f60e11b8152610672925060040190815260200190565b6143418480615e30565b90505f0361436e576143538480615e30565b604051633e08a12560e11b8152600401610672929190615eef565b5f6008820161437d8680615e30565b60405161438b929190615d31565b908152602001604051809103902054146143c4576143a98480615e30565b60405163a41f772f60e01b8152600401610672929190615eef565b6143ce835f614893565b6040805160e08101909152815481525f9081906144da90602081016143f38980615e30565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061443b908a018a615e30565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161448460608a0160408b016155bd565b6001600160401b0316815260200161449f60608a018a615edb565b6144a890615f1d565b81526020016144ba60808a018a615edb565b6144c390615f1d565b8152602001876001600160401b0316815250614e05565b5f828152600686016020526040902091935091506144f88282615a7d565b5081600884016145088880615e30565b604051614516929190615d31565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145529085906004016157ee565b6020604051808303815f875af115801561456e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145929190615800565b6040805160e0810190915290915080600181526020016145b28980615e30565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614641576146416155f6565b02179055506020820151600182019061465a9082615a7d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806146f88880615e30565b604051614706929190615d31565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061474491906155bd565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166147bb57604051631afcd79f60e31b815260040160405180910390fd5b565b6147c5614772565b6147ce81614ff2565b6147d661500b565b6110c2606082013560808301356147f360c0850160a086016155bd565b61480360e0860160c08701615fe4565b614814610100870160e08801615ffd565b61482661012088016101008901615817565b61501b565b614833614772565b5f805160206161d08339815191526001600160a01b03821661487357604051637330680360e01b81526001600160a01b0383166004820152602401610672565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206162108339815191525f6001600160401b0380841690851611156148c7576148c08385615ba1565b90506148d4565b6148d18484615ba1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614936575060018401548151614932916001600160401b031690615b4c565b8210155b1561495c576001600160401b03831660608201528181526040810151602082015261497b565b828160600181815161496e9190615b81565b6001600160401b03169052505b606081015161498b906064615bff565b602082015160018601546001600160401b0392909216916149b69190600160401b900460ff16615c90565b10156149e657606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610672565b856001600160401b031681604001818151614a019190615b4c565b9052506040810180516001600160401b0387169190614a21908390615e1d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162508339815191526020526040812060020180545f805160206162108339815191529190600890614ab790600160401b90046001600160401b031661601d565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f614af66001600160a01b0384168361514a565b905080515f14158015614b1a575080806020019051810190614b189190616038565b155b156104e657604051635274afe760e01b81526001600160a01b0384166004820152602401610672565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614b89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bad9190615800565b9050614bc46001600160a01b038516333086615157565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614c08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c2c9190615800565b9050818111614c925760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610672565b613c9a8282615e1d565b614ca96020820182615518565b63ffffffff16158015614cc95750614cc46020820182615832565b151590505b15614d1057614cdb6020820182615518565b614ce86020830183615832565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610672565b614d1d6020820182615832565b9050614d2c6020830183615518565b63ffffffff161115614d4557614cdb6020820182615518565b60015b614d556020830183615832565b9050811015610fb157614d6b6020830183615832565b614d76600184615e1d565b818110614d8557614d85615877565b9050602002016020810190614d9a9190615817565b6001600160a01b0316614db06020840184615832565b83818110614dc057614dc0615877565b9050602002016020810190614dd59190615817565b6001600160a01b03161015614dfd57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614d48565b5f6060826040015151603014614e2e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614e6f988a986001989297929690959094909390929101616053565b60405160208183030381529060405290505f5b84608001516020015151811015614ee157818560800151602001518281518110614eae57614eae615877565b6020026020010151604051602001614ec792919061610d565b60408051601f198184030181529190529150600101614e82565b5060a0840151805160209182015151604051614f01938593929101616143565b60405160208183030381529060405290505f5b8460a001516020015151811015614f7357818560a00151602001518281518110614f4057614f40615877565b6020026020010151604051602001614f5992919061610d565b60408051601f198184030181529190529150600101614f14565b5060c0840151604051614f8a91839160200161617e565b6040516020818303038152906040529050600281604051614fab9190615a28565b602060405180830381855afa158015614fc6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614fe99190615800565b94909350915050565b614ffa614772565b615002615190565b6110c281615198565b615013614772565b6147bb615280565b615023614772565b5f805160206161f083398151915261ffff84161580615047575061271061ffff8516115b1561506b57604051635f12e6c360e11b815261ffff85166004820152602401610672565b8587111561508f5760405163222d164360e21b815260048101889052602401610672565b60ff831615806150a25750600a60ff8416115b156150c55760405163170db35960e31b815260ff84166004820152602401610672565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061207483835f615288565b6040516001600160a01b0384811660248301528381166044830152606482018390526106fc9186918216906323b872dd906084016141a5565b6147bb614772565b6151a0614772565b80355f8051602061621083398151915290815560146151c56060840160408501615ffd565b60ff1611806151e457506151df6060830160408401615ffd565b60ff16155b15615218576151f96060830160408401615ffd565b604051634a59bbff60e11b815260ff9091166004820152602401610672565b6152286060830160408401615ffd565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561525960408301602084016155bd565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128a5614772565b6060814710156152ad5760405163cd78605960e01b8152306004820152602401610672565b5f80856001600160a01b031684866040516152c89190615a28565b5f6040518083038185875af1925050503d805f8114615302576040519150601f19603f3d011682016040523d82523d5f602084013e615307565b606091505b5091509150615317868383615321565b9695505050505050565b606082615336576153318261537d565b612074565b815115801561534d57506001600160a01b0384163b155b1561537657604051639996b31560e01b81526001600160a01b0385166004820152602401610672565b5080612074565b80511561538d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546153b2906157a8565b5f825580601f106153c1575050565b601f0160209004905f5260205f20908101906110c2919061541a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561542e575f815560010161541b565b5090565b80151581146110c2575f80fd5b803563ffffffff81168114615452575f80fd5b919050565b5f805f60608486031215615469575f80fd5b83359250602084013561547b81615432565b91506154896040850161543f565b90509250925092565b5f602082840312156154a2575f80fd5b5035919050565b5f80604083850312156154ba575f80fd5b82356001600160401b038111156154cf575f80fd5b8301608081860312156154e0575f80fd5b91506154ee6020840161543f565b90509250929050565b5f8060408385031215615508575f80fd5b823591506154ee6020840161543f565b5f60208284031215615528575f80fd5b6120748261543f565b803561ffff81168114615452575f80fd5b80356001600160401b0381168114615452575f80fd5b5f805f806080858703121561556b575f80fd5b84356001600160401b03811115615580575f80fd5b850160a08188031215615591575f80fd5b935061559f60208601615531565b92506155ad60408601615542565b9396929550929360600135925050565b5f602082840312156155cd575f80fd5b61207482615542565b5f80604083850312156155e7575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061561a5761561a6155f6565b9052565b5f5b83811015615638578181015183820152602001615620565b50505f910152565b5f815180845261565781602086016020860161561e565b601f01601f19169290920160200192915050565b6020815261567d60208201835161560a565b5f602083015160e06040840152615698610100840182615640565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b03811681146110c2575f80fd5b5f80828403610140811215615712575f80fd5b61012080821215615721575f80fd5b8493508301359050615732816156eb565b809150509250929050565b5f806020838503121561574e575f80fd5b82356001600160401b0380821115615764575f80fd5b818501915085601f830112615777575f80fd5b813581811115615785575f80fd5b866020828501011115615796575f80fd5b60209290920196919550909350505050565b600181811c908216806157bc57607f821691505b6020821081036157da57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610fc5828461560a565b602081525f6120746020830184615640565b5f60208284031215615810575f80fd5b5051919050565b5f60208284031215615827575f80fd5b8135612074816156eb565b5f808335601e19843603018112615847575f80fd5b8301803591506001600160401b03821115615860575f80fd5b6020019150600581901b3603821315613ad3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261589f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156158df576158df6158a9565b60405290565b604080519081016001600160401b03811182821017156158df576158df6158a9565b604051601f8201601f191681016001600160401b038111828210171561592f5761592f6158a9565b604052919050565b5f6001600160401b0382111561594f5761594f6158a9565b50601f01601f191660200190565b5f82601f83011261596c575f80fd5b813561597f61597a82615937565b615907565b818152846020838601011115615993575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156159bf575f80fd5b6159c76158bd565b82356001600160401b03808211156159dd575f80fd5b6159e93683870161595d565b835260208501359150808211156159fe575f80fd5b50615a0b3682860161595d565b602083015250615a1d60408401615542565b604082015292915050565b5f825161589f81846020870161561e565b601f8211156104e657805f5260205f20601f840160051c81016020851015615a5e5750805b601f840160051c820191505b818110156119b4575f8155600101615a6a565b81516001600160401b03811115615a9657615a966158a9565b615aaa81615aa484546157a8565b84615a39565b602080601f831160018114615add575f8415615ac65750858301515b5f19600386901b1c1916600185901b178555611229565b5f85815260208120601f198616915b82811015615b0b57888601518255948401946001909101908401615aec565b5085821015615b2857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610fc557610fc5615b38565b5f63ffffffff808316818103615b7757615b77615b38565b6001019392505050565b6001600160401b0381811683821601908082111561218a5761218a615b38565b6001600160401b0382811682821603908082111561218a5761218a615b38565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b6001600160401b03818116838216028082169190828114615c2257615c22615b38565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680615c5757615c57615c2a565b92169190910492915050565b5f82615c7157615c71615c2a565b500490565b6020810160048310615c8a57615c8a6155f6565b91905290565b8082028115828204841417610fc557610fc5615b38565b5f60208083525f8454615cb9816157a8565b806020870152604060018084165f8114615cda5760018114615cf657615d23565b60ff19851660408a0152604084151560051b8a01019550615d23565b895f5260205f205f5b85811015615d1a5781548b8201860152908301908801615cff565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b805161545281615432565b5f8060408385031215615d5c575f80fd5b82516001600160401b0380821115615d72575f80fd5b9084019060608287031215615d85575f80fd5b615d8d6158bd565b82518152602080840151615da0816156eb565b82820152604084015183811115615db5575f80fd5b80850194505087601f850112615dc9575f80fd5b83519250615dd961597a84615937565b8381528882858701011115615dec575f80fd5b615dfb8483830184880161561e565b80604084015250819550615e10818801615d40565b9450505050509250929050565b81810381811115610fc557610fc5615b38565b5f808335601e19843603018112615e45575f80fd5b8301803591506001600160401b03821115615e5e575f80fd5b602001915036819003821315613ad3575f80fd5b5f8851615e83818460208d0161561e565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e1983360301811261589f575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615f2d575f80fd5b615f356158e5565b615f3e8361543f565b81526020808401356001600160401b0380821115615f5a575f80fd5b9085019036601f830112615f6c575f80fd5b813581811115615f7e57615f7e6158a9565b8060051b9150615f8f848301615907565b8181529183018401918481019036841115615fa8575f80fd5b938501935b83851015615fd25784359250615fc2836156eb565b8282529385019390850190615fad565b94860194909452509295945050505050565b5f60208284031215615ff4575f80fd5b61207482615531565b5f6020828403121561600d575f80fd5b813560ff81168114612074575f80fd5b5f6001600160401b03808316818103615b7757615b77615b38565b5f60208284031215616048575f80fd5b815161207481615432565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161609981602a850160208b0161561e565b8651908301906160b081602a840160208b0161561e565b60c087901b6001600160c01b031916602a92909101918201526160e2603282018660e01b6001600160e01b0319169052565b6160fb603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f835161611e81846020880161561e565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161615481846020890161561e565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f835161618f81846020880161561e565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -540,6 +540,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) PCHAINBL return _ERC20TokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_ERC20TokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + // VALIDATORMANAGERSTORAGELOCATION is a free data retrieval call binding the contract method 0xbc5fbfec. // // Solidity: function VALIDATOR_MANAGER_STORAGE_LOCATION() view returns(bytes32) @@ -778,46 +809,67 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Clai return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ClaimValidationRewards(opts *bind.TransactOpts, validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "claimValidationRewards", validationID, messageIndex) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ClaimValidationRewards(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimValidationRewards(&_ERC20TokenStakingManager.TransactOpts, validationID, messageIndex) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ClaimValidationRewards(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimValidationRewards(&_ERC20TokenStakingManager.TransactOpts, validationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", delegationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, messageIndex) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -2638,6 +2690,159 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidati return event, nil } +// ERC20TokenStakingManagerValidationRewardsClaimedIterator is returned from FilterValidationRewardsClaimed and is used to iterate over the raw logs and unpacked data for ValidationRewardsClaimed events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationRewardsClaimedIterator struct { + Event *ERC20TokenStakingManagerValidationRewardsClaimed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationRewardsClaimedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationRewardsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationRewardsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationRewardsClaimedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationRewardsClaimedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationRewardsClaimed represents a ValidationRewardsClaimed event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationRewardsClaimed struct { + ValidationID [32]byte + Reward *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationRewardsClaimed is a free log retrieval operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationRewardsClaimed(opts *bind.FilterOpts, validationID [][32]byte, reward []*big.Int) (*ERC20TokenStakingManagerValidationRewardsClaimedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var rewardRule []interface{} + for _, rewardItem := range reward { + rewardRule = append(rewardRule, rewardItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationRewardsClaimed", validationIDRule, rewardRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationRewardsClaimedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationRewardsClaimed", logs: logs, sub: sub}, nil +} + +// WatchValidationRewardsClaimed is a free log subscription operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationRewardsClaimed(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationRewardsClaimed, validationID [][32]byte, reward []*big.Int) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var rewardRule []interface{} + for _, rewardItem := range reward { + rewardRule = append(rewardRule, rewardItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationRewardsClaimed", validationIDRule, rewardRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationRewardsClaimed) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationRewardsClaimed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationRewardsClaimed is a log parse operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationRewardsClaimed(log types.Log) (*ERC20TokenStakingManagerValidationRewardsClaimed, error) { + event := new(ERC20TokenStakingManagerValidationRewardsClaimed) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationRewardsClaimed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go index d343cda87..7b0e4a908 100644 --- a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b50604051610357380380610357833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102d36100845f395f8181609e015261013a01526102d35ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635dcc93911461004e578063778c06b51461006c578063afba878a1461007f578063bb65b24214610099575b5f80fd5b6100596301e1338081565b6040519081526020015b60405180910390f35b61005961007a3660046101b6565b6100d9565b610087605081565b60405160ff9091168152602001610063565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610063565b5f60506100e68887610236565b6100f0919061025e565b67ffffffffffffffff1661010585606461025e565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8888610236565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61016e919061028a565b610178919061028a565b61018291906102a7565b61018c91906102a7565b90505b979650505050505050565b803567ffffffffffffffff811681146101b1575f80fd5b919050565b5f805f805f805f60e0888a0312156101cc575f80fd5b873596506101dc6020890161019a565b95506101ea6040890161019a565b94506101f86060890161019a565b93506102066080890161019a565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561025757610257610222565b5092915050565b67ffffffffffffffff81811683821602808216919082811461028257610282610222565b505092915050565b80820281158282048414176102a1576102a1610222565b92915050565b5f826102c157634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b506040516102c13803806102c1833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161023e6100835f395f81816079015260d3015261023e5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc939114610043578063778c06b514610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014d565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6127106301e133806100c788886101cd565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61010791906101f5565b61011191906101f5565b61011b9190610212565b6101259190610212565b98975050505050505050565b803567ffffffffffffffff81168114610148575f80fd5b919050565b5f805f805f805f60e0888a031215610163575f80fd5b8735965061017360208901610131565b955061018160408901610131565b945061018f60608901610131565b935061019d60808901610131565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ee576101ee6101b9565b5092915050565b808202811582820484141761020c5761020c6101b9565b92915050565b5f8261022c57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,43 +233,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) -} - // CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 , uint64 stakingStartTime, uint64 stakingEndTime, uint64 , uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, arg1 uint64, stakingStartTime uint64, stakingEndTime uint64, arg4 uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, arg1, stakingStartTime, stakingEndTime, arg4, arg5, arg6) if err != nil { return *new(*big.Int), err @@ -283,16 +252,16 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o // CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 , uint64 stakingStartTime, uint64 stakingEndTime, uint64 , uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, arg1 uint64, stakingStartTime uint64, stakingEndTime uint64, arg4 uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, arg1, stakingStartTime, stakingEndTime, arg4, arg5, arg6) } // CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 , uint64 stakingStartTime, uint64 stakingEndTime, uint64 , uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, arg1 uint64, stakingStartTime uint64, stakingEndTime uint64, arg4 uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, arg1, stakingStartTime, stakingEndTime, arg4, arg5, arg6) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 7abdb2216..4671e3c93 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput 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\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c0d380380615c0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ac08061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614d77565b61060a565b005b348015610216575f80fd5b50610209610225366004614db2565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614d77565b61084d565b34801561027f575f80fd5b5061020961028e366004614dc9565b610858565b34801561029e575f80fd5b506102096102ad366004614e17565b610d44565b3480156102bd575f80fd5b506102096102cc366004614e2e565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614db2565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614d77565b610eab565b34801561038c575f80fd5b5061020961039b366004614e4f565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614e68565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614ea6565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614db2565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614d77565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614db2565b61123b565b3480156104a4575f80fd5b506102096104b3366004614e68565b611306565b3480156104c3575f80fd5b506102096104d2366004614e4f565b6114de565b6104076104e5366004614ed0565b611667565b3480156104f5575f80fd5b506104075f80516020615a3483398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614db2565b61169b565b34801561054e575f80fd5b506104075f80516020615a5483398151915281565b34801561056e575f80fd5b5061020961057d366004614db2565b611884565b610407610590366004614db2565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614db2565b6119f2565b60405161024c9190614f99565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615019565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff16600581111561068c5761068c614f24565b600581111561069d5761069d614f24565b81526020016001820180546106b190615084565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90615084565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614f24565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b815260040161080791906150c4565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084791906150d6565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615a548339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091191906150d6565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601615101565b6001600160a01b03161461098e576109696060840160408501615101565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c606085018561511c565b905090505f805b828163ffffffff161015610c84575f6109bf606088018861511c565b8363ffffffff168181106109d5576109d5615161565b90506020028101906109e79190615175565b6109f090615299565b80516040519192505f916008880191610a0891615312565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016150c4565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615312565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf91906150d6565b90508086600801835f0151604051610ad79190615312565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614f24565b021790555060208201516001820190610b729082615367565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615436565b8251604051919550610c2891615312565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615449565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc19190615312565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff91906150d6565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836122e6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826122f7565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614f24565b14610e8b578060405163170cc93360e21b815260040161063191906150b6565b6108478383612332565b5f610ea564e8d4a510008361546b565b92915050565b6108478383836125ac565b610ebe6127a5565b5f80516020615a348339815191525f80610ed7846127dc565b91509150610ee4826122f7565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614f24565b03610f44575f83815260078501602052604081208054919055610f428282612b1a565b505b610f5a81610f5584604001516111e3565b612b78565b505050505b610f7560015f80516020615a7483398151915255565b50565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115610fc557610fc5614f24565b6003811115610fd657610fd6614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614f24565b14611084578251604051633b0d540d60e21b8152610631919060040161548a565b60048151600581111561109957611099614f24565b036110af576110a785612b9e565b505050505050565b5f806110c66110bd89611e69565b60400151612d85565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006154a4565b5f611206826119f2565b6080015192915050565b61121b8383836125ac565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615a348339815191525f611253836119f2565b519050600481600581111561126a5761126a614f24565b1461128a578060405163170cc93360e21b815260040161063191906150b6565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b1a565b61130e6127a5565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff16600381111561135b5761135b614f24565b600381111561136c5761136c614f24565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614f24565b14611406578051604051633b0d540d60e21b8152610631919060040161548a565b600461141582604001516119f2565b51600581111561142757611427614f24565b146114b9575f61143685611e69565b90505f806114478360400151612d85565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612b9e565b50506114da60015f80516020615a7483398151915255565b5050565b5f80516020615a548339815191525f806115036114fa85611e69565b60400151612fdb565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390615084565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614f24565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068401602052604081206115d891614ccb565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116706127a5565b61167c84848434613197565b905061169460015f80516020615a7483398151915255565b9392505050565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff1660038111156116e8576116e8614f24565b60038111156116f9576116f9614f24565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614f24565b14158015611793575060038151600381111561179057611790614f24565b14155b156117b4578051604051633b0d540d60e21b8152610631919060040161548a565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d91906150c4565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d91906150d6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615a5483398151915291906118cb90615084565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614f24565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016154bb565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906150d6565b5f6119ca6127a5565b6119d5823334613365565b90506119ed60015f80516020615a7483398151915255565b919050565b6119fa614d02565b5f8281525f80516020615a94833981519152602052604090819020815160e0810190925280545f80516020615a54833981519152929190829060ff166005811115611a4757611a47614f24565b6005811115611a5857611a58614f24565b8152602001600182018054611a6c90615084565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890615084565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615a54833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b849086908690615545565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a348339815191529284929091829060ff166003811115611bea57611bea614f24565b6003811115611bfb57611bfb614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614f24565b14611ca9578251604051633b0d540d60e21b8152610631919060040161548a565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614f24565b03611db5578615611cef57611ced8287612332565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d239190615554565b61363a565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d6984613791565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614f24565b03611dfe57611dd883613791565b5f898152600686016020526040902055611df188612b9e565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016150b6565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef4919081019061557f565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb816001615651565b611fd69060086154a4565b61ffff16848281518110611fec57611fec615161565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561208857612044816003615651565b61204f9060086154a4565b63ffffffff1685612061836002615436565b8151811061207157612071615161565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f615651565b6120d09060086154a4565b866120dc836006615436565b815181106120ec576120ec615161565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901615101565b612135606089018961511c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb606085018561511c565b9050811015611f7857816121d2606086018661511c565b838181106121e2576121e2615161565b90506020028101906121f49190615175565b6121fe9080615664565b905061220d606087018761511c565b8481811061221d5761221d615161565b905060200281019061222f9190615175565b6122399080615664565b612246606089018961511c565b8681811061225657612256615161565b90506020028101906122689190615175565b612276906020810190615664565b61228360608b018b61511c565b8881811061229357612293615161565b90506020028101906122a59190615175565b6122b6906060810190604001614ea6565b6040516020016122cc97969594939291906156a6565b60408051601f1981840301815291905291506001016121ae565b6122ee61393d565b610f7581613988565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a4919081019061557f565b91509150806123c657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242d91906150d6565b825114612453578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561248f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f8061249e84604001516139f6565b915091508187146124c55760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615a34833981519152906001600160401b039081169083161115612582575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615a34833981519152816125c586613be7565b90506125d0866122f7565b6125df57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461260457336112ab565b5f86815260048301602052604090205460a082015161263391600160b01b90046001600160401b03169061570f565b6001600160401b03168160c001516001600160401b0316101561267a5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126925761268b8786612332565b90506126b0565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906126d5906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561274b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276f91906150d6565b905080846007015f8a81526020019081526020015f205f8282546127939190615436565b90915550501515979650505050505050565b5f80516020615a748339815191528054600119016127d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e5614d02565b5f80516020615a548339815191525f806128016114fa87611e69565b91509150801561282857604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285957612859614f24565b600581111561286a5761286a614f24565b815260200160018201805461287e90615084565b80601f01602080910402602001604051908101604052809291908181526020018280546128aa90615084565b80156128f55780601f106128cc576101008083540402835291602001916128f5565b820191905f5260205f20905b8154815290600101906020018083116128d857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296057612960614f24565b14158015612981575060018151600581111561297e5761297e614f24565b14155b156129a257805160405163170cc93360e21b815261063191906004016150b6565b6003815160058111156129b7576129b7614f24565b036129c557600481526129ca565b600581525b8360080181602001516040516129e09190615312565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2457612a24614f24565b021790555060208201516001820190612a3d9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae357612ae3614f24565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b66575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613ecb565b60015f80516020615a7483398151915255565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115612beb57612beb614f24565b6003811115612bfc57612bfc614f24565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d2a575f84815260048701602052604090205461271090612cdc90600160a01b900461ffff16856154a4565b612ce6919061546b565b915081866007015f8681526020019081526020015f205f828254612d0a9190615436565b90915550612d1a90508284615651565b9050612d2a856020015182612b1a565b612d3f8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612dbc57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e0b57612dd3816001615651565b612dde9060086154a4565b61ffff16868281518110612df457612df4615161565b016020015160f81c901b9190911790600101612dbf565b5061ffff811615612e355760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612e9057612e4c816003615651565b612e579060086154a4565b63ffffffff1687612e69836002615436565b81518110612e7957612e79615161565b016020015160f81c901b9190911790600101612e38565b5063ffffffff8116600314612eb857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f0d57612ecf81601f615651565b612eda9060086154a4565b88612ee6836006615436565b81518110612ef657612ef6615161565b016020015160f81c901b9190911790600101612ebb565b505f805b6008811015612f6c57612f25816007615651565b612f309060086154a4565b6001600160401b031689612f45836026615436565b81518110612f5557612f55615161565b016020015160f81c901b9190911790600101612f11565b505f805b6008811015612fcb57612f84816007615651565b612f8f9060086154a4565b6001600160401b03168a612fa483602e615436565b81518110612fb457612fb4615161565b016020015160f81c901b9190911790600101612f70565b5091989097509095509350505050565b5f80825160271461301157825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b600281101561306057613028816001615651565b6130339060086154a4565b61ffff1685828151811061304957613049615161565b016020015160f81c901b9190911790600101613014565b5061ffff81161561308a5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156130e5576130a1816003615651565b6130ac9060086154a4565b63ffffffff16866130be836002615436565b815181106130ce576130ce615161565b016020015160f81c901b919091179060010161308d565b5063ffffffff811660021461310d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131625761312481601f615651565b61312f9060086154a4565b8761313b836006615436565b8151811061314b5761314b615161565b016020015160f81c901b9190911790600101613110565b505f8660268151811061317757613177615161565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615a3483398151915290600160401b900461ffff90811690861610806131eb575061271061ffff8616115b1561320f57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561324b576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b805483108061325d5750806001015483115b1561327e5760405163222d164360e21b815260048101849052602401610631565b825f61328982610e95565b90505f6132968983613f5e565b905060405180608001604052806132aa3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615a348339815191528161337e84610e95565b90505f61338a876119f2565b9050613395876122f7565b6133b5576040516330efa98b60e01b815260048101889052602401610631565b6002815160058111156133ca576133ca614f24565b146133eb57805160405163170cc93360e21b815261063191906004016150b6565b5f8282608001516133fc919061570f565b905083600201600a9054906101000a90046001600160401b03168260400151613425919061572f565b6001600160401b0316816001600160401b0316111561346257604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f8061346e8a8461363a565b915091505f8a8360405160200161349c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561352f5761352f614f24565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615a94833981519152602052604081206002015481905f80516020615a5483398151915290600160801b90046001600160401b031661368285826144d6565b5f61368c876146b0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611e1a565b6040518263ffffffff1660e01b81526004016136f891906150c4565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373891906150d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615a3483398151915290505f6137b184604001516119f2565b90505f6003825160058111156137c9576137c9614f24565b14806137e757506004825160058111156137e5576137e5614f24565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c614f24565b03613818575042613834565b815160405163170cc93360e21b815261063191906004016150b6565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613880906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613910573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393491906150d6565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398657604051631afcd79f60e31b815260040160405180910390fd5b565b61399061393d565b61399981614725565b6139a161473e565b610f75606082013560808301356139be60c0850160a08601614ea6565b6139ce60e0860160c0870161575a565b6139df610100870160e08801615773565b6139f161012088016101008901615101565b61474e565b5f808251602e14613a2c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613a7b57613a43816001615651565b613a4e9060086154a4565b61ffff16858281518110613a6457613a64615161565b016020015160f81c901b9190911790600101613a2f565b5061ffff811615613aa55760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b0057613abc816003615651565b613ac79060086154a4565b63ffffffff1686613ad9836002615436565b81518110613ae957613ae9615161565b016020015160f81c901b9190911790600101613aa8565b5063ffffffff811615613b2657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7b57613b3d81601f615651565b613b489060086154a4565b87613b54836006615436565b81518110613b6457613b64615161565b016020015160f81c901b9190911790600101613b29565b505f805b6008811015613bda57613b93816007615651565b613b9e9060086154a4565b6001600160401b031688613bb3836026615436565b81518110613bc357613bc3615161565b016020015160f81c901b9190911790600101613b7f565b5090969095509350505050565b613bef614d02565b5f8281525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff166005811115613c3c57613c3c614f24565b6005811115613c4d57613c4d614f24565b8152602001600182018054613c6190615084565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8d90615084565b8015613cd85780601f10613caf57610100808354040283529160200191613cd8565b820191905f5260205f20905b815481529060010190602001808311613cbb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d4657613d46614f24565b14613d79575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dbd57613dbd614f24565b021790555060208201516001820190613dd69082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e74858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eee5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f37576040519150601f19603f3d011682016040523d82523d5f602084013e613f3c565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa257604051637fab81e560e01b815260040160405180910390fd5b5f80516020615a5483398151915242613fc16060860160408701614ea6565b6001600160401b0316111580613ffb5750613fdf6202a30042615436565b613fef6060860160408701614ea6565b6001600160401b031610155b15614035576140106060850160408601614ea6565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61404a6140456060860186615793565b61487d565b61405a6140456080860186615793565b60306140696020860186615664565b90501461409b5761407d6020850185615664565b6040516326475b2f60e11b8152610631925060040190815260200190565b6140a58480615664565b90505f036140d2576140b78480615664565b604051633e08a12560e11b81526004016106319291906157a7565b5f600882016140e18680615664565b6040516140ef929190615545565b908152602001604051809103902054146141285761410d8480615664565b60405163a41f772f60e01b81526004016106319291906157a7565b614132835f6144d6565b6040805160e08101909152815481525f90819061423e90602081016141578980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061419f908a018a615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141e860608a0160408b01614ea6565b6001600160401b0316815260200161420360608a018a615793565b61420c906157d5565b815260200161421e60808a018a615793565b614227906157d5565b8152602001876001600160401b03168152506149e6565b5f8281526006860160205260409020919350915061425c8282615367565b50816008840161426c8880615664565b60405161427a929190615545565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142b69085906004016150c4565b6020604051808303815f875af11580156142d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f691906150d6565b6040805160e0810190915290915080600181526020016143168980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143a5576143a5614f24565b0217905550602082015160018201906143be9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061445c8880615664565b60405161446a929190615545565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144a89190614ea6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615a548339815191525f6001600160401b03808416908516111561450a576145038385615554565b9050614517565b6145148484615554565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614579575060018401548151614575916001600160401b031690615436565b8210155b1561459f576001600160401b0383166060820152818152604081015160208201526145be565b82816060018181516145b1919061570f565b6001600160401b03169052505b60608101516145ce90606461572f565b602082015160018601546001600160401b0392909216916145f99190600160401b900460ff166154a4565b101561462957606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146449190615436565b9052506040810180516001600160401b0387169190614664908390615651565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a948339815191526020526040812060020180545f80516020615a5483398151915291906008906146fa90600160401b90046001600160401b031661589c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61472d61393d565b614735614bd3565b610f7581614bdb565b61474661393d565b613986614cc3565b61475661393d565b5f80516020615a3483398151915261ffff8416158061477a575061271061ffff8516115b1561479e57604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156147c25760405163222d164360e21b815260048101889052602401610631565b60ff831615806147d55750600a60ff8416115b156147f85760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61488a6020820182614e4f565b63ffffffff161580156148aa57506148a5602082018261511c565b151590505b156148f1576148bc6020820182614e4f565b6148c9602083018361511c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b6148fe602082018261511c565b905061490d6020830183614e4f565b63ffffffff161115614926576148bc6020820182614e4f565b60015b614936602083018361511c565b90508110156114da5761494c602083018361511c565b614957600184615651565b81811061496657614966615161565b905060200201602081019061497b9190615101565b6001600160a01b0316614991602084018461511c565b838181106149a1576149a1615161565b90506020020160208101906149b69190615101565b6001600160a01b031610156149de57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614929565b5f6060826040015151603014614a0f5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a50988a9860019892979296909590949093909291016158b7565b60405160208183030381529060405290505f5b84608001516020015151811015614ac257818560800151602001518281518110614a8f57614a8f615161565b6020026020010151604051602001614aa8929190615971565b60408051601f198184030181529190529150600101614a63565b5060a0840151805160209182015151604051614ae29385939291016159a7565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5457818560a00151602001518281518110614b2157614b21615161565b6020026020010151604051602001614b3a929190615971565b60408051601f198184030181529190529150600101614af5565b5060c0840151604051614b6b9183916020016159e2565b6040516020818303038152906040529050600281604051614b8c9190615312565b602060405180830381855afa158015614ba7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bca91906150d6565b94909350915050565b61398661393d565b614be361393d565b80355f80516020615a548339815191529081556014614c086060840160408501615773565b60ff161180614c275750614c226060830160408401615773565b60ff16155b15614c5b57614c3c6060830160408401615773565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614c6b6060830160408401615773565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614c9c6040830160208401614ea6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8b61393d565b508054614cd790615084565b5f825580601f10614ce6575050565b601f0160209004905f5260205f2090810190610f759190614d3f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d53575f8155600101614d40565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614d89575f80fd5b833592506020840135614d9b81614d57565b9150614da960408501614d64565b90509250925092565b5f60208284031215614dc2575f80fd5b5035919050565b5f8060408385031215614dda575f80fd5b82356001600160401b03811115614def575f80fd5b830160808186031215614e00575f80fd5b9150614e0e60208401614d64565b90509250929050565b5f6101208284031215614e28575f80fd5b50919050565b5f8060408385031215614e3f575f80fd5b82359150614e0e60208401614d64565b5f60208284031215614e5f575f80fd5b61169482614d64565b5f8060408385031215614e79575f80fd5b614e8283614d64565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614eb6575f80fd5b61169482614e90565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614ee2575f80fd5b83356001600160401b03811115614ef7575f80fd5b840160a08187031215614f08575f80fd5b9250614f1660208501614ebf565b9150614da960408501614e90565b634e487b7160e01b5f52602160045260245ffd5b60068110614f4857614f48614f24565b9052565b5f5b83811015614f66578181015183820152602001614f4e565b50505f910152565b5f8151808452614f85816020860160208601614f4c565b601f01601f19169290920160200192915050565b60208152614fab602082018351614f38565b5f602083015160e06040840152614fc6610100840182614f6e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561502a575f80fd5b82356001600160401b0380821115615040575f80fd5b818501915085601f830112615053575f80fd5b813581811115615061575f80fd5b866020828501011115615072575f80fd5b60209290920196919550909350505050565b600181811c9082168061509857607f821691505b602082108103614e2857634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614f38565b602081525f6116946020830184614f6e565b5f602082840312156150e6575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215615111575f80fd5b8135611694816150ed565b5f808335601e19843603018112615131575f80fd5b8301803591506001600160401b0382111561514a575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615189575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151c9576151c9615193565b60405290565b604080519081016001600160401b03811182821017156151c9576151c9615193565b604051601f8201601f191681016001600160401b038111828210171561521957615219615193565b604052919050565b5f6001600160401b0382111561523957615239615193565b50601f01601f191660200190565b5f82601f830112615256575f80fd5b813561526961526482615221565b6151f1565b81815284602083860101111561527d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156152a9575f80fd5b6152b16151a7565b82356001600160401b03808211156152c7575f80fd5b6152d336838701615247565b835260208501359150808211156152e8575f80fd5b506152f536828601615247565b60208301525061530760408401614e90565b604082015292915050565b5f8251615189818460208701614f4c565b601f82111561063a57805f5260205f20601f840160051c810160208510156153485750805b601f840160051c820191505b8181101561187d575f8155600101615354565b81516001600160401b0381111561538057615380615193565b6153948161538e8454615084565b84615323565b602080601f8311600181146153c7575f84156153b05750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b828110156153f5578886015182559484019460019091019084016153d6565b508582101561541257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615422565b5f63ffffffff80831681810361546157615461615422565b6001019392505050565b5f8261548557634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061549e5761549e614f24565b91905290565b8082028115828204841417610ea557610ea5615422565b5f60208083525f84546154cd81615084565b806020870152604060018084165f81146154ee576001811461550a57615537565b60ff19851660408a0152604084151560051b8a01019550615537565b895f5260205f205f5b8581101561552e5781548b8201860152908301908801615513565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f78615422565b80516119ed81614d57565b5f8060408385031215615590575f80fd5b82516001600160401b03808211156155a6575f80fd5b90840190606082870312156155b9575f80fd5b6155c16151a7565b825181526020808401516155d4816150ed565b828201526040840151838111156155e9575f80fd5b80850194505087601f8501126155fd575f80fd5b8351925061560d61526484615221565b8381528882858701011115615620575f80fd5b61562f84838301848801614f4c565b80604084015250819550615644818801615574565b9450505050509250929050565b81810381811115610ea557610ea5615422565b5f808335601e19843603018112615679575f80fd5b8301803591506001600160401b03821115615692575f80fd5b60200191503681900382131561378a575f80fd5b5f88516156b7818460208d01614f4c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f78615422565b6001600160401b0381811683821602808216919082811461575257615752615422565b505092915050565b5f6020828403121561576a575f80fd5b61169482614ebf565b5f60208284031215615783575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615189575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156157e5575f80fd5b6157ed6151cf565b6157f683614d64565b81526020808401356001600160401b0380821115615812575f80fd5b9085019036601f830112615824575f80fd5b81358181111561583657615836615193565b8060051b91506158478483016151f1565b8181529183018401918481019036841115615860575f80fd5b938501935b8385101561588a578435925061587a836150ed565b8282529385019390850190615865565b94860194909452509295945050505050565b5f6001600160401b0380831681810361546157615461615422565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516158fd81602a850160208b01614f4c565b86519083019061591481602a840160208b01614f4c565b60c087901b6001600160c01b031916602a9290910191820152615946603282018660e01b6001600160e01b0319169052565b61595f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615982818460208801614f4c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516159b8818460208901614f4c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516159f3818460208801614f4c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimValidationRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"ValidationRewardsClaimed\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"reward\",\"type\":\"uint256\",\"indexed\":true,\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160eb3803806160eb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f9e8061014d5f395ff3fe6080604052600436106101fc575f3560e01c8063732214f811610113578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f146105cb578063c974d1b6146105de578063d5f20ff6146105f2578063df93d8de1461061e578063fd7ac5e714610634575f80fd5b8063b771b3bc14610553578063ba3a4b971461056d578063bc5fbfec1461058c578063bee0a03f146105ac575f80fd5b806393e24598116100e357806393e24598146104ce578063a3a65e48146104ed578063af2f5feb1461050c578063afb980961461051f578063afba878a1461053f575f80fd5b8063732214f81461046957806376f786211461047c57806380dd672f1461049b5780638280a25a146104ba575f80fd5b80632e2194d811610194578063467ef06f11610164578063467ef06f146103b657806360305d62146103d557806360ad7784146103fe578063620658561461041d57806366435abf1461044a575f80fd5b80632e2194d814610306578063329c3e121461033d57806335455ded1461036f5780633a1cfff614610397575f80fd5b806320d91b7a116101cf57806320d91b7a1461028a57806320e55565146102a957806325e1c776146102c85780632893d077146102e7575f80fd5b80630118acc4146102005780630322ed9814610221578063151d30d1146102405780631ec447241461026b575b5f80fd5b34801561020b575f80fd5b5061021f61021a366004615212565b610653565b005b34801561022c575f80fd5b5061021f61023b36600461524d565b610665565b34801561024b575f80fd5b50610254600a81565b60405160ff90911681526020015b60405180910390f35b348015610276575f80fd5b5061021f610285366004615212565b61087c565b348015610295575f80fd5b5061021f6102a4366004615264565b610888565b3480156102b4575f80fd5b5061021f6102c33660046152b2565b610d74565b3480156102d3575f80fd5b5061021f6102e23660046152c9565b610e51565b3480156102f2575f80fd5b5061021f6103013660046152c9565b610ec5565b348015610311575f80fd5b5061032561032036600461524d565b61120c565b6040516001600160401b039091168152602001610262565b348015610348575f80fd5b506103576001600160991b0181565b6040516001600160a01b039091168152602001610262565b34801561037a575f80fd5b5061038461271081565b60405161ffff9091168152602001610262565b3480156103a2575f80fd5b5061021f6103b1366004615212565b611222565b3480156103c1575f80fd5b5061021f6103d03660046152ea565b61122e565b3480156103e0575f80fd5b506103e9601481565b60405163ffffffff9091168152602001610262565b348015610409575f80fd5b5061021f6104183660046152c9565b61131c565b348015610428575f80fd5b5061043c610437366004615319565b611587565b604051908152602001610262565b348015610455575f80fd5b5061032561046436600461524d565b6115a0565b348015610474575f80fd5b5061043c5f81565b348015610487575f80fd5b5061021f610496366004615212565b6115b4565b3480156104a6575f80fd5b5061021f6104b53660046152c9565b6115c1565b3480156104c5575f80fd5b50610254603081565b3480156104d9575f80fd5b5061021f6104e836600461524d565b611795565b3480156104f8575f80fd5b5061021f6105073660046152ea565b61183f565b61043c61051a366004615343565b6119c8565b34801561052a575f80fd5b5061043c5f80516020615f1283398151915281565b34801561054a575f80fd5b50610254605081565b34801561055e575f80fd5b506103576005600160991b0181565b348015610578575f80fd5b5061021f61058736600461524d565b6119fc565b348015610597575f80fd5b5061043c5f80516020615f3283398151915281565b3480156105b7575f80fd5b5061021f6105c636600461524d565b611be5565b61043c6105d936600461524d565b611d22565b3480156105e9575f80fd5b50610254601481565b3480156105fd575f80fd5b5061061161060c36600461524d565b611d53565b604051610262919061540c565b348015610629575f80fd5b506103256202a30081565b34801561063f575f80fd5b5061043c61064e36600461548c565b611ea2565b6106608383836001611efd565b505050565b5f8181525f80516020615f728339815191526020526040808220815160e0810190925280545f80516020615f3283398151915293929190829060ff1660058111156106b2576106b2615397565b60058111156106c3576106c3615397565b81526020016001820180546106d7906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610703906154f7565b801561074e5780601f106107255761010080835404028352916020019161074e565b820191905f5260205f20905b81548152906001019060200180831161073157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107b9576107b9615397565b146107f5575f8381526007830160205260409081902054905163170cc93360e21b81526107ec9160ff1690600401615529565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61081a8584606001515f6121a0565b6040518263ffffffff1660e01b81526004016108369190615537565b6020604051808303815f875af1158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190615549565b50505050565b6106608383835f611efd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f328339815191529060ff16156108da57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190615549565b83602001351461096a576040516372b0a7e760e11b8152602084013560048201526024016107ec565b3061097b6060850160408601615574565b6001600160a01b0316146109be576109996060840160408501615574565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016107ec565b5f6109cc606085018561558f565b905090505f805b828163ffffffff161015610cb4575f6109ef606088018861558f565b8363ffffffff16818110610a0557610a056155d4565b9050602002810190610a1791906155e8565b610a209061570c565b80516040519192505f916008880191610a3891615785565b90815260200160405180910390205414610a6857805160405163a41f772f60e01b81526107ec9190600401615537565b5f6002885f013584604051602001610a9792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ab191615785565b602060405180830381855afa158015610acc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aef9190615549565b90508086600801835f0151604051610b079190615785565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b8957610b89615397565b021790555060208201516001820190610ba290826157da565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c479116856158a9565b8251604051919550610c5891615785565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610cad906158bc565b90506109d3565b50600483018190555f610cd2610cc9866121ef565b60400151612305565b90505f610cde87612492565b90505f600282604051610cf19190615785565b602060405180830381855afa158015610d0c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d2f9190615549565b9050828114610d5b57604051631872fc8d60e01b815260048101829052602481018490526044016107ec565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610dbd575080546001600160401b03808416911610155b15610ddb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610e058361266c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e5a8261267d565b610e7a576040516330efa98b60e01b8152600481018390526024016107ec565b5f610e8483611d53565b5190506002816005811115610e9b57610e9b615397565b14610ebb578060405163170cc93360e21b81526004016107ec9190615529565b61087683836126b8565b610ecd612932565b5f80516020615f128339815191525f610ee584611d53565b9050600281516005811115610efc57610efc615397565b14610f1d57805160405163170cc93360e21b81526107ec9190600401615529565b610f268461267d565b610f46576040516330efa98b60e01b8152600481018590526024016107ec565b5f8481526004830160205260409020546001600160a01b03163314610f8c57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016107ec565b5f84815260048301602052604090205460a08201514291610fbe91600160b01b9091046001600160401b0316906158de565b6001600160401b0316816001600160401b03161015610ffb5760405163fb6ce63f60e01b81526001600160401b03821660048201526024016107ec565b5f61100686866126b8565b5f8781526004860160205260408120600101549192509061103790600160401b90046001600160401b0316836158fe565b5f888152600487016020526040812060010154919250600160801b9091046001600160401b03169081900361106d575060a08401515b611078828286612969565b61109857604051635bff683f60e11b8152600481018990526024016107ec565b600386015460408601515f916001600160a01b03169063778c06b5906110bd90611587565b848589885f806040518863ffffffff1660e01b81526004016110e5979695949392919061591e565b602060405180830381865afa158015611100573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111249190615549565b90506064605061113484886158fe565b61113e919061595c565b611148919061599b565b5f8a8152600489016020526040902060018101805477ffffffffffffffffffffffffffffffff00000000000000001916600160401b6001600160401b039485160267ffffffffffffffff60801b191617600160801b9389169390930292909217909155546111bf906001600160a01b0316826129b4565b60405181908a907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a35050505050505061120860015f80516020615f5283398151915255565b5050565b5f61121c64e8d4a51000836159c0565b92915050565b6106608383835f612a25565b611236612932565b5f80516020615f128339815191525f8061124f84612c86565b9150915061125c8261267d565b61126857505050611303565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561129757611297615397565b036112e8575f838152600785016020526040812080549190556112ba82826129b4565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b6112fe816112f98460400151611587565b612fc4565b505050505b61131960015f80516020615f5283398151915255565b50565b5f8281525f80516020615ef28339815191526020526040808220815160e0810190925280545f80516020615f1283398151915293929190829060ff16600381111561136957611369615397565b600381111561137a5761137a615397565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6113f082611d53565b905060018351600381111561140757611407615397565b14611428578251604051633b0d540d60e21b81526107ec91906004016159d3565b60048151600581111561143d5761143d615397565b036114535761144b86612fd7565b505050505050565b5f8061146a611461886121ef565b604001516131be565b509150915081841461149757846040015160405163089938b360e11b81526004016107ec91815260200190565b806001600160401b031683606001516001600160401b031610806114d05750806001600160401b03168560a001516001600160401b0316115b156114f957604051632e19bc2d60e11b81526001600160401b03821660048201526024016107ec565b5f888152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f61121c6001600160401b03831664e8d4a510006159ed565b5f6115aa82611d53565b6080015192915050565b6106608383836001612a25565b6115c9612932565b5f8281525f80516020615ef28339815191526020526040808220815160e0810190925280545f80516020615f1283398151915293929190829060ff16600381111561161657611616615397565b600381111561162757611627615397565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156116a0576116a0615397565b146116c1578051604051633b0d540d60e21b81526107ec91906004016159d3565b60046116d08260400151611d53565b5160058111156116e2576116e2615397565b14611774575f6116f1846121ef565b90505f8061170283604001516131be565b50915091508184604001511461172e5760405163089938b360e11b8152600481018390526024016107ec565b806001600160401b03168460c001516001600160401b0316111561177057604051632e19bc2d60e11b81526001600160401b03821660048201526024016107ec565b5050505b61177d84612fd7565b505061120860015f80516020615f5283398151915255565b5f80516020615f128339815191525f6117ad83611d53565b51905060048160058111156117c4576117c4615397565b146117e4578060405163170cc93360e21b81526004016107ec9190615529565b5f8381526004830160205260409020546001600160a01b031633146118095733610f67565b5f83815260078301602090815260408083208054908490556004860190925290912054610876906001600160a01b0316826129b4565b5f80516020615f328339815191525f8061186461185b856121ef565b60400151613414565b915091508061188a57604051632d07135360e01b815281151560048201526024016107ec565b5f828152600684016020526040902080546118a4906154f7565b90505f036118c85760405163089938b360e11b8152600481018390526024016107ec565b60015f83815260078501602052604090205460ff1660058111156118ee576118ee615397565b14611921575f8281526007840160205260409081902054905163170cc93360e21b81526107ec9160ff1690600401615529565b5f828152600684016020526040812061193991615166565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6119d1612932565b6119dd848484346135d0565b90506119f560015f80516020615f5283398151915255565b9392505050565b5f8181525f80516020615ef28339815191526020526040808220815160e0810190925280545f80516020615f1283398151915293929190829060ff166003811115611a4957611a49615397565b6003811115611a5a57611a5a615397565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ad357611ad3615397565b14158015611af45750600381516003811115611af157611af1615397565b14155b15611b15578051604051633b0d540d60e21b81526107ec91906004016159d3565b5f611b238260400151611d53565b905080606001516001600160401b03165f03611b55576040516339b894f960e21b8152600481018590526024016107ec565b6005600160991b016001600160a01b031663ee5b48eb611b828460400151846060015185608001516121a0565b6040518263ffffffff1660e01b8152600401611b9e9190615537565b6020604051808303815f875af1158015611bba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bde9190615549565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615f328339815191529190611c2c906154f7565b90505f03611c505760405163089938b360e11b8152600481018390526024016107ec565b60015f83815260078301602052604090205460ff166005811115611c7657611c76615397565b14611ca9575f8281526007820160205260409081902054905163170cc93360e21b81526107ec9160ff1690600401615529565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce29190600401615a04565b6020604051808303815f875af1158015611cfe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190615549565b5f611d2b612932565b611d368233346137e3565b9050611d4e60015f80516020615f5283398151915255565b919050565b611d5b61519d565b5f8281525f80516020615f72833981519152602052604090819020815160e0810190925280545f80516020615f32833981519152929190829060ff166005811115611da857611da8615397565b6005811115611db957611db9615397565b8152602001600182018054611dcd906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611df9906154f7565b8015611e445780601f10611e1b57610100808354040283529160200191611e44565b820191905f5260205f20905b815481529060010190602001808311611e2757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615f32833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ee59086908690615a8e565b90815260200160405180910390205491505092915050565b5f8481525f80516020615ef28339815191526020526040808220815160e0810190925280545f80516020615f1283398151915293929190829060ff166003811115611f4a57611f4a615397565b6003811115611f5b57611f5b615397565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611fd182611d53565b9050600283516003811115611fe857611fe8615397565b14612009578251604051633b0d540d60e21b81526107ec91906004016159d3565b60208301516001600160a01b031633146120235733610f67565b60028151600581111561203857612038615397565b0361213957861561204f5761204d82876126b8565b505b5f8881526005850160205260409020805460ff191660031790556060830151608082015161208891849161208391906158fe565b613ab8565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556120c984613c0f565b90508580156120d6575080155b156120f757604051631036cf9160e11b8152600481018a90526024016107ec565b5f8981526006860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a350612196565b60048151600581111561214e5761214e615397565b0361217a5761215c83613c0f565b5f89815260068601602052604090205561217588612fd7565b612196565b805160405163170cc93360e21b81526107ec9190600401615529565b5050505050505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612253573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261227a9190810190615aa8565b915091508061229c57604051636b2f19e960e01b815260040160405180910390fd5b8151156122c2578151604051636ba589a560e01b815260048101919091526024016107ec565b60208201516001600160a01b0316156122fe576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016107ec565b5092915050565b5f815160261461233a57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016107ec565b5f805b600281101561238957612351816001615b7a565b61235c9060086159ed565b61ffff16848281518110612372576123726155d4565b016020015160f81c901b919091179060010161233d565b5061ffff8116156123b35760405163407b587360e01b815261ffff821660048201526024016107ec565b5f805b600481101561240e576123ca816003615b7a565b6123d59060086159ed565b63ffffffff16856123e78360026158a9565b815181106123f7576123f76155d4565b016020015160f81c901b91909117906001016123b6565b5063ffffffff81161561243457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156124895761244b81601f615b7a565b6124569060086159ed565b866124628360066158a9565b81518110612472576124726155d4565b016020015160f81c901b9190911790600101612437565b50949350505050565b60605f808335602085013560146124ae87870160408901615574565b6124bb606089018961558f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b612541606085018561558f565b90508110156122fe5781612558606086018661558f565b83818110612568576125686155d4565b905060200281019061257a91906155e8565b6125849080615b8d565b9050612593606087018761558f565b848181106125a3576125a36155d4565b90506020028101906125b591906155e8565b6125bf9080615b8d565b6125cc606089018961558f565b868181106125dc576125dc6155d4565b90506020028101906125ee91906155e8565b6125fc906020810190615b8d565b61260960608b018b61558f565b88818110612619576126196155d4565b905060200281019061262b91906155e8565b61263c906060810190604001615319565b6040516020016126529796959493929190615bcf565b60408051601f198184030181529190529150600101612534565b612674613dd8565b61131981613e23565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612703573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261272a9190810190615aa8565b915091508061274c57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561278f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b39190615549565b8251146127d9578151604051636ba589a560e01b815260048101919091526024016107ec565b60208201516001600160a01b031615612815576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016107ec565b5f806128248460400151613e91565b9150915081871461284b5760405163089938b360e11b8152600481018890526024016107ec565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615f12833981519152906001600160401b039081169083161115612908575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612927565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f80516020615f5283398151915280546001190161296357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f605061297684846158fe565b612980919061595c565b6001600160401b031661299485606461595c565b6001600160401b031610156129aa57505f6119f5565b5060019392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612a00575f80fd5b505af115801561144b573d5f803e3d5ffd5b60015f80516020615f5283398151915255565b5f80516020615f128339815191525f612a3d86614082565b9050612a488661267d565b612a53575050610876565b5f8681526004830160205260409020546001600160a01b03163314612a785733610f67565b5f86815260048301602052604090205460a0820151612aa791600160b01b90046001600160401b0316906158de565b6001600160401b03168160c001516001600160401b03161015612aee5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016107ec565b5f8515612b0657612aff87866126b8565b9050612b24565b505f8681526004830160205260409020600101546001600160401b03165b5f878152600484016020526040812060010154612b5190600160401b90046001600160401b0316836158fe565b5f898152600486016020526040812060010154919250600160801b9091046001600160401b031690819003612b87575060a08301515b858015612ba05750612b9e82828660c00151612969565b155b15612bc157604051635bff683f60e11b8152600481018a90526024016107ec565b600385015460408501515f916001600160a01b03169063778c06b590612be690611587565b84858960c00151885f806040518863ffffffff1660e01b8152600401612c12979695949392919061591e565b602060405180830381865afa158015612c2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c519190615549565b905080866007015f8c81526020019081526020015f205f828254612c7591906158a9565b909155505050505050505050505050565b5f612c8f61519d565b5f80516020615f328339815191525f80612cab61185b876121ef565b915091508015612cd257604051632d07135360e01b815281151560048201526024016107ec565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612d0357612d03615397565b6005811115612d1457612d14615397565b8152602001600182018054612d28906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d54906154f7565b8015612d9f5780601f10612d7657610100808354040283529160200191612d9f565b820191905f5260205f20905b815481529060010190602001808311612d8257829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612e0a57612e0a615397565b14158015612e2b5750600181516005811115612e2857612e28615397565b14155b15612e4c57805160405163170cc93360e21b81526107ec9190600401615529565b600381516005811115612e6157612e61615397565b03612e6f5760048152612e74565b600581525b836008018160200151604051612e8a9190615785565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ece57612ece615397565b021790555060208201516001820190612ee790826157da565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612f8d57612f8d615397565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6112086001600160a01b03831682614366565b5f8181525f80516020615ef28339815191526020526040808220815160e0810190925280545f80516020615f1283398151915293929190829060ff16600381111561302457613024615397565b600381111561303557613035615397565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215613163575f8481526004870160205260409020546127109061311590600160a01b900461ffff16856159ed565b61311f91906159c0565b915081866007015f8681526020019081526020015f205f82825461314391906158a9565b9091555061315390508284615b7a565b90506131638560200151826129b4565b61317885602001516112f98760600151611587565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f83516036146131f557835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016107ec565b5f805b60028110156132445761320c816001615b7a565b6132179060086159ed565b61ffff1686828151811061322d5761322d6155d4565b016020015160f81c901b91909117906001016131f8565b5061ffff81161561326e5760405163407b587360e01b815261ffff821660048201526024016107ec565b5f805b60048110156132c957613285816003615b7a565b6132909060086159ed565b63ffffffff16876132a28360026158a9565b815181106132b2576132b26155d4565b016020015160f81c901b9190911790600101613271565b5063ffffffff81166003146132f157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133465761330881601f615b7a565b6133139060086159ed565b8861331f8360066158a9565b8151811061332f5761332f6155d4565b016020015160f81c901b91909117906001016132f4565b505f805b60088110156133a55761335e816007615b7a565b6133699060086159ed565b6001600160401b03168961337e8360266158a9565b8151811061338e5761338e6155d4565b016020015160f81c901b919091179060010161334a565b505f805b6008811015613404576133bd816007615b7a565b6133c89060086159ed565b6001600160401b03168a6133dd83602e6158a9565b815181106133ed576133ed6155d4565b016020015160f81c901b91909117906001016133a9565b5091989097509095509350505050565b5f80825160271461344a57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016107ec565b5f805b600281101561349957613461816001615b7a565b61346c9060086159ed565b61ffff16858281518110613482576134826155d4565b016020015160f81c901b919091179060010161344d565b5061ffff8116156134c35760405163407b587360e01b815261ffff821660048201526024016107ec565b5f805b600481101561351e576134da816003615b7a565b6134e59060086159ed565b63ffffffff16866134f78360026158a9565b81518110613507576135076155d4565b016020015160f81c901b91909117906001016134c6565b5063ffffffff811660021461354657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561359b5761355d81601f615b7a565b6135689060086159ed565b876135748360066158a9565b81518110613584576135846155d4565b016020015160f81c901b9190911790600101613549565b505f866026815181106135b0576135b06155d4565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615f1283398151915290600160401b900461ffff9081169086161080613624575061271061ffff8616115b1561364857604051635f12e6c360e11b815261ffff861660048201526024016107ec565b60028101546001600160401b039081169085161015613684576040516202a06d60e11b81526001600160401b03851660048201526024016107ec565b80548310806136965750806001015483115b156136b75760405163222d164360e21b8152600481018490526024016107ec565b825f6136c28261120c565b90505f6136cf89836143f9565b90506040518060c001604052806136e33390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f6060808801829052608080890183905260a09889018390528a83526004909d0185529082902088518154958a0151938a01518516600160b01b0267ffffffffffffffff60b01b1994909716600160a01b026001600160b01b03199096169716969096179390931716929092178355840151600190920180549885015194909301518116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990991692909116919091179690961791909116949094179093555090915050949350505050565b5f5f80516020615f12833981519152816137fc8461120c565b90505f61380887611d53565b90506138138761267d565b613833576040516330efa98b60e01b8152600481018890526024016107ec565b60028151600581111561384857613848615397565b1461386957805160405163170cc93360e21b81526107ec9190600401615529565b5f82826080015161387a91906158de565b905083600201600a9054906101000a90046001600160401b031682604001516138a3919061595c565b6001600160401b0316816001600160401b031611156138e057604051636d51fe0560e11b81526001600160401b03821660048201526024016107ec565b5f806138ec8a84613ab8565b915091505f8a8360405160200161391a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156139ad576139ad615397565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615f72833981519152602052604081206002015481905f80516020615f3283398151915290600160801b90046001600160401b0316613b008582614971565b5f613b0a87614b4b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613b5a8a858b6121a0565b6040518263ffffffff1660e01b8152600401613b769190615537565b6020604051808303815f875af1158015613b92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb69190615549565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615f1283398151915290505f613c2f8460400151611d53565b90505f600382516005811115613c4757613c47615397565b1480613c655750600482516005811115613c6357613c63615397565b145b15613c75575060c0810151613cb2565b600282516005811115613c8a57613c8a615397565b03613c96575042613cb2565b815160405163170cc93360e21b81526107ec9190600401615529565b84608001516001600160401b0316816001600160401b031611613cd957505f949350505050565b6040808601515f90815260048501602052206001015460a0830151613d08916001600160401b03169083612969565b613d1657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613d3b90611587565b60a085015160808901516040808b01515f9081526004808b016020528282206001015492516001600160e01b031960e089901b168152613d90969594938a936001600160401b0390911692909182910161591e565b602060405180830381865afa158015613dab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dcf9190615549565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e2157604051631afcd79f60e31b815260040160405180910390fd5b565b613e2b613dd8565b613e3481614bc0565b613e3c614bd9565b61131960608201356080830135613e5960c0850160a08601615319565b613e6960e0860160c08701615c38565b613e7a610100870160e08801615c51565b613e8c61012088016101008901615574565b614be9565b5f808251602e14613ec757825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016107ec565b5f805b6002811015613f1657613ede816001615b7a565b613ee99060086159ed565b61ffff16858281518110613eff57613eff6155d4565b016020015160f81c901b9190911790600101613eca565b5061ffff811615613f405760405163407b587360e01b815261ffff821660048201526024016107ec565b5f805b6004811015613f9b57613f57816003615b7a565b613f629060086159ed565b63ffffffff1686613f748360026158a9565b81518110613f8457613f846155d4565b016020015160f81c901b9190911790600101613f43565b5063ffffffff811615613fc157604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561401657613fd881601f615b7a565b613fe39060086159ed565b87613fef8360066158a9565b81518110613fff57613fff6155d4565b016020015160f81c901b9190911790600101613fc4565b505f805b60088110156140755761402e816007615b7a565b6140399060086159ed565b6001600160401b03168861404e8360266158a9565b8151811061405e5761405e6155d4565b016020015160f81c901b919091179060010161401a565b5090969095509350505050565b61408a61519d565b5f8281525f80516020615f728339815191526020526040808220815160e0810190925280545f80516020615f3283398151915293929190829060ff1660058111156140d7576140d7615397565b60058111156140e8576140e8615397565b81526020016001820180546140fc906154f7565b80601f0160208091040260200160405190810160405280929190818152602001828054614128906154f7565b80156141735780601f1061414a57610100808354040283529160200191614173565b820191905f5260205f20905b81548152906001019060200180831161415657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156141e1576141e1615397565b14614214575f8481526007830160205260409081902054905163170cc93360e21b81526107ec9160ff1690600401615529565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561425857614258615397565b02179055506020820151600182019061427190826157da565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61430f8582613ab8565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156143895760405163cd78605960e01b81523060048201526024016107ec565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143d2576040519150601f19603f3d011682016040523d82523d5f602084013e6143d7565b606091505b505090508061066057604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661443d57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615f328339815191524261445c6060860160408701615319565b6001600160401b0316111580614496575061447a6202a300426158a9565b61448a6060860160408701615319565b6001600160401b031610155b156144d0576144ab6060850160408601615319565b604051635879da1360e11b81526001600160401b0390911660048201526024016107ec565b6144e56144e06060860186615c71565b614d18565b6144f56144e06080860186615c71565b60306145046020860186615b8d565b905014614536576145186020850185615b8d565b6040516326475b2f60e11b81526107ec925060040190815260200190565b6145408480615b8d565b90505f0361456d576145528480615b8d565b604051633e08a12560e11b81526004016107ec929190615c85565b5f6008820161457c8680615b8d565b60405161458a929190615a8e565b908152602001604051809103902054146145c3576145a88480615b8d565b60405163a41f772f60e01b81526004016107ec929190615c85565b6145cd835f614971565b6040805160e08101909152815481525f9081906146d990602081016145f28980615b8d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061463a908a018a615b8d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161468360608a0160408b01615319565b6001600160401b0316815260200161469e60608a018a615c71565b6146a790615cb3565b81526020016146b960808a018a615c71565b6146c290615cb3565b8152602001876001600160401b0316815250614e81565b5f828152600686016020526040902091935091506146f782826157da565b5081600884016147078880615b8d565b604051614715929190615a8e565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614751908590600401615537565b6020604051808303815f875af115801561476d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147919190615549565b6040805160e0810190915290915080600181526020016147b18980615b8d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561484057614840615397565b02179055506020820151600182019061485990826157da565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806148f78880615b8d565b604051614905929190615a8e565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906149439190615319565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615f328339815191525f6001600160401b0380841690851611156149a55761499e83856158fe565b90506149b2565b6149af84846158fe565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614a14575060018401548151614a10916001600160401b0316906158a9565b8210155b15614a3a576001600160401b038316606082015281815260408101516020820152614a59565b8281606001818151614a4c91906158de565b6001600160401b03169052505b6060810151614a6990606461595c565b602082015160018601546001600160401b039290921691614a949190600160401b900460ff166159ed565b1015614ac457606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016107ec565b856001600160401b031681604001818151614adf91906158a9565b9052506040810180516001600160401b0387169190614aff908390615b7a565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f728339815191526020526040812060020180545f80516020615f328339815191529190600890614b9590600160401b90046001600160401b0316615d7a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614bc8613dd8565b614bd061506e565b61131981615076565b614be1613dd8565b613e2161515e565b614bf1613dd8565b5f80516020615f1283398151915261ffff84161580614c15575061271061ffff8516115b15614c3957604051635f12e6c360e11b815261ffff851660048201526024016107ec565b85871115614c5d5760405163222d164360e21b8152600481018890526024016107ec565b60ff83161580614c705750600a60ff8416115b15614c935760405163170db35960e31b815260ff841660048201526024016107ec565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b614d2560208201826152ea565b63ffffffff16158015614d455750614d40602082018261558f565b151590505b15614d8c57614d5760208201826152ea565b614d64602083018361558f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016107ec565b614d99602082018261558f565b9050614da860208301836152ea565b63ffffffff161115614dc157614d5760208201826152ea565b60015b614dd1602083018361558f565b905081101561120857614de7602083018361558f565b614df2600184615b7a565b818110614e0157614e016155d4565b9050602002016020810190614e169190615574565b6001600160a01b0316614e2c602084018461558f565b83818110614e3c57614e3c6155d4565b9050602002016020810190614e519190615574565b6001600160a01b03161015614e7957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614dc4565b5f6060826040015151603014614eaa5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614eeb988a986001989297929690959094909390929101615d95565b60405160208183030381529060405290505f5b84608001516020015151811015614f5d57818560800151602001518281518110614f2a57614f2a6155d4565b6020026020010151604051602001614f43929190615e4f565b60408051601f198184030181529190529150600101614efe565b5060a0840151805160209182015151604051614f7d938593929101615e85565b60405160208183030381529060405290505f5b8460a001516020015151811015614fef57818560a00151602001518281518110614fbc57614fbc6155d4565b6020026020010151604051602001614fd5929190615e4f565b60408051601f198184030181529190529150600101614f90565b5060c0840151604051615006918391602001615ec0565b60405160208183030381529060405290506002816040516150279190615785565b602060405180830381855afa158015615042573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906150659190615549565b94909350915050565b613e21613dd8565b61507e613dd8565b80355f80516020615f3283398151915290815560146150a36060840160408501615c51565b60ff1611806150c257506150bd6060830160408401615c51565b60ff16155b156150f6576150d76060830160408401615c51565b604051634a59bbff60e11b815260ff90911660048201526024016107ec565b6151066060830160408401615c51565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556151376040830160208401615319565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a12613dd8565b508054615172906154f7565b5f825580601f10615181575050565b601f0160209004905f5260205f209081019061131991906151da565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151ee575f81556001016151db565b5090565b8015158114611319575f80fd5b803563ffffffff81168114611d4e575f80fd5b5f805f60608486031215615224575f80fd5b833592506020840135615236816151f2565b9150615244604085016151ff565b90509250925092565b5f6020828403121561525d575f80fd5b5035919050565b5f8060408385031215615275575f80fd5b82356001600160401b0381111561528a575f80fd5b83016080818603121561529b575f80fd5b91506152a9602084016151ff565b90509250929050565b5f61012082840312156152c3575f80fd5b50919050565b5f80604083850312156152da575f80fd5b823591506152a9602084016151ff565b5f602082840312156152fa575f80fd5b6119f5826151ff565b80356001600160401b0381168114611d4e575f80fd5b5f60208284031215615329575f80fd5b6119f582615303565b803561ffff81168114611d4e575f80fd5b5f805f60608486031215615355575f80fd5b83356001600160401b0381111561536a575f80fd5b840160a0818703121561537b575f80fd5b925061538960208501615332565b915061524460408501615303565b634e487b7160e01b5f52602160045260245ffd5b600681106153bb576153bb615397565b9052565b5f5b838110156153d95781810151838201526020016153c1565b50505f910152565b5f81518084526153f88160208601602086016153bf565b601f01601f19169290920160200192915050565b6020815261541e6020820183516153ab565b5f602083015160e060408401526154396101008401826153e1565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561549d575f80fd5b82356001600160401b03808211156154b3575f80fd5b818501915085601f8301126154c6575f80fd5b8135818111156154d4575f80fd5b8660208285010111156154e5575f80fd5b60209290920196919550909350505050565b600181811c9082168061550b57607f821691505b6020821081036152c357634e487b7160e01b5f52602260045260245ffd5b6020810161121c82846153ab565b602081525f6119f560208301846153e1565b5f60208284031215615559575f80fd5b5051919050565b6001600160a01b0381168114611319575f80fd5b5f60208284031215615584575f80fd5b81356119f581615560565b5f808335601e198436030181126155a4575f80fd5b8301803591506001600160401b038211156155bd575f80fd5b6020019150600581901b3603821315613c08575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155fc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561563c5761563c615606565b60405290565b604080519081016001600160401b038111828210171561563c5761563c615606565b604051601f8201601f191681016001600160401b038111828210171561568c5761568c615606565b604052919050565b5f6001600160401b038211156156ac576156ac615606565b50601f01601f191660200190565b5f82601f8301126156c9575f80fd5b81356156dc6156d782615694565b615664565b8181528460208386010111156156f0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561571c575f80fd5b61572461561a565b82356001600160401b038082111561573a575f80fd5b615746368387016156ba565b8352602085013591508082111561575b575f80fd5b50615768368286016156ba565b60208301525061577a60408401615303565b604082015292915050565b5f82516155fc8184602087016153bf565b601f82111561066057805f5260205f20601f840160051c810160208510156157bb5750805b601f840160051c820191505b81811015611bde575f81556001016157c7565b81516001600160401b038111156157f3576157f3615606565b6158078161580184546154f7565b84615796565b602080601f83116001811461583a575f84156158235750858301515b5f19600386901b1c1916600185901b17855561144b565b5f85815260208120601f198616915b8281101561586857888601518255948401946001909101908401615849565b508582101561588557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561121c5761121c615895565b5f63ffffffff8083168181036158d4576158d4615895565b6001019392505050565b6001600160401b038181168382160190808211156122fe576122fe615895565b6001600160401b038281168282160390808211156122fe576122fe615895565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b6001600160401b0381811683821602808216919082811461597f5761597f615895565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b03808416806159b4576159b4615987565b92169190910492915050565b5f826159ce576159ce615987565b500490565b60208101600483106159e7576159e7615397565b91905290565b808202811582820484141761121c5761121c615895565b5f60208083525f8454615a16816154f7565b806020870152604060018084165f8114615a375760018114615a5357615a80565b60ff19851660408a0152604084151560051b8a01019550615a80565b895f5260205f205f5b85811015615a775781548b8201860152908301908801615a5c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b8051611d4e816151f2565b5f8060408385031215615ab9575f80fd5b82516001600160401b0380821115615acf575f80fd5b9084019060608287031215615ae2575f80fd5b615aea61561a565b82518152602080840151615afd81615560565b82820152604084015183811115615b12575f80fd5b80850194505087601f850112615b26575f80fd5b83519250615b366156d784615694565b8381528882858701011115615b49575f80fd5b615b58848383018488016153bf565b80604084015250819550615b6d818801615a9d565b9450505050509250929050565b8181038181111561121c5761121c615895565b5f808335601e19843603018112615ba2575f80fd5b8301803591506001600160401b03821115615bbb575f80fd5b602001915036819003821315613c08575f80fd5b5f8851615be0818460208d016153bf565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f60208284031215615c48575f80fd5b6119f582615332565b5f60208284031215615c61575f80fd5b813560ff811681146119f5575f80fd5b5f8235603e198336030181126155fc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615cc3575f80fd5b615ccb615642565b615cd4836151ff565b81526020808401356001600160401b0380821115615cf0575f80fd5b9085019036601f830112615d02575f80fd5b813581811115615d1457615d14615606565b8060051b9150615d25848301615664565b8181529183018401918481019036841115615d3e575f80fd5b938501935b83851015615d685784359250615d5883615560565b8282529385019390850190615d43565b94860194909452509295945050505050565b5f6001600160401b038083168181036158d4576158d4615895565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ddb81602a850160208b016153bf565b865190830190615df281602a840160208b016153bf565b60c087901b6001600160c01b031916602a9290910191820152615e24603282018660e01b6001600160e01b0319169052565b615e3d603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615e608184602088016153bf565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615e968184602089016153bf565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615ed18184602088016153bf565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -540,6 +540,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) PCHAIN return _NativeTokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_NativeTokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + // VALIDATORMANAGERSTORAGELOCATION is a free data retrieval call binding the contract method 0xbc5fbfec. // // Solidity: function VALIDATOR_MANAGER_STORAGE_LOCATION() view returns(bytes32) @@ -778,46 +809,67 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Cl return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ClaimValidationRewards(opts *bind.TransactOpts, validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "claimValidationRewards", validationID, messageIndex) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ClaimValidationRewards(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimValidationRewards(&_NativeTokenStakingManager.TransactOpts, validationID, messageIndex) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// ClaimValidationRewards is a paid mutator transaction binding the contract method 0x2893d077. // -// 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) +// Solidity: function claimValidationRewards(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ClaimValidationRewards(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimValidationRewards(&_NativeTokenStakingManager.TransactOpts, validationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", delegationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID, messageIndex) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x60ad7784. // -// 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) +// Solidity: function completeDelegatorRegistration(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, messageIndex) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x80dd672f. +// +// Solidity: function completeEndDelegation(bytes32 delegationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(delegationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, messageIndex) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -2638,6 +2690,159 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida return event, nil } +// NativeTokenStakingManagerValidationRewardsClaimedIterator is returned from FilterValidationRewardsClaimed and is used to iterate over the raw logs and unpacked data for ValidationRewardsClaimed events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationRewardsClaimedIterator struct { + Event *NativeTokenStakingManagerValidationRewardsClaimed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationRewardsClaimedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationRewardsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationRewardsClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationRewardsClaimedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationRewardsClaimedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationRewardsClaimed represents a ValidationRewardsClaimed event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationRewardsClaimed struct { + ValidationID [32]byte + Reward *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationRewardsClaimed is a free log retrieval operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationRewardsClaimed(opts *bind.FilterOpts, validationID [][32]byte, reward []*big.Int) (*NativeTokenStakingManagerValidationRewardsClaimedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var rewardRule []interface{} + for _, rewardItem := range reward { + rewardRule = append(rewardRule, rewardItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationRewardsClaimed", validationIDRule, rewardRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationRewardsClaimedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationRewardsClaimed", logs: logs, sub: sub}, nil +} + +// WatchValidationRewardsClaimed is a free log subscription operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationRewardsClaimed(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationRewardsClaimed, validationID [][32]byte, reward []*big.Int) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var rewardRule []interface{} + for _, rewardItem := range reward { + rewardRule = append(rewardRule, rewardItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationRewardsClaimed", validationIDRule, rewardRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationRewardsClaimed) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationRewardsClaimed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationRewardsClaimed is a log parse operation binding the contract event 0x69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a. +// +// Solidity: event ValidationRewardsClaimed(bytes32 indexed validationID, uint256 indexed reward) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationRewardsClaimed(log types.Log) (*NativeTokenStakingManagerValidationRewardsClaimed, error) { + event := new(NativeTokenStakingManagerValidationRewardsClaimed) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationRewardsClaimed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log From ec8b480cea1be83c61d10ab5132c0b5a1db67699 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 18:37:37 -0500 Subject: [PATCH 11/15] store uptime since validation start --- .../validator-manager/PoSValidatorManager.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 38 +++++++++++++------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index a2e1fb622..3be5f4d8a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -346,7 +346,7 @@ abstract contract PoSValidatorManager is }); $._posValidatorInfo[validationID].lastClaimMinUptime = - (claimTime - lastClaimTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; + (claimTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; $._posValidatorInfo[validationID].lastClaimTime = claimTime; _reward($._posValidatorInfo[validationID].owner, reward); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 40f5f3b28..fb876f21c 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1196,7 +1196,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - uint256 expectedReward = _claimRewards({ + uint256 firstExpectedReward = _claimRewards({ validationID: validationID, uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, @@ -1205,8 +1205,22 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { success: true }); - // Try to end the validation with a stale uptime + // Claim rewards again uint64 secondClaimTime = firstClaimTime + 5 hours; + uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, (secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + uint256 secondExpectedReward = _claimRewards({ + validationID: validationID, + uptimeMsg: uptimeMsg, + validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimTime: secondClaimTime, + lastClaimTime: firstClaimTime, + success: true + }); + + // Try to end the validation with a stale uptime + uint64 thirdClaimTime = secondClaimTime + 5 hours; vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID @@ -1215,7 +1229,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation({ validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: secondClaimTime, + completionTimestamp: thirdClaimTime, expectedNonce: 1, includeUptime: false, force: false @@ -1225,17 +1239,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation({ validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: secondClaimTime, + completionTimestamp: thirdClaimTime, expectedNonce: 1, includeUptime: true, force: false }); - uint256 secondExpectedReward = rewardCalculator.calculateReward({ + uint256 thirdExpectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: 0, - stakingStartTime: firstClaimTime, - stakingEndTime: secondClaimTime, + stakingStartTime: secondClaimTime, + stakingEndTime: thirdClaimTime, uptimeSeconds: 0, initialSupply: 0, endSupply: 0 @@ -1244,7 +1258,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _completeEndValidationWithChecks({ validationID: validationID, validatorOwner: address(this), - expectedReward: secondExpectedReward, + expectedReward: thirdExpectedReward, validatorWeight: DEFAULT_WEIGHT }); @@ -1253,16 +1267,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: 0, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingEndTime: secondClaimTime, + stakingEndTime: thirdClaimTime, uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); // Off-by one errors are possible due to integer rounding - if (totalExpectedReward > expectedReward + secondExpectedReward) { - assertTrue(totalExpectedReward - (expectedReward + secondExpectedReward) <= 1); + if (totalExpectedReward > firstExpectedReward + secondExpectedReward + thirdExpectedReward) { + assertTrue(totalExpectedReward - (firstExpectedReward + secondExpectedReward + thirdExpectedReward) <= 1); } else { - assertTrue((expectedReward + secondExpectedReward) - totalExpectedReward <= 1); + assertTrue((firstExpectedReward + secondExpectedReward + thirdExpectedReward) - totalExpectedReward <= 1); } } From 503da7dc17f1656b9ece541d2a81144c3e4f6b84 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 16 Oct 2024 18:48:56 -0500 Subject: [PATCH 12/15] format --- .../tests/PoSValidatorManagerTests.t.sol | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 10db6b8d4..98e6db427 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1244,7 +1244,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Claim rewards again uint64 secondClaimTime = firstClaimTime + 5 hours; uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, (secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, + (secondClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); uint256 secondExpectedReward = _claimRewards({ validationID: validationID, @@ -1309,10 +1310,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); // Off-by one errors are possible due to integer rounding - if (totalExpectedReward > firstExpectedReward + secondExpectedReward + thirdExpectedReward) { - assertTrue(totalExpectedReward - (firstExpectedReward + secondExpectedReward + thirdExpectedReward) <= 1); + if (totalExpectedReward > firstExpectedReward + secondExpectedReward + thirdExpectedReward) + { + assertTrue( + totalExpectedReward + - (firstExpectedReward + secondExpectedReward + thirdExpectedReward) <= 1 + ); } else { - assertTrue((firstExpectedReward + secondExpectedReward + thirdExpectedReward) - totalExpectedReward <= 1); + assertTrue( + (firstExpectedReward + secondExpectedReward + thirdExpectedReward) + - totalExpectedReward <= 1 + ); } } From d21de011996dcb3c6a69ed54861979b7252790f0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 24 Oct 2024 12:26:27 -0500 Subject: [PATCH 13/15] correct arg order --- tests/utils/validator_manager.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b856d8aa8..991579214 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -1173,7 +1173,7 @@ func CompleteERC20DelegatorRegistration( ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) + callData, err := abi.Pack("completeDelegatorRegistration", delegationID, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, @@ -1215,7 +1215,7 @@ func CompleteEndERC20Delegation( ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) + callData, err := abi.Pack("completeEndDelegation", delegationID, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, @@ -1264,7 +1264,7 @@ func CompleteNativeDelegatorRegistration( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) + callData, err := abi.Pack("completeDelegatorRegistration", delegationID, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, @@ -1306,7 +1306,7 @@ func CompleteEndNativeDelegation( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) + callData, err := abi.Pack("completeEndDelegation", delegationID, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( ctx, From fac829a3659959e8e6b83dceb8a667cd1dc0e0e1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 29 Oct 2024 16:10:31 -0500 Subject: [PATCH 14/15] calculate owed rewards by subtracting claimed rewards --- .../validator-manager/PoSValidatorManager.sol | 53 +++++++------------ .../interfaces/IPoSValidatorManager.sol | 3 +- .../tests/PoSValidatorManagerTests.t.sol | 48 +++++++---------- 3 files changed, 41 insertions(+), 63 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 370b6050c..f4e40ed68 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -228,33 +228,31 @@ abstract contract PoSValidatorManager is } // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 totalUptime; + uint64 uptime; if (includeUptimeProof) { - totalUptime = _updateUptime(validationID, messageIndex); + uptime = _updateUptime(validationID, messageIndex); } else { - totalUptime = $._posValidatorInfo[validationID].uptimeSeconds; - } - uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimMinUptime; - uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; - if (lastClaimTime == 0) { - lastClaimTime = validator.startedAt; + uptime = $._posValidatorInfo[validationID].uptimeSeconds; } if ( requireSufficientUptime - && !_validateSufficientUptime(uptime, lastClaimTime, validator.endedAt) + && !_validateSufficientUptime(uptime, validator.startedAt, validator.endedAt) ) { revert ValidatorIneligibleForRewards(validationID); } + // Calculate the reward for the entire staking period uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), - validatorStartTime: lastClaimTime, - stakingStartTime: lastClaimTime, + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, stakingEndTime: validator.endedAt, uptimeSeconds: uptime, initialSupply: 0, endSupply: 0 }); + // Subtract the rewards that have already been claimed. + reward -= $._posValidatorInfo[validationID].claimedRewards; $._redeemableValidatorRewards[validationID] += reward; } @@ -318,36 +316,26 @@ abstract contract PoSValidatorManager is revert MinStakeDurationNotPassed(claimTime); } - // The claim's uptime is the difference between the total uptime and the minimum possible uptime from the last claim. - // We use the minimum uptime to get a lower bound on the required uptime for this claim - uint64 totalUptime = _updateUptime(validationID, messageIndex); - uint64 uptime = totalUptime - $._posValidatorInfo[validationID].lastClaimMinUptime; - - // If no rewards have yet been claimed, use the validator's start time - uint64 lastClaimTime = $._posValidatorInfo[validationID].lastClaimTime; - if (lastClaimTime == 0) { - lastClaimTime = validator.startedAt; - } - // Validate the uptime for this claim. Given that all previous claims have been similarly validated, - // this is equivalent to validating the uptime of the entire validation period up to this point, due - // to the linearity of the uptime threshold calculation. - if (!_validateSufficientUptime(uptime, lastClaimTime, claimTime)) { + uint64 uptime = _updateUptime(validationID, messageIndex); + if (!_validateSufficientUptime(uptime, validator.startedAt, claimTime)) { revert ValidatorIneligibleForRewards(validationID); } - uint256 reward = $._rewardCalculator.calculateReward({ + // Calculate the reward for the entire staking period + uint256 totalReward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), - validatorStartTime: lastClaimTime, - stakingStartTime: lastClaimTime, + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, stakingEndTime: claimTime, uptimeSeconds: uptime, initialSupply: 0, endSupply: 0 }); - $._posValidatorInfo[validationID].lastClaimMinUptime = - (claimTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE / 100; - $._posValidatorInfo[validationID].lastClaimTime = claimTime; + // Subtract the rewards that have already been claimed. + uint256 reward = totalReward - $._posValidatorInfo[validationID].claimedRewards; + $._posValidatorInfo[validationID].claimedRewards = totalReward; + _reward($._posValidatorInfo[validationID].owner, reward); emit ValidationRewardsClaimed(validationID, reward); @@ -437,8 +425,7 @@ abstract contract PoSValidatorManager is delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration, uptimeSeconds: 0, - lastClaimMinUptime: 0, - lastClaimTime: 0 + claimedRewards: 0 }); return validationID; } diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index b8901535c..bcc471db2 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -52,8 +52,7 @@ struct PoSValidatorInfo { uint16 delegationFeeBips; uint64 minStakeDuration; uint64 uptimeSeconds; - uint64 lastClaimMinUptime; - uint64 lastClaimTime; + uint256 claimedRewards; } /** diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 98e6db427..9d84ce7e0 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1120,12 +1120,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, (firstClaimTime - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); - _claimRewards({ + uint256 claimedReward = _claimRewards({ validationID: validationID, uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: firstClaimTime, - lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimedReward: 0, success: true }); @@ -1140,7 +1140,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: secondClaimTime, - lastClaimTime: firstClaimTime, + claimedReward: claimedReward, success: true }); } @@ -1161,12 +1161,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, ((firstClaimTime - validationStartTime) * uptimePercentage / 100) + 1 ); - _claimRewards({ + uint256 claimedReward = _claimRewards({ validationID: validationID, uptimeMsg: uptimeMsg, validationStartTime: validationStartTime, claimTime: firstClaimTime, - lastClaimTime: validationStartTime, + claimedReward: 0, success: true }); @@ -1177,7 +1177,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: validationStartTime, claimTime: secondClaimTime, - lastClaimTime: firstClaimTime, + claimedReward: claimedReward, success: false }); } @@ -1195,7 +1195,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: DEFAULT_COMPLETION_TIMESTAMP, - lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimedReward: 0, success: false }); } @@ -1216,7 +1216,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: claimTime, - lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimedReward: 0, success: true }); @@ -1237,7 +1237,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: firstClaimTime, - lastClaimTime: DEFAULT_REGISTRATION_TIMESTAMP, + claimedReward: 0, success: true }); @@ -1252,7 +1252,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeMsg: uptimeMsg, validationStartTime: DEFAULT_REGISTRATION_TIMESTAMP, claimTime: secondClaimTime, - lastClaimTime: firstClaimTime, + claimedReward: firstExpectedReward, success: true }); @@ -1284,13 +1284,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 thirdExpectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, - stakingStartTime: secondClaimTime, + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: thirdClaimTime, uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); + thirdExpectedReward = thirdExpectedReward - firstExpectedReward - secondExpectedReward; _completeEndValidationWithChecks({ validationID: validationID, @@ -1302,26 +1303,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Confirm the pro-rated rewards match the total expected reward uint256 totalExpectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), - validatorStartTime: 0, + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: thirdClaimTime, uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); - // Off-by one errors are possible due to integer rounding - if (totalExpectedReward > firstExpectedReward + secondExpectedReward + thirdExpectedReward) - { - assertTrue( - totalExpectedReward - - (firstExpectedReward + secondExpectedReward + thirdExpectedReward) <= 1 - ); - } else { - assertTrue( - (firstExpectedReward + secondExpectedReward + thirdExpectedReward) - - totalExpectedReward <= 1 - ); - } + assertEq( + totalExpectedReward, firstExpectedReward + secondExpectedReward + thirdExpectedReward + ); } function testValueToWeight() public view { @@ -1769,7 +1760,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg, uint64 validationStartTime, uint64 claimTime, - uint64 lastClaimTime, + uint256 claimedReward, bool success ) internal returns (uint256) { uint256 expectedReward; @@ -1777,12 +1768,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_WEIGHT), validatorStartTime: validationStartTime, - stakingStartTime: lastClaimTime, + stakingStartTime: validationStartTime, stakingEndTime: claimTime, uptimeSeconds: 0, initialSupply: 0, endSupply: 0 }); + expectedReward -= claimedReward; _expectValidationRewardsIssuance(validationID, address(this), expectedReward); } else { vm.expectRevert( From 5d826504ee46e872690778fc0410c766e2998b91 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 29 Oct 2024 16:27:52 -0500 Subject: [PATCH 15/15] update bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 425afb3a9..0f57c4bbe 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput 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\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimValidationRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"ValidationRewardsClaimed\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"reward\",\"type\":\"uint256\",\"indexed\":true,\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"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\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516163e83803806163e883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61629b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d7575f3560e01c806380dd672f11610101578063ba3a4b971161009a578063ba3a4b971461040a578063bc5fbfec1461041d578063bee0a03f14610444578063c974d1b614610457578063d5f20ff61461045f578063df93d8de1461047f578063e4a63c4014610489578063f74c607b146104b0578063fd7ac5e7146104c3575f80fd5b806380dd672f1461036c5780638280a25a1461037f57806393e24598146103875780639e1bc4ef1461039a578063a3a65e48146103ad578063a9778a7a14610299578063afb98096146103c0578063afba878a146103e7578063b771b3bc146103ef575f80fd5b80633a1cfff6116101735780633a1cfff6146102b5578063467ef06f146102c85780634bee0040146102db57806360305d62146102fc57806360ad778414610319578063620658561461032c57806366435abf1461033f578063732214f81461035257806376f7862114610359575f80fd5b80630118acc4146101db5780630322ed98146101f0578063151d30d1146102035780631ec447241461022257806320d91b7a1461023557806325e1c776146102485780632893d0771461025b5780632e2194d81461026e57806335455ded14610299575b5f80fd5b6101ee6101e9366004615537565b6104d6565b005b6101ee6101fe366004615572565b6104e8565b61020b600a81565b60405160ff90911681526020015b60405180910390f35b6101ee610230366004615537565b6106f4565b6101ee610243366004615589565b610700565b6101ee6102563660046155d7565b610bfe565b6101ee6102693660046155d7565b610c72565b61028161027c366004615572565b610f94565b6040516001600160401b039091168152602001610219565b6102a261271081565b60405161ffff9091168152602001610219565b6101ee6102c3366004615537565b610fe8565b6101ee6102d63660046155f8565b610ff4565b6102ee6102e9366004615638565b6110d0565b604051908152602001610219565b610304601481565b60405163ffffffff9091168152602001610219565b6101ee6103273660046155d7565b6110f7565b6102ee61033a36600461569d565b611352565b61028161034d366004615572565b611372565b6102ee5f81565b6101ee610367366004615537565b611386565b6101ee61037a3660046155d7565b611393565b61020b603081565b6101ee610395366004615572565b61154e565b6102ee6103a83660046156b6565b6115f5565b6101ee6103bb3660046155f8565b611613565b6102ee7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b61020b605081565b6103fd6005600160991b0181565b60405161021991906156d6565b6101ee610418366004615572565b611799565b6102ee7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b6101ee610452366004615572565b611977565b61020b601481565b61047261046d366004615572565b611a94565b604051610219919061575f565b6102816202a30081565b6102ee7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0081565b6101ee6104be3660046157f3565b611bd6565b6102ee6104d1366004615831565b611cb5565b6104e38383836001611ced565b505050565b5f6104f1612058565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561052a5761052a6156ea565b600581111561053b5761053b6156ea565b815260200160018201805461054f9061589c565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061589c565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316156ea565b1461066d575f8381526007830160205260409081902054905163170cc93360e21b81526106649160ff16906004016158d4565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6106928584606001515f61207c565b6040518263ffffffff1660e01b81526004016106ae91906158e2565b6020604051808303815f875af11580156106ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ee91906158f4565b50505050565b6104e38383835f611ced565b5f610709612058565b600981015490915060ff161561073257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079991906158f4565b8360200135146107c2576040516372b0a7e760e11b815260208401356004820152602401610664565b306107d3606085016040860161590b565b6001600160a01b03161461080b576107f1606084016040850161590b565b604051632f88120d60e21b815260040161066491906156d6565b5f6108196060850185615926565b905090505f805b828163ffffffff161015610b00575f61083c6060880188615926565b8363ffffffff168181106108525761085261596b565b9050602002810190610864919061597f565b61086d90615aa3565b80516040519192505f91600888019161088591615b1c565b908152602001604051809103902054146108b557805160405163a41f772f60e01b815261066491906004016158e2565b5f6002885f0135846040516020016108e492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108fe91615b1c565b602060405180830381855afa158015610919573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061093c91906158f4565b90508086600801835f01516040516109549190615b1c565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109d6576109d66156ea565b0217905550602082015160018201906109ef9082615b71565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610a93911685615c40565b8251604051919550610aa491615b1c565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610af990615c53565b9050610820565b50600483018190556001830154606490610b2490600160401b900460ff1683615c75565b1015610b4657604051635943317f60e01b815260048101829052602401610664565b5f610b5c610b53866120d3565b604001516121de565b90505f610b688761236b565b90505f600282604051610b7b9190615b1c565b602060405180830381855afa158015610b96573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bb991906158f4565b9050828114610be557604051631872fc8d60e01b81526004810182905260248101849052604401610664565b5050506009909201805460ff1916600117905550505050565b610c0782612540565b610c27576040516330efa98b60e01b815260048101839052602401610664565b5f610c3183611a94565b5190506002816005811115610c4857610c486156ea565b14610c68578060405163170cc93360e21b815260040161066491906158d4565b6106ee8383612569565b610c7a6127b7565b5f610c83612801565b90505f610c8f84611a94565b9050600281516005811115610ca657610ca66156ea565b14610cc757805160405163170cc93360e21b815261066491906004016158d4565b610cd084612540565b610cf0576040516330efa98b60e01b815260048101859052602401610664565b5f8481526005830160205260409020546001600160a01b03163314610d2b57335b604051636e2ccd7560e11b815260040161066491906156d6565b5f84815260058301602052604090205460a08201514291610d5d91600160b01b9091046001600160401b031690615c8c565b6001600160401b0316816001600160401b03161015610d9a5760405163fb6ce63f60e01b81526001600160401b0382166004820152602401610664565b5f610da58686612569565b5f87815260058601602052604081206001015491925090610dd690600160401b90046001600160401b031683615cac565b5f888152600587016020526040812060010154919250600160801b9091046001600160401b031690819003610e0c575060a08401515b610e17828286612825565b610e3757604051635bff683f60e11b815260048101899052602401610664565b600486015460408601515f916001600160a01b031690634f22429f90610e5c90611352565b848589886040518663ffffffff1660e01b8152600401610e80959493929190615ccc565b602060405180830381865afa158015610e9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906158f4565b90506064605060ff168760a0015187610ed89190615cac565b610ee29190615cfa565b610eec9190615d39565b5f8a81526005890160205260409020600181018054600160401b600160c01b031916600160401b6001600160401b039485160267ffffffffffffffff60801b191617600160801b938916939093029290921790915554610f55906001600160a01b031682612870565b60405181908a907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a350505050505050610f906128e0565b5050565b5f80610f9e612801565b60030154610fac9084615d5e565b9050801580610fc157506001600160401b0381115b15610fe25760405163222d164360e21b815260048101849052602401610664565b92915050565b6104e38383835f612906565b610ffc6127b7565b5f611005612801565b90505f8061101284612b60565b9150915061101f82612540565b61102b575050506110c5565b5f8281526005840160205260409020546001600160a01b0316600482516005811115611059576110596156ea565b036110aa575f8381526008850160205260408120805491905561107c8282612870565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b6110c0816110bb8460400151611352565b612e9a565b505050505b6110cd6128e0565b50565b5f6110d96127b7565b6110e585858585612eb8565b90506110ef6128e0565b949350505050565b5f611100612801565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611139576111396156ea565b600381111561114a5761114a6156ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6111c082611a94565b90506001835160038111156111d7576111d76156ea565b146111f8578251604051633b0d540d60e21b81526106649190600401615d71565b60048151600581111561120d5761120d6156ea565b036112235761121b866130b5565b505050505050565b5f8061123a611231886120d3565b604001516132d5565b509150915081841461126757846040015160405163089938b360e11b815260040161066491815260200190565b806001600160401b031683606001516001600160401b031610806112a05750806001600160401b03168560a001516001600160401b0316115b156112c957604051632e19bc2d60e11b81526001600160401b0382166004820152602401610664565b5f888152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f61135b612801565b60030154610fe2906001600160401b038416615c75565b5f61137c82611a94565b6080015192915050565b6104e38383836001612906565b61139b6127b7565b5f6113a4612801565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156113dd576113dd6156ea565b60038111156113ee576113ee6156ea565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611467576114676156ea565b14611488578051604051633b0d540d60e21b81526106649190600401615d71565b60046114978260400151611a94565b5160058111156114a9576114a96156ea565b1461153b575f6114b8846120d3565b90505f806114c983604001516132d5565b5091509150818460400151146114f55760405163089938b360e11b815260048101839052602401610664565b806001600160401b03168460c001516001600160401b0316111561153757604051632e19bc2d60e11b81526001600160401b0382166004820152602401610664565b5050505b611544846130b5565b5050610f906128e0565b5f611557612801565b90505f61156383611a94565b519050600481600581111561157a5761157a6156ea565b1461159a578060405163170cc93360e21b815260040161066491906158d4565b5f8381526005830160205260409020546001600160a01b031633146115bf5733610d11565b5f838152600883016020908152604080832080549084905560058601909252909120546106ee906001600160a01b031682612870565b5f6115fe6127b7565b61160983338461352b565b9050610fe26128e0565b5f61161c612058565b90505f8061163561162c856120d3565b60400151613800565b915091508061165b57604051632d07135360e01b81528115156004820152602401610664565b5f828152600684016020526040902080546116759061589c565b90505f036116995760405163089938b360e11b815260048101839052602401610664565b60015f83815260078501602052604090205460ff1660058111156116bf576116bf6156ea565b146116f2575f8281526007840160205260409081902054905163170cc93360e21b81526106649160ff16906004016158d4565b5f828152600684016020526040812061170a91615486565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6117a2612801565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156117db576117db6156ea565b60038111156117ec576117ec6156ea565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611865576118656156ea565b141580156118865750600381516003811115611883576118836156ea565b14155b156118a7578051604051633b0d540d60e21b81526106649190600401615d71565b5f6118b58260400151611a94565b905080606001516001600160401b03165f036118e7576040516339b894f960e21b815260048101859052602401610664565b6005600160991b016001600160a01b031663ee5b48eb61191484604001518460600151856080015161207c565b6040518263ffffffff1660e01b815260040161193091906158e2565b6020604051808303815f875af115801561194c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197091906158f4565b5050505050565b5f611980612058565b5f838152600682016020526040902080549192509061199e9061589c565b90505f036119c25760405163089938b360e11b815260048101839052602401610664565b60015f83815260078301602052604090205460ff1660058111156119e8576119e86156ea565b14611a1b575f8281526007820160205260409081902054905163170cc93360e21b81526106649160ff16906004016158d4565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611a549190600401615d8b565b6020604051808303815f875af1158015611a70573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906158f4565b611a9c6154bd565b5f611aa5612058565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff166005811115611adc57611adc6156ea565b6005811115611aed57611aed6156ea565b8152602001600182018054611b019061589c565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2d9061589c565b8015611b785780601f10611b4f57610100808354040283529160200191611b78565b820191905f5260205f20905b815481529060010190602001808311611b5b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c1f575080546001600160401b03808416911610155b15611c3d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c6884846139bc565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80611cbf612058565b9050806008018484604051611cd5929190615e15565b90815260200160405180910390205491505092915050565b5f611cf6612801565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611d2f57611d2f6156ea565b6003811115611d4057611d406156ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611db682611a94565b9050600283516003811115611dcd57611dcd6156ea565b14611dee578251604051633b0d540d60e21b81526106649190600401615d71565b60208301516001600160a01b03163314611e8a575f8281526005850160205260409020546001600160a01b03163314611e275733610d11565b5f82815260058501602052604090205460a0820151611e5691600160b01b90046001600160401b031690615c8c565b6001600160401b0316421015611e8a5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b600281516005811115611e9f57611e9f6156ea565b03611ff15760028401546080840151611ec1916001600160401b031690615c8c565b6001600160401b0316421015611ef55760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b8615611f0757611f058287612569565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611f40918491611f3b9190615cac565b6139d6565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611f8184613b20565b9050858015611f8e575080155b15611faf57604051631036cf9160e11b8152600481018a9052602401610664565b5f8981526007860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a35061204e565b600481516005811115612006576120066156ea565b036120325761201483613b20565b5f89815260078601602052604090205561202d886130b5565b61204e565b805160405163170cc93360e21b815261066491906004016158d4565b5050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b6040515f6020820152600360e01b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612137573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261215e9190810190615e2f565b915091508061218057604051636b2f19e960e01b815260040160405180910390fd5b8151156121a6578151604051636ba589a560e01b81526004810191909152602401610664565b60208201516001600160a01b0316156121d7578160200151604051624de75d60e31b815260040161066491906156d6565b5092915050565b5f815160261461221357815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610664565b5f805b60028110156122625761222a816001615f01565b612235906008615c75565b61ffff1684828151811061224b5761224b61596b565b016020015160f81c901b9190911790600101612216565b5061ffff81161561228c5760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b60048110156122e7576122a3816003615f01565b6122ae906008615c75565b63ffffffff16856122c0836002615c40565b815181106122d0576122d061596b565b016020015160f81c901b919091179060010161228f565b5063ffffffff81161561230d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156123625761232481601f615f01565b61232f906008615c75565b8661233b836006615c40565b8151811061234b5761234b61596b565b016020015160f81c901b9190911790600101612310565b50949350505050565b60605f808335602085013560146123878787016040890161590b565b6123946060890189615926565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6124156060850185615926565b90508110156121d7578161242c6060860186615926565b8381811061243c5761243c61596b565b905060200281019061244e919061597f565b6124589080615f14565b90506124676060870187615926565b848181106124775761247761596b565b9050602002810190612489919061597f565b6124939080615f14565b6124a06060890189615926565b868181106124b0576124b061596b565b90506020028101906124c2919061597f565b6124d0906020810190615f14565b6124dd60608b018b615926565b888181106124ed576124ed61596b565b90506020028101906124ff919061597f565b61251090606081019060400161569d565b6040516020016125269796959493929190615f56565b60408051601f198184030181529190529150600101612408565b5f8061254a612801565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125b4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125db9190810190615e2f565b91509150806125fd57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612640573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266491906158f4565b82511461268a578151604051636ba589a560e01b81526004810191909152602401610664565b60208201516001600160a01b0316156126bb578160200151604051624de75d60e31b815260040161066491906156d6565b5f806126ca8460400151613ce0565b915091508187146126f15760405163089938b360e11b815260048101889052602401610664565b5f6126fa612801565b5f8981526005820160205260409020600101549091506001600160401b03908116908316111561278d575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26127ac565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016127fb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f60506128328484615cac565b61283c9190615cfa565b6001600160401b0316612850856064615cfa565b6001600160401b0316101561286657505f6120cc565b5060019392505050565b5f612879613ed1565b80546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128c5575f80fd5b505af11580156128d7573d5f803e3d5ffd5b50505050505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f61290f612801565b90505f61291b86613ef5565b905061292686612540565b6129315750506106ee565b5f8681526005830160205260409020546001600160a01b031633146129565733610d11565b5f86815260058301602052604090205460a082015161298591600160b01b90046001600160401b031690615c8c565b6001600160401b03168160c001516001600160401b031610156129cc5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610664565b5f85156129e4576129dd8786612569565b9050612a02565b505f8681526005830160205260409020600101546001600160401b03165b5f878152600584016020526040812060010154612a2f90600160401b90046001600160401b031683615cac565b5f898152600586016020526040812060010154919250600160801b9091046001600160401b031690819003612a65575060a08301515b858015612a7e5750612a7c82828660c00151612825565b155b15612a9f57604051635bff683f60e11b8152600481018a9052602401610664565b600485015460408501515f916001600160a01b031690634f22429f90612ac490611352565b84858960c00151886040518663ffffffff1660e01b8152600401612aec959493929190615ccc565b602060405180830381865afa158015612b07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2b91906158f4565b905080866008015f8c81526020019081526020015f205f828254612b4f9190615c40565b909155505050505050505050505050565b5f612b696154bd565b5f612b72612058565b90505f80612b8261162c876120d3565b915091508015612ba957604051632d07135360e01b81528115156004820152602401610664565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612bda57612bda6156ea565b6005811115612beb57612beb6156ea565b8152602001600182018054612bff9061589c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2b9061589c565b8015612c765780601f10612c4d57610100808354040283529160200191612c76565b820191905f5260205f20905b815481529060010190602001808311612c5957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612ce157612ce16156ea565b14158015612d025750600181516005811115612cff57612cff6156ea565b14155b15612d2357805160405163170cc93360e21b815261066491906004016158d4565b600381516005811115612d3857612d386156ea565b03612d465760048152612d4b565b600581525b836008018160200151604051612d619190615b1c565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612da557612da56156ea565b021790555060208201516001820190612dbe9082615b71565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b0319169190921617905580516005811115612e6357612e636156ea565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b610f908282612ea7613ed1565b546001600160a01b031691906141cd565b5f80612ec2612801565b600281015490915061ffff600160401b90910481169086161080612eeb575061271061ffff8616115b15612f0f57604051635f12e6c360e11b815261ffff86166004820152602401610664565b60028101546001600160401b039081169085161015612f4b576040516202a06d60e11b81526001600160401b0385166004820152602401610664565b8054831080612f5d5750806001015483115b15612f7e5760405163222d164360e21b815260048101849052602401610664565b5f612f888461422c565b90505f612f9482610f94565b90505f612fa18983614249565b90506040518060c00160405280612fb53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f6060808801829052608080890183905260a09889018390528a83526005909d0185529082902088518154958a0151938a01518516600160b01b0267ffffffffffffffff60b01b1994909716600160a01b026001600160b01b03199096169716969096179390931716929092178355840151600190920180549885015194909301518116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990991692909116919091179690961791909116949094179093555090915050949350505050565b5f6130be612801565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156130f7576130f76156ea565b6003811115613108576131086156ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015281015190915061317c6147a6565b826080015161318b9190615c8c565b6001600160401b03164210156131bf5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b5f848152600684016020908152604080832080546001600160a81b0319168155600181018490556002018390556007860190915281208054908290559080821561327a575f8481526005870160205260409020546127109061322c90600160a01b900461ffff1685615c75565b6132369190615d5e565b915081866008015f8681526020019081526020015f205f82825461325a9190615c40565b9091555061326a90508284615f01565b905061327a856020015182612870565b61328f85602001516110bb8760600151611352565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461330c57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610664565b5f805b600281101561335b57613323816001615f01565b61332e906008615c75565b61ffff168682815181106133445761334461596b565b016020015160f81c901b919091179060010161330f565b5061ffff8116156133855760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b60048110156133e05761339c816003615f01565b6133a7906008615c75565b63ffffffff16876133b9836002615c40565b815181106133c9576133c961596b565b016020015160f81c901b9190911790600101613388565b5063ffffffff811660031461340857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561345d5761341f81601f615f01565b61342a906008615c75565b88613436836006615c40565b815181106134465761344661596b565b016020015160f81c901b919091179060010161340b565b505f805b60088110156134bc57613475816007615f01565b613480906008615c75565b6001600160401b031689613495836026615c40565b815181106134a5576134a561596b565b016020015160f81c901b9190911790600101613461565b505f805b600881101561351b576134d4816007615f01565b6134df906008615c75565b6001600160401b03168a6134f483602e615c40565b815181106135045761350461596b565b016020015160f81c901b91909117906001016134c0565b5091989097509095509350505050565b5f80613535612801565b90505f61354461027c8561422c565b90505f61355087611a94565b905061355b87612540565b61357b576040516330efa98b60e01b815260048101889052602401610664565b600281516005811115613590576135906156ea565b146135b157805160405163170cc93360e21b815261066491906004016158d4565b5f8282608001516135c29190615c8c565b905083600201600a9054906101000a90046001600160401b031682604001516135eb9190615cfa565b6001600160401b0316816001600160401b0316111561362857604051636d51fe0560e11b81526001600160401b0382166004820152602401610664565b5f806136348a846139d6565b915091505f8a8360405160200161366292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156136f5576136f56156ea565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461383657825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610664565b5f805b60028110156138855761384d816001615f01565b613858906008615c75565b61ffff1685828151811061386e5761386e61596b565b016020015160f81c901b9190911790600101613839565b5061ffff8116156138af5760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b600481101561390a576138c6816003615f01565b6138d1906008615c75565b63ffffffff16866138e3836002615c40565b815181106138f3576138f361596b565b016020015160f81c901b91909117906001016138b2565b5063ffffffff811660021461393257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139875761394981601f615f01565b613954906008615c75565b87613960836006615c40565b815181106139705761397061596b565b016020015160f81c901b9190911790600101613935565b505f8660268151811061399c5761399c61596b565b016020015191976001600160f81b03199092161515965090945050505050565b6139c46147c1565b6139cd8261480c565b610f9081614880565b5f805f6139e1612058565b5f868152600782016020526040902060020154909150600160801b90046001600160401b0316613a1185826148dc565b5f613a1b87614b01565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613a6b8a858b61207c565b6040518263ffffffff1660e01b8152600401613a8791906158e2565b6020604051808303815f875af1158015613aa3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ac791906158f4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f80613b2a612801565b90505f613b3a8460400151611a94565b90505f600382516005811115613b5257613b526156ea565b1480613b705750600482516005811115613b6e57613b6e6156ea565b145b15613b80575060c0810151613bbd565b600282516005811115613b9557613b956156ea565b03613ba1575042613bbd565b815160405163170cc93360e21b815261066491906004016158d4565b84608001516001600160401b0316816001600160401b031611613be457505f949350505050565b6040808601515f90815260058501602052206001015460a0830151613c13916001600160401b03169083612825565b613c2157505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613c4690611352565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b168152613c989493929188916001600160401b0390911690600401615ccc565b602060405180830381865afa158015613cb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cd791906158f4565b95945050505050565b5f808251602e14613d1657825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610664565b5f805b6002811015613d6557613d2d816001615f01565b613d38906008615c75565b61ffff16858281518110613d4e57613d4e61596b565b016020015160f81c901b9190911790600101613d19565b5061ffff811615613d8f5760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b6004811015613dea57613da6816003615f01565b613db1906008615c75565b63ffffffff1686613dc3836002615c40565b81518110613dd357613dd361596b565b016020015160f81c901b9190911790600101613d92565b5063ffffffff811615613e1057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613e6557613e2781601f615f01565b613e32906008615c75565b87613e3e836006615c40565b81518110613e4e57613e4e61596b565b016020015160f81c901b9190911790600101613e13565b505f805b6008811015613ec457613e7d816007615f01565b613e88906008615c75565b6001600160401b031688613e9d836026615c40565b81518110613ead57613ead61596b565b016020015160f81c901b9190911790600101613e69565b5090969095509350505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0090565b613efd6154bd565b5f613f06612058565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166005811115613f3f57613f3f6156ea565b6005811115613f5057613f506156ea565b8152602001600182018054613f649061589c565b80601f0160208091040260200160405190810160405280929190818152602001828054613f909061589c565b8015613fdb5780601f10613fb257610100808354040283529160200191613fdb565b820191905f5260205f20905b815481529060010190602001808311613fbe57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115614049576140496156ea565b1461407c575f8481526007830160205260409081902054905163170cc93360e21b81526106649160ff16906004016158d4565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140c0576140c06156ea565b0217905550602082015160018201906140d99082615b71565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f61417685826139d6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614b6a565b5f610fe282614239613ed1565b546001600160a01b031690614bc2565b5f614252612058565b6009015460ff1661427657604051637fab81e560e01b815260040160405180910390fd5b5f61427f612058565b905042614292606086016040870161569d565b6001600160401b03161115806142cc57506142b06202a30042615c40565b6142c0606086016040870161569d565b6001600160401b031610155b15614306576142e1606085016040860161569d565b604051635879da1360e11b81526001600160401b039091166004820152602401610664565b61431b6143166060860186615fbf565b614d23565b61432b6143166080860186615fbf565b603061433a6020860186615f14565b90501461436c5761434e6020850185615f14565b6040516326475b2f60e11b8152610664925060040190815260200190565b6143768480615f14565b90505f036143a3576143888480615f14565b604051633e08a12560e11b8152600401610664929190615fd3565b5f600882016143b28680615f14565b6040516143c0929190615e15565b908152602001604051809103902054146143f9576143de8480615f14565b60405163a41f772f60e01b8152600401610664929190615fd3565b614403835f6148dc565b6040805160e08101909152815481525f90819061450f90602081016144288980615f14565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614470908a018a615f14565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016144b960608a0160408b0161569d565b6001600160401b031681526020016144d460608a018a615fbf565b6144dd90616001565b81526020016144ef60808a018a615fbf565b6144f890616001565b8152602001876001600160401b0316815250614e8c565b5f8281526006860160205260409020919350915061452d8282615b71565b50816008840161453d8880615f14565b60405161454b929190615e15565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145879085906004016158e2565b6020604051808303815f875af11580156145a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145c791906158f4565b6040805160e0810190915290915080600181526020016145e78980615f14565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614676576146766156ea565b02179055506020820151600182019061468f9082615b71565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790558061472c8880615f14565b60405161473a929190615e15565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614778919061569d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6147af612058565b600101546001600160401b0316919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661480a57604051631afcd79f60e31b815260040160405180910390fd5b565b6148146147c1565b61481d81615079565b614825615092565b6110cd6060820135608083013561484260c0850160a0860161569d565b61485260e0860160c087016160c8565b614863610100870160e088016160e1565b61010087013561487b61014089016101208a0161590b565b6150a2565b6148886147c1565b5f614891613ed1565b90506001600160a01b0382166148bc5781604051637330680360e01b815260040161066491906156d6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6148e5612058565b90505f826001600160401b0316846001600160401b031611156149135761490c8385615cac565b9050614920565b61491d8484615cac565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061498257506001840154815161497e916001600160401b031690615c40565b8210155b156149a8576001600160401b0383166060820152818152604081015160208201526149c7565b82816060018181516149ba9190615c8c565b6001600160401b03169052505b60608101516149d7906064615cfa565b602082015160018601546001600160401b039290921691614a029190600160401b900460ff16615c75565b1015614a3257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610664565b856001600160401b031681604001818151614a4d9190615c40565b9052506040810180516001600160401b0387169190614a6d908390615f01565b90525060018401546040820151606491614a9291600160401b90910460ff1690615c75565b1015614ab9578060400151604051635943317f60e01b815260040161066491815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f80614b0b612058565b5f8481526007820160205260409020600201805491925090600890614b3f90600160401b90046001600160401b0316616101565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f614b7e6001600160a01b03841683615238565b905080515f14158015614ba2575080806020019051810190614ba0919061611c565b155b156104e35782604051635274afe760e01b815260040161066491906156d6565b5f80836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401614bf091906156d6565b602060405180830381865afa158015614c0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c2f91906158f4565b9050614c466001600160a01b038516333086615245565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190614c749030906004016156d6565b602060405180830381865afa158015614c8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cb391906158f4565b9050818111614d195760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610664565b613cd78282615f01565b614d3060208201826155f8565b63ffffffff16158015614d505750614d4b6020820182615926565b151590505b15614d9757614d6260208201826155f8565b614d6f6020830183615926565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610664565b614da46020820182615926565b9050614db360208301836155f8565b63ffffffff161115614dcc57614d6260208201826155f8565b60015b614ddc6020830183615926565b9050811015610f9057614df26020830183615926565b614dfd600184615f01565b818110614e0c57614e0c61596b565b9050602002016020810190614e21919061590b565b6001600160a01b0316614e376020840184615926565b83818110614e4757614e4761596b565b9050602002016020810190614e5c919061590b565b6001600160a01b03161015614e8457604051630dbc8d5f60e31b815260040160405180910390fd5b600101614dcf565b5f6060826040015151603014614eb55760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ef6988a986001989297929690959094909390929101616137565b60405160208183030381529060405290505f5b84608001516020015151811015614f6857818560800151602001518281518110614f3557614f3561596b565b6020026020010151604051602001614f4e9291906161f1565b60408051601f198184030181529190529150600101614f09565b5060a0840151805160209182015151604051614f88938593929101616222565b60405160208183030381529060405290505f5b8460a001516020015151811015614ffa57818560a00151602001518281518110614fc757614fc761596b565b6020026020010151604051602001614fe09291906161f1565b60408051601f198184030181529190529150600101614f9b565b5060c084015160405161501191839160200161625d565b60405160208183030381529060405290506002816040516150329190615b1c565b602060405180830381855afa15801561504d573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061507091906158f4565b94909350915050565b6150816147c1565b61508961527e565b6110cd81615286565b61509a6147c1565b61480a615369565b6150aa6147c1565b5f6150b3612801565b905061ffff851615806150cb575061271061ffff8616115b156150ef57604051635f12e6c360e11b815261ffff86166004820152602401610664565b868811156151135760405163222d164360e21b815260048101899052602401610664565b60ff841615806151265750600a60ff8516115b156151495760405163170db35960e31b815260ff85166004820152602401610664565b6151516147a6565b6001600160401b0316866001600160401b0316101561518d576040516202a06d60e11b81526001600160401b0387166004820152602401610664565b825f036151ad5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b60606120cc83835f615371565b6040516001600160a01b0384811660248301528381166044830152606482018390526106ee9186918216906323b872dd906084016141fa565b61480a6147c1565b61528e6147c1565b5f615297612058565b82358155905060146152af60608401604085016160e1565b60ff1611806152ce57506152c960608301604084016160e1565b60ff16155b15615302576152e360608301604084016160e1565b604051634a59bbff60e11b815260ff9091166004820152602401610664565b61531260608301604084016160e1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615343604083016020840161569d565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b6128e06147c1565b606081471015615396573060405163cd78605960e01b815260040161066491906156d6565b5f80856001600160a01b031684866040516153b19190615b1c565b5f6040518083038185875af1925050503d805f81146153eb576040519150601f19603f3d011682016040523d82523d5f602084013e6153f0565b606091505b509150915061540086838361540a565b9695505050505050565b60608261541f5761541a8261545d565b6120cc565b815115801561543657506001600160a01b0384163b155b156154565783604051639996b31560e01b815260040161066491906156d6565b50806120cc565b80511561546d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546154929061589c565b5f825580601f106154a1575050565b601f0160209004905f5260205f20908101906110cd91906154fa565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561550e575f81556001016154fb565b5090565b80151581146110cd575f80fd5b803563ffffffff81168114615532575f80fd5b919050565b5f805f60608486031215615549575f80fd5b83359250602084013561555b81615512565b91506155696040850161551f565b90509250925092565b5f60208284031215615582575f80fd5b5035919050565b5f806040838503121561559a575f80fd5b82356001600160401b038111156155af575f80fd5b8301608081860312156155c0575f80fd5b91506155ce6020840161551f565b90509250929050565b5f80604083850312156155e8575f80fd5b823591506155ce6020840161551f565b5f60208284031215615608575f80fd5b6120cc8261551f565b803561ffff81168114615532575f80fd5b80356001600160401b0381168114615532575f80fd5b5f805f806080858703121561564b575f80fd5b84356001600160401b03811115615660575f80fd5b850160a08188031215615671575f80fd5b935061567f60208601615611565b925061568d60408601615622565b9396929550929360600135925050565b5f602082840312156156ad575f80fd5b6120cc82615622565b5f80604083850312156156c7575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52602160045260245ffd5b6006811061570e5761570e6156ea565b9052565b5f5b8381101561572c578181015183820152602001615714565b50505f910152565b5f815180845261574b816020860160208601615712565b601f01601f19169290920160200192915050565b602081526157716020820183516156fe565b5f602083015160e0604084015261578c610100840182615734565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b03811681146110cd575f80fd5b5f80828403610160811215615806575f80fd5b61014080821215615815575f80fd5b8493508301359050615826816157df565b809150509250929050565b5f8060208385031215615842575f80fd5b82356001600160401b0380821115615858575f80fd5b818501915085601f83011261586b575f80fd5b813581811115615879575f80fd5b86602082850101111561588a575f80fd5b60209290920196919550909350505050565b600181811c908216806158b057607f821691505b6020821081036158ce57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610fe282846156fe565b602081525f6120cc6020830184615734565b5f60208284031215615904575f80fd5b5051919050565b5f6020828403121561591b575f80fd5b81356120cc816157df565b5f808335601e1984360301811261593b575f80fd5b8301803591506001600160401b03821115615954575f80fd5b6020019150600581901b3603821315613b19575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615993575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156159d3576159d361599d565b60405290565b604080519081016001600160401b03811182821017156159d3576159d361599d565b604051601f8201601f191681016001600160401b0381118282101715615a2357615a2361599d565b604052919050565b5f6001600160401b03821115615a4357615a4361599d565b50601f01601f191660200190565b5f82601f830112615a60575f80fd5b8135615a73615a6e82615a2b565b6159fb565b818152846020838601011115615a87575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615ab3575f80fd5b615abb6159b1565b82356001600160401b0380821115615ad1575f80fd5b615add36838701615a51565b83526020850135915080821115615af2575f80fd5b50615aff36828601615a51565b602083015250615b1160408401615622565b604082015292915050565b5f8251615993818460208701615712565b601f8211156104e357805f5260205f20601f840160051c81016020851015615b525750805b601f840160051c820191505b81811015611970575f8155600101615b5e565b81516001600160401b03811115615b8a57615b8a61599d565b615b9e81615b98845461589c565b84615b2d565b602080601f831160018114615bd1575f8415615bba5750858301515b5f19600386901b1c1916600185901b17855561121b565b5f85815260208120601f198616915b82811015615bff57888601518255948401946001909101908401615be0565b5085821015615c1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610fe257610fe2615c2c565b5f63ffffffff808316818103615c6b57615c6b615c2c565b6001019392505050565b8082028115828204841417610fe257610fe2615c2c565b6001600160401b038181168382160190808211156121d7576121d7615c2c565b6001600160401b038281168282160390808211156121d7576121d7615c2c565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b6001600160401b03818116838216028082169190828114615d1d57615d1d615c2c565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680615d5257615d52615d25565b92169190910492915050565b5f82615d6c57615d6c615d25565b500490565b6020810160048310615d8557615d856156ea565b91905290565b5f60208083525f8454615d9d8161589c565b806020870152604060018084165f8114615dbe5760018114615dda57615e07565b60ff19851660408a0152604084151560051b8a01019550615e07565b895f5260205f205f5b85811015615dfe5781548b8201860152908301908801615de3565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b805161553281615512565b5f8060408385031215615e40575f80fd5b82516001600160401b0380821115615e56575f80fd5b9084019060608287031215615e69575f80fd5b615e716159b1565b82518152602080840151615e84816157df565b82820152604084015183811115615e99575f80fd5b80850194505087601f850112615ead575f80fd5b83519250615ebd615a6e84615a2b565b8381528882858701011115615ed0575f80fd5b615edf84838301848801615712565b80604084015250819550615ef4818801615e24565b9450505050509250929050565b81810381811115610fe257610fe2615c2c565b5f808335601e19843603018112615f29575f80fd5b8301803591506001600160401b03821115615f42575f80fd5b602001915036819003821315613b19575f80fd5b5f8851615f67818460208d01615712565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112615993575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215616011575f80fd5b6160196159d9565b6160228361551f565b81526020808401356001600160401b038082111561603e575f80fd5b9085019036601f830112616050575f80fd5b8135818111156160625761606261599d565b8060051b91506160738483016159fb565b818152918301840191848101903684111561608c575f80fd5b938501935b838510156160b657843592506160a6836157df565b8282529385019390850190616091565b94860194909452509295945050505050565b5f602082840312156160d8575f80fd5b6120cc82615611565b5f602082840312156160f1575f80fd5b813560ff811681146120cc575f80fd5b5f6001600160401b03808316818103615c6b57615c6b615c2c565b5f6020828403121561612c575f80fd5b81516120cc81615512565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161617d81602a850160208b01615712565b86519083019061619481602a840160208b01615712565b60c087901b6001600160c01b031916602a92909101918201526161c6603282018660e01b6001600160e01b0319169052565b6161df603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351616202818460208801615712565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451616233818460208901615712565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f835161626e818460208801615712565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516162ad3803806162ad83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6161608061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d7575f3560e01c806380dd672f11610101578063ba3a4b971161009a578063ba3a4b971461040a578063bc5fbfec1461041d578063bee0a03f14610444578063c974d1b614610457578063d5f20ff61461045f578063df93d8de1461047f578063e4a63c4014610489578063f74c607b146104b0578063fd7ac5e7146104c3575f80fd5b806380dd672f1461036c5780638280a25a1461037f57806393e24598146103875780639e1bc4ef1461039a578063a3a65e48146103ad578063a9778a7a14610299578063afb98096146103c0578063afba878a146103e7578063b771b3bc146103ef575f80fd5b80633a1cfff6116101735780633a1cfff6146102b5578063467ef06f146102c85780634bee0040146102db57806360305d62146102fc57806360ad778414610319578063620658561461032c57806366435abf1461033f578063732214f81461035257806376f7862114610359575f80fd5b80630118acc4146101db5780630322ed98146101f0578063151d30d1146102035780631ec447241461022257806320d91b7a1461023557806325e1c776146102485780632893d0771461025b5780632e2194d81461026e57806335455ded14610299575b5f80fd5b6101ee6101e9366004615429565b6104d6565b005b6101ee6101fe366004615464565b6104e8565b61020b600a81565b60405160ff90911681526020015b60405180910390f35b6101ee610230366004615429565b6106f4565b6101ee61024336600461547b565b610700565b6101ee6102563660046154c9565b610bfe565b6101ee6102693660046154c9565b610c72565b61028161027c366004615464565b610ef3565b6040516001600160401b039091168152602001610219565b6102a261271081565b60405161ffff9091168152602001610219565b6101ee6102c3366004615429565b610f47565b6101ee6102d63660046154ea565b610f53565b6102ee6102e936600461552a565b61102f565b604051908152602001610219565b610304601481565b60405163ffffffff9091168152602001610219565b6101ee6103273660046154c9565b611056565b6102ee61033a36600461558f565b6112b1565b61028161034d366004615464565b6112d1565b6102ee5f81565b6101ee610367366004615429565b6112e5565b6101ee61037a3660046154c9565b6112f2565b61020b603081565b6101ee610395366004615464565b6114ad565b6102ee6103a83660046155a8565b611554565b6101ee6103bb3660046154ea565b611572565b6102ee7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b61020b605081565b6103fd6005600160991b0181565b60405161021991906155c8565b6101ee610418366004615464565b6116f8565b6102ee7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b6101ee610452366004615464565b6118d6565b61020b601481565b61047261046d366004615464565b6119f3565b6040516102199190615651565b6102816202a30081565b6102ee7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0081565b6101ee6104be3660046156e5565b611b35565b6102ee6104d1366004615723565b611c14565b6104e38383836001611c4c565b505050565b5f6104f1611fb7565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561052a5761052a6155dc565b600581111561053b5761053b6155dc565b815260200160018201805461054f9061578e565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061578e565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316155dc565b1461066d575f8381526007830160205260409081902054905163170cc93360e21b81526106649160ff16906004016157c6565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6106928584606001515f611fdb565b6040518263ffffffff1660e01b81526004016106ae91906157d4565b6020604051808303815f875af11580156106ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ee91906157e6565b50505050565b6104e38383835f611c4c565b5f610709611fb7565b600981015490915060ff161561073257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610775573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079991906157e6565b8360200135146107c2576040516372b0a7e760e11b815260208401356004820152602401610664565b306107d360608501604086016157fd565b6001600160a01b03161461080b576107f160608401604085016157fd565b604051632f88120d60e21b815260040161066491906155c8565b5f6108196060850185615818565b905090505f805b828163ffffffff161015610b00575f61083c6060880188615818565b8363ffffffff168181106108525761085261585d565b90506020028101906108649190615871565b61086d90615995565b80516040519192505f91600888019161088591615a0e565b908152602001604051809103902054146108b557805160405163a41f772f60e01b815261066491906004016157d4565b5f6002885f0135846040516020016108e492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108fe91615a0e565b602060405180830381855afa158015610919573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061093c91906157e6565b90508086600801835f01516040516109549190615a0e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109d6576109d66155dc565b0217905550602082015160018201906109ef9082615a63565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610a93911685615b32565b8251604051919550610aa491615a0e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610af990615b45565b9050610820565b50600483018190556001830154606490610b2490600160401b900460ff1683615b67565b1015610b4657604051635943317f60e01b815260048101829052602401610664565b5f610b5c610b5386612032565b6040015161213d565b90505f610b68876122ca565b90505f600282604051610b7b9190615a0e565b602060405180830381855afa158015610b96573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bb991906157e6565b9050828114610be557604051631872fc8d60e01b81526004810182905260248101849052604401610664565b5050506009909201805460ff1916600117905550505050565b610c078261249f565b610c27576040516330efa98b60e01b815260048101839052602401610664565b5f610c31836119f3565b5190506002816005811115610c4857610c486155dc565b14610c68578060405163170cc93360e21b815260040161066491906157c6565b6106ee83836124c8565b610c7a612716565b5f610c83612760565b90505f610c8f846119f3565b9050600281516005811115610ca657610ca66155dc565b14610cc757805160405163170cc93360e21b815261066491906004016157c6565b610cd08461249f565b610cf0576040516330efa98b60e01b815260048101859052602401610664565b5f8481526005830160205260409020546001600160a01b03163314610d2b57335b604051636e2ccd7560e11b815260040161066491906155c8565b5f84815260058301602052604090205460a08201514291610d5d91600160b01b9091046001600160401b031690615b7e565b6001600160401b0316816001600160401b03161015610d9a5760405163fb6ce63f60e01b81526001600160401b0382166004820152602401610664565b5f610da586866124c8565b9050610db6818460a0015184612784565b610dd657604051635bff683f60e11b815260048101879052602401610664565b600484015460408401515f916001600160a01b031690634f22429f90610dfb906112b1565b60a08701516040516001600160e01b031960e085901b168152610e28929190819089908990600401615b9e565b602060405180830381865afa158015610e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6791906157e6565b5f88815260058701602052604081206002015491925090610e889083615bcc565b5f89815260058801602052604090206002810184905554909150610eb5906001600160a01b0316826127cf565b604051819089907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505050505050610eef61283f565b5050565b5f80610efd612760565b60030154610f0b9084615bdf565b9050801580610f2057506001600160401b0381115b15610f415760405163222d164360e21b815260048101849052602401610664565b92915050565b6104e38383835f612865565b610f5b612716565b5f610f64612760565b90505f80610f7184612a86565b91509150610f7e8261249f565b610f8a57505050611024565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610fb857610fb86155dc565b03611009575f83815260088501602052604081208054919055610fdb82826127cf565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b61101f8161101a84604001516112b1565b612dc0565b505050505b61102c61283f565b50565b5f611038612716565b61104485858585612dde565b905061104e61283f565b949350505050565b5f61105f612760565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611098576110986155dc565b60038111156110a9576110a96155dc565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61111f826119f3565b9050600183516003811115611136576111366155dc565b14611157578251604051633b0d540d60e21b81526106649190600401615bfe565b60048151600581111561116c5761116c6155dc565b036111825761117a86612fa7565b505050505050565b5f8061119961119088612032565b604001516131c7565b50915091508184146111c657846040015160405163089938b360e11b815260040161066491815260200190565b806001600160401b031683606001516001600160401b031610806111ff5750806001600160401b03168560a001516001600160401b0316115b1561122857604051632e19bc2d60e11b81526001600160401b0382166004820152602401610664565b5f888152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6112ba612760565b60030154610f41906001600160401b038416615b67565b5f6112db826119f3565b6080015192915050565b6104e38383836001612865565b6112fa612716565b5f611303612760565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561133c5761133c6155dc565b600381111561134d5761134d6155dc565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113c6576113c66155dc565b146113e7578051604051633b0d540d60e21b81526106649190600401615bfe565b60046113f682604001516119f3565b516005811115611408576114086155dc565b1461149a575f61141784612032565b90505f8061142883604001516131c7565b5091509150818460400151146114545760405163089938b360e11b815260048101839052602401610664565b806001600160401b03168460c001516001600160401b0316111561149657604051632e19bc2d60e11b81526001600160401b0382166004820152602401610664565b5050505b6114a384612fa7565b5050610eef61283f565b5f6114b6612760565b90505f6114c2836119f3565b51905060048160058111156114d9576114d96155dc565b146114f9578060405163170cc93360e21b815260040161066491906157c6565b5f8381526005830160205260409020546001600160a01b0316331461151e5733610d11565b5f838152600883016020908152604080832080549084905560058601909252909120546106ee906001600160a01b0316826127cf565b5f61155d612716565b61156883338461341d565b9050610f4161283f565b5f61157b611fb7565b90505f8061159461158b85612032565b604001516136f2565b91509150806115ba57604051632d07135360e01b81528115156004820152602401610664565b5f828152600684016020526040902080546115d49061578e565b90505f036115f85760405163089938b360e11b815260048101839052602401610664565b60015f83815260078501602052604090205460ff16600581111561161e5761161e6155dc565b14611651575f8281526007840160205260409081902054905163170cc93360e21b81526106649160ff16906004016157c6565b5f828152600684016020526040812061166991615378565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611701612760565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561173a5761173a6155dc565b600381111561174b5761174b6155dc565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117c4576117c46155dc565b141580156117e557506003815160038111156117e2576117e26155dc565b14155b15611806578051604051633b0d540d60e21b81526106649190600401615bfe565b5f61181482604001516119f3565b905080606001516001600160401b03165f03611846576040516339b894f960e21b815260048101859052602401610664565b6005600160991b016001600160a01b031663ee5b48eb611873846040015184606001518560800151611fdb565b6040518263ffffffff1660e01b815260040161188f91906157d4565b6020604051808303815f875af11580156118ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118cf91906157e6565b5050505050565b5f6118df611fb7565b5f83815260068201602052604090208054919250906118fd9061578e565b90505f036119215760405163089938b360e11b815260048101839052602401610664565b60015f83815260078301602052604090205460ff166005811115611947576119476155dc565b1461197a575f8281526007820160205260409081902054905163170cc93360e21b81526106649160ff16906004016157c6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119b39190600401615c18565b6020604051808303815f875af11580156119cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906157e6565b6119fb6153af565b5f611a04611fb7565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff166005811115611a3b57611a3b6155dc565b6005811115611a4c57611a4c6155dc565b8152602001600182018054611a609061578e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c9061578e565b8015611ad75780601f10611aae57610100808354040283529160200191611ad7565b820191905f5260205f20905b815481529060010190602001808311611aba57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b7e575080546001600160401b03808416911610155b15611b9c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bc784846138ae565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80611c1e611fb7565b9050806008018484604051611c34929190615ca2565b90815260200160405180910390205491505092915050565b5f611c55612760565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611c8e57611c8e6155dc565b6003811115611c9f57611c9f6155dc565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d15826119f3565b9050600283516003811115611d2c57611d2c6155dc565b14611d4d578251604051633b0d540d60e21b81526106649190600401615bfe565b60208301516001600160a01b03163314611de9575f8281526005850160205260409020546001600160a01b03163314611d865733610d11565b5f82815260058501602052604090205460a0820151611db591600160b01b90046001600160401b031690615b7e565b6001600160401b0316421015611de95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b600281516005811115611dfe57611dfe6155dc565b03611f505760028401546080840151611e20916001600160401b031690615b7e565b6001600160401b0316421015611e545760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b8615611e6657611e6482876124c8565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e9f918491611e9a9190615cb1565b6138c8565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee084613a12565b9050858015611eed575080155b15611f0e57604051631036cf9160e11b8152600481018a9052602401610664565b5f8981526007860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a350611fad565b600481516005811115611f6557611f656155dc565b03611f9157611f7383613a12565b5f898152600786016020526040902055611f8c88612fa7565b611fad565b805160405163170cc93360e21b815261066491906004016157c6565b5050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b6040515f6020820152600360e01b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612096573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120bd9190810190615cdc565b91509150806120df57604051636b2f19e960e01b815260040160405180910390fd5b815115612105578151604051636ba589a560e01b81526004810191909152602401610664565b60208201516001600160a01b031615612136578160200151604051624de75d60e31b815260040161066491906155c8565b5092915050565b5f815160261461217257815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610664565b5f805b60028110156121c157612189816001615bcc565b612194906008615b67565b61ffff168482815181106121aa576121aa61585d565b016020015160f81c901b9190911790600101612175565b5061ffff8116156121eb5760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b600481101561224657612202816003615bcc565b61220d906008615b67565b63ffffffff168561221f836002615b32565b8151811061222f5761222f61585d565b016020015160f81c901b91909117906001016121ee565b5063ffffffff81161561226c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122c15761228381601f615bcc565b61228e906008615b67565b8661229a836006615b32565b815181106122aa576122aa61585d565b016020015160f81c901b919091179060010161226f565b50949350505050565b60605f808335602085013560146122e6878701604089016157fd565b6122f36060890189615818565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123746060850185615818565b9050811015612136578161238b6060860186615818565b8381811061239b5761239b61585d565b90506020028101906123ad9190615871565b6123b79080615dae565b90506123c66060870187615818565b848181106123d6576123d661585d565b90506020028101906123e89190615871565b6123f29080615dae565b6123ff6060890189615818565b8681811061240f5761240f61585d565b90506020028101906124219190615871565b61242f906020810190615dae565b61243c60608b018b615818565b8881811061244c5761244c61585d565b905060200281019061245e9190615871565b61246f90606081019060400161558f565b6040516020016124859796959493929190615df0565b60408051601f198184030181529190529150600101612367565b5f806124a9612760565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612513573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261253a9190810190615cdc565b915091508061255c57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c391906157e6565b8251146125e9578151604051636ba589a560e01b81526004810191909152602401610664565b60208201516001600160a01b03161561261a578160200151604051624de75d60e31b815260040161066491906155c8565b5f806126298460400151613bd2565b915091508187146126505760405163089938b360e11b815260048101889052602401610664565b5f612659612760565b5f8981526005820160205260409020600101549091506001600160401b0390811690831611156126ec575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270b565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161275a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f60506127918484615cb1565b61279b9190615e59565b6001600160401b03166127af856064615e59565b6001600160401b031610156127c557505f61202b565b5060019392505050565b5f6127d8613dc3565b80546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612824575f80fd5b505af1158015612836573d5f803e3d5ffd5b50505050505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f61286e612760565b90505f61287a86613de7565b90506128858661249f565b6128905750506106ee565b5f8681526005830160205260409020546001600160a01b031633146128b55733610d11565b5f86815260058301602052604090205460a08201516128e491600160b01b90046001600160401b031690615b7e565b6001600160401b03168160c001516001600160401b0316101561292b5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610664565b5f85156129435761293c87866124c8565b9050612961565b505f8681526005830160205260409020600101546001600160401b03165b83801561297e575061297c818360a001518460c00151612784565b155b1561299f57604051635bff683f60e11b815260048101889052602401610664565b600483015460408301515f916001600160a01b031690634f22429f906129c4906112b1565b60a086015160c08701516040516001600160e01b031960e086901b1681526129f493929182918990600401615b9e565b602060405180830381865afa158015612a0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3391906157e6565b5f898152600586016020526040902060020154909150612a539082615bcc565b905080846008015f8a81526020019081526020015f205f828254612a779190615b32565b90915550505050505050505050565b5f612a8f6153af565b5f612a98611fb7565b90505f80612aa861158b87612032565b915091508015612acf57604051632d07135360e01b81528115156004820152602401610664565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612b0057612b006155dc565b6005811115612b1157612b116155dc565b8152602001600182018054612b259061578e565b80601f0160208091040260200160405190810160405280929190818152602001828054612b519061578e565b8015612b9c5780601f10612b7357610100808354040283529160200191612b9c565b820191905f5260205f20905b815481529060010190602001808311612b7f57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612c0757612c076155dc565b14158015612c285750600181516005811115612c2557612c256155dc565b14155b15612c4957805160405163170cc93360e21b815261066491906004016157c6565b600381516005811115612c5e57612c5e6155dc565b03612c6c5760048152612c71565b600581525b836008018160200151604051612c879190615a0e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ccb57612ccb6155dc565b021790555060208201516001820190612ce49082615a63565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b0319169190921617905580516005811115612d8957612d896155dc565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b610eef8282612dcd613dc3565b546001600160a01b031691906140bf565b5f80612de8612760565b600281015490915061ffff600160401b90910481169086161080612e11575061271061ffff8616115b15612e3557604051635f12e6c360e11b815261ffff86166004820152602401610664565b60028101546001600160401b039081169085161015612e71576040516202a06d60e11b81526001600160401b0385166004820152602401610664565b8054831080612e835750806001015483115b15612ea45760405163222d164360e21b815260048101849052602401610664565b5f612eae8461411e565b90505f612eba82610ef3565b90505f612ec7898361413b565b90506040518060a00160405280612edb3390565b6001600160a01b03908116825261ffff9a8b166020808401919091526001600160401b039a8b166040808501919091525f6060808601829052608095860182905287825260059a909a01835281902085518154938701519287015194166001600160b01b031990931692909217600160a01b91909d16029b909b1767ffffffffffffffff60b01b1916600160b01b918b1691909102178a559481015160018a0180546001600160401b031916919099161790975595909201516002909601959095555091949350505050565b5f612fb0612760565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115612fe957612fe96155dc565b6003811115612ffa57612ffa6155dc565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015281015190915061306e614698565b826080015161307d9190615b7e565b6001600160401b03164210156130b15760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610664565b5f848152600684016020908152604080832080546001600160a81b0319168155600181018490556002018390556007860190915281208054908290559080821561316c575f8481526005870160205260409020546127109061311e90600160a01b900461ffff1685615b67565b6131289190615bdf565b915081866008015f8681526020019081526020015f205f82825461314c9190615b32565b9091555061315c90508284615bcc565b905061316c8560200151826127cf565b613181856020015161101a87606001516112b1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f83516036146131fe57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610664565b5f805b600281101561324d57613215816001615bcc565b613220906008615b67565b61ffff168682815181106132365761323661585d565b016020015160f81c901b9190911790600101613201565b5061ffff8116156132775760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b60048110156132d25761328e816003615bcc565b613299906008615b67565b63ffffffff16876132ab836002615b32565b815181106132bb576132bb61585d565b016020015160f81c901b919091179060010161327a565b5063ffffffff81166003146132fa57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561334f5761331181601f615bcc565b61331c906008615b67565b88613328836006615b32565b815181106133385761333861585d565b016020015160f81c901b91909117906001016132fd565b505f805b60088110156133ae57613367816007615bcc565b613372906008615b67565b6001600160401b031689613387836026615b32565b815181106133975761339761585d565b016020015160f81c901b9190911790600101613353565b505f805b600881101561340d576133c6816007615bcc565b6133d1906008615b67565b6001600160401b03168a6133e683602e615b32565b815181106133f6576133f661585d565b016020015160f81c901b91909117906001016133b2565b5091989097509095509350505050565b5f80613427612760565b90505f61343661027c8561411e565b90505f613442876119f3565b905061344d8761249f565b61346d576040516330efa98b60e01b815260048101889052602401610664565b600281516005811115613482576134826155dc565b146134a357805160405163170cc93360e21b815261066491906004016157c6565b5f8282608001516134b49190615b7e565b905083600201600a9054906101000a90046001600160401b031682604001516134dd9190615e59565b6001600160401b0316816001600160401b0316111561351a57604051636d51fe0560e11b81526001600160401b0382166004820152602401610664565b5f806135268a846138c8565b915091505f8a8360405160200161355492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156135e7576135e76155dc565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461372857825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610664565b5f805b60028110156137775761373f816001615bcc565b61374a906008615b67565b61ffff168582815181106137605761376061585d565b016020015160f81c901b919091179060010161372b565b5061ffff8116156137a15760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b60048110156137fc576137b8816003615bcc565b6137c3906008615b67565b63ffffffff16866137d5836002615b32565b815181106137e5576137e561585d565b016020015160f81c901b91909117906001016137a4565b5063ffffffff811660021461382457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138795761383b81601f615bcc565b613846906008615b67565b87613852836006615b32565b815181106138625761386261585d565b016020015160f81c901b9190911790600101613827565b505f8660268151811061388e5761388e61585d565b016020015191976001600160f81b03199092161515965090945050505050565b6138b66146b3565b6138bf826146fe565b610eef81614772565b5f805f6138d3611fb7565b5f868152600782016020526040902060020154909150600160801b90046001600160401b031661390385826147ce565b5f61390d876149f3565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61395d8a858b611fdb565b6040518263ffffffff1660e01b815260040161397991906157d4565b6020604051808303815f875af1158015613995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b991906157e6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f80613a1c612760565b90505f613a2c84604001516119f3565b90505f600382516005811115613a4457613a446155dc565b1480613a625750600482516005811115613a6057613a606155dc565b145b15613a72575060c0810151613aaf565b600282516005811115613a8757613a876155dc565b03613a93575042613aaf565b815160405163170cc93360e21b815261066491906004016157c6565b84608001516001600160401b0316816001600160401b031611613ad657505f949350505050565b6040808601515f90815260058501602052206001015460a0830151613b05916001600160401b03169083612784565b613b1357505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613b38906112b1565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b168152613b8a9493929188916001600160401b0390911690600401615b9e565b602060405180830381865afa158015613ba5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bc991906157e6565b95945050505050565b5f808251602e14613c0857825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610664565b5f805b6002811015613c5757613c1f816001615bcc565b613c2a906008615b67565b61ffff16858281518110613c4057613c4061585d565b016020015160f81c901b9190911790600101613c0b565b5061ffff811615613c815760405163407b587360e01b815261ffff82166004820152602401610664565b5f805b6004811015613cdc57613c98816003615bcc565b613ca3906008615b67565b63ffffffff1686613cb5836002615b32565b81518110613cc557613cc561585d565b016020015160f81c901b9190911790600101613c84565b5063ffffffff811615613d0257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613d5757613d1981601f615bcc565b613d24906008615b67565b87613d30836006615b32565b81518110613d4057613d4061585d565b016020015160f81c901b9190911790600101613d05565b505f805b6008811015613db657613d6f816007615bcc565b613d7a906008615b67565b6001600160401b031688613d8f836026615b32565b81518110613d9f57613d9f61585d565b016020015160f81c901b9190911790600101613d5b565b5090969095509350505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0090565b613def6153af565b5f613df8611fb7565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166005811115613e3157613e316155dc565b6005811115613e4257613e426155dc565b8152602001600182018054613e569061578e565b80601f0160208091040260200160405190810160405280929190818152602001828054613e829061578e565b8015613ecd5780601f10613ea457610100808354040283529160200191613ecd565b820191905f5260205f20905b815481529060010190602001808311613eb057829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613f3b57613f3b6155dc565b14613f6e575f8481526007830160205260409081902054905163170cc93360e21b81526106649160ff16906004016157c6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613fb257613fb26155dc565b021790555060208201516001820190613fcb9082615a63565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f61406885826138c8565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614a5c565b5f610f418261412b613dc3565b546001600160a01b031690614ab4565b5f614144611fb7565b6009015460ff1661416857604051637fab81e560e01b815260040160405180910390fd5b5f614171611fb7565b905042614184606086016040870161558f565b6001600160401b03161115806141be57506141a26202a30042615b32565b6141b2606086016040870161558f565b6001600160401b031610155b156141f8576141d3606085016040860161558f565b604051635879da1360e11b81526001600160401b039091166004820152602401610664565b61420d6142086060860186615e84565b614c15565b61421d6142086080860186615e84565b603061422c6020860186615dae565b90501461425e576142406020850185615dae565b6040516326475b2f60e11b8152610664925060040190815260200190565b6142688480615dae565b90505f036142955761427a8480615dae565b604051633e08a12560e11b8152600401610664929190615e98565b5f600882016142a48680615dae565b6040516142b2929190615ca2565b908152602001604051809103902054146142eb576142d08480615dae565b60405163a41f772f60e01b8152600401610664929190615e98565b6142f5835f6147ce565b6040805160e08101909152815481525f908190614401906020810161431a8980615dae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614362908a018a615dae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016143ab60608a0160408b0161558f565b6001600160401b031681526020016143c660608a018a615e84565b6143cf90615ec6565b81526020016143e160808a018a615e84565b6143ea90615ec6565b8152602001876001600160401b0316815250614d7e565b5f8281526006860160205260409020919350915061441f8282615a63565b50816008840161442f8880615dae565b60405161443d929190615ca2565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906144799085906004016157d4565b6020604051808303815f875af1158015614495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144b991906157e6565b6040805160e0810190915290915080600181526020016144d98980615dae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614568576145686155dc565b0217905550602082015160018201906145819082615a63565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790558061461e8880615dae565b60405161462c929190615ca2565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061466a919061558f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6146a1611fb7565b600101546001600160401b0316919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166146fc57604051631afcd79f60e31b815260040160405180910390fd5b565b6147066146b3565b61470f81614f6b565b614717614f84565b61102c6060820135608083013561473460c0850160a0860161558f565b61474460e0860160c08701615f8d565b614755610100870160e08801615fa6565b61010087013561476d61014089016101208a016157fd565b614f94565b61477a6146b3565b5f614783613dc3565b90506001600160a01b0382166147ae5781604051637330680360e01b815260040161066491906155c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147d7611fb7565b90505f826001600160401b0316846001600160401b03161115614805576147fe8385615cb1565b9050614812565b61480f8484615cb1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614874575060018401548151614870916001600160401b031690615b32565b8210155b1561489a576001600160401b0383166060820152818152604081015160208201526148b9565b82816060018181516148ac9190615b7e565b6001600160401b03169052505b60608101516148c9906064615e59565b602082015160018601546001600160401b0392909216916148f49190600160401b900460ff16615b67565b101561492457606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610664565b856001600160401b03168160400181815161493f9190615b32565b9052506040810180516001600160401b038716919061495f908390615bcc565b9052506001840154604082015160649161498491600160401b90910460ff1690615b67565b10156149ab578060400151604051635943317f60e01b815260040161066491815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f806149fd611fb7565b5f8481526007820160205260409020600201805491925090600890614a3190600160401b90046001600160401b0316615fc6565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f614a706001600160a01b0384168361512a565b905080515f14158015614a94575080806020019051810190614a929190615fe1565b155b156104e35782604051635274afe760e01b815260040161066491906155c8565b5f80836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401614ae291906155c8565b602060405180830381865afa158015614afd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b2191906157e6565b9050614b386001600160a01b038516333086615137565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190614b669030906004016155c8565b602060405180830381865afa158015614b81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ba591906157e6565b9050818111614c0b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610664565b613bc98282615bcc565b614c2260208201826154ea565b63ffffffff16158015614c425750614c3d6020820182615818565b151590505b15614c8957614c5460208201826154ea565b614c616020830183615818565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610664565b614c966020820182615818565b9050614ca560208301836154ea565b63ffffffff161115614cbe57614c5460208201826154ea565b60015b614cce6020830183615818565b9050811015610eef57614ce46020830183615818565b614cef600184615bcc565b818110614cfe57614cfe61585d565b9050602002016020810190614d1391906157fd565b6001600160a01b0316614d296020840184615818565b83818110614d3957614d3961585d565b9050602002016020810190614d4e91906157fd565b6001600160a01b03161015614d7657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614cc1565b5f6060826040015151603014614da75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614de8988a986001989297929690959094909390929101615ffc565b60405160208183030381529060405290505f5b84608001516020015151811015614e5a57818560800151602001518281518110614e2757614e2761585d565b6020026020010151604051602001614e409291906160b6565b60408051601f198184030181529190529150600101614dfb565b5060a0840151805160209182015151604051614e7a9385939291016160e7565b60405160208183030381529060405290505f5b8460a001516020015151811015614eec57818560a00151602001518281518110614eb957614eb961585d565b6020026020010151604051602001614ed29291906160b6565b60408051601f198184030181529190529150600101614e8d565b5060c0840151604051614f03918391602001616122565b6040516020818303038152906040529050600281604051614f249190615a0e565b602060405180830381855afa158015614f3f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f6291906157e6565b94909350915050565b614f736146b3565b614f7b615170565b61102c81615178565b614f8c6146b3565b6146fc61525b565b614f9c6146b3565b5f614fa5612760565b905061ffff85161580614fbd575061271061ffff8616115b15614fe157604051635f12e6c360e11b815261ffff86166004820152602401610664565b868811156150055760405163222d164360e21b815260048101899052602401610664565b60ff841615806150185750600a60ff8516115b1561503b5760405163170db35960e31b815260ff85166004820152602401610664565b615043614698565b6001600160401b0316866001600160401b0316101561507f576040516202a06d60e11b81526001600160401b0387166004820152602401610664565b825f0361509f5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b606061202b83835f615263565b6040516001600160a01b0384811660248301528381166044830152606482018390526106ee9186918216906323b872dd906084016140ec565b6146fc6146b3565b6151806146b3565b5f615189611fb7565b82358155905060146151a16060840160408501615fa6565b60ff1611806151c057506151bb6060830160408401615fa6565b60ff16155b156151f4576151d56060830160408401615fa6565b604051634a59bbff60e11b815260ff9091166004820152602401610664565b6152046060830160408401615fa6565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615235604083016020840161558f565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b61283f6146b3565b606081471015615288573060405163cd78605960e01b815260040161066491906155c8565b5f80856001600160a01b031684866040516152a39190615a0e565b5f6040518083038185875af1925050503d805f81146152dd576040519150601f19603f3d011682016040523d82523d5f602084013e6152e2565b606091505b50915091506152f28683836152fc565b9695505050505050565b6060826153115761530c8261534f565b61202b565b815115801561532857506001600160a01b0384163b155b156153485783604051639996b31560e01b815260040161066491906155c8565b508061202b565b80511561535f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546153849061578e565b5f825580601f10615393575050565b601f0160209004905f5260205f209081019061102c91906153ec565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615400575f81556001016153ed565b5090565b801515811461102c575f80fd5b803563ffffffff81168114615424575f80fd5b919050565b5f805f6060848603121561543b575f80fd5b83359250602084013561544d81615404565b915061545b60408501615411565b90509250925092565b5f60208284031215615474575f80fd5b5035919050565b5f806040838503121561548c575f80fd5b82356001600160401b038111156154a1575f80fd5b8301608081860312156154b2575f80fd5b91506154c060208401615411565b90509250929050565b5f80604083850312156154da575f80fd5b823591506154c060208401615411565b5f602082840312156154fa575f80fd5b61202b82615411565b803561ffff81168114615424575f80fd5b80356001600160401b0381168114615424575f80fd5b5f805f806080858703121561553d575f80fd5b84356001600160401b03811115615552575f80fd5b850160a08188031215615563575f80fd5b935061557160208601615503565b925061557f60408601615514565b9396929550929360600135925050565b5f6020828403121561559f575f80fd5b61202b82615514565b5f80604083850312156155b9575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52602160045260245ffd5b60068110615600576156006155dc565b9052565b5f5b8381101561561e578181015183820152602001615606565b50505f910152565b5f815180845261563d816020860160208601615604565b601f01601f19169290920160200192915050565b602081526156636020820183516155f0565b5f602083015160e0604084015261567e610100840182615626565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b038116811461102c575f80fd5b5f808284036101608112156156f8575f80fd5b61014080821215615707575f80fd5b8493508301359050615718816156d1565b809150509250929050565b5f8060208385031215615734575f80fd5b82356001600160401b038082111561574a575f80fd5b818501915085601f83011261575d575f80fd5b81358181111561576b575f80fd5b86602082850101111561577c575f80fd5b60209290920196919550909350505050565b600181811c908216806157a257607f821691505b6020821081036157c057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610f4182846155f0565b602081525f61202b6020830184615626565b5f602082840312156157f6575f80fd5b5051919050565b5f6020828403121561580d575f80fd5b813561202b816156d1565b5f808335601e1984360301811261582d575f80fd5b8301803591506001600160401b03821115615846575f80fd5b6020019150600581901b3603821315613a0b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615885575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156158c5576158c561588f565b60405290565b604080519081016001600160401b03811182821017156158c5576158c561588f565b604051601f8201601f191681016001600160401b03811182821017156159155761591561588f565b604052919050565b5f6001600160401b038211156159355761593561588f565b50601f01601f191660200190565b5f82601f830112615952575f80fd5b81356159656159608261591d565b6158ed565b818152846020838601011115615979575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156159a5575f80fd5b6159ad6158a3565b82356001600160401b03808211156159c3575f80fd5b6159cf36838701615943565b835260208501359150808211156159e4575f80fd5b506159f136828601615943565b602083015250615a0360408401615514565b604082015292915050565b5f8251615885818460208701615604565b601f8211156104e357805f5260205f20601f840160051c81016020851015615a445750805b601f840160051c820191505b818110156118cf575f8155600101615a50565b81516001600160401b03811115615a7c57615a7c61588f565b615a9081615a8a845461578e565b84615a1f565b602080601f831160018114615ac3575f8415615aac5750858301515b5f19600386901b1c1916600185901b17855561117a565b5f85815260208120601f198616915b82811015615af157888601518255948401946001909101908401615ad2565b5085821015615b0e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610f4157610f41615b1e565b5f63ffffffff808316818103615b5d57615b5d615b1e565b6001019392505050565b8082028115828204841417610f4157610f41615b1e565b6001600160401b0381811683821601908082111561213657612136615b1e565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b81810381811115610f4157610f41615b1e565b5f82615bf957634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615c1257615c126155dc565b91905290565b5f60208083525f8454615c2a8161578e565b806020870152604060018084165f8114615c4b5760018114615c6757615c94565b60ff19851660408a0152604084151560051b8a01019550615c94565b895f5260205f205f5b85811015615c8b5781548b8201860152908301908801615c70565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0382811682821603908082111561213657612136615b1e565b805161542481615404565b5f8060408385031215615ced575f80fd5b82516001600160401b0380821115615d03575f80fd5b9084019060608287031215615d16575f80fd5b615d1e6158a3565b82518152602080840151615d31816156d1565b82820152604084015183811115615d46575f80fd5b80850194505087601f850112615d5a575f80fd5b83519250615d6a6159608461591d565b8381528882858701011115615d7d575f80fd5b615d8c84838301848801615604565b80604084015250819550615da1818801615cd1565b9450505050509250929050565b5f808335601e19843603018112615dc3575f80fd5b8301803591506001600160401b03821115615ddc575f80fd5b602001915036819003821315613a0b575f80fd5b5f8851615e01818460208d01615604565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615e7c57615e7c615b1e565b505092915050565b5f8235603e19833603018112615885575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ed6575f80fd5b615ede6158cb565b615ee783615411565b81526020808401356001600160401b0380821115615f03575f80fd5b9085019036601f830112615f15575f80fd5b813581811115615f2757615f2761588f565b8060051b9150615f388483016158ed565b8181529183018401918481019036841115615f51575f80fd5b938501935b83851015615f7b5784359250615f6b836156d1565b8282529385019390850190615f56565b94860194909452509295945050505050565b5f60208284031215615f9d575f80fd5b61202b82615503565b5f60208284031215615fb6575f80fd5b813560ff8116811461202b575f80fd5b5f6001600160401b03808316818103615b5d57615b5d615b1e565b5f60208284031215615ff1575f80fd5b815161202b81615404565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161604281602a850160208b01615604565b86519083019061605981602a840160208b01615604565b60c087901b6001600160c01b031916602a929091019182015261608b603282018660e01b6001600160e01b0319169052565b6160a4603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516160c7818460208801615604565b60609390931b6001600160601b0319169190920190815260140192915050565b5f84516160f8818460208901615604565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351616133818460208801615604565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 579d3e0a4..ed9e12293 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput 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\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimValidationRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"forceInitializeEndDelegation\",\"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\":\"forceInitializeEndValidation\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"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\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"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\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"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\":\"ValidationRewardsClaimed\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"reward\",\"type\":\"uint256\",\"indexed\":true,\"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\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"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\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161611a38038061611a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615fcd8061014d5f395ff3fe6080604052600436106101cb575f3560e01c806380dd672f116100f5578063ba3a4b971161008e578063ba3a4b9714610525578063bc5fbfec14610544578063bee0a03f14610577578063c257a0f514610596578063c599e24f146105b5578063c974d1b6146105c8578063d5f20ff6146105dc578063df93d8de14610608578063fd7ac5e71461061e575f80fd5b806380dd672f146104405780638280a25a1461045f57806393e2459814610473578063a3a65e4814610492578063a9778a7a14610314578063af2f5feb146104b1578063afb98096146104c4578063afba878a146104f7578063b771b3bc1461050b575f80fd5b806335455ded1161016757806335455ded146103145780633a1cfff61461033c578063467ef06f1461035b57806360305d621461037a57806360ad7784146103a357806362065856146103c257806366435abf146103ef578063732214f81461040e57806376f7862114610421575f80fd5b80630118acc4146101cf5780630322ed98146101f0578063151d30d11461020f5780631ec447241461023a57806320d91b7a1461025957806325e1c776146102785780632893d077146102975780632e2194d8146102b6578063329c3e12146102ed575b5f80fd5b3480156101da575f80fd5b506101ee6101e93660046152e2565b61063d565b005b3480156101fb575f80fd5b506101ee61020a36600461531d565b61064f565b34801561021a575f80fd5b50610223600a81565b60405160ff90911681526020015b60405180910390f35b348015610245575f80fd5b506101ee6102543660046152e2565b61085b565b348015610264575f80fd5b506101ee610273366004615334565b610867565b348015610283575f80fd5b506101ee610292366004615382565b610d65565b3480156102a2575f80fd5b506101ee6102b1366004615382565b610dd9565b3480156102c1575f80fd5b506102d56102d036600461531d565b6110fb565b6040516001600160401b039091168152602001610231565b3480156102f8575f80fd5b506103076001600160991b0181565b60405161023191906153a3565b34801561031f575f80fd5b5061032961271081565b60405161ffff9091168152602001610231565b348015610347575f80fd5b506101ee6103563660046152e2565b61114f565b348015610366575f80fd5b506101ee6103753660046153b7565b61115b565b348015610385575f80fd5b5061038e601481565b60405163ffffffff9091168152602001610231565b3480156103ae575f80fd5b506101ee6103bd366004615382565b611237565b3480156103cd575f80fd5b506103e16103dc3660046153e6565b611492565b604051908152602001610231565b3480156103fa575f80fd5b506102d561040936600461531d565b6114b2565b348015610419575f80fd5b506103e15f81565b34801561042c575f80fd5b506101ee61043b3660046152e2565b6114c6565b34801561044b575f80fd5b506101ee61045a366004615382565b6114d3565b34801561046a575f80fd5b50610223603081565b34801561047e575f80fd5b506101ee61048d36600461531d565b61168e565b34801561049d575f80fd5b506101ee6104ac3660046153b7565b611735565b6103e16104bf366004615410565b6118bb565b3480156104cf575f80fd5b506103e17f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610502575f80fd5b50610223605081565b348015610516575f80fd5b506103076005600160991b0181565b348015610530575f80fd5b506101ee61053f36600461531d565b6118e1565b34801561054f575f80fd5b506103e17fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b348015610582575f80fd5b506101ee61059136600461531d565b611abf565b3480156105a1575f80fd5b506101ee6105b0366004615464565b611bdc565b6103e16105c336600461531d565b611cb9565b3480156105d3575f80fd5b50610223601481565b3480156105e7575f80fd5b506105fb6105f636600461531d565b611cdc565b60405161023191906154f0565b348015610613575f80fd5b506102d56202a30081565b348015610629575f80fd5b506103e1610638366004615570565b611e1e565b61064a8383836001611e56565b505050565b5f6106586121c1565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660058111156106915761069161547b565b60058111156106a2576106a261547b565b81526020016001820180546106b6906155db565b80601f01602080910402602001604051908101604052809291908181526020018280546106e2906155db565b801561072d5780601f106107045761010080835404028352916020019161072d565b820191905f5260205f20905b81548152906001019060200180831161071057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107985761079861547b565b146107d4575f8381526007830160205260409081902054905163170cc93360e21b81526107cb9160ff169060040161560d565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107f98584606001515f6121e5565b6040518263ffffffff1660e01b8152600401610815919061561b565b6020604051808303815f875af1158015610831573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610855919061562d565b50505050565b61064a8383835f611e56565b5f6108706121c1565b600981015490915060ff161561089957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610900919061562d565b836020013514610929576040516372b0a7e760e11b8152602084013560048201526024016107cb565b3061093a6060850160408601615658565b6001600160a01b031614610972576109586060840160408501615658565b604051632f88120d60e21b81526004016107cb91906153a3565b5f6109806060850185615673565b905090505f805b828163ffffffff161015610c67575f6109a36060880188615673565b8363ffffffff168181106109b9576109b96156b8565b90506020028101906109cb91906156cc565b6109d4906157f0565b80516040519192505f9160088801916109ec91615869565b90815260200160405180910390205414610a1c57805160405163a41f772f60e01b81526107cb919060040161561b565b5f6002885f013584604051602001610a4b92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a6591615869565b602060405180830381855afa158015610a80573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa3919061562d565b90508086600801835f0151604051610abb9190615869565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b3d57610b3d61547b565b021790555060208201516001820190610b5690826158be565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610bfa91168561598d565b8251604051919550610c0b91615869565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c60906159a0565b9050610987565b50600483018190556001830154606490610c8b90600160401b900460ff16836159c2565b1015610cad57604051635943317f60e01b8152600481018290526024016107cb565b5f610cc3610cba86612234565b6040015161233f565b90505f610ccf876124cc565b90505f600282604051610ce29190615869565b602060405180830381855afa158015610cfd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d20919061562d565b9050828114610d4c57604051631872fc8d60e01b815260048101829052602481018490526044016107cb565b5050506009909201805460ff1916600117905550505050565b610d6e826126a1565b610d8e576040516330efa98b60e01b8152600481018390526024016107cb565b5f610d9883611cdc565b5190506002816005811115610daf57610daf61547b565b14610dcf578060405163170cc93360e21b81526004016107cb919061560d565b61085583836126ca565b610de1612918565b5f610dea612962565b90505f610df684611cdc565b9050600281516005811115610e0d57610e0d61547b565b14610e2e57805160405163170cc93360e21b81526107cb919060040161560d565b610e37846126a1565b610e57576040516330efa98b60e01b8152600481018590526024016107cb565b5f8481526005830160205260409020546001600160a01b03163314610e9257335b604051636e2ccd7560e11b81526004016107cb91906153a3565b5f84815260058301602052604090205460a08201514291610ec491600160b01b9091046001600160401b0316906159d9565b6001600160401b0316816001600160401b03161015610f015760405163fb6ce63f60e01b81526001600160401b03821660048201526024016107cb565b5f610f0c86866126ca565b5f87815260058601602052604081206001015491925090610f3d90600160401b90046001600160401b0316836159f9565b5f888152600587016020526040812060010154919250600160801b9091046001600160401b031690819003610f73575060a08401515b610f7e828286612986565b610f9e57604051635bff683f60e11b8152600481018990526024016107cb565b600486015460408601515f916001600160a01b031690634f22429f90610fc390611492565b848589886040518663ffffffff1660e01b8152600401610fe7959493929190615a19565b602060405180830381865afa158015611002573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611026919061562d565b90506064605060ff168760a001518761103f91906159f9565b6110499190615a47565b6110539190615a86565b5f8a81526005890160205260409020600181018054600160401b600160c01b031916600160401b6001600160401b039485160267ffffffffffffffff60801b191617600160801b9389169390930292909217909155546110bc906001600160a01b0316826129d1565b60405181908a907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505050505050506110f7612a2f565b5050565b5f80611105612962565b600301546111139084615aab565b905080158061112857506001600160401b0381115b156111495760405163222d164360e21b8152600481018490526024016107cb565b92915050565b61064a8383835f612a55565b611163612918565b5f61116c612962565b90505f8061117984612caf565b91509150611186826126a1565b6111925750505061122c565b5f8281526005840160205260409020546001600160a01b03166004825160058111156111c0576111c061547b565b03611211575f838152600885016020526040812080549190556111e382826129d1565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b611227816112228460400151611492565b612fe9565b505050505b611234612a2f565b50565b5f611240612962565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156112795761127961547b565b600381111561128a5761128a61547b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61130082611cdc565b90506001835160038111156113175761131761547b565b14611338578251604051633b0d540d60e21b81526107cb9190600401615abe565b60048151600581111561134d5761134d61547b565b036113635761135b86612ffc565b505050505050565b5f8061137a61137188612234565b6040015161321c565b50915091508184146113a757846040015160405163089938b360e11b81526004016107cb91815260200190565b806001600160401b031683606001516001600160401b031610806113e05750806001600160401b03168560a001516001600160401b0316115b1561140957604051632e19bc2d60e11b81526001600160401b03821660048201526024016107cb565b5f888152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f61149b612962565b60030154611149906001600160401b0384166159c2565b5f6114bc82611cdc565b6080015192915050565b61064a8383836001612a55565b6114db612918565b5f6114e4612962565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561151d5761151d61547b565b600381111561152e5761152e61547b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115a7576115a761547b565b146115c8578051604051633b0d540d60e21b81526107cb9190600401615abe565b60046115d78260400151611cdc565b5160058111156115e9576115e961547b565b1461167b575f6115f884612234565b90505f80611609836040015161321c565b5091509150818460400151146116355760405163089938b360e11b8152600481018390526024016107cb565b806001600160401b03168460c001516001600160401b0316111561167757604051632e19bc2d60e11b81526001600160401b03821660048201526024016107cb565b5050505b61168484612ffc565b50506110f7612a2f565b5f611697612962565b90505f6116a383611cdc565b51905060048160058111156116ba576116ba61547b565b146116da578060405163170cc93360e21b81526004016107cb919061560d565b5f8381526005830160205260409020546001600160a01b031633146116ff5733610e78565b5f83815260088301602090815260408083208054908490556005860190925290912054610855906001600160a01b0316826129d1565b5f61173e6121c1565b90505f8061175761174e85612234565b60400151613472565b915091508061177d57604051632d07135360e01b815281151560048201526024016107cb565b5f82815260068401602052604090208054611797906155db565b90505f036117bb5760405163089938b360e11b8152600481018390526024016107cb565b60015f83815260078501602052604090205460ff1660058111156117e1576117e161547b565b14611814575f8281526007840160205260409081902054905163170cc93360e21b81526107cb9160ff169060040161560d565b5f828152600684016020526040812061182c91615236565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6118c4612918565b6118d08484843461362e565b90506118da612a2f565b9392505050565b5f6118ea612962565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156119235761192361547b565b60038111156119345761193461547b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156119ad576119ad61547b565b141580156119ce57506003815160038111156119cb576119cb61547b565b14155b156119ef578051604051633b0d540d60e21b81526107cb9190600401615abe565b5f6119fd8260400151611cdc565b905080606001516001600160401b03165f03611a2f576040516339b894f960e21b8152600481018590526024016107cb565b6005600160991b016001600160a01b031663ee5b48eb611a5c8460400151846060015185608001516121e5565b6040518263ffffffff1660e01b8152600401611a78919061561b565b6020604051808303815f875af1158015611a94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ab8919061562d565b5050505050565b5f611ac86121c1565b5f8381526006820160205260409020805491925090611ae6906155db565b90505f03611b0a5760405163089938b360e11b8152600481018390526024016107cb565b60015f83815260078301602052604090205460ff166005811115611b3057611b3061547b565b14611b63575f8281526007820160205260409081902054905163170cc93360e21b81526107cb9160ff169060040161560d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611b9c9190600401615ad8565b6020604051808303815f875af1158015611bb8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a919061562d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c25575080546001600160401b03808416911610155b15611c435760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c6d83613820565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611cc2612918565b611ccd823334613831565b9050611cd7612a2f565b919050565b611ce461526d565b5f611ced6121c1565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff166005811115611d2457611d2461547b565b6005811115611d3557611d3561547b565b8152602001600182018054611d49906155db565b80601f0160208091040260200160405190810160405280929190818152602001828054611d75906155db565b8015611dc05780601f10611d9757610100808354040283529160200191611dc0565b820191905f5260205f20905b815481529060010190602001808311611da357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b5f80611e286121c1565b9050806008018484604051611e3e929190615b62565b90815260200160405180910390205491505092915050565b5f611e5f612962565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611e9857611e9861547b565b6003811115611ea957611ea961547b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611f1f82611cdc565b9050600283516003811115611f3657611f3661547b565b14611f57578251604051633b0d540d60e21b81526107cb9190600401615abe565b60208301516001600160a01b03163314611ff3575f8281526005850160205260409020546001600160a01b03163314611f905733610e78565b5f82815260058501602052604090205460a0820151611fbf91600160b01b90046001600160401b0316906159d9565b6001600160401b0316421015611ff35760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b6002815160058111156120085761200861547b565b0361215a576002840154608084015161202a916001600160401b0316906159d9565b6001600160401b031642101561205e5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b86156120705761206e82876126ca565b505b5f8881526006850160205260409020805460ff19166003179055606083015160808201516120a99184916120a491906159f9565b613b03565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556120ea84613c4d565b90508580156120f7575080155b1561211857604051631036cf9160e11b8152600481018a90526024016107cb565b5f8981526007860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a3506121b7565b60048151600581111561216f5761216f61547b565b0361219b5761217d83613c4d565b5f89815260078601602052604090205561219688612ffc565b6121b7565b805160405163170cc93360e21b81526107cb919060040161560d565b5050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf9190810190615b7c565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b815115612307578151604051636ba589a560e01b815260048101919091526024016107cb565b60208201516001600160a01b031615612338578160200151604051624de75d60e31b81526004016107cb91906153a3565b5092915050565b5f815160261461237457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016107cb565b5f805b60028110156123c35761238b816001615c4e565b6123969060086159c2565b61ffff168482815181106123ac576123ac6156b8565b016020015160f81c901b9190911790600101612377565b5061ffff8116156123ed5760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b600481101561244857612404816003615c4e565b61240f9060086159c2565b63ffffffff168561242183600261598d565b81518110612431576124316156b8565b016020015160f81c901b91909117906001016123f0565b5063ffffffff81161561246e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156124c35761248581601f615c4e565b6124909060086159c2565b8661249c83600661598d565b815181106124ac576124ac6156b8565b016020015160f81c901b9190911790600101612471565b50949350505050565b60605f808335602085013560146124e887870160408901615658565b6124f56060890189615673565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6125766060850185615673565b9050811015612338578161258d6060860186615673565b8381811061259d5761259d6156b8565b90506020028101906125af91906156cc565b6125b99080615c61565b90506125c86060870187615673565b848181106125d8576125d86156b8565b90506020028101906125ea91906156cc565b6125f49080615c61565b6126016060890189615673565b86818110612611576126116156b8565b905060200281019061262391906156cc565b612631906020810190615c61565b61263e60608b018b615673565b8881811061264e5761264e6156b8565b905060200281019061266091906156cc565b6126719060608101906040016153e6565b6040516020016126879796959493929190615ca3565b60408051601f198184030181529190529150600101612569565b5f806126ab612962565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612715573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261273c9190810190615b7c565b915091508061275e57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c5919061562d565b8251146127eb578151604051636ba589a560e01b815260048101919091526024016107cb565b60208201516001600160a01b03161561281c578160200151604051624de75d60e31b81526004016107cb91906153a3565b5f8061282b8460400151613e0d565b915091508187146128525760405163089938b360e11b8152600481018890526024016107cb565b5f61285b612962565b5f8981526005820160205260409020600101549091506001600160401b0390811690831611156128ee575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261290d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161295c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f605061299384846159f9565b61299d9190615a47565b6001600160401b03166129b1856064615a47565b6001600160401b031610156129c757505f6118da565b5060019392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612a1d575f80fd5b505af115801561135b573d5f803e3d5ffd5b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f612a5e612962565b90505f612a6a86613ffe565b9050612a75866126a1565b612a80575050610855565b5f8681526005830160205260409020546001600160a01b03163314612aa55733610e78565b5f86815260058301602052604090205460a0820151612ad491600160b01b90046001600160401b0316906159d9565b6001600160401b03168160c001516001600160401b03161015612b1b5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016107cb565b5f8515612b3357612b2c87866126ca565b9050612b51565b505f8681526005830160205260409020600101546001600160401b03165b5f878152600584016020526040812060010154612b7e90600160401b90046001600160401b0316836159f9565b5f898152600586016020526040812060010154919250600160801b9091046001600160401b031690819003612bb4575060a08301515b858015612bcd5750612bcb82828660c00151612986565b155b15612bee57604051635bff683f60e11b8152600481018a90526024016107cb565b600485015460408501515f916001600160a01b031690634f22429f90612c1390611492565b84858960c00151886040518663ffffffff1660e01b8152600401612c3b959493929190615a19565b602060405180830381865afa158015612c56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7a919061562d565b905080866008015f8c81526020019081526020015f205f828254612c9e919061598d565b909155505050505050505050505050565b5f612cb861526d565b5f612cc16121c1565b90505f80612cd161174e87612234565b915091508015612cf857604051632d07135360e01b815281151560048201526024016107cb565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612d2957612d2961547b565b6005811115612d3a57612d3a61547b565b8152602001600182018054612d4e906155db565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7a906155db565b8015612dc55780601f10612d9c57610100808354040283529160200191612dc5565b820191905f5260205f20905b815481529060010190602001808311612da857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612e3057612e3061547b565b14158015612e515750600181516005811115612e4e57612e4e61547b565b14155b15612e7257805160405163170cc93360e21b81526107cb919060040161560d565b600381516005811115612e8757612e8761547b565b03612e955760048152612e9a565b600581525b836008018160200151604051612eb09190615869565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ef457612ef461547b565b021790555060208201516001820190612f0d90826158be565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b0319169190921617905580516005811115612fb257612fb261547b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6110f76001600160a01b038316826142d6565b5f613005612962565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561303e5761303e61547b565b600381111561304f5761304f61547b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091506130c3614369565b82608001516130d291906159d9565b6001600160401b03164210156131065760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b5f848152600684016020908152604080832080546001600160a81b031916815560018101849055600201839055600786019091528120805490829055908082156131c1575f8481526005870160205260409020546127109061317390600160a01b900461ffff16856159c2565b61317d9190615aab565b915081866008015f8681526020019081526020015f205f8282546131a1919061598d565b909155506131b190508284615c4e565b90506131c18560200151826129d1565b6131d685602001516112228760600151611492565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461325357835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016107cb565b5f805b60028110156132a25761326a816001615c4e565b6132759060086159c2565b61ffff1686828151811061328b5761328b6156b8565b016020015160f81c901b9190911790600101613256565b5061ffff8116156132cc5760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b6004811015613327576132e3816003615c4e565b6132ee9060086159c2565b63ffffffff168761330083600261598d565b81518110613310576133106156b8565b016020015160f81c901b91909117906001016132cf565b5063ffffffff811660031461334f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133a45761336681601f615c4e565b6133719060086159c2565b8861337d83600661598d565b8151811061338d5761338d6156b8565b016020015160f81c901b9190911790600101613352565b505f805b6008811015613403576133bc816007615c4e565b6133c79060086159c2565b6001600160401b0316896133dc83602661598d565b815181106133ec576133ec6156b8565b016020015160f81c901b91909117906001016133a8565b505f805b60088110156134625761341b816007615c4e565b6134269060086159c2565b6001600160401b03168a61343b83602e61598d565b8151811061344b5761344b6156b8565b016020015160f81c901b9190911790600101613407565b5091989097509095509350505050565b5f8082516027146134a857825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016107cb565b5f805b60028110156134f7576134bf816001615c4e565b6134ca9060086159c2565b61ffff168582815181106134e0576134e06156b8565b016020015160f81c901b91909117906001016134ab565b5061ffff8116156135215760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b600481101561357c57613538816003615c4e565b6135439060086159c2565b63ffffffff168661355583600261598d565b81518110613565576135656156b8565b016020015160f81c901b9190911790600101613524565b5063ffffffff81166002146135a457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135f9576135bb81601f615c4e565b6135c69060086159c2565b876135d283600661598d565b815181106135e2576135e26156b8565b016020015160f81c901b91909117906001016135a7565b505f8660268151811061360e5761360e6156b8565b016020015191976001600160f81b03199092161515965090945050505050565b5f80613638612962565b600281015490915061ffff600160401b90910481169086161080613661575061271061ffff8616115b1561368557604051635f12e6c360e11b815261ffff861660048201526024016107cb565b60028101546001600160401b0390811690851610156136c1576040516202a06d60e11b81526001600160401b03851660048201526024016107cb565b80548310806136d35750806001015483115b156136f45760405163222d164360e21b8152600481018490526024016107cb565b825f6136ff826110fb565b90505f61370c8983614384565b90506040518060c001604052806137203390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f6060808801829052608080890183905260a09889018390528a83526005909d0185529082902088518154958a0151938a01518516600160b01b0267ffffffffffffffff60b01b1994909716600160a01b026001600160b01b03199096169716969096179390931716929092178355840151600190920180549885015194909301518116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990991692909116919091179690961791909116949094179093555090915050949350505050565b6138286148e1565b6112348161492c565b5f8061383b612962565b90505f613847846110fb565b90505f61385387611cdc565b905061385e876126a1565b61387e576040516330efa98b60e01b8152600481018890526024016107cb565b6002815160058111156138935761389361547b565b146138b457805160405163170cc93360e21b81526107cb919060040161560d565b5f8282608001516138c591906159d9565b905083600201600a9054906101000a90046001600160401b031682604001516138ee9190615a47565b6001600160401b0316816001600160401b0316111561392b57604051636d51fe0560e11b81526001600160401b03821660048201526024016107cb565b5f806139378a84613b03565b915091505f8a8360405160200161396592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156139f8576139f861547b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f805f613b0e6121c1565b5f868152600782016020526040902060020154909150600160801b90046001600160401b0316613b3e85826149a0565b5f613b4887614bc5565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613b988a858b6121e5565b6040518263ffffffff1660e01b8152600401613bb4919061561b565b6020604051808303815f875af1158015613bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bf4919061562d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f80613c57612962565b90505f613c678460400151611cdc565b90505f600382516005811115613c7f57613c7f61547b565b1480613c9d5750600482516005811115613c9b57613c9b61547b565b145b15613cad575060c0810151613cea565b600282516005811115613cc257613cc261547b565b03613cce575042613cea565b815160405163170cc93360e21b81526107cb919060040161560d565b84608001516001600160401b0316816001600160401b031611613d1157505f949350505050565b6040808601515f90815260058501602052206001015460a0830151613d40916001600160401b03169083612986565b613d4e57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613d7390611492565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b168152613dc59493929188916001600160401b0390911690600401615a19565b602060405180830381865afa158015613de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e04919061562d565b95945050505050565b5f808251602e14613e4357825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016107cb565b5f805b6002811015613e9257613e5a816001615c4e565b613e659060086159c2565b61ffff16858281518110613e7b57613e7b6156b8565b016020015160f81c901b9190911790600101613e46565b5061ffff811615613ebc5760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b6004811015613f1757613ed3816003615c4e565b613ede9060086159c2565b63ffffffff1686613ef083600261598d565b81518110613f0057613f006156b8565b016020015160f81c901b9190911790600101613ebf565b5063ffffffff811615613f3d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613f9257613f5481601f615c4e565b613f5f9060086159c2565b87613f6b83600661598d565b81518110613f7b57613f7b6156b8565b016020015160f81c901b9190911790600101613f40565b505f805b6008811015613ff157613faa816007615c4e565b613fb59060086159c2565b6001600160401b031688613fca83602661598d565b81518110613fda57613fda6156b8565b016020015160f81c901b9190911790600101613f96565b5090969095509350505050565b61400661526d565b5f61400f6121c1565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff1660058111156140485761404861547b565b60058111156140595761405961547b565b815260200160018201805461406d906155db565b80601f0160208091040260200160405190810160405280929190818152602001828054614099906155db565b80156140e45780601f106140bb576101008083540402835291602001916140e4565b820191905f5260205f20905b8154815290600101906020018083116140c757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156141525761415261547b565b14614185575f8481526007830160205260409081902054905163170cc93360e21b81526107cb9160ff169060040161560d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156141c9576141c961547b565b0217905550602082015160018201906141e290826158be565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f61427f8582613b03565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156142f9573060405163cd78605960e01b81526004016107cb91906153a3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614342576040519150601f19603f3d011682016040523d82523d5f602084013e614347565b606091505b505090508061064a57604051630a12f52160e11b815260040160405180910390fd5b5f6143726121c1565b600101546001600160401b0316919050565b5f61438d6121c1565b6009015460ff166143b157604051637fab81e560e01b815260040160405180910390fd5b5f6143ba6121c1565b9050426143cd60608601604087016153e6565b6001600160401b031611158061440757506143eb6202a3004261598d565b6143fb60608601604087016153e6565b6001600160401b031610155b156144415761441c60608501604086016153e6565b604051635879da1360e11b81526001600160401b0390911660048201526024016107cb565b6144566144516060860186615d0c565b614c2e565b6144666144516080860186615d0c565b60306144756020860186615c61565b9050146144a7576144896020850185615c61565b6040516326475b2f60e11b81526107cb925060040190815260200190565b6144b18480615c61565b90505f036144de576144c38480615c61565b604051633e08a12560e11b81526004016107cb929190615d20565b5f600882016144ed8680615c61565b6040516144fb929190615b62565b90815260200160405180910390205414614534576145198480615c61565b60405163a41f772f60e01b81526004016107cb929190615d20565b61453e835f6149a0565b6040805160e08101909152815481525f90819061464a90602081016145638980615c61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906145ab908a018a615c61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016145f460608a0160408b016153e6565b6001600160401b0316815260200161460f60608a018a615d0c565b61461890615d4e565b815260200161462a60808a018a615d0c565b61463390615d4e565b8152602001876001600160401b0316815250614d97565b5f8281526006860160205260409020919350915061466882826158be565b5081600884016146788880615c61565b604051614686929190615b62565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906146c290859060040161561b565b6020604051808303815f875af11580156146de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614702919061562d565b6040805160e0810190915290915080600181526020016147228980615c61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156147b1576147b161547b565b0217905550602082015160018201906147ca90826158be565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b03191691909216179055806148678880615c61565b604051614875929190615b62565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906148b391906153e6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661492a57604051631afcd79f60e31b815260040160405180910390fd5b565b6149346148e1565b61493d81614f84565b614945614f9d565b6112346060820135608083013561496260c0850160a086016153e6565b61497260e0860160c08701615e15565b614983610100870160e08801615e2e565b61010087013561499b61014089016101208a01615658565b614fad565b5f6149a96121c1565b90505f826001600160401b0316846001600160401b031611156149d7576149d083856159f9565b90506149e4565b6149e184846159f9565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614a46575060018401548151614a42916001600160401b03169061598d565b8210155b15614a6c576001600160401b038316606082015281815260408101516020820152614a8b565b8281606001818151614a7e91906159d9565b6001600160401b03169052505b6060810151614a9b906064615a47565b602082015160018601546001600160401b039290921691614ac69190600160401b900460ff166159c2565b1015614af657606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016107cb565b856001600160401b031681604001818151614b11919061598d565b9052506040810180516001600160401b0387169190614b31908390615c4e565b90525060018401546040820151606491614b5691600160401b90910460ff16906159c2565b1015614b7d578060400151604051635943317f60e01b81526004016107cb91815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f80614bcf6121c1565b5f8481526007820160205260409020600201805491925090600890614c0390600160401b90046001600160401b0316615e4e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614c3b60208201826153b7565b63ffffffff16158015614c5b5750614c566020820182615673565b151590505b15614ca257614c6d60208201826153b7565b614c7a6020830183615673565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016107cb565b614caf6020820182615673565b9050614cbe60208301836153b7565b63ffffffff161115614cd757614c6d60208201826153b7565b60015b614ce76020830183615673565b90508110156110f757614cfd6020830183615673565b614d08600184615c4e565b818110614d1757614d176156b8565b9050602002016020810190614d2c9190615658565b6001600160a01b0316614d426020840184615673565b83818110614d5257614d526156b8565b9050602002016020810190614d679190615658565b6001600160a01b03161015614d8f57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614cda565b5f6060826040015151603014614dc05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614e01988a986001989297929690959094909390929101615e69565b60405160208183030381529060405290505f5b84608001516020015151811015614e7357818560800151602001518281518110614e4057614e406156b8565b6020026020010151604051602001614e59929190615f23565b60408051601f198184030181529190529150600101614e14565b5060a0840151805160209182015151604051614e93938593929101615f54565b60405160208183030381529060405290505f5b8460a001516020015151811015614f0557818560a00151602001518281518110614ed257614ed26156b8565b6020026020010151604051602001614eeb929190615f23565b60408051601f198184030181529190529150600101614ea6565b5060c0840151604051614f1c918391602001615f8f565b6040516020818303038152906040529050600281604051614f3d9190615869565b602060405180830381855afa158015614f58573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f7b919061562d565b94909350915050565b614f8c6148e1565b614f94615143565b6112348161514b565b614fa56148e1565b61492a61522e565b614fb56148e1565b5f614fbe612962565b905061ffff85161580614fd6575061271061ffff8616115b15614ffa57604051635f12e6c360e11b815261ffff861660048201526024016107cb565b8688111561501e5760405163222d164360e21b8152600481018990526024016107cb565b60ff841615806150315750600a60ff8516115b156150545760405163170db35960e31b815260ff851660048201526024016107cb565b61505c614369565b6001600160401b0316866001600160401b03161015615098576040516202a06d60e11b81526001600160401b03871660048201526024016107cb565b825f036150b85760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61492a6148e1565b6151536148e1565b5f61515c6121c1565b82358155905060146151746060840160408501615e2e565b60ff161180615193575061518e6060830160408401615e2e565b60ff16155b156151c7576151a86060830160408401615e2e565b604051634a59bbff60e11b815260ff90911660048201526024016107cb565b6151d76060830160408401615e2e565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561520860408301602084016153e6565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b612a2f6148e1565b508054615242906155db565b5f825580601f10615251575050565b601f0160209004905f5260205f209081019061123491906152aa565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156152be575f81556001016152ab565b5090565b8015158114611234575f80fd5b803563ffffffff81168114611cd7575f80fd5b5f805f606084860312156152f4575f80fd5b833592506020840135615306816152c2565b9150615314604085016152cf565b90509250925092565b5f6020828403121561532d575f80fd5b5035919050565b5f8060408385031215615345575f80fd5b82356001600160401b0381111561535a575f80fd5b83016080818603121561536b575f80fd5b9150615379602084016152cf565b90509250929050565b5f8060408385031215615393575f80fd5b82359150615379602084016152cf565b6001600160a01b0391909116815260200190565b5f602082840312156153c7575f80fd5b6118da826152cf565b80356001600160401b0381168114611cd7575f80fd5b5f602082840312156153f6575f80fd5b6118da826153d0565b803561ffff81168114611cd7575f80fd5b5f805f60608486031215615422575f80fd5b83356001600160401b03811115615437575f80fd5b840160a08187031215615448575f80fd5b9250615456602085016153ff565b9150615314604085016153d0565b5f6101408284031215615475575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061549f5761549f61547b565b9052565b5f5b838110156154bd5781810151838201526020016154a5565b50505f910152565b5f81518084526154dc8160208601602086016154a3565b601f01601f19169290920160200192915050565b6020815261550260208201835161548f565b5f602083015160e0604084015261551d6101008401826154c5565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615581575f80fd5b82356001600160401b0380821115615597575f80fd5b818501915085601f8301126155aa575f80fd5b8135818111156155b8575f80fd5b8660208285010111156155c9575f80fd5b60209290920196919550909350505050565b600181811c908216806155ef57607f821691505b60208210810361547557634e487b7160e01b5f52602260045260245ffd5b60208101611149828461548f565b602081525f6118da60208301846154c5565b5f6020828403121561563d575f80fd5b5051919050565b6001600160a01b0381168114611234575f80fd5b5f60208284031215615668575f80fd5b81356118da81615644565b5f808335601e19843603018112615688575f80fd5b8301803591506001600160401b038211156156a1575f80fd5b6020019150600581901b3603821315613c46575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156e0575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615720576157206156ea565b60405290565b604080519081016001600160401b0381118282101715615720576157206156ea565b604051601f8201601f191681016001600160401b0381118282101715615770576157706156ea565b604052919050565b5f6001600160401b03821115615790576157906156ea565b50601f01601f191660200190565b5f82601f8301126157ad575f80fd5b81356157c06157bb82615778565b615748565b8181528460208386010111156157d4575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615800575f80fd5b6158086156fe565b82356001600160401b038082111561581e575f80fd5b61582a3683870161579e565b8352602085013591508082111561583f575f80fd5b5061584c3682860161579e565b60208301525061585e604084016153d0565b604082015292915050565b5f82516156e08184602087016154a3565b601f82111561064a57805f5260205f20601f840160051c8101602085101561589f5750805b601f840160051c820191505b81811015611ab8575f81556001016158ab565b81516001600160401b038111156158d7576158d76156ea565b6158eb816158e584546155db565b8461587a565b602080601f83116001811461591e575f84156159075750858301515b5f19600386901b1c1916600185901b17855561135b565b5f85815260208120601f198616915b8281101561594c5788860151825594840194600190910190840161592d565b508582101561596957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561114957611149615979565b5f63ffffffff8083168181036159b8576159b8615979565b6001019392505050565b808202811582820484141761114957611149615979565b6001600160401b0381811683821601908082111561233857612338615979565b6001600160401b0382811682821603908082111561233857612338615979565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615979565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680615a9f57615a9f615a72565b92169190910492915050565b5f82615ab957615ab9615a72565b500490565b6020810160048310615ad257615ad261547b565b91905290565b5f60208083525f8454615aea816155db565b806020870152604060018084165f8114615b0b5760018114615b2757615b54565b60ff19851660408a0152604084151560051b8a01019550615b54565b895f5260205f205f5b85811015615b4b5781548b8201860152908301908801615b30565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b8051611cd7816152c2565b5f8060408385031215615b8d575f80fd5b82516001600160401b0380821115615ba3575f80fd5b9084019060608287031215615bb6575f80fd5b615bbe6156fe565b82518152602080840151615bd181615644565b82820152604084015183811115615be6575f80fd5b80850194505087601f850112615bfa575f80fd5b83519250615c0a6157bb84615778565b8381528882858701011115615c1d575f80fd5b615c2c848383018488016154a3565b80604084015250819550615c41818801615b71565b9450505050509250929050565b8181038181111561114957611149615979565b5f808335601e19843603018112615c76575f80fd5b8301803591506001600160401b03821115615c8f575f80fd5b602001915036819003821315613c46575f80fd5b5f8851615cb4818460208d016154a3565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e198336030181126156e0575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d5e575f80fd5b615d66615726565b615d6f836152cf565b81526020808401356001600160401b0380821115615d8b575f80fd5b9085019036601f830112615d9d575f80fd5b813581811115615daf57615daf6156ea565b8060051b9150615dc0848301615748565b8181529183018401918481019036841115615dd9575f80fd5b938501935b83851015615e035784359250615df383615644565b8282529385019390850190615dde565b94860194909452509295945050505050565b5f60208284031215615e25575f80fd5b6118da826153ff565b5f60208284031215615e3e575f80fd5b813560ff811681146118da575f80fd5b5f6001600160401b038083168181036159b8576159b8615979565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615eaf81602a850160208b016154a3565b865190830190615ec681602a840160208b016154a3565b60c087901b6001600160c01b031916602a9290910191820152615ef8603282018660e01b6001600160e01b0319169052565b615f11603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f348184602088016154a3565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451615f658184602089016154a3565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615fa08184602088016154a3565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615fdf380380615fdf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e928061014d5f395ff3fe6080604052600436106101cb575f3560e01c806380dd672f116100f5578063ba3a4b971161008e578063ba3a4b9714610525578063bc5fbfec14610544578063bee0a03f14610577578063c257a0f514610596578063c599e24f146105b5578063c974d1b6146105c8578063d5f20ff6146105dc578063df93d8de14610608578063fd7ac5e71461061e575f80fd5b806380dd672f146104405780638280a25a1461045f57806393e2459814610473578063a3a65e4814610492578063a9778a7a14610314578063af2f5feb146104b1578063afb98096146104c4578063afba878a146104f7578063b771b3bc1461050b575f80fd5b806335455ded1161016757806335455ded146103145780633a1cfff61461033c578063467ef06f1461035b57806360305d621461037a57806360ad7784146103a357806362065856146103c257806366435abf146103ef578063732214f81461040e57806376f7862114610421575f80fd5b80630118acc4146101cf5780630322ed98146101f0578063151d30d11461020f5780631ec447241461023a57806320d91b7a1461025957806325e1c776146102785780632893d077146102975780632e2194d8146102b6578063329c3e12146102ed575b5f80fd5b3480156101da575f80fd5b506101ee6101e93660046151d4565b61063d565b005b3480156101fb575f80fd5b506101ee61020a36600461520f565b61064f565b34801561021a575f80fd5b50610223600a81565b60405160ff90911681526020015b60405180910390f35b348015610245575f80fd5b506101ee6102543660046151d4565b61085b565b348015610264575f80fd5b506101ee610273366004615226565b610867565b348015610283575f80fd5b506101ee610292366004615274565b610d65565b3480156102a2575f80fd5b506101ee6102b1366004615274565b610dd9565b3480156102c1575f80fd5b506102d56102d036600461520f565b61105a565b6040516001600160401b039091168152602001610231565b3480156102f8575f80fd5b506103076001600160991b0181565b6040516102319190615295565b34801561031f575f80fd5b5061032961271081565b60405161ffff9091168152602001610231565b348015610347575f80fd5b506101ee6103563660046151d4565b6110ae565b348015610366575f80fd5b506101ee6103753660046152a9565b6110ba565b348015610385575f80fd5b5061038e601481565b60405163ffffffff9091168152602001610231565b3480156103ae575f80fd5b506101ee6103bd366004615274565b611196565b3480156103cd575f80fd5b506103e16103dc3660046152d8565b6113f1565b604051908152602001610231565b3480156103fa575f80fd5b506102d561040936600461520f565b611411565b348015610419575f80fd5b506103e15f81565b34801561042c575f80fd5b506101ee61043b3660046151d4565b611425565b34801561044b575f80fd5b506101ee61045a366004615274565b611432565b34801561046a575f80fd5b50610223603081565b34801561047e575f80fd5b506101ee61048d36600461520f565b6115ed565b34801561049d575f80fd5b506101ee6104ac3660046152a9565b611694565b6103e16104bf366004615302565b61181a565b3480156104cf575f80fd5b506103e17f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b348015610502575f80fd5b50610223605081565b348015610516575f80fd5b506103076005600160991b0181565b348015610530575f80fd5b506101ee61053f36600461520f565b611840565b34801561054f575f80fd5b506103e17fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b348015610582575f80fd5b506101ee61059136600461520f565b611a1e565b3480156105a1575f80fd5b506101ee6105b0366004615356565b611b3b565b6103e16105c336600461520f565b611c18565b3480156105d3575f80fd5b50610223601481565b3480156105e7575f80fd5b506105fb6105f636600461520f565b611c3b565b60405161023191906153e2565b348015610613575f80fd5b506102d56202a30081565b348015610629575f80fd5b506103e1610638366004615462565b611d7d565b61064a8383836001611db5565b505050565b5f610658612120565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff1660058111156106915761069161536d565b60058111156106a2576106a261536d565b81526020016001820180546106b6906154cd565b80601f01602080910402602001604051908101604052809291908181526020018280546106e2906154cd565b801561072d5780601f106107045761010080835404028352916020019161072d565b820191905f5260205f20905b81548152906001019060200180831161071057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107985761079861536d565b146107d4575f8381526007830160205260409081902054905163170cc93360e21b81526107cb9160ff16906004016154ff565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107f98584606001515f612144565b6040518263ffffffff1660e01b8152600401610815919061550d565b6020604051808303815f875af1158015610831573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610855919061551f565b50505050565b61064a8383835f611db5565b5f610870612120565b600981015490915060ff161561089957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610900919061551f565b836020013514610929576040516372b0a7e760e11b8152602084013560048201526024016107cb565b3061093a606085016040860161554a565b6001600160a01b03161461097257610958606084016040850161554a565b604051632f88120d60e21b81526004016107cb9190615295565b5f6109806060850185615565565b905090505f805b828163ffffffff161015610c67575f6109a36060880188615565565b8363ffffffff168181106109b9576109b96155aa565b90506020028101906109cb91906155be565b6109d4906156e2565b80516040519192505f9160088801916109ec9161575b565b90815260200160405180910390205414610a1c57805160405163a41f772f60e01b81526107cb919060040161550d565b5f6002885f013584604051602001610a4b92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a659161575b565b602060405180830381855afa158015610a80573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa3919061551f565b90508086600801835f0151604051610abb919061575b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b3d57610b3d61536d565b021790555060208201516001820190610b5690826157b0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610bfa91168561587f565b8251604051919550610c0b9161575b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c6090615892565b9050610987565b50600483018190556001830154606490610c8b90600160401b900460ff16836158b4565b1015610cad57604051635943317f60e01b8152600481018290526024016107cb565b5f610cc3610cba86612193565b6040015161229e565b90505f610ccf8761242b565b90505f600282604051610ce2919061575b565b602060405180830381855afa158015610cfd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d20919061551f565b9050828114610d4c57604051631872fc8d60e01b815260048101829052602481018490526044016107cb565b5050506009909201805460ff1916600117905550505050565b610d6e82612600565b610d8e576040516330efa98b60e01b8152600481018390526024016107cb565b5f610d9883611c3b565b5190506002816005811115610daf57610daf61536d565b14610dcf578060405163170cc93360e21b81526004016107cb91906154ff565b6108558383612629565b610de1612877565b5f610dea6128c1565b90505f610df684611c3b565b9050600281516005811115610e0d57610e0d61536d565b14610e2e57805160405163170cc93360e21b81526107cb91906004016154ff565b610e3784612600565b610e57576040516330efa98b60e01b8152600481018590526024016107cb565b5f8481526005830160205260409020546001600160a01b03163314610e9257335b604051636e2ccd7560e11b81526004016107cb9190615295565b5f84815260058301602052604090205460a08201514291610ec491600160b01b9091046001600160401b0316906158cb565b6001600160401b0316816001600160401b03161015610f015760405163fb6ce63f60e01b81526001600160401b03821660048201526024016107cb565b5f610f0c8686612629565b9050610f1d818460a00151846128e5565b610f3d57604051635bff683f60e11b8152600481018790526024016107cb565b600484015460408401515f916001600160a01b031690634f22429f90610f62906113f1565b60a08701516040516001600160e01b031960e085901b168152610f8f9291908190899089906004016158eb565b602060405180830381865afa158015610faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fce919061551f565b5f88815260058701602052604081206002015491925090610fef9083615919565b5f8981526005880160205260409020600281018490555490915061101c906001600160a01b031682612930565b604051819089907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a350505050505061105661298e565b5050565b5f806110646128c1565b60030154611072908461592c565b905080158061108757506001600160401b0381115b156110a85760405163222d164360e21b8152600481018490526024016107cb565b92915050565b61064a8383835f6129b4565b6110c2612877565b5f6110cb6128c1565b90505f806110d884612bd5565b915091506110e582612600565b6110f15750505061118b565b5f8281526005840160205260409020546001600160a01b031660048251600581111561111f5761111f61536d565b03611170575f838152600885016020526040812080549190556111428282612930565b604051819085907f69eb3dd96029877a7561d5b5076810e0b53b223c9ab46cba8efd028ebf08fe9a905f90a3505b6111868161118184604001516113f1565b612f0f565b505050505b61119361298e565b50565b5f61119f6128c1565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156111d8576111d861536d565b60038111156111e9576111e961536d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61125f82611c3b565b90506001835160038111156112765761127661536d565b14611297578251604051633b0d540d60e21b81526107cb919060040161594b565b6004815160058111156112ac576112ac61536d565b036112c2576112ba86612f22565b505050505050565b5f806112d96112d088612193565b60400151613142565b509150915081841461130657846040015160405163089938b360e11b81526004016107cb91815260200190565b806001600160401b031683606001516001600160401b0316108061133f5750806001600160401b03168560a001516001600160401b0316115b1561136857604051632e19bc2d60e11b81526001600160401b03821660048201526024016107cb565b5f888152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6113fa6128c1565b600301546110a8906001600160401b0384166158b4565b5f61141b82611c3b565b6080015192915050565b61064a83838360016129b4565b61143a612877565b5f6114436128c1565b5f848152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561147c5761147c61536d565b600381111561148d5761148d61536d565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115065761150661536d565b14611527578051604051633b0d540d60e21b81526107cb919060040161594b565b60046115368260400151611c3b565b5160058111156115485761154861536d565b146115da575f61155784612193565b90505f806115688360400151613142565b5091509150818460400151146115945760405163089938b360e11b8152600481018390526024016107cb565b806001600160401b03168460c001516001600160401b031611156115d657604051632e19bc2d60e11b81526001600160401b03821660048201526024016107cb565b5050505b6115e384612f22565b505061105661298e565b5f6115f66128c1565b90505f61160283611c3b565b51905060048160058111156116195761161961536d565b14611639578060405163170cc93360e21b81526004016107cb91906154ff565b5f8381526005830160205260409020546001600160a01b0316331461165e5733610e78565b5f83815260088301602090815260408083208054908490556005860190925290912054610855906001600160a01b031682612930565b5f61169d612120565b90505f806116b66116ad85612193565b60400151613398565b91509150806116dc57604051632d07135360e01b815281151560048201526024016107cb565b5f828152600684016020526040902080546116f6906154cd565b90505f0361171a5760405163089938b360e11b8152600481018390526024016107cb565b60015f83815260078501602052604090205460ff1660058111156117405761174061536d565b14611773575f8281526007840160205260409081902054905163170cc93360e21b81526107cb9160ff16906004016154ff565b5f828152600684016020526040812061178b91615128565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611823612877565b61182f84848434613554565b905061183961298e565b9392505050565b5f6118496128c1565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156118825761188261536d565b60038111156118935761189361536d565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561190c5761190c61536d565b1415801561192d575060038151600381111561192a5761192a61536d565b14155b1561194e578051604051633b0d540d60e21b81526107cb919060040161594b565b5f61195c8260400151611c3b565b905080606001516001600160401b03165f0361198e576040516339b894f960e21b8152600481018590526024016107cb565b6005600160991b016001600160a01b031663ee5b48eb6119bb846040015184606001518560800151612144565b6040518263ffffffff1660e01b81526004016119d7919061550d565b6020604051808303815f875af11580156119f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a17919061551f565b5050505050565b5f611a27612120565b5f8381526006820160205260409020805491925090611a45906154cd565b90505f03611a695760405163089938b360e11b8152600481018390526024016107cb565b60015f83815260078301602052604090205460ff166005811115611a8f57611a8f61536d565b14611ac2575f8281526007820160205260409081902054905163170cc93360e21b81526107cb9160ff16906004016154ff565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611afb9190600401615965565b6020604051808303815f875af1158015611b17573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a919061551f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b84575080546001600160401b03808416911610155b15611ba25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bcc83613712565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611c21612877565b611c2c823334613723565b9050611c3661298e565b919050565b611c4361515f565b5f611c4c612120565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff166005811115611c8357611c8361536d565b6005811115611c9457611c9461536d565b8152602001600182018054611ca8906154cd565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd4906154cd565b8015611d1f5780601f10611cf657610100808354040283529160200191611d1f565b820191905f5260205f20905b815481529060010190602001808311611d0257829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b5f80611d87612120565b9050806008018484604051611d9d9291906159ef565b90815260200160405180910390205491505092915050565b5f611dbe6128c1565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611df757611df761536d565b6003811115611e0857611e0861536d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e7e82611c3b565b9050600283516003811115611e9557611e9561536d565b14611eb6578251604051633b0d540d60e21b81526107cb919060040161594b565b60208301516001600160a01b03163314611f52575f8281526005850160205260409020546001600160a01b03163314611eef5733610e78565b5f82815260058501602052604090205460a0820151611f1e91600160b01b90046001600160401b0316906158cb565b6001600160401b0316421015611f525760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b600281516005811115611f6757611f6761536d565b036120b95760028401546080840151611f89916001600160401b0316906158cb565b6001600160401b0316421015611fbd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b8615611fcf57611fcd8287612629565b505b5f8881526006850160205260409020805460ff191660031790556060830151608082015161200891849161200391906159fe565b6139f5565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561204984613b3f565b9050858015612056575080155b1561207757604051631036cf9160e11b8152600481018a90526024016107cb565b5f8981526007860160205260408082208390555184918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a350612116565b6004815160058111156120ce576120ce61536d565b036120fa576120dc83613b3f565b5f8981526007860160205260409020556120f588612f22565b612116565b805160405163170cc93360e21b81526107cb91906004016154ff565b5050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156121f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261221e9190810190615a29565b915091508061224057604051636b2f19e960e01b815260040160405180910390fd5b815115612266578151604051636ba589a560e01b815260048101919091526024016107cb565b60208201516001600160a01b031615612297578160200151604051624de75d60e31b81526004016107cb9190615295565b5092915050565b5f81516026146122d357815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016107cb565b5f805b6002811015612322576122ea816001615919565b6122f59060086158b4565b61ffff1684828151811061230b5761230b6155aa565b016020015160f81c901b91909117906001016122d6565b5061ffff81161561234c5760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b60048110156123a757612363816003615919565b61236e9060086158b4565b63ffffffff168561238083600261587f565b81518110612390576123906155aa565b016020015160f81c901b919091179060010161234f565b5063ffffffff8116156123cd57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612422576123e481601f615919565b6123ef9060086158b4565b866123fb83600661587f565b8151811061240b5761240b6155aa565b016020015160f81c901b91909117906001016123d0565b50949350505050565b60605f808335602085013560146124478787016040890161554a565b6124546060890189615565565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6124d56060850185615565565b905081101561229757816124ec6060860186615565565b838181106124fc576124fc6155aa565b905060200281019061250e91906155be565b6125189080615afb565b90506125276060870187615565565b84818110612537576125376155aa565b905060200281019061254991906155be565b6125539080615afb565b6125606060890189615565565b86818110612570576125706155aa565b905060200281019061258291906155be565b612590906020810190615afb565b61259d60608b018b615565565b888181106125ad576125ad6155aa565b90506020028101906125bf91906155be565b6125d09060608101906040016152d8565b6040516020016125e69796959493929190615b3d565b60408051601f1981840301815291905291506001016124c8565b5f8061260a6128c1565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612674573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261269b9190810190615a29565b91509150806126bd57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612700573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612724919061551f565b82511461274a578151604051636ba589a560e01b815260048101919091526024016107cb565b60208201516001600160a01b03161561277b578160200151604051624de75d60e31b81526004016107cb9190615295565b5f8061278a8460400151613cff565b915091508187146127b15760405163089938b360e11b8152600481018890526024016107cb565b5f6127ba6128c1565b5f8981526005820160205260409020600101549091506001600160401b03908116908316111561284d575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261286c565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016128bb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f60506128f284846159fe565b6128fc9190615ba6565b6001600160401b0316612910856064615ba6565b6001600160401b0316101561292657505f611839565b5060019392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561297c575f80fd5b505af11580156112ba573d5f803e3d5ffd5b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f6129bd6128c1565b90505f6129c986613ef0565b90506129d486612600565b6129df575050610855565b5f8681526005830160205260409020546001600160a01b03163314612a045733610e78565b5f86815260058301602052604090205460a0820151612a3391600160b01b90046001600160401b0316906158cb565b6001600160401b03168160c001516001600160401b03161015612a7a5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016107cb565b5f8515612a9257612a8b8786612629565b9050612ab0565b505f8681526005830160205260409020600101546001600160401b03165b838015612acd5750612acb818360a001518460c001516128e5565b155b15612aee57604051635bff683f60e11b8152600481018890526024016107cb565b600483015460408301515f916001600160a01b031690634f22429f90612b13906113f1565b60a086015160c08701516040516001600160e01b031960e086901b168152612b43939291829189906004016158eb565b602060405180830381865afa158015612b5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b82919061551f565b5f898152600586016020526040902060020154909150612ba29082615919565b905080846008015f8a81526020019081526020015f205f828254612bc6919061587f565b90915550505050505050505050565b5f612bde61515f565b5f612be7612120565b90505f80612bf76116ad87612193565b915091508015612c1e57604051632d07135360e01b815281151560048201526024016107cb565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612c4f57612c4f61536d565b6005811115612c6057612c6061536d565b8152602001600182018054612c74906154cd565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca0906154cd565b8015612ceb5780601f10612cc257610100808354040283529160200191612ceb565b820191905f5260205f20905b815481529060010190602001808311612cce57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612d5657612d5661536d565b14158015612d775750600181516005811115612d7457612d7461536d565b14155b15612d9857805160405163170cc93360e21b81526107cb91906004016154ff565b600381516005811115612dad57612dad61536d565b03612dbb5760048152612dc0565b600581525b836008018160200151604051612dd6919061575b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612e1a57612e1a61536d565b021790555060208201516001820190612e3390826157b0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b0319169190921617905580516005811115612ed857612ed861536d565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6110566001600160a01b038316826141c8565b5f612f2b6128c1565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f6457612f6461536d565b6003811115612f7557612f7561536d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fe961425b565b8260800151612ff891906158cb565b6001600160401b031642101561302c5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016107cb565b5f848152600684016020908152604080832080546001600160a81b031916815560018101849055600201839055600786019091528120805490829055908082156130e7575f8481526005870160205260409020546127109061309990600160a01b900461ffff16856158b4565b6130a3919061592c565b915081866008015f8681526020019081526020015f205f8282546130c7919061587f565b909155506130d790508284615919565b90506130e7856020015182612930565b6130fc856020015161118187606001516113f1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461317957835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016107cb565b5f805b60028110156131c857613190816001615919565b61319b9060086158b4565b61ffff168682815181106131b1576131b16155aa565b016020015160f81c901b919091179060010161317c565b5061ffff8116156131f25760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b600481101561324d57613209816003615919565b6132149060086158b4565b63ffffffff168761322683600261587f565b81518110613236576132366155aa565b016020015160f81c901b91909117906001016131f5565b5063ffffffff811660031461327557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132ca5761328c81601f615919565b6132979060086158b4565b886132a383600661587f565b815181106132b3576132b36155aa565b016020015160f81c901b9190911790600101613278565b505f805b6008811015613329576132e2816007615919565b6132ed9060086158b4565b6001600160401b03168961330283602661587f565b81518110613312576133126155aa565b016020015160f81c901b91909117906001016132ce565b505f805b600881101561338857613341816007615919565b61334c9060086158b4565b6001600160401b03168a61336183602e61587f565b81518110613371576133716155aa565b016020015160f81c901b919091179060010161332d565b5091989097509095509350505050565b5f8082516027146133ce57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016107cb565b5f805b600281101561341d576133e5816001615919565b6133f09060086158b4565b61ffff16858281518110613406576134066155aa565b016020015160f81c901b91909117906001016133d1565b5061ffff8116156134475760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b60048110156134a25761345e816003615919565b6134699060086158b4565b63ffffffff168661347b83600261587f565b8151811061348b5761348b6155aa565b016020015160f81c901b919091179060010161344a565b5063ffffffff81166002146134ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561351f576134e181601f615919565b6134ec9060086158b4565b876134f883600661587f565b81518110613508576135086155aa565b016020015160f81c901b91909117906001016134cd565b505f86602681518110613534576135346155aa565b016020015191976001600160f81b03199092161515965090945050505050565b5f8061355e6128c1565b600281015490915061ffff600160401b90910481169086161080613587575061271061ffff8616115b156135ab57604051635f12e6c360e11b815261ffff861660048201526024016107cb565b60028101546001600160401b0390811690851610156135e7576040516202a06d60e11b81526001600160401b03851660048201526024016107cb565b80548310806135f95750806001015483115b1561361a5760405163222d164360e21b8152600481018490526024016107cb565b825f6136258261105a565b90505f6136328983614276565b90506040518060a001604052806136463390565b6001600160a01b03908116825261ffff9a8b166020808401919091526001600160401b039a8b166040808501919091525f6060808601829052608095860182905287825260059a909a01835281902085518154938701519287015194166001600160b01b031990931692909217600160a01b91909d16029b909b1767ffffffffffffffff60b01b1916600160b01b918b1691909102178a559481015160018a0180546001600160401b031916919099161790975595909201516002909601959095555091949350505050565b61371a6147d3565b6111938161481e565b5f8061372d6128c1565b90505f6137398461105a565b90505f61374587611c3b565b905061375087612600565b613770576040516330efa98b60e01b8152600481018890526024016107cb565b6002815160058111156137855761378561536d565b146137a657805160405163170cc93360e21b81526107cb91906004016154ff565b5f8282608001516137b791906158cb565b905083600201600a9054906101000a90046001600160401b031682604001516137e09190615ba6565b6001600160401b0316816001600160401b0316111561381d57604051636d51fe0560e11b81526001600160401b03821660048201526024016107cb565b5f806138298a846139f5565b915091505f8a8360405160200161385792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156138ea576138ea61536d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f805f613a00612120565b5f868152600782016020526040902060020154909150600160801b90046001600160401b0316613a308582614892565b5f613a3a87614ab7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613a8a8a858b612144565b6040518263ffffffff1660e01b8152600401613aa6919061550d565b6020604051808303815f875af1158015613ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ae6919061551f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f80613b496128c1565b90505f613b598460400151611c3b565b90505f600382516005811115613b7157613b7161536d565b1480613b8f5750600482516005811115613b8d57613b8d61536d565b145b15613b9f575060c0810151613bdc565b600282516005811115613bb457613bb461536d565b03613bc0575042613bdc565b815160405163170cc93360e21b81526107cb91906004016154ff565b84608001516001600160401b0316816001600160401b031611613c0357505f949350505050565b6040808601515f90815260058501602052206001015460a0830151613c32916001600160401b031690836128e5565b613c4057505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613c65906113f1565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b168152613cb79493929188916001600160401b03909116906004016158eb565b602060405180830381865afa158015613cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cf6919061551f565b95945050505050565b5f808251602e14613d3557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016107cb565b5f805b6002811015613d8457613d4c816001615919565b613d579060086158b4565b61ffff16858281518110613d6d57613d6d6155aa565b016020015160f81c901b9190911790600101613d38565b5061ffff811615613dae5760405163407b587360e01b815261ffff821660048201526024016107cb565b5f805b6004811015613e0957613dc5816003615919565b613dd09060086158b4565b63ffffffff1686613de283600261587f565b81518110613df257613df26155aa565b016020015160f81c901b9190911790600101613db1565b5063ffffffff811615613e2f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613e8457613e4681601f615919565b613e519060086158b4565b87613e5d83600661587f565b81518110613e6d57613e6d6155aa565b016020015160f81c901b9190911790600101613e32565b505f805b6008811015613ee357613e9c816007615919565b613ea79060086158b4565b6001600160401b031688613ebc83602661587f565b81518110613ecc57613ecc6155aa565b016020015160f81c901b9190911790600101613e88565b5090969095509350505050565b613ef861515f565b5f613f01612120565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166005811115613f3a57613f3a61536d565b6005811115613f4b57613f4b61536d565b8152602001600182018054613f5f906154cd565b80601f0160208091040260200160405190810160405280929190818152602001828054613f8b906154cd565b8015613fd65780601f10613fad57610100808354040283529160200191613fd6565b820191905f5260205f20905b815481529060010190602001808311613fb957829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156140445761404461536d565b14614077575f8481526007830160205260409081902054905163170cc93360e21b81526107cb9160ff16906004016154ff565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140bb576140bb61536d565b0217905550602082015160018201906140d490826157b0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f61417185826139f5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156141eb573060405163cd78605960e01b81526004016107cb9190615295565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614234576040519150601f19603f3d011682016040523d82523d5f602084013e614239565b606091505b505090508061064a57604051630a12f52160e11b815260040160405180910390fd5b5f614264612120565b600101546001600160401b0316919050565b5f61427f612120565b6009015460ff166142a357604051637fab81e560e01b815260040160405180910390fd5b5f6142ac612120565b9050426142bf60608601604087016152d8565b6001600160401b03161115806142f957506142dd6202a3004261587f565b6142ed60608601604087016152d8565b6001600160401b031610155b156143335761430e60608501604086016152d8565b604051635879da1360e11b81526001600160401b0390911660048201526024016107cb565b6143486143436060860186615bd1565b614b20565b6143586143436080860186615bd1565b60306143676020860186615afb565b9050146143995761437b6020850185615afb565b6040516326475b2f60e11b81526107cb925060040190815260200190565b6143a38480615afb565b90505f036143d0576143b58480615afb565b604051633e08a12560e11b81526004016107cb929190615be5565b5f600882016143df8680615afb565b6040516143ed9291906159ef565b908152602001604051809103902054146144265761440b8480615afb565b60405163a41f772f60e01b81526004016107cb929190615be5565b614430835f614892565b6040805160e08101909152815481525f90819061453c90602081016144558980615afb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061449d908a018a615afb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016144e660608a0160408b016152d8565b6001600160401b0316815260200161450160608a018a615bd1565b61450a90615c13565b815260200161451c60808a018a615bd1565b61452590615c13565b8152602001876001600160401b0316815250614c89565b5f8281526006860160205260409020919350915061455a82826157b0565b50816008840161456a8880615afb565b6040516145789291906159ef565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145b490859060040161550d565b6020604051808303815f875af11580156145d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145f4919061551f565b6040805160e0810190915290915080600181526020016146148980615afb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156146a3576146a361536d565b0217905550602082015160018201906146bc90826157b0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b03191691909216179055806147598880615afb565b6040516147679291906159ef565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906147a591906152d8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661481c57604051631afcd79f60e31b815260040160405180910390fd5b565b6148266147d3565b61482f81614e76565b614837614e8f565b6111936060820135608083013561485460c0850160a086016152d8565b61486460e0860160c08701615cda565b614875610100870160e08801615cf3565b61010087013561488d61014089016101208a0161554a565b614e9f565b5f61489b612120565b90505f826001600160401b0316846001600160401b031611156148c9576148c283856159fe565b90506148d6565b6148d384846159fe565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614938575060018401548151614934916001600160401b03169061587f565b8210155b1561495e576001600160401b03831660608201528181526040810151602082015261497d565b828160600181815161497091906158cb565b6001600160401b03169052505b606081015161498d906064615ba6565b602082015160018601546001600160401b0392909216916149b89190600160401b900460ff166158b4565b10156149e857606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016107cb565b856001600160401b031681604001818151614a03919061587f565b9052506040810180516001600160401b0387169190614a23908390615919565b90525060018401546040820151606491614a4891600160401b90910460ff16906158b4565b1015614a6f578060400151604051635943317f60e01b81526004016107cb91815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f80614ac1612120565b5f8481526007820160205260409020600201805491925090600890614af590600160401b90046001600160401b0316615d13565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614b2d60208201826152a9565b63ffffffff16158015614b4d5750614b486020820182615565565b151590505b15614b9457614b5f60208201826152a9565b614b6c6020830183615565565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016107cb565b614ba16020820182615565565b9050614bb060208301836152a9565b63ffffffff161115614bc957614b5f60208201826152a9565b60015b614bd96020830183615565565b905081101561105657614bef6020830183615565565b614bfa600184615919565b818110614c0957614c096155aa565b9050602002016020810190614c1e919061554a565b6001600160a01b0316614c346020840184615565565b83818110614c4457614c446155aa565b9050602002016020810190614c59919061554a565b6001600160a01b03161015614c8157604051630dbc8d5f60e31b815260040160405180910390fd5b600101614bcc565b5f6060826040015151603014614cb25760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614cf3988a986001989297929690959094909390929101615d2e565b60405160208183030381529060405290505f5b84608001516020015151811015614d6557818560800151602001518281518110614d3257614d326155aa565b6020026020010151604051602001614d4b929190615de8565b60408051601f198184030181529190529150600101614d06565b5060a0840151805160209182015151604051614d85938593929101615e19565b60405160208183030381529060405290505f5b8460a001516020015151811015614df757818560a00151602001518281518110614dc457614dc46155aa565b6020026020010151604051602001614ddd929190615de8565b60408051601f198184030181529190529150600101614d98565b5060c0840151604051614e0e918391602001615e54565b6040516020818303038152906040529050600281604051614e2f919061575b565b602060405180830381855afa158015614e4a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e6d919061551f565b94909350915050565b614e7e6147d3565b614e86615035565b6111938161503d565b614e976147d3565b61481c615120565b614ea76147d3565b5f614eb06128c1565b905061ffff85161580614ec8575061271061ffff8616115b15614eec57604051635f12e6c360e11b815261ffff861660048201526024016107cb565b86881115614f105760405163222d164360e21b8152600481018990526024016107cb565b60ff84161580614f235750600a60ff8516115b15614f465760405163170db35960e31b815260ff851660048201526024016107cb565b614f4e61425b565b6001600160401b0316866001600160401b03161015614f8a576040516202a06d60e11b81526001600160401b03871660048201526024016107cb565b825f03614faa5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61481c6147d3565b6150456147d3565b5f61504e612120565b82358155905060146150666060840160408501615cf3565b60ff16118061508557506150806060830160408401615cf3565b60ff16155b156150b95761509a6060830160408401615cf3565b604051634a59bbff60e11b815260ff90911660048201526024016107cb565b6150c96060830160408401615cf3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150fa60408301602084016152d8565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b61298e6147d3565b508054615134906154cd565b5f825580601f10615143575050565b601f0160209004905f5260205f2090810190611193919061519c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151b0575f815560010161519d565b5090565b8015158114611193575f80fd5b803563ffffffff81168114611c36575f80fd5b5f805f606084860312156151e6575f80fd5b8335925060208401356151f8816151b4565b9150615206604085016151c1565b90509250925092565b5f6020828403121561521f575f80fd5b5035919050565b5f8060408385031215615237575f80fd5b82356001600160401b0381111561524c575f80fd5b83016080818603121561525d575f80fd5b915061526b602084016151c1565b90509250929050565b5f8060408385031215615285575f80fd5b8235915061526b602084016151c1565b6001600160a01b0391909116815260200190565b5f602082840312156152b9575f80fd5b611839826151c1565b80356001600160401b0381168114611c36575f80fd5b5f602082840312156152e8575f80fd5b611839826152c2565b803561ffff81168114611c36575f80fd5b5f805f60608486031215615314575f80fd5b83356001600160401b03811115615329575f80fd5b840160a0818703121561533a575f80fd5b9250615348602085016152f1565b9150615206604085016152c2565b5f6101408284031215615367575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106153915761539161536d565b9052565b5f5b838110156153af578181015183820152602001615397565b50505f910152565b5f81518084526153ce816020860160208601615395565b601f01601f19169290920160200192915050565b602081526153f4602082018351615381565b5f602083015160e0604084015261540f6101008401826153b7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615473575f80fd5b82356001600160401b0380821115615489575f80fd5b818501915085601f83011261549c575f80fd5b8135818111156154aa575f80fd5b8660208285010111156154bb575f80fd5b60209290920196919550909350505050565b600181811c908216806154e157607f821691505b60208210810361536757634e487b7160e01b5f52602260045260245ffd5b602081016110a88284615381565b602081525f61183960208301846153b7565b5f6020828403121561552f575f80fd5b5051919050565b6001600160a01b0381168114611193575f80fd5b5f6020828403121561555a575f80fd5b813561183981615536565b5f808335601e1984360301811261557a575f80fd5b8301803591506001600160401b03821115615593575f80fd5b6020019150600581901b3603821315613b38575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155d2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615612576156126155dc565b60405290565b604080519081016001600160401b0381118282101715615612576156126155dc565b604051601f8201601f191681016001600160401b0381118282101715615662576156626155dc565b604052919050565b5f6001600160401b03821115615682576156826155dc565b50601f01601f191660200190565b5f82601f83011261569f575f80fd5b81356156b26156ad8261566a565b61563a565b8181528460208386010111156156c6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156f2575f80fd5b6156fa6155f0565b82356001600160401b0380821115615710575f80fd5b61571c36838701615690565b83526020850135915080821115615731575f80fd5b5061573e36828601615690565b602083015250615750604084016152c2565b604082015292915050565b5f82516155d2818460208701615395565b601f82111561064a57805f5260205f20601f840160051c810160208510156157915750805b601f840160051c820191505b81811015611a17575f815560010161579d565b81516001600160401b038111156157c9576157c96155dc565b6157dd816157d784546154cd565b8461576c565b602080601f831160018114615810575f84156157f95750858301515b5f19600386901b1c1916600185901b1785556112ba565b5f85815260208120601f198616915b8281101561583e5788860151825594840194600190910190840161581f565b508582101561585b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808201808211156110a8576110a861586b565b5f63ffffffff8083168181036158aa576158aa61586b565b6001019392505050565b80820281158282048414176110a8576110a861586b565b6001600160401b038181168382160190808211156122975761229761586b565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b818103818111156110a8576110a861586b565b5f8261594657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061595f5761595f61536d565b91905290565b5f60208083525f8454615977816154cd565b806020870152604060018084165f811461599857600181146159b4576159e1565b60ff19851660408a0152604084151560051b8a010195506159e1565b895f5260205f205f5b858110156159d85781548b82018601529083019088016159bd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156122975761229761586b565b8051611c36816151b4565b5f8060408385031215615a3a575f80fd5b82516001600160401b0380821115615a50575f80fd5b9084019060608287031215615a63575f80fd5b615a6b6155f0565b82518152602080840151615a7e81615536565b82820152604084015183811115615a93575f80fd5b80850194505087601f850112615aa7575f80fd5b83519250615ab76156ad8461566a565b8381528882858701011115615aca575f80fd5b615ad984838301848801615395565b80604084015250819550615aee818801615a1e565b9450505050509250929050565b5f808335601e19843603018112615b10575f80fd5b8301803591506001600160401b03821115615b29575f80fd5b602001915036819003821315613b38575f80fd5b5f8851615b4e818460208d01615395565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615bc957615bc961586b565b505092915050565b5f8235603e198336030181126155d2575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615c23575f80fd5b615c2b615618565b615c34836151c1565b81526020808401356001600160401b0380821115615c50575f80fd5b9085019036601f830112615c62575f80fd5b813581811115615c7457615c746155dc565b8060051b9150615c8584830161563a565b8181529183018401918481019036841115615c9e575f80fd5b938501935b83851015615cc85784359250615cb883615536565b8282529385019390850190615ca3565b94860194909452509295945050505050565b5f60208284031215615cea575f80fd5b611839826152f1565b5f60208284031215615d03575f80fd5b813560ff81168114611839575f80fd5b5f6001600160401b038083168181036158aa576158aa61586b565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d7481602a850160208b01615395565b865190830190615d8b81602a840160208b01615395565b60c087901b6001600160c01b031916602a9290910191820152615dbd603282018660e01b6001600160e01b0319169052565b615dd6603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615df9818460208801615395565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451615e2a818460208901615395565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e65818460208801615395565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from.