From 781f691e7f89b3b7d560b2dbf6fe4e92fa9cd4bd Mon Sep 17 00:00:00 2001 From: MSalopek Date: Tue, 23 Apr 2024 12:01:40 +0200 Subject: [PATCH] tests: fix broken tests (unit, integration) (#1805) * proto: update proto files (rm deprecated from non-deprecated) * test: update parts of integration tests * app: add missing addr codec registrations * tests: disable cometmock tests in GH * integration test: revert setup to main branch * integration test: fix add consumern; fix consumer key assign * integration: fix most tests; add todos * chore: add todos for fixing tests * fix packet timeout related test * fix TestRewardsDistribution test * fix val address conversion * fix democracy tests * fix TestSoftOptOut * fix historical info test * fixed TestRelayAndApplyDowntimePacket * tests: fix double voting tests * tests: update some comments * fix: switch broken UT due to addr parsing --------- Co-authored-by: stana-ethernal --- .github/workflows/test.yml | 31 --- app/provider/app.go | 12 +- app/sovereign/app.go | 8 +- .../ccv/provider/v1/provider.proto | 9 +- tests/integration/common.go | 7 +- tests/integration/democracy.go | 81 ++++--- tests/integration/distribution.go | 24 +- tests/integration/double_vote.go | 7 +- tests/integration/expired_client.go | 3 +- tests/integration/normal_operations.go | 36 +-- tests/integration/setup.go | 26 +- tests/integration/slashing.go | 105 +++++++- tests/integration/soft_opt_out.go | 4 +- tests/integration/throttle.go | 28 ++- tests/integration/throttle_retry.go | 8 +- testutil/ibc_testing/generic_setup.go | 11 +- testutil/integration/validators.go | 4 +- x/ccv/consumer/keeper/validators.go | 4 +- x/ccv/provider/keeper/relay_test.go | 6 +- x/ccv/provider/keeper/throttle.go | 3 +- x/ccv/provider/types/provider.pb.go | 226 +++++++++--------- 21 files changed, 368 insertions(+), 275 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cb6e0255b9..40bf4002c1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -229,37 +229,6 @@ jobs: run: | make test-e2e-compatibility-tests-latest - test-cometmock: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - lfs: true - - name: checkout LFS objects - run: git lfs checkout - - uses: actions/setup-go@v5 - with: - go-version: "1.21" - check-latest: true - cache: true - cache-dependency-path: go.sum - - uses: technote-space/get-diff-action@v6.1.2 - id: git_diff - with: - PATTERNS: | - **/*.go - go.mod - go.sum - **/go.mod - **/go.sum - **/Makefile - Makefile - Dockerfile* - - name: cometmock tests - if: env.GIT_DIFF - run: | - make test-e2e-short-cometmock - test-trace: runs-on: ubuntu-latest steps: diff --git a/app/provider/app.go b/app/provider/app.go index ef60ccc53b..42a3b99f90 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -343,8 +343,8 @@ func New( runtime.NewKVStoreService(keys[authtypes.StoreKey]), authtypes.ProtoBaseAccount, maccPerms, - authcodec.NewBech32Codec(sdk.Bech32MainPrefix), - sdk.Bech32MainPrefix, + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix()), + sdk.GetConfig().GetBech32AccountAddrPrefix(), authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -370,8 +370,8 @@ func New( app.AccountKeeper, app.BankKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - authcodec.NewBech32Codec(sdk.Bech32PrefixValAddr), - authcodec.NewBech32Codec(sdk.Bech32PrefixConsAddr), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()), ) app.MintKeeper = mintkeeper.NewKeeper( appCodec, @@ -485,8 +485,8 @@ func New( app.BankKeeper, *app.GovKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - authcodec.NewBech32Codec(sdk.Bech32PrefixValAddr), - authcodec.NewBech32Codec(sdk.Bech32PrefixConsAddr), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()), authtypes.FeeCollectorName, ) diff --git a/app/sovereign/app.go b/app/sovereign/app.go index ae5a2a82f6..67386cc70a 100644 --- a/app/sovereign/app.go +++ b/app/sovereign/app.go @@ -304,8 +304,8 @@ func New( runtime.NewKVStoreService(keys[authtypes.StoreKey]), authtypes.ProtoBaseAccount, maccPerms, - authcodec.NewBech32Codec(sdk.Bech32MainPrefix), - sdk.Bech32MainPrefix, + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix()), + sdk.GetConfig().GetBech32AccountAddrPrefix(), authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -338,8 +338,8 @@ func New( app.AccountKeeper, app.BankKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - authcodec.NewBech32Codec(sdk.Bech32PrefixValAddr), - authcodec.NewBech32Codec(sdk.Bech32PrefixConsAddr), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()), ) app.MintKeeper = mintkeeper.NewKeeper( diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index 936a7eeb5b..3784c2cc13 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -25,9 +25,8 @@ import "cosmos_proto/cosmos.proto"; // chain are expected to validate the consumer chain at spawn time or get // slashed. It is recommended that spawn time occurs after the proposal end // time. -// Deprecated: Use MsgConsumerAddition instead +// Use MsgConsumerAddition to submit this proposal type. message ConsumerAdditionProposal { - option deprecated = true; option (gogoproto.goproto_getters) = false; option (gogoproto.goproto_stringer) = false; option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; @@ -93,9 +92,8 @@ message ConsumerAdditionProposal { // remove (and stop) a consumer chain. If it passes, all the consumer chain's // state is removed from the provider chain. The outstanding unbonding operation // funds are released. -// Deprecated: Use MsgConsumerRemoval instead +// Use MsgConsumerRemoval to submit this proposal type. message ConsumerRemovalProposal { - option deprecated = true; option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; // the title of the proposal @@ -128,9 +126,8 @@ message EquivocationProposal { // ChangeRewardDenomsProposal is a governance proposal on the provider chain to // mutate the set of denoms accepted by the provider as rewards. -// Deprecated: Use MsgChangeRewardDenoms instead +// Use MsgChangeRewardDenoms to submit this proposal type. message ChangeRewardDenomsProposal { - option deprecated = true; option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; // the title of the proposal diff --git a/tests/integration/common.go b/tests/integration/common.go index 4858c376e2..195326e8ff 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -275,7 +275,7 @@ func relayAllCommittedPackets( s.Require().Equal( expectedPackets, len(commitments), - fmt.Sprintf("actual number of packet commitments does not match expectation; %s", msgAndArgs...), + fmt.Sprintf("actual number of packet commitments does not match expectation; expected: %d - got: %d", expectedPackets, len(commitments)), ) // relay all packets from srcChain to counterparty @@ -290,7 +290,7 @@ func relayAllCommittedPackets( err := path.RelayPacket(packet) s.Require().NoError( err, - fmt.Sprintf("error while relaying packets; %s", msgAndArgs...), + fmt.Sprintf("error while relaying packets; %v", err), ) } } @@ -371,10 +371,9 @@ func checkRedelegationEntryCompletionTime( } func getStakingUnbondingDelegationEntry(ctx sdk.Context, k testutil.TestStakingKeeper, id uint64) (stakingUnbondingOp stakingtypes.UnbondingDelegationEntry, found bool) { - found := false stakingUbd, err := k.GetUnbondingDelegationByUnbondingID(ctx, id) if err != nil { - return found + return } for _, entry := range stakingUbd.Entries { diff --git a/tests/integration/democracy.go b/tests/integration/democracy.go index 63ca348bf8..100018879d 100644 --- a/tests/integration/democracy.go +++ b/tests/integration/democracy.go @@ -30,7 +30,7 @@ type ConsumerDemocracyTestSuite struct { setupCallback DemocSetupCallback } -// NewCCVTestSuite returns a new instance of ConsumerDemocracyTestSuite, +// NewConsumerDemocracyTestSuite returns a new instance of ConsumerDemocracyTestSuite, // ready to be tested against using suite.Run(). func NewConsumerDemocracyTestSuite[T testutil.DemocConsumerApp]( democConsumerAppIniter icstestingutils.ValSetAppIniter, @@ -80,41 +80,53 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyRewardsDistribution() { bondDenom, err := stakingKeeper.BondDenom(s.consumerCtx()) s.Require().NoError(err) - currentRepresentativesRewards := map[string]math.LegacyDec{} + previousRepresentativesRewards := map[string]math.LegacyDec{} nextRepresentativesRewards := map[string]math.LegacyDec{} representativesTokens := map[string]math.Int{} representatives, err := stakingKeeper.GetAllValidators(s.consumerCtx()) s.Require().NoError(err) for _, representative := range representatives { - currentRepresentativesRewards[representative.OperatorAddress] = math.LegacyNewDec(0) + previousRepresentativesRewards[representative.OperatorAddress] = math.LegacyNewDec(0) nextRepresentativesRewards[representative.OperatorAddress] = math.LegacyNewDec(0) representativesTokens[representative.OperatorAddress] = representative.GetTokens() } distrModuleAccount := distrKeeper.GetDistributionAccount(s.consumerCtx()) providerRedistributeAccount := accountKeeper.GetModuleAccount(s.consumerCtx(), consumertypes.ConsumerToSendToProviderName) - // balance of consumer redistribute address will always be 0 when checked between 2 NextBlock() calls + consumerRedistributeAccount := accountKeeper.GetModuleAccount(s.consumerCtx(), consumertypes.ConsumerRedistributeName) dk, ok := distrKeeper.(sdkdistrkeeper.Keeper) s.Require().True(ok) - feePool, err := dk.FeePool.Get(s.consumerCtx().Context()) + feePool, err := dk.FeePool.Get(s.consumerCtx()) s.Require().NoError(err) s.Require().NotEmpty(feePool) - currentDistrModuleAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), distrModuleAccount.GetAddress(), bondDenom).Amount) - currentProviderFeeAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), providerRedistributeAccount.GetAddress(), bondDenom).Amount) - currentCommunityPoolBalance := feePool.GetCommunityPool().AmountOf(bondDenom) - for key := range currentRepresentativesRewards { + + // take balance of relevant accounts before advancing to the next block + previousDistrModuleAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), distrModuleAccount.GetAddress(), bondDenom).Amount) + previousProviderFeeAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), providerRedistributeAccount.GetAddress(), bondDenom).Amount) + previousConsumerRedistributeBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), consumerRedistributeAccount.GetAddress(), bondDenom).Amount) + previousCommunityPoolBalance := feePool.GetCommunityPool().AmountOf(bondDenom) + for key := range previousRepresentativesRewards { representativeAddr, _ := sdk.ValAddressFromBech32(key) representativeReward, err := distrKeeper.GetValidatorOutstandingRewards(s.consumerCtx(), representativeAddr) s.Require().NoError(err) - currentRepresentativesRewards[key] = representativeReward.Rewards.AmountOf(bondDenom) + previousRepresentativesRewards[key] = representativeReward.Rewards.AmountOf(bondDenom) } + // NextBlock will call the begin block and end block, respectively. Democracy module in the begin blocker sends the tokens from + // the consumer redistribute address to the distribution module, giving representatives and community fee pool its portion of rewards. + // Consumer module in endblocker, sends the fees from fee collector(auth module) to the consumer redistribute address and to + // provider rewards address s.consumerChain.NextBlock() + // take balance of relevant accounts after new block is created nextDistrModuleAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), distrModuleAccount.GetAddress(), bondDenom).Amount) nextProviderFeeAccountBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), providerRedistributeAccount.GetAddress(), bondDenom).Amount) + nextConsumerRedistributeBalance := math.LegacyNewDecFromInt(bankKeeper.GetBalance(s.consumerCtx(), consumerRedistributeAccount.GetAddress(), bondDenom).Amount) + feePool, err = dk.FeePool.Get(s.consumerCtx()) + s.Require().NoError(err) + s.Require().NotEmpty(feePool) nextCommunityPoolBalance := feePool.GetCommunityPool().AmountOf(bondDenom) for key := range nextRepresentativesRewards { representativeAddr, _ := sdk.ValAddressFromBech32(key) @@ -123,41 +135,44 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyRewardsDistribution() { nextRepresentativesRewards[key] = representativeReward.Rewards.AmountOf(bondDenom) } - distrModuleDifference := nextDistrModuleAccountBalance.Sub(currentDistrModuleAccountBalance) - providerDifference := nextProviderFeeAccountBalance.Sub(currentProviderFeeAccountBalance) - communityPoolDifference := nextCommunityPoolBalance.Sub(currentCommunityPoolBalance) + distrModuleDifference := nextDistrModuleAccountBalance.Sub(previousDistrModuleAccountBalance) + providerDifference := nextProviderFeeAccountBalance.Sub(previousProviderFeeAccountBalance) + communityPoolDifference := nextCommunityPoolBalance.Sub(previousCommunityPoolBalance) representativeDifference := map[string]math.LegacyDec{} - consumerRedistributeDifference := communityPoolDifference - - for key, currentReward := range currentRepresentativesRewards { - representativeDifference[key] = nextRepresentativesRewards[key].Sub(currentReward) - consumerRedistributeDifference = consumerRedistributeDifference.Add(representativeDifference[key]) + totalRepresentativeDifference := math.LegacyZeroDec() + for key, currentReward := range previousRepresentativesRewards { + diff := nextRepresentativesRewards[key].Sub(currentReward) + representativeDifference[key] = diff + totalRepresentativeDifference = totalRepresentativeDifference.Add(diff) } + // confirm endblocker changes: consumer module distributes fees from fee collector to consumer redistribute address + // and address aimed for provider rewards consumerRedistributionFraction := math.LegacyMustNewDecFromStr(s.consumerApp.GetConsumerKeeper().GetConsumerRedistributionFrac(s.consumerCtx())) - - // confirm that the total amount given to the community pool plus all representatives is equal to the total amount taken out of distribution - s.Require().Equal(distrModuleDifference, consumerRedistributeDifference) + // since we cannot know the balance of the fee collector when the consumer module transfers the fees, we can only calculate the total fees + // as a sum of the provider and consumer rewards and check if the reward is distributed in the expected proportion + totalFees := nextConsumerRedistributeBalance.Add(providerDifference) + s.Require().Equal(totalFees.Mul(consumerRedistributionFraction), nextConsumerRedistributeBalance) + + // confirm begin blocker changes: democracy module distributes the fees from c onsumer redistribute address to representatives + // and community fee pool + // distribution module got tokens from previous consumer redistribute balance + s.Require().Equal(distrModuleDifference, previousConsumerRedistributeBalance) // confirm that the percentage given to the community pool is equal to the configured community tax percentage. tax, err := distrKeeper.GetCommunityTax(s.consumerCtx()) s.Require().NoError(err) - s.Require().Equal(communityPoolDifference.Quo(consumerRedistributeDifference), tax) - // check that the fraction actually kept by the consumer is the correct fraction. using InEpsilon because the math code uses truncations - s.Require().InEpsilon(distrModuleDifference.Quo( - providerDifference.Add(distrModuleDifference)).MustFloat64(), - consumerRedistributionFraction.MustFloat64(), float64(0.0001)) - // check that the fraction actually kept by the provider is the correct fraction. using InEpsilon because the math code uses truncations - s.Require().InEpsilon(providerDifference.Quo( - providerDifference.Add(distrModuleDifference)).MustFloat64(), - math.LegacyNewDec(1).Sub(consumerRedistributionFraction).MustFloat64(), float64(0.0001)) + s.Require().Equal(communityPoolDifference.Quo(previousConsumerRedistributeBalance), tax) + // confirm that the total amount given to the community pool plus all representatives is equal to the previous consumer redistribute balance + s.Require().Equal(previousConsumerRedistributeBalance, communityPoolDifference.Add(totalRepresentativeDifference)) + + // check that each representative has gotten the correct amount of rewards totalRepresentativePower, err := stakingKeeper.GetValidatorSet().TotalBondedTokens(s.consumerCtx()) s.Require().NoError(err) - // check that each representative has gotten the correct amount of rewards for key, representativeTokens := range representativesTokens { powerFraction := math.LegacyNewDecFromInt(representativeTokens).QuoTruncate(math.LegacyNewDecFromInt(totalRepresentativePower)) - s.Require().Equal(powerFraction, representativeDifference[key].Quo(consumerRedistributeDifference.Sub(communityPoolDifference))) + s.Require().Equal(powerFraction, representativeDifference[key].Quo(previousConsumerRedistributeBalance.Sub(communityPoolDifference))) } } @@ -203,7 +218,6 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { // set current header time to be equal or later than voting end time in order to process proposal from active queue, // once the proposal is added to the chain s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(*params.VotingPeriod) - s.consumerChain.NextBlock() // at this moment, proposal is added, but not yet executed. we are saving old param values for comparison oldAuthParamValue := accountKeeper.GetParams(s.consumerCtx()).MaxMemoCharacters oldMintParams, err := mintKeeper.Params.Get(s.consumerCtx()) @@ -227,7 +241,6 @@ func (s *ConsumerDemocracyTestSuite) TestDemocracyGovernanceWhitelisting() { err = submitProposalWithDepositAndVote(govKeeper, s.consumerCtx(), []sdk.Msg{msg_1}, votingAccounts, proposer.GetAddress(), depositAmount) s.Assert().NoError(err) s.consumerChain.CurrentHeader.Time = s.consumerChain.CurrentHeader.Time.Add(*params.VotingPeriod) - s.consumerChain.NextBlock() oldMintParam, err := mintKeeper.Params.Get(s.consumerCtx()) s.Require().NoError(err) oldMintParamValue = oldMintParam.InflationMax diff --git a/tests/integration/distribution.go b/tests/integration/distribution.go index c33ddada0a..13bf150938 100644 --- a/tests/integration/distribution.go +++ b/tests/integration/distribution.go @@ -36,8 +36,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { relayAllCommittedPackets(s, s.providerChain, s.path, ccv.ProviderPortID, s.path.EndpointB.ChannelID, 1) // reward for the provider chain will be sent after each 2 blocks - consumerParams := s.consumerApp.GetSubspace(consumertypes.ModuleName) - consumerParams.Set(s.consumerCtx(), ccv.KeyBlocksPerDistributionTransmission, int64(2)) + s.consumerApp.GetConsumerKeeper().SetBlocksPerDistributionTransmission(s.consumerCtx(), 2) s.consumerChain.NextBlock() consumerAccountKeeper := s.consumerApp.GetTestAccountKeeper() @@ -85,6 +84,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { rewardCoins := providerBankKeeper.GetAllBalances(s.providerCtx(), rewardPool) ibcCoinIndex := -1 + for i, coin := range rewardCoins { if strings.HasPrefix(coin.Denom, "ibc") { ibcCoinIndex = i @@ -93,6 +93,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { // Check that we found an ibc denom in the reward pool s.Require().Greater(ibcCoinIndex, -1) + ibcDenom := rewardCoins[ibcCoinIndex].Denom // Check that the coins got into the ConsumerRewardsPool s.Require().True(rewardCoins[ibcCoinIndex].Amount.Equal(providerExpectedRewards[0].Amount)) @@ -103,13 +104,20 @@ func (s *CCVTestSuite) TestRewardsDistribution() { s.Require().True(rewardCoins[ibcCoinIndex].Amount.Equal(providerExpectedRewards[0].Amount)) // Set the consumer reward denom. This would be done by a governance proposal in prod - s.providerApp.GetProviderKeeper().SetConsumerRewardDenom(s.providerCtx(), rewardCoins[ibcCoinIndex].Denom) + s.providerApp.GetProviderKeeper().SetConsumerRewardDenom(s.providerCtx(), ibcDenom) s.providerChain.NextBlock() - // Check that the reward pool has no more coins because they were transferred to the fee pool + // Check that the reward pool has no more coins because they were transferred to the fee collector rewardCoins = providerBankKeeper.GetAllBalances(s.providerCtx(), rewardPool) s.Require().Equal(0, len(rewardCoins)) + feeCollectorIbcCoin := providerBankKeeper.GetBalance(s.providerCtx(), authtypes.NewModuleAddress(authtypes.FeeCollectorName), ibcDenom) + s.Require().True(feeCollectorIbcCoin.Amount.Equal(providerExpectedRewards[0].Amount)) + + // Advance a block and check that the coins are transfered from fee collector to fee pool + s.providerChain.NextBlock() + feeCollectorIbcCoin = providerBankKeeper.GetBalance(s.providerCtx(), authtypes.NewModuleAddress(authtypes.FeeCollectorName), ibcDenom) + s.Require().Equal(math.ZeroInt(), feeCollectorIbcCoin.Amount) // check that the fee pool has the expected amount of coins testDistKeeper := s.providerApp.GetTestDistributionKeeper() @@ -118,7 +126,7 @@ func (s *CCVTestSuite) TestRewardsDistribution() { s.Require().True(ok) s.Require().NotEmpty(sdkDistKeeper) - feePool, err := sdkDistKeeper.FeePool.Get(s.consumerCtx().Context()) + feePool, err := sdkDistKeeper.FeePool.Get(s.providerCtx()) s.Require().NoError(err) s.Require().NotEmpty(feePool) @@ -150,8 +158,7 @@ func (s *CCVTestSuite) TestSendRewardsRetries() { consumerKeeper := s.consumerApp.GetConsumerKeeper() // reward for the provider chain will be sent after each 1000 blocks - consumerParams := s.consumerApp.GetSubspace(consumertypes.ModuleName) - consumerParams.Set(s.consumerCtx(), ccv.KeyBlocksPerDistributionTransmission, int64(1000)) + s.consumerApp.GetConsumerKeeper().SetBlocksPerDistributionTransmission(s.consumerCtx(), 1000) // fill fee pool fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100))) @@ -280,8 +287,7 @@ func (s *CCVTestSuite) TestEndBlockRD() { consumerBankKeeper := s.consumerApp.GetTestBankKeeper() // reward for the provider chain will be sent after each 1000 blocks - consumerParams := s.consumerApp.GetSubspace(consumertypes.ModuleName) - consumerParams.Set(s.consumerCtx(), ccv.KeyBlocksPerDistributionTransmission, int64(1000)) + s.consumerApp.GetConsumerKeeper().SetBlocksPerDistributionTransmission(s.consumerCtx(), 1000) // fill fee pool fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100))) diff --git a/tests/integration/double_vote.go b/tests/integration/double_vote.go index 9ebd4b727f..f8a0f7f25d 100644 --- a/tests/integration/double_vote.go +++ b/tests/integration/double_vote.go @@ -264,6 +264,8 @@ func (s *CCVTestSuite) TestHandleConsumerDoubleVotingSlashesUndelegationsAndRele // required to have the consumer client revision height greater than 0 s.SendEmptyVSCPacket() + providerKeeper := s.providerApp.GetProviderKeeper() + // create signing info for all validators for _, v := range s.providerChain.Vals.Validators { s.setDefaultValSigningInfo(*v) @@ -349,7 +351,7 @@ func (s *CCVTestSuite) TestHandleConsumerDoubleVotingSlashesUndelegationsAndRele s.Require().NotZero(shares) // undelegate 1/2 of the bound amount - valAddr, err := sdk.ValAddressFromHex(validator.GetOperator()) + valAddr, err := providerKeeper.ValidatorAddressCodec().StringToBytes(validator.GetOperator()) s.Require().NoError(err) undelegate(s, delAddr, valAddr, shares.Quo(math.LegacyNewDec(4))) undelegate(s, delAddr, valAddr, shares.Quo(math.LegacyNewDec(4))) @@ -361,7 +363,8 @@ func (s *CCVTestSuite) TestHandleConsumerDoubleVotingSlashesUndelegationsAndRele // save the delegation shares of the validator to redelegate to // Note this shares should not be slashed! - valAddr2, err := sdk.ValAddressFromHex(validator2.GetOperator()) + valAddr2, err := providerKeeper.ValidatorAddressCodec().StringToBytes(validator2.GetOperator()) + s.Require().NoError(err) del, err := s.providerApp.GetTestStakingKeeper().Delegation(s.providerCtx(), delAddr, valAddr2) s.Require().NoError(err) delShares := del.GetShares() diff --git a/tests/integration/expired_client.go b/tests/integration/expired_client.go index 249283ce9f..253f37c9fd 100644 --- a/tests/integration/expired_client.go +++ b/tests/integration/expired_client.go @@ -1,4 +1,4 @@ -gpackage integration +package integration import ( "time" @@ -291,4 +291,5 @@ func upgradeExpiredClient(s *CCVTestSuite, clientTo ChainType) { res, err := hostChain.App.GetIBCKeeper().RecoverClient(hostChain.GetContext(), recoverMsg) s.Require().NoError(err) + s.Require().NotNil(res) } diff --git a/tests/integration/normal_operations.go b/tests/integration/normal_operations.go index 61f7507793..fc71fec247 100644 --- a/tests/integration/normal_operations.go +++ b/tests/integration/normal_operations.go @@ -35,14 +35,16 @@ func (k CCVTestSuite) TestHistoricalInfo() { //nolint:govet // this is a test so // testsetup create 2 validators and then call track historical info with header block height // increased by HistoricalEntries in order to prune the historical info less or equal to the current block height - // Note that historical info containing the created validators are stored during the next block BeginBlocker - // and thus are indexed with the respective block heights InitHeight+1 and InitHeight+2 + // Note that historical info containing the created validators were stored during the BeginBlocker of the current block + // at the moment of creation and thus are indexed with the respective block heights InitHeight and InitHeight+1 + // Last saved historical info was in the last commited block k.consumerChain.GetContext().BlockHeight(), meaning that + // if we want to prune old entries we need to start from the last saved historical info which is k.consumerChain.GetContext().BlockHeight() - 1 testSetup := []func(CCVTestSuite){ createVal, createVal, func(k CCVTestSuite) { //nolint:govet // this is a test so we can copy locks historicalEntries := k.consumerApp.GetConsumerKeeper().GetHistoricalEntries(k.consumerCtx()) - newHeight := k.consumerChain.GetContext().BlockHeight() + historicalEntries + newHeight := k.consumerChain.GetContext().BlockHeight() - 1 + historicalEntries header := tmproto.Header{ ChainID: "HelloChain", Height: newHeight, @@ -59,31 +61,31 @@ func (k CCVTestSuite) TestHistoricalInfo() { //nolint:govet // this is a test so // test cases verify that historical info entries are pruned when their height // is below CurrentHeight - HistoricalEntries, and check that their valset gets updated testCases := []struct { - height int64 - found bool - expLen int + height int64 + expectsError bool + expLen int }{ { - height: initHeight + 1, - found: false, - expLen: 0, + height: initHeight, + expectsError: true, + expLen: 0, }, { - height: initHeight + 2, - found: false, - expLen: 0, + height: initHeight + 1, + expectsError: true, + expLen: 0, }, { - height: initHeight + ccvtypes.DefaultHistoricalEntries + 2, - found: true, - expLen: initValsetLen + 2, + height: initHeight + ccvtypes.DefaultHistoricalEntries + 1, + expectsError: false, + expLen: initValsetLen + 2, }, } for _, tc := range testCases { cCtx().WithBlockHeight(tc.height) - hi, found := consumerKeeper.GetHistoricalInfo(cCtx().WithBlockHeight(tc.height), tc.height) - k.Require().Equal(tc.found, found) + hi, err := consumerKeeper.GetHistoricalInfo(cCtx().WithBlockHeight(tc.height), tc.height) + k.Require().Equal(tc.expectsError, err != nil) k.Require().Len(hi.Valset, tc.expLen) } } diff --git a/tests/integration/setup.go b/tests/integration/setup.go index 0cd23d2a3e..393ebf2c24 100644 --- a/tests/integration/setup.go +++ b/tests/integration/setup.go @@ -21,6 +21,7 @@ import ( icstestingutils "github.com/cosmos/interchain-security/v5/testutil/ibc_testing" testutil "github.com/cosmos/interchain-security/v5/testutil/integration" consumertypes "github.com/cosmos/interchain-security/v5/x/ccv/consumer/types" + "github.com/cosmos/interchain-security/v5/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v5/x/ccv/types" ) @@ -125,6 +126,21 @@ func (suite *CCVTestSuite) SetupTest() { suite.registerPacketSniffer(suite.providerChain) providerKeeper := suite.providerApp.GetProviderKeeper() + // re-assign all validator keys for the first consumer chain + // this has to be done before: + // 1. the consumer chain is added to the coordinator + // 2. MakeGenesis is called on the provider chain + // 3. ibc/testing sets the tendermint header for the consumer chain app + providerKeeper.SetPendingConsumerAdditionProp(suite.providerCtx(), &types.ConsumerAdditionProposal{ + ChainId: icstestingutils.FirstConsumerChainID, + }) + ps := providerKeeper.GetAllPendingConsumerAdditionProps(suite.providerCtx()) + preProposalKeyAssignment(suite, icstestingutils.FirstConsumerChainID) + + // remove props so they don't interfere with the rest of the setup + // if not removed here, setupConsumerCallback will have 2 proposals for adding the first consumer chain + providerKeeper.DeletePendingConsumerAdditionProps(suite.providerCtx(), ps...) + // start consumer chains numConsumers := 5 suite.consumerBundles = make(map[string]*icstestingutils.ConsumerBundle) @@ -132,11 +148,6 @@ func (suite *CCVTestSuite) SetupTest() { bundle := suite.setupConsumerCallback(&suite.Suite, suite.coordinator, i) suite.consumerBundles[bundle.Chain.ChainID] = bundle suite.registerPacketSniffer(bundle.Chain) - - // re-assign all validator keys for the first consumer chain - if i == 0 { - consumerKeyAssignment(suite, icstestingutils.FirstConsumerChainID) - } } // initialize each consumer chain with it's corresponding genesis state @@ -146,6 +157,7 @@ func (suite *CCVTestSuite) SetupTest() { suite.providerCtx(), chainID, ) + suite.Require().True(found, "consumer genesis not found") genesisState := consumertypes.GenesisState{ Params: consumerGenesisState.Params, @@ -353,10 +365,10 @@ func (s CCVTestSuite) validateEndpointsClientConfig(consumerBundle icstestinguti ) } -// consumerKeyAssignmentt assigns keys to all provider validators for +// preProposalKeyAssignment assigns keys to all provider validators for // the consumer with chainID before the chain is registered, i.e., // before a client to the consumer is created -func consumerKeyAssignment(s *CCVTestSuite, chainID string) { +func preProposalKeyAssignment(s *CCVTestSuite, chainID string) { providerKeeper := s.providerApp.GetProviderKeeper() for _, val := range s.providerChain.Vals.Validators { diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index e1f6fe4cbc..5b4cc3ccb9 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -1,6 +1,7 @@ package integration import ( + "context" "fmt" "time" @@ -9,10 +10,12 @@ import ( "cosmossdk.io/core/comet" "cosmossdk.io/math" + "cosmossdk.io/x/evidence/types" evidencetypes "cosmossdk.io/x/evidence/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkaddress "github.com/cosmos/cosmos-sdk/types/address" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -20,6 +23,7 @@ import ( "github.com/cometbft/cometbft/crypto/ed25519" tmtypes "github.com/cometbft/cometbft/types" + "github.com/cosmos/interchain-security/v5/testutil/integration" keepertestutil "github.com/cosmos/interchain-security/v5/testutil/keeper" providertypes "github.com/cosmos/interchain-security/v5/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v5/x/ccv/types" @@ -122,11 +126,11 @@ func (s *CCVTestSuite) TestRelayAndApplyDowntimePacket() { relayAllCommittedPackets(s, s.providerChain, bundle.Path, ccv.ProviderPortID, bundle.Path.EndpointB.ChannelID, 1) - // check that each consumer updated its VSC ID for the subsequent block + // check that each consumer updated its VSC ID for the subsequent not commited block ctx.BlockHeight() consumerKeeper := bundle.GetKeeper() ctx := bundle.GetCtx() actualValsetUpdateID := consumerKeeper.GetHeightValsetUpdateID( - ctx, uint64(ctx.BlockHeight())+1) + ctx, uint64(ctx.BlockHeight())) s.Require().Equal(expectedSentValsetUpdateId, actualValsetUpdateID) // check that jailed validator was removed from each consumer validator set @@ -582,14 +586,19 @@ func (suite *CCVTestSuite) TestValidatorDoubleSigning() { ) expCommit := suite.commitSlashPacket(ctx, *packetData) - // expect to send slash packet when handling double-sign evidence - // NOTE: using IBCKeeper Authority as msg submitter (equal to gov module addr) + suite.consumerChain.NextBlock() + // // expect to send slash packet when handling double-sign evidence + // // NOTE: using IBCKeeper Authority as msg submitter (equal to gov module addr) addr, err := sdk.AccAddressFromBech32(suite.consumerApp.GetIBCKeeper().GetAuthority()) suite.Require().NoError(err) evidenceMsg, err := evidencetypes.NewMsgSubmitEvidence(addr, e) suite.Require().NoError(err) suite.Require().NotEmpty(evidenceMsg) - suite.consumerApp.GetTestEvidenceKeeper().SubmitEvidence(ctx, e) + + // this was previously done using suite.consumerApp.GetTestEvidenceKeeper().HandleEquivocationEvidence(ctx, e) + // HandleEquivocationEvidence is not exposed in the evidencekeeper interface starting cosmos-sdk v0.50.x + // suite.consumerApp.GetTestEvidenceKeeper().SubmitEvidence(ctx, e) + handleEquivocationEvidence(ctx, suite.consumerApp, e) // check slash packet is queued pendingPackets := suite.consumerApp.GetConsumerKeeper().GetPendingPackets(ctx) @@ -740,3 +749,89 @@ func (suite *CCVTestSuite) TestCISBeforeCCVEstablished() { _, found = consumerKeeper.GetSlashRecord(suite.consumerCtx()) suite.Require().True(found) } + +// copy of the function from slashing/keeper.go +// in cosmos-sdk v0.50.x the function HandleEquivocationEvidence is not exposed (it was exposed for versions <= v0.47.x) +// https://github.com/cosmos/cosmos-sdk/blob/v0.50.4/x/evidence/keeper/infraction.go#L27 +func handleEquivocationEvidence(ctx context.Context, k integration.ConsumerApp, evidence *types.Equivocation) error { + sdkCtx := sdk.UnwrapSDKContext(ctx) + slashingKeeper := k.GetTestSlashingKeeper().(slashingkeeper.Keeper) + evidenceKeeper := k.GetTestEvidenceKeeper() + consAddr := evidence.GetConsensusAddress(k.GetConsumerKeeper().ConsensusAddressCodec()) + + validator, err := k.GetConsumerKeeper().ValidatorByConsAddr(ctx, consAddr) + if err != nil { + return err + } + if validator == nil || validator.IsUnbonded() { + return nil + } + + if len(validator.GetOperator()) != 0 { + if _, err := slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + return nil + } + } + + // calculate the age of the evidence + infractionHeight := evidence.GetHeight() + infractionTime := evidence.GetTime() + ageDuration := sdkCtx.BlockHeader().Time.Sub(infractionTime) + ageBlocks := sdkCtx.BlockHeader().Height - infractionHeight + + // Reject evidence if the double-sign is too old. Evidence is considered stale + // if the difference in time and number of blocks is greater than the allowed + // parameters defined. + cp := sdkCtx.ConsensusParams() + if cp.Evidence != nil { + if ageDuration > cp.Evidence.MaxAgeDuration && ageBlocks > cp.Evidence.MaxAgeNumBlocks { + return nil + } + } + + if ok := slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { + panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) + } + + // ignore if the validator is already tombstoned + if slashingKeeper.IsTombstoned(ctx, consAddr) { + return nil + } + + distributionHeight := infractionHeight - sdk.ValidatorUpdateDelay + slashFractionDoubleSign, err := slashingKeeper.SlashFractionDoubleSign(ctx) + if err != nil { + return err + } + + err = slashingKeeper.SlashWithInfractionReason( + ctx, + consAddr, + slashFractionDoubleSign, + evidence.GetValidatorPower(), distributionHeight, + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, + ) + if err != nil { + return err + } + + // Jail the validator if not already jailed. This will begin unbonding the + // validator if not already unbonding (tombstoned). + if !validator.IsJailed() { + err = slashingKeeper.Jail(ctx, consAddr) + if err != nil { + return err + } + } + + err = slashingKeeper.JailUntil(ctx, consAddr, types.DoubleSignJailEndTime) + if err != nil { + return err + } + + err = slashingKeeper.Tombstone(ctx, consAddr) + if err != nil { + return err + } + return evidenceKeeper.Evidences.Set(ctx, evidence.Hash(), evidence) +} diff --git a/tests/integration/soft_opt_out.go b/tests/integration/soft_opt_out.go index 58eb6cea84..193f209783 100644 --- a/tests/integration/soft_opt_out.go +++ b/tests/integration/soft_opt_out.go @@ -88,7 +88,7 @@ func (suite *CCVTestSuite) TestSoftOptOut() { minSigned, err := sk.MinSignedPerWindow(suite.consumerCtx()) suite.Require().NoError(err) - blocksToDowntime = blocksToDowntime - minSigned + 1 + blocksToDowntime = blocksToDowntime - minSigned slashingBeginBlocker(suite, votes, blocksToDowntime) // Increase the power of this validator (to bring it in the top 95%) @@ -133,7 +133,7 @@ func (suite *CCVTestSuite) TestSoftOptOut() { minSigned, err := sk.MinSignedPerWindow(suite.consumerCtx()) suite.Require().NoError(err) - blocksToDowntime = blocksToDowntime - minSigned + 1 + blocksToDowntime = blocksToDowntime - minSigned slashingBeginBlocker(suite, votes, blocksToDowntime) // Increase the power of this validator (to bring it in the top 95%) diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index ed7ce779d2..f56228c56f 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -67,6 +67,7 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { s.SetupAllCCVChannels() s.setupValidatorPowers([]int64{1000, 1000, 1000, 1000}) + providerKeeper := s.providerApp.GetProviderKeeper() providerStakingKeeper := s.providerApp.GetTestStakingKeeper() // Use default params (incl replenish period), but set replenish fraction to tc value. @@ -101,7 +102,7 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { s.Require().NoError(err) slashedVal := vals[0] s.Require().True(slashedVal.IsJailed()) - slashedValOperator, err := sdk.ValAddressFromHex(slashedVal.GetOperator()) + slashedValOperator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(slashedVal.GetOperator()) s.Require().NoError(err) lastValPower, err := providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), slashedValOperator) s.Require().NoError(err) @@ -183,7 +184,7 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { // Assert validator 2 has no power, this should be apparent next block, // since the staking endblocker runs before the ccv endblocker. s.providerChain.NextBlock() - slashedValOperator, err = sdk.ValAddressFromHex(slashedVal.GetOperator()) + slashedValOperator, err = providerKeeper.ValidatorAddressCodec().StringToBytes(slashedVal.GetOperator()) s.Require().NoError(err) lastValPower, err = providerStakingKeeper.GetLastValidatorPower(cacheCtx, slashedValOperator) s.Require().NoError(err) @@ -446,7 +447,7 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { s.Require().NoError(err) s.Require().Equal(int64(1000), power) stakingVal, err := stakingKeeper.GetValidatorByConsAddr(s.providerCtx(), sdk.ConsAddress(val.Address)) - s.Require().Error(err) + s.Require().NoError(err) s.Require().False(stakingVal.Jailed) // 4th validator should have no slash log, all the others do @@ -464,6 +465,7 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { // power can be handled by the provider chain in a non-throttled manner. func (s *CCVTestSuite) TestSlashingSmallValidators() { s.SetupAllCCVChannels() + providerKeeper := s.providerApp.GetProviderKeeper() // Setup first val with 1000 power and the rest with 10 power. delAddr := s.providerChain.SenderAccount.GetAddress() @@ -508,24 +510,26 @@ func (s *CCVTestSuite) TestSlashingSmallValidators() { vals, err = providerStakingKeeper.GetAllValidators(s.providerCtx()) s.Require().NoError(err) - val0Operator, err := sdk.ValAddressFromHex(vals[0].GetOperator()) + val0Operator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(vals[0].GetOperator()) + s.Require().NoError(err) power, err := providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val0Operator) s.Require().NoError(err) s.Require().Equal(int64(1000), power) - val1Operator, err := sdk.ValAddressFromHex(vals[1].GetOperator()) - power, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val1Operator) + val1Operator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(vals[1].GetOperator()) s.Require().NoError(err) + power, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val1Operator) s.Require().NoError(err) s.Require().Equal(int64(0), power) - val2Operator, err := sdk.ValAddressFromHex(vals[2].GetOperator()) - power, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val2Operator) + val2Operator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(vals[2].GetOperator()) s.Require().NoError(err) + power, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val2Operator) s.Require().NoError(err) s.Require().Equal(int64(0), power) - val3Operator, err := sdk.ValAddressFromHex(vals[3].GetOperator()) + val3Operator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(vals[3].GetOperator()) + s.Require().NoError(err) power, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), val3Operator) s.Require().NoError(err) s.Require().Equal(int64(0), power) @@ -622,13 +626,14 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes } func (s *CCVTestSuite) confirmValidatorJailed(tmVal tmtypes.Validator, checkPower bool) { + providerKeeper := s.providerApp.GetProviderKeeper() sdkVal, err := s.providerApp.GetTestStakingKeeper().GetValidator( s.providerCtx(), sdk.ValAddress(tmVal.Address)) s.Require().NoError(err) s.Require().True(sdkVal.IsJailed()) if checkPower { - valOperator, err := sdk.ValAddressFromHex(sdkVal.GetOperator()) + valOperator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(sdkVal.GetOperator()) s.Require().NoError(err) valPower, err := s.providerApp.GetTestStakingKeeper().GetLastValidatorPower( s.providerCtx(), valOperator) @@ -638,10 +643,11 @@ func (s *CCVTestSuite) confirmValidatorJailed(tmVal tmtypes.Validator, checkPowe } func (s *CCVTestSuite) confirmValidatorNotJailed(tmVal tmtypes.Validator, expectedPower int64) { + providerKeeper := s.providerApp.GetProviderKeeper() sdkVal, err := s.providerApp.GetTestStakingKeeper().GetValidator( s.providerCtx(), sdk.ValAddress(tmVal.Address)) s.Require().NoError(err) - valOperator, err := sdk.ValAddressFromHex(sdkVal.GetOperator()) + valOperator, err := providerKeeper.ValidatorAddressCodec().StringToBytes(sdkVal.GetOperator()) s.Require().NoError(err) valPower, err := s.providerApp.GetTestStakingKeeper().GetLastValidatorPower( s.providerCtx(), valOperator) diff --git a/tests/integration/throttle_retry.go b/tests/integration/throttle_retry.go index cde17014cf..fcc795bb27 100644 --- a/tests/integration/throttle_retry.go +++ b/tests/integration/throttle_retry.go @@ -5,7 +5,6 @@ import ( channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" - sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ccvtypes "github.com/cosmos/interchain-security/v5/x/ccv/types" @@ -93,7 +92,7 @@ func (s *CCVTestSuite) TestSlashRetries() { // Default slash meter replenish fraction is 0.05, so packet should be handled on provider. stakingVal1 := s.mustGetStakingValFromTmVal(*tmval1) s.Require().True(stakingVal1.IsJailed()) - stakingVal1Addr, err := sdk.ValAddressFromHex(stakingVal1.GetOperator()) + stakingVal1Addr, err := providerKeeper.ValidatorAddressCodec().StringToBytes(stakingVal1.GetOperator()) s.Require().NoError(err) stakingVal1LastPower, err := s.providerApp.GetTestStakingKeeper().GetLastValidatorPower(s.providerCtx(), stakingVal1Addr) s.Require().NoError(err) @@ -156,7 +155,7 @@ func (s *CCVTestSuite) TestSlashRetries() { // Val 2 shouldn't be jailed on provider. Slash packet should have been bounced. stakingVal2 := s.mustGetStakingValFromTmVal(*tmval2) s.Require().False(stakingVal2.IsJailed()) - stakingVal2Addr, err := sdk.ValAddressFromHex(stakingVal2.GetOperator()) + stakingVal2Addr, err := providerKeeper.ValidatorAddressCodec().StringToBytes(stakingVal2.GetOperator()) s.Require().NoError(err) stakingVal2LastPower, err := providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), stakingVal2Addr) s.Require().Equal(int64(1000), stakingVal2LastPower) @@ -210,8 +209,7 @@ func (s *CCVTestSuite) TestSlashRetries() { // Provider should have now jailed val 2 stakingVal2 = s.mustGetStakingValFromTmVal(*tmval2) s.Require().True(stakingVal2.IsJailed()) - s.Require().False(stakingVal2.IsJailed()) - stakingVal2Addr, err = sdk.ValAddressFromHex(stakingVal2.GetOperator()) + stakingVal2Addr, err = providerKeeper.ValidatorAddressCodec().StringToBytes(stakingVal2.GetOperator()) s.Require().NoError(err) stakingVal2LastPower, err = providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), stakingVal2Addr) s.Require().Equal(int64(0), stakingVal2LastPower) diff --git a/testutil/ibc_testing/generic_setup.go b/testutil/ibc_testing/generic_setup.go index 92f185b80c..39b23f0da4 100644 --- a/testutil/ibc_testing/generic_setup.go +++ b/testutil/ibc_testing/generic_setup.go @@ -136,8 +136,8 @@ func AddConsumer[Tp testutil.ProviderApp, Tc testutil.ConsumerApp]( // using time.Now() could set the spawn time to be too far in the past or too far in the future SpawnTime: coordinator.CurrentTime, UnbondingPeriod: ccvtypes.DefaultConsumerUnbondingPeriod, - CcvTimeoutPeriod: ccvtypes.DefaultBlocksPerDistributionTransmission, - TransferTimeoutPeriod: ccvtypes.DefaultCCVTimeoutPeriod, + CcvTimeoutPeriod: ccvtypes.DefaultCCVTimeoutPeriod, + TransferTimeoutPeriod: ccvtypes.DefaultTransferTimeoutPeriod, ConsumerRedistributionFraction: ccvtypes.DefaultConsumerRedistributeFrac, BlocksPerDistributionTransmission: ccvtypes.DefaultBlocksPerDistributionTransmission, HistoricalEntries: ccvtypes.DefaultHistoricalEntries, @@ -145,8 +145,8 @@ func AddConsumer[Tp testutil.ProviderApp, Tc testutil.ConsumerApp]( } providerKeeper.SetPendingConsumerAdditionProp(providerChain.GetContext(), &prop) - propsToExecute := providerKeeper.GetConsumerAdditionPropsToExecute(providerChain.GetContext()) - s.Require().Len(propsToExecute, 1, "props to execute is incorrect length") + props := providerKeeper.GetAllPendingConsumerAdditionProps(providerChain.GetContext()) + s.Require().Len(props, 1, "unexpected len consumer addition proposals in AddConsumer") // commit the state on the provider chain coordinator.CommitBlock(providerChain) @@ -156,7 +156,8 @@ func AddConsumer[Tp testutil.ProviderApp, Tc testutil.ConsumerApp]( providerChain.GetContext(), chainID, ) - s.Require().True(found, "consumer genesis not found") + + s.Require().True(found, "consumer genesis not found in AddConsumer") // use InitialValSet as the valset on the consumer var valz []*tmtypes.Validator diff --git a/testutil/integration/validators.go b/testutil/integration/validators.go index 2fca9e5390..4d8f59b2f8 100644 --- a/testutil/integration/validators.go +++ b/testutil/integration/validators.go @@ -1,8 +1,6 @@ package integration import ( - "github.com/cosmos/cosmos-sdk/testutil/mock" - "github.com/cometbft/cometbft/abci/types" tmencoding "github.com/cometbft/cometbft/crypto/encoding" tmtypes "github.com/cometbft/cometbft/types" @@ -17,7 +15,7 @@ func CreateValidators(n int) ( signersByAddress = make(map[string]tmtypes.PrivValidator, n) ) for i := 0; i < n; i++ { - privVal := mock.NewPV() + privVal := tmtypes.NewMockPV() pubKey, err := privVal.GetPubKey() if err != nil { return nil, nil, nil, err diff --git a/x/ccv/consumer/keeper/validators.go b/x/ccv/consumer/keeper/validators.go index 7bc86ded38..de53bdd1db 100644 --- a/x/ccv/consumer/keeper/validators.go +++ b/x/ccv/consumer/keeper/validators.go @@ -288,8 +288,8 @@ func (k Keeper) TrackHistoricalInfo(goCtx context.Context) error { // to be stored correctly in ApplyCCValidatorChanges. panic(err) } - // NOTE: @MSalopek -> double check pk.Address().String() - val, err := stakingtypes.NewValidator(pk.Address().String(), pk, stakingtypes.Description{}) + + val, err := stakingtypes.NewValidator(sdk.ValAddress(pk.Address()).String(), pk, stakingtypes.Description{}) if err != nil { // This should never happen as the pubkey is assumed // to be stored correctly in ApplyCCValidatorChanges. diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index 61b770c320..9ae66aedf1 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -148,9 +148,9 @@ func TestOnRecvDowntimeSlashPacket(t *testing.T) { calls := []*gomock.Call{ mocks.MockStakingKeeper.EXPECT().GetValidatorByConsAddr(ctx, providerAddr.ToSdkConsAddr()). Return(stakingtypes.Validator{ - // must be a hex string so it can be properly decoded by sdktypes.ValAddressFromHex(val.GetOperator()) - // empty string is fine, as it's not used in this test - OperatorAddress: "557D5BD0FA991DAB8EED2B9DCF98AC1B3200D43D", + // provided address must be valid so it can be processed correctly + // by k.ValidatorAddressCodec().StringToBytes(val.GetOperator()) call in GetEffectiveValPower() + OperatorAddress: sdk.ValAddress(packetData.Validator.Address).String(), }, nil).Times(1), mocks.MockStakingKeeper.EXPECT().GetLastValidatorPower(ctx, gomock.Any()). Return(int64(2), nil).Times(1), diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index 5e23f7857f..7be82d4eaa 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -27,8 +27,7 @@ func (k Keeper) GetEffectiveValPower(ctx sdktypes.Context, return math.ZeroInt() } else { // Otherwise, return the staking keeper's LastValidatorPower value. - // NOTE: @MSalopek double check this conversion and see if it's necessary - valAddr, err := sdktypes.ValAddressFromHex(val.GetOperator()) + valAddr, err := k.ValidatorAddressCodec().StringToBytes(val.GetOperator()) if err != nil { return math.ZeroInt() } diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index 77c76d941a..cc3cbcbca8 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -40,9 +40,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // chain are expected to validate the consumer chain at spawn time or get // slashed. It is recommended that spawn time occurs after the proposal end // time. -// Deprecated: Use MsgConsumerAddition instead -// -// Deprecated: Do not use. +// Use MsgConsumerAddition to submit this proposal type. type ConsumerAdditionProposal struct { // the title of the proposal Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` @@ -132,9 +130,7 @@ var xxx_messageInfo_ConsumerAdditionProposal proto.InternalMessageInfo // remove (and stop) a consumer chain. If it passes, all the consumer chain's // state is removed from the provider chain. The outstanding unbonding operation // funds are released. -// Deprecated: Use MsgConsumerRemoval instead -// -// Deprecated: Do not use. +// Use MsgConsumerRemoval to submit this proposal type. type ConsumerRemovalProposal struct { // the title of the proposal Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` @@ -281,9 +277,7 @@ func (m *EquivocationProposal) GetEquivocations() []*types1.Equivocation { // ChangeRewardDenomsProposal is a governance proposal on the provider chain to // mutate the set of denoms accepted by the provider as rewards. -// Deprecated: Use MsgChangeRewardDenoms instead -// -// Deprecated: Do not use. +// Use MsgChangeRewardDenoms to submit this proposal type. type ChangeRewardDenomsProposal struct { // the title of the proposal Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` @@ -1425,115 +1419,115 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1727 bytes of a gzipped FileDescriptorProto + // 1726 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0x8a, 0x94, 0x2c, 0x3e, 0xea, 0xcb, 0x2b, 0x25, 0x5e, 0xa9, 0x2a, 0x45, 0x6f, 0x9a, - 0x54, 0x45, 0xe0, 0x65, 0xa5, 0x20, 0x40, 0x20, 0x34, 0x08, 0x24, 0xca, 0x89, 0x65, 0x35, 0xb1, + 0x15, 0xd7, 0x8a, 0x94, 0x2c, 0x3e, 0xea, 0xcb, 0x2b, 0x25, 0x5e, 0xa9, 0x2a, 0x25, 0x6f, 0x1a, + 0x57, 0x45, 0xe0, 0x65, 0xa5, 0x20, 0x40, 0x20, 0x34, 0x08, 0x24, 0xca, 0x89, 0x65, 0x35, 0xb1, 0xb2, 0x52, 0x65, 0xb4, 0x3d, 0x2c, 0x86, 0xb3, 0x63, 0x72, 0xa0, 0xe5, 0xce, 0x7a, 0x66, 0x76, - 0x1d, 0x5e, 0x7a, 0xee, 0x31, 0xbd, 0x05, 0xbd, 0x34, 0xed, 0xdf, 0xd0, 0x4b, 0xef, 0x3d, 0x04, - 0x3d, 0xa5, 0xb7, 0x9e, 0xd2, 0xc2, 0x3e, 0xf6, 0x8f, 0x68, 0x31, 0xb3, 0x9f, 0xa4, 0x24, 0x87, - 0x86, 0xdb, 0xdb, 0xce, 0x9b, 0xf7, 0x7e, 0xef, 0xfb, 0xbd, 0x21, 0x61, 0x8f, 0x86, 0x92, 0x70, - 0x3c, 0x40, 0x34, 0xf4, 0x04, 0xc1, 0x31, 0xa7, 0x72, 0xd4, 0xc1, 0x38, 0xe9, 0x44, 0x9c, 0x25, - 0xd4, 0x27, 0xbc, 0x93, 0xec, 0x16, 0xdf, 0x4e, 0xc4, 0x99, 0x64, 0xe6, 0x5b, 0xd7, 0xc8, 0x38, - 0x18, 0x27, 0x4e, 0xc1, 0x97, 0xec, 0x6e, 0xbe, 0x7d, 0x13, 0x70, 0xb2, 0xdb, 0x79, 0x46, 0x39, - 0x49, 0xb1, 0x36, 0xd7, 0xfb, 0xac, 0xcf, 0xf4, 0x67, 0x47, 0x7d, 0x65, 0xd4, 0xed, 0x3e, 0x63, - 0xfd, 0x80, 0x74, 0xf4, 0xa9, 0x17, 0x3f, 0xe9, 0x48, 0x3a, 0x24, 0x42, 0xa2, 0x61, 0x94, 0x31, - 0xb4, 0x26, 0x19, 0xfc, 0x98, 0x23, 0x49, 0x59, 0x98, 0x03, 0xd0, 0x1e, 0xee, 0x60, 0xc6, 0x49, - 0x07, 0x07, 0x94, 0x84, 0x52, 0x69, 0x4d, 0xbf, 0x32, 0x86, 0x8e, 0x62, 0x08, 0x68, 0x7f, 0x20, - 0x53, 0xb2, 0xe8, 0x48, 0x12, 0xfa, 0x84, 0x0f, 0x69, 0xca, 0x5c, 0x9e, 0x32, 0x81, 0xad, 0xca, - 0x3d, 0xe6, 0xa3, 0x48, 0xb2, 0xce, 0x25, 0x19, 0x89, 0xec, 0xf6, 0x1d, 0xcc, 0xc4, 0x90, 0x89, - 0x0e, 0x51, 0xfe, 0x87, 0x98, 0x74, 0x92, 0xdd, 0x1e, 0x91, 0x68, 0xb7, 0x20, 0xe4, 0x76, 0x67, - 0x7c, 0x3d, 0x24, 0x4a, 0x1e, 0xcc, 0x68, 0x6e, 0xf7, 0x46, 0x7a, 0xef, 0xa5, 0x11, 0x49, 0x0f, - 0xe9, 0x95, 0xfd, 0x9f, 0x79, 0xb0, 0xba, 0x2c, 0x14, 0xf1, 0x90, 0xf0, 0x03, 0xdf, 0xa7, 0xca, - 0xdb, 0x53, 0xce, 0x22, 0x26, 0x50, 0x60, 0xae, 0xc3, 0x9c, 0xa4, 0x32, 0x20, 0x96, 0xd1, 0x36, - 0x76, 0x1a, 0x6e, 0x7a, 0x30, 0xdb, 0xd0, 0xf4, 0x89, 0xc0, 0x9c, 0x46, 0x8a, 0xd9, 0x9a, 0xd5, - 0x77, 0x55, 0x92, 0xb9, 0x01, 0x0b, 0x69, 0x8a, 0xa8, 0x6f, 0xd5, 0xf4, 0xf5, 0x2d, 0x7d, 0x3e, - 0xf6, 0xcd, 0x4f, 0x60, 0x99, 0x86, 0x54, 0x52, 0x14, 0x78, 0x03, 0xa2, 0x02, 0x65, 0xd5, 0xdb, - 0xc6, 0x4e, 0x73, 0x6f, 0xd3, 0xa1, 0x3d, 0xec, 0xa8, 0xd8, 0x3a, 0x59, 0x44, 0x93, 0x5d, 0xe7, - 0x81, 0xe6, 0x38, 0xac, 0x7f, 0xf3, 0xdd, 0xf6, 0x8c, 0xbb, 0x94, 0xc9, 0xa5, 0x44, 0xf3, 0x2e, - 0x2c, 0xf6, 0x49, 0x48, 0x04, 0x15, 0xde, 0x00, 0x89, 0x81, 0x35, 0xd7, 0x36, 0x76, 0x16, 0xdd, - 0x66, 0x46, 0x7b, 0x80, 0xc4, 0xc0, 0xdc, 0x86, 0x66, 0x8f, 0x86, 0x88, 0x8f, 0x52, 0x8e, 0x79, - 0xcd, 0x01, 0x29, 0x49, 0x33, 0x74, 0x01, 0x44, 0x84, 0x9e, 0x85, 0x9e, 0x2a, 0x04, 0xeb, 0x56, - 0x66, 0x48, 0x5a, 0x04, 0x4e, 0x5e, 0x04, 0xce, 0x79, 0x5e, 0x25, 0x87, 0x0b, 0xca, 0x90, 0x2f, - 0xff, 0xb9, 0x6d, 0xb8, 0x0d, 0x2d, 0xa7, 0x6e, 0xcc, 0xcf, 0x60, 0x35, 0x0e, 0x7b, 0x2c, 0xf4, - 0x69, 0xd8, 0xf7, 0x22, 0xc2, 0x29, 0xf3, 0xad, 0x05, 0x0d, 0xb5, 0x71, 0x05, 0xea, 0x28, 0xab, - 0xa7, 0x14, 0xe9, 0x2b, 0x85, 0xb4, 0x52, 0x08, 0x9f, 0x6a, 0x59, 0xf3, 0x73, 0x30, 0x31, 0x4e, - 0xb4, 0x49, 0x2c, 0x96, 0x39, 0x62, 0x63, 0x7a, 0xc4, 0x55, 0x8c, 0x93, 0xf3, 0x54, 0x3a, 0x83, - 0xfc, 0x35, 0xdc, 0x91, 0x1c, 0x85, 0xe2, 0x09, 0xe1, 0x93, 0xb8, 0x30, 0x3d, 0xee, 0x1b, 0x39, - 0xc6, 0x38, 0xf8, 0x03, 0x68, 0xe3, 0xac, 0x80, 0x3c, 0x4e, 0x7c, 0x2a, 0x24, 0xa7, 0xbd, 0x58, - 0xc9, 0x7a, 0x4f, 0x38, 0xc2, 0xba, 0x46, 0x9a, 0xba, 0x08, 0x5a, 0x39, 0x9f, 0x3b, 0xc6, 0xf6, - 0x71, 0xc6, 0x65, 0x3e, 0x82, 0x1f, 0xf5, 0x02, 0x86, 0x2f, 0x85, 0x32, 0xce, 0x1b, 0x43, 0xd2, - 0xaa, 0x87, 0x54, 0x08, 0x85, 0xb6, 0xd8, 0x36, 0x76, 0x6a, 0xee, 0xdd, 0x94, 0xf7, 0x94, 0xf0, - 0xa3, 0x0a, 0xe7, 0x79, 0x85, 0xd1, 0xbc, 0x07, 0xe6, 0x80, 0x0a, 0xc9, 0x38, 0xc5, 0x28, 0xf0, - 0x48, 0x28, 0x39, 0x25, 0xc2, 0x5a, 0xd2, 0xe2, 0xb7, 0xcb, 0x9b, 0xfb, 0xe9, 0x85, 0xf9, 0x10, - 0xee, 0xde, 0xa8, 0xd4, 0xc3, 0x03, 0x14, 0x86, 0x24, 0xb0, 0x96, 0xb5, 0x2b, 0xdb, 0xfe, 0x0d, - 0x3a, 0xbb, 0x29, 0xdb, 0xfe, 0xce, 0x6f, 0xbf, 0xde, 0x9e, 0xf9, 0xea, 0xeb, 0xed, 0x99, 0xbf, - 0xfd, 0xf9, 0xde, 0x66, 0xd6, 0x71, 0x7d, 0x96, 0x38, 0x59, 0x77, 0x3a, 0x5d, 0x16, 0x4a, 0x12, - 0x4a, 0xcb, 0xb0, 0xff, 0x6e, 0xc0, 0x9d, 0x6e, 0x11, 0x98, 0x21, 0x4b, 0x50, 0xf0, 0xff, 0x6c, - 0xc0, 0x03, 0x68, 0x08, 0xc9, 0xa2, 0xb4, 0xe4, 0xeb, 0xaf, 0x50, 0xf2, 0x0b, 0x4a, 0x4c, 0x5d, - 0xec, 0xb7, 0xbf, 0xd7, 0xa7, 0x3f, 0x18, 0xb0, 0x7e, 0xff, 0x69, 0x4c, 0x13, 0x86, 0xd1, 0xff, - 0x64, 0xa2, 0x9c, 0xc0, 0x12, 0xa9, 0xe0, 0x09, 0xab, 0xd6, 0xae, 0xed, 0x34, 0xf7, 0xde, 0x76, - 0x32, 0x33, 0x8a, 0x81, 0x98, 0xdb, 0x52, 0xd5, 0xee, 0x8e, 0xcb, 0xee, 0xcf, 0x5a, 0x86, 0xfd, - 0x57, 0x03, 0x36, 0x55, 0xae, 0xfa, 0xc4, 0x25, 0xcf, 0x10, 0xf7, 0x8f, 0x48, 0xc8, 0x86, 0xe2, - 0xb5, 0xed, 0xb4, 0x61, 0xc9, 0xd7, 0x48, 0x9e, 0x64, 0x1e, 0xf2, 0x7d, 0x6d, 0xa7, 0xe6, 0x51, - 0xc4, 0x73, 0x76, 0xe0, 0xfb, 0xe6, 0x0e, 0xac, 0x96, 0x3c, 0x5c, 0x65, 0x5c, 0x25, 0x42, 0xb1, - 0x2d, 0xe7, 0x6c, 0xba, 0x0e, 0xa6, 0x09, 0xf4, 0xbf, 0x0d, 0x58, 0xfd, 0x24, 0x60, 0x3d, 0x14, - 0x9c, 0x05, 0x48, 0x0c, 0x54, 0x25, 0x8f, 0x54, 0x8a, 0x39, 0xc9, 0x46, 0x88, 0x76, 0x60, 0xea, - 0x14, 0x2b, 0x31, 0x3d, 0xd4, 0x3e, 0x82, 0xdb, 0x45, 0x53, 0x17, 0x95, 0xa4, 0xfd, 0x3d, 0x5c, - 0x7b, 0xfe, 0xdd, 0xf6, 0x4a, 0x5e, 0xb0, 0x5d, 0x5d, 0x55, 0x47, 0xee, 0x0a, 0x1e, 0x23, 0xf8, - 0x66, 0x0b, 0x9a, 0xb4, 0x87, 0x3d, 0x41, 0x9e, 0x7a, 0x61, 0x3c, 0xd4, 0x45, 0x58, 0x77, 0x1b, - 0xb4, 0x87, 0xcf, 0xc8, 0xd3, 0xcf, 0xe2, 0xa1, 0xf9, 0x1e, 0xbc, 0x99, 0xef, 0x75, 0x2f, 0x41, - 0x81, 0xa7, 0xe4, 0x55, 0xc0, 0xb8, 0xae, 0xc9, 0x45, 0x77, 0x2d, 0xbf, 0xbd, 0x40, 0x81, 0x52, - 0x76, 0xe0, 0xfb, 0xdc, 0xfe, 0xcb, 0x1c, 0xcc, 0x9f, 0x22, 0x8e, 0x86, 0xc2, 0x3c, 0x87, 0x15, - 0x49, 0x86, 0x51, 0x80, 0x24, 0xf1, 0xd2, 0x85, 0x91, 0x79, 0xfa, 0xae, 0x5e, 0x24, 0xd5, 0x1d, - 0xec, 0x54, 0xb6, 0x6e, 0xb2, 0xeb, 0x74, 0x35, 0xf5, 0x4c, 0x22, 0x49, 0xdc, 0xe5, 0x1c, 0x23, - 0x25, 0x9a, 0x1f, 0x80, 0x25, 0x79, 0x2c, 0x64, 0x39, 0xca, 0xcb, 0x19, 0x96, 0x66, 0xfb, 0xcd, - 0xfc, 0x3e, 0x9d, 0x7e, 0xc5, 0xec, 0xba, 0x7e, 0x6a, 0xd7, 0x5e, 0x67, 0x6a, 0x9f, 0xc1, 0x9a, - 0x5a, 0x79, 0x93, 0x98, 0xf5, 0xe9, 0x31, 0x6f, 0x2b, 0xf9, 0x71, 0xd0, 0xcf, 0xc1, 0x4c, 0x04, - 0x9e, 0xc4, 0x9c, 0x7b, 0x05, 0x3b, 0x13, 0x81, 0xc7, 0x21, 0x7d, 0xd8, 0x12, 0xaa, 0xf8, 0xbc, - 0x21, 0x91, 0x7a, 0x07, 0x44, 0x01, 0x09, 0xa9, 0x18, 0xe4, 0xe0, 0xf3, 0xd3, 0x83, 0x6f, 0x68, - 0xa0, 0x4f, 0x15, 0x8e, 0x9b, 0xc3, 0x64, 0x5a, 0xba, 0xd0, 0xba, 0x5e, 0x4b, 0x91, 0xa0, 0x5b, - 0x3a, 0x41, 0x3f, 0xb8, 0x06, 0xa2, 0xc8, 0x92, 0x80, 0x77, 0x2a, 0xbb, 0x4a, 0xf5, 0xbd, 0xa7, - 0x5b, 0xce, 0xe3, 0xa4, 0xaf, 0x06, 0x3a, 0x4a, 0xd7, 0x16, 0x21, 0xc5, 0xbe, 0xcd, 0xba, 0x4f, - 0xbd, 0xac, 0x2a, 0xed, 0x47, 0xc3, 0xec, 0x51, 0x62, 0x97, 0x2b, 0xad, 0x98, 0x22, 0x6e, 0x05, - 0xeb, 0x63, 0x42, 0x1e, 0xd6, 0x17, 0x16, 0x56, 0x1b, 0xf6, 0x4f, 0xa0, 0xa1, 0x5b, 0xf4, 0x00, - 0x5f, 0x0a, 0x73, 0x0b, 0x1a, 0xaa, 0xd6, 0x89, 0x10, 0x44, 0x58, 0x86, 0xee, 0xfd, 0x92, 0x60, - 0x4b, 0xd8, 0xb8, 0xe9, 0x49, 0x26, 0xcc, 0xc7, 0x70, 0x2b, 0x22, 0xfa, 0xbd, 0xa0, 0x05, 0x9b, - 0x7b, 0x1f, 0x3a, 0x53, 0x3c, 0x9c, 0x9d, 0x9b, 0x00, 0xdd, 0x1c, 0xcd, 0xe6, 0xe5, 0x43, 0x70, - 0x62, 0x0d, 0x09, 0xf3, 0x62, 0x52, 0xe9, 0xcf, 0x5e, 0x49, 0xe9, 0x04, 0x5e, 0xa9, 0xf3, 0x5d, - 0x68, 0x1e, 0xa4, 0x6e, 0xff, 0x9c, 0x0a, 0x79, 0x35, 0x2c, 0x8b, 0xd5, 0xb0, 0x3c, 0x84, 0xe5, - 0x6c, 0xbb, 0x9e, 0x33, 0x3d, 0x66, 0xcc, 0x1f, 0x02, 0x64, 0x6b, 0x59, 0x8d, 0xa7, 0x74, 0x54, - 0x37, 0x32, 0xca, 0xb1, 0x3f, 0xb6, 0x05, 0x67, 0xc7, 0xb6, 0xa0, 0xed, 0xc2, 0xca, 0x85, 0xc0, - 0xbf, 0xc8, 0x9f, 0x5e, 0x8f, 0x22, 0x61, 0xbe, 0x01, 0xf3, 0xaa, 0x33, 0x32, 0xa0, 0xba, 0x3b, - 0x97, 0x08, 0x7c, 0xac, 0xa7, 0x75, 0xf9, 0xbc, 0x63, 0x91, 0x47, 0x7d, 0x61, 0xcd, 0xb6, 0x6b, - 0x3b, 0x75, 0x77, 0x39, 0x2e, 0xc5, 0x8f, 0x7d, 0x61, 0xff, 0x12, 0x9a, 0x15, 0x40, 0x73, 0x19, - 0x66, 0x0b, 0xac, 0x59, 0xea, 0x9b, 0xfb, 0xb0, 0x51, 0x02, 0x8d, 0x0f, 0xd7, 0x14, 0xb1, 0xe1, - 0xde, 0x29, 0x18, 0xc6, 0xe6, 0xab, 0xb0, 0x1f, 0xc1, 0xfa, 0x71, 0xd9, 0xca, 0xc5, 0xe8, 0x1e, - 0xf3, 0xd0, 0x18, 0xdf, 0xf3, 0x5b, 0xd0, 0x28, 0x7e, 0xde, 0x68, 0xef, 0xeb, 0x6e, 0x49, 0xb0, - 0x87, 0xb0, 0x7a, 0x21, 0xf0, 0x19, 0x09, 0xfd, 0x12, 0xec, 0x86, 0x00, 0x1c, 0x4e, 0x02, 0x4d, - 0xfd, 0x46, 0x2e, 0xd5, 0x31, 0xd8, 0xb8, 0x40, 0x01, 0xf5, 0x91, 0x64, 0xfc, 0x8c, 0xc8, 0x74, - 0xf1, 0x9e, 0x22, 0x7c, 0x49, 0xa4, 0x30, 0x5d, 0xa8, 0x07, 0x54, 0xc8, 0xac, 0xb2, 0x3e, 0xb8, - 0xb1, 0xb2, 0x92, 0x5d, 0xe7, 0x26, 0x90, 0x23, 0x24, 0x51, 0xd6, 0x91, 0x1a, 0xcb, 0xfe, 0x31, - 0xac, 0x7d, 0x8a, 0x64, 0xcc, 0x89, 0x3f, 0x96, 0xe3, 0x55, 0xa8, 0xa9, 0xfc, 0x19, 0x3a, 0x7f, - 0xea, 0xd3, 0xfe, 0x93, 0x01, 0xd6, 0xfd, 0x2f, 0x22, 0xc6, 0x25, 0xf1, 0xaf, 0x44, 0xe4, 0x25, - 0xe1, 0xbd, 0x84, 0x35, 0x15, 0x2c, 0x41, 0x42, 0xdf, 0x2b, 0xfc, 0x4c, 0xf3, 0xd8, 0xdc, 0x7b, - 0x7f, 0xaa, 0xee, 0x98, 0x54, 0x97, 0x39, 0x70, 0x3b, 0x99, 0xa0, 0x0b, 0xfb, 0x77, 0x06, 0x58, - 0x27, 0x64, 0x74, 0x20, 0x04, 0xed, 0x87, 0x43, 0x12, 0x4a, 0x35, 0xd9, 0x10, 0x26, 0xea, 0xd3, - 0x7c, 0x0b, 0x96, 0x8a, 0x4d, 0xaa, 0x17, 0xa8, 0xa1, 0x17, 0xe8, 0x62, 0x4e, 0x54, 0x0d, 0x66, - 0xee, 0x03, 0x44, 0x9c, 0x24, 0x1e, 0xf6, 0x2e, 0xc9, 0x28, 0xcb, 0xe2, 0x56, 0x75, 0x31, 0xa6, - 0x3f, 0x3e, 0x9d, 0xd3, 0xb8, 0x17, 0x50, 0x7c, 0x42, 0x46, 0xee, 0x82, 0xe2, 0xef, 0x9e, 0x90, - 0x91, 0x7a, 0x0b, 0x45, 0xec, 0x19, 0xe1, 0x7a, 0x9b, 0xd5, 0xdc, 0xf4, 0x60, 0xff, 0xde, 0x80, - 0x3b, 0x45, 0x3a, 0xf2, 0x72, 0x3d, 0x8d, 0x7b, 0x4a, 0xe2, 0x25, 0x71, 0xbb, 0x62, 0xed, 0xec, - 0x35, 0xd6, 0x7e, 0x04, 0x8b, 0x45, 0x83, 0x28, 0x7b, 0x6b, 0x53, 0xd8, 0xdb, 0xcc, 0x25, 0x4e, - 0xc8, 0xc8, 0xfe, 0x4d, 0xc5, 0xb6, 0xc3, 0x51, 0x65, 0xf6, 0xf1, 0xef, 0xb1, 0xad, 0x50, 0x5b, - 0xb5, 0x0d, 0x57, 0xe5, 0xaf, 0x38, 0x50, 0xbb, 0xea, 0x80, 0xfd, 0x47, 0x03, 0xd6, 0xab, 0x5a, - 0xc5, 0x39, 0x3b, 0xe5, 0x71, 0x48, 0x5e, 0xa6, 0xbd, 0x6c, 0xbf, 0xd9, 0x6a, 0xfb, 0x3d, 0x86, - 0xe5, 0x31, 0xa3, 0x44, 0x16, 0x8d, 0x9f, 0x4e, 0x55, 0x63, 0x95, 0xe9, 0xea, 0x2e, 0x55, 0xfd, - 0x10, 0x87, 0x8f, 0xbf, 0x79, 0xde, 0x32, 0xbe, 0x7d, 0xde, 0x32, 0xfe, 0xf5, 0xbc, 0x65, 0x7c, - 0xf9, 0xa2, 0x35, 0xf3, 0xed, 0x8b, 0xd6, 0xcc, 0x3f, 0x5e, 0xb4, 0x66, 0x7e, 0xf5, 0x61, 0x9f, - 0xca, 0x41, 0xdc, 0x73, 0x30, 0x1b, 0x66, 0x7f, 0x16, 0x74, 0x4a, 0x5d, 0xf7, 0x8a, 0xbf, 0x5d, - 0x92, 0xf7, 0x3b, 0x5f, 0x8c, 0xff, 0xa9, 0x23, 0x47, 0x11, 0x11, 0xbd, 0x79, 0x3d, 0x15, 0xde, - 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xed, 0x2b, 0xac, 0x05, 0x12, 0x00, 0x00, + 0x1d, 0x5e, 0x7a, 0xee, 0x31, 0xbd, 0x05, 0xbd, 0x34, 0xed, 0xdf, 0xd0, 0x4b, 0xaf, 0x3d, 0x05, + 0xbd, 0x34, 0xc7, 0x9e, 0xd2, 0x42, 0x3e, 0xf6, 0x6f, 0x28, 0x50, 0xcc, 0xec, 0x27, 0x29, 0xc9, + 0xa6, 0xe1, 0xf6, 0xb6, 0xf3, 0xe6, 0xbd, 0xdf, 0xfb, 0x7e, 0x6f, 0x48, 0xd8, 0xa5, 0xa1, 0x24, + 0x1c, 0xf7, 0x11, 0x0d, 0x3d, 0x41, 0x70, 0xcc, 0xa9, 0x1c, 0xb6, 0x31, 0x4e, 0xda, 0x11, 0x67, + 0x09, 0xf5, 0x09, 0x6f, 0x27, 0x3b, 0xc5, 0xb7, 0x13, 0x71, 0x26, 0x99, 0xf9, 0xce, 0x35, 0x32, + 0x0e, 0xc6, 0x89, 0x53, 0xf0, 0x25, 0x3b, 0xeb, 0xef, 0xde, 0x04, 0x9c, 0xec, 0xb4, 0x9f, 0x53, + 0x4e, 0x52, 0xac, 0xf5, 0xd5, 0x1e, 0xeb, 0x31, 0xfd, 0xd9, 0x56, 0x5f, 0x19, 0x75, 0xb3, 0xc7, + 0x58, 0x2f, 0x20, 0x6d, 0x7d, 0xea, 0xc6, 0x4f, 0xdb, 0x92, 0x0e, 0x88, 0x90, 0x68, 0x10, 0x65, + 0x0c, 0xad, 0x71, 0x06, 0x3f, 0xe6, 0x48, 0x52, 0x16, 0xe6, 0x00, 0xb4, 0x8b, 0xdb, 0x98, 0x71, + 0xd2, 0xc6, 0x01, 0x25, 0xa1, 0x54, 0x5a, 0xd3, 0xaf, 0x8c, 0xa1, 0xad, 0x18, 0x02, 0xda, 0xeb, + 0xcb, 0x94, 0x2c, 0xda, 0x92, 0x84, 0x3e, 0xe1, 0x03, 0x9a, 0x32, 0x97, 0xa7, 0x4c, 0x60, 0xa3, + 0x72, 0x8f, 0xf9, 0x30, 0x92, 0xac, 0x7d, 0x41, 0x86, 0x22, 0xbb, 0xbd, 0x87, 0x99, 0x18, 0x30, + 0xd1, 0x26, 0xca, 0xff, 0x10, 0x93, 0x76, 0xb2, 0xd3, 0x25, 0x12, 0xed, 0x14, 0x84, 0xdc, 0xee, + 0x8c, 0xaf, 0x8b, 0x44, 0xc9, 0x83, 0x19, 0xcd, 0xed, 0x5e, 0x4b, 0xef, 0xbd, 0x34, 0x22, 0xe9, + 0x21, 0xbd, 0xb2, 0xff, 0x33, 0x0b, 0x56, 0x87, 0x85, 0x22, 0x1e, 0x10, 0xbe, 0xef, 0xfb, 0x54, + 0x79, 0x7b, 0xc2, 0x59, 0xc4, 0x04, 0x0a, 0xcc, 0x55, 0x98, 0x91, 0x54, 0x06, 0xc4, 0x32, 0xb6, + 0x8c, 0xed, 0x86, 0x9b, 0x1e, 0xcc, 0x2d, 0x68, 0xfa, 0x44, 0x60, 0x4e, 0x23, 0xc5, 0x6c, 0x4d, + 0xeb, 0xbb, 0x2a, 0xc9, 0x5c, 0x83, 0xb9, 0x34, 0x45, 0xd4, 0xb7, 0x6a, 0xfa, 0xfa, 0x96, 0x3e, + 0x1f, 0xf9, 0xe6, 0xa7, 0xb0, 0x48, 0x43, 0x2a, 0x29, 0x0a, 0xbc, 0x3e, 0x51, 0x81, 0xb2, 0xea, + 0x5b, 0xc6, 0x76, 0x73, 0x77, 0xdd, 0xa1, 0x5d, 0xec, 0xa8, 0xd8, 0x3a, 0x59, 0x44, 0x93, 0x1d, + 0xe7, 0xa1, 0xe6, 0x38, 0xa8, 0x7f, 0xfb, 0xfd, 0xe6, 0x94, 0xbb, 0x90, 0xc9, 0xa5, 0x44, 0xf3, + 0x2e, 0xcc, 0xf7, 0x48, 0x48, 0x04, 0x15, 0x5e, 0x1f, 0x89, 0xbe, 0x35, 0xb3, 0x65, 0x6c, 0xcf, + 0xbb, 0xcd, 0x8c, 0xf6, 0x10, 0x89, 0xbe, 0xb9, 0x09, 0xcd, 0x2e, 0x0d, 0x11, 0x1f, 0xa6, 0x1c, + 0xb3, 0x9a, 0x03, 0x52, 0x92, 0x66, 0xe8, 0x00, 0x88, 0x08, 0x3d, 0x0f, 0x3d, 0x55, 0x08, 0xd6, + 0xad, 0xcc, 0x90, 0xb4, 0x08, 0x9c, 0xbc, 0x08, 0x9c, 0xb3, 0xbc, 0x4a, 0x0e, 0xe6, 0x94, 0x21, + 0x5f, 0xfd, 0x73, 0xd3, 0x70, 0x1b, 0x5a, 0x4e, 0xdd, 0x98, 0x9f, 0xc3, 0x72, 0x1c, 0x76, 0x59, + 0xe8, 0xd3, 0xb0, 0xe7, 0x45, 0x84, 0x53, 0xe6, 0x5b, 0x73, 0x1a, 0x6a, 0xed, 0x0a, 0xd4, 0x61, + 0x56, 0x4f, 0x29, 0xd2, 0xd7, 0x0a, 0x69, 0xa9, 0x10, 0x3e, 0xd1, 0xb2, 0xe6, 0x17, 0x60, 0x62, + 0x9c, 0x68, 0x93, 0x58, 0x2c, 0x73, 0xc4, 0xc6, 0xe4, 0x88, 0xcb, 0x18, 0x27, 0x67, 0xa9, 0x74, + 0x06, 0xf9, 0x6b, 0xb8, 0x23, 0x39, 0x0a, 0xc5, 0x53, 0xc2, 0xc7, 0x71, 0x61, 0x72, 0xdc, 0xb7, + 0x72, 0x8c, 0x51, 0xf0, 0x87, 0xb0, 0x85, 0xb3, 0x02, 0xf2, 0x38, 0xf1, 0xa9, 0x90, 0x9c, 0x76, + 0x63, 0x25, 0xeb, 0x3d, 0xe5, 0x08, 0xeb, 0x1a, 0x69, 0xea, 0x22, 0x68, 0xe5, 0x7c, 0xee, 0x08, + 0xdb, 0x27, 0x19, 0x97, 0xf9, 0x18, 0x7e, 0xd4, 0x0d, 0x18, 0xbe, 0x10, 0xca, 0x38, 0x6f, 0x04, + 0x49, 0xab, 0x1e, 0x50, 0x21, 0x14, 0xda, 0xfc, 0x96, 0xb1, 0x5d, 0x73, 0xef, 0xa6, 0xbc, 0x27, + 0x84, 0x1f, 0x56, 0x38, 0xcf, 0x2a, 0x8c, 0xe6, 0x7d, 0x30, 0xfb, 0x54, 0x48, 0xc6, 0x29, 0x46, + 0x81, 0x47, 0x42, 0xc9, 0x29, 0x11, 0xd6, 0x82, 0x16, 0xbf, 0x5d, 0xde, 0x3c, 0x48, 0x2f, 0xcc, + 0x47, 0x70, 0xf7, 0x46, 0xa5, 0x1e, 0xee, 0xa3, 0x30, 0x24, 0x81, 0xb5, 0xa8, 0x5d, 0xd9, 0xf4, + 0x6f, 0xd0, 0xd9, 0x49, 0xd9, 0xf6, 0xee, 0xfd, 0xf6, 0x9b, 0xcd, 0xa9, 0xaf, 0xbf, 0xd9, 0x9c, + 0xfa, 0xdb, 0x9f, 0xef, 0xaf, 0x67, 0x1d, 0xd7, 0x63, 0x89, 0x93, 0x75, 0xa7, 0xd3, 0x61, 0xa1, + 0x24, 0xa1, 0xb4, 0xff, 0x6e, 0xc0, 0x9d, 0x4e, 0x11, 0x96, 0x01, 0x4b, 0x50, 0xf0, 0xff, 0x6c, + 0xbf, 0x7d, 0x68, 0x08, 0xc9, 0xa2, 0xb4, 0xe0, 0xeb, 0xaf, 0x51, 0xf0, 0x73, 0x4a, 0x4c, 0x5d, + 0xec, 0xb5, 0x5e, 0xe1, 0xd1, 0x1f, 0x0c, 0x58, 0x7d, 0xf0, 0x2c, 0xa6, 0x09, 0xc3, 0xe8, 0x7f, + 0x32, 0x4d, 0x8e, 0x61, 0x81, 0x54, 0xf0, 0x84, 0x55, 0xdb, 0xaa, 0x6d, 0x37, 0x77, 0xdf, 0x75, + 0x32, 0x23, 0x8a, 0x61, 0x98, 0x5b, 0x52, 0xd5, 0xee, 0x8e, 0xca, 0xee, 0x4d, 0x5b, 0x86, 0xfd, + 0x57, 0x03, 0xd6, 0x55, 0x9e, 0x7a, 0xc4, 0x25, 0xcf, 0x11, 0xf7, 0x0f, 0x49, 0xc8, 0x06, 0xe2, + 0x8d, 0xed, 0xb4, 0x61, 0xc1, 0xd7, 0x48, 0x9e, 0x64, 0x1e, 0xf2, 0x7d, 0x6d, 0xa7, 0xe6, 0x51, + 0xc4, 0x33, 0xb6, 0xef, 0xfb, 0xe6, 0x36, 0x2c, 0x97, 0x3c, 0x5c, 0xe5, 0x5b, 0xa5, 0x41, 0xb1, + 0x2d, 0xe6, 0x6c, 0xba, 0x0a, 0x5e, 0x1d, 0xe6, 0x7f, 0x1b, 0xb0, 0xfc, 0x69, 0xc0, 0xba, 0x28, + 0x38, 0x0d, 0x90, 0xe8, 0xab, 0x1a, 0x1e, 0xaa, 0xf4, 0x72, 0x92, 0x0d, 0x0f, 0x6d, 0xfe, 0xc4, + 0xe9, 0x55, 0x62, 0x7a, 0x9c, 0x7d, 0x0c, 0xb7, 0x8b, 0x76, 0x2e, 0xaa, 0x48, 0x7b, 0x7b, 0xb0, + 0x72, 0xf9, 0xfd, 0xe6, 0x52, 0x5e, 0xac, 0x1d, 0x5d, 0x51, 0x87, 0xee, 0x12, 0x1e, 0x21, 0xf8, + 0x66, 0x0b, 0x9a, 0xb4, 0x8b, 0x3d, 0x41, 0x9e, 0x79, 0x61, 0x3c, 0xd0, 0x05, 0x58, 0x77, 0x1b, + 0xb4, 0x8b, 0x4f, 0xc9, 0xb3, 0xcf, 0xe3, 0x81, 0xf9, 0x3e, 0xbc, 0x9d, 0x6f, 0x74, 0x2f, 0x41, + 0x81, 0xa7, 0xe4, 0x55, 0xb8, 0xb8, 0xae, 0xc7, 0x79, 0x77, 0x25, 0xbf, 0x3d, 0x47, 0x81, 0x52, + 0xb6, 0xef, 0xfb, 0xdc, 0xfe, 0xcb, 0x0c, 0xcc, 0x9e, 0x20, 0x8e, 0x06, 0xc2, 0x3c, 0x83, 0x25, + 0x49, 0x06, 0x51, 0x80, 0x24, 0xf1, 0xd2, 0x55, 0x91, 0x79, 0xfa, 0x9e, 0x5e, 0x21, 0xd5, 0xed, + 0xeb, 0x54, 0xf6, 0x6d, 0xb2, 0xe3, 0x74, 0x34, 0xf5, 0x54, 0x22, 0x49, 0xdc, 0xc5, 0x1c, 0x23, + 0x25, 0x9a, 0x1f, 0x82, 0x25, 0x79, 0x2c, 0x64, 0x39, 0xc4, 0xcb, 0xe9, 0x95, 0xe6, 0xfa, 0xed, + 0xfc, 0x3e, 0x9d, 0x7b, 0xc5, 0xd4, 0xba, 0x7e, 0x5e, 0xd7, 0xde, 0x64, 0x5e, 0x9f, 0xc2, 0x8a, + 0x5a, 0x76, 0xe3, 0x98, 0xf5, 0xc9, 0x31, 0x6f, 0x2b, 0xf9, 0x51, 0xd0, 0x2f, 0xc0, 0x4c, 0x04, + 0x1e, 0xc7, 0x9c, 0x79, 0x0d, 0x3b, 0x13, 0x81, 0x47, 0x21, 0x7d, 0xd8, 0x10, 0xaa, 0xf8, 0xbc, + 0x01, 0x91, 0x7a, 0xfa, 0x47, 0x01, 0x09, 0xa9, 0xe8, 0xe7, 0xe0, 0xb3, 0x93, 0x83, 0xaf, 0x69, + 0xa0, 0xcf, 0x14, 0x8e, 0x9b, 0xc3, 0x64, 0x5a, 0x3a, 0xd0, 0xba, 0x5e, 0x4b, 0x91, 0xa0, 0x5b, + 0x3a, 0x41, 0x3f, 0xb8, 0x06, 0xa2, 0xc8, 0x92, 0x80, 0x7b, 0x95, 0x2d, 0xa5, 0xba, 0xde, 0xd3, + 0x0d, 0xe7, 0x71, 0xd2, 0x53, 0xa3, 0x1c, 0xa5, 0x0b, 0x8b, 0x90, 0x62, 0xd3, 0x66, 0xbd, 0xa7, + 0xde, 0x54, 0x95, 0xe6, 0xa3, 0x61, 0xf6, 0x1c, 0xb1, 0xcb, 0x65, 0x56, 0xcc, 0x10, 0xb7, 0x82, + 0xf5, 0x09, 0x21, 0x8f, 0xea, 0x73, 0x73, 0xcb, 0x0d, 0xfb, 0x27, 0xd0, 0xd0, 0x2d, 0xba, 0x8f, + 0x2f, 0x84, 0xb9, 0x01, 0x0d, 0x55, 0xeb, 0x44, 0x08, 0x22, 0x2c, 0x43, 0x77, 0x7e, 0x49, 0xb0, + 0x25, 0xac, 0xdd, 0xf4, 0x18, 0x13, 0xe6, 0x13, 0xb8, 0x15, 0x11, 0xfd, 0x52, 0xd0, 0x82, 0xcd, + 0xdd, 0x8f, 0x9c, 0x09, 0x9e, 0xcc, 0xce, 0x4d, 0x80, 0x6e, 0x8e, 0x66, 0xf3, 0xf2, 0x09, 0x38, + 0xb6, 0x82, 0x84, 0x79, 0x3e, 0xae, 0xf4, 0x67, 0xaf, 0xa5, 0x74, 0x0c, 0xaf, 0xd4, 0xf9, 0x1e, + 0x34, 0xf7, 0x53, 0xb7, 0x7f, 0x4e, 0x85, 0xbc, 0x1a, 0x96, 0xf9, 0x6a, 0x58, 0x1e, 0xc1, 0x62, + 0xb6, 0x57, 0xcf, 0x98, 0x1e, 0x33, 0xe6, 0x0f, 0x01, 0xb2, 0x85, 0xac, 0xc6, 0x53, 0x3a, 0xa8, + 0x1b, 0x19, 0xe5, 0xc8, 0x1f, 0xd9, 0x80, 0xd3, 0x23, 0x1b, 0xd0, 0x76, 0x61, 0xe9, 0x5c, 0xe0, + 0x5f, 0xe4, 0x8f, 0xae, 0xc7, 0x91, 0x30, 0xdf, 0x82, 0x59, 0xd5, 0x19, 0x19, 0x50, 0xdd, 0x9d, + 0x49, 0x04, 0x3e, 0xd2, 0xb3, 0xba, 0x7c, 0xd8, 0xb1, 0xc8, 0xa3, 0xbe, 0xb0, 0xa6, 0xb7, 0x6a, + 0xdb, 0x75, 0x77, 0x31, 0x2e, 0xc5, 0x8f, 0x7c, 0x61, 0xff, 0x12, 0x9a, 0x15, 0x40, 0x73, 0x11, + 0xa6, 0x0b, 0xac, 0x69, 0xea, 0x9b, 0x7b, 0xb0, 0x56, 0x02, 0x8d, 0x0e, 0xd7, 0x14, 0xb1, 0xe1, + 0xde, 0x29, 0x18, 0x46, 0xe6, 0xab, 0xb0, 0x1f, 0xc3, 0xea, 0x51, 0xd9, 0xca, 0xc5, 0xe8, 0x1e, + 0xf1, 0xd0, 0x18, 0xdd, 0xf1, 0x1b, 0xd0, 0x28, 0x7e, 0xd8, 0x68, 0xef, 0xeb, 0x6e, 0x49, 0xb0, + 0x07, 0xb0, 0x7c, 0x2e, 0xf0, 0x29, 0x09, 0xfd, 0x12, 0xec, 0x86, 0x00, 0x1c, 0x8c, 0x03, 0x4d, + 0xfc, 0x3a, 0x2e, 0xd5, 0x31, 0x58, 0x3b, 0x47, 0x01, 0xf5, 0x91, 0x64, 0xfc, 0x94, 0xc8, 0x74, + 0xed, 0x9e, 0x20, 0x7c, 0x41, 0xa4, 0x30, 0x5d, 0xa8, 0x07, 0x54, 0xc8, 0xac, 0xb2, 0x3e, 0xbc, + 0xb1, 0xb2, 0x92, 0x1d, 0xe7, 0x26, 0x90, 0x43, 0x24, 0x51, 0xd6, 0x91, 0x1a, 0xcb, 0xfe, 0x31, + 0xac, 0x7c, 0x86, 0x64, 0xcc, 0x89, 0x3f, 0x92, 0xe3, 0x65, 0xa8, 0xa9, 0xfc, 0x19, 0x3a, 0x7f, + 0xea, 0xd3, 0xfe, 0x93, 0x01, 0xd6, 0x83, 0x2f, 0x23, 0xc6, 0x25, 0xf1, 0xaf, 0x44, 0xe4, 0x25, + 0xe1, 0xbd, 0x80, 0x15, 0x15, 0x2c, 0x41, 0x42, 0xdf, 0x2b, 0xfc, 0x4c, 0xf3, 0xd8, 0xdc, 0xfd, + 0x60, 0xa2, 0xee, 0x18, 0x57, 0x97, 0x39, 0x70, 0x3b, 0x19, 0xa3, 0x0b, 0xfb, 0x77, 0x06, 0x58, + 0xc7, 0x64, 0xb8, 0x2f, 0x04, 0xed, 0x85, 0x03, 0x12, 0x4a, 0x35, 0xd9, 0x10, 0x26, 0xea, 0xd3, + 0x7c, 0x07, 0x16, 0x8a, 0x4d, 0xaa, 0x17, 0xa8, 0xa1, 0x17, 0xe8, 0x7c, 0x4e, 0x54, 0x0d, 0x66, + 0xee, 0x01, 0x44, 0x9c, 0x24, 0x1e, 0xf6, 0x2e, 0xc8, 0x30, 0xcb, 0xe2, 0x46, 0x75, 0x31, 0xa6, + 0x3f, 0x3b, 0x9d, 0x93, 0xb8, 0x1b, 0x50, 0x7c, 0x4c, 0x86, 0xee, 0x9c, 0xe2, 0xef, 0x1c, 0x93, + 0xa1, 0x7a, 0x09, 0x45, 0xec, 0x39, 0xe1, 0x7a, 0x9b, 0xd5, 0xdc, 0xf4, 0x60, 0xff, 0xde, 0x80, + 0x3b, 0x45, 0x3a, 0xf2, 0x72, 0x3d, 0x89, 0xbb, 0x4a, 0xe2, 0x25, 0x71, 0xbb, 0x62, 0xed, 0xf4, + 0x35, 0xd6, 0x7e, 0x0c, 0xf3, 0x45, 0x83, 0x28, 0x7b, 0x6b, 0x13, 0xd8, 0xdb, 0xcc, 0x25, 0x8e, + 0xc9, 0xd0, 0xfe, 0x4d, 0xc5, 0xb6, 0x83, 0x61, 0x65, 0xf6, 0xf1, 0x57, 0xd8, 0x56, 0xa8, 0xad, + 0xda, 0x86, 0xab, 0xf2, 0x57, 0x1c, 0xa8, 0x5d, 0x75, 0xc0, 0xfe, 0xa3, 0x01, 0xab, 0x55, 0xad, + 0xe2, 0x8c, 0x9d, 0xf0, 0x38, 0x24, 0x2f, 0xd3, 0x5e, 0xb6, 0xdf, 0x74, 0xb5, 0xfd, 0x9e, 0xc0, + 0xe2, 0x88, 0x51, 0x22, 0x8b, 0xc6, 0x4f, 0x27, 0xaa, 0xb1, 0xca, 0x74, 0x75, 0x17, 0xaa, 0x7e, + 0x88, 0x83, 0x27, 0xdf, 0x5e, 0xb6, 0x8c, 0xef, 0x2e, 0x5b, 0xc6, 0xbf, 0x2e, 0x5b, 0xc6, 0x57, + 0x2f, 0x5a, 0x53, 0xdf, 0xbd, 0x68, 0x4d, 0xfd, 0xe3, 0x45, 0x6b, 0xea, 0x57, 0x1f, 0xf5, 0xa8, + 0xec, 0xc7, 0x5d, 0x07, 0xb3, 0x41, 0xf6, 0x37, 0x41, 0xbb, 0xd4, 0x75, 0xbf, 0xf8, 0xc3, 0x25, + 0xf9, 0xa0, 0xfd, 0xe5, 0xe8, 0xdf, 0x39, 0x72, 0x18, 0x11, 0xd1, 0x9d, 0xd5, 0x53, 0xe1, 0xfd, + 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xd2, 0x8c, 0xdc, 0xff, 0x11, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) {