diff --git a/.github/workflows/proto-registry.yml b/.github/workflows/proto-registry.yml index 025c45b618..61896fce21 100644 --- a/.github/workflows/proto-registry.yml +++ b/.github/workflows/proto-registry.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.26.1 + - uses: bufbuild/buf-setup-action@v1.27.0 - uses: bufbuild/buf-push-action@v1 with: input: "proto" diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index ce525c5a8a..6a56fae80c 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.26.1 + - uses: bufbuild/buf-setup-action@v1.27.0 - uses: bufbuild/buf-breaking-action@v1 with: input: "proto" diff --git a/CHANGELOG.md b/CHANGELOG.md index a238df4a44..b111b70c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Add an entry to the unreleased provider section whenever merging a PR to main that is not targeted at a specific release. These entries will eventually be included in a provider release. +* (feat!) [#1230](https://github.com/cosmos/interchain-security/pull/1230) Throttle with retries provider changes. * (feature!) [#1280](https://github.com/cosmos/interchain-security/pull/1280) provider proposal for changing reward denoms * (feature!) [#1244](https://github.com/cosmos/interchain-security/pull/1244) Update the default consumer unbonding period to 2 weeks. * (deps) [#1259](https://github.com/cosmos/interchain-security/pull/1259) Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.47.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.5). diff --git a/Makefile b/Makefile index 516db825bd..a614e3bea0 100644 --- a/Makefile +++ b/Makefile @@ -183,3 +183,10 @@ build-docs: @cd docs && ./build.sh .PHONY: build-docs + +############################################################################### +### Test Traces ### +############################################################################### + +e2e-traces: + cd tests/e2e; go test -timeout 30s -run ^TestWriteExamples -v \ No newline at end of file diff --git a/app/consumer/genesis.go b/app/consumer/genesis.go index eaa4676344..4fc69f01e1 100644 --- a/app/consumer/genesis.go +++ b/app/consumer/genesis.go @@ -114,9 +114,7 @@ func GetConsumerGenesisTransformCmd() *cobra.Command { Example: $ %s transform /path/to/ccv_consumer_genesis.json `, version.AppName), Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return TransformConsumerGenesis(cmd, args) - }, + RunE: TransformConsumerGenesis, } return cmd diff --git a/docs/docs/adrs/adr-005-cryptographic-equivocation-verification.md b/docs/docs/adrs/adr-005-cryptographic-equivocation-verification.md index dac41b912e..8bd68dfcaf 100644 --- a/docs/docs/adrs/adr-005-cryptographic-equivocation-verification.md +++ b/docs/docs/adrs/adr-005-cryptographic-equivocation-verification.md @@ -6,7 +6,8 @@ title: Cryptographic verification of equivocation evidence ## Changelog * 5/1/2023: First draft -* 7/23/23: Add light client attacks handling +* 7/23/2023: Add light client attacks handling +* 9/6/2023: Add double signing attacks handling ## Status @@ -19,7 +20,7 @@ Every proposal needs to go through a (two weeks) voting period before it can be Given a three-week unbonding period, this means that an equivocation proposal needs to be submitted within one week since the infraction occurred. This ADR proposes a system to slash validators automatically for equivocation, immediately upon the provider chain's receipt of the evidence. Another thing to note is that we intend to introduce this system in stages, since even the partial ability to slash and/or tombstone is a strict improvement in security. -For the first stage of this work, we will only handle light client attacks. +The feature is implemented in two parts, each with its dedicated endpoint. One endpoint handles light client attacks, while the other handles double signing attacks. ### Light Client Attack @@ -42,48 +43,99 @@ The types of light client attacks are defined by analyzing the differences betwe There are three types of light client attacks: lunatic attack, equivocation attack, and amnesia attack. For details, see the [CometBFT specification](https://github.com/cometbft/cometbft/blob/main/spec/light-client/attacks/notes-on-evidence-handling.md#evidence-handling). -When a light client agent detects two conflicting headers, it will initially verify their traces (see [cometBFT detector](https://github.com/cometbft/cometbft/blob/2af25aea6cfe6ac4ddac40ceddfb8c8eee17d0e6/light/detector.go#L28)) using its primary and witness nodes. +When a light client agent detects two conflicting headers, it will initially verify their traces (see [cometBFT detector](https://github.com/cometbft/cometbft/blob/v0.34.28/light/detector.go#L28)) using its primary and witness nodes. If these headers pass successful verification, the Byzantine validators will be identified based on the header's commit signatures -and the type of light client attack. The agent will then transmit this information to its nodes using a [`LightClientAttackEvidence`](https://github.com/cometbft/cometbft/blob/feed0ddf564e113a840c4678505601256b93a8bc/docs/architecture/adr-047-handling-evidence-from-light-client.md) to be eventually voted on and added to a block. +and the type of light client attack. The agent will then transmit this information to its nodes using a [`LightClientAttackEvidence`](https://github.com/cometbft/cometbft/blob/v0.34.28/spec/consensus/evidence.md#light-client-attacks) evidence to be eventually voted on and added to a block. Note that from a light client agent perspective, it is not possible to establish whether a primary or a witness node, or both, are malicious. -Therefore, it will create and send two `LightClientAttackEvidence`: one against the primary (sent to the witness), and one against the witness (sent to the primary). -Both nodes will then verify it before broadcasting it and adding it to the [evidence pool](https://github.com/cometbft/cometbft/blob/2af25aea6cfe6ac4ddac40ceddfb8c8eee17d0e6/evidence/pool.go#L28). -If a `LightClientAttackEvidence` is finally committed to a block, the chain's evidence module will execute it, resulting in the jailing and the slashing of the validators responsible for the light client attack. +Therefore, it will create and send two evidences: one against the primary (sent to the witness), and one against the witness (sent to the primary). +Both nodes will then verify it before broadcasting it and adding it to the [evidence pool](https://github.com/cometbft/cometbft/blob/v0.34.28/evidence/pool.go#L28). +If an evidence is finally committed to a block, the chain's evidence module will execute it, resulting in the jailing and the slashing of the validators responsible for the light client attack. -Light clients are a core component of IBC. In the event of a light client attack, IBC relayers notify the affected chains by submitting an [IBC misbehavior message](https://github.com/cosmos/ibc-go/blob/2b7c969066fbcb18f90c7f5bd256439ca12535c7/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L79). -A misbehavior message includes the conflicting headers that constitute a `LightClientAttackEvidence`. Upon receiving such a message, +Light clients are a core component of IBC. In the event of a light client attack, IBC relayers notify the affected chains by submitting an [IBC misbehavior message](https://github.com/cosmos/ibc-go/blob/v4.4.2/proto/ibc/lightclients/tendermint/v1/tendermint.proto#L79). +A misbehavior message includes the conflicting headers that constitute a light client attack evidence. Upon receiving such a message, a chain will first verify whether these headers would have convinced its light client. This verification is achieved by checking -the header states against the light client consensus states (see [IBC misbehaviour handler](https://github.com/cosmos/ibc-go/blob/2b7c969066fbcb18f90c7f5bd256439ca12535c7/modules/light-clients/07-tendermint/types/misbehaviour_handle.go#L101)). If the misbehaviour is successfully verified, the chain will then "freeze" the +the header states against the light client consensus states (see [IBC misbehaviour handler](https://github.com/cosmos/ibc-go/blob/v4.4.2/modules/light-clients/07-tendermint/types/misbehaviour_handle.go#L24)). If the misbehaviour is successfully verified, the chain will then "freeze" the light client, halting any further trust in or updating of its states. +### Double Signing Attack + +A double signing attack, also known as equivocation, +occurs when a validator votes for two different blocks in the same round of the CometBFT consensus. +This consensus mechanism operates with multiple voting rounds at each block height, +and it strictly prohibits sending two votes of the same type during a round +(see [CometBFT State Machine Overview](https://github.com/cometbft/cometbft/blob/v0.34.28/spec/consensus/consensus.md#state-machine-overview)). + +When a node observes two votes from the same peer, it will use these two votes to create +a [`DuplicateVoteEvidence`](https://github.com/cometbft/cometbft/blob/v0.34.28/types/evidence.go#L35) +evidence and gossip it to the other nodes in the network +(see [CometBFT equivocation detection](https://github.com/cometbft/cometbft/blob/v0.34.28/spec/consensus/evidence.md#detection)). +Each node will then verify the evidence according to the CometBFT rules that define a valid double signing infraction, and based on this verification, they will decide whether to add the evidence to a block. +During the evidence verification process, the signatures of the conflicting votes must be verified successfully. +Note that this is achieved using the public key of the misbehaving validator, along with the chain ID of the chain where the infraction occurred (see [CometBFT equivocation verification](https://github.com/cometbft/cometbft/blob/v0.34.28/spec/consensus/evidence.md#verification)). + +Once a double signing evidence is committed to a block, the consensus layer will report the equivocation to the evidence module of the Cosmos SDK application layer. +The application will, in turn, punish the malicious validator through jailing, tombstoning and slashing +(see [handleEquivocationEvidence](https://github.com/cosmos/cosmos-sdk/blob/v0.45.16-ics-lsm/x/evidence/keeper/infraction.go#L263)). + ## Decision -In the first iteration of the feature, we will introduce a new endpoint: `HandleConsumerMisbehaviour(ctx sdk.Context, misbehaviour ibctmtypes.Misbehaviour)`. +### Light Client Attack + +In the first part of the feature, we introduce a new endpoint: `HandleConsumerMisbehaviour(ctx sdk.Context, misbehaviour ibctmtypes.Misbehaviour)`. The main idea is to leverage the current IBC misbehaviour handling and update it to solely jail and slash the validators that -performed a light client attack. This update will be made under the assumption that the chain connected via this light client -share the same validator set, as it is the case with Replicated Security. +performed a light client attack. Note that in this context, we assume that chains connected via a light client +share the same validator set, as is the case with Replicated Security. -This endpoint will reuse the IBC client libraries to verify that the misbehaviour headers would have fooled the light client. -Additionally, it’s crucial that the endpoint logic result in the slashing and jailing of validators under the same conditions -as a light client agent detector. Therefore, the endpoint will ensure that the two conditions are met: +This endpoint reuses the IBC client libraries to verify that the misbehaviour headers would have fooled the light client. +Additionally, it’s crucial that the endpoint logic results in the slashing and jailing of validators under the same conditions +as a light client agent detector. Therefore, the endpoint ensures that the two conditions are met: the headers in the misbehaviour message have the same block height, and the light client isn’t expired. -After having successfully verified a misbehaviour, the endpoint will execute the jailing and slashing of the malicious validators similarly as in the evidence module. +After having successfully verified a misbehaviour, the endpoint executes the jailing and slashing of the malicious validators similarly as in the evidence module. + +### Double Signing Attack + +In the second part of the feature, we introduce a new endpoint `HandleConsumerDoubleVoting( +ctx sdk.Context, evidence *tmtypes.DuplicateVoteEvidence, chainID string, pubkey cryptotypes.PubKey)`. +Simply put, the handling logic verifies a double signing evidence against a provided +public key and chain ID and, if successful, executes the jailing of the malicious validator who double voted. + +We define a new +`MsgSubmitConsumerDoubleVoting` message to report a double voting evidence observed +on a consumer chain to the endpoint of the provider chain. This message contains two fields: +a double signing evidence +`duplicate_vote_evidence` and a light client header for the infraction block height, +referred to as `infraction_block_header`. +The latter provides the malicious validator's public key and the chain ID required to verify the signature of the votes contained in the evidence. + +Note that double signing evidence is not verified using the same conditions as in the implementation CometBFT (see +[`verify(evidence types.Evidence)`](https://github.com/cometbft/cometbft/blob/v0.34.28/evidence/verify.go#L19) method). Specifically, we do not check that the evidence hasn't expired. +More details can be found in the ["Current limitations"](#current-limitations) section below. + +Upon a successful equivocation verification, the misbehaving validator is jailed for the maximum time +(see [DoubleSignJailEndTime](https://github.com/cosmos/cosmos-sdk/blob/v0.45.16-ics-lsm/x/evidence/types/params.go#L11) +in the SDK evidence module). -### Current limitations: -- This only handles light client attacks, not double signing. In the future, we will add the code to also verify double signing. +### Current limitations: -- We cannot derive an infraction height from the evidence, so it is only possible to tombstone validators, not actually slash them. +- We cannot derive an infraction height from the evidence, so it is only possible to jail validators, not actually slash them. To explain the technical reasons behind this limitation, let's recap the initial consumer initiated slashing logic. -In a nutshell, consumer heights are mapped to provider heights through VSCPackets, namely through the so called vscIDs. -When an infraction occurs on the consumer, a SlashPacket containing the vscID obtained from mapping the consumer infraction height -is sent to the provider. Upon receiving the packet, the provider maps the consumer infraction height to a local infraction height, -which is used to slash the misbehaving validator. In the context of untrusted consumer chains, all their states, including vscIDs, -could be corrupted and therefore cannot be used for slashing purposes. + In a nutshell, consumer heights are mapped to provider heights through VSCPackets, namely through the so called vscIDs. + When an infraction occurs on the consumer, a SlashPacket containing the vscID obtained from mapping the consumer infraction height + is sent to the provider. Upon receiving the packet, the provider maps the consumer infraction height to a local infraction height, + which is used to slash the misbehaving validator. In the context of untrusted consumer chains, all their states, including vscIDs, + could be corrupted and therefore cannot be used for slashing purposes. + +- For the same reasons explained above, the age of a consumer double signing evidence can't be verified, +either using its infraction height or its unsigned timestamp. Note that changes the jailing behaviour, potentially leading to a validator's jailing based on some "old" evidence from a consumer, which wouldn't occur if the consumer were a standalone chain. + +- In the first stage of this feature, validators are jailed indefinitely without being tombstoned. +The underlying reason is that a malicious validator could take advantage of getting tombstoned +to avoid being slashed on the provider ([see comment](https://github.com/cosmos/interchain-security/pull/1232#issuecomment-1693127641)). - Currently, the endpoint can only handle "equivocation" light client attacks. This is because the "lunatic" attacks require the endpoint to possess the ability to dissociate which header is conflicted or trusted upon receiving a misbehavior message. Without this information, it's not possible to define the Byzantine validators from the conflicting headers (see [comment](https://github.com/cosmos/interchain-security/pull/826#discussion_r1268668684)). @@ -92,7 +144,8 @@ could be corrupted and therefore cannot be used for slashing purposes. ### Positive -- After this ADR is applied, it will be possible for the provider chain to tombstone validators who committed a light client attack. +- It is now possible for the provider chain to jail validators who committed +light client or double signing attacks on a consumer chain. ### Negative @@ -102,4 +155,6 @@ could be corrupted and therefore cannot be used for slashing purposes. ## References * [ICS misbehaviour handling PR](https://github.com/cosmos/interchain-security/pull/826) +* [Consumer double voting handler PR](https://github.com/cosmos/interchain-security/pull/1232) * [Architectural diagrams](https://docs.google.com/document/d/1fe1uSJl1ZIYWXoME3Yf4Aodvz7V597Ric875JH-rigM/edit#heading=h.rv4t8i6d6jfn) +* [ADR on equivocation slashing](https://github.com/cosmos/interchain-security/blob/main/docs/docs/adrs/adr-013-equivocation-slashing.md) diff --git a/go.mod b/go.mod index 8483e0a097..9d761c3937 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tidwall/gjson v1.17.0 golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb + golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect golang.org/x/net v0.12.0 // indirect golang.org/x/sys v0.11.0 // indirect google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect diff --git a/proto/interchain_security/ccv/consumer/v1/query.proto b/proto/interchain_security/ccv/consumer/v1/query.proto index dfdc7e6702..3c56aed7ea 100644 --- a/proto/interchain_security/ccv/consumer/v1/query.proto +++ b/proto/interchain_security/ccv/consumer/v1/query.proto @@ -6,6 +6,8 @@ option go_package = "github.com/cosmos/interchain-security/v3/x/ccv/consumer/typ import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "interchain_security/ccv/consumer/v1/consumer.proto"; +import "interchain_security/ccv/v1/wire.proto"; service Query { // ConsumerGenesis queries the genesis state needed to start a consumer chain @@ -23,6 +25,11 @@ service Query { rpc QueryProviderInfo(QueryProviderInfoRequest) returns (QueryProviderInfoResponse) { option (google.api.http).get = "/interchain_security/ccv/consumer/provider-info"; } + + // QueryThrottleState returns on-chain state relevant to throttled consumer packets + rpc QueryThrottleState(QueryThrottleStateRequest) returns (QueryThrottleStateResponse) { + option (google.api.http).get = "/interchain_security/ccv/consumer/throttle_state"; + } } // NextFeeDistributionEstimate holds information about next fee distribution @@ -64,6 +71,14 @@ message QueryProviderInfoResponse { ChainInfo provider = 2 [ (gogoproto.nullable) = false ]; } +message QueryThrottleStateRequest {} + +message QueryThrottleStateResponse { + SlashRecord slash_record = 1 [ (gogoproto.nullable) = true ]; + repeated interchain_security.ccv.v1.ConsumerPacketData packet_data_queue = 2 [ (gogoproto.nullable) = false ]; +} + + message ChainInfo { string chainID = 1; string clientID = 2; diff --git a/proto/interchain_security/ccv/provider/v1/provider.proto b/proto/interchain_security/ccv/provider/v1/provider.proto index eb502b0d97..f085ba472d 100644 --- a/proto/interchain_security/ccv/provider/v1/provider.proto +++ b/proto/interchain_security/ccv/provider/v1/provider.proto @@ -151,6 +151,10 @@ message GlobalSlashEntry { // Params defines the parameters for CCV Provider module message Params { + + // Reserve 8th slot for removed max throttled packet param + reserved 8; + ibc.lightclients.tendermint.v1.ClientState template_client = 1; // TrustingPeriodFraction is used to compute the consumer and provider IBC // client's TrustingPeriod from the chain defined UnbondingPeriod @@ -178,10 +182,6 @@ message Params { // total voting power that the slash meter can hold. string slash_meter_replenish_fraction = 7; - // The maximum amount of throttled slash or vsc matured packets - // that can be queued for a single consumer before the provider chain halts. - int64 max_throttled_packets = 8; - // The fee required to be paid to add a reward denom cosmos.base.v1beta1.Coin consumer_reward_denom_registration_fee = 9 [ (gogoproto.nullable) = false ]; diff --git a/proto/interchain_security/ccv/provider/v1/query.proto b/proto/interchain_security/ccv/provider/v1/query.proto index 6dfcdcb320..e648e2be35 100644 --- a/proto/interchain_security/ccv/provider/v1/query.proto +++ b/proto/interchain_security/ccv/provider/v1/query.proto @@ -65,14 +65,6 @@ service Query { "/interchain_security/ccv/provider/throttle_state"; } - // QueryThrottledConsumerPacketData returns a list of pending packet data - // instances (slash packet and vsc matured) for a single consumer chain - rpc QueryThrottledConsumerPacketData(QueryThrottledConsumerPacketDataRequest) - returns (QueryThrottledConsumerPacketDataResponse) { - option (google.api.http).get = - "/interchain_security/ccv/provider/pending_consumer_packets"; - } - // QueryRegisteredConsumerRewardDenoms returns a list of consumer reward // denoms that are registered rpc QueryRegisteredConsumerRewardDenoms( @@ -151,35 +143,6 @@ message QueryThrottleStateResponse { // full google.protobuf.Timestamp next_replenish_candidate = 3 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; - // data relevant to currently throttled slash packets - repeated ThrottledSlashPacket packets = 4; -} - -message QueryThrottledConsumerPacketDataRequest { string chain_id = 1; } - -message QueryThrottledConsumerPacketDataResponse { - string chain_id = 1; - uint64 size = 2; - repeated ThrottledPacketDataWrapper packetDataInstances = 3 - [ (gogoproto.nullable) = false ]; -} - -// A query wrapper type for the global entry and data relevant to a throttled -// slash packet. -message ThrottledSlashPacket { - interchain_security.ccv.provider.v1.GlobalSlashEntry global_entry = 1 - [ (gogoproto.nullable) = false ]; - interchain_security.ccv.v1.SlashPacketData data = 2 - [ (gogoproto.nullable) = false ]; -} - -// ThrottledPacketDataWrapper contains either SlashPacketData or -// VSCMaturedPacketData -message ThrottledPacketDataWrapper { - oneof data { - interchain_security.ccv.v1.SlashPacketData slash_packet = 1; - interchain_security.ccv.v1.VSCMaturedPacketData vsc_matured_packet = 2; - } } message QueryRegisteredConsumerRewardDenomsRequest {} diff --git a/proto/interchain_security/ccv/v1/shared_consumer.proto b/proto/interchain_security/ccv/v1/shared_consumer.proto index 07667cf9d9..149e8630c5 100644 --- a/proto/interchain_security/ccv/v1/shared_consumer.proto +++ b/proto/interchain_security/ccv/v1/shared_consumer.proto @@ -22,59 +22,63 @@ import "gogoproto/gogo.proto"; // SetConsumerGenesis. // message ConsumerParams { - // TODO: Remove enabled flag and find a better way to setup integration tests - // See: https://github.com/cosmos/interchain-security/issues/339 - bool enabled = 1; - - /////////////////////// - // Distribution Params - // Number of blocks between ibc-token-transfers from the consumer chain to - // the provider chain. Note that at this transmission event a fraction of - // the accumulated tokens are divided and sent consumer redistribution - // address. - int64 blocks_per_distribution_transmission = 2; - - // Channel, and provider-chain receiving address to send distribution token - // transfers over. These parameters is auto-set during the consumer <-> - // provider handshake procedure. - string distribution_transmission_channel = 3; - string provider_fee_pool_addr_str = 4; - // Sent CCV related IBC packets will timeout after this duration - google.protobuf.Duration ccv_timeout_period = 5 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - - // Sent transfer related IBC packets will timeout after this duration - google.protobuf.Duration transfer_timeout_period = 6 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - - // The fraction of tokens allocated to the consumer redistribution address - // during distribution events. The fraction is a string representing a - // decimal number. For example "0.75" would represent 75%. - string consumer_redistribution_fraction = 7; - - // The number of historical info entries to persist in store. - // This param is a part of the cosmos sdk staking module. In the case of - // a ccv enabled consumer chain, the ccv module acts as the staking module. - int64 historical_entries = 8; - - // Unbonding period for the consumer, - // which should be smaller than that of the provider in general. - google.protobuf.Duration unbonding_period = 9 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - - // The threshold for the percentage of validators at the bottom of the set who - // can opt out of running the consumer chain without being punished. For - // example, a value of 0.05 means that the validators in the bottom 5% of the - // set can opt out - string soft_opt_out_threshold = 10; - - // Reward denoms. These are the denominations which are allowed to be sent to - // the provider as rewards. - repeated string reward_denoms = 11; - - // Provider-originated reward denoms. These are denoms coming from the - // provider which are allowed to be used as rewards. e.g. "uatom" - repeated string provider_reward_denoms = 12; + // TODO: Remove enabled flag and find a better way to setup integration tests + // See: https://github.com/cosmos/interchain-security/issues/339 + bool enabled = 1; + + /////////////////////// + // Distribution Params + // Number of blocks between ibc-token-transfers from the consumer chain to + // the provider chain. Note that at this transmission event a fraction of + // the accumulated tokens are divided and sent consumer redistribution + // address. + int64 blocks_per_distribution_transmission = 2; + + // Channel, and provider-chain receiving address to send distribution token + // transfers over. These parameters is auto-set during the consumer <-> + // provider handshake procedure. + string distribution_transmission_channel = 3; + string provider_fee_pool_addr_str = 4; + // Sent CCV related IBC packets will timeout after this duration + google.protobuf.Duration ccv_timeout_period = 5 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + + // Sent transfer related IBC packets will timeout after this duration + google.protobuf.Duration transfer_timeout_period = 6 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + + // The fraction of tokens allocated to the consumer redistribution address + // during distribution events. The fraction is a string representing a + // decimal number. For example "0.75" would represent 75%. + string consumer_redistribution_fraction = 7; + + // The number of historical info entries to persist in store. + // This param is a part of the cosmos sdk staking module. In the case of + // a ccv enabled consumer chain, the ccv module acts as the staking module. + int64 historical_entries = 8; + + // Unbonding period for the consumer, + // which should be smaller than that of the provider in general. + google.protobuf.Duration unbonding_period = 9 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + + // The threshold for the percentage of validators at the bottom of the set who + // can opt out of running the consumer chain without being punished. For + // example, a value of 0.05 means that the validators in the bottom 5% of the + // set can opt out + string soft_opt_out_threshold = 10; + + // Reward denoms. These are the denominations which are allowed to be sent to + // the provider as rewards. + repeated string reward_denoms = 11; + + // Provider-originated reward denoms. These are denoms coming from the + // provider which are allowed to be used as rewards. e.g. "uatom" + repeated string provider_reward_denoms = 12; + + // The period after which a consumer can retry sending a throttled packet. + google.protobuf.Duration retry_delay_period = 13 + [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; } // ConsumerGenesisState defines shared genesis information between provider and diff --git a/tests/difference/core/driver/setup.go b/tests/difference/core/driver/setup.go index 52f02ada29..cf9d5e470d 100644 --- a/tests/difference/core/driver/setup.go +++ b/tests/difference/core/driver/setup.go @@ -539,6 +539,7 @@ func (b *Builder) createConsumerGenesis(client *ibctmtypes.ClientState) *consume "0", // disable soft opt-out []string{}, []string{}, + ccv.DefaultRetryDelayPeriod, ) return consumertypes.NewInitialGenesisState(client, providerConsState, valUpdates, params) } diff --git a/tests/e2e/README.md b/tests/e2e/README.md index ee9c962651..4fb3e721e8 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -10,4 +10,15 @@ If the chain state from `state.go` is modified, the `ChainStateWithProposalTypes When adding a new proposal type: * add a case for your proposal type to `json_utils.go/UnmarshalProposalWithType` -* add a generator for your proposal type in `state_rapid_test.go` and add it to the `GetProposalGen` function \ No newline at end of file +* add a generator for your proposal type in `state_rapid_test.go` and add it to the `GetProposalGen` function + +## Regenerating Traces + +The traces in `tracehandler_testdata` are generated by the test `trace_handlers_test.go/TestWriteExamples`. + +You can regenerate them by running `make e2e-traces` in the root of the repo. + +## Running against traces + +To run a test trace in the e2e tests, run `go run . --test-file $TRACEFILE::$TESTCONFIG`. +See `--help` for more details. diff --git a/tests/e2e/action_rapid_test.go b/tests/e2e/action_rapid_test.go index 005f52610d..09d28abacf 100644 --- a/tests/e2e/action_rapid_test.go +++ b/tests/e2e/action_rapid_test.go @@ -84,8 +84,9 @@ func GetActionGen() *rapid.Generator[any] { GetRegisterRepresentativeActionGen().AsAny(), GetDoublesignSlashActionGen().AsAny(), GetAssignConsumerPubKeyActionGen().AsAny(), - GetSlashThrottleDequeueActionGen().AsAny(), GetCreateIbcClientsActionGen().AsAny(), + GetSlashMeterReplenishmentAction().AsAny(), + GetWaitTimeAction().AsAny(), CreateCancelUnbondTokensActionGen().AsAny(), CreateLightClientEquivocationAttackActionGen().AsAny(), CreateLightClientAmnesiaAttackActionGen().AsAny(), @@ -489,13 +490,19 @@ func GetAssignConsumerPubKeyActionGen() *rapid.Generator[assignConsumerPubKeyAct }) } -func GetSlashThrottleDequeueActionGen() *rapid.Generator[slashThrottleDequeueAction] { - return rapid.Custom(func(t *rapid.T) slashThrottleDequeueAction { - return slashThrottleDequeueAction{ - Chain: GetChainIDGen().Draw(t, "Chain"), - CurrentQueueSize: rapid.Int().Draw(t, "CurrentQueueSize"), - NextQueueSize: rapid.Int().Draw(t, "NextQueueSize"), - Timeout: time.Duration(rapid.Int().Draw(t, "Timeout")) * time.Millisecond, +func GetSlashMeterReplenishmentAction() *rapid.Generator[slashMeterReplenishmentAction] { + return rapid.Custom(func(t *rapid.T) slashMeterReplenishmentAction { + return slashMeterReplenishmentAction{ + TargetValue: rapid.Int64().Draw(t, "TargetValue"), + Timeout: time.Duration(rapid.Int().Draw(t, "Timeout")) * time.Millisecond, + } + }) +} + +func GetWaitTimeAction() *rapid.Generator[waitTimeAction] { + return rapid.Custom(func(t *rapid.T) waitTimeAction { + return waitTimeAction{ + WaitTime: time.Duration(rapid.Int().Draw(t, "Timeout")) * time.Millisecond, } }) } diff --git a/tests/e2e/actions.go b/tests/e2e/actions.go index 386404baaa..63070289d6 100644 --- a/tests/e2e/actions.go +++ b/tests/e2e/actions.go @@ -2045,50 +2045,52 @@ func (tr TestConfig) assignConsumerPubKey(action assignConsumerPubKeyAction, ver tr.waitBlocks(ChainID("provi"), 2, 30*time.Second) } -// slashThrottleDequeueAction polls slash queue sizes until nextQueueSize is achieved -type slashThrottleDequeueAction struct { - Chain ChainID - CurrentQueueSize int - NextQueueSize int - // panic if Timeout is exceeded +// slashMeterReplenishmentAction polls the slash meter on provider until value is achieved +type slashMeterReplenishmentAction struct { + TargetValue int64 + // panic if timeout is exceeded Timeout time.Duration } -func (tr TestConfig) waitForSlashThrottleDequeue( - action slashThrottleDequeueAction, +func (tr TestConfig) waitForSlashMeterReplenishment( + action slashMeterReplenishmentAction, verbose bool, ) { timeout := time.Now().Add(action.Timeout) - initialGlobalQueueSize := int(tr.getGlobalSlashQueueSize()) + initialSlashMeter := tr.getSlashMeter() - if initialGlobalQueueSize != action.CurrentQueueSize { - panic(fmt.Sprintf("wrong initial queue size: %d - expected global queue: %d\n", initialGlobalQueueSize, action.CurrentQueueSize)) + if initialSlashMeter >= 0 { + panic(fmt.Sprintf("No need to wait for slash meter replenishment, current value: %d", initialSlashMeter)) } + for { - globalQueueSize := int(tr.getGlobalSlashQueueSize()) - chainQueueSize := int(tr.getConsumerChainPacketQueueSize(action.Chain)) + slashMeter := tr.getSlashMeter() if verbose { - fmt.Printf("waiting for packed queue size to reach: %d - current: %d\n", action.NextQueueSize, globalQueueSize) + fmt.Printf("waiting for slash meter to be replenished, current value: %d\n", slashMeter) } - // check if global queue size is equal to chain queue size - if globalQueueSize == chainQueueSize && globalQueueSize == action.NextQueueSize { //nolint:gocritic // this is the comparison that we want here. + // check if meter has reached target value + if slashMeter >= action.TargetValue { break } if time.Now().After(timeout) { - panic(fmt.Sprintf("\n\n\nwaitForSlashThrottleDequeue method has timed out after: %s\n\n", action.Timeout)) + panic(fmt.Sprintf("\n\nwaitForSlashMeterReplenishment has timed out after: %s\n\n", action.Timeout)) } - time.Sleep(500 * time.Millisecond) + tr.WaitTime(5 * time.Second) } - // wair for 2 blocks to be created - // allowing the jailing to be incorporated into voting power - tr.waitBlocks(action.Chain, 2, time.Minute) } -func uintPointer(i uint) *uint { - return &i +type waitTimeAction struct { + WaitTime time.Duration +} + +func (tr TestConfig) waitForTime( + action waitTimeAction, + verbose bool, +) { + tr.WaitTime(action.WaitTime) } // GetPathNameForGorelayer returns the name of the path between two given chains used by Gorelayer. diff --git a/tests/e2e/config.go b/tests/e2e/config.go index 0a164c2cec..462d6e4a49 100644 --- a/tests/e2e/config.go +++ b/tests/e2e/config.go @@ -186,7 +186,8 @@ func SlashThrottleTestConfig() TestConfig { ".app_state.slashing.params.signed_blocks_window = \"15\" | " + ".app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\" | " + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + - ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"", + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + + ".app_state.ccvconsumer.params.retry_delay_period = \"30s\"", }, }, tendermintConfigOverride: `s/timeout_commit = "5s"/timeout_commit = "1s"/;` + @@ -243,11 +244,12 @@ func DefaultTestConfig() TestConfig { func DemocracyTestConfig(allowReward bool) TestConfig { consumerGenChanges := ".app_state.ccvconsumer.params.blocks_per_distribution_transmission = \"20\" | " + - ".app_state.gov.voting_params.voting_period = \"10s\" | " + + ".app_state.gov.params.voting_period = \"10s\" | " + ".app_state.slashing.params.signed_blocks_window = \"10\" | " + ".app_state.slashing.params.min_signed_per_window = \"0.500000000000000000\" | " + ".app_state.slashing.params.downtime_jail_duration = \"60s\" | " + - ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\"" + ".app_state.slashing.params.slash_fraction_downtime = \"0.010000000000000000\" | " + + ".app_state.transfer.params.send_enabled = false" if allowReward { // This allows the consumer chain to send rewards in the stake denom diff --git a/tests/e2e/json_utils.go b/tests/e2e/json_utils.go index 692c34a14f..3d5867d42a 100644 --- a/tests/e2e/json_utils.go +++ b/tests/e2e/json_utils.go @@ -221,8 +221,14 @@ func UnmarshalMapToActionType(rawAction json.RawMessage, actionTypeString string if err == nil { return a, nil } - case "main.slashThrottleDequeueAction": - var a slashThrottleDequeueAction + case "main.slashMeterReplenishmentAction": + var a slashMeterReplenishmentAction + err := json.Unmarshal(rawAction, &a) + if err == nil { + return a, nil + } + case "main.waitTimeAction": + var a waitTimeAction err := json.Unmarshal(rawAction, &a) if err == nil { return a, nil diff --git a/tests/e2e/main.go b/tests/e2e/main.go index 87c617be18..005ea18566 100644 --- a/tests/e2e/main.go +++ b/tests/e2e/main.go @@ -173,8 +173,12 @@ func getTestFileUsageString() string { // Test runner selection builder.WriteString("Test runner selection:\nSelection of test runners to be executed:\n") + testConfigSet := map[string]struct{}{} for _, testConfig := range testConfigs { - builder.WriteString(fmt.Sprintf("- %s\n", testConfig.name)) + if _, ok := testConfigSet[testConfig.name]; !ok { + builder.WriteString(fmt.Sprintf("- %s\n", testConfig.name)) + testConfigSet[testConfig.name] = struct{}{} + } } builder.WriteString("\n") @@ -373,8 +377,10 @@ func (tr *TestConfig) runStep(step Step, verbose bool) { tr.registerRepresentative(action, verbose) case assignConsumerPubKeyAction: tr.assignConsumerPubKey(action, verbose) - case slashThrottleDequeueAction: - tr.waitForSlashThrottleDequeue(action, verbose) + case slashMeterReplenishmentAction: + tr.waitForSlashMeterReplenishment(action, verbose) + case waitTimeAction: + tr.waitForTime(action, verbose) case startRelayerAction: tr.startRelayer(action, verbose) case submitChangeRewardDenomsProposalAction: diff --git a/tests/e2e/state.go b/tests/e2e/state.go index 0febed41f7..93566c1f05 100644 --- a/tests/e2e/state.go +++ b/tests/e2e/state.go @@ -26,8 +26,7 @@ type ChainState struct { ConsumerChains *map[ChainID]bool AssignedKeys *map[ValidatorID]string ProviderKeys *map[ValidatorID]string // validatorID: validator provider key - ConsumerChainQueueSizes *map[ChainID]uint - GlobalSlashQueueSize *uint + ConsumerPendingPacketQueueSize *uint // Only relevant to consumer chains RegisteredConsumerRewardDenoms *[]string } @@ -168,24 +167,16 @@ func (tr TestConfig) getChainState(chain ChainID, modelState ChainState) ChainSt chainState.ProviderKeys = &providerKeys } - if modelState.GlobalSlashQueueSize != nil { - globalQueueSize := tr.getGlobalSlashQueueSize() - chainState.GlobalSlashQueueSize = &globalQueueSize - } - - if modelState.ConsumerChainQueueSizes != nil { - consumerChainQueueSizes := map[ChainID]uint{} - for c := range *modelState.ConsumerChainQueueSizes { - consumerChainQueueSizes[c] = tr.getConsumerChainPacketQueueSize(c) - } - chainState.ConsumerChainQueueSizes = &consumerChainQueueSizes - } - if modelState.RegisteredConsumerRewardDenoms != nil { registeredConsumerRewardDenoms := tr.getRegisteredConsumerRewardDenoms(chain) chainState.RegisteredConsumerRewardDenoms = ®isteredConsumerRewardDenoms } + if modelState.ConsumerPendingPacketQueueSize != nil { + pendingPacketQueueSize := tr.getPendingPacketQueueSize(chain) + chainState.ConsumerPendingPacketQueueSize = &pendingPacketQueueSize + } + if *verbose { log.Println("Done getting chain state:\n" + pretty.Sprint(chainState)) } @@ -667,9 +658,10 @@ func (tr TestConfig) getProviderAddressFromConsumer(consumerChain ChainID, valid return addr } -func (tr TestConfig) getGlobalSlashQueueSize() uint { +func (tr TestConfig) getSlashMeter() int64 { //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. - cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[ChainID("provi")].BinaryName, + cmd := exec.Command("docker", "exec", + tr.containerConfig.InstanceName, tr.chainConfigs[ChainID("provi")].BinaryName, "query", "provider", "throttle-state", `--node`, tr.getQueryNode(ChainID("provi")), @@ -680,17 +672,16 @@ func (tr TestConfig) getGlobalSlashQueueSize() uint { log.Fatal(err, "\n", string(bz)) } - packets := gjson.Get(string(bz), "packets").Array() - return uint(len(packets)) + slashMeter := gjson.Get(string(bz), "slash_meter") + return slashMeter.Int() } -func (tr TestConfig) getConsumerChainPacketQueueSize(consumerChain ChainID) uint { +func (tr TestConfig) getRegisteredConsumerRewardDenoms(chain ChainID) []string { //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. - cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[ChainID("provi")].BinaryName, + cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[chain].BinaryName, - "query", "provider", "throttled-consumer-packet-data", - string(consumerChain), - `--node`, tr.getQueryNode(ChainID("provi")), + "query", "provider", "registered-consumer-reward-denoms", + `--node`, tr.getQueryNode(chain), `-o`, `json`, ) bz, err := cmd.CombinedOutput() @@ -698,15 +689,20 @@ func (tr TestConfig) getConsumerChainPacketQueueSize(consumerChain ChainID) uint log.Fatal(err, "\n", string(bz)) } - size := gjson.Get(string(bz), "size").Uint() - return uint(size) + denoms := gjson.Get(string(bz), "denoms").Array() + rewardDenoms := make([]string, len(denoms)) + for i, d := range denoms { + rewardDenoms[i] = d.String() + } + + return rewardDenoms } -func (tr TestConfig) getRegisteredConsumerRewardDenoms(chain ChainID) []string { +func (tr TestConfig) getPendingPacketQueueSize(chain ChainID) uint { //#nosec G204 -- Bypass linter warning for spawning subprocess with cmd arguments. cmd := exec.Command("docker", "exec", tr.containerConfig.InstanceName, tr.chainConfigs[chain].BinaryName, - "query", "provider", "registered-consumer-reward-denoms", + "query", "ccvconsumer", "throttle-state", `--node`, tr.getQueryNode(chain), `-o`, `json`, ) @@ -715,13 +711,12 @@ func (tr TestConfig) getRegisteredConsumerRewardDenoms(chain ChainID) []string { log.Fatal(err, "\n", string(bz)) } - denoms := gjson.Get(string(bz), "denoms").Array() - rewardDenoms := make([]string, len(denoms)) - for i, d := range denoms { - rewardDenoms[i] = d.String() + if !gjson.ValidBytes(bz) { + panic("invalid json response from query ccvconsumer throttle-state: " + string(bz)) } - return rewardDenoms + packetData := gjson.Get(string(bz), "packet_data_queue").Array() + return uint(len(packetData)) } func (tr TestConfig) getValidatorNode(chain ChainID, validator ValidatorID) string { @@ -772,3 +767,7 @@ func (tr TestConfig) curlJsonRPCRequest(method, params, address string) { verbosity := false executeCommandWithVerbosity(cmd, "curlJsonRPCRequest", verbosity) } + +func uintPtr(i uint) *uint { + return &i +} diff --git a/tests/e2e/state_rapid_test.go b/tests/e2e/state_rapid_test.go index 313e4a68ba..b6ac12f111 100644 --- a/tests/e2e/state_rapid_test.go +++ b/tests/e2e/state_rapid_test.go @@ -45,8 +45,7 @@ func GetChainStateGen() *rapid.Generator[ChainState] { consumerChains := GetConsumerChainsGen().Draw(t, "ConsumerChains") assignedKeys := GetAssignedKeysGen().Draw(t, "AssignedKeys") providerKeys := GetProviderKeysGen().Draw(t, "ProviderKeys") - consumerChainQueueSizes := GetConsumerChainQueueSizesGen().Draw(t, "ConsumerChainQueueSizes") - globalSlashQueueSize := rapid.Uint().Draw(t, "GlobalSlashQueueSize") + consumerPacketQueueSize := GetConsumerChainQueueSizesGen().Draw(t, "ConsumerChainQueueSizes") registeredConsumerRewardDenoms := GetRegisteredConsumerRewardDenomsGen().Draw(t, "RegisteredConsumerRewardDenoms") return ChainState{ @@ -59,8 +58,7 @@ func GetChainStateGen() *rapid.Generator[ChainState] { ConsumerChains: &consumerChains, AssignedKeys: &assignedKeys, ProviderKeys: &providerKeys, - ConsumerChainQueueSizes: &consumerChainQueueSizes, - GlobalSlashQueueSize: &globalSlashQueueSize, + ConsumerPendingPacketQueueSize: &consumerPacketQueueSize, RegisteredConsumerRewardDenoms: ®isteredConsumerRewardDenoms, } }) @@ -72,9 +70,9 @@ func GetRegisteredConsumerRewardDenomsGen() *rapid.Generator[[]string] { }) } -func GetConsumerChainQueueSizesGen() *rapid.Generator[map[ChainID]uint] { - return rapid.Custom(func(t *rapid.T) map[ChainID]uint { - return rapid.MapOf(GetChainIDGen(), rapid.Uint()).Draw(t, "ConsumerChainQueueSizes") +func GetConsumerChainQueueSizesGen() *rapid.Generator[uint] { + return rapid.Custom(func(t *rapid.T) uint { + return rapid.Uint().Draw(t, "ConsumerChainQueueSizes") }) } diff --git a/tests/e2e/steps_democracy.go b/tests/e2e/steps_democracy.go index a264f868a7..9605f8698a 100644 --- a/tests/e2e/steps_democracy.go +++ b/tests/e2e/steps_democracy.go @@ -77,6 +77,8 @@ func stepsDemocracy(consumerName string) []Step { ValidatorID("alice"): 9889999998, ValidatorID("bob"): 9960000001, }, + // Check that the "SendEnabled" transfer parameter is set to false + Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "false"}}), Proposals: &map[uint]Proposal{ 1: ParamsProposal{ Deposit: 10000001, @@ -99,10 +101,21 @@ func stepsDemocracy(consumerName string) []Step { }, State: State{ ChainID(consumerName): ChainState{ + // Check that alice gets the prop deposit refunded ValBalances: &map[ValidatorID]uint{ - ValidatorID("alice"): 9889999998, + ValidatorID("alice"): 9899999999, ValidatorID("bob"): 9960000001, }, + // Check that the prop passed + Proposals: &map[uint]Proposal{ + 1: ParamsProposal{ + Deposit: 10000001, + Status: "PROPOSAL_STATUS_PASSED", + Subspace: "transfer", + Key: "SendEnabled", + Value: "true", + }, + }, // Check that the parameter is changed on gov-consumer chain Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "true"}}), }, diff --git a/tests/e2e/steps_downtime.go b/tests/e2e/steps_downtime.go index 7b4152023b..f8a610052d 100644 --- a/tests/e2e/steps_downtime.go +++ b/tests/e2e/steps_downtime.go @@ -56,7 +56,8 @@ func stepsDowntime(consumerName string) []Step { ChainID(consumerName): ChainState{ ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 509, - ValidatorID("bob"): 500, + // Bob's stake may or may not be slashed at this point depending on comet vs cometmock + // See https://github.com/cosmos/interchain-security/issues/1304 ValidatorID("carol"): 501, }, }, @@ -278,7 +279,7 @@ func stepsThrottledDowntime(consumerName string) []Step { Validator: ValidatorID("bob"), }, State: State{ - // slash packet queued on consumer, but powers not affected on either chain yet + // slash packet queued for bob on consumer, but powers not affected on either chain yet ChainID("provi"): ChainState{ ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, @@ -292,6 +293,7 @@ func stepsThrottledDowntime(consumerName string) []Step { ValidatorID("bob"): 500, ValidatorID("carol"): 500, }, + ConsumerPendingPacketQueueSize: uintPtr(1), // bob's downtime slash packet is queued }, }, }, @@ -312,11 +314,6 @@ func stepsThrottledDowntime(consumerName string) []Step { ValidatorID("bob"): 0, // bob is jailed ValidatorID("carol"): 500, }, - // no provider throttling engaged yet - GlobalSlashQueueSize: uintPointer(0), - ConsumerChainQueueSizes: &map[ChainID]uint{ - ChainID(consumerName): uint(0), - }, }, ChainID(consumerName): ChainState{ // VSC packet applying jailing is not yet relayed to consumer @@ -325,16 +322,17 @@ func stepsThrottledDowntime(consumerName string) []Step { ValidatorID("bob"): 500, ValidatorID("carol"): 500, }, + ConsumerPendingPacketQueueSize: uintPtr(0), // slash packet handled ack clears consumer queue }, }, }, + // Invoke carol downtime slash on consumer { Action: downtimeSlashAction{ Chain: ChainID(consumerName), Validator: ValidatorID("carol"), }, State: State{ - // powers not affected on either chain yet ChainID("provi"): ChainState{ ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, @@ -343,15 +341,16 @@ func stepsThrottledDowntime(consumerName string) []Step { }, }, ChainID(consumerName): ChainState{ - // VSC packet applying jailing is not yet relayed to consumer ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, - ValidatorID("bob"): 500, + ValidatorID("bob"): 500, // VSC packet jailing bob is not yet relayed to consumer ValidatorID("carol"): 500, }, + ConsumerPendingPacketQueueSize: uintPtr(1), // carol's downtime slash packet is queued }, }, }, + // Relay slash packet to provider, and ack back to consumer { Action: relayPacketsAction{ ChainA: ChainID("provi"), @@ -364,42 +363,34 @@ func stepsThrottledDowntime(consumerName string) []Step { ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, ValidatorID("bob"): 0, - ValidatorID("carol"): 500, // not slashed due to throttling - }, - GlobalSlashQueueSize: uintPointer(1), // carol's slash request is throttled - ConsumerChainQueueSizes: &map[ChainID]uint{ - ChainID(consumerName): uint(1), + ValidatorID("carol"): 500, // slash packet for carol recv by provider, carol not slashed due to throttling }, }, ChainID(consumerName): ChainState{ ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, - ValidatorID("bob"): 0, + ValidatorID("bob"): 0, // VSC packet applying bob jailing is also relayed and recv by consumer ValidatorID("carol"): 500, }, + ConsumerPendingPacketQueueSize: uintPtr(1), // slash packet bounced ack keeps carol's downtime slash packet queued }, }, }, { - Action: slashThrottleDequeueAction{ - Chain: ChainID(consumerName), - CurrentQueueSize: 1, - NextQueueSize: 0, + Action: slashMeterReplenishmentAction{ + TargetValue: 0, // We just want slash meter to be non-negative + // Slash meter replenish fraction is set to 10%, replenish period is 20 seconds, see config.go // Meter is initially at 10%, decremented to -23% from bob being jailed. It'll then take three replenishments - // for meter to become positive again. 3*20 = 60 seconds + buffer = 80 seconds - Timeout: 80 * time.Second, + // for meter to become positive again. 3*20 = 60 seconds + buffer = 100 seconds + Timeout: 100 * time.Second, }, State: State{ ChainID("provi"): ChainState{ ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, ValidatorID("bob"): 0, - ValidatorID("carol"): 0, // Carol is jailed upon packet being handled on provider - }, - GlobalSlashQueueSize: uintPointer(0), // slash packets dequeued - ConsumerChainQueueSizes: &map[ChainID]uint{ - ChainID(consumerName): 0, + ValidatorID("carol"): 500, // Carol still not slashed, packet must be retried }, }, ChainID(consumerName): ChainState{ @@ -409,11 +400,31 @@ func stepsThrottledDowntime(consumerName string) []Step { ValidatorID("bob"): 0, ValidatorID("carol"): 500, }, + ConsumerPendingPacketQueueSize: uintPtr(1), // packet still queued }, }, }, - // A block is incremented each action, hence why VSC is committed on provider, - // and can now be relayed as packet to consumer + // Wait for retry delay period to pass. + // Retry delay period is set to 30 seconds, see config.go, + // wait this amount of time to elapse the period. + { + Action: waitTimeAction{ + WaitTime: 30 * time.Second, + }, + State: State{ + ChainID("provi"): ChainState{ + ValPowers: &map[ValidatorID]uint{ + ValidatorID("alice"): 511, + ValidatorID("bob"): 0, + ValidatorID("carol"): 500, + }, + }, + ChainID(consumerName): ChainState{ + ConsumerPendingPacketQueueSize: uintPtr(1), // packet still queued + }, + }, + }, + // Relay now that retry delay period has passed, confirm provider applies jailing { Action: relayPacketsAction{ ChainA: ChainID("provi"), @@ -426,20 +437,11 @@ func stepsThrottledDowntime(consumerName string) []Step { ValPowers: &map[ValidatorID]uint{ ValidatorID("alice"): 511, ValidatorID("bob"): 0, - ValidatorID("carol"): 0, - }, - GlobalSlashQueueSize: uintPointer(0), - ConsumerChainQueueSizes: &map[ChainID]uint{ - ChainID(consumerName): 0, + ValidatorID("carol"): 0, // jailed! }, }, ChainID(consumerName): ChainState{ - ValPowers: &map[ValidatorID]uint{ - ValidatorID("alice"): 511, - // throttled update gets to consumer - ValidatorID("bob"): 0, - ValidatorID("carol"): 0, - }, + ConsumerPendingPacketQueueSize: uintPtr(0), // relayed slash packet handled ack clears consumer queue }, }, }, diff --git a/tests/e2e/steps_reward_denom.go b/tests/e2e/steps_reward_denom.go index 1a47accd07..d5b524fbd9 100644 --- a/tests/e2e/steps_reward_denom.go +++ b/tests/e2e/steps_reward_denom.go @@ -75,6 +75,8 @@ func stepsRewardDenomConsumer(consumerName string) []Step { ValidatorID("alice"): 9889999998, ValidatorID("bob"): 9960000001, }, + // Check that the "SendEnabled" transfer parameter is set to false + Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "false"}}), Proposals: &map[uint]Proposal{ 1: ParamsProposal{ Deposit: 10000001, @@ -97,10 +99,21 @@ func stepsRewardDenomConsumer(consumerName string) []Step { }, State: State{ ChainID(consumerName): ChainState{ + // Check that alice gets the prop deposit refunded ValBalances: &map[ValidatorID]uint{ - ValidatorID("alice"): 9889999998, + ValidatorID("alice"): 9899999999, ValidatorID("bob"): 9960000001, }, + // Check that the prop passed + Proposals: &map[uint]Proposal{ + 1: ParamsProposal{ + Deposit: 10000001, + Status: "PROPOSAL_STATUS_PASSED", + Subspace: "transfer", + Key: "SendEnabled", + Value: "true", + }, + }, // Check that the parameter is changed on gov-consumer chain Params: &([]Param{{Subspace: "transfer", Key: "SendEnabled", Value: "true"}}), }, diff --git a/tests/e2e/tracehandler_testdata/changeover.json b/tests/e2e/tracehandler_testdata/changeover.json index d973b46fe4..8f90a114e3 100644 --- a/tests/e2e/tracehandler_testdata/changeover.json +++ b/tests/e2e/tracehandler_testdata/changeover.json @@ -24,8 +24,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -53,8 +52,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -98,8 +96,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -144,8 +141,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -185,8 +181,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -239,8 +234,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -288,8 +282,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -346,8 +339,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -364,8 +356,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -414,8 +405,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -443,8 +433,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -461,8 +450,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -490,8 +478,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -517,8 +504,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -546,8 +532,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -564,8 +549,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -593,8 +577,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } diff --git a/tests/e2e/tracehandler_testdata/democracy.json b/tests/e2e/tracehandler_testdata/democracy.json index 9a435b3a0b..a696258ab9 100644 --- a/tests/e2e/tracehandler_testdata/democracy.json +++ b/tests/e2e/tracehandler_testdata/democracy.json @@ -1,4 +1,3 @@ - [ { "ActionType": "main.StartChainAction", @@ -38,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -72,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -116,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -160,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -196,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -254,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -272,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -338,8 +330,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -356,8 +347,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -384,8 +374,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -413,8 +402,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -441,8 +429,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -482,8 +469,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -522,8 +508,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -552,8 +537,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -587,7 +571,7 @@ "State": { "democ": { "ValBalances": { - "alice": 9889999998, + "alice": 9899999999, "bob": 9960000001 }, "ValPowers": null, @@ -603,10 +587,20 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, - "Proposals": null + "Proposals": { + "1": { + "RawProposal": { + "Deposit": 10000001, + "Status": "PROPOSAL_STATUS_PASSED", + "Subspace": "transfer", + "Key": "SendEnabled", + "Value": "true" + }, + "Type": "main.ParamsProposal" + } + } } } }, @@ -636,8 +630,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [], "Proposals": null } @@ -660,8 +653,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [], "Proposals": null } @@ -693,8 +685,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [ "ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9" ], @@ -728,8 +719,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -755,8 +745,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -773,8 +762,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -802,8 +790,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -820,8 +807,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -849,8 +835,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -876,8 +861,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -894,8 +878,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -926,8 +909,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } diff --git a/tests/e2e/tracehandler_testdata/democracyRewardsSteps.json b/tests/e2e/tracehandler_testdata/democracyRewardsSteps.json index 355ff1fbb8..aa79dcd5d8 100644 --- a/tests/e2e/tracehandler_testdata/democracyRewardsSteps.json +++ b/tests/e2e/tracehandler_testdata/democracyRewardsSteps.json @@ -37,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -71,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -115,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -159,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -195,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -253,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -271,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -337,8 +330,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -355,8 +347,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -383,8 +374,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -412,8 +402,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -440,8 +429,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -481,8 +469,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -521,8 +508,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -546,13 +532,18 @@ }, "ValPowers": null, "StakedTokens": null, - "Params": null, + "Params": [ + { + "Subspace": "transfer", + "Key": "SendEnabled", + "Value": "false" + } + ], "Rewards": null, "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -586,7 +577,7 @@ "State": { "democ": { "ValBalances": { - "alice": 9889999998, + "alice": 9899999999, "bob": 9960000001 }, "ValPowers": null, @@ -602,10 +593,20 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, - "Proposals": null + "Proposals": { + "1": { + "RawProposal": { + "Deposit": 10000001, + "Status": "PROPOSAL_STATUS_PASSED", + "Subspace": "transfer", + "Key": "SendEnabled", + "Value": "true" + }, + "Type": "main.ParamsProposal" + } + } } } }, @@ -635,8 +636,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [], "Proposals": null } @@ -659,8 +659,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [], "Proposals": null } @@ -692,8 +691,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": [ "ibc/3C3D7B3BE4ECC85A0E5B52A3AEC3B7DFC2AA9CA47C37821E57020D6807043BE9" ], @@ -727,8 +725,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -754,8 +751,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -772,8 +768,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -801,8 +796,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -819,8 +813,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -848,8 +841,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -875,8 +867,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -893,8 +884,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -925,8 +915,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } diff --git a/tests/e2e/tracehandler_testdata/happyPath.json b/tests/e2e/tracehandler_testdata/happyPath.json index f46a4e983b..c7b891777d 100644 --- a/tests/e2e/tracehandler_testdata/happyPath.json +++ b/tests/e2e/tracehandler_testdata/happyPath.json @@ -37,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -71,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -115,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -159,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -195,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -253,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -271,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -323,8 +316,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -341,8 +333,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -369,8 +360,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -398,8 +388,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -426,8 +415,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -463,8 +451,7 @@ "bob": "cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39", "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -481,8 +468,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -516,8 +502,7 @@ "bob": "cosmosvalcons1nx7n5uh0ztxsynn4sje6eyq2ud6rc6klc96w39", "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -534,8 +519,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -563,8 +547,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -581,8 +564,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -610,8 +592,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -639,8 +620,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -657,8 +637,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -686,8 +665,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -715,8 +693,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -733,8 +710,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -762,8 +738,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -792,8 +767,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -810,8 +784,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -839,8 +812,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -866,8 +838,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -884,8 +855,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -913,8 +883,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -931,8 +900,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -961,8 +929,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -979,8 +946,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1008,8 +974,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1035,8 +1000,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1053,8 +1017,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1073,7 +1036,6 @@ "ValBalances": null, "ValPowers": { "alice": 509, - "bob": 500, "carol": 501 }, "StakedTokens": null, @@ -1082,8 +1044,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1100,8 +1061,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1129,8 +1089,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1156,8 +1115,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1174,8 +1132,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1203,8 +1160,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1230,8 +1186,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1248,8 +1203,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1277,8 +1231,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1304,8 +1257,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1322,8 +1274,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1351,8 +1302,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1363,7 +1313,7 @@ "Action": { "Chain": "consu", "Height": 10, - "Time": "2023-09-20T18:24:51.823193+02:00", + "Time": "2023-10-04T12:14:14.883367+02:00", "Power": 500, "Validator": "bob", "Deposit": 10000001, @@ -1383,8 +1333,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1403,8 +1352,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1440,8 +1388,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1458,8 +1405,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1487,8 +1433,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1505,8 +1450,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1532,8 +1476,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1550,8 +1493,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1579,8 +1521,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1597,8 +1538,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1626,8 +1566,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1644,8 +1583,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1656,7 +1594,7 @@ "Action": { "Chain": "consu", "Height": 10, - "Time": "2023-09-20T18:24:51.823197+02:00", + "Time": "2023-10-04T12:14:14.88337+02:00", "Power": 500, "Validator": "bob", "Deposit": 10000001, @@ -1676,8 +1614,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1696,8 +1633,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1744,8 +1680,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1762,8 +1697,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1802,8 +1736,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1820,8 +1753,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1855,8 +1787,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "3": { @@ -1902,8 +1833,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "3": { @@ -1942,8 +1872,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "4": { @@ -1987,8 +1916,7 @@ "ConsumerChains": {}, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "4": { diff --git a/tests/e2e/tracehandler_testdata/multipleConsumers.json b/tests/e2e/tracehandler_testdata/multipleConsumers.json index 4774a94ad8..1cb46af06c 100644 --- a/tests/e2e/tracehandler_testdata/multipleConsumers.json +++ b/tests/e2e/tracehandler_testdata/multipleConsumers.json @@ -37,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -71,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -115,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -159,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -195,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -253,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -271,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -328,8 +321,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -372,8 +364,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -416,8 +407,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -452,8 +442,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -510,8 +499,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -528,8 +516,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -580,8 +567,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -598,8 +584,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -616,8 +601,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -645,8 +629,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -663,8 +646,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -681,8 +663,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -710,8 +691,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -728,8 +708,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -746,8 +725,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -775,8 +753,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -793,8 +770,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -811,8 +787,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -840,8 +815,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -858,8 +832,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -876,8 +849,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -905,8 +877,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -923,8 +894,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -941,8 +911,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -971,8 +940,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -989,8 +957,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1007,8 +974,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1036,8 +1002,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1054,8 +1019,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1072,8 +1036,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1101,8 +1064,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1119,8 +1081,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1137,8 +1098,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1164,8 +1124,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1182,8 +1141,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1200,8 +1158,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1229,8 +1186,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1247,8 +1203,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1265,8 +1220,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1294,8 +1248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1312,8 +1265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1341,8 +1293,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1359,8 +1310,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1386,8 +1336,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1404,8 +1353,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1422,8 +1370,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1451,8 +1398,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1469,8 +1415,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1487,8 +1432,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1516,8 +1460,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1534,8 +1477,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1552,8 +1494,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1579,8 +1520,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1597,8 +1537,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1615,8 +1554,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1644,8 +1582,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1662,8 +1599,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1680,8 +1616,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1709,8 +1644,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1727,8 +1661,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1745,8 +1678,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1772,8 +1704,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1790,8 +1721,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1808,8 +1738,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1837,8 +1766,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1855,8 +1783,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1873,8 +1800,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1902,8 +1828,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1920,8 +1845,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1938,8 +1862,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1965,8 +1888,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1983,8 +1905,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2001,8 +1922,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2030,8 +1950,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2048,8 +1967,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2066,8 +1984,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2095,8 +2012,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2113,8 +2029,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2131,8 +2046,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2158,8 +2072,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2176,8 +2089,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2194,8 +2106,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2223,8 +2134,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2241,8 +2151,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2259,8 +2168,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2288,8 +2196,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2306,8 +2213,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2324,8 +2230,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -2353,8 +2258,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -2371,8 +2275,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } diff --git a/tests/e2e/tracehandler_testdata/shorthappy.json b/tests/e2e/tracehandler_testdata/shorthappy.json index ee82bf619f..70486add49 100644 --- a/tests/e2e/tracehandler_testdata/shorthappy.json +++ b/tests/e2e/tracehandler_testdata/shorthappy.json @@ -37,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -71,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -115,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -159,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -195,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -253,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -271,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -323,8 +316,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -341,8 +333,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -369,8 +360,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -398,8 +388,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -426,8 +415,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -455,8 +443,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -473,8 +460,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -502,8 +488,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -532,8 +517,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -550,8 +534,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -579,8 +562,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -606,8 +588,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -624,8 +605,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -644,7 +624,6 @@ "ValBalances": null, "ValPowers": { "alice": 509, - "bob": 500, "carol": 501 }, "StakedTokens": null, @@ -653,8 +632,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -671,8 +649,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -700,8 +677,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -727,8 +703,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -745,8 +720,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -774,8 +748,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -801,8 +774,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -819,8 +791,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -848,8 +819,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -875,8 +845,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -893,8 +862,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -922,8 +890,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -934,7 +901,7 @@ "Action": { "Chain": "consu", "Height": 10, - "Time": "2023-09-20T18:24:51.823231+02:00", + "Time": "2023-10-04T12:14:14.883385+02:00", "Power": 500, "Validator": "bob", "Deposit": 10000001, @@ -954,8 +921,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -974,8 +940,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1011,8 +976,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1029,8 +993,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1058,8 +1021,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1076,8 +1038,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1103,8 +1064,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1121,8 +1081,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1150,8 +1109,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1168,8 +1126,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1197,8 +1154,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1215,8 +1171,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1227,7 +1182,7 @@ "Action": { "Chain": "consu", "Height": 10, - "Time": "2023-09-20T18:24:51.823235+02:00", + "Time": "2023-10-04T12:14:14.883388+02:00", "Power": 500, "Validator": "bob", "Deposit": 10000001, @@ -1247,8 +1202,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1267,8 +1221,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1315,8 +1268,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1333,8 +1285,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -1373,8 +1324,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -1391,8 +1341,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -1426,8 +1375,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "3": { @@ -1473,8 +1421,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "3": { @@ -1513,8 +1460,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "4": { @@ -1558,8 +1504,7 @@ "ConsumerChains": {}, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "4": { diff --git a/tests/e2e/tracehandler_testdata/slashThrottle.json b/tests/e2e/tracehandler_testdata/slashThrottle.json index ea8306fd4c..d0173d03a8 100644 --- a/tests/e2e/tracehandler_testdata/slashThrottle.json +++ b/tests/e2e/tracehandler_testdata/slashThrottle.json @@ -37,8 +37,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -71,8 +70,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -115,8 +113,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -159,8 +156,7 @@ "ProviderKeys": { "carol": "cosmosvalcons1ezyrq65s3gshhx5585w6mpusq3xsj3ayzf4uv6" }, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -195,8 +191,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "1": { @@ -253,8 +248,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -271,8 +265,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -323,8 +316,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -341,8 +333,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -369,8 +360,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -398,8 +388,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -426,8 +415,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -453,8 +441,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 1, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -471,8 +458,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -500,8 +486,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 0, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -518,10 +503,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": { - "consu": 0 - }, - "GlobalSlashQueueSize": 0, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -547,8 +529,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 1, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -565,8 +546,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -594,8 +574,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 1, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -612,22 +591,17 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": { - "consu": 1 - }, - "GlobalSlashQueueSize": 1, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } } }, { - "ActionType": "main.slashThrottleDequeueAction", + "ActionType": "main.slashMeterReplenishmentAction", "Action": { - "Chain": "consu", - "CurrentQueueSize": 1, - "NextQueueSize": 0, - "Timeout": 80000000000 + "TargetValue": 0, + "Timeout": 100000000000 }, "State": { "consu": { @@ -643,8 +617,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 1, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -653,7 +626,7 @@ "ValPowers": { "alice": 511, "bob": 0, - "carol": 0 + "carol": 500 }, "StakedTokens": null, "Params": null, @@ -661,10 +634,45 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": { - "consu": 0 + "ConsumerPendingPacketQueueSize": null, + "RegisteredConsumerRewardDenoms": null, + "Proposals": null + } + } + }, + { + "ActionType": "main.waitTimeAction", + "Action": { + "WaitTime": 30000000000 + }, + "State": { + "consu": { + "ValBalances": null, + "ValPowers": null, + "StakedTokens": null, + "Params": null, + "Rewards": null, + "ConsumerChains": null, + "AssignedKeys": null, + "ProviderKeys": null, + "ConsumerPendingPacketQueueSize": 1, + "RegisteredConsumerRewardDenoms": null, + "Proposals": null + }, + "provi": { + "ValBalances": null, + "ValPowers": { + "alice": 511, + "bob": 0, + "carol": 500 }, - "GlobalSlashQueueSize": 0, + "StakedTokens": null, + "Params": null, + "Rewards": null, + "ConsumerChains": null, + "AssignedKeys": null, + "ProviderKeys": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -681,19 +689,14 @@ "State": { "consu": { "ValBalances": null, - "ValPowers": { - "alice": 511, - "bob": 0, - "carol": 0 - }, + "ValPowers": null, "StakedTokens": null, "Params": null, "Rewards": null, "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": 0, "RegisteredConsumerRewardDenoms": null, "Proposals": null }, @@ -710,10 +713,7 @@ "ConsumerChains": null, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": { - "consu": 0 - }, - "GlobalSlashQueueSize": 0, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": null } @@ -742,8 +742,7 @@ }, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { @@ -787,8 +786,7 @@ "ConsumerChains": {}, "AssignedKeys": null, "ProviderKeys": null, - "ConsumerChainQueueSizes": null, - "GlobalSlashQueueSize": null, + "ConsumerPendingPacketQueueSize": null, "RegisteredConsumerRewardDenoms": null, "Proposals": { "2": { diff --git a/tests/integration/common.go b/tests/integration/common.go index a638c73fc2..413cdaa810 100644 --- a/tests/integration/common.go +++ b/tests/integration/common.go @@ -426,38 +426,43 @@ func (suite *CCVTestSuite) commitConsumerPacket(ctx sdk.Context, packetData ccv. // constructSlashPacketFromConsumer constructs an IBC packet embedding // slash packet data to be sent from consumer to provider func (s *CCVTestSuite) constructSlashPacketFromConsumer(bundle icstestingutils.ConsumerBundle, - tmVal tmtypes.Validator, infractionType stakingtypes.Infraction, -) ccv.ConsumerPacketData { + tmVal tmtypes.Validator, infractionType stakingtypes.Infraction, ibcSeqNum uint64, +) channeltypes.Packet { + packet, _ := s.constructSlashPacketFromConsumerWithData(bundle, tmVal, infractionType, ibcSeqNum) + return packet +} + +func (s *CCVTestSuite) constructSlashPacketFromConsumerWithData(bundle icstestingutils.ConsumerBundle, + tmVal tmtypes.Validator, infractionType stakingtypes.Infraction, ibcSeqNum uint64, +) (channeltypes.Packet, ccv.SlashPacketData) { valsetUpdateId := bundle.GetKeeper().GetHeightValsetUpdateID( bundle.GetCtx(), uint64(bundle.GetCtx().BlockHeight())) - return ccv.ConsumerPacketData{ - Type: ccv.SlashPacket, - Data: &ccv.ConsumerPacketData_SlashPacketData{ - SlashPacketData: &ccv.SlashPacketData{ - Validator: abci.Validator{ - Address: tmVal.Address, - Power: tmVal.VotingPower, - }, - ValsetUpdateId: valsetUpdateId, - Infraction: infractionType, - }, + spdData := ccv.SlashPacketData{ + Validator: abci.Validator{ + Address: tmVal.Address, + Power: tmVal.VotingPower, }, + ValsetUpdateId: valsetUpdateId, + Infraction: infractionType, } -} -// constructVSCMaturedPacketFromConsumer constructs an IBC packet embedding -// VSC Matured packet data to be sent from consumer to provider -func (s *CCVTestSuite) constructVSCMaturedPacketFromConsumer(bundle icstestingutils.ConsumerBundle) ccv.ConsumerPacketData { - valsetUpdateId := bundle.GetKeeper().GetHeightValsetUpdateID( - bundle.GetCtx(), uint64(bundle.GetCtx().BlockHeight())) - - return ccv.ConsumerPacketData{ - Type: ccv.VscMaturedPacket, - Data: &ccv.ConsumerPacketData_VscMaturedPacketData{ - VscMaturedPacketData: &ccv.VSCMaturedPacketData{ValsetUpdateId: valsetUpdateId}, + cpdData := ccv.ConsumerPacketData{ + Type: ccv.SlashPacket, + Data: &ccv.ConsumerPacketData_SlashPacketData{ + SlashPacketData: &spdData, }, } + + return channeltypes.NewPacket(cpdData.GetBytes(), + ibcSeqNum, + ccv.ConsumerPortID, // Src port + bundle.Path.EndpointA.ChannelID, // Src channel + ccv.ProviderPortID, // Dst port + bundle.Path.EndpointB.ChannelID, // Dst channel + clienttypes.Height{}, + uint64(bundle.GetCtx().BlockTime().Add(ccv.DefaultCCVTimeoutPeriod).UnixNano()), + ), spdData } // incrementTime increments the overall time by jumpPeriod @@ -607,3 +612,11 @@ func (s *CCVTestSuite) setupValidatorPowers() { } s.Require().Equal(int64(4000), stakingKeeper.GetLastTotalPower(s.providerCtx()).Int64()) } + +// mustGetStakingValFromTmVal returns the staking validator from the current state of the staking keeper, +// corresponding to a given tendermint validator. Note this func will fail the test if the validator is not found. +func (s *CCVTestSuite) mustGetStakingValFromTmVal(tmVal tmtypes.Validator) (stakingVal stakingtypes.Validator) { + stakingVal, found := s.providerApp.GetTestStakingKeeper().GetValidatorByConsAddr(s.providerCtx(), sdk.ConsAddress(tmVal.Address)) + s.Require().True(found) + return stakingVal +} diff --git a/tests/integration/query_providerinfo_test.go b/tests/integration/query_providerinfo_test.go new file mode 100644 index 0000000000..8058248310 --- /dev/null +++ b/tests/integration/query_providerinfo_test.go @@ -0,0 +1,17 @@ +package integration + +func (s *CCVTestSuite) TestQueryProviderInfo() { + s.SetupCCVChannel(s.path) + s.SendEmptyVSCPacket() + + chainInfo, err := s.consumerApp.GetConsumerKeeper().GetProviderInfo(s.consumerCtx()) + s.Require().NoError(err) + s.Require().Equal(chainInfo.Provider.ChainID, "testchain1") + s.Require().Equal(chainInfo.Consumer.ChainID, "testchain2") + s.Require().Equal(chainInfo.Provider.ClientID, "07-tendermint-0") + s.Require().Equal(chainInfo.Consumer.ClientID, "07-tendermint-0") + s.Require().Equal(chainInfo.Provider.ConnectionID, "connection-0") + s.Require().Equal(chainInfo.Consumer.ConnectionID, "connection-0") + s.Require().Equal(chainInfo.Provider.ChannelID, "channel-0") + s.Require().Equal(chainInfo.Consumer.ChannelID, "channel-0") +} diff --git a/tests/integration/slashing.go b/tests/integration/slashing.go index f1be51d33c..4058494974 100644 --- a/tests/integration/slashing.go +++ b/tests/integration/slashing.go @@ -72,32 +72,34 @@ func (s *CCVTestSuite) TestRelayAndApplyDowntimePacket() { timeoutHeight = clienttypes.Height{} timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccv.DefaultCCVTimeoutPeriod).UnixNano()) ) - slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME) - sequence, err := s.getFirstBundle().Path.EndpointA.SendPacket(timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) + slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + sequence, err := s.getFirstBundle().Path.EndpointA.SendPacket(timeoutHeight, timeoutTimestamp, slashPacket.GetData()) s.Require().NoError(err) // Set outstanding slashing flag for first consumer, it's important to use the consumer's cons addr here firstConsumerKeeper.SetOutstandingDowntime(s.consumerCtx(), consumerConsAddr.ToSdkConsAddr()) // Note: RecvPacket advances two blocks. Let's say the provider is currently at height N. - // The received slash packet will be queued during N, and handled by the ccv module during - // the endblocker of N. The staking module will then register a validator update from that - // packet during the endblocker of N+1 (note that staking endblocker runs before ccv endblocker, - // hence why the VSC is registered on N+1). Then the ccv module sends VSC packets to each consumer - // during the endblocker of N+1. The new validator set will be committed to in block N+2, - // and will be in effect for the provider during block N+3. + // The received slash packet will be handled during N. The staking module will then register + // a validator update from that packet during the endblocker of N. Then the ccv module sends + // VSC packets to each consumer during the endblocker of N (note ccv endblocker runs after staking). + // The new validator set will be committed to in block N+1, and will be in effect + // for the provider during block N+2. valsetUpdateIdN := providerKeeper.GetValidatorSetUpdateId(s.providerCtx()) // receive the slash packet on the provider chain. RecvPacket() calls the provider endblocker twice - packet := s.newPacketFromConsumer(slashPacket.GetBytes(), sequence, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp) + packet := s.newPacketFromConsumer(slashPacket.GetData(), sequence, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp) + heightBefore := s.providerCtx().BlockHeight() err = s.path.EndpointB.RecvPacket(packet) + heightAfter := s.providerCtx().BlockHeight() s.Require().NoError(err) + s.Require().Equal(heightBefore+2, heightAfter) // We've now advanced two blocks. - // VSC packets should have been sent from provider during block N+1 to each consumer - expectedSentValsetUpdateId := valsetUpdateIdN + 1 + // VSC packets should have been sent from provider during block N to each consumer + expectedSentValsetUpdateId := valsetUpdateIdN for _, bundle := range s.consumerBundles { _, found := providerKeeper.GetVscSendTimestamp(s.providerCtx(), bundle.Chain.ChainID, expectedSentValsetUpdateId) @@ -109,10 +111,7 @@ func (s *CCVTestSuite) TestRelayAndApplyDowntimePacket() { s.Require().Equal(valsetUpdateIdN+2, providerKeeper.GetValidatorSetUpdateId(s.providerCtx())) - // Call next block so provider is now on block N + 3 mentioned above - s.providerChain.NextBlock() - - // check that the validator was removed from the provider validator set by N + 3 + // check that the validator was removed from the provider validator set by N + 2 s.Require().Len(s.providerChain.Vals.Validators, validatorsPerChain-1) for _, bundle := range s.consumerBundles { @@ -156,9 +155,10 @@ func (s *CCVTestSuite) TestRelayAndApplyDowntimePacket() { pFlag := firstConsumerKeeper.OutstandingDowntime(s.consumerCtx(), consumerConsAddr.ToSdkConsAddr()) s.Require().False(pFlag) - // check that slashing packet gets acknowledged successfully - ack := channeltypes.NewResultAcknowledgement([]byte{byte(1)}) - err = s.path.EndpointA.AcknowledgePacket(packet, ack.Acknowledgement()) + // Check that first consumer can recv ack from provider. + // Provider has returned SlashPacketHandledResult. + ack := channeltypes.NewResultAcknowledgement(ccv.SlashPacketHandledResult) + err = s.getFirstBundle().Path.EndpointA.AcknowledgePacket(packet, ack.Acknowledgement()) s.Require().NoError(err) } @@ -205,8 +205,8 @@ func (s *CCVTestSuite) TestRelayAndApplyDoubleSignPacket() { timeoutHeight = clienttypes.Height{} timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccv.DefaultCCVTimeoutPeriod).UnixNano()) ) - slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN) - packet := sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) + slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, 1) + packet := sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetData()) // Advance a few more blocks to make sure any voting power changes would be reflected s.providerChain.NextBlock() @@ -238,8 +238,9 @@ func (s *CCVTestSuite) TestRelayAndApplyDoubleSignPacket() { // check that validator was NOT tombstoned on provider s.Require().False(valSignInfo.Tombstoned) - // check that slashing packet gets acknowledged successfully - ack := channeltypes.NewResultAcknowledgement([]byte{byte(1)}) + // check that slashing packet gets acknowledged successfully, + // provider returns V1Result acks for double sign packets + ack := channeltypes.NewResultAcknowledgement(ccv.V1Result) err = s.path.EndpointA.AcknowledgePacket(packet, ack.Acknowledgement()) s.Require().NoError(err) } @@ -429,16 +430,10 @@ func (suite *CCVTestSuite) TestOnRecvSlashPacketErrors() { errAck = providerKeeper.OnRecvSlashPacket(ctx, packet, *slashingPkt) suite.Require().False(errAck.Success()) - // Expect nothing was queued - suite.Require().Equal(0, len(providerKeeper.GetAllGlobalSlashEntries(ctx))) - suite.Require().Equal(uint64(0), (providerKeeper.GetThrottledPacketDataSize(ctx, consumerChainID))) - // expect to queue entries for the slash request slashingPkt.Infraction = stakingtypes.Infraction_INFRACTION_DOWNTIME ack = providerKeeper.OnRecvSlashPacket(ctx, packet, *slashingPkt) suite.Require().True(ack.Success()) - suite.Require().Equal(1, len(providerKeeper.GetAllGlobalSlashEntries(ctx))) - suite.Require().Equal(uint64(1), (providerKeeper.GetThrottledPacketDataSize(ctx, consumerChainID))) } // TestValidatorDowntime tests if a slash packet is sent diff --git a/tests/integration/stop_consumer.go b/tests/integration/stop_consumer.go index b3d32ee6a4..452b28e3b1 100644 --- a/tests/integration/stop_consumer.go +++ b/tests/integration/stop_consumer.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) @@ -80,33 +79,6 @@ func (s *CCVTestSuite) TestStopConsumerChain() { return nil }, }, - { - func(suite *CCVTestSuite) error { - // Queue slash and vsc packet data for consumer 0, these queue entries will be removed - firstBundle := s.getFirstBundle() - globalEntry := types.NewGlobalSlashEntry(s.providerCtx().BlockTime(), firstBundle.Chain.ChainID, 7, types.ProviderConsAddress{Address: []byte{}}) - providerKeeper.QueueGlobalSlashEntry(s.providerCtx(), globalEntry) - err := providerKeeper.QueueThrottledSlashPacketData(s.providerCtx(), firstBundle.Chain.ChainID, 1, - ccv.SlashPacketData{ValsetUpdateId: 1}) - suite.Require().NoError(err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(s.providerCtx(), - firstBundle.Chain.ChainID, 2, ccv.VSCMaturedPacketData{ValsetUpdateId: 2}) - suite.Require().NoError(err) - - // Queue slash and vsc packet data for consumer 1, these queue entries will be not be removed - secondBundle := s.getBundleByIdx(1) - globalEntry = types.NewGlobalSlashEntry(s.providerCtx().BlockTime(), secondBundle.Chain.ChainID, 7, types.ProviderConsAddress{Address: []byte{}}) - providerKeeper.QueueGlobalSlashEntry(s.providerCtx(), globalEntry) - err = providerKeeper.QueueThrottledSlashPacketData(s.providerCtx(), secondBundle.Chain.ChainID, 1, - ccv.SlashPacketData{ValsetUpdateId: 1}) - suite.Require().NoError(err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(s.providerCtx(), - secondBundle.Chain.ChainID, 2, ccv.VSCMaturedPacketData{ValsetUpdateId: 2}) - suite.Require().NoError(err) - - return nil - }, - }, } for _, so := range setupOperations { @@ -120,15 +92,6 @@ func (s *CCVTestSuite) TestStopConsumerChain() { // check all states are removed and the unbonding operation released s.checkConsumerChainIsRemoved(firstBundle.Chain.ChainID, true) - - // check entries related to second consumer chain are not removed - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 1) - - secondBundle := s.getBundleByIdx(1) - slashData, vscMaturedData, _, _ := providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), secondBundle.Chain.ChainID) - s.Require().Len(slashData, 1) - s.Require().Len(vscMaturedData, 1) } // TODO Simon: implement OnChanCloseConfirm in IBC-GO testing to close the consumer chain's channel end @@ -199,15 +162,4 @@ func (s *CCVTestSuite) checkConsumerChainIsRemoved(chainID string, checkChannel s.Require().Nil(providerKeeper.GetSlashAcks(s.providerCtx(), chainID)) s.Require().Zero(providerKeeper.GetInitChainHeight(s.providerCtx(), chainID)) s.Require().Empty(providerKeeper.GetPendingVSCPackets(s.providerCtx(), chainID)) - - // No remaining global entries for this consumer - allGlobalEntries := providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - for _, entry := range allGlobalEntries { - s.Require().NotEqual(chainID, entry.ConsumerChainID) - } - - // No remaining per-chain entries for this consumer - slashData, vscMaturedData, _, _ := providerKeeper.GetAllThrottledPacketData(s.providerCtx(), chainID) - s.Require().Empty(slashData) - s.Require().Empty(vscMaturedData) } diff --git a/tests/integration/throttle.go b/tests/integration/throttle.go index 7c83529262..71ee3f606b 100644 --- a/tests/integration/throttle.go +++ b/tests/integration/throttle.go @@ -67,8 +67,8 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { // Send a slash packet from consumer to provider s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[0]) tmVal := s.providerChain.Vals.Validators[0] - slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME) - sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) + slashPacket := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetData()) // Assert validator 0 is jailed and has no power vals = providerStakingKeeper.GetAllValidators(s.providerCtx()) @@ -86,10 +86,11 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { // Now send a second slash packet from consumer to provider for a different validator. s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[2]) tmVal = s.providerChain.Vals.Validators[2] - slashPacket = s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME) - sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) + slashPacket = s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, 2) + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket.GetData()) - // Require that slash packet has not been handled + // Require that slash packet has not been handled, a bounce result would have + // been returned, but the IBC helper throws out acks. vals = providerStakingKeeper.GetAllValidators(s.providerCtx()) s.Require().False(vals[2].IsJailed()) @@ -139,11 +140,14 @@ func (s *CCVTestSuite) TestBasicSlashPacketThrottling() { slashMeter = s.providerApp.GetProviderKeeper().GetSlashMeter(cacheCtx) s.Require().True(slashMeter.IsPositive()) - // Assert validator 2 is jailed once pending slash packets are handled in ccv endblocker. - s.providerChain.NextBlock() - vals = providerStakingKeeper.GetAllValidators(cacheCtx) - slashedVal = vals[2] - s.Require().True(slashedVal.IsJailed()) + // Assert validator 2 is jailed once slash packet is retried. + tmVal2 := s.providerChain.Vals.Validators[2] + packet := s.constructSlashPacketFromConsumer(s.getFirstBundle(), + *tmVal2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 3) // make sure to use a new seq num + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, packet.GetData()) + + stakingVal2 := s.mustGetStakingValFromTmVal(*tmVal2) + s.Require().True(stakingVal2.IsJailed()) // Assert validator 2 has no power, this should be apparent next block, // since the staking endblocker runs before the ccv endblocker. @@ -160,26 +164,12 @@ func (s *CCVTestSuite) TestMultiConsumerSlashPacketThrottling() { s.SetupAllCCVChannels() s.setupValidatorPowers() - providerKeeper := s.providerApp.GetProviderKeeper() - providerStakingKeeper := s.providerApp.GetTestStakingKeeper() - - // First confirm that VSC matured packets are handled immediately (not queued) - // when no slash packets are sent. - - // Send 2 VSC matured packets from every consumer to provider var ( timeoutHeight = clienttypes.Height{} timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) ) - for consumerChainID, bundle := range s.consumerBundles { - slashPacket := s.constructVSCMaturedPacketFromConsumer(*bundle) - sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) - slashPacket = s.constructVSCMaturedPacketFromConsumer(*bundle) - sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) - // Confirm packets were not queued on provider for this consumer - s.Require().Equal(uint64(0), - providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), consumerChainID)) - } + + providerStakingKeeper := s.providerApp.GetTestStakingKeeper() // Choose 3 consumer bundles. It doesn't matter which ones. idx := 0 @@ -192,7 +182,7 @@ func (s *CCVTestSuite) TestMultiConsumerSlashPacketThrottling() { idx++ } - // Send some packets to provider from the 3 chosen consumers. + // Send some slash packets to provider from the 3 chosen consumers. // They will each slash a different validator according to idx. idx = 0 valsToSlash := []tmtypes.Validator{} @@ -208,53 +198,70 @@ func (s *CCVTestSuite) TestMultiConsumerSlashPacketThrottling() { *bundle, *tmVal, stakingtypes.Infraction_INFRACTION_DOWNTIME, + 1, // all consumers use 1 seq num ) - sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) - - // Send two trailing VSC matured packets from consumer to provider - slashPacket = s.constructVSCMaturedPacketFromConsumer(*bundle) - sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) - slashPacket = s.constructVSCMaturedPacketFromConsumer(*bundle) - sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetBytes()) + sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, slashPacket.GetData()) idx++ } - // Confirm that the slash packet and trailing VSC matured packet - // were handled immediately for the first consumer (this packet was recv first). + // Confirm that the slash packet for the first consumer was handled (this packet was recv first). s.confirmValidatorJailed(valsToSlash[0], true) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[0].Chain.ChainID)) - // Packets were queued for the second and third consumers. + // Packets were bounced for the second and third consumers. s.confirmValidatorNotJailed(valsToSlash[1], 1000) - s.Require().Equal(uint64(3), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[1].Chain.ChainID)) s.confirmValidatorNotJailed(valsToSlash[2], 1000) - s.Require().Equal(uint64(3), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[2].Chain.ChainID)) // Total power is now 3000 s.Require().Equal(int64(3000), providerStakingKeeper.GetLastTotalPower(s.providerCtx()).Int64()) // Now replenish the slash meter and confirm one of two queued slash - // packet entries are then handled. Order is irrelevant here since those - // two packets were sent and recv at the same block time when being queued. + // packet entries are then handled, when both are retried. s.replenishSlashMeterTillPositive() - // 1st NextBlock will handle the slash packet, 2nd will update staking module val powers + // Retry from consumer with idx 1 + bundle := senderBundles[1] + packet := s.constructSlashPacketFromConsumer( + *bundle, + valsToSlash[1], + stakingtypes.Infraction_INFRACTION_DOWNTIME, + 2, // seq number is incremented since last try + ) + sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, packet.GetData()) + + // retry from consumer with idx 2 + bundle = senderBundles[2] + packet = s.constructSlashPacketFromConsumer( + *bundle, + valsToSlash[2], + stakingtypes.Infraction_INFRACTION_DOWNTIME, + 2, // seq number is incremented since last try + ) + sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, packet.GetData()) + + // Call NextBlocks to update staking module val powers s.providerChain.NextBlock() s.providerChain.NextBlock() - // If one of the entires was handled, total power will be 2000 (1000 power was slashed) + // If one of the entires was handled, total power will be 2000 (1000 power was just slashed) s.Require().Equal(int64(2000), providerStakingKeeper.GetLastTotalPower(s.providerCtx()).Int64()) // Now replenish one more time, and handle final slash packet. s.replenishSlashMeterTillPositive() - // 1st NextBlock will handle the slash packet, 2nd will update last validator power + // Retry from consumer with idx 2 + bundle = senderBundles[2] + packet = s.constructSlashPacketFromConsumer( + *bundle, + valsToSlash[2], + stakingtypes.Infraction_INFRACTION_DOWNTIME, + 3, // seq number is incremented since last try + ) + sendOnConsumerRecvOnProvider(s, bundle.Path, timeoutHeight, timeoutTimestamp, packet.GetData()) + + // Call NextBlocks to update staking module val powers s.providerChain.NextBlock() s.providerChain.NextBlock() @@ -267,15 +274,6 @@ func (s *CCVTestSuite) TestMultiConsumerSlashPacketThrottling() { for _, val := range valsToSlash { s.confirmValidatorJailed(val, true) } - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[0].Chain.ChainID)) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[1].Chain.ChainID)) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), senderBundles[2].Chain.ChainID)) - - // All global queue entries are gone too - s.Require().Empty(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx())) } // TestPacketSpam confirms that the provider can handle a large number of @@ -319,8 +317,8 @@ func (s *CCVTestSuite) TestPacketSpam() { infractionType = stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN } valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] - slashPacket := s.constructSlashPacketFromConsumer(firstBundle, *valToJail, infractionType) - packetsData = append(packetsData, slashPacket.GetBytes()) + slashPacket := s.constructSlashPacketFromConsumer(firstBundle, *valToJail, infractionType, ibcSeqNum) + packetsData = append(packetsData, slashPacket.GetData()) } // Recv 500 packets from consumer to provider in same block @@ -335,17 +333,14 @@ func (s *CCVTestSuite) TestPacketSpam() { providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } - // Execute block to handle packets in endblock + // Execute block s.providerChain.NextBlock() - // Confirm all packets are handled or dropped (queues empty) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), firstBundle.Chain.ChainID)) - slashData, vscMData, _, _ := providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), firstBundle.Chain.ChainID) - s.Require().Empty(slashData) - s.Require().Empty(vscMData) - s.Require().Empty(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx())) + // Confirm 3 expected vals are jailed + for i := 0; i < 3; i++ { + val := s.providerChain.Vals.Validators[i] + s.confirmValidatorJailed(*val, true) + } } func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { @@ -379,8 +374,8 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { // Increment ibc seq num for each packet (starting at 1) ibcSeqNum++ valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] - slashPacket := s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN) - packetsData = append(packetsData, slashPacket.GetBytes()) + slashPacket := s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ibcSeqNum) + packetsData = append(packetsData, slashPacket.GetData()) } // Recv 500 packets from consumer to provider in same block @@ -398,15 +393,6 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { // Execute block to handle packets in endblock s.providerChain.NextBlock() - // Confirm all packets are dropped (queues empty) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize( - s.providerCtx(), firstBundle.Chain.ChainID)) - slashData, vscMData, _, _ := providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), firstBundle.Chain.ChainID) - s.Require().Empty(slashData) - s.Require().Empty(vscMData) - s.Require().Empty(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx())) - // Confirm that slash meter is not affected s.Require().Equal(providerKeeper.GetSlashMeterAllowance(s.providerCtx()), providerKeeper.GetSlashMeter(s.providerCtx())) @@ -436,162 +422,6 @@ func (s *CCVTestSuite) TestDoubleSignDoesNotAffectThrottling() { } } -// TestQueueOrdering validates that the ordering of slash packet entries -// in the global queue (relevant to a single chain) matches the ordering of slash packet -// data in the chain specific queues, even in the presence of packet spam. -// -// Note: The global queue is ordered by: time, then IBC sequence number, see GlobalSlashEntryKey. -// The chain specific queue is ordered by: IBC sequence number, see ThrottledPacketDataKey. -func (s *CCVTestSuite) TestQueueOrdering() { - // Setup ccv channels to all consumers - s.SetupAllCCVChannels() - - // Setup validator powers to be 25%, 25%, 25%, 25% - s.setupValidatorPowers() - - // Explicitly set params, initialize slash meter - providerKeeper := s.providerApp.GetProviderKeeper() - params := providerKeeper.GetParams(s.providerCtx()) - params.SlashMeterReplenishFraction = "0.05" // 5% total power can be jailed - providerKeeper.SetParams(s.providerCtx(), params) - providerKeeper.InitializeSlashMeter(s.providerCtx()) - - // The packets to be recv in a single block, ordered as they will be recv. - var packetsData [][]byte - - firstBundle := s.getFirstBundle() - - // Slash first 3 but not 4th validator - s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[0]) - s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[1]) - s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[2]) - - // Track and increment ibc seq num for each packet, since these need to be unique. - var ( - ibcSeqNum = uint64(4) - ibcSeqs []uint64 - ) - - for ibcSeqNum < 504 { - // Increment ibc seq num for each packet (starting at 5) - ibcSeqNum++ - ibcSeqs = append(ibcSeqs, ibcSeqNum) - - // Instantiate a vsc matured packet every 10th packet - if ibcSeqNum%10 == 0 { - packetsData = append(packetsData, s.constructVSCMaturedPacketFromConsumer(firstBundle).GetBytes()) - continue - } - // Else instantiate a slash packet - - valToJail := s.providerChain.Vals.Validators[ibcSeqNum%3] - packetsData = append(packetsData, s.constructSlashPacketFromConsumer(firstBundle, *valToJail, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes()) - } - - // Recv 500 packets from consumer to provider in same block - var ( - timeoutHeight = clienttypes.Height{} - timeoutTimestamp = uint64(firstBundle.GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) - ) - for i, data := range packetsData { - consumerPacketData, err := provider.UnmarshalConsumerPacketData(data) // Same func used by provider's OnRecvPacket - s.Require().NoError(err) - packet := s.newPacketFromConsumer(data, ibcSeqs[i], firstBundle.Path, timeoutHeight, timeoutTimestamp) - // Type depends on index packets were appended from above - if (i+5)%10 == 0 { - vscMaturedPacketData := consumerPacketData.GetVscMaturedPacketData() - vscMaturedPacketData.ValsetUpdateId = uint64(i + 1000) - providerKeeper.OnRecvVSCMaturedPacket(s.providerCtx(), packet, *vscMaturedPacketData) - } else { - // Set valset update id to be 2000 + index to assert ordering - slashPacketData := consumerPacketData.GetSlashPacketData() - slashPacketData.ValsetUpdateId = uint64(i + 2000) - // Set block height mapping so packet is not dropped - providerKeeper.SetValsetUpdateBlockHeight(s.providerCtx(), - slashPacketData.ValsetUpdateId, uint64(firstBundle.GetCtx().BlockHeight())) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *slashPacketData) - } - } - - // Confirm that global queue has 450 packet entries (500 * 0.9) - allGlobalEntries := providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(450, len(allGlobalEntries)) - - // Confirm that the chain specific queue has 450 slash packet data instances, and 50 vsc matured - slashPacketData, vscMaturedPacketData, _, _ := providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), firstBundle.Chain.ChainID) - s.Require().Equal(450, len(slashPacketData)) - s.Require().Equal(50, len(vscMaturedPacketData)) - - // IBC seq numbers of recv slash packets range from 5 to 504. - // Confirm expected global queue ordering. - expectedSeqNum := uint64(5) - for _, globalEntry := range allGlobalEntries { - // entries should be ordered by ibc seq num starting at 5 - s.Require().Equal(expectedSeqNum, globalEntry.IbcSeqNum) - expectedSeqNum++ - if expectedSeqNum%10 == 0 { - // Skip over vsc matured packets - expectedSeqNum++ - } - } - - // Confirm expected chain specific queue ordering. - expectedVscId := uint64(2000) - for _, slashPacket := range slashPacketData { - // entries should be ordered by valset update id starting at 2000 - s.Require().Equal(expectedVscId, slashPacket.ValsetUpdateId) - expectedVscId++ - if (expectedVscId+5)%10 == 0 { - // Skip over vsc matured packets - expectedVscId++ - } - } - for idx, vscMaturedPacket := range vscMaturedPacketData { - // entries should be ordered by valset update id starting at 1005 - // and show up every 10 packets - expectedVscId = uint64(1005) + 10*uint64(idx) - s.Require().Equal(expectedVscId, vscMaturedPacket.ValsetUpdateId) - } - - // Execute endblock to handle packets in throttled manner - s.providerChain.NextBlock() - - // Confirm that only the first packet was handled - allGlobalEntries = providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(449, len(allGlobalEntries)) - slashPacketData, vscMaturedPacketData, _, _ = providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), firstBundle.Chain.ChainID) - s.Require().Equal(449, len(slashPacketData)) - // No VSC matured packets should be handled yet - s.Require().Equal(50, len(vscMaturedPacketData)) - - // Replenish frac is 0.05, so jailing %25 of the validators should result in a negative slash meter. - s.Require().True(providerKeeper.GetSlashMeter(s.providerCtx()).IsNegative()) - - // Confirm total power is now 3000 once updated by staking end blocker - s.providerChain.NextBlock() - totalPower := s.providerApp.GetTestStakingKeeper().GetLastTotalPower(s.providerCtx()) - s.Require().Equal(sdk.NewInt(3000), totalPower) - - // Now change replenish frac to 0.67 and fully replenish the meter. - params.SlashMeterReplenishFraction = "0.67" - providerKeeper.SetParams(s.providerCtx(), params) - providerKeeper.InitializeSlashMeter(s.providerCtx()) - - // Execute endblock to handle packets (remaining packets are relevant to 2/3 of the validators) - // so the current replenish frac should be enough to handle all packets this block. - s.providerChain.NextBlock() - - // Confirm both queues are now empty, meaning every packet was handled. - allGlobalEntries = providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(0, len(allGlobalEntries)) - slashPacketData, vscMaturedPacketData, _, _ = providerKeeper.GetAllThrottledPacketData( - s.providerCtx(), firstBundle.Chain.ChainID) - s.Require().Equal(0, len(slashPacketData)) - s.Require().Equal(0, len(vscMaturedPacketData)) -} - // TestSlashingSmallValidators tests that multiple slash packets from validators with small // power can be handled by the provider chain in a non-throttled manner. func (s *CCVTestSuite) TestSlashingSmallValidators() { @@ -628,12 +458,12 @@ func (s *CCVTestSuite) TestSlashingSmallValidators() { tmval1 := s.providerChain.Vals.Validators[1] tmval2 := s.providerChain.Vals.Validators[2] tmval3 := s.providerChain.Vals.Validators[3] - slashPacket1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME) - slashPacket2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME) - slashPacket3 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME) - sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket1.GetBytes()) - sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket2.GetBytes()) - sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket3.GetBytes()) + slashPacket1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + slashPacket2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 2) + slashPacket3 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME, 3) + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket1.GetData()) + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket2.GetData()) + sendOnConsumerRecvOnProvider(s, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp, slashPacket3.GetData()) // Default slash meter replenish fraction is 0.05, so all sent packets should be handled immediately. vals = providerStakingKeeper.GetAllValidators(s.providerCtx()) @@ -675,64 +505,6 @@ func (s *CCVTestSuite) TestSlashMeterAllowanceChanges() { s.Require().Equal(int64(1200), providerKeeper.GetSlashMeterAllowance(s.providerCtx()).Int64()) } -// TestSlashSameValidator tests the edge case that that the total slashed validator power -// queued up for a single block exceeds the slash meter allowance, -// but some of the slash packets are for the same validator, and therefore some packets -// will be applied to a validator that is already jailed but still not unbonded (ie. still slashable). -func (s *CCVTestSuite) TestSlashSameValidator() { - s.SetupAllCCVChannels() - - // Setup 4 validators with 25% of the total power each. - s.setupValidatorPowers() - - providerKeeper := s.providerApp.GetProviderKeeper() - - // Set replenish fraction to 1.0 so that all sent packets should handled immediately (no throttling) - params := providerKeeper.GetParams(s.providerCtx()) - params.SlashMeterReplenishFraction = fullSlashMeterString // needs to be const for linter - providerKeeper.SetParams(s.providerCtx(), params) - providerKeeper.InitializeSlashMeter(s.providerCtx()) - - // Send a downtime and double-sign slash packet for 3/4 validators - // This will have a total slashing power of 150% total power. - tmval1 := s.providerChain.Vals.Validators[1] - tmval2 := s.providerChain.Vals.Validators[2] - tmval3 := s.providerChain.Vals.Validators[3] - s.setDefaultValSigningInfo(*tmval1) - s.setDefaultValSigningInfo(*tmval2) - s.setDefaultValSigningInfo(*tmval3) - - packetsData := [][]byte{ - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval3, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes(), - } - - // Recv and queue all slash packets. - var ( - timeoutHeight = clienttypes.Height{} - timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) - ) - for i, data := range packetsData { - consumerPacketData, err := provider.UnmarshalConsumerPacketData(data) // Same func used by provider's OnRecvPacket - s.Require().NoError(err) - packet := s.newPacketFromConsumer(data, uint64(i), s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) - } - - // We should have 6 pending slash packet entries queued. - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 6) - - // Call next block to process all pending slash packets in end blocker. - s.providerChain.NextBlock() - - // All slash packets should have been handled immediately, even though they totaled to 150% of total power. - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 0) -} - // Similar to TestSlashSameValidator, but 100% of val power is jailed a single block, // and in the first packets recv for that block. // This edge case should not occur in practice, but is useful to validate that @@ -758,17 +530,20 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes // Instantiate a slash packet for each validator, // these first 4 packets should jail 100% of the total power. + ibcSeqNum := uint64(1) for _, val := range s.providerChain.Vals.Validators { s.setDefaultValSigningInfo(*val) packetsData = append(packetsData, s.constructSlashPacketFromConsumer( - s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes()) + s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum).GetData()) + ibcSeqNum++ } // add 5 more slash packets for each validator, that will be handled in the same block. for _, val := range s.providerChain.Vals.Validators { for i := 0; i < 5; i++ { packetsData = append(packetsData, s.constructSlashPacketFromConsumer( - s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes()) + s.getFirstBundle(), *val, stakingtypes.Infraction_INFRACTION_DOWNTIME, ibcSeqNum).GetData()) + ibcSeqNum++ } } @@ -785,17 +560,7 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumerPacketData.GetSlashPacketData()) } - // We should have 24 pending slash packet entries queued. - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 24) - - // Call next block to process all pending slash packets in end blocker. - s.providerChain.NextBlock() - - // All slash packets should have been handled immediately, - // even though the first 4 packets jailed 100% of the total power. - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 0) - - // Sanity check that all validators are jailed. + // Check that all validators are jailed. for _, val := range s.providerChain.Vals.Validators { // Do not check power, since val power is not yet updated by staking endblocker. s.confirmValidatorJailed(*val, false) @@ -805,162 +570,6 @@ func (s CCVTestSuite) TestSlashAllValidators() { //nolint:govet // this is a tes // "applying the validator changes would result in empty set". } -func (s *CCVTestSuite) TestLeadingVSCMaturedAreDequeued() { - s.SetupAllCCVChannels() - providerKeeper := s.providerApp.GetProviderKeeper() - - // Queue up 50 vsc matured packets for each consumer - var ( - timeoutHeight = clienttypes.Height{} - timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) - ) - for _, bundle := range s.consumerBundles { - for i := 0; i < 50; i++ { - ibcSeqNum := uint64(i) - data := s.constructVSCMaturedPacketFromConsumer(*bundle).GetBytes() - packetData, err := provider.UnmarshalConsumerPacketData(data) // Same func used by provider's OnRecvPacket - s.Require().NoError(err) - packet := s.newPacketFromConsumer(data, ibcSeqNum, bundle.Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvVSCMaturedPacket(s.providerCtx(), - packet, *packetData.GetVscMaturedPacketData()) - } - } - - // Queue up 50 slash packets for each consumer - for _, bundle := range s.consumerBundles { - for i := 50; i < 100; i++ { - ibcSeqNum := uint64(i) - data := s.constructSlashPacketFromConsumer(*bundle, - *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes() - packetData, err := provider.UnmarshalConsumerPacketData(data) // Same func used by provider's OnRecvPacket - s.Require().NoError(err) - packet := s.newPacketFromConsumer(data, ibcSeqNum, bundle.Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), - packet, *packetData.GetSlashPacketData()) - } - } - - // Queue up another 50 vsc matured packets for each consumer - for _, bundle := range s.consumerBundles { - for i := 100; i < 150; i++ { - ibcSeqNum := uint64(i) - data := s.constructVSCMaturedPacketFromConsumer(*bundle).GetBytes() - packetData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(data, &packetData) - packet := s.newPacketFromConsumer(data, ibcSeqNum, bundle.Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvVSCMaturedPacket(s.providerCtx(), - packet, *packetData.GetVscMaturedPacketData()) - } - } - - // Confirm queue size is 150 for each consumer-specific queue. - for _, bundle := range s.consumerBundles { - s.Require().Equal(uint64(150), - providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), bundle.Chain.ChainID)) - } - // Confirm global queue size is 50 * 5 (50 slash packets for each of 5 consumers) - globalEntries := providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(len(globalEntries), 50*5) - - // Set slash meter to negative value to not allow any slash packets to be handled. - providerKeeper.SetSlashMeter(s.providerCtx(), sdk.NewInt(-1)) - - // Set replenish time candidate so that no replenishment happens next block. - providerKeeper.SetSlashMeterReplenishTimeCandidate(s.providerCtx()) - - // Execute end blocker to dequeue only the leading vsc matured packets. - // Note we must call the end blocker three times, since only 100 vsc matured packets can be handled - // each block, and we have 5*50=250 total. - s.providerChain.NextBlock() - s.providerChain.NextBlock() - s.providerChain.NextBlock() - - // Confirm queue size is 100 for each consumer-specific queue (50 leading vsc matured are dequeued). - for _, bundle := range s.consumerBundles { - s.Require().Equal(uint64(100), - providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), bundle.Chain.ChainID)) - } - - // No slash packets handled, global slash queue is same size as last block. - globalEntries = providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(len(globalEntries), 50*5) - - // No slash packets handled even if we call end blocker a couple more times. - s.providerChain.NextBlock() - s.providerChain.NextBlock() - globalEntries = providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(len(globalEntries), 50*5) -} - -// TestVscMaturedHandledPerBlockLimit tests that only 100 vsc matured packets are handled per block, -// specifically from HandleThrottleQueues(). -// -// Note the vsc matured per block limit is also tested in, TestLeadingVSCMaturedAreDequeued, -// specifically in the context of HandleLeadingVSCMaturedPackets(). -func (s *CCVTestSuite) TestVscMaturedHandledPerBlockLimit() { - s.SetupAllCCVChannels() - providerKeeper := s.providerApp.GetProviderKeeper() - - // Set replenish fraction to 1.0 so that all sent packets should be handled immediately (no jail throttling) - params := providerKeeper.GetParams(s.providerCtx()) - params.SlashMeterReplenishFraction = fullSlashMeterString // needs to be const for linter - providerKeeper.SetParams(s.providerCtx(), params) - providerKeeper.InitializeSlashMeter(s.providerCtx()) - - // Queue up 100 vsc matured packets for each consumer - var ( - timeoutHeight = clienttypes.Height{} - timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) - ) - for _, bundle := range s.consumerBundles { - for i := 0; i < 100; i++ { - ibcSeqNum := uint64(i) - data := s.constructVSCMaturedPacketFromConsumer(*bundle).GetBytes() - packetData := ccvtypes.ConsumerPacketData{} - ccvtypes.ModuleCdc.MustUnmarshalJSON(data, &packetData) - packet := s.newPacketFromConsumer(data, ibcSeqNum, bundle.Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvVSCMaturedPacket(s.providerCtx(), - packet, *packetData.GetVscMaturedPacketData()) - } - } - - // Queue up 50 slash packets for each consumer, with new IBC sequence numbers - for _, bundle := range s.consumerBundles { - for i := 100; i < 150; i++ { - ibcSeqNum := uint64(i) - data := s.constructSlashPacketFromConsumer(*bundle, - *s.providerChain.Vals.Validators[0], stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes() - consumderPacketData, err := provider.UnmarshalConsumerPacketData(data) // Same func used by provider's OnRecvPacket - s.Require().NoError(err) - packet := s.newPacketFromConsumer(data, ibcSeqNum, bundle.Path, timeoutHeight, timeoutTimestamp) - providerKeeper.OnRecvSlashPacket(s.providerCtx(), packet, *consumderPacketData.GetSlashPacketData()) - } - } - - // Confirm queue size is 150 for each consumer-specific queue. - for _, bundle := range s.consumerBundles { - s.Require().Equal(uint64(150), - providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), bundle.Chain.ChainID)) - } - // Confirm global queue size is 50 * 5 (50 slash packets for each of 5 consumers) - globalEntries := providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()) - s.Require().Equal(len(globalEntries), 50*5) - - // Note even though there is no jail throttling active, slash packets will not be handled until - // all of the leading vsc matured packets are handled first. This should take 5 blocks. - for i := 0; i < 5; i++ { - s.providerChain.NextBlock() - s.Require().Len(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx()), 250) // global entries remain same size - } - - // Set signing info for val to be jailed, preventing panic - s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[0]) - - // Now we execute one more block and all 250 of the slash packets should be handled. - s.providerChain.NextBlock() - s.Require().Empty(providerKeeper.GetAllGlobalSlashEntries(s.providerCtx())) // empty global entries = all slash packets handled -} - func (s *CCVTestSuite) confirmValidatorJailed(tmVal tmtypes.Validator, checkPower bool) { sdkVal, found := s.providerApp.GetTestStakingKeeper().GetValidator( s.providerCtx(), sdk.ValAddress(tmVal.Address)) diff --git a/tests/integration/throttle_retry.go b/tests/integration/throttle_retry.go index 4d46b310cf..4b445d5d25 100644 --- a/tests/integration/throttle_retry.go +++ b/tests/integration/throttle_retry.go @@ -1,33 +1,25 @@ package integration import ( - clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + "time" + channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - provider "github.com/cosmos/interchain-security/v3/x/ccv/provider" - providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) -// TestSlashRetries tests the throttling v2 retry logic. Without provider changes, -// the consumer will queue up a slash packet, the provider will return a v1 result, -// and the consumer will never need to retry. -// -// Once provider changes are made (slash packet queuing is removed), the consumer may retry packets -// via new result acks from the provider. -// -// TODO: This test will need updating once provider changes are made. +// TestSlashRetries tests the throttling v2 retry logic at an integration level. func (s *CCVTestSuite) TestSlashRetries() { s.SetupAllCCVChannels() + s.SendEmptyVSCPacket() // Establish ccv channel s.setupValidatorPowers() // // Provider setup // providerKeeper := s.providerApp.GetProviderKeeper() - providerModule := provider.NewAppModule(&providerKeeper, s.providerApp.GetSubspace(providertypes.ModuleName)) // Initialize slash meter providerKeeper.InitializeSlashMeter(s.providerCtx()) // Assert that we start out with no jailings @@ -36,13 +28,24 @@ func (s *CCVTestSuite) TestSlashRetries() { for _, val := range vals { s.Require().False(val.IsJailed()) } + + // We jail two different validators in this test, referred to as val1 and val2. + // This may or may not correspond to the indexes 1 and 2 in various validator slices, + // depending on how the slice is constructed. + + // The s.providerChain.Vals.Validators set will change depending on jailings, + // so we cache these two val objects now to be the canonical val1 and val2. + tmval1 := s.providerChain.Vals.Validators[1] + tmval2 := s.providerChain.Vals.Validators[2] + // Setup signing info for jailings - s.setDefaultValSigningInfo(*s.providerChain.Vals.Validators[1]) + s.setDefaultValSigningInfo(*tmval1) + s.setDefaultValSigningInfo(*tmval2) // // Consumer setup // - consumerKeeper := s.consumerApp.GetConsumerKeeper() + consumerKeeper := s.getFirstBundle().App.GetConsumerKeeper() // Assert no slash record exists _, found := consumerKeeper.GetSlashRecord(s.consumerCtx()) s.Require().False(found) @@ -51,106 +54,166 @@ func (s *CCVTestSuite) TestSlashRetries() { // Test section: See FSM explanation in throttle_retry.go // - // Construct a mock slash packet from consumer - tmval1 := s.providerChain.Vals.Validators[1] - packetData1 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes() - var ( - timeoutHeight = clienttypes.Height{} - timeoutTimestamp = uint64(s.getFirstBundle().GetCtx().BlockTime().Add(ccvtypes.DefaultCCVTimeoutPeriod).UnixNano()) - ) - packet1 := s.newPacketFromConsumer(packetData1, 1, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp) - // Mock the sending of the packet on consumer + // Construct a slash packet + packet1, data := s.constructSlashPacketFromConsumerWithData( + s.getFirstBundle(), *tmval1, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) + + // Append packet to be sent by consumer consumerKeeper.AppendPendingPacket(s.consumerCtx(), ccvtypes.SlashPacket, &ccvtypes.ConsumerPacketData_SlashPacketData{ - SlashPacketData: &ccvtypes.SlashPacketData{}, + SlashPacketData: &data, }, ) - consumerKeeper.UpdateSlashRecordOnSend(s.consumerCtx()) + + sendTime := s.consumerCtx().BlockTime() + + // Advance block on consumer to send pending packet + s.getFirstBundle().Chain.NextBlock() + + // Confirm packet was sent via state that's updated on send slashRecord, found := consumerKeeper.GetSlashRecord(s.consumerCtx()) s.Require().True(found) s.Require().True(slashRecord.WaitingOnReply) + s.Require().NotZero(slashRecord.SendTime) + s.Require().Equal(sendTime, slashRecord.SendTime) s.Require().Len(consumerKeeper.GetPendingPackets(s.consumerCtx()), 1) - // Recv packet on provider and assert ack. Provider should return v1 result. - ack := providerModule.OnRecvPacket(s.providerCtx(), packet1, nil) - expectedv1Ack := channeltypes.NewResultAcknowledgement([]byte(ccvtypes.V1Result)) - s.Require().Equal(expectedv1Ack.Acknowledgement(), ack.Acknowledgement()) + // Packet sending blocked until provider returns slash packet handled ack + s.Require().False(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) + + // Recv packet on provider. + relayAllCommittedPackets(s, s.consumerChain, s.path, ccvtypes.ConsumerPortID, s.path.EndpointA.ChannelID, 1) // Couple blocks pass on provider for provider staking keeper to process jailing s.providerChain.NextBlock() s.providerChain.NextBlock() // Default slash meter replenish fraction is 0.05, so packet should be handled on provider. - vals = s.providerApp.GetTestStakingKeeper().GetAllValidators(s.providerCtx()) - s.Require().True(vals[1].IsJailed()) + stakingVal1 := s.mustGetStakingValFromTmVal(*tmval1) + s.Require().True(stakingVal1.IsJailed()) s.Require().Equal(int64(0), - s.providerApp.GetTestStakingKeeper().GetLastValidatorPower(s.providerCtx(), vals[1].GetOperator())) - s.Require().Equal(uint64(0), providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), - s.getFirstBundle().Chain.ChainID)) + s.providerApp.GetTestStakingKeeper().GetLastValidatorPower(s.providerCtx(), stakingVal1.GetOperator())) // Now slash meter should be negative on provider s.Require().True(s.providerApp.GetProviderKeeper().GetSlashMeter(s.providerCtx()).IsNegative()) // Apply ack back on consumer - ackForConsumer := expectedv1Ack - err := consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet1, ackForConsumer) + expectedAck := channeltypes.NewResultAcknowledgement([]byte(ccvtypes.SlashPacketHandledResult)) + err := s.getFirstBundle().Path.EndpointA.AcknowledgePacket(packet1, expectedAck.Acknowledgement()) s.Require().NoError(err) - // Slash record should have been deleted, head of pending packets should have been popped - // Since provider has handled the packet + // Slash record should have been deleted, head of pending packets should have been popped, + // since provider has handled the packet. _, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) s.Require().False(found) s.Require().Empty(consumerKeeper.GetPendingPackets(s.consumerCtx())) + // Packet sending should now be unblocked + s.Require().True(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) + // pass two blocks on provider and consumer for good measure s.providerChain.NextBlock() s.providerChain.NextBlock() s.consumerChain.NextBlock() s.consumerChain.NextBlock() - // Construct and mock the sending of a second packet on consumer - tmval2 := s.providerChain.Vals.Validators[2] - packetData2 := s.constructSlashPacketFromConsumer(s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME).GetBytes() - packet2 := s.newPacketFromConsumer(packetData2, 1, s.getFirstBundle().Path, timeoutHeight, timeoutTimestamp) - + // Have consumer queue a new slash packet for a different validator. + packet2, data := s.constructSlashPacketFromConsumerWithData( + s.getFirstBundle(), *tmval2, stakingtypes.Infraction_INFRACTION_DOWNTIME, 1) consumerKeeper.AppendPendingPacket(s.consumerCtx(), ccvtypes.SlashPacket, &ccvtypes.ConsumerPacketData_SlashPacketData{ - SlashPacketData: &ccvtypes.SlashPacketData{}, + SlashPacketData: &data, }, ) - consumerKeeper.UpdateSlashRecordOnSend(s.consumerCtx()) + + // Advance block on consumer to send pending packet + sendTime = s.consumerCtx().BlockTime() + s.getFirstBundle().Chain.NextBlock() + + // Confirm packet was sent via state that's updated on send slashRecord, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) s.Require().True(found) s.Require().True(slashRecord.WaitingOnReply) + s.Require().NotZero(slashRecord.SendTime) + s.Require().Equal(sendTime, slashRecord.SendTime) s.Require().Len(consumerKeeper.GetPendingPackets(s.consumerCtx()), 1) - // Recv 2nd slash packet on provider for different validator. - // Provider should return the same v1 result ack even tho the packet was queued. - ack = providerModule.OnRecvPacket(s.providerCtx(), packet2, nil) - expectedv1Ack = channeltypes.NewResultAcknowledgement([]byte(ccvtypes.V1Result)) - s.Require().Equal(expectedv1Ack.Acknowledgement(), ack.Acknowledgement()) + // Packet sending blocked until provider returns slash packet handled ack + s.Require().False(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) + + // Recv 2nd packet on provider. + relayAllCommittedPackets(s, s.consumerChain, s.path, ccvtypes.ConsumerPortID, s.path.EndpointA.ChannelID, 1) // Couple blocks pass on provider for staking keeper to process jailings s.providerChain.NextBlock() s.providerChain.NextBlock() - // Val shouldn't be jailed on provider. Slash packet was queued - s.Require().False(vals[2].IsJailed()) + // Val 2 shouldn't be jailed on provider. Slash packet should have been bounced. + stakingVal2 := s.mustGetStakingValFromTmVal(*tmval2) + s.Require().False(stakingVal2.IsJailed()) s.Require().Equal(int64(1000), - providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), vals[2].GetOperator())) - s.Require().Equal(uint64(1), providerKeeper.GetThrottledPacketDataSize(s.providerCtx(), - s.getFirstBundle().Chain.ChainID)) + providerStakingKeeper.GetLastValidatorPower(s.providerCtx(), stakingVal2.GetOperator())) // Apply ack on consumer - ackForConsumer = expectedv1Ack - err = consumerKeeper.OnAcknowledgementPacket(s.consumerCtx(), packet2, ackForConsumer) + expectedAck = channeltypes.NewResultAcknowledgement([]byte(ccvtypes.SlashPacketBouncedResult)) + err = s.getFirstBundle().Path.EndpointA.AcknowledgePacket(packet2, expectedAck.Acknowledgement()) s.Require().NoError(err) - // TODO: when provider changes are made, slashRecord.WaitingOnReply should have been updated to false on consumer. Slash Packet will still be in consumer's pending packets queue. + // Now consumer should have updated it's slash record on receipt of bounce ack + slashRecord, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) + s.Require().True(found) + s.Require().False(slashRecord.WaitingOnReply) + // Packet still at head of queue + s.Require().Len(consumerKeeper.GetPendingPackets(s.consumerCtx()), 1) + + // Packet sending should still be blocked, WaitingOnReply is false, + // but retry delay hasn't passed yet. + s.Require().False(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) + + // IBC testing framework doesn't have a way to advance time, + // so we manually mutate send time in the slash record to be in the past. + slashRecord.SendTime = slashRecord.SendTime.Add(-time.Hour - time.Minute) + consumerKeeper.SetSlashRecord(s.consumerCtx(), slashRecord) + + s.Require().True(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) + + // Set slash meter on provider to positive value, + // now allowing handling of the slash packet + providerKeeper.InitializeSlashMeter(s.providerCtx()) + + // Advance block on consumer, now consumer should retry the sending of the slash packet. + sendTime = s.consumerCtx().BlockTime() + s.getFirstBundle().Chain.NextBlock() + + // Confirm packet was sent via state that's updated on send + slashRecord, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) + s.Require().True(found) + s.Require().True(slashRecord.WaitingOnReply) + s.Require().NotZero(slashRecord.SendTime) + s.Require().Equal(sendTime, slashRecord.SendTime) + s.Require().Len(consumerKeeper.GetPendingPackets(s.consumerCtx()), 1) + + // Recv retried packet on provider. + relayAllCommittedPackets(s, s.consumerChain, s.path, ccvtypes.ConsumerPortID, s.path.EndpointA.ChannelID, 1) + + // Couple blocks pass on provider for provider staking keeper to process jailing + s.providerChain.NextBlock() + s.providerChain.NextBlock() + + // Provider should have now jailed val 2 + stakingVal2 = s.mustGetStakingValFromTmVal(*tmval2) + s.Require().True(stakingVal2.IsJailed()) + s.Require().Equal(int64(0), + s.providerApp.GetTestStakingKeeper().GetLastValidatorPower(s.providerCtx(), stakingVal2.GetOperator())) + + // Apply ack on consumer + expectedAck = channeltypes.NewResultAcknowledgement([]byte(ccvtypes.SlashPacketHandledResult)) + err = s.getFirstBundle().Path.EndpointA.AcknowledgePacket(packet2, expectedAck.Acknowledgement()) + s.Require().NoError(err) - // Slash record should have been deleted, head of pending packets should have been popped - // Since provider has handled the packet + // Consumer state is properly cleared again _, found = consumerKeeper.GetSlashRecord(s.consumerCtx()) s.Require().False(found) s.Require().Empty(consumerKeeper.GetPendingPackets(s.consumerCtx())) + s.Require().True(consumerKeeper.PacketSendingPermitted(s.consumerCtx())) } diff --git a/testutil/integration/debug_test.go b/testutil/integration/debug_test.go index 6b9415440e..ab1c78af7f 100644 --- a/testutil/integration/debug_test.go +++ b/testutil/integration/debug_test.go @@ -181,10 +181,6 @@ func TestDoubleSignDoesNotAffectThrottling(t *testing.T) { runCCVTestByName(t, "TestDoubleSignDoesNotAffectThrottling") } -func TestQueueOrdering(t *testing.T) { - runCCVTestByName(t, "TestQueueOrdering") -} - func TestSlashingSmallValidators(t *testing.T) { runCCVTestByName(t, "TestSlashingSmallValidators") } @@ -193,22 +189,10 @@ func TestSlashMeterAllowanceChanges(t *testing.T) { runCCVTestByName(t, "TestSlashMeterAllowanceChanges") } -func TestSlashSameValidator(t *testing.T) { - runCCVTestByName(t, "TestSlashSameValidator") -} - func TestSlashAllValidators(t *testing.T) { runCCVTestByName(t, "TestSlashAllValidators") } -func TestLeadingVSCMaturedAreDequeued(t *testing.T) { - runCCVTestByName(t, "TestLeadingVSCMaturedAreDequeued") -} - -func TestVscMaturedHandledPerBlockLimit(t *testing.T) { - runCCVTestByName(t, "TestVscMaturedHandledPerBlockLimit") -} - // // Unbonding tests // diff --git a/testutil/keeper/unit_test_helpers.go b/testutil/keeper/unit_test_helpers.go index b58d6d2471..77b4df9c10 100644 --- a/testutil/keeper/unit_test_helpers.go +++ b/testutil/keeper/unit_test_helpers.go @@ -254,15 +254,6 @@ func TestProviderStateIsCleanedAfterConsumerChainIsStopped(t *testing.T, ctx sdk require.Empty(t, providerKeeper.GetAllValidatorsByConsumerAddr(ctx, &expectedChainID)) require.Empty(t, providerKeeper.GetAllKeyAssignmentReplacements(ctx, expectedChainID)) require.Empty(t, providerKeeper.GetAllConsumerAddrsToPrune(ctx, expectedChainID)) - - allGlobalEntries := providerKeeper.GetAllGlobalSlashEntries(ctx) - for _, entry := range allGlobalEntries { - require.NotEqual(t, expectedChainID, entry.ConsumerChainID) - } - - slashPacketData, vscMaturedPacketData, _, _ := providerKeeper.GetAllThrottledPacketData(ctx, expectedChainID) - require.Empty(t, slashPacketData) - require.Empty(t, vscMaturedPacketData) } func GetTestConsumerAdditionProp() *providertypes.ConsumerAdditionProposal { diff --git a/x/ccv/consumer/client/cli/query.go b/x/ccv/consumer/client/cli/query.go index dc1ecfc2f4..f1a0c0f258 100644 --- a/x/ccv/consumer/client/cli/query.go +++ b/x/ccv/consumer/client/cli/query.go @@ -22,6 +22,7 @@ func NewQueryCmd() *cobra.Command { cmd.AddCommand( CmdNextFeeDistribution(), CmdProviderInfo(), + CmdThrottleState(), ) return cmd @@ -80,3 +81,30 @@ func CmdProviderInfo() *cobra.Command { return cmd } + +func CmdThrottleState() *cobra.Command { + cmd := &cobra.Command{ + Use: "throttle-state", + Short: "Query throttle state", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QueryThrottleStateRequest{} + res, err := queryClient.QueryThrottleState(cmd.Context(), req) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ccv/consumer/ibc_module.go b/x/ccv/consumer/ibc_module.go index 93b8096092..99f0141e64 100644 --- a/x/ccv/consumer/ibc_module.go +++ b/x/ccv/consumer/ibc_module.go @@ -176,7 +176,7 @@ func (am AppModule) OnChanOpenAck( ctx.EventManager().EmitEvent( sdk.NewEvent( - types.EventTypeFeeTransferChannelOpened, + consumertypes.EventTypeFeeTransferChannelOpened, sdk.NewAttribute(sdk.AttributeKeyModule, consumertypes.ModuleName), sdk.NewAttribute(channeltypes.AttributeKeyChannelID, channelID), sdk.NewAttribute(channeltypes.AttributeKeyPortID, transfertypes.PortID), diff --git a/x/ccv/consumer/keeper/distribution.go b/x/ccv/consumer/keeper/distribution.go index 9a4aa36d54..c0a98d0a21 100644 --- a/x/ccv/consumer/keeper/distribution.go +++ b/x/ccv/consumer/keeper/distribution.go @@ -161,13 +161,13 @@ func (k Keeper) SendRewardsToProvider(ctx sdk.Context) error { currentHeight := ctx.BlockHeight() ctx.EventManager().EmitEvent( sdk.NewEvent( - ccv.EventTypeFeeDistribution, + types.EventTypeFeeDistribution, sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), - sdk.NewAttribute(ccv.AttributeDistributionCurrentHeight, strconv.Itoa(int(currentHeight))), - sdk.NewAttribute(ccv.AttributeDistributionNextHeight, strconv.Itoa(int(currentHeight+k.GetBlocksPerDistributionTransmission(ctx)))), - sdk.NewAttribute(ccv.AttributeDistributionFraction, (k.GetConsumerRedistributionFrac(ctx))), - sdk.NewAttribute(ccv.AttributeDistributionTotal, allBalances.String()), - sdk.NewAttribute(ccv.AttributeDistributionToProvider, sentCoins.String()), + sdk.NewAttribute(types.AttributeDistributionCurrentHeight, strconv.Itoa(int(currentHeight))), + sdk.NewAttribute(types.AttributeDistributionNextHeight, strconv.Itoa(int(currentHeight+k.GetBlocksPerDistributionTransmission(ctx)))), + sdk.NewAttribute(types.AttributeDistributionFraction, (k.GetConsumerRedistributionFrac(ctx))), + sdk.NewAttribute(types.AttributeDistributionTotal, allBalances.String()), + sdk.NewAttribute(types.AttributeDistributionToProvider, sentCoins.String()), ), ) diff --git a/x/ccv/consumer/keeper/grpc_query.go b/x/ccv/consumer/keeper/grpc_query.go index 80e6b695a9..0d1bb78d16 100644 --- a/x/ccv/consumer/keeper/grpc_query.go +++ b/x/ccv/consumer/keeper/grpc_query.go @@ -9,6 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) var _ types.QueryServer = Keeper{} //nolint:golint @@ -51,3 +52,25 @@ func (k Keeper) QueryProviderInfo(c context.Context, //nolint:golint return k.GetProviderInfo(ctx) } + +func (k Keeper) QueryThrottleState(c context.Context, + req *types.QueryThrottleStateRequest, +) (*types.QueryThrottleStateResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + + resp := types.QueryThrottleStateResponse{} + + slashRecord, found := k.GetSlashRecord(ctx) + if found { + resp.SlashRecord = &slashRecord + } else { + resp.SlashRecord = nil + } + + resp.PacketDataQueue = make([]ccvtypes.ConsumerPacketData, 0) + pendingPackets := k.GetAllPendingPacketsWithIdx(ctx) + for _, packet := range pendingPackets { + resp.PacketDataQueue = append(resp.PacketDataQueue, packet.ConsumerPacketData) + } + return &resp, nil +} diff --git a/x/ccv/consumer/keeper/params.go b/x/ccv/consumer/keeper/params.go index 12524fe3d2..3c0e01f1c3 100644 --- a/x/ccv/consumer/keeper/params.go +++ b/x/ccv/consumer/keeper/params.go @@ -25,6 +25,7 @@ func (k Keeper) GetConsumerParams(ctx sdk.Context) ccvtypes.ConsumerParams { k.GetSoftOptOutThreshold(ctx), k.GetRewardDenoms(ctx), k.GetProviderRewardDenoms(ctx), + k.GetRetryDelayPeriod(ctx), ) } @@ -138,3 +139,9 @@ func (k Keeper) GetProviderRewardDenoms(ctx sdk.Context) []string { k.paramStore.Get(ctx, ccvtypes.KeyProviderRewardDenoms, &denoms) return denoms } + +func (k Keeper) GetRetryDelayPeriod(ctx sdk.Context) time.Duration { + var period time.Duration + k.paramStore.Get(ctx, ccvtypes.KeyRetryDelayPeriod, &period) + return period +} diff --git a/x/ccv/consumer/keeper/params_test.go b/x/ccv/consumer/keeper/params_test.go index 49b1816520..e575e26185 100644 --- a/x/ccv/consumer/keeper/params_test.go +++ b/x/ccv/consumer/keeper/params_test.go @@ -31,6 +31,7 @@ func TestParams(t *testing.T) { ccv.DefaultSoftOptOutThreshold, rewardDenoms, provideRewardDenoms, + ccv.DefaultRetryDelayPeriod, ) // these are the default params, IBC suite independently sets enabled=true params := consumerKeeper.GetConsumerParams(ctx) @@ -38,7 +39,7 @@ func TestParams(t *testing.T) { newParams := ccv.NewParams(false, 1000, "channel-2", "cosmos19pe9pg5dv9k5fzgzmsrgnw9rl9asf7ddwhu7lm", - 7*24*time.Hour, 25*time.Hour, "0.5", 500, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}) + 7*24*time.Hour, 25*time.Hour, "0.5", 500, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour) consumerKeeper.SetParams(ctx, newParams) params = consumerKeeper.GetConsumerParams(ctx) require.Equal(t, newParams, params) diff --git a/x/ccv/consumer/keeper/relay.go b/x/ccv/consumer/keeper/relay.go index 060aadff20..3afeb33188 100644 --- a/x/ccv/consumer/keeper/relay.go +++ b/x/ccv/consumer/keeper/relay.go @@ -115,12 +115,12 @@ func (k Keeper) QueueVSCMaturedPackets(ctx sdk.Context) { ctx.EventManager().EmitEvent( sdk.NewEvent( - ccv.EventTypeVSCMatured, + types.EventTypeVSCMatured, sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), sdk.NewAttribute(ccv.AttributeChainID, ctx.ChainID()), - sdk.NewAttribute(ccv.AttributeConsumerHeight, strconv.Itoa(int(ctx.BlockHeight()))), + sdk.NewAttribute(types.AttributeConsumerHeight, strconv.Itoa(int(ctx.BlockHeight()))), sdk.NewAttribute(ccv.AttributeValSetUpdateID, strconv.Itoa(int(maturityTime.VscId))), - sdk.NewAttribute(ccv.AttributeTimestamp, ctx.BlockTime().String()), + sdk.NewAttribute(types.AttributeTimestamp, ctx.BlockTime().String()), ), ) } @@ -162,7 +162,7 @@ func (k Keeper) QueueSlashPacket(ctx sdk.Context, validator abci.Validator, vals ctx.EventManager().EmitEvent( sdk.NewEvent( - ccv.EventTypeConsumerSlashRequest, + types.EventTypeConsumerSlashRequest, sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), sdk.NewAttribute(ccv.AttributeValidatorAddress, sdk.ConsAddress(validator.Address).String()), sdk.NewAttribute(ccv.AttributeValSetUpdateID, strconv.Itoa(int(valsetUpdateID))), diff --git a/x/ccv/consumer/keeper/throttle_retry.go b/x/ccv/consumer/keeper/throttle_retry.go index 4c4585cb1d..7f8d85191d 100644 --- a/x/ccv/consumer/keeper/throttle_retry.go +++ b/x/ccv/consumer/keeper/throttle_retry.go @@ -2,7 +2,6 @@ package keeper import ( "fmt" - "time" sdktypes "github.com/cosmos/cosmos-sdk/types" @@ -44,9 +43,6 @@ import ( // This design is implemented below, and in relay.go under SendPackets() and OnAcknowledgementPacket(). // -// Retry delay period could be implemented as a param, but 1 hour is reasonable -const RetryDelayPeriod = time.Hour - // PacketSendingPermitted returns whether the consumer is allowed to send packets // from the pending packets queue. func (k Keeper) PacketSendingPermitted(ctx sdktypes.Context) bool { @@ -60,7 +56,7 @@ func (k Keeper) PacketSendingPermitted(ctx sdktypes.Context) bool { return false } // If retry delay period has elapsed, we can send again - return ctx.BlockTime().After(record.SendTime.Add(RetryDelayPeriod)) + return ctx.BlockTime().After(record.SendTime.Add(k.GetRetryDelayPeriod(ctx))) } func (k Keeper) UpdateSlashRecordOnSend(ctx sdktypes.Context) { diff --git a/x/ccv/consumer/keeper/throttle_retry_test.go b/x/ccv/consumer/keeper/throttle_retry_test.go index cc14ce3cdd..50157df843 100644 --- a/x/ccv/consumer/keeper/throttle_retry_test.go +++ b/x/ccv/consumer/keeper/throttle_retry_test.go @@ -7,14 +7,16 @@ import ( "github.com/stretchr/testify/require" testutil "github.com/cosmos/interchain-security/v3/testutil/keeper" - consumerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/consumer/keeper" consumertypes "github.com/cosmos/interchain-security/v3/x/ccv/consumer/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) func TestPacketSendingPermitted(t *testing.T) { consumerKeeper, ctx, ctrl, _ := testutil.GetConsumerKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) defer ctrl.Finish() + consumerKeeper.SetParams(ctx, ccvtypes.DefaultParams()) + ctx = ctx.WithBlockTime(time.Now()) // No slash record exists, send is permitted @@ -42,7 +44,8 @@ func TestPacketSendingPermitted(t *testing.T) { require.False(t, consumerKeeper.PacketSendingPermitted(ctx)) // Elapse retry delay period - ctx = ctx.WithBlockTime(ctx.BlockTime().Add(2 * consumerkeeper.RetryDelayPeriod)) + period := consumerKeeper.GetRetryDelayPeriod(ctx) + ctx = ctx.WithBlockTime(ctx.BlockTime().Add(2 * period)) // Now packet sending is permitted again require.True(t, consumerKeeper.PacketSendingPermitted(ctx)) diff --git a/x/ccv/consumer/types/events.go b/x/ccv/consumer/types/events.go new file mode 100644 index 0000000000..ccc2616416 --- /dev/null +++ b/x/ccv/consumer/types/events.go @@ -0,0 +1,18 @@ +package types + +const ( + AttributeConsumerHeight = "consumer_height" + AttributeTimestamp = "timestamp" + + EventTypeFeeDistribution = "fee_distribution" + EventTypeVSCMatured = "vsc_matured" + EventTypeConsumerSlashRequest = "consumer_slash_request" + EventTypeFeeTransferChannelOpened = "fee_transfer_channel_opened" + + AttributeDistributionCurrentHeight = "current_distribution_height" + //#nosec G101 -- (false positive) this is not a hardcoded credential + AttributeDistributionNextHeight = "next_distribution_height" + AttributeDistributionFraction = "distribution_fraction" + AttributeDistributionTotal = "total" + AttributeDistributionToProvider = "provider_amount" +) diff --git a/x/ccv/consumer/types/genesis_test.go b/x/ccv/consumer/types/genesis_test.go index 4fd0ae7c02..d8a8296762 100644 --- a/x/ccv/consumer/types/genesis_test.go +++ b/x/ccv/consumer/types/genesis_test.go @@ -233,6 +233,7 @@ func TestValidateInitialGenesisState(t *testing.T) { ccv.DefaultSoftOptOutThreshold, []string{}, []string{}, + ccv.DefaultRetryDelayPeriod, )), true, }, @@ -252,6 +253,7 @@ func TestValidateInitialGenesisState(t *testing.T) { ccv.DefaultSoftOptOutThreshold, []string{}, []string{}, + ccv.DefaultRetryDelayPeriod, )), true, }, @@ -457,6 +459,7 @@ func TestValidateRestartConsumerGenesisState(t *testing.T) { ccv.DefaultSoftOptOutThreshold, []string{}, []string{}, + ccv.DefaultRetryDelayPeriod, )), true, }, diff --git a/x/ccv/consumer/types/params_test.go b/x/ccv/consumer/types/params_test.go index e401ba3e47..d0a6b49c25 100644 --- a/x/ccv/consumer/types/params_test.go +++ b/x/ccv/consumer/types/params_test.go @@ -19,59 +19,67 @@ func TestValidateParams(t *testing.T) { {"default params", ccvtypes.DefaultParams(), true}, { "custom valid params", - ccvtypes.NewParams(true, 5, "", "", 1004, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), true, + ccvtypes.NewParams(true, 5, "", "", 1004, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), true, }, { "custom invalid params, block per dist transmission", - ccvtypes.NewParams(true, -5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, -5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, dist transmission channel", - ccvtypes.NewParams(true, 5, "badchannel/", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "badchannel/", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, ccv timeout", - ccvtypes.NewParams(true, 5, "", "", -5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", -5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, transfer timeout", - ccvtypes.NewParams(true, 5, "", "", 1004, -7, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 1004, -7, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, consumer redist fraction is negative", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "-0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "-0.5", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, consumer redist fraction is over 1", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "1.2", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "1.2", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, bad consumer redist fraction ", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "notFrac", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "notFrac", 1000, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, negative num historical entries", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", -100, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", -100, 24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, negative unbonding period", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, -24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, -24*21*time.Hour, "0.05", []string{"untrn"}, []string{"uatom"}, 2*time.Hour), false, }, { "custom invalid params, invalid soft opt out threshold", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "-0.05", []string{"u"}, []string{}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "-0.05", []string{"u"}, []string{}, 2*time.Hour), false, }, { "custom invalid params, invalid soft opt out threshold", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.5", []string{"u"}, []string{}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.5", []string{"u"}, []string{}, 2*time.Hour), false, }, { "custom invalid params, invalid reward denom", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"u"}, []string{}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{"u"}, []string{}, 2*time.Hour), false, }, { "custom invalid params, invalid provider reward denom", - ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{}, []string{"a"}), false, + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{}, []string{"a"}, 2*time.Hour), false, + }, + { + "custom invalid params, retry delay period is negative", + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{}, []string{}, -2*time.Hour), false, + }, + { + "custom invalid params, retry delay period is zero", + ccvtypes.NewParams(true, 5, "", "", 5, 1005, "0.5", 1000, 24*21*time.Hour, "0.05", []string{}, []string{}, 0), false, }, } diff --git a/x/ccv/consumer/types/query.pb.go b/x/ccv/consumer/types/query.pb.go index dbbb8d347a..e1dd01af4b 100644 --- a/x/ccv/consumer/types/query.pb.go +++ b/x/ccv/consumer/types/query.pb.go @@ -384,6 +384,94 @@ func (m *QueryProviderInfoResponse) GetProvider() ChainInfo { return ChainInfo{} } +type QueryThrottleStateRequest struct { +} + +func (m *QueryThrottleStateRequest) Reset() { *m = QueryThrottleStateRequest{} } +func (m *QueryThrottleStateRequest) String() string { return proto.CompactTextString(m) } +func (*QueryThrottleStateRequest) ProtoMessage() {} +func (*QueryThrottleStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f627751d3cc10225, []int{7} +} +func (m *QueryThrottleStateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryThrottleStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryThrottleStateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryThrottleStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryThrottleStateRequest.Merge(m, src) +} +func (m *QueryThrottleStateRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryThrottleStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryThrottleStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryThrottleStateRequest proto.InternalMessageInfo + +type QueryThrottleStateResponse struct { + SlashRecord *SlashRecord `protobuf:"bytes,1,opt,name=slash_record,json=slashRecord,proto3" json:"slash_record,omitempty"` + PacketDataQueue []types.ConsumerPacketData `protobuf:"bytes,2,rep,name=packet_data_queue,json=packetDataQueue,proto3" json:"packet_data_queue"` +} + +func (m *QueryThrottleStateResponse) Reset() { *m = QueryThrottleStateResponse{} } +func (m *QueryThrottleStateResponse) String() string { return proto.CompactTextString(m) } +func (*QueryThrottleStateResponse) ProtoMessage() {} +func (*QueryThrottleStateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f627751d3cc10225, []int{8} +} +func (m *QueryThrottleStateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryThrottleStateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryThrottleStateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryThrottleStateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryThrottleStateResponse.Merge(m, src) +} +func (m *QueryThrottleStateResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryThrottleStateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryThrottleStateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryThrottleStateResponse proto.InternalMessageInfo + +func (m *QueryThrottleStateResponse) GetSlashRecord() *SlashRecord { + if m != nil { + return m.SlashRecord + } + return nil +} + +func (m *QueryThrottleStateResponse) GetPacketDataQueue() []types.ConsumerPacketData { + if m != nil { + return m.PacketDataQueue + } + return nil +} + type ChainInfo struct { ChainID string `protobuf:"bytes,1,opt,name=chainID,proto3" json:"chainID,omitempty"` ClientID string `protobuf:"bytes,2,opt,name=clientID,proto3" json:"clientID,omitempty"` @@ -395,7 +483,7 @@ func (m *ChainInfo) Reset() { *m = ChainInfo{} } func (m *ChainInfo) String() string { return proto.CompactTextString(m) } func (*ChainInfo) ProtoMessage() {} func (*ChainInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_f627751d3cc10225, []int{7} + return fileDescriptor_f627751d3cc10225, []int{9} } func (m *ChainInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -460,6 +548,8 @@ func init() { proto.RegisterType((*QueryParamsResponse)(nil), "interchain_security.ccv.consumer.v1.QueryParamsResponse") proto.RegisterType((*QueryProviderInfoRequest)(nil), "interchain_security.ccv.consumer.v1.QueryProviderInfoRequest") proto.RegisterType((*QueryProviderInfoResponse)(nil), "interchain_security.ccv.consumer.v1.QueryProviderInfoResponse") + proto.RegisterType((*QueryThrottleStateRequest)(nil), "interchain_security.ccv.consumer.v1.QueryThrottleStateRequest") + proto.RegisterType((*QueryThrottleStateResponse)(nil), "interchain_security.ccv.consumer.v1.QueryThrottleStateResponse") proto.RegisterType((*ChainInfo)(nil), "interchain_security.ccv.consumer.v1.ChainInfo") } @@ -468,50 +558,59 @@ func init() { } var fileDescriptor_f627751d3cc10225 = []byte{ - // 685 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcf, 0x6b, 0x13, 0x4f, - 0x14, 0xcf, 0xa6, 0x4d, 0xdb, 0x4c, 0xbf, 0xdf, 0xc3, 0x77, 0xbe, 0x11, 0xd6, 0xb5, 0xac, 0x65, - 0x15, 0x8c, 0x85, 0xec, 0x36, 0xed, 0xa1, 0x7a, 0xa8, 0x8a, 0x8d, 0xa5, 0x01, 0x95, 0xba, 0x08, - 0x82, 0x97, 0x30, 0x9d, 0x4c, 0x93, 0x81, 0x64, 0x26, 0x9d, 0x99, 0x5d, 0xda, 0x9b, 0x28, 0x5e, - 0x45, 0xf0, 0x3f, 0xf1, 0x1f, 0xf0, 0x5a, 0xf0, 0x52, 0xf0, 0xe2, 0x49, 0xa4, 0xf5, 0x8f, 0xf0, - 0x28, 0x3b, 0x3b, 0x9b, 0x6e, 0xe8, 0xaf, 0x54, 0xbd, 0xcd, 0xbc, 0xcf, 0x7b, 0x9f, 0xf7, 0x79, - 0x6f, 0xde, 0xdb, 0x05, 0x01, 0x65, 0x8a, 0x08, 0xdc, 0x45, 0x94, 0xb5, 0x24, 0xc1, 0x91, 0xa0, - 0x6a, 0x2f, 0xc0, 0x38, 0x0e, 0x30, 0x67, 0x32, 0xea, 0x13, 0x11, 0xc4, 0xf5, 0x60, 0x27, 0x22, - 0x62, 0xcf, 0x1f, 0x08, 0xae, 0x38, 0xbc, 0x71, 0x4a, 0x80, 0x8f, 0x71, 0xec, 0x67, 0x01, 0x7e, - 0x5c, 0x77, 0x16, 0xcf, 0x62, 0x8d, 0xeb, 0x81, 0xec, 0x22, 0x41, 0xda, 0xad, 0xa1, 0xbb, 0xa6, - 0x75, 0x2a, 0x1d, 0xde, 0xe1, 0xfa, 0x18, 0x24, 0x27, 0x63, 0x9d, 0xeb, 0x70, 0xde, 0xe9, 0x91, - 0x00, 0x0d, 0x68, 0x80, 0x18, 0xe3, 0x0a, 0x29, 0xca, 0x99, 0x4c, 0x51, 0xef, 0x5d, 0x11, 0x5c, - 0x7b, 0x4a, 0x76, 0xd5, 0x3a, 0x21, 0x0d, 0x2a, 0x95, 0xa0, 0x5b, 0x51, 0x02, 0x3f, 0x92, 0x8a, - 0xf6, 0x91, 0x22, 0xf0, 0x26, 0xf8, 0x17, 0x47, 0x42, 0x10, 0xa6, 0x36, 0x08, 0xed, 0x74, 0x95, - 0x6d, 0xcd, 0x5b, 0xd5, 0x89, 0x70, 0xd4, 0x08, 0x5d, 0x00, 0x7a, 0x48, 0x66, 0x2e, 0x45, 0xed, - 0x92, 0xb3, 0x24, 0x38, 0x23, 0xbb, 0x19, 0x3e, 0x91, 0xe2, 0xc7, 0x16, 0xb8, 0x0c, 0xae, 0xb4, - 0x73, 0xd9, 0x5b, 0xdb, 0x02, 0xe1, 0xe4, 0x60, 0x4f, 0xce, 0x5b, 0xd5, 0x72, 0x58, 0xc9, 0x83, - 0xeb, 0x06, 0x83, 0x15, 0x50, 0x52, 0x5c, 0xa1, 0x9e, 0x5d, 0xd2, 0x4e, 0xe9, 0x25, 0x49, 0xa5, - 0xf8, 0xa6, 0xe0, 0x31, 0x6d, 0x13, 0x61, 0x4f, 0x69, 0x28, 0x67, 0x49, 0xf1, 0x35, 0xd3, 0x38, - 0x7b, 0x3a, 0xc3, 0x33, 0x8b, 0x77, 0x1b, 0xdc, 0x7a, 0x96, 0x3c, 0xd5, 0x39, 0x4d, 0x09, 0xc9, - 0x4e, 0x44, 0xa4, 0xf2, 0x5e, 0x59, 0xa0, 0x7a, 0xb1, 0xaf, 0x1c, 0x70, 0x26, 0x09, 0x7c, 0x0e, - 0x26, 0xdb, 0x48, 0x21, 0xdd, 0xbf, 0xd9, 0xa5, 0x07, 0xfe, 0x18, 0x23, 0xe0, 0x9f, 0xc7, 0xab, - 0xd9, 0xbc, 0x0a, 0x80, 0x5a, 0xc1, 0x26, 0x12, 0xa8, 0x2f, 0x33, 0x61, 0x2d, 0xf0, 0xff, 0x88, - 0xd5, 0x48, 0xd8, 0x00, 0x53, 0x03, 0x6d, 0x31, 0x22, 0x16, 0xce, 0x14, 0x11, 0xd7, 0xfd, 0xac, - 0x21, 0x29, 0xc7, 0xc3, 0xc9, 0xfd, 0x6f, 0xd7, 0x0b, 0xa1, 0x89, 0xf7, 0x1c, 0x60, 0xa7, 0x09, - 0x4c, 0x57, 0x9b, 0x6c, 0x9b, 0x67, 0xc9, 0x3f, 0x59, 0xe0, 0xea, 0x29, 0xa0, 0xd1, 0xb0, 0x09, - 0x66, 0xb2, 0x0a, 0x8d, 0x0a, 0x7f, 0xac, 0x56, 0xac, 0x25, 0x70, 0xc2, 0x64, 0x94, 0x0c, 0x59, - 0x12, 0xc6, 0x41, 0xf6, 0xdc, 0xc5, 0x3f, 0x61, 0xcc, 0x58, 0xbc, 0x37, 0x16, 0x28, 0x0f, 0x51, - 0x68, 0x83, 0x69, 0xcd, 0xd4, 0x6c, 0x68, 0xc1, 0xe5, 0x30, 0xbb, 0x42, 0x07, 0xcc, 0xe0, 0x1e, - 0x25, 0x4c, 0x35, 0x1b, 0x3a, 0x73, 0x39, 0x1c, 0xde, 0xa1, 0x07, 0xfe, 0xc1, 0x9c, 0x31, 0xa2, - 0x47, 0xb5, 0xd9, 0xd0, 0x33, 0x5f, 0x0e, 0x47, 0x6c, 0x70, 0x0e, 0x94, 0x71, 0x17, 0x31, 0x46, - 0x7a, 0xcd, 0x86, 0x99, 0xf4, 0x63, 0xc3, 0xd2, 0xdb, 0x12, 0x28, 0xe9, 0x3e, 0xc2, 0x9f, 0x96, - 0x69, 0xf7, 0x29, 0xf3, 0x00, 0x1f, 0x8f, 0x55, 0xec, 0x98, 0x23, 0xed, 0x3c, 0xf9, 0x4b, 0x6c, - 0xe9, 0x6b, 0x7b, 0xf7, 0x5f, 0x7f, 0xf9, 0xf1, 0xa1, 0x78, 0x17, 0xae, 0x5c, 0xfc, 0x89, 0x4c, - 0xbe, 0x06, 0xb5, 0x6d, 0x42, 0x6a, 0xf9, 0x5d, 0x87, 0x1f, 0x2d, 0x30, 0x9b, 0x1b, 0x65, 0xb8, - 0x32, 0xbe, 0xbe, 0x91, 0x95, 0x70, 0xee, 0x5c, 0x3e, 0xd0, 0xd4, 0xb0, 0xa8, 0x6b, 0x58, 0x80, - 0xd5, 0x8b, 0x6b, 0x48, 0xb7, 0x03, 0x7e, 0xb6, 0xc0, 0x7f, 0x27, 0x36, 0x00, 0xae, 0x5e, 0x42, - 0xc1, 0xc9, 0xb5, 0x72, 0xee, 0xfd, 0x6e, 0xb8, 0x29, 0x63, 0x45, 0x97, 0x51, 0x87, 0xc1, 0x18, - 0x65, 0x98, 0xf8, 0x1a, 0x4d, 0xb6, 0xe3, 0xc5, 0xfe, 0xa1, 0x6b, 0x1d, 0x1c, 0xba, 0xd6, 0xf7, - 0x43, 0xd7, 0x7a, 0x7f, 0xe4, 0x16, 0x0e, 0x8e, 0xdc, 0xc2, 0xd7, 0x23, 0xb7, 0xf0, 0x72, 0xb5, - 0x43, 0x55, 0x37, 0xda, 0xf2, 0x31, 0xef, 0x07, 0x98, 0xcb, 0x3e, 0x97, 0x39, 0xee, 0xda, 0x90, - 0x3b, 0x5e, 0x0e, 0x76, 0x47, 0x13, 0xa8, 0xbd, 0x01, 0x91, 0x5b, 0x53, 0xfa, 0x0f, 0xb4, 0xfc, - 0x2b, 0x00, 0x00, 0xff, 0xff, 0x37, 0xa4, 0xf9, 0xba, 0x3f, 0x07, 0x00, 0x00, + // 825 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0xd3, 0x36, 0xbb, 0x99, 0x2e, 0x42, 0x3b, 0x04, 0xc9, 0x78, 0x57, 0xa1, 0x32, 0x20, + 0xc2, 0x4a, 0xb1, 0x93, 0xf4, 0xd0, 0xe5, 0xb0, 0x2c, 0xda, 0x86, 0xaa, 0x91, 0x00, 0xb5, 0x6e, + 0x25, 0x04, 0x17, 0x33, 0x9d, 0x4c, 0x13, 0x8b, 0xc4, 0xe3, 0xce, 0x8c, 0x4d, 0x7b, 0x43, 0x70, + 0x47, 0x48, 0x7c, 0x13, 0xbe, 0x00, 0xd7, 0x4a, 0x1c, 0xa8, 0xc4, 0x01, 0xb8, 0x20, 0xd4, 0xf2, + 0x21, 0x38, 0xa2, 0x19, 0x8f, 0x53, 0xa7, 0x4d, 0x13, 0xb7, 0xec, 0xcd, 0xf3, 0xfe, 0xfc, 0xde, + 0xef, 0xf7, 0x66, 0xde, 0x4b, 0x80, 0x1b, 0x84, 0x82, 0x30, 0x3c, 0x44, 0x41, 0xe8, 0x73, 0x82, + 0x63, 0x16, 0x88, 0x13, 0x17, 0xe3, 0xc4, 0xc5, 0x34, 0xe4, 0xf1, 0x98, 0x30, 0x37, 0x69, 0xbb, + 0x47, 0x31, 0x61, 0x27, 0x4e, 0xc4, 0xa8, 0xa0, 0xf0, 0xad, 0x19, 0x09, 0x0e, 0xc6, 0x89, 0x93, + 0x25, 0x38, 0x49, 0xdb, 0x6a, 0xdd, 0x84, 0x9a, 0xb4, 0x5d, 0x3e, 0x44, 0x8c, 0xf4, 0xfd, 0x49, + 0xb8, 0x82, 0xb5, 0x6a, 0x03, 0x3a, 0xa0, 0xea, 0xd3, 0x95, 0x5f, 0xda, 0xfa, 0x78, 0x40, 0xe9, + 0x60, 0x44, 0x5c, 0x14, 0x05, 0x2e, 0x0a, 0x43, 0x2a, 0x90, 0x08, 0x68, 0xc8, 0xb5, 0xb7, 0x53, + 0x84, 0xfb, 0x95, 0x3a, 0xef, 0xcc, 0x61, 0xf6, 0x75, 0xc0, 0x48, 0x1a, 0x66, 0x7f, 0x5f, 0x06, + 0x8f, 0x3e, 0x25, 0xc7, 0x62, 0x8b, 0x90, 0x6e, 0xc0, 0x05, 0x0b, 0x0e, 0x62, 0x59, 0xf9, 0x23, + 0x2e, 0x82, 0x31, 0x12, 0x04, 0xbe, 0x0d, 0x5e, 0xc1, 0x31, 0x63, 0x24, 0x14, 0xdb, 0x24, 0x18, + 0x0c, 0x85, 0x69, 0xac, 0x19, 0x8d, 0x25, 0x6f, 0xda, 0x08, 0xeb, 0x00, 0x8c, 0x10, 0xcf, 0x42, + 0xca, 0x2a, 0x24, 0x67, 0x91, 0xfe, 0x90, 0x1c, 0x67, 0xfe, 0xa5, 0xd4, 0x7f, 0x69, 0x81, 0xeb, + 0xe0, 0xf5, 0x7e, 0xae, 0xba, 0x7f, 0xc8, 0x10, 0x96, 0x1f, 0xe6, 0xf2, 0x9a, 0xd1, 0xa8, 0x7a, + 0xb5, 0xbc, 0x73, 0x4b, 0xfb, 0x60, 0x0d, 0xac, 0x08, 0x2a, 0xd0, 0xc8, 0x5c, 0x51, 0x41, 0xe9, + 0x41, 0x96, 0x12, 0x74, 0x87, 0xd1, 0x24, 0xe8, 0x13, 0x66, 0x56, 0x94, 0x2b, 0x67, 0x49, 0xfd, + 0x9b, 0xba, 0x57, 0xe6, 0xbd, 0xcc, 0x9f, 0x59, 0xec, 0xf7, 0xc0, 0xbb, 0xbb, 0xf2, 0x15, 0xcc, + 0x69, 0x8a, 0x47, 0x8e, 0x62, 0xc2, 0x85, 0xfd, 0x8d, 0x01, 0x1a, 0x8b, 0x63, 0x79, 0x44, 0x43, + 0x4e, 0xe0, 0x3e, 0x58, 0xee, 0x23, 0x81, 0x54, 0xff, 0x56, 0x3b, 0x1f, 0x3a, 0x05, 0x5e, 0x97, + 0x33, 0x0f, 0x57, 0xa1, 0xd9, 0x35, 0x00, 0x15, 0x83, 0x1d, 0xc4, 0xd0, 0x98, 0x67, 0xc4, 0x7c, + 0xf0, 0xda, 0x94, 0x55, 0x53, 0xd8, 0x06, 0x95, 0x48, 0x59, 0x34, 0x89, 0x27, 0x37, 0x92, 0x48, + 0xda, 0x4e, 0xd6, 0x90, 0x14, 0xe3, 0xc5, 0xf2, 0xe9, 0x5f, 0x6f, 0x96, 0x3c, 0x9d, 0x6f, 0x5b, + 0xc0, 0x4c, 0x0b, 0xe8, 0xae, 0xf6, 0xc2, 0x43, 0x9a, 0x15, 0xff, 0xd9, 0x00, 0x6f, 0xcc, 0x70, + 0x6a, 0x0e, 0x3b, 0xe0, 0x7e, 0xa6, 0x50, 0xb3, 0x70, 0x0a, 0xb5, 0x62, 0x53, 0xba, 0x25, 0x92, + 0x66, 0x32, 0x41, 0x91, 0x88, 0x51, 0x76, 0xdd, 0xe5, 0xff, 0x83, 0x98, 0xa1, 0xd8, 0x8f, 0xb4, + 0x80, 0xfd, 0x21, 0xa3, 0x42, 0x8c, 0xc8, 0x9e, 0xc8, 0x5d, 0xfa, 0x9f, 0x06, 0xb0, 0x66, 0x79, + 0xb5, 0xbe, 0xcf, 0xc1, 0x03, 0x3e, 0x42, 0x7c, 0xe8, 0x33, 0x82, 0x29, 0xeb, 0x6b, 0x8d, 0xad, + 0x42, 0x8c, 0xf6, 0x64, 0xa2, 0xa7, 0xf2, 0x14, 0x27, 0xc3, 0x5b, 0xe5, 0x97, 0x26, 0xf8, 0x25, + 0x78, 0x18, 0x21, 0xfc, 0x15, 0x11, 0xbe, 0xbc, 0x7a, 0xff, 0x28, 0x26, 0x31, 0x31, 0xcb, 0x6b, + 0x4b, 0x73, 0x15, 0x4f, 0xdd, 0xa4, 0x4c, 0xee, 0x22, 0x81, 0xb4, 0xe2, 0x57, 0xa3, 0x89, 0x65, + 0x57, 0x82, 0xd9, 0xdf, 0x19, 0xa0, 0x3a, 0x69, 0x0b, 0x34, 0xc1, 0x3d, 0x05, 0xd8, 0xeb, 0x2a, + 0x15, 0x55, 0x2f, 0x3b, 0x42, 0x0b, 0xdc, 0xc7, 0xa3, 0x80, 0x84, 0xa2, 0xd7, 0x55, 0x2d, 0xaf, + 0x7a, 0x93, 0x33, 0xb4, 0xc1, 0x03, 0x4c, 0xc3, 0x90, 0xa8, 0x19, 0xed, 0x75, 0xd5, 0xb0, 0x57, + 0xbd, 0x29, 0x1b, 0x7c, 0x0c, 0xaa, 0x78, 0x88, 0xc2, 0x90, 0x8c, 0x7a, 0x5d, 0x3d, 0xe2, 0x97, + 0x86, 0xce, 0xef, 0x15, 0xb0, 0xa2, 0x3a, 0x0c, 0xff, 0x35, 0xf4, 0x3b, 0x9b, 0x31, 0x08, 0xf0, + 0xe3, 0x42, 0x3d, 0x2d, 0x38, 0xcb, 0xd6, 0x27, 0x2f, 0x09, 0x2d, 0x7d, 0x06, 0xf6, 0xf3, 0x6f, + 0x7f, 0xfb, 0xe7, 0xc7, 0xf2, 0xfb, 0x70, 0x63, 0xf1, 0xcf, 0x8e, 0x5c, 0x83, 0xcd, 0x43, 0x42, + 0x9a, 0xf9, 0x25, 0x07, 0x7f, 0x32, 0xc0, 0x6a, 0x6e, 0x86, 0xe1, 0x46, 0x71, 0x7e, 0x53, 0xbb, + 0xc0, 0x7a, 0x7a, 0xfb, 0x44, 0xad, 0xa1, 0xa5, 0x34, 0x3c, 0x81, 0x8d, 0xc5, 0x1a, 0xd2, 0xb5, + 0x00, 0x7f, 0x31, 0xc0, 0xc3, 0x6b, 0xa3, 0x0f, 0x9f, 0xdd, 0x82, 0xc1, 0xf5, 0x7d, 0x62, 0x7d, + 0x70, 0xd7, 0x74, 0x2d, 0x63, 0x43, 0xc9, 0x68, 0x43, 0xb7, 0x80, 0x0c, 0x9d, 0xdf, 0x0c, 0x24, + 0xef, 0x5f, 0x0d, 0xbd, 0x5c, 0xa7, 0x26, 0x1d, 0xde, 0x82, 0xcf, 0xac, 0x05, 0x62, 0x3d, 0xbf, + 0x73, 0xbe, 0x16, 0xf4, 0x54, 0x09, 0xea, 0xc0, 0xd6, 0x62, 0x41, 0x42, 0x03, 0xf8, 0x5c, 0x22, + 0xbc, 0xf8, 0xec, 0xf4, 0xbc, 0x6e, 0x9c, 0x9d, 0xd7, 0x8d, 0xbf, 0xcf, 0xeb, 0xc6, 0x0f, 0x17, + 0xf5, 0xd2, 0xd9, 0x45, 0xbd, 0xf4, 0xc7, 0x45, 0xbd, 0xf4, 0xc5, 0xb3, 0x41, 0x20, 0x86, 0xf1, + 0x81, 0x83, 0xe9, 0xd8, 0xc5, 0x94, 0x8f, 0x29, 0xcf, 0x81, 0x37, 0x27, 0xe0, 0xc9, 0xba, 0x7b, + 0x7c, 0xa5, 0xc2, 0x49, 0x44, 0xf8, 0x41, 0x45, 0xfd, 0x99, 0x58, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0xff, 0x0e, 0x14, 0x5a, 0xa9, 0x65, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -532,6 +631,8 @@ type QueryClient interface { // QueryParams queries the ccv/consumer module parameters. QueryParams(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) QueryProviderInfo(ctx context.Context, in *QueryProviderInfoRequest, opts ...grpc.CallOption) (*QueryProviderInfoResponse, error) + // QueryThrottleState returns on-chain state relevant to throttled consumer packets + QueryThrottleState(ctx context.Context, in *QueryThrottleStateRequest, opts ...grpc.CallOption) (*QueryThrottleStateResponse, error) } type queryClient struct { @@ -569,6 +670,15 @@ func (c *queryClient) QueryProviderInfo(ctx context.Context, in *QueryProviderIn return out, nil } +func (c *queryClient) QueryThrottleState(ctx context.Context, in *QueryThrottleStateRequest, opts ...grpc.CallOption) (*QueryThrottleStateResponse, error) { + out := new(QueryThrottleStateResponse) + err := c.cc.Invoke(ctx, "/interchain_security.ccv.consumer.v1.Query/QueryThrottleState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // ConsumerGenesis queries the genesis state needed to start a consumer chain @@ -577,6 +687,8 @@ type QueryServer interface { // QueryParams queries the ccv/consumer module parameters. QueryParams(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) QueryProviderInfo(context.Context, *QueryProviderInfoRequest) (*QueryProviderInfoResponse, error) + // QueryThrottleState returns on-chain state relevant to throttled consumer packets + QueryThrottleState(context.Context, *QueryThrottleStateRequest) (*QueryThrottleStateResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -592,6 +704,9 @@ func (*UnimplementedQueryServer) QueryParams(ctx context.Context, req *QueryPara func (*UnimplementedQueryServer) QueryProviderInfo(ctx context.Context, req *QueryProviderInfoRequest) (*QueryProviderInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryProviderInfo not implemented") } +func (*UnimplementedQueryServer) QueryThrottleState(ctx context.Context, req *QueryThrottleStateRequest) (*QueryThrottleStateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryThrottleState not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -651,6 +766,24 @@ func _Query_QueryProviderInfo_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Query_QueryThrottleState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryThrottleStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).QueryThrottleState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/interchain_security.ccv.consumer.v1.Query/QueryThrottleState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).QueryThrottleState(ctx, req.(*QueryThrottleStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "interchain_security.ccv.consumer.v1.Query", HandlerType: (*QueryServer)(nil), @@ -667,6 +800,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "QueryProviderInfo", Handler: _Query_QueryProviderInfo_Handler, }, + { + MethodName: "QueryThrottleState", + Handler: _Query_QueryThrottleState_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "interchain_security/ccv/consumer/v1/query.proto", @@ -918,6 +1055,78 @@ func (m *QueryProviderInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *QueryThrottleStateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryThrottleStateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryThrottleStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryThrottleStateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryThrottleStateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryThrottleStateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PacketDataQueue) > 0 { + for iNdEx := len(m.PacketDataQueue) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PacketDataQueue[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.SlashRecord != nil { + { + size, err := m.SlashRecord.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ChainInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1078,6 +1287,34 @@ func (m *QueryProviderInfoResponse) Size() (n int) { return n } +func (m *QueryThrottleStateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryThrottleStateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SlashRecord != nil { + l = m.SlashRecord.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if len(m.PacketDataQueue) > 0 { + for _, e := range m.PacketDataQueue { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func (m *ChainInfo) Size() (n int) { if m == nil { return 0 @@ -1779,6 +2016,176 @@ func (m *QueryProviderInfoResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryThrottleStateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryThrottleStateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryThrottleStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryThrottleStateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryThrottleStateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryThrottleStateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashRecord", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SlashRecord == nil { + m.SlashRecord = &SlashRecord{} + } + if err := m.SlashRecord.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PacketDataQueue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PacketDataQueue = append(m.PacketDataQueue, types.ConsumerPacketData{}) + if err := m.PacketDataQueue[len(m.PacketDataQueue)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ChainInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/ccv/consumer/types/query.pb.gw.go b/x/ccv/consumer/types/query.pb.gw.go index 1151ab0b60..46ad461324 100644 --- a/x/ccv/consumer/types/query.pb.gw.go +++ b/x/ccv/consumer/types/query.pb.gw.go @@ -87,6 +87,24 @@ func local_request_Query_QueryProviderInfo_0(ctx context.Context, marshaler runt } +func request_Query_QueryThrottleState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryThrottleStateRequest + var metadata runtime.ServerMetadata + + msg, err := client.QueryThrottleState(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_QueryThrottleState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryThrottleStateRequest + var metadata runtime.ServerMetadata + + msg, err := server.QueryThrottleState(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -162,6 +180,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_QueryThrottleState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_QueryThrottleState_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_QueryThrottleState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -263,6 +304,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_QueryThrottleState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_QueryThrottleState_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_QueryThrottleState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -272,6 +333,8 @@ var ( pattern_Query_QueryParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "consumer", "params"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_QueryProviderInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "consumer", "provider-info"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_QueryThrottleState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "consumer", "throttle_state"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -280,4 +343,6 @@ var ( forward_Query_QueryParams_0 = runtime.ForwardResponseMessage forward_Query_QueryProviderInfo_0 = runtime.ForwardResponseMessage + + forward_Query_QueryThrottleState_0 = runtime.ForwardResponseMessage ) diff --git a/x/ccv/provider/client/cli/query.go b/x/ccv/provider/client/cli/query.go index 1240e242f0..80746ff5d2 100644 --- a/x/ccv/provider/client/cli/query.go +++ b/x/ccv/provider/client/cli/query.go @@ -31,7 +31,6 @@ func NewQueryCmd() *cobra.Command { cmd.AddCommand(CmdConsumerValidatorKeyAssignment()) cmd.AddCommand(CmdProviderValidatorKey()) cmd.AddCommand(CmdThrottleState()) - cmd.AddCommand(CmdThrottledConsumerPacketData()) cmd.AddCommand(CmdRegisteredConsumerRewardDenoms()) return cmd @@ -286,42 +285,6 @@ $ %s query provider throttle-state return cmd } -func CmdThrottledConsumerPacketData() *cobra.Command { - cmd := &cobra.Command{ - Use: "throttled-consumer-packet-data [chainid]", - Short: "Query pending VSCMatured and slash packet data for a consumer chainId", - Long: strings.TrimSpace( - fmt.Sprintf(`Returns the current pending VSCMatured and slash packet data instances for a consumer chainId. - Queue is ordered by ibc sequence number. -Example: -$ %s query provider throttled-consumer-packet-data foochain -`, - version.AppName, - ), - ), - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryThrottledConsumerPacketDataRequest{ChainId: args[0]} - res, err := queryClient.QueryThrottledConsumerPacketData(cmd.Context(), req) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - func CmdRegisteredConsumerRewardDenoms() *cobra.Command { cmd := &cobra.Command{ Use: "registered-consumer-reward-denoms", diff --git a/x/ccv/provider/keeper/grpc_query.go b/x/ccv/provider/keeper/grpc_query.go index 2b522ea9ef..881a6b1a98 100644 --- a/x/ccv/provider/keeper/grpc_query.go +++ b/x/ccv/provider/keeper/grpc_query.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "fmt" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -148,98 +147,14 @@ func (k Keeper) QueryThrottleState(goCtx context.Context, req *types.QueryThrott meter := k.GetSlashMeter(ctx) allowance := k.GetSlashMeterAllowance(ctx) candidate := k.GetSlashMeterReplenishTimeCandidate(ctx) // always UTC - packets := []*types.ThrottledSlashPacket{} - - // iterate global slash entries from all consumer chains - // and fetch corresponding SlashPacketData from the per-chain throttled packet data queue - allGlobalEntries := k.GetAllGlobalSlashEntries(ctx) - - for _, entry := range allGlobalEntries { - // Obtain slash packet data instance for the given global entry - slashData, found := k.getSlashPacketData(ctx, entry.ConsumerChainID, entry.IbcSeqNum) - if !found { - // silently skip over invalid data - continue - } - - packets = append(packets, &types.ThrottledSlashPacket{ - GlobalEntry: entry, - Data: slashData, - }) - } return &types.QueryThrottleStateResponse{ SlashMeter: meter.Int64(), SlashMeterAllowance: allowance.Int64(), NextReplenishCandidate: candidate, - Packets: packets, - }, nil -} - -func (k Keeper) QueryThrottledConsumerPacketData(goCtx context.Context, req *types.QueryThrottledConsumerPacketDataRequest) (*types.QueryThrottledConsumerPacketDataResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - if req.ChainId == "" { - return nil, status.Error(codes.InvalidArgument, "invalid chain-id") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - if _, found := k.GetChainToChannel(ctx, req.ChainId); !found { - return nil, status.Error(codes.InvalidArgument, "invalid chain-id") - } - - packetDataInstances := []types.ThrottledPacketDataWrapper{} - _, _, rawOrderedData, _ := k.GetAllThrottledPacketData(ctx, req.ChainId) - - for _, raw := range rawOrderedData { - switch data := raw.(type) { - case ccvtypes.SlashPacketData: - w := &types.ThrottledPacketDataWrapper_SlashPacket{SlashPacket: &data} - packetDataInstances = append(packetDataInstances, types.ThrottledPacketDataWrapper{ - Data: w, - }) - case ccvtypes.VSCMaturedPacketData: - w := &types.ThrottledPacketDataWrapper_VscMaturedPacket{VscMaturedPacket: &data} - packetDataInstances = append(packetDataInstances, types.ThrottledPacketDataWrapper{ - Data: w, - }) - default: - k.Logger(ctx).Error(fmt.Sprintf("unexpected packet data type: %T", data)) - } - } - - return &types.QueryThrottledConsumerPacketDataResponse{ - ChainId: req.ChainId, - Size_: k.GetThrottledPacketDataSize(ctx, req.ChainId), - PacketDataInstances: packetDataInstances, }, nil } -// getSlashPacketData fetches a slash packet data from the store using consumerChainId and ibcSeqNum (direct access) -// If the returned bytes do not unmarshal to SlashPacketData, the data is considered not found. -func (k Keeper) getSlashPacketData(ctx sdk.Context, consumerChainID string, ibcSeqNum uint64) (ccvtypes.SlashPacketData, bool) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(types.ThrottledPacketDataKey(consumerChainID, ibcSeqNum)) - if len(bz) == 0 { - return ccvtypes.SlashPacketData{}, false - } - - if bz[0] != slashPacketData { - return ccvtypes.SlashPacketData{}, false - } - - packet := ccvtypes.SlashPacketData{} - err := packet.Unmarshal(bz[1:]) - if err != nil { - // If the data cannot be unmarshaled, it is considered not found - return ccvtypes.SlashPacketData{}, false - } - - return packet, true -} - func (k Keeper) QueryRegisteredConsumerRewardDenoms(goCtx context.Context, req *types.QueryRegisteredConsumerRewardDenomsRequest) (*types.QueryRegisteredConsumerRewardDenomsResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") diff --git a/x/ccv/provider/keeper/keeper.go b/x/ccv/provider/keeper/keeper.go index e9bb1d1bd0..d4470ec0aa 100644 --- a/x/ccv/provider/keeper/keeper.go +++ b/x/ccv/provider/keeper/keeper.go @@ -299,7 +299,7 @@ func (k Keeper) VerifyConsumerChain(ctx sdk.Context, channelID string, connectio return errorsmod.Wrapf(ccv.ErrClientNotFound, "cannot find client for consumer chain %s", tmClient.ChainId) } if ccvClientId != clientID { - return errorsmod.Wrapf(ccv.ErrInvalidConsumerClient, "CCV channel must be built on top of CCV client. expected %s, got %s", ccvClientId, clientID) + return errorsmod.Wrapf(types.ErrInvalidConsumerClient, "CCV channel must be built on top of CCV client. expected %s, got %s", ccvClientId, clientID) } // Verify that there isn't already a CCV channel for the consumer chain diff --git a/x/ccv/provider/keeper/migration.go b/x/ccv/provider/keeper/migration.go new file mode 100644 index 0000000000..5d739c8bef --- /dev/null +++ b/x/ccv/provider/keeper/migration.go @@ -0,0 +1,138 @@ +package keeper + +import ( + "fmt" + + sdktypes "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + + providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" + ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" +) + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + providerKeeper Keeper + paramSpace paramtypes.Subspace +} + +// NewMigrator returns a new Migrator. +func NewMigrator(providerKeeper Keeper, paramSpace paramtypes.Subspace) Migrator { + return Migrator{providerKeeper: providerKeeper, paramSpace: paramSpace} +} + +// Migrate2to3 migrates x/ccvprovider state from consensus version 2 to 3. +func (m Migrator) Migrate2to3(ctx sdktypes.Context) error { + return m.providerKeeper.MigrateQueuedPackets(ctx) +} + +func (k Keeper) MigrateQueuedPackets(ctx sdktypes.Context) error { + for _, consumer := range k.GetAllConsumerChains(ctx) { + slashData, vscmData := k.GetAllThrottledPacketData(ctx, consumer.ChainId) + if len(slashData) > 0 { + k.Logger(ctx).Error(fmt.Sprintf("slash data being dropped: %v", slashData)) + } + for _, data := range vscmData { + k.HandleVSCMaturedPacket(ctx, consumer.ChainId, data) + } + k.DeleteThrottledPacketDataForConsumer(ctx, consumer.ChainId) + } + return nil +} + +// Pending packet data type enum, used to encode the type of packet data stored at each entry in the mutual queue. +// Note this type is copy/pasted from throttle v1 code. +const ( + slashPacketData byte = iota + vscMaturedPacketData +) + +// GetAllThrottledPacketData returns all throttled packet data for a given consumer chain, only used for 2 -> 3 migration. +// Note this method is adapted from throttle v1 code. +func (k Keeper) GetAllThrottledPacketData(ctx sdktypes.Context, consumerChainID string) ( + slashData []ccvtypes.SlashPacketData, vscMaturedData []ccvtypes.VSCMaturedPacketData, +) { + slashData = []ccvtypes.SlashPacketData{} + vscMaturedData = []ccvtypes.VSCMaturedPacketData{} + + store := ctx.KVStore(k.storeKey) + iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) + iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + bz := iterator.Value() + switch bz[0] { + case slashPacketData: + d := ccvtypes.SlashPacketData{} + if err := d.Unmarshal(bz[1:]); err != nil { + k.Logger(ctx).Error(fmt.Sprintf("failed to unmarshal slash packet data: %v", err)) + continue + } + slashData = append(slashData, d) + case vscMaturedPacketData: + d := ccvtypes.VSCMaturedPacketData{} + if err := d.Unmarshal(bz[1:]); err != nil { + k.Logger(ctx).Error(fmt.Sprintf("failed to unmarshal vsc matured packet data: %v", err)) + continue + } + vscMaturedData = append(vscMaturedData, d) + default: + k.Logger(ctx).Error(fmt.Sprintf("invalid packet data type: %v", bz[0])) + continue + } + } + + return slashData, vscMaturedData +} + +// Note this method is copy/pasted from throttle v1 code. +func (k Keeper) DeleteThrottledPacketDataForConsumer(ctx sdktypes.Context, consumerChainID string) { + store := ctx.KVStore(k.storeKey) + iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) + iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) + defer iterator.Close() + + keysToDel := [][]byte{} + for ; iterator.Valid(); iterator.Next() { + keysToDel = append(keysToDel, iterator.Key()) + } + // Delete data for this consumer + for _, key := range keysToDel { + store.Delete(key) + } + + // Delete size of data queue for this consumer + store.Delete(providertypes.ThrottledPacketDataSizeKey(consumerChainID)) +} + +// Note this method is adapted from throttle v1 code. +func (k Keeper) QueueThrottledPacketDataOnlyForTesting( + ctx sdktypes.Context, consumerChainID string, ibcSeqNum uint64, packetData interface{}, +) error { + store := ctx.KVStore(k.storeKey) + + var bz []byte + var err error + switch data := packetData.(type) { + case ccvtypes.SlashPacketData: + bz, err = data.Marshal() + if err != nil { + return fmt.Errorf("failed to marshal slash packet data: %v", err) + } + bz = append([]byte{slashPacketData}, bz...) + case ccvtypes.VSCMaturedPacketData: + bz, err = data.Marshal() + if err != nil { + return fmt.Errorf("failed to marshal vsc matured packet data: %v", err) + } + bz = append([]byte{vscMaturedPacketData}, bz...) + default: + // Indicates a developer error, this method should only be called + // by tests, QueueThrottledSlashPacketData, or QueueThrottledVSCMaturedPacketData. + panic(fmt.Sprintf("unexpected packet data type: %T", data)) + } + + store.Set(providertypes.ThrottledPacketDataKey(consumerChainID, ibcSeqNum), bz) + return nil +} diff --git a/x/ccv/provider/keeper/migration_test.go b/x/ccv/provider/keeper/migration_test.go new file mode 100644 index 0000000000..a710e3979c --- /dev/null +++ b/x/ccv/provider/keeper/migration_test.go @@ -0,0 +1,117 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + testutil "github.com/cosmos/interchain-security/v3/testutil/keeper" +) + +func TestMigrate2To3(t *testing.T) { + providerKeeper, ctx, ctrl, _ := testutil.GetProviderKeeperAndCtx(t, testutil.NewInMemKeeperParams(t)) + defer ctrl.Finish() + + // Set consumer client ids to mock consumers being connected to provider + providerKeeper.SetConsumerClientId(ctx, "chain-1", "client-1") + providerKeeper.SetConsumerClientId(ctx, "chain-2", "client-2") + providerKeeper.SetConsumerClientId(ctx, "chain-3", "client-3") + + // Queue some data for chain-1 + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-1", 66, testutil.GetNewSlashPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-1", 67, testutil.GetNewVSCMaturedPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-1", 68, testutil.GetNewSlashPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-1", 69, testutil.GetNewVSCMaturedPacketData()) + + // Queue some data for chain-2 + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-2", 789, testutil.GetNewVSCMaturedPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-2", 790, testutil.GetNewSlashPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-2", 791, testutil.GetNewVSCMaturedPacketData()) + + // Queue some data for chain-3 + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-3", 123, testutil.GetNewSlashPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-3", 124, testutil.GetNewVSCMaturedPacketData()) + providerKeeper.QueueThrottledPacketDataOnlyForTesting( + ctx, "chain-3", 125, testutil.GetNewVSCMaturedPacketData()) + + // Confirm getter methods return expected values + slash1, vscm1 := providerKeeper.GetAllThrottledPacketData(ctx, "chain-1") + require.Len(t, slash1, 2) + require.Len(t, vscm1, 2) + + slash2, vscm2 := providerKeeper.GetAllThrottledPacketData(ctx, "chain-2") + require.Len(t, slash2, 1) + require.Len(t, vscm2, 2) + + slash3, vscm3 := providerKeeper.GetAllThrottledPacketData(ctx, "chain-3") + require.Len(t, slash3, 1) + require.Len(t, vscm3, 2) + + // Set vsc send timestamp for every queued vsc matured packet, + // as a way to assert that the vsc matured packets are handled in the migration. + // + // That is, timestamp should exist before a vsc matured packet is handled, + // and deleted after handling. + for _, data := range vscm1 { + providerKeeper.SetVscSendTimestamp(ctx, "chain-1", data.ValsetUpdateId, time.Now()) + } + for _, data := range vscm2 { + providerKeeper.SetVscSendTimestamp(ctx, "chain-2", data.ValsetUpdateId, time.Now()) + } + for _, data := range vscm3 { + providerKeeper.SetVscSendTimestamp(ctx, "chain-3", data.ValsetUpdateId, time.Now()) + } + + // Confirm timestamps are set + for _, data := range vscm1 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-1", data.ValsetUpdateId) + require.True(t, found) + } + for _, data := range vscm2 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-2", data.ValsetUpdateId) + require.True(t, found) + } + for _, data := range vscm3 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-3", data.ValsetUpdateId) + require.True(t, found) + } + + // Run migration + err := providerKeeper.MigrateQueuedPackets(ctx) + require.NoError(t, err) + + // Confirm throttled data is now deleted + slash1, vscm1 = providerKeeper.GetAllThrottledPacketData(ctx, "chain-1") + require.Empty(t, slash1) + require.Empty(t, vscm1) + slash2, vscm2 = providerKeeper.GetAllThrottledPacketData(ctx, "chain-2") + require.Empty(t, slash2) + require.Empty(t, vscm2) + slash3, vscm3 = providerKeeper.GetAllThrottledPacketData(ctx, "chain-3") + require.Empty(t, slash3) + require.Empty(t, vscm3) + + // Confirm timestamps are deleted, meaning vsc matured packets were handled + for _, data := range vscm1 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-1", data.ValsetUpdateId) + require.False(t, found) + } + for _, data := range vscm2 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-2", data.ValsetUpdateId) + require.False(t, found) + } + for _, data := range vscm3 { + _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-3", data.ValsetUpdateId) + require.False(t, found) + } +} diff --git a/x/ccv/provider/keeper/msg_server.go b/x/ccv/provider/keeper/msg_server.go index 2aa0fed46c..fecbdc8c36 100644 --- a/x/ccv/provider/keeper/msg_server.go +++ b/x/ccv/provider/keeper/msg_server.go @@ -12,7 +12,6 @@ import ( tmprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) type msgServer struct { @@ -100,9 +99,9 @@ func (k msgServer) AssignConsumerKey(goCtx context.Context, msg *types.MsgAssign ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( - ccvtypes.EventTypeAssignConsumerKey, - sdk.NewAttribute(ccvtypes.AttributeProviderValidatorAddress, msg.ProviderAddr), - sdk.NewAttribute(ccvtypes.AttributeConsumerConsensusPubKey, consumerTMPublicKey.String()), + types.EventTypeAssignConsumerKey, + sdk.NewAttribute(types.AttributeProviderValidatorAddress, msg.ProviderAddr), + sdk.NewAttribute(types.AttributeConsumerConsensusPubKey, consumerTMPublicKey.String()), ), }) diff --git a/x/ccv/provider/keeper/params.go b/x/ccv/provider/keeper/params.go index b7b53b245b..2dbe8ca40d 100644 --- a/x/ccv/provider/keeper/params.go +++ b/x/ccv/provider/keeper/params.go @@ -69,14 +69,6 @@ func (k Keeper) GetSlashMeterReplenishFraction(ctx sdk.Context) string { return f } -// GetMaxThrottledPackets returns the maximum amount of throttled slash or vsc matured packets -// that can be queued for a single consumer before the provider chain halts. -func (k Keeper) GetMaxThrottledPackets(ctx sdk.Context) int64 { - var p int64 - k.paramSpace.Get(ctx, types.KeyMaxThrottledPackets, &p) - return p -} - func (k Keeper) GetConsumerRewardDenomRegistrationFee(ctx sdk.Context) sdk.Coin { // Due to difficulties doing migrations in coordinated upgrades, this param is hardcoded to 10 ATOM in v1.1.0-multiden. // The below code is the proper way to store the param. A future scheduled upgrade will @@ -96,7 +88,6 @@ func (k Keeper) GetParams(ctx sdk.Context) types.Params { k.GetVscTimeoutPeriod(ctx), k.GetSlashMeterReplenishPeriod(ctx), k.GetSlashMeterReplenishFraction(ctx), - k.GetMaxThrottledPackets(ctx), k.GetConsumerRewardDenomRegistrationFee(ctx), ) } diff --git a/x/ccv/provider/keeper/params_test.go b/x/ccv/provider/keeper/params_test.go index 05b3964bb7..c057079e59 100644 --- a/x/ccv/provider/keeper/params_test.go +++ b/x/ccv/provider/keeper/params_test.go @@ -44,7 +44,6 @@ func TestParams(t *testing.T) { 10*time.Minute, time.Hour, "0.4", - 100, sdk.Coin{ Denom: "stake", Amount: sdk.NewInt(10000000), diff --git a/x/ccv/provider/keeper/proposal.go b/x/ccv/provider/keeper/proposal.go index 7ea7433770..20bf812395 100644 --- a/x/ccv/provider/keeper/proposal.go +++ b/x/ccv/provider/keeper/proposal.go @@ -56,7 +56,7 @@ func (k Keeper) CreateConsumerClient(ctx sdk.Context, prop *types.ConsumerAdditi chainID := prop.ChainId // check that a client for this chain does not exist if _, found := k.GetConsumerClientId(ctx, chainID); found { - return errorsmod.Wrap(ccv.ErrDuplicateConsumerChain, + return errorsmod.Wrap(types.ErrDuplicateConsumerChain, fmt.Sprintf("cannot create client for existent consumer chain: %s", chainID)) } @@ -108,14 +108,14 @@ func (k Keeper) CreateConsumerClient(ctx sdk.Context, prop *types.ConsumerAdditi ctx.EventManager().EmitEvent( sdk.NewEvent( - ccv.EventTypeConsumerClientCreated, + types.EventTypeConsumerClientCreated, sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), sdk.NewAttribute(ccv.AttributeChainID, chainID), sdk.NewAttribute(clienttypes.AttributeKeyClientID, clientID), - sdk.NewAttribute(ccv.AttributeInitialHeight, prop.InitialHeight.String()), - sdk.NewAttribute(ccv.AttributeInitializationTimeout, strconv.Itoa(int(ts.UnixNano()))), - sdk.NewAttribute(ccv.AttributeTrustingPeriod, clientState.TrustingPeriod.String()), - sdk.NewAttribute(ccv.AttributeUnbondingPeriod, clientState.UnbondingPeriod.String()), + sdk.NewAttribute(types.AttributeInitialHeight, prop.InitialHeight.String()), + sdk.NewAttribute(types.AttributeInitializationTimeout, strconv.Itoa(int(ts.UnixNano()))), + sdk.NewAttribute(types.AttributeTrustingPeriod, clientState.TrustingPeriod.String()), + sdk.NewAttribute(types.AttributeUnbondingPeriod, clientState.UnbondingPeriod.String()), ), ) @@ -155,7 +155,7 @@ func (k Keeper) HandleConsumerRemovalProposal(ctx sdk.Context, p *types.Consumer func (k Keeper) StopConsumerChain(ctx sdk.Context, chainID string, closeChan bool) (err error) { // check that a client for chainID exists if _, found := k.GetConsumerClientId(ctx, chainID); !found { - return errorsmod.Wrap(ccv.ErrConsumerChainNotFound, + return errorsmod.Wrap(types.ErrConsumerChainNotFound, fmt.Sprintf("cannot stop non-existent consumer chain: %s", chainID)) } @@ -214,21 +214,6 @@ func (k Keeper) StopConsumerChain(ctx sdk.Context, chainID string, closeChan boo k.DeleteUnbondingOpIndex(ctx, chainID, unbondingOpsIndex.VscId) } - // Remove any existing throttling related entries from the global queue, - // only for this consumer. - // Note: this call panics if the throttling state is invalid - k.DeleteGlobalSlashEntriesForConsumer(ctx, chainID) - - if k.GetThrottledPacketDataSize(ctx, chainID) > 0 { - k.Logger(ctx).Info("There are throttled slash and/or vsc matured packet data instances queued,"+ - " from a consumer that is being removed. This packet data will be thrown out!", "chainID", chainID) - } - - // Remove all throttled slash packets and vsc matured packets queued for this consumer. - // Note: queued VSC matured packets can be safely removed from the per-chain queue, - // since all unbonding operations for this consumer are release above. - k.DeleteThrottledPacketDataForConsumer(ctx, chainID) - k.Logger(ctx).Info("consumer chain removed from provider", "chainID", chainID) return nil @@ -314,6 +299,7 @@ func (k Keeper) MakeConsumerGenesis( "0.05", []string{}, []string{}, + ccv.DefaultRetryDelayPeriod, ) gen = *ccv.NewInitialConsumerGenesisState( @@ -626,8 +612,8 @@ func (k Keeper) HandleConsumerRewardDenomProposal(ctx sdk.Context, p *types.Chan } k.SetConsumerRewardDenom(ctx, denomToAdd) ctx.EventManager().EmitEvent(sdk.NewEvent( - ccv.EventTypeAddConsumerRewardDenom, - sdk.NewAttribute(ccv.AttributeConsumerRewardDenom, denomToAdd), + types.EventTypeAddConsumerRewardDenom, + sdk.NewAttribute(types.AttributeConsumerRewardDenom, denomToAdd), )) } for _, denomToRemove := range p.DenomsToRemove { @@ -638,8 +624,8 @@ func (k Keeper) HandleConsumerRewardDenomProposal(ctx sdk.Context, p *types.Chan } k.DeleteConsumerRewardDenom(ctx, denomToRemove) ctx.EventManager().EmitEvent(sdk.NewEvent( - ccv.EventTypeRemoveConsumerRewardDenom, - sdk.NewAttribute(ccv.AttributeConsumerRewardDenom, denomToRemove), + types.EventTypeRemoveConsumerRewardDenom, + sdk.NewAttribute(types.AttributeConsumerRewardDenom, denomToRemove), )) } return nil diff --git a/x/ccv/provider/keeper/proposal_test.go b/x/ccv/provider/keeper/proposal_test.go index d98ca74f7c..568b2c30e0 100644 --- a/x/ccv/provider/keeper/proposal_test.go +++ b/x/ccv/provider/keeper/proposal_test.go @@ -18,7 +18,6 @@ import ( abci "github.com/cometbft/cometbft/abci/types" - cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" providerkeeper "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" @@ -526,28 +525,6 @@ func TestStopConsumerChain(t *testing.T) { }, expErr: true, }, - { - description: "valid stop of consumer chain, throttle related queues are cleaned", - setup: func(ctx sdk.Context, providerKeeper *providerkeeper.Keeper, mocks testkeeper.MockedKeepers) { - testkeeper.SetupForStoppingConsumerChain(t, ctx, providerKeeper, mocks) - - // assert mocks for expected calls to `StopConsumerChain` when closing the underlying channel - gomock.InOrder(testkeeper.GetMocksForStopConsumerChainWithCloseChannel(ctx, &mocks)...) - - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - ctx.BlockTime(), "chainID", 1, cryptoutil.NewCryptoIdentityFromIntSeed(90).ProviderConsAddress())) - - err := providerKeeper.QueueThrottledSlashPacketData(ctx, "chainID", 1, testkeeper.GetNewSlashPacketData()) - if err != nil { - t.Fatal(err) - } - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chainID", 2, testkeeper.GetNewVSCMaturedPacketData()) - if err != nil { - t.Fatal(err) - } - }, - expErr: false, - }, { description: "valid stop of consumer chain, all mock calls hit", setup: func(ctx sdk.Context, providerKeeper *providerkeeper.Keeper, mocks testkeeper.MockedKeepers) { @@ -795,7 +772,6 @@ func TestMakeConsumerGenesis(t *testing.T) { VscTimeoutPeriod: providertypes.DefaultVscTimeoutPeriod, SlashMeterReplenishPeriod: providertypes.DefaultSlashMeterReplenishPeriod, SlashMeterReplenishFraction: providertypes.DefaultSlashMeterReplenishFraction, - MaxThrottledPackets: providertypes.DefaultMaxThrottledPackets, ConsumerRewardDenomRegistrationFee: sdk.Coin{ Denom: "stake", Amount: sdk.NewInt(1000000), @@ -838,7 +814,8 @@ func TestMakeConsumerGenesis(t *testing.T) { "unbonding_period": 1728000000000000, "soft_opt_out_threshold": "0.05", "reward_denoms": [], - "provider_reward_denoms": [] + "provider_reward_denoms": [], + "retry_delay_period": 3600000000000 }, "new_chain": true, "provider" : { diff --git a/x/ccv/provider/keeper/relay.go b/x/ccv/provider/keeper/relay.go index d63594dad1..0cbce718a7 100644 --- a/x/ccv/provider/keeper/relay.go +++ b/x/ccv/provider/keeper/relay.go @@ -17,7 +17,7 @@ import ( ccv "github.com/cosmos/interchain-security/v3/x/ccv/types" ) -// OnRecvVSCMaturedPacket handles a VSCMatured packet +// OnRecvVSCMaturedPacket handles a VSCMatured packet and returns a no-op result ack. func (k Keeper) OnRecvVSCMaturedPacket( ctx sdk.Context, packet channeltypes.Packet, @@ -34,12 +34,9 @@ func (k Keeper) OnRecvVSCMaturedPacket( panic(fmt.Errorf("VSCMaturedPacket received on unknown channel %s", packet.DestinationChannel)) } - if err := k.QueueThrottledVSCMaturedPacketData(ctx, chainID, packet.Sequence, data); err != nil { - return ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf( - "failed to queue VSCMatured packet data: %s", err.Error())) - } + k.HandleVSCMaturedPacket(ctx, chainID, data) - k.Logger(ctx).Info("VSCMaturedPacket received and enqueued", + k.Logger(ctx).Info("VSCMaturedPacket handled", "chainID", chainID, "vscID", data.ValsetUpdateId, ) @@ -48,35 +45,6 @@ func (k Keeper) OnRecvVSCMaturedPacket( return ack } -// HandleLeadingVSCMaturedPackets handles all VSCMatured packet data that has been queued this block, -// but does not need to be throttled. The handled data is then removed from the queue. -// -// Note: VSC matured packet data which is queued behind slash packet data CANNOT be -// handled until the leading slash packet data has been handled. This is to maintain -// the "VSC Maturity and Slashing Order" CCV property. If VSC matured packet data DOES NOT -// trail slash packet data for that consumer, it will be handled in this method, -// bypassing HandleThrottleQueues. -func (k Keeper) HandleLeadingVSCMaturedPackets(ctx sdk.Context) (vscMaturedHandledThisBlock int) { - vscMaturedHandledThisBlock = 0 - for _, chain := range k.GetAllConsumerChains(ctx) { - // Note: it's assumed the order of the vsc matured slice matches the order of the ibc seq nums slice, - // in that a vsc matured packet data at index i is associated with the ibc seq num at index i. - leadingVscMatured, ibcSeqNums := k.GetLeadingVSCMaturedData(ctx, chain.ChainId) - ibcSeqNumsHandled := []uint64{} - for idx, data := range leadingVscMatured { - if vscMaturedHandledThisBlock >= vscMaturedHandledPerBlockLimit { - // Break from inner for-loop, DeleteThrottledPacketData will still be called for this consumer - break - } - k.HandleVSCMaturedPacket(ctx, chain.ChainId, data) - vscMaturedHandledThisBlock++ - ibcSeqNumsHandled = append(ibcSeqNumsHandled, ibcSeqNums[idx]) - } - k.DeleteThrottledPacketData(ctx, chain.ChainId, ibcSeqNumsHandled...) - } - return vscMaturedHandledThisBlock -} - // HandleVSCMaturedPacket handles a VSCMatured packet. // // Note: This method should only panic for a system critical error like a @@ -270,18 +238,10 @@ func (k Keeper) QueueVSCPackets(ctx sdk.Context) { k.IncrementValidatorSetUpdateId(ctx) } -// EndBlockCIS contains the EndBlock logic needed for -// the Consumer Initiated Slashing sub-protocol -func (k Keeper) EndBlockCIS(ctx sdk.Context) { - // set the ValsetUpdateBlockHeight - blockHeight := uint64(ctx.BlockHeight()) + 1 - valUpdateID := k.GetValidatorSetUpdateId(ctx) - k.SetValsetUpdateBlockHeight(ctx, valUpdateID, blockHeight) - k.Logger(ctx).Debug("vscID was mapped to block height", "vscID", valUpdateID, "height", blockHeight) - - // Replenish slash meter if necessary, BEFORE executing slash packet throttling logic. - // This ensures the meter value is replenished, and not greater than the allowance (max value) - // for the block, before the throttling logic is executed. +// BeginBlockCIS contains the BeginBlock logic needed for the Consumer Initiated Slashing sub-protocol. +func (k Keeper) BeginBlockCIS(ctx sdk.Context) { + // Replenish slash meter if necessary. This ensures the meter value is replenished before handling any slash packets, + // and ensures the meter value is not greater than the allowance (max value) for the block. // // Note: CheckForSlashMeterReplenishment contains panics for the following scenarios, any of which should never occur // if the protocol is correct and external data is properly validated: @@ -291,23 +251,16 @@ func (k Keeper) EndBlockCIS(ctx sdk.Context) { // - Marshaling and/or store corruption errors. // - Setting invalid slash meter values (see SetSlashMeter). k.CheckForSlashMeterReplenishment(ctx) +} - // Handle leading vsc matured packets before throttling logic. - // - // Note: HandleLeadingVSCMaturedPackets contains panics for the following scenarios, any of which should never occur - // if the protocol is correct and external data is properly validated: - // - // - Marshaling and/or store corruption errors. - vscMaturedHandledThisBlock := k.HandleLeadingVSCMaturedPackets(ctx) - // Handle queue entries considering throttling logic. - // - // Note: HandleThrottleQueues contains panics for the following scenarios, any of which should never occur - // if the protocol is correct and external data is properly validated: - // - // - SlashMeter has not been set (which should be set in InitGenesis, see InitializeSlashMeter). - // - Marshaling and/or store corruption errors. - // - Setting invalid slash meter values (see SetSlashMeter). - k.HandleThrottleQueues(ctx, vscMaturedHandledThisBlock) +// EndBlockCIS contains the EndBlock logic needed for +// the Consumer Initiated Slashing sub-protocol +func (k Keeper) EndBlockCIS(ctx sdk.Context) { + // set the ValsetUpdateBlockHeight + blockHeight := uint64(ctx.BlockHeight()) + 1 + valUpdateID := k.GetValidatorSetUpdateId(ctx) + k.SetValsetUpdateBlockHeight(ctx, valUpdateID, blockHeight) + k.Logger(ctx).Debug("vscID was mapped to block height", "vscID", valUpdateID, "height", blockHeight) } // OnRecvSlashPacket delivers a received slash packet, validates it and @@ -358,20 +311,27 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d return channeltypes.NewResultAcknowledgement(ccv.V1Result) } - // Queue a slash entry to the global queue, which will be seen by the throttling logic - k.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - ctx.BlockTime(), // recv time - chainID, // consumer chain id that sent the packet - packet.Sequence, // IBC sequence number of the packet - providerConsAddr)) // Provider consensus address of val to be slashed - - // Queue slash packet data in the same (consumer chain specific) queue as vsc matured packet data, - // to enforce order of handling between the two packet data types. - if err := k.QueueThrottledSlashPacketData(ctx, chainID, packet.Sequence, data); err != nil { - return ccv.NewErrorAcknowledgementWithLog(ctx, fmt.Errorf("failed to queue slash packet data: %s", err.Error())) + meter := k.GetSlashMeter(ctx) + // Return bounce ack if meter is negative in value + if meter.IsNegative() { + k.Logger(ctx).Info("SlashPacket received, but meter is negative. Packet will be bounced", + "chainID", chainID, + "consumer cons addr", consumerConsAddr.String(), + "provider cons addr", providerConsAddr.String(), + "vscID", data.ValsetUpdateId, + "infractionType", data.Infraction, + ) + return channeltypes.NewResultAcknowledgement(ccv.SlashPacketBouncedResult) } - k.Logger(ctx).Info("slash packet received and enqueued", + // Subtract voting power that will be jailed/tombstoned from the slash meter, + // BEFORE handling slash packet. + meter = meter.Sub(k.GetEffectiveValPower(ctx, providerConsAddr)) + k.SetSlashMeter(ctx, meter) + + k.HandleSlashPacket(ctx, chainID, data) + + k.Logger(ctx).Info("slash packet received and handled", "chainID", chainID, "consumer cons addr", consumerConsAddr.String(), "provider cons addr", providerConsAddr.String(), @@ -379,7 +339,8 @@ func (k Keeper) OnRecvSlashPacket(ctx sdk.Context, packet channeltypes.Packet, d "infractionType", data.Infraction, ) - return channeltypes.NewResultAcknowledgement(ccv.V1Result) + // Return result ack that the packet was handled successfully + return channeltypes.NewResultAcknowledgement(ccv.SlashPacketHandledResult) } // ValidateSlashPacket validates a recv slash packet before it is @@ -465,11 +426,11 @@ func (k Keeper) HandleSlashPacket(ctx sdk.Context, chainID string, data ccv.Slas ctx.EventManager().EmitEvent( sdk.NewEvent( - ccv.EventTypeExecuteConsumerChainSlash, + providertypes.EventTypeExecuteConsumerChainSlash, sdk.NewAttribute(sdk.AttributeKeyModule, providertypes.ModuleName), sdk.NewAttribute(ccv.AttributeValidatorAddress, providerConsAddr.String()), sdk.NewAttribute(ccv.AttributeInfractionType, data.Infraction.String()), - sdk.NewAttribute(ccv.AttributeInfractionHeight, strconv.Itoa(int(infractionHeight))), + sdk.NewAttribute(providertypes.AttributeInfractionHeight, strconv.Itoa(int(infractionHeight))), sdk.NewAttribute(ccv.AttributeValSetUpdateID, strconv.Itoa(int(data.ValsetUpdateId))), ), ) @@ -491,7 +452,7 @@ func (k Keeper) EndBlockCCR(ctx sdk.Context) { "chainID", initTimeoutTimestamp.ChainId) err := k.StopConsumerChain(ctx, initTimeoutTimestamp.ChainId, false) if err != nil { - if ccv.ErrConsumerChainNotFound.Is(err) { + if providertypes.ErrConsumerChainNotFound.Is(err) { // consumer chain not found continue } @@ -518,7 +479,7 @@ func (k Keeper) EndBlockCCR(ctx sdk.Context) { ) err := k.StopConsumerChain(ctx, channelToChain.ChainId, true) if err != nil { - if ccv.ErrConsumerChainNotFound.Is(err) { + if providertypes.ErrConsumerChainNotFound.Is(err) { // consumer chain not found continue } diff --git a/x/ccv/provider/keeper/relay_test.go b/x/ccv/provider/keeper/relay_test.go index d3fdcaa21e..bc482d30a2 100644 --- a/x/ccv/provider/keeper/relay_test.go +++ b/x/ccv/provider/keeper/relay_test.go @@ -3,7 +3,6 @@ package keeper_test import ( "strings" "testing" - "time" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" @@ -12,6 +11,8 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "cosmossdk.io/math" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -93,10 +94,8 @@ func TestQueueVSCPackets(t *testing.T) { } // TestOnRecvVSCMaturedPacket tests the OnRecvVSCMaturedPacket method of the keeper. -// Particularly the behavior that VSC matured packet data should be handled immediately -// if the pending packet data queue is empty, and should be queued otherwise. // -// Note: Handling logic itself is not testing in here, just queueing behavior. +// Note: Handling logic itself is not tested here. func TestOnRecvVSCMaturedPacket(t *testing.T) { providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() @@ -106,131 +105,69 @@ func TestOnRecvVSCMaturedPacket(t *testing.T) { providerKeeper.SetChannelToChain(ctx, "channel-1", "chain-1") providerKeeper.SetChannelToChain(ctx, "channel-2", "chain-2") - // Execute on recv for chain-1 + // Execute on recv for chain-1, confirm v1 result ack is returned ack := executeOnRecvVSCMaturedPacket(t, &providerKeeper, ctx, "channel-1", 1) require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) - // Assert that the packet data was queued for chain-1 - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - - // chain-2 queue empty - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - - // Now queue a slash packet data instance for chain-2, then confirm the on recv method - // queues the vsc matured behind the slash packet data - err := providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-2", 1, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) + // Now queue a slash packet data instance for chain-2, confirm v1 result ack is returned ack = executeOnRecvVSCMaturedPacket(t, &providerKeeper, ctx, "channel-2", 2) require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) - require.Equal(t, uint64(2), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - - // Chain-1 still has 1 packet data queued - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - - // Receive 5 more vsc matured packets for chain-2, then confirm chain-2 queue size is 7, chain-1 still size 1 - for i := 0; i < 5; i++ { - ack = executeOnRecvVSCMaturedPacket(t, &providerKeeper, ctx, "channel-2", uint64(i+3)) - require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) - } - require.Equal(t, uint64(7), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - - // Delete chain-2's data from its queue, then confirm the queue size is 0 - providerKeeper.DeleteThrottledPacketData(ctx, "chain-2", []uint64{1, 2, 3, 4, 5, 6, 7}...) - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) } -func TestHandleLeadingVSCMaturedPackets(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) +// TestOnRecvDowntimeSlashPacket tests the OnRecvSlashPacket method specifically for downtime slash packets. +func TestOnRecvDowntimeSlashPacket(t *testing.T) { + providerKeeper, ctx, ctrl, mocks := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - vscData := getTenSampleVSCMaturedPacketData() - - // Set channel to chain, and chain to client mappings - // (faking multiple established consumer channels) + // Set channel to chain (faking multiple established channels) providerKeeper.SetChannelToChain(ctx, "channel-1", "chain-1") - providerKeeper.SetConsumerClientId(ctx, "chain-1", "client-1") providerKeeper.SetChannelToChain(ctx, "channel-2", "chain-2") - providerKeeper.SetConsumerClientId(ctx, "chain-2", "client-2") - // Queue some leading vsc matured packet data for chain-1 - err := providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-1", 1, vscData[0]) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-1", 2, vscData[1]) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-1", 3, vscData[2]) - require.NoError(t, err) + // Generate a new slash packet data instance with double sign infraction type + packetData := testkeeper.GetNewSlashPacketData() + packetData.Infraction = stakingtypes.Infraction_INFRACTION_DOWNTIME - // Queue some trailing slash packet data (and a couple more vsc matured) - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-1", 4, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-1", 5, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-1", 6, vscData[3]) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-1", 7, vscData[4]) - require.NoError(t, err) + // Set a block height for the valset update id in the generated packet data + providerKeeper.SetValsetUpdateBlockHeight(ctx, packetData.ValsetUpdateId, uint64(15)) - // Queue some leading vsc matured packet data for chain-2 - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-2", 1, vscData[5]) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-2", 2, vscData[6]) - require.NoError(t, err) + // Set slash meter to negative value and assert a bounce ack is returned + providerKeeper.SetSlashMeter(ctx, math.NewInt(-5)) + ack := executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-1", 1, packetData) + require.Equal(t, channeltypes.NewResultAcknowledgement(ccv.SlashPacketBouncedResult), ack) - // And trailing slash packet data for chain-2 - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-2", 3, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-2", 4, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) + // Also bounced for chain-2 + ack = executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-2", 2, packetData) + require.Equal(t, channeltypes.NewResultAcknowledgement(ccv.SlashPacketBouncedResult), ack) + + // Now set slash meter to positive value and assert slash packet handled result is returned + providerKeeper.SetSlashMeter(ctx, math.NewInt(5)) + + // Mock call to GetEffectiveValPower, so that it returns 2. + providerAddr := providertypes.NewProviderConsAddress(packetData.Validator.Address) + calls := []*gomock.Call{ + mocks.MockStakingKeeper.EXPECT().GetValidatorByConsAddr(ctx, providerAddr.ToSdkConsAddr()). + Return(stakingtypes.Validator{}, true).Times(1), + mocks.MockStakingKeeper.EXPECT().GetLastValidatorPower(ctx, gomock.Any()). + Return(int64(2)).Times(1), + } - // And one more trailing vsc matured packet for chain-2 - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-2", 5, vscData[7]) - require.NoError(t, err) + // Add mocks for slash packet handling + calls = append(calls, + testkeeper.GetMocksForHandleSlashPacket( + ctx, mocks, providerAddr, stakingtypes.Validator{Jailed: false}, true)..., + ) + gomock.InOrder(calls...) - // Set VSC Send timestamps for each recv vsc matured packet - providerKeeper.SetVscSendTimestamp(ctx, "chain-1", vscData[0].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-1", vscData[1].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-1", vscData[2].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-1", vscData[3].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-1", vscData[4].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-2", vscData[5].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-2", vscData[6].ValsetUpdateId, time.Now()) - providerKeeper.SetVscSendTimestamp(ctx, "chain-2", vscData[7].ValsetUpdateId, time.Now()) - - // Confirm each chain-specific queue has the expected number of packet data instances - require.Equal(t, uint64(7), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - require.Equal(t, uint64(5), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - - // Handle leading vsc matured packets and confirm queue sizes change for both chains - providerKeeper.HandleLeadingVSCMaturedPackets(ctx) - require.Equal(t, uint64(4), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - require.Equal(t, uint64(3), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - - // Confirm the leading vsc matured packet data was handled for both chains, - // but not the vsc matured packet data that trails slash data in the queue. - // This assertion is made by checking that VSC Send timestamps were deleted for - // handled vsc matured packet data. - _, found := providerKeeper.GetVscSendTimestamp(ctx, "chain-1", vscData[0].ValsetUpdateId) - require.False(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-1", vscData[1].ValsetUpdateId) - require.False(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-1", vscData[2].ValsetUpdateId) - require.False(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-1", vscData[3].ValsetUpdateId) - require.True(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-1", vscData[4].ValsetUpdateId) - require.True(t, found) + // Execute on recv and confirm slash packet handled result is returned + ack = executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-1", 1, packetData) + require.Equal(t, channeltypes.NewResultAcknowledgement(ccv.SlashPacketHandledResult), ack) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-2", vscData[5].ValsetUpdateId) - require.False(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-2", vscData[6].ValsetUpdateId) - require.False(t, found) - _, found = providerKeeper.GetVscSendTimestamp(ctx, "chain-2", vscData[7].ValsetUpdateId) - require.True(t, found) + // Require slash meter was decremented appropriately, 5-2=3 + require.Equal(t, int64(3), providerKeeper.GetSlashMeter(ctx).Int64()) } -// TestOnRecvSlashPacket tests the OnRecvSlashPacket method specifically for double-sign slash packets. +// TestOnRecvDoubleSignSlashPacket tests the OnRecvSlashPacket method specifically for double-sign slash packets. func TestOnRecvDoubleSignSlashPacket(t *testing.T) { providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) defer ctrl.Finish() @@ -249,12 +186,8 @@ func TestOnRecvDoubleSignSlashPacket(t *testing.T) { // Receive the double-sign slash packet for chain-1 and confirm the expected acknowledgement ack := executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-1", 1, packetData) - require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) + require.Equal(t, channeltypes.NewResultAcknowledgement(ccv.V1Result), ack) - // Nothing should be queued - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) - require.Equal(t, 0, len(providerKeeper.GetAllGlobalSlashEntries(ctx))) require.True(t, providerKeeper.GetSlashLog(ctx, providertypes.NewProviderConsAddress(packetData.Validator.Address))) @@ -263,56 +196,6 @@ func TestOnRecvDoubleSignSlashPacket(t *testing.T) { require.False(t, providerKeeper.GetSlashLog(ctx, randomAddress)) } -// TestOnRecvSlashPacket tests the OnRecvSlashPacket method specifically for downtime slash packets, -// and how the method interacts with the parent and per-chain slash packet queues. -func TestOnRecvDowntimeSlashPacket(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - // Set channel to chain (faking multiple established channels) - providerKeeper.SetChannelToChain(ctx, "channel-1", "chain-1") - providerKeeper.SetChannelToChain(ctx, "channel-2", "chain-2") - - // Generate a new slash packet data instance with downtime infraction type - packetData := testkeeper.GetNewSlashPacketData() - packetData.Infraction = stakingtypes.Infraction_INFRACTION_DOWNTIME - - // Set a block height for the valset update id in the generated packet data - providerKeeper.SetValsetUpdateBlockHeight(ctx, packetData.ValsetUpdateId, uint64(15)) - - // Receive the downtime slash packet for chain-1 at time.Now() - ctx = ctx.WithBlockTime(time.Now()) - ack := executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-1", 1, packetData) - require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) - - // Confirm an entry was added to the global queue, and pending packet data was added to the per-chain queue - globalEntries := providerKeeper.GetAllGlobalSlashEntries(ctx) // parent queue - require.Equal(t, 1, len(globalEntries)) - require.Equal(t, "chain-1", globalEntries[0].ConsumerChainID) - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) // per chain queue - - // Generate a new downtime packet data instance with downtime infraction type - packetData = testkeeper.GetNewSlashPacketData() - packetData.Infraction = stakingtypes.Infraction_INFRACTION_DOWNTIME - - // Set a block height for the valset update id in the generated packet data - providerKeeper.SetValsetUpdateBlockHeight(ctx, packetData.ValsetUpdateId, uint64(15)) - - // Receive a downtime slash packet for chain-2 at time.Now(Add(1 *time.Hour)) - ctx = ctx.WithBlockTime(time.Now().Add(1 * time.Hour)) - ack = executeOnRecvSlashPacket(t, &providerKeeper, ctx, "channel-2", 2, packetData) - require.Equal(t, channeltypes.NewResultAcknowledgement([]byte{byte(1)}), ack) - - // Confirm sizes of parent queue and both per-chain queues - globalEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 2, len(globalEntries)) - require.Equal(t, "chain-1", globalEntries[0].ConsumerChainID) - require.Equal(t, "chain-2", globalEntries[1].ConsumerChainID) - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-1")) // per chain queue - require.Equal(t, uint64(1), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-2")) // per chain queue -} - func executeOnRecvVSCMaturedPacket(t *testing.T, providerKeeper *keeper.Keeper, ctx sdk.Context, channelID string, ibcSeqNum uint64, ) exported.Acknowledgement { diff --git a/x/ccv/provider/keeper/throttle.go b/x/ccv/provider/keeper/throttle.go index d8be629ee7..8232e37a25 100644 --- a/x/ccv/provider/keeper/throttle.go +++ b/x/ccv/provider/keeper/throttle.go @@ -11,64 +11,8 @@ import ( tmtypes "github.com/cometbft/cometbft/types" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) -// This file contains functionality relevant to the throttling of slash and vsc matured packets, aka circuit breaker logic. - -const vscMaturedHandledPerBlockLimit = 100 - -// HandleThrottleQueues iterates over the global slash entry queue, and -// handles all or some portion of throttled (slash and/or VSC matured) packet data received from -// consumer chains. The slash meter is decremented appropriately in this method. -func (k Keeper) HandleThrottleQueues(ctx sdktypes.Context, vscMaturedHandledThisBlock int) { - meter := k.GetSlashMeter(ctx) - // Return if meter is negative in value - if meter.IsNegative() { - return - } - - // Return if vsc matured handle limit was already reached this block, during HandleLeadingVSCMaturedPackets. - // It makes no practical difference for throttling logic to execute next block. - // By doing this, we assure that all leading vsc matured packets were handled before any slash packets. - if vscMaturedHandledThisBlock >= vscMaturedHandledPerBlockLimit { - return - } - - // Obtain all global slash entries, where only some of them may be handled in this method, - // depending on the value of the slash meter. - allEntries := k.GetAllGlobalSlashEntries(ctx) - handledEntries := []providertypes.GlobalSlashEntry{} - - for _, globalEntry := range allEntries { - // Subtract voting power that will be jailed/tombstoned from the slash meter - providerAddr := providertypes.NewProviderConsAddress(globalEntry.ProviderValConsAddr) - meter = meter.Sub(k.GetEffectiveValPower(ctx, providerAddr)) - - // Handle one slash and any trailing vsc matured packet data instances by passing in - // chainID and appropriate callbacks, relevant packet data is deleted in this method. - - k.HandlePacketDataForChain(ctx, globalEntry.ConsumerChainID, k.HandleSlashPacket, k.HandleVSCMaturedPacket, vscMaturedHandledThisBlock) - handledEntries = append(handledEntries, globalEntry) - - // don't handle any more global entries if meter becomes negative in value - if meter.IsNegative() { - k.Logger(ctx).Info("negative slash meter value, no more slash packets will be handled", "meter", meter.Int64()) - break - } - } - - // Handled global entries are deleted after iteration is completed - k.DeleteGlobalSlashEntries(ctx, handledEntries...) - - // Persist current value for slash meter - k.SetSlashMeter(ctx, meter) - - if len(handledEntries) > 0 { - k.Logger(ctx).Info("handled global slash entries", "count", len(handledEntries), "meter", meter.Int64()) - } -} - // Obtains the effective validator power relevant to a validator consensus address. func (k Keeper) GetEffectiveValPower(ctx sdktypes.Context, valConsAddr providertypes.ProviderConsAddress, @@ -87,41 +31,6 @@ func (k Keeper) GetEffectiveValPower(ctx sdktypes.Context, } } -// HandlePacketDataForChain handles only the first queued slash packet relevant to the passed consumer chainID, -// and then handles any trailing vsc matured packets in that (consumer chain specific) throttled packet data queue. -// The handled data is then deleted from the queue. -// -// Note: Any packet data which is handled in this method is also deleted from the (consumer chain specific) queue. -func (k Keeper) HandlePacketDataForChain(ctx sdktypes.Context, consumerChainID string, - slashPacketHandler func(sdktypes.Context, string, ccvtypes.SlashPacketData), - vscMaturedPacketHandler func(sdktypes.Context, string, ccvtypes.VSCMaturedPacketData), - vscMaturedHandledThisBlock int, -) { - // Get slash packet data and trailing vsc matured packet data, handle it all. - slashFound, slashData, vscMaturedData, seqNums := k.GetSlashAndTrailingData(ctx, consumerChainID) - seqNumsHandled := []uint64{} - if slashFound { - slashPacketHandler(ctx, consumerChainID, slashData) - // Due to HandleLeadingVSCMaturedPackets() running before HandleThrottleQueues(), and the fact that - // HandleThrottleQueues() will return until all leading vsc matured have been handled, a slash packet - // should always be the first packet in the queue. So we can safely append the first seqNum here. - seqNumsHandled = append(seqNumsHandled, seqNums[0]) - } - for idx, vscMData := range vscMaturedData { - if vscMaturedHandledThisBlock >= vscMaturedHandledPerBlockLimit { - // Break from for-loop, DeleteThrottledPacketData will still be called for this consumer - break - } - vscMaturedPacketHandler(ctx, consumerChainID, vscMData) - vscMaturedHandledThisBlock++ - // Append seq num for this vsc matured packet - seqNumsHandled = append(seqNumsHandled, seqNums[idx+1]) // Note idx+1, since slash packet is at index 0 - } - - // Delete handled data after it has all been handled. - k.DeleteThrottledPacketData(ctx, consumerChainID, seqNumsHandled...) -} - // InitializeSlashMeter initializes the slash meter to it's max value (also its allowance), // and sets the replenish time candidate to one replenish period from current block time. func (k Keeper) InitializeSlashMeter(ctx sdktypes.Context) { @@ -206,353 +115,6 @@ func (k Keeper) GetSlashMeterAllowance(ctx sdktypes.Context) math.Int { return roundedInt } -// -// CRUD section -// - -// QueueGlobalSlashEntry queues an entry to the "global" slash packet queue, used for throttling val power changes -// related to jailing/tombstoning over time. This "global" queue is used to coordinate the order of slash packet handling -// between chains, whereas the chain-specific queue is used to coordinate the order of slash and vsc matured packets -// relevant to each chain. -func (k Keeper) QueueGlobalSlashEntry(ctx sdktypes.Context, entry providertypes.GlobalSlashEntry) { - store := ctx.KVStore(k.storeKey) - key := providertypes.GlobalSlashEntryKey(entry) - bz := entry.ProviderValConsAddr - store.Set(key, bz) -} - -// DeleteGlobalSlashEntriesForConsumer deletes all pending slash packet entries in the global queue, -// only relevant to a single consumer. -func (k Keeper) DeleteGlobalSlashEntriesForConsumer(ctx sdktypes.Context, consumerChainID string) { - allEntries := k.GetAllGlobalSlashEntries(ctx) - entriesToDel := []providertypes.GlobalSlashEntry{} - - for _, entry := range allEntries { - if entry.ConsumerChainID == consumerChainID { - entriesToDel = append(entriesToDel, entry) - } - } - k.DeleteGlobalSlashEntries(ctx, entriesToDel...) -} - -// GetAllGlobalSlashEntries returns all global slash entries from the queue. -// -// Note global slash entries are stored under keys with the following format: -// GlobalSlashEntryBytePrefix | uint64 recv time | ibc seq num | consumer chain id -// Thus, the returned array is ordered by recv time, then ibc seq num. -func (k Keeper) GetAllGlobalSlashEntries(ctx sdktypes.Context) []providertypes.GlobalSlashEntry { - store := ctx.KVStore(k.storeKey) - iterator := sdktypes.KVStorePrefixIterator(store, []byte{providertypes.GlobalSlashEntryBytePrefix}) - defer iterator.Close() - - entries := []providertypes.GlobalSlashEntry{} - - for ; iterator.Valid(); iterator.Next() { - // MustParseGlobalSlashEntryKey should not panic, since we should be iterating over keys that're - // assumed to be correctly serialized in QueueGlobalSlashEntry. - recvTime, chainID, ibcSeqNum := providertypes.MustParseGlobalSlashEntryKey(iterator.Key()) - valAddr := providertypes.NewProviderConsAddress(iterator.Value()) - entry := providertypes.NewGlobalSlashEntry(recvTime, chainID, ibcSeqNum, valAddr) - entries = append(entries, entry) - } - return entries -} - -// DeleteGlobalSlashEntries deletes the given global entries from the global slash queue -func (k Keeper) DeleteGlobalSlashEntries(ctx sdktypes.Context, entries ...providertypes.GlobalSlashEntry) { - store := ctx.KVStore(k.storeKey) - for _, entry := range entries { - store.Delete(providertypes.GlobalSlashEntryKey(entry)) - } -} - -// Pending packet data type enum, used to encode the type of packet data stored at each entry in the mutual queue. -const ( - slashPacketData byte = iota - vscMaturedPacketData -) - -// GetThrottledPacketDataSize returns the size of the throttled packet data queue for the given consumer chain -func (k Keeper) GetThrottledPacketDataSize(ctx sdktypes.Context, consumerChainID string) uint64 { - store := ctx.KVStore(k.storeKey) - key := providertypes.ThrottledPacketDataSizeKey(consumerChainID) - var size uint64 - bz := store.Get(key) - if bz == nil { - size = 0 - } else { - size = sdktypes.BigEndianToUint64(bz) - } - return size -} - -// SetThrottledPacketDataSize sets the size of the throttled packet data queue for the given consumer chain -func (k Keeper) SetThrottledPacketDataSize(ctx sdktypes.Context, consumerChainID string, size uint64) { - // Sanity check to ensure that the chain-specific throttled packet data queue does not grow too - // large for a single consumer chain. This check ensures that binaries would panic deterministically - // if the queue does grow too large. MaxThrottledPackets should be set accordingly (quite large). - if size >= uint64(k.GetMaxThrottledPackets(ctx)) { - panic(fmt.Sprintf("throttled packet data queue for chain %s is too large: %d", consumerChainID, size)) - } - - store := ctx.KVStore(k.storeKey) - key := providertypes.ThrottledPacketDataSizeKey(consumerChainID) - bz := sdktypes.Uint64ToBigEndian(size) - store.Set(key, bz) -} - -// IncrementThrottledPacketDataSize increments the size of the throttled packet data -// queue for the given consumer chain. -func (k Keeper) IncrementThrottledPacketDataSize(ctx sdktypes.Context, consumerChainID string) { - size := k.GetThrottledPacketDataSize(ctx, consumerChainID) - k.SetThrottledPacketDataSize(ctx, consumerChainID, size+1) - k.Logger(ctx).Debug("incremented throttled packets size", - "chainID", consumerChainID, - "size", size+1, - ) -} - -// QueueThrottledSlashPacketData queues the slash packet data for a chain-specific throttled packet data queue. -// -// Note: This queue is shared between pending slash packet data and pending vsc matured packet data. -func (k Keeper) QueueThrottledSlashPacketData( - ctx sdktypes.Context, consumerChainID string, ibcSeqNum uint64, data ccvtypes.SlashPacketData, -) error { - return k.QueueThrottledPacketData(ctx, consumerChainID, ibcSeqNum, data) -} - -// QueueThrottledVSCMaturedPacketData queues the vsc matured packet data for a chain-specific throttled packet data queue. -// -// Note: This queue is shared between pending slash packet data and pending vsc matured packet data. -func (k Keeper) QueueThrottledVSCMaturedPacketData( - ctx sdktypes.Context, consumerChainID string, ibcSeqNum uint64, data ccvtypes.VSCMaturedPacketData, -) error { - return k.QueueThrottledPacketData(ctx, consumerChainID, ibcSeqNum, data) -} - -// QueueThrottledPacketData queues a slash packet data or vsc matured packet data instance -// for the given consumer chain's queue. -// -// Note: This method returns an error because it is called from -// OnRecvSlashPacket and OnRecvVSCMaturedPacket, meaning we can return an ibc err ack to the -// counter party chain on error, instead of panicking this chain. -func (k Keeper) QueueThrottledPacketData( - ctx sdktypes.Context, consumerChainID string, ibcSeqNum uint64, packetData interface{}, -) error { - store := ctx.KVStore(k.storeKey) - - var bz []byte - var err error - switch data := packetData.(type) { - case ccvtypes.SlashPacketData: - bz, err = data.Marshal() - if err != nil { - return fmt.Errorf("failed to marshal slash packet data: %v", err) - } - bz = append([]byte{slashPacketData}, bz...) - case ccvtypes.VSCMaturedPacketData: - bz, err = data.Marshal() - if err != nil { - return fmt.Errorf("failed to marshal vsc matured packet data: %v", err) - } - bz = append([]byte{vscMaturedPacketData}, bz...) - default: - // Indicates a developer error, this method should only be called - // by tests, QueueThrottledSlashPacketData, or QueueThrottledVSCMaturedPacketData. - panic(fmt.Sprintf("unexpected packet data type: %T", data)) - } - - store.Set(providertypes.ThrottledPacketDataKey(consumerChainID, ibcSeqNum), bz) - k.IncrementThrottledPacketDataSize(ctx, consumerChainID) - return nil -} - -// GetLeadingVSCMaturedData returns the leading vsc matured packet data instances -// for a chain-specific throttled packet data queue. Ie the vsc matured packet data instances -// that do not have any slash packet data instances preceding them in the queue for consumerChainID. -func (k Keeper) GetLeadingVSCMaturedData(ctx sdktypes.Context, consumerChainID string) ( - vscMaturedData []ccvtypes.VSCMaturedPacketData, ibcSeqNums []uint64, -) { - store := ctx.KVStore(k.storeKey) - iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) - iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) - defer iterator.Close() - - // Iterate over the throttled packet data queue, - // and return vsc matured packet data instances until we encounter a slash packet data instance. - vscMaturedData = []ccvtypes.VSCMaturedPacketData{} - ibcSeqNums = []uint64{} - for ; iterator.Valid(); iterator.Next() { - - bz := iterator.Value() - if bz[0] == slashPacketData { - break - } else if bz[0] != vscMaturedPacketData { - // This case would indicate a developer error or store corruption, - // since QueueThrottledPacketData should only queue slash packet data or vsc matured packet data. - panic(fmt.Sprintf("unexpected packet data type: %d", bz[0])) - } - - var data ccvtypes.VSCMaturedPacketData - err := data.Unmarshal(bz[1:]) - if err != nil { - // An error here would indicate something is very wrong, - // vsc matured packet data is assumed to be correctly serialized in QueueThrottledPacketData. - panic(fmt.Sprintf("failed to unmarshal vsc matured packet data: %v", err)) - } - - vscMaturedData = append(vscMaturedData, data) - // The below func should not panic, since we should be iterating over keys that're - // assumed to be correctly serialized in QueueThrottledPacketData. - _, ibcSeqNum := providertypes.MustParseThrottledPacketDataKey(iterator.Key()) - ibcSeqNums = append(ibcSeqNums, ibcSeqNum) - } - return vscMaturedData, ibcSeqNums -} - -// GetSlashAndTrailingData returns the first slash packet data instance and any -// trailing vsc matured packet data instances in the chain-specific throttled packet data queue. -// -// Note that throttled packet data is stored under keys with the following format: -// ThrottledPacketDataBytePrefix | len(chainID) | chainID | ibcSeqNum -// Thus, the returned array is in ascending order of ibc seq numbers. -func (k Keeper) GetSlashAndTrailingData(ctx sdktypes.Context, consumerChainID string) ( - slashFound bool, slashData ccvtypes.SlashPacketData, vscMaturedData []ccvtypes.VSCMaturedPacketData, - // Note: this slice contains the IBC sequence numbers of the slash packet data - // and trailing vsc matured packet data instances. This is used by caller to delete the - // data after it has been handled. - ibcSeqNums []uint64, -) { - store := ctx.KVStore(k.storeKey) - iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) - iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) - defer iterator.Close() - - slashFound = false - slashData = ccvtypes.SlashPacketData{} - vscMaturedData = []ccvtypes.VSCMaturedPacketData{} - ibcSeqNums = []uint64{} - - for ; iterator.Valid(); iterator.Next() { - - bz := iterator.Value() - if bz[0] == slashPacketData { - if slashFound { - // Break for-loop, we've already found first slash packet data instance. - break - } else { - if err := slashData.Unmarshal(bz[1:]); err != nil { - // An error here would indicate something is very wrong, - // slash packet data is assumed to be correctly serialized in QueueThrottledPacketData. - panic(fmt.Sprintf("failed to unmarshal slash packet data: %v", err)) - } - slashFound = true - } - } else if bz[0] == vscMaturedPacketData { - vscMData := ccvtypes.VSCMaturedPacketData{} - if err := vscMData.Unmarshal(bz[1:]); err != nil { - // An error here would indicate something is very wrong, - // vsc matured packet data is assumed to be correctly serialized in QueueThrottledPacketData. - panic(fmt.Sprintf("failed to unmarshal vsc matured packet data: %v", err)) - } - vscMaturedData = append(vscMaturedData, vscMData) - } else { - // This case would indicate a developer error or store corruption, - // since QueueThrottledPacketData should only queue slash packet data or vsc matured packet data. - panic("invalid packet data type") - } - // The below func should not panic, since we should be iterating over keys that're - // assumed to be correctly serialized in QueueThrottledPacketData. - _, ibcSeqNum := providertypes.MustParseThrottledPacketDataKey(iterator.Key()) - ibcSeqNums = append(ibcSeqNums, ibcSeqNum) - } - return slashFound, slashData, vscMaturedData, ibcSeqNums -} - -// GetAllThrottledPacketData returns all throttled packet data for a specific consumer chain. -// -// Note: This method is only used by tests and queries, hence why it returns redundant data as different types. -// Since this method executes on query, no panics are explicitly included. -func (k Keeper) GetAllThrottledPacketData(ctx sdktypes.Context, consumerChainID string) ( - slashData []ccvtypes.SlashPacketData, vscMaturedData []ccvtypes.VSCMaturedPacketData, - rawOrderedData []interface{}, ibcSeqNums []uint64, -) { - slashData = []ccvtypes.SlashPacketData{} - vscMaturedData = []ccvtypes.VSCMaturedPacketData{} - rawOrderedData = []interface{}{} - ibcSeqNums = []uint64{} - - store := ctx.KVStore(k.storeKey) - iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) - iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - bz := iterator.Value() - switch bz[0] { - case slashPacketData: - d := ccvtypes.SlashPacketData{} - if err := d.Unmarshal(bz[1:]); err != nil { - k.Logger(ctx).Error(fmt.Sprintf("failed to unmarshal slash packet data: %v", err)) - continue - } - slashData = append(slashData, d) - rawOrderedData = append(rawOrderedData, d) - case vscMaturedPacketData: - d := ccvtypes.VSCMaturedPacketData{} - if err := d.Unmarshal(bz[1:]); err != nil { - k.Logger(ctx).Error(fmt.Sprintf("failed to unmarshal vsc matured packet data: %v", err)) - continue - } - vscMaturedData = append(vscMaturedData, d) - rawOrderedData = append(rawOrderedData, d) - default: - k.Logger(ctx).Error(fmt.Sprintf("invalid packet data type: %v", bz[0])) - continue - } - _, ibcSeqNum, err := providertypes.ParseThrottledPacketDataKey(iterator.Key()) - if err != nil { - k.Logger(ctx).Error(fmt.Sprintf("failed to parse throttled packet data key: %v", err)) - continue - } - ibcSeqNums = append(ibcSeqNums, ibcSeqNum) - } - - return slashData, vscMaturedData, rawOrderedData, ibcSeqNums -} - -// DeleteAllPacketDataForConsumer deletes all queued packet data for the given consumer chain. -func (k Keeper) DeleteThrottledPacketDataForConsumer(ctx sdktypes.Context, consumerChainID string) { - store := ctx.KVStore(k.storeKey) - iteratorPrefix := providertypes.ChainIdWithLenKey(providertypes.ThrottledPacketDataBytePrefix, consumerChainID) - iterator := sdktypes.KVStorePrefixIterator(store, iteratorPrefix) - defer iterator.Close() - - keysToDel := [][]byte{} - for ; iterator.Valid(); iterator.Next() { - keysToDel = append(keysToDel, iterator.Key()) - } - // Delete data for this consumer - for _, key := range keysToDel { - store.Delete(key) - } - - // Delete size of data queue for this consumer - store.Delete(providertypes.ThrottledPacketDataSizeKey(consumerChainID)) -} - -// DeleteThrottledPacketData deletes the given throttled packet data instances -// (specified by their ibc seq number) from the chain-specific throttled packet data queue. -func (k Keeper) DeleteThrottledPacketData(ctx sdktypes.Context, consumerChainID string, ibcSeqNumbers ...uint64) { - store := ctx.KVStore(k.storeKey) - for _, ibcSeqNum := range ibcSeqNumbers { - store.Delete(providertypes.ThrottledPacketDataKey(consumerChainID, ibcSeqNum)) - } - // Decrement the size of the pending packet data queue - sizeBeforeDeletion := k.GetThrottledPacketDataSize(ctx, consumerChainID) - k.SetThrottledPacketDataSize(ctx, consumerChainID, sizeBeforeDeletion-uint64(len(ibcSeqNumbers))) -} - // GetSlashMeter returns a meter (persisted as a signed int) which stores an amount of voting power, corresponding // to an allowance of validators that can be jailed/tombstoned over time. // diff --git a/x/ccv/provider/keeper/throttle_test.go b/x/ccv/provider/keeper/throttle_test.go index a5356b0dc0..24e8c0ddde 100644 --- a/x/ccv/provider/keeper/throttle_test.go +++ b/x/ccv/provider/keeper/throttle_test.go @@ -1,13 +1,11 @@ package keeper_test import ( - "math/rand" "testing" "time" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" - "golang.org/x/exp/slices" "cosmossdk.io/math" @@ -15,168 +13,10 @@ import ( tmtypes "github.com/cometbft/cometbft/types" - cryptoutil "github.com/cosmos/interchain-security/v3/testutil/crypto" testkeeper "github.com/cosmos/interchain-security/v3/testutil/keeper" - "github.com/cosmos/interchain-security/v3/x/ccv/provider/keeper" providertypes "github.com/cosmos/interchain-security/v3/x/ccv/provider/types" - ccvtypes "github.com/cosmos/interchain-security/v3/x/ccv/types" ) -// TestHandlePacketDataForChain tests the HandlePacketDataForChain function. Note: Only one consumer is tested here, -// but multiple consumers are tested in TestPendingPacketData. -func TestHandlePacketDataForChain(t *testing.T) { - testCases := []struct { - name string - chainID string - // Pending packet data that will be queued in the order specified by the slice - dataToQueue []interface{} - // Indexes of packet data from dataToQueue that are expected to be handled and deleted from store - expectedHandledIndexes []int - }{ - { - "no packets", - "my-cool-chain", - []interface{}{}, - []int{}, - }, - { - "one slash packet should be handled", - "chain-37", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - }, - []int{0}, - }, - { - "one slash packet followed by one vsc matured packet should all be handled", - "chain-222", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - }, - []int{0, 1}, - }, - { - "one slash packet followed by multiple vsc matured packets should all be handled", - "chain-2223", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - }, - []int{0, 1, 2, 3, 4, 5}, - }, - { - "multiple slash packets followed by multiple vsc matured packets should only handle first slash packet", - "chain-9", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - }, - []int{0}, - }, - { - "vsc matured packets sandwiched between slash packets should handle everything but the last slash packet", - "chain-000", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewSlashPacketData(), // 10th index not included in expectedHandledIndexes - }, - []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - }, - { - "alternating slash and vsc matured packets should handle only the first slash, and trailing vsc matured packets", - "chain-00000", - []interface{}{ - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - testkeeper.GetNewSlashPacketData(), - testkeeper.GetNewVSCMaturedPacketData(), - }, - []int{0, 1, 2}, - }, - } - - for _, tc := range testCases { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - // Queue throttled packet data, where chainID is arbitrary, and ibc seq number is index of the data instance - for i, data := range tc.dataToQueue { - err := providerKeeper.QueueThrottledPacketData(ctx, tc.chainID, uint64(i), data) - require.NoError(t, err) - } - - // Define our handler callbacks to simply store the data instances that are handled - handledData := []interface{}{} - slashHandleCounter := func(ctx sdktypes.Context, chainID string, data ccvtypes.SlashPacketData) { - handledData = append(handledData, data) - } - vscMaturedHandleCounter := func(ctx sdktypes.Context, chainID string, data ccvtypes.VSCMaturedPacketData) { - handledData = append(handledData, data) - } - - providerKeeper.HandlePacketDataForChain(ctx, tc.chainID, slashHandleCounter, vscMaturedHandleCounter, 0) - - // Assert number of handled data instances matches expected number - require.Equal(t, len(tc.expectedHandledIndexes), len(handledData)) - - // Assert handled data instances match expected value - for i, expectedIndex := range tc.expectedHandledIndexes { - require.Equal(t, tc.dataToQueue[expectedIndex], handledData[i]) - } - - // Sanity check, Assert that only the first handled packet is a slash packet, and the rest are vsc matured packets - for idx, instance := range handledData { - switch instance.(type) { - case ccvtypes.SlashPacketData: - require.Equal(t, 0, idx) - case ccvtypes.VSCMaturedPacketData: - default: - require.Fail(t, "unexpected data instance type") - } - } - - // Assert that the unhandled queued data instances are as expected (i.e no unexpected deletions) - expectedDataThatsLeft := []interface{}{} - for idx, data := range tc.dataToQueue { - if !slices.Contains(tc.expectedHandledIndexes, idx) { - expectedDataThatsLeft = append(expectedDataThatsLeft, data) - } - } - - _, _, dataThatsLeft, _ := providerKeeper.GetAllThrottledPacketData(ctx, tc.chainID) - require.Equal(t, expectedDataThatsLeft, dataThatsLeft) - - // Assert that each instance of handled data is deleted from the persisted queue (i.e deletions where expected) - for _, dataInstance := range handledData { - require.NotContains(t, dataThatsLeft, dataInstance) - } - } -} - // TestSlashMeterReplenishment tests the CheckForSlashMeterReplenishment, ReplenishSlashMeter, // and InitializeSlashMeter methods. func TestSlashMeterReplenishment(t *testing.T) { @@ -627,628 +467,6 @@ func TestGetSlashMeterAllowance(t *testing.T) { } } -// TestGlobalSlashEntries tests the queue and iteration functions for global slash entries, -// with assertion of FIFO ordering -func TestGlobalSlashEntries(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // Consistent time for "now" - now := time.Now().UTC() - - globalEntries := providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 0, len(globalEntries)) - - // Queue 3 entries for chainIDs 0, 1, 2, note their respective ibc seq nums are - // ordered differently than the chainIDs would be iterated. - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Local(), "chain-0", 15, cryptoutil.NewCryptoIdentityFromIntSeed(10).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Local(), "chain-1", 10, cryptoutil.NewCryptoIdentityFromIntSeed(11).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Local(), "chain-2", 5, cryptoutil.NewCryptoIdentityFromIntSeed(12).ProviderConsAddress())) - - globalEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 3, len(globalEntries)) - - // Queue 3 entries for chainIDs 0, 1, 2 an hour later, with incremented ibc seq nums - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Add(time.Hour).Local(), "chain-0", 16, // should appear last for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(20).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Add(time.Hour).Local(), "chain-1", 11, // should appear middle for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(21).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, providertypes.NewGlobalSlashEntry( - now.Add(time.Hour).Local(), "chain-2", 6, // should appear first for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(22).ProviderConsAddress())) - - // Retrieve entries from store - globalEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 6, len(globalEntries)) - - // Assert that entries are obtained in FIFO order according to block time, then ibc seq num - require.Equal(t, "chain-2", globalEntries[0].ConsumerChainID) - require.Equal(t, "chain-1", globalEntries[1].ConsumerChainID) - require.Equal(t, "chain-0", globalEntries[2].ConsumerChainID) - require.Equal(t, "chain-2", globalEntries[3].ConsumerChainID) - require.Equal(t, "chain-1", globalEntries[4].ConsumerChainID) - require.Equal(t, "chain-0", globalEntries[5].ConsumerChainID) - - // Queue 3 entries for chainIDs 5, 6, 7 another hour later - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(now.Add(2*time.Hour).Local(), "chain-5", 50, // should appear middle for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(96).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(now.Add(2*time.Hour).Local(), "chain-6", 60, // should appear last for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(97).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(now.Add(2*time.Hour).Local(), "chain-7", 40, // should appear first for this recv time - cryptoutil.NewCryptoIdentityFromIntSeed(98).ProviderConsAddress())) - // Retrieve entries from store - globalEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 9, len(globalEntries)) - - // Assert that entries are obtained in FIFO order according to block time, then ibc seq num - require.Equal(t, "chain-2", globalEntries[0].ConsumerChainID) - require.Equal(t, "chain-1", globalEntries[1].ConsumerChainID) - require.Equal(t, "chain-0", globalEntries[2].ConsumerChainID) - require.Equal(t, "chain-2", globalEntries[3].ConsumerChainID) - require.Equal(t, "chain-1", globalEntries[4].ConsumerChainID) - require.Equal(t, "chain-0", globalEntries[5].ConsumerChainID) - require.Equal(t, "chain-7", globalEntries[6].ConsumerChainID) - require.Equal(t, "chain-5", globalEntries[7].ConsumerChainID) - require.Equal(t, "chain-6", globalEntries[8].ConsumerChainID) - - // Assert each field is as expected for all 9 entries - require.Equal(t, uint64(5), globalEntries[0].IbcSeqNum) - require.Equal(t, uint64(10), globalEntries[1].IbcSeqNum) - require.Equal(t, uint64(15), globalEntries[2].IbcSeqNum) - require.Equal(t, uint64(6), globalEntries[3].IbcSeqNum) - require.Equal(t, uint64(11), globalEntries[4].IbcSeqNum) - require.Equal(t, uint64(16), globalEntries[5].IbcSeqNum) - require.Equal(t, uint64(40), globalEntries[6].IbcSeqNum) - require.Equal(t, uint64(50), globalEntries[7].IbcSeqNum) - require.Equal(t, uint64(60), globalEntries[8].IbcSeqNum) - - require.Equal(t, now, globalEntries[0].RecvTime) - require.Equal(t, now, globalEntries[1].RecvTime) - require.Equal(t, now, globalEntries[2].RecvTime) - require.Equal(t, now.Add(time.Hour).UTC(), globalEntries[3].RecvTime) - require.Equal(t, now.Add(time.Hour).UTC(), globalEntries[4].RecvTime) - require.Equal(t, now.Add(time.Hour).UTC(), globalEntries[5].RecvTime) - require.Equal(t, now.Add(2*time.Hour).UTC(), globalEntries[6].RecvTime) - require.Equal(t, now.Add(2*time.Hour).UTC(), globalEntries[7].RecvTime) - require.Equal(t, now.Add(2*time.Hour).UTC(), globalEntries[8].RecvTime) -} - -// Tests DeleteGlobalSlashEntriesForConsumer. -func TestDeleteGlobalSlashEntriesForConsumer(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx( - t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // Queue 2 global entries for a consumer chain ID - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(time.Now().Add(time.Hour), "chain-78", 1, - cryptoutil.NewCryptoIdentityFromIntSeed(78).ProviderConsAddress())) - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(time.Now().Add(time.Hour), "chain-78", 2, - cryptoutil.NewCryptoIdentityFromIntSeed(79).ProviderConsAddress())) - - // Queue 1 global entry for two other consumer chain IDs - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(time.Now().Add(2*time.Hour), "chain-79", 1, - cryptoutil.NewCryptoIdentityFromIntSeed(80).ProviderConsAddress())) - - providerKeeper.QueueGlobalSlashEntry(ctx, - providertypes.NewGlobalSlashEntry(time.Now().Add(3*time.Hour), "chain-80", 1, - cryptoutil.NewCryptoIdentityFromIntSeed(81).ProviderConsAddress())) - - // Delete entries for chain-78, confirm those are deleted, and the other two remain - providerKeeper.DeleteGlobalSlashEntriesForConsumer(ctx, "chain-78") - allEntries := providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 2, len(allEntries)) - require.Equal(t, "chain-79", allEntries[0].ConsumerChainID) - require.Equal(t, "chain-80", allEntries[1].ConsumerChainID) -} - -// TestGlobalSlashEntryDeletion tests the deletion function for -// global slash entries with assertion of FIFO ordering. -func TestGlobalSlashEntryDeletion(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - now := time.Now() - - entries := providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 0, len(entries)) - - providerConsAddrs := []providertypes.ProviderConsAddress{ - cryptoutil.NewCryptoIdentityFromIntSeed(1).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(2).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(3).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(4).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(5).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(6).ProviderConsAddress(), - cryptoutil.NewCryptoIdentityFromIntSeed(7).ProviderConsAddress(), - } - - // Instantiate entries in the expected order we wish to get them back as (ordered by recv time) - entries = []providertypes.GlobalSlashEntry{} - entries = append(entries, providertypes.NewGlobalSlashEntry(now, "chain-0", 1, providerConsAddrs[0])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(time.Hour).UTC(), "chain-1", 178, providerConsAddrs[1])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(2*time.Hour).Local(), "chain-2", 89, providerConsAddrs[2])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(3*time.Hour).In(time.FixedZone("UTC-8", -8*60*60)), "chain-3", 23423, providerConsAddrs[3])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(4*time.Hour).Local(), "chain-4", 323, providerConsAddrs[4])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(5*time.Hour).UTC(), "chain-5", 18, providerConsAddrs[5])) - entries = append(entries, providertypes.NewGlobalSlashEntry(now.Add(6*time.Hour).Local(), "chain-6", 2, providerConsAddrs[6])) - - // Instantiate shuffled copy of above slice - shuffledEntries := append([]providertypes.GlobalSlashEntry{}, entries...) - seed := time.Now().UnixNano() - rng := rand.New(rand.NewSource(seed)) - rng.Shuffle(len(shuffledEntries), func(i, j int) { - shuffledEntries[i], shuffledEntries[j] = shuffledEntries[j], shuffledEntries[i] - }) - - // Queue 7 slash packets with various block times in random order - for _, entry := range shuffledEntries { - providerKeeper.QueueGlobalSlashEntry(ctx, entry) - } - - gotEntries := providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 7, len(gotEntries)) - - // Assert obtained order is decided upon via packet recvTime, not insertion order - for i, gotEntry := range gotEntries { - expectedEntry := entries[i] - require.Equal(t, expectedEntry, gotEntry) - } - - // Confirm no mutations have occurred from test helper - gotEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 7, len(gotEntries)) - - // Delete packets 1, 3, 5 (0-indexed) - providerKeeper.DeleteGlobalSlashEntries(ctx, gotEntries[1], gotEntries[3], gotEntries[5]) - - // Assert deletion and ordering - gotEntries = providerKeeper.GetAllGlobalSlashEntries(ctx) - require.Equal(t, 4, len(gotEntries)) - require.Equal(t, "chain-0", gotEntries[0].ConsumerChainID) - // entry 1 was deleted - require.Equal(t, "chain-2", gotEntries[1].ConsumerChainID) - // entry 3 was deleted - require.Equal(t, "chain-4", gotEntries[2].ConsumerChainID) - // entry 5 was deleted - require.Equal(t, "chain-6", gotEntries[3].ConsumerChainID) -} - -// TestThrottledPacketData tests chain-specific throttled packet data queuing, -// iteration and deletion functionality. -func TestThrottledPacketData(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - packetDataForMultipleConsumers := []struct { - chainID string - instances []throttledPacketDataInstance - - // Expected order of data instances after retrieval from store, before deletion (specified by instance index) - expectedOrder []int - // Data instances to delete (specified by instance index) - toDelete []int - // Expected order of data instances after deletion (specified by instance index) - expectedOrderAfterDeletion []int - }{ - // Note, duplicate ibc sequence numbers are not tested, as we assume ibc behaves correctly - { - chainID: "chain-0", - instances: []throttledPacketDataInstance{ - {IbcSeqNum: 0, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 1, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 2, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 3, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 4, Data: testkeeper.GetNewSlashPacketData()}, - }, - expectedOrder: []int{0, 1, 2, 3, 4}, - toDelete: []int{0, 2, 4}, - expectedOrderAfterDeletion: []int{1, 3}, - }, - { - chainID: "chain-7", - instances: []throttledPacketDataInstance{ - {IbcSeqNum: 96, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 78, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 12, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 0, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 1, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 78972, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 9999999999999999999, Data: testkeeper.GetNewSlashPacketData()}, - }, - expectedOrder: []int{3, 4, 2, 1, 0, 5, 6}, - toDelete: []int{0, 1, 2, 3, 4, 5}, - expectedOrderAfterDeletion: []int{6}, - }, - { - chainID: "chain-thats-not-0-or-7", - instances: []throttledPacketDataInstance{ - {IbcSeqNum: 9, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 8, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 7, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 6, Data: testkeeper.GetNewSlashPacketData()}, - {IbcSeqNum: 5, Data: testkeeper.GetNewVSCMaturedPacketData()}, - {IbcSeqNum: 1, Data: testkeeper.GetNewVSCMaturedPacketData()}, - }, - expectedOrder: []int{5, 4, 3, 2, 1, 0}, - toDelete: []int{1, 2, 3, 4, 5}, - expectedOrderAfterDeletion: []int{0}, - }, - } - - // Queue all packet data at once - for _, chainData := range packetDataForMultipleConsumers { - for _, dataInstance := range chainData.instances { - err := providerKeeper.QueueThrottledPacketData(ctx, chainData.chainID, dataInstance.IbcSeqNum, dataInstance.Data) - require.NoError(t, err) - } - } - - // Assert retrieval ordering for each chain - for _, chainData := range packetDataForMultipleConsumers { - expectedInstances := getOrderedInstances(chainData.instances, chainData.expectedOrder) - assertPendingPacketDataOrdering(t, &providerKeeper, ctx, chainData.chainID, expectedInstances) - } - - // Delete specified data all at once - for _, chainData := range packetDataForMultipleConsumers { - for _, i := range chainData.toDelete { - providerKeeper.DeleteThrottledPacketData(ctx, chainData.chainID, chainData.instances[i].IbcSeqNum) - } - } - - // Assert retrieval ordering after deletion for each chain - for _, chainData := range packetDataForMultipleConsumers { - expectedInstances := getOrderedInstances(chainData.instances, chainData.expectedOrderAfterDeletion) - assertPendingPacketDataOrdering(t, &providerKeeper, ctx, chainData.chainID, expectedInstances) - } -} - -func TestGetLeadingVSCMaturedData(t *testing.T) { - // Instantiate some sample data - slashData := getTenSampleSlashPacketData() - vscMaturedData := getTenSampleVSCMaturedPacketData() - - testCases := []struct { - name string - dataToQueue []throttledPacketDataInstance - expectedReturnData []ccvtypes.VSCMaturedPacketData - expectedReturnSeqs []uint64 - }{ - { - name: "no data", - dataToQueue: []throttledPacketDataInstance{}, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{}, - expectedReturnSeqs: []uint64{}, - }, - { - name: "one slash", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 889, Data: slashData[0]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{}, - expectedReturnSeqs: []uint64{}, - }, - { - name: "one vsc matured", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 54, Data: vscMaturedData[0]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{vscMaturedData[0]}, - expectedReturnSeqs: []uint64{54}, - }, - { - name: "one vsc matured trailing one slash", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 87, Data: slashData[0]}, - {IbcSeqNum: 88, Data: vscMaturedData[0]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{}, // Nothing returned - expectedReturnSeqs: []uint64{}, // Nothing returned - }, - { - name: "one vsc matured trailing multiple slash", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 87, Data: slashData[0]}, - {IbcSeqNum: 88, Data: slashData[1]}, - {IbcSeqNum: 89, Data: slashData[2]}, - {IbcSeqNum: 90, Data: vscMaturedData[0]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{}, // Nothing returned - expectedReturnSeqs: []uint64{}, // Nothing returned - }, - { - name: "one vsc matured leading multiple slash", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 87, Data: vscMaturedData[0]}, - {IbcSeqNum: 88, Data: slashData[0]}, - {IbcSeqNum: 89, Data: slashData[1]}, - {IbcSeqNum: 90, Data: slashData[2]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{vscMaturedData[0]}, - expectedReturnSeqs: []uint64{87}, - }, - { - name: "multiple vsc matured leading multiple slash", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 102, Data: vscMaturedData[0]}, - {IbcSeqNum: 103, Data: vscMaturedData[1]}, - {IbcSeqNum: 104, Data: vscMaturedData[2]}, - {IbcSeqNum: 105, Data: slashData[0]}, - {IbcSeqNum: 106, Data: slashData[1]}, - {IbcSeqNum: 107, Data: slashData[2]}, - }, - expectedReturnData: []ccvtypes.VSCMaturedPacketData{vscMaturedData[0], vscMaturedData[1], vscMaturedData[2]}, - expectedReturnSeqs: []uint64{102, 103, 104}, - }, - } - - for _, tc := range testCases { - - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - // Queue a slash and vsc matured packet data for some random chain. - // These values should never be returned. - err := providerKeeper.QueueThrottledSlashPacketData(ctx, "some-rando-chain", 77, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "some-rando-chain", 97, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - - // Queue the data to test against - for _, dataInstance := range tc.dataToQueue { - err := providerKeeper.QueueThrottledPacketData(ctx, "chain-99", dataInstance.IbcSeqNum, dataInstance.Data) - require.NoError(t, err) - } - - // Obtain data from iterator - returnedData, ibcSeqNums := providerKeeper.GetLeadingVSCMaturedData(ctx, "chain-99") - - // Assert the returned data is as expected - require.Equal(t, tc.expectedReturnData, returnedData) - require.Equal(t, tc.expectedReturnSeqs, ibcSeqNums) - } -} - -func TestGetSlashAndTrailingData(t *testing.T) { - // Instantiate some data to test against - someSlashData := getTenSampleSlashPacketData() - someVSCMaturedData := getTenSampleVSCMaturedPacketData() - - testCases := []struct { - name string - dataToQueue []throttledPacketDataInstance - expectedSlashFound bool - expectedSlashData ccvtypes.SlashPacketData - expectedVSCMaturedData []ccvtypes.VSCMaturedPacketData - expectedIBCSeqNums []uint64 - }{ - { - name: "Empty queue", - dataToQueue: []throttledPacketDataInstance{}, - expectedSlashFound: false, - expectedSlashData: ccvtypes.SlashPacketData{}, // single zero value returned. - expectedVSCMaturedData: []ccvtypes.VSCMaturedPacketData{}, - expectedIBCSeqNums: []uint64{}, - }, - { - name: "Queue only one slash data", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 1, Data: someSlashData[0]}, - }, - expectedSlashFound: true, - expectedSlashData: someSlashData[0], - expectedVSCMaturedData: []ccvtypes.VSCMaturedPacketData{}, - expectedIBCSeqNums: []uint64{1}, - }, - { - name: "Queue two vsc matured behind slash data", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 80, Data: someSlashData[3]}, - {IbcSeqNum: 82, Data: someVSCMaturedData[0]}, - {IbcSeqNum: 83, Data: someVSCMaturedData[1]}, - }, - expectedSlashFound: true, - expectedSlashData: someSlashData[3], - expectedVSCMaturedData: []ccvtypes.VSCMaturedPacketData{someVSCMaturedData[0], someVSCMaturedData[1]}, - expectedIBCSeqNums: []uint64{80, 82, 83}, - }, - { - name: "Queue two vsc matured behind 4 slash data", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 80, Data: someSlashData[1]}, // Only returned value - {IbcSeqNum: 82, Data: someSlashData[2]}, - {IbcSeqNum: 83, Data: someSlashData[3]}, - {IbcSeqNum: 84, Data: someSlashData[4]}, - {IbcSeqNum: 85, Data: someVSCMaturedData[1]}, - {IbcSeqNum: 86, Data: someVSCMaturedData[2]}, - }, - expectedSlashFound: true, - expectedSlashData: someSlashData[1], - expectedVSCMaturedData: []ccvtypes.VSCMaturedPacketData{}, - expectedIBCSeqNums: []uint64{80}, - }, - { - name: "Queue vsc matured data behind slash data, ending with another slash data", - dataToQueue: []throttledPacketDataInstance{ - {IbcSeqNum: 47238, Data: someSlashData[1]}, - {IbcSeqNum: 47239, Data: someVSCMaturedData[0]}, - {IbcSeqNum: 47240, Data: someVSCMaturedData[1]}, - {IbcSeqNum: 47241, Data: someVSCMaturedData[2]}, - {IbcSeqNum: 47242, Data: someVSCMaturedData[3]}, - {IbcSeqNum: 47243, Data: someSlashData[2]}, // Not returned - }, - expectedSlashFound: true, - expectedSlashData: someSlashData[1], - expectedVSCMaturedData: []ccvtypes.VSCMaturedPacketData{ - someVSCMaturedData[0], someVSCMaturedData[1], someVSCMaturedData[2], someVSCMaturedData[3], - }, - expectedIBCSeqNums: []uint64{47238, 47239, 47240, 47241, 47242}, - }, - } - - for _, tc := range testCases { - - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - // Queue a slash and vsc matured packet data for some random chain. - // These values should never be returned. - err := providerKeeper.QueueThrottledSlashPacketData(ctx, "some-rando-chain", 77, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "some-rando-chain", 97, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - - // Queue the data to test - for _, dataInstance := range tc.dataToQueue { - err := providerKeeper.QueueThrottledPacketData(ctx, "chain-49", dataInstance.IbcSeqNum, dataInstance.Data) - require.NoError(t, err) - } - - // Retrieve the data, and assert that it is correct - slashFound, slashData, vscMaturedData, ibcSeqNums := providerKeeper.GetSlashAndTrailingData(ctx, "chain-49") - require.Equal(t, tc.expectedSlashFound, slashFound, tc.name) - require.Equal(t, tc.expectedSlashData, slashData, tc.name) - require.Equal(t, tc.expectedVSCMaturedData, vscMaturedData, tc.name) - require.Equal(t, tc.expectedIBCSeqNums, ibcSeqNums, tc.name) - } -} - -// TestDeleteThrottledPacketDataForConsumer tests the DeleteThrottledPacketDataForConsumer method. -func TestDeleteThrottledPacketDataForConsumer(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - providerKeeper.SetParams(ctx, providertypes.DefaultParams()) - - // Queue slash and a VSC matured packet data for chain-48 - err := providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-48", 0, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-48", 1, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - - // Queue 3 slash, and 4 vsc matured packet data instances for chain-49 - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-49", 0, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-49", 1, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledSlashPacketData(ctx, "chain-49", 2, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-49", 3, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-49", 4, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-49", 5, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledVSCMaturedPacketData(ctx, "chain-49", 6, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - - // Delete all packet data for chain-49, confirm they are deleted - providerKeeper.DeleteThrottledPacketDataForConsumer(ctx, "chain-49") - slashData, vscMaturedData, _, _ := providerKeeper.GetAllThrottledPacketData(ctx, "chain-49") - require.Empty(t, slashData) - require.Empty(t, vscMaturedData) - - // Confirm size of queue is now 0 - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-49")) - - // Confirm packet data for chain-48 is not deleted - slashData, vscMaturedData, _, _ = providerKeeper.GetAllThrottledPacketData(ctx, "chain-48") - require.Len(t, slashData, 1) - require.Len(t, vscMaturedData, 1) -} - -// TestPanicIfTooMuchThrottledPacketData tests that the provider panics -// when the number of throttled (queued) packets exceeds the max allowed by params. -func TestPanicIfTooMuchThrottledPacketData(t *testing.T) { - testCases := []struct { - max int64 - }{ - {max: 3}, // Max must be greater than 2 since we queue 2 packets for another chain in the test - {max: 5}, - {max: 10}, - {max: 15}, - {max: 25}, - {max: 100}, - } - - for _, tc := range testCases { - - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // Set max throttled packets param - defaultParams := providertypes.DefaultParams() - defaultParams.MaxThrottledPackets = tc.max - providerKeeper.SetParams(ctx, defaultParams) - - seed := time.Now().UnixNano() - rng := rand.New(rand.NewSource(seed)) - - // Queuing up a couple data instances for another chain shouldn't matter - err := providerKeeper.QueueThrottledPacketData(ctx, "chain-17", 0, testkeeper.GetNewSlashPacketData()) - require.NoError(t, err) - err = providerKeeper.QueueThrottledPacketData(ctx, "chain-17", 1, testkeeper.GetNewVSCMaturedPacketData()) - require.NoError(t, err) - - // Queue packet data instances until we reach the max (some slash packets, some VSC matured packets) - reachedMax := false - for i := 0; i < int(tc.max); i++ { - randBool := rng.Intn(2) == 0 - var data interface{} - if randBool { - data = testkeeper.GetNewSlashPacketData() - } else { - data = testkeeper.GetNewVSCMaturedPacketData() - } - // Panic only if we've reached the max - if i == int(tc.max-1) { - require.Panics(t, func() { - _ = providerKeeper.QueueThrottledPacketData(ctx, "chain-88", uint64(i), data) - }) - reachedMax = true - } else { - err := providerKeeper.QueueThrottledPacketData(ctx, "chain-88", uint64(i), data) - require.NoError(t, err) - } - } - require.True(t, reachedMax) - } -} - -// TestThrottledPacketDataSize tests the getter, setter and incrementer for throttled packet data size. -func TestThrottledPacketDataSize(t *testing.T) { - providerKeeper, ctx, ctrl, _ := testkeeper.GetProviderKeeperAndCtx(t, testkeeper.NewInMemKeeperParams(t)) - defer ctrl.Finish() - - // Set params so we can use the default max throttled packet data size - params := providertypes.DefaultParams() - providerKeeper.SetParams(ctx, params) - - // Confirm initial size is 0 - require.Equal(t, uint64(0), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-0")) - - // Set throttled packet data size and confirm it was set - providerKeeper.SetThrottledPacketDataSize(ctx, "chain-0", 10) - require.Equal(t, uint64(10), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-0")) - - // Increment throttled packet data size and confirm it was incremented - providerKeeper.IncrementThrottledPacketDataSize(ctx, "chain-0") - require.Equal(t, uint64(11), providerKeeper.GetThrottledPacketDataSize(ctx, "chain-0")) -} - // TestSlashMeter tests the getter and setter for the slash gas meter func TestSlashMeter(t *testing.T) { testCases := []struct { @@ -1320,65 +538,3 @@ func TestSlashMeterReplenishTimeCandidate(t *testing.T) { require.Equal(t, tc.blockTime.Add(tc.replenishPeriod).UTC(), gotTime) } } - -// Struct used for TestPendingPacketData and helpers -type throttledPacketDataInstance struct { - IbcSeqNum uint64 - Data interface{} -} - -// getAllThrottledPacketDataInstances returns all throttled packet data instances in order -// from the chain-specific packet data queue. -func getAllThrottledPacketDataInstances(ctx sdktypes.Context, k *keeper.Keeper, consumerChainId string) (instances []throttledPacketDataInstance) { - _, _, allData, ibcSeqNums := k.GetAllThrottledPacketData(ctx, consumerChainId) - instances = []throttledPacketDataInstance{} - for idx, data := range allData { - instances = append(instances, throttledPacketDataInstance{ - IbcSeqNum: ibcSeqNums[idx], - Data: data, - }) - } - return instances -} - -// getOrderedInstances returns the given instances in order, specified by the given indexes -func getOrderedInstances(instances []throttledPacketDataInstance, orderbyIdx []int) (orderedInstances []throttledPacketDataInstance) { - toReturn := []throttledPacketDataInstance{} - for _, idx := range orderbyIdx { - toReturn = append(toReturn, instances[idx]) - } - return toReturn -} - -// Asserts that the throttled packet data retrieved for this consumer chain matches what's expected -func assertPendingPacketDataOrdering(t *testing.T, k *keeper.Keeper, ctx sdktypes.Context, - consumerChainId string, expectedInstances []throttledPacketDataInstance, -) { - t.Helper() - // Get all packet data for this chain - obtainedInstances := getAllThrottledPacketDataInstances(ctx, k, consumerChainId) - // No extra data should be present - require.Equal(t, len(expectedInstances), len(obtainedInstances)) - // Assert order and correct serialization/deserialization for each data instance - for i, obtainedInstance := range obtainedInstances { - require.Equal(t, expectedInstances[i], obtainedInstance) - } -} - -// getTenSampleSlashPacketData returns 10 randomized slash packet data instances for testing -func getTenSampleSlashPacketData() []ccvtypes.SlashPacketData { - sampleData := []ccvtypes.SlashPacketData{} - for i := 0; i < 10; i++ { - sampleData = append(sampleData, testkeeper.GetNewSlashPacketData()) - } - return sampleData -} - -// getTenSampleVSCMaturedPacketData returns 10 randomized VSC matured packet data instances for testing -func getTenSampleVSCMaturedPacketData() []ccvtypes.VSCMaturedPacketData { - sampleData := []ccvtypes.VSCMaturedPacketData{} - for i := 0; i < 10; i++ { - sampleData = append(sampleData, testkeeper.GetNewVSCMaturedPacketData()) - } - return sampleData -} diff --git a/x/ccv/provider/module.go b/x/ccv/provider/module.go index 82891c27c7..c70fdeafa7 100644 --- a/x/ccv/provider/module.go +++ b/x/ccv/provider/module.go @@ -107,6 +107,10 @@ func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { func (am AppModule) RegisterServices(cfg module.Configurator) { providertypes.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) providertypes.RegisterQueryServer(cfg.QueryServer(), am.keeper) + m := keeper.NewMigrator(*am.keeper, am.paramSpace) + if err := cfg.RegisterMigration(providertypes.ModuleName, 2, m.Migrate2to3); err != nil { + panic(fmt.Sprintf("failed to register migrator for %s: %s", providertypes.ModuleName, err)) + } } // InitGenesis performs genesis initialization for the provider module. It returns no validator updates. @@ -129,7 +133,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements AppModule/ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return 3 } // BeginBlock implements the AppModule interface func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { @@ -137,6 +141,8 @@ func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { am.keeper.BeginBlockInit(ctx) // Stop and remove state for any consumer chains that are due to be stopped via pending consumer removal proposals am.keeper.BeginBlockCCR(ctx) + // Check for replenishing slash meter before any slash packets are processed for this block + am.keeper.BeginBlockCIS(ctx) } // EndBlock implements the AppModule interface diff --git a/x/ccv/provider/types/errors.go b/x/ccv/provider/types/errors.go index 12fbfbe9c2..66d7a9a3b8 100644 --- a/x/ccv/provider/types/errors.go +++ b/x/ccv/provider/types/errors.go @@ -21,4 +21,7 @@ var ( ErrInvalidProviderAddress = errorsmod.Register(ModuleName, 13, "invalid provider address") ErrInvalidConsumerRewardDenom = errorsmod.Register(ModuleName, 14, "invalid consumer reward denom") ErrInvalidDepositorAddress = errorsmod.Register(ModuleName, 15, "invalid depositor address") + ErrInvalidConsumerClient = errorsmod.Register(ModuleName, 16, "ccv channel is not built on correct client") + ErrDuplicateConsumerChain = errorsmod.Register(ModuleName, 17, "consumer chain already exists") + ErrConsumerChainNotFound = errorsmod.Register(ModuleName, 18, "consumer chain not found") ) diff --git a/x/ccv/provider/types/events.go b/x/ccv/provider/types/events.go new file mode 100644 index 0000000000..58d686020f --- /dev/null +++ b/x/ccv/provider/types/events.go @@ -0,0 +1,18 @@ +package types + +// Provider events +const ( + EventTypeConsumerClientCreated = "consumer_client_created" + EventTypeAssignConsumerKey = "assign_consumer_key" + EventTypeAddConsumerRewardDenom = "add_consumer_reward_denom" + EventTypeRemoveConsumerRewardDenom = "remove_consumer_reward_denom" + EventTypeExecuteConsumerChainSlash = "execute_consumer_chain_slash" + AttributeInfractionHeight = "infraction_height" + AttributeInitialHeight = "initial_height" + AttributeInitializationTimeout = "initialization_timeout" + AttributeTrustingPeriod = "trusting_period" + AttributeUnbondingPeriod = "unbonding_period" + AttributeProviderValidatorAddress = "provider_validator_address" + AttributeConsumerConsensusPubKey = "consumer_consensus_pub_key" + AttributeConsumerRewardDenom = "consumer_reward_denom" +) diff --git a/x/ccv/provider/types/genesis_test.go b/x/ccv/provider/types/genesis_test.go index 7878afb0a4..d77ea563f8 100644 --- a/x/ccv/provider/types/genesis_test.go +++ b/x/ccv/provider/types/genesis_test.go @@ -81,7 +81,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -102,7 +102,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -123,7 +123,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -144,7 +144,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -171,7 +171,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -198,7 +198,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -225,7 +225,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(1000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(1000000)}), nil, nil, nil, @@ -252,7 +252,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -279,7 +279,7 @@ func TestValidateGenesisState(t *testing.T) { 0, // 0 vsc timeout here types.DefaultSlashMeterReplenishPeriod, types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -306,7 +306,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, 0, // 0 slash meter replenish period here types.DefaultSlashMeterReplenishFraction, - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -333,34 +333,7 @@ func TestValidateGenesisState(t *testing.T) { types.DefaultVscTimeoutPeriod, types.DefaultSlashMeterReplenishPeriod, "1.15", - types.DefaultMaxThrottledPackets, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), - nil, - nil, - nil, - nil, - nil, - ), - false, - }, - { - "invalid params, invalid max pending slash packets", - types.NewGenesisState( - types.DefaultValsetUpdateID, - nil, - []types.ConsumerState{{ChainId: "chainid-1", ChannelId: "channelid", ClientId: "client-id"}}, - nil, - nil, - nil, - nil, - types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, - ccv.DefaultCCVTimeoutPeriod, - types.DefaultInitTimeoutPeriod, - types.DefaultVscTimeoutPeriod, - types.DefaultSlashMeterReplenishPeriod, - "1.15", - -1, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), + sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -712,7 +685,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "st", Amount: sdk.NewInt(10000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "st", Amount: sdk.NewInt(10000000)}), nil, nil, nil, @@ -733,7 +706,7 @@ func TestValidateGenesisState(t *testing.T) { nil, types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", 400, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(-1000000)}), + types.DefaultTrustingPeriodFraction, time.Hour, time.Hour, 30*time.Minute, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(-1000000)}), nil, nil, nil, diff --git a/x/ccv/provider/types/params.go b/x/ccv/provider/types/params.go index afb46694a3..fb6b0c267e 100644 --- a/x/ccv/provider/types/params.go +++ b/x/ccv/provider/types/params.go @@ -36,10 +36,6 @@ const ( // that is replenished to the slash meter every replenish period. This param also serves as a maximum // fraction of total voting power that the slash meter can hold. DefaultSlashMeterReplenishFraction = "0.05" - - // DefaultMaxThrottledPackets defines the default amount of throttled slash or vsc matured packets - // that can be queued for a single consumer before the provider chain halts. - DefaultMaxThrottledPackets = 100000 ) // Reflection based keys for params subspace @@ -50,7 +46,6 @@ var ( KeyVscTimeoutPeriod = []byte("VscTimeoutPeriod") KeySlashMeterReplenishPeriod = []byte("SlashMeterReplenishPeriod") KeySlashMeterReplenishFraction = []byte("SlashMeterReplenishFraction") - KeyMaxThrottledPackets = []byte("MaxThrottledPackets") KeyConsumerRewardDenomRegistrationFee = []byte("ConsumerRewardDenomRegistrationFee") ) @@ -68,7 +63,6 @@ func NewParams( vscTimeoutPeriod time.Duration, slashMeterReplenishPeriod time.Duration, slashMeterReplenishFraction string, - maxThrottledPackets int64, consumerRewardDenomRegistrationFee sdk.Coin, ) Params { return Params{ @@ -79,7 +73,6 @@ func NewParams( VscTimeoutPeriod: vscTimeoutPeriod, SlashMeterReplenishPeriod: slashMeterReplenishPeriod, SlashMeterReplenishFraction: slashMeterReplenishFraction, - MaxThrottledPackets: maxThrottledPackets, ConsumerRewardDenomRegistrationFee: consumerRewardDenomRegistrationFee, } } @@ -105,7 +98,6 @@ func DefaultParams() Params { DefaultVscTimeoutPeriod, DefaultSlashMeterReplenishPeriod, DefaultSlashMeterReplenishFraction, - DefaultMaxThrottledPackets, // Defining this inline because it's not possible to define a constant of type sdk.Coin. // Following the pattern from cosmos-sdk/staking/types/params.go sdk.Coin{ @@ -141,9 +133,6 @@ func (p Params) Validate() error { if err := ccvtypes.ValidateStringFraction(p.SlashMeterReplenishFraction); err != nil { return fmt.Errorf("slash meter replenish fraction is invalid: %s", err) } - if err := ccvtypes.ValidatePositiveInt64(p.MaxThrottledPackets); err != nil { - return fmt.Errorf("max throttled packets is invalid: %s", err) - } if err := ValidateCoin(p.ConsumerRewardDenomRegistrationFee); err != nil { return fmt.Errorf("consumer reward denom registration fee is invalid: %s", err) } @@ -160,7 +149,6 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyVscTimeoutPeriod, p.VscTimeoutPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeySlashMeterReplenishPeriod, p.SlashMeterReplenishPeriod, ccvtypes.ValidateDuration), paramtypes.NewParamSetPair(KeySlashMeterReplenishFraction, p.SlashMeterReplenishFraction, ccvtypes.ValidateStringFraction), - paramtypes.NewParamSetPair(KeyMaxThrottledPackets, p.MaxThrottledPackets, ccvtypes.ValidatePositiveInt64), paramtypes.NewParamSetPair(KeyConsumerRewardDenomRegistrationFee, p.ConsumerRewardDenomRegistrationFee, ValidateCoin), } } diff --git a/x/ccv/provider/types/params_test.go b/x/ccv/provider/types/params_test.go index 0676a15986..6e8bd780bf 100644 --- a/x/ccv/provider/types/params_test.go +++ b/x/ccv/provider/types/params_test.go @@ -24,42 +24,39 @@ func TestValidateParams(t *testing.T) { {"custom valid params", types.NewParams( ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), true}, + "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), true}, {"custom invalid params", types.NewParams( ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, 0, clienttypes.Height{}, nil, []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"blank client", types.NewParams(&ibctmtypes.ClientState{}, - "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, - {"nil client", types.NewParams(nil, "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + {"nil client", types.NewParams(nil, "0.33", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, // Check if "0.00" is valid or if a zero dec TrustFraction needs to return an error {"0 trusting period fraction", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.00", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), true}, + "0.00", time.Hour, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), true}, {"0 ccv timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", 0, time.Hour, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", 0, time.Hour, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"0 init timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, 0, time.Hour, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, 0, time.Hour, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"0 vsc timeout period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 0, 30*time.Minute, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, 0, 30*time.Minute, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"0 slash meter replenish period", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 24*time.Hour, 0, "0.1", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, 0, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"slash meter replenish fraction over 1", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "1.5", 100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, - {"negative max pending slash packets", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, - time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "1.5", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(10000000)}), false}, {"invalid consumer reward denom registration fee denom", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, sdk.Coin{Denom: "st", Amount: sdk.NewInt(10000000)}), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", sdk.Coin{Denom: "st", Amount: sdk.NewInt(10000000)}), false}, {"invalid consumer reward denom registration fee amount", types.NewParams(ibctmtypes.NewClientState("", ibctmtypes.DefaultTrustLevel, 0, 0, time.Second*40, clienttypes.Height{}, commitmenttypes.GetSDKSpecs(), []string{"ibc", "upgradedIBCState"}), - "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", -100, sdk.Coin{Denom: "stake", Amount: sdk.NewInt(-10000000)}), false}, + "0.33", time.Hour, time.Hour, 24*time.Hour, time.Hour, "0.1", sdk.Coin{Denom: "stake", Amount: sdk.NewInt(-10000000)}), false}, } for _, tc := range testCases { diff --git a/x/ccv/provider/types/provider.pb.go b/x/ccv/provider/types/provider.pb.go index e57c6e31af..22bc700a2f 100644 --- a/x/ccv/provider/types/provider.pb.go +++ b/x/ccv/provider/types/provider.pb.go @@ -445,9 +445,6 @@ type Params struct { // every replenish period. This param also serves as a maximum fraction of // total voting power that the slash meter can hold. SlashMeterReplenishFraction string `protobuf:"bytes,7,opt,name=slash_meter_replenish_fraction,json=slashMeterReplenishFraction,proto3" json:"slash_meter_replenish_fraction,omitempty"` - // The maximum amount of throttled slash or vsc matured packets - // that can be queued for a single consumer before the provider chain halts. - MaxThrottledPackets int64 `protobuf:"varint,8,opt,name=max_throttled_packets,json=maxThrottledPackets,proto3" json:"max_throttled_packets,omitempty"` // The fee required to be paid to add a reward denom ConsumerRewardDenomRegistrationFee types2.Coin `protobuf:"bytes,9,opt,name=consumer_reward_denom_registration_fee,json=consumerRewardDenomRegistrationFee,proto3" json:"consumer_reward_denom_registration_fee"` } @@ -534,13 +531,6 @@ func (m *Params) GetSlashMeterReplenishFraction() string { return "" } -func (m *Params) GetMaxThrottledPackets() int64 { - if m != nil { - return m.MaxThrottledPackets - } - return 0 -} - func (m *Params) GetConsumerRewardDenomRegistrationFee() types2.Coin { if m != nil { return m.ConsumerRewardDenomRegistrationFee @@ -1421,114 +1411,113 @@ func init() { } var fileDescriptor_f22ec409a72b7b72 = []byte{ - // 1712 bytes of a gzipped FileDescriptorProto + // 1690 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcd, 0x72, 0x1b, 0xc7, - 0x11, 0xe6, 0x12, 0x20, 0x45, 0x34, 0xf8, 0xa7, 0x25, 0x65, 0x81, 0x0a, 0x03, 0x52, 0xeb, 0xd8, - 0x61, 0xca, 0xe5, 0x45, 0x48, 0x55, 0xaa, 0x5c, 0xaa, 0xb8, 0x5c, 0x24, 0x28, 0x5b, 0x34, 0x63, + 0x11, 0xe6, 0x12, 0x20, 0x45, 0x34, 0xf8, 0xa7, 0x25, 0x6d, 0x81, 0x0a, 0x03, 0x52, 0xeb, 0xd8, + 0x61, 0xca, 0xe5, 0x45, 0x48, 0x55, 0xaa, 0x5c, 0xaa, 0xb8, 0x5c, 0x24, 0x28, 0x5b, 0x14, 0x63, 0x8b, 0x5e, 0x32, 0x54, 0x25, 0x39, 0x6c, 0x0d, 0x66, 0x47, 0xc0, 0x14, 0x77, 0x77, 0x56, 0x33, - 0xb3, 0x2b, 0xe1, 0x92, 0x73, 0x8e, 0xce, 0xcd, 0x95, 0x5c, 0x9c, 0xbc, 0x40, 0x5e, 0xc3, 0x47, - 0x1f, 0x73, 0xb2, 0x53, 0xd4, 0x21, 0x87, 0xbc, 0x44, 0x6a, 0x66, 0xff, 0x41, 0x52, 0x81, 0xca, + 0xb3, 0x2b, 0xe3, 0x92, 0x73, 0x8e, 0xce, 0xcd, 0x95, 0x5c, 0x9c, 0xbc, 0x40, 0xce, 0x79, 0x03, + 0x1f, 0x7d, 0xcc, 0xc9, 0x4e, 0x51, 0xc7, 0xbc, 0x44, 0x6a, 0x66, 0xff, 0x41, 0x52, 0x81, 0x4a, 0xf1, 0x6d, 0xb6, 0xa7, 0xfb, 0xeb, 0x9e, 0xe9, 0xee, 0xaf, 0x07, 0x80, 0x3d, 0x1a, 0x4a, 0xc2, 0xf1, 0x08, 0xd1, 0xd0, 0x15, 0x04, 0xc7, 0x9c, 0xca, 0x71, 0x0f, 0xe3, 0xa4, 0x17, 0x71, 0x96, - 0x50, 0x8f, 0xf0, 0x5e, 0xb2, 0x5b, 0xac, 0xed, 0x88, 0x33, 0xc9, 0xcc, 0xb7, 0xaf, 0xb1, 0xb1, - 0x31, 0x4e, 0xec, 0x42, 0x2f, 0xd9, 0xbd, 0xf7, 0xce, 0x4d, 0xc0, 0xc9, 0x6e, 0xef, 0x05, 0xe5, - 0x24, 0xc5, 0xba, 0xb7, 0x3e, 0x64, 0x43, 0xa6, 0x97, 0x3d, 0xb5, 0xca, 0xa4, 0x5b, 0x43, 0xc6, + 0x50, 0x8f, 0xf0, 0x5e, 0xb2, 0x5b, 0xac, 0xed, 0x88, 0x33, 0xc9, 0xcc, 0x77, 0xae, 0xb1, 0xb1, + 0x31, 0x4e, 0xec, 0x42, 0x2f, 0xd9, 0xbd, 0xfb, 0xee, 0x4d, 0xc0, 0xc9, 0x6e, 0xef, 0x05, 0xe5, + 0x24, 0xc5, 0xba, 0xbb, 0x3e, 0x64, 0x43, 0xa6, 0x97, 0x3d, 0xb5, 0xca, 0xa4, 0x5b, 0x43, 0xc6, 0x86, 0x3e, 0xe9, 0xe9, 0xaf, 0x41, 0xfc, 0xac, 0x27, 0x69, 0x40, 0x84, 0x44, 0x41, 0x94, 0x29, 0x74, 0x27, 0x15, 0xbc, 0x98, 0x23, 0x49, 0x59, 0x98, 0x03, 0xd0, 0x01, 0xee, 0x61, 0xc6, 0x49, 0x0f, 0xfb, 0x94, 0x84, 0x52, 0x79, 0x4d, 0x57, 0x99, 0x42, 0x4f, 0x29, 0xf8, 0x74, 0x38, 0x92, 0xa9, 0x58, 0xf4, 0x24, 0x09, 0x3d, 0xc2, 0x03, 0x9a, 0x2a, 0x97, 0x5f, 0x99, 0xc1, 0x66, 0x65, - 0x1f, 0xf3, 0x71, 0x24, 0x59, 0xef, 0x82, 0x8c, 0x45, 0xb6, 0xfb, 0x2e, 0x66, 0x22, 0x60, 0xa2, + 0x1f, 0xf3, 0x71, 0x24, 0x59, 0xef, 0x82, 0x8c, 0x45, 0xb6, 0xfb, 0x1e, 0x66, 0x22, 0x60, 0xa2, 0x47, 0xd4, 0xf9, 0x43, 0x4c, 0x7a, 0xc9, 0xee, 0x80, 0x48, 0xb4, 0x5b, 0x08, 0xf2, 0xb8, 0x33, - 0xbd, 0x01, 0x12, 0xa5, 0x0e, 0x66, 0x34, 0x8b, 0xdb, 0xfa, 0x7e, 0x1e, 0x3a, 0x7d, 0x16, 0x8a, + 0xbd, 0x01, 0x12, 0xa5, 0x0e, 0x66, 0x34, 0x8b, 0xdb, 0xfa, 0x61, 0x1e, 0x3a, 0x7d, 0x16, 0x8a, 0x38, 0x20, 0x7c, 0xdf, 0xf3, 0xa8, 0x3a, 0xd2, 0x09, 0x67, 0x11, 0x13, 0xc8, 0x37, 0xd7, 0x61, 0x4e, 0x52, 0xe9, 0x93, 0x8e, 0xb1, 0x6d, 0xec, 0xb4, 0x9c, 0xf4, 0xc3, 0xdc, 0x86, 0xb6, 0x47, 0x04, 0xe6, 0x34, 0x52, 0xca, 0x9d, 0x59, 0xbd, 0x57, 0x15, 0x99, 0x1b, 0xb0, 0x90, 0xe6, 0x81, - 0x7a, 0x9d, 0x86, 0xde, 0xbe, 0xa5, 0xbf, 0x8f, 0x3c, 0xf3, 0x13, 0x58, 0xa6, 0x21, 0x95, 0x14, - 0xf9, 0xee, 0x88, 0xa8, 0xdb, 0xe8, 0x34, 0xb7, 0x8d, 0x9d, 0xf6, 0xde, 0x3d, 0x9b, 0x0e, 0xb0, - 0xad, 0x2e, 0xd0, 0xce, 0xae, 0x2d, 0xd9, 0xb5, 0x1f, 0x6b, 0x8d, 0x83, 0xe6, 0x37, 0xdf, 0x6d, - 0xcd, 0x38, 0x4b, 0x99, 0x5d, 0x2a, 0x34, 0xef, 0xc3, 0xe2, 0x90, 0x84, 0x44, 0x50, 0xe1, 0x8e, - 0x90, 0x18, 0x75, 0xe6, 0xb6, 0x8d, 0x9d, 0x45, 0xa7, 0x9d, 0xc9, 0x1e, 0x23, 0x31, 0x32, 0xb7, + 0x7a, 0x9d, 0x86, 0xde, 0xbe, 0xa5, 0xbf, 0x8f, 0x3c, 0xf3, 0x53, 0x58, 0xa6, 0x21, 0x95, 0x14, + 0xf9, 0xee, 0x88, 0xa8, 0xdb, 0xe8, 0x34, 0xb7, 0x8d, 0x9d, 0xf6, 0xde, 0x5d, 0x9b, 0x0e, 0xb0, + 0xad, 0x2e, 0xd0, 0xce, 0xae, 0x2d, 0xd9, 0xb5, 0x1f, 0x69, 0x8d, 0x83, 0xe6, 0xb7, 0xdf, 0x6f, + 0xcd, 0x38, 0x4b, 0x99, 0x5d, 0x2a, 0x34, 0xef, 0xc1, 0xe2, 0x90, 0x84, 0x44, 0x50, 0xe1, 0x8e, + 0x90, 0x18, 0x75, 0xe6, 0xb6, 0x8d, 0x9d, 0x45, 0xa7, 0x9d, 0xc9, 0x1e, 0x21, 0x31, 0x32, 0xb7, 0xa0, 0x3d, 0xa0, 0x21, 0xe2, 0xe3, 0x54, 0x63, 0x5e, 0x6b, 0x40, 0x2a, 0xd2, 0x0a, 0x7d, 0x00, 0x11, 0xa1, 0x17, 0xa1, 0xab, 0xb2, 0xdd, 0xb9, 0x95, 0x05, 0x92, 0x66, 0xda, 0xce, 0x33, 0x6d, - 0x9f, 0xe5, 0xa5, 0x70, 0xb0, 0xa0, 0x02, 0xf9, 0xf2, 0xfb, 0x2d, 0xc3, 0x69, 0x69, 0x3b, 0xb5, + 0x9f, 0xe5, 0xa5, 0x70, 0xb0, 0xa0, 0x02, 0xf9, 0xea, 0x87, 0x2d, 0xc3, 0x69, 0x69, 0x3b, 0xb5, 0x63, 0x7e, 0x0e, 0xab, 0x71, 0x38, 0x60, 0xa1, 0x47, 0xc3, 0xa1, 0x1b, 0x11, 0x4e, 0x99, 0xd7, - 0x59, 0xd0, 0x50, 0x1b, 0x57, 0xa0, 0x0e, 0xb3, 0xa2, 0x49, 0x91, 0xbe, 0x52, 0x48, 0x2b, 0x85, + 0x59, 0xd0, 0x50, 0x1b, 0x57, 0xa0, 0x0e, 0xb3, 0xa2, 0x49, 0x91, 0xbe, 0x56, 0x48, 0x2b, 0x85, 0xf1, 0x89, 0xb6, 0x35, 0xbf, 0x00, 0x13, 0xe3, 0x44, 0x87, 0xc4, 0x62, 0x99, 0x23, 0xb6, 0xa6, - 0x47, 0x5c, 0xc5, 0x38, 0x39, 0x4b, 0xad, 0x33, 0xc8, 0x3f, 0xc0, 0x5d, 0xc9, 0x51, 0x28, 0x9e, - 0x11, 0x3e, 0x89, 0x0b, 0xd3, 0xe3, 0xde, 0xc9, 0x31, 0xea, 0xe0, 0x8f, 0x61, 0x1b, 0x67, 0x05, - 0xe4, 0x72, 0xe2, 0x51, 0x21, 0x39, 0x1d, 0xc4, 0xca, 0xd6, 0x7d, 0xc6, 0x11, 0xd6, 0x35, 0xd2, - 0xd6, 0x45, 0xd0, 0xcd, 0xf5, 0x9c, 0x9a, 0xda, 0xc7, 0x99, 0x96, 0xf9, 0x04, 0x7e, 0x36, 0xf0, - 0x19, 0xbe, 0x10, 0x2a, 0x38, 0xb7, 0x86, 0xa4, 0x5d, 0x07, 0x54, 0x08, 0x85, 0xb6, 0xb8, 0x6d, - 0xec, 0x34, 0x9c, 0xfb, 0xa9, 0xee, 0x09, 0xe1, 0x87, 0x15, 0xcd, 0xb3, 0x8a, 0xa2, 0xf9, 0x3e, - 0x98, 0x23, 0x2a, 0x24, 0xe3, 0x14, 0x23, 0xdf, 0x25, 0xa1, 0xe4, 0x94, 0x88, 0xce, 0x92, 0x36, - 0xbf, 0x5d, 0xee, 0x3c, 0x4a, 0x37, 0xcc, 0x4f, 0xe1, 0xfe, 0x8d, 0x4e, 0x5d, 0x3c, 0x42, 0x61, - 0x48, 0xfc, 0xce, 0xb2, 0x3e, 0xca, 0x96, 0x77, 0x83, 0xcf, 0x7e, 0xaa, 0xf6, 0x70, 0xe1, 0x4f, - 0x5f, 0x6f, 0xcd, 0x7c, 0xf5, 0xf5, 0xd6, 0x8c, 0xf5, 0x0f, 0x03, 0xee, 0xf6, 0x8b, 0x83, 0x07, - 0x2c, 0x41, 0xfe, 0x8f, 0xd9, 0x60, 0xfb, 0xd0, 0x12, 0x92, 0x45, 0x69, 0x49, 0x37, 0xdf, 0xa0, - 0xa4, 0x17, 0x94, 0x99, 0xda, 0xb0, 0xfe, 0x6a, 0xc0, 0xfa, 0xa3, 0xe7, 0x31, 0x4d, 0x18, 0x46, + 0x47, 0x5c, 0xc5, 0x38, 0x39, 0x4b, 0xad, 0x33, 0xc8, 0x3f, 0xc0, 0x1d, 0xc9, 0x51, 0x28, 0x9e, + 0x11, 0x3e, 0x89, 0x0b, 0xd3, 0xe3, 0xbe, 0x95, 0x63, 0xd4, 0xc1, 0x1f, 0xc1, 0x36, 0xce, 0x0a, + 0xc8, 0xe5, 0xc4, 0xa3, 0x42, 0x72, 0x3a, 0x88, 0x95, 0xad, 0xfb, 0x8c, 0x23, 0xac, 0x6b, 0xa4, + 0xad, 0x8b, 0xa0, 0x9b, 0xeb, 0x39, 0x35, 0xb5, 0x4f, 0x32, 0x2d, 0xf3, 0x09, 0xfc, 0x6c, 0xe0, + 0x33, 0x7c, 0x21, 0x54, 0x70, 0x6e, 0x0d, 0x49, 0xbb, 0x0e, 0xa8, 0x10, 0x0a, 0x6d, 0x71, 0xdb, + 0xd8, 0x69, 0x38, 0xf7, 0x52, 0xdd, 0x13, 0xc2, 0x0f, 0x2b, 0x9a, 0x67, 0x15, 0x45, 0xf3, 0x03, + 0x30, 0x47, 0x54, 0x48, 0xc6, 0x29, 0x46, 0xbe, 0x4b, 0x42, 0xc9, 0x29, 0x11, 0x9d, 0x25, 0x6d, + 0x7e, 0xbb, 0xdc, 0x79, 0x98, 0x6e, 0x98, 0x8f, 0xe1, 0xde, 0x8d, 0x4e, 0x5d, 0x3c, 0x42, 0x61, + 0x48, 0xfc, 0xce, 0xb2, 0x3e, 0xca, 0x96, 0x77, 0x83, 0xcf, 0x7e, 0xaa, 0xf6, 0x60, 0xe1, 0x4f, + 0xdf, 0x6c, 0xcd, 0x7c, 0xfd, 0xcd, 0xd6, 0x8c, 0xf5, 0x0f, 0x03, 0xee, 0xf4, 0x8b, 0x83, 0x07, + 0x2c, 0x41, 0xfe, 0x8f, 0xd9, 0x60, 0xfb, 0xd0, 0x12, 0x92, 0x45, 0x69, 0x49, 0x37, 0x5f, 0xa3, + 0xa4, 0x17, 0x94, 0x99, 0xda, 0xb0, 0xfe, 0x6a, 0xc0, 0xfa, 0xc3, 0xe7, 0x31, 0x4d, 0x18, 0x46, 0xff, 0x17, 0x3e, 0x38, 0x86, 0x25, 0x52, 0xc1, 0x13, 0x9d, 0xc6, 0x76, 0x63, 0xa7, 0xbd, 0xf7, - 0x8e, 0x9d, 0x92, 0x93, 0x5d, 0x70, 0x56, 0x46, 0x50, 0x76, 0xd5, 0xbb, 0x53, 0xb7, 0xb5, 0xfe, - 0x6e, 0xc0, 0x3d, 0x75, 0xcb, 0x43, 0xe2, 0x90, 0x17, 0x88, 0x7b, 0x87, 0x24, 0x64, 0x81, 0xf8, - 0xc1, 0x31, 0x5a, 0xb0, 0xe4, 0x69, 0x24, 0x57, 0x32, 0x17, 0x79, 0x9e, 0x8e, 0x51, 0xeb, 0x28, - 0xe1, 0x19, 0xdb, 0xf7, 0x3c, 0x73, 0x07, 0x56, 0x4b, 0x1d, 0xae, 0x72, 0xa9, 0xae, 0x58, 0xa9, - 0x2d, 0xe7, 0x6a, 0x3a, 0xc3, 0xc4, 0xfa, 0x8f, 0x01, 0xab, 0x9f, 0xf8, 0x6c, 0x80, 0xfc, 0x53, - 0x1f, 0x89, 0x91, 0xaa, 0xb0, 0xb1, 0x4a, 0x0d, 0x27, 0x59, 0x6b, 0xeb, 0xf0, 0xa6, 0x4e, 0x8d, - 0x32, 0xd3, 0x64, 0xf3, 0x11, 0xdc, 0x2e, 0x9a, 0xad, 0xa8, 0x00, 0x7d, 0x9a, 0x83, 0xb5, 0xcb, - 0xef, 0xb6, 0x56, 0xf2, 0x42, 0xeb, 0xeb, 0x6a, 0x38, 0x74, 0x56, 0x70, 0x4d, 0xe0, 0x99, 0x5d, - 0x68, 0xd3, 0x01, 0x76, 0x05, 0x79, 0xee, 0x86, 0x71, 0xa0, 0x8b, 0xa7, 0xe9, 0xb4, 0xe8, 0x00, - 0x9f, 0x92, 0xe7, 0x9f, 0xc7, 0x81, 0xf9, 0x00, 0xde, 0xca, 0x87, 0xaa, 0x9b, 0x20, 0xdf, 0x55, - 0xf6, 0xea, 0x3a, 0xb8, 0xae, 0xa5, 0x45, 0x67, 0x2d, 0xdf, 0x3d, 0x47, 0xbe, 0x72, 0xb6, 0xef, - 0x79, 0xdc, 0xfa, 0xf7, 0x1c, 0xcc, 0x9f, 0x20, 0x8e, 0x02, 0x61, 0x9e, 0xc1, 0x8a, 0x24, 0x41, - 0xe4, 0x23, 0x49, 0xdc, 0x94, 0xc8, 0xb3, 0x93, 0xbe, 0xa7, 0x09, 0xbe, 0x3a, 0x00, 0xed, 0xca, - 0xc8, 0x4b, 0x76, 0xed, 0xbe, 0x96, 0x9e, 0x4a, 0x24, 0x89, 0xb3, 0x9c, 0x63, 0xa4, 0x42, 0xf3, - 0x03, 0xe8, 0x48, 0x1e, 0x0b, 0x59, 0x52, 0x6c, 0xc9, 0x2d, 0x69, 0x2e, 0xdf, 0xca, 0xf7, 0x53, - 0x56, 0x2a, 0x38, 0xe5, 0x7a, 0x36, 0x6d, 0xfc, 0x10, 0x36, 0x3d, 0x85, 0x35, 0x35, 0x8a, 0x26, - 0x31, 0x9b, 0xd3, 0x63, 0xde, 0x56, 0xf6, 0x75, 0xd0, 0x2f, 0xc0, 0x4c, 0x04, 0x9e, 0xc4, 0x9c, - 0x7b, 0x83, 0x38, 0x13, 0x81, 0xeb, 0x90, 0x1e, 0x6c, 0x0a, 0x55, 0x7c, 0x6e, 0x40, 0xa4, 0xe6, - 0xe6, 0xc8, 0x27, 0x21, 0x15, 0xa3, 0x1c, 0x7c, 0x7e, 0x7a, 0xf0, 0x0d, 0x0d, 0xf4, 0x99, 0xc2, - 0x71, 0x72, 0x98, 0xcc, 0x4b, 0x1f, 0xba, 0xd7, 0x7b, 0x29, 0x12, 0x74, 0x4b, 0x27, 0xe8, 0x27, - 0xd7, 0x40, 0x14, 0x59, 0xda, 0x83, 0x3b, 0x01, 0x7a, 0xe9, 0xca, 0x11, 0x67, 0x52, 0xfa, 0xc4, - 0x73, 0x23, 0x84, 0x2f, 0x88, 0x14, 0x7a, 0x90, 0x36, 0x9c, 0xb5, 0x00, 0xbd, 0x3c, 0xcb, 0xf7, - 0x4e, 0xd2, 0x2d, 0x53, 0xc0, 0xbb, 0x95, 0xb9, 0xa3, 0x98, 0xc0, 0xd5, 0x4d, 0xe8, 0x72, 0x32, - 0x54, 0xe4, 0x8c, 0xd2, 0x11, 0x44, 0x48, 0x31, 0x3b, 0x33, 0xb6, 0x51, 0x4f, 0xa1, 0x82, 0x69, - 0xfa, 0x8c, 0x86, 0xd9, 0x03, 0xc3, 0x2a, 0xc7, 0x53, 0xc1, 0x2b, 0x4e, 0x05, 0xeb, 0x63, 0x42, - 0xac, 0x5f, 0x40, 0x4b, 0x37, 0xf4, 0x3e, 0xbe, 0x10, 0xe6, 0x26, 0xb4, 0x54, 0x67, 0x10, 0x21, - 0x88, 0xe8, 0x18, 0x9a, 0x07, 0x4a, 0x81, 0x25, 0x61, 0xe3, 0xa6, 0x87, 0x95, 0x30, 0x9f, 0xc2, - 0xad, 0x88, 0xe8, 0xa9, 0xaf, 0x0d, 0xdb, 0x7b, 0x1f, 0xda, 0x53, 0xbc, 0x71, 0xed, 0x9b, 0x00, - 0x9d, 0x1c, 0xcd, 0xe2, 0xe5, 0x73, 0x6e, 0x62, 0xd8, 0x08, 0xf3, 0x7c, 0xd2, 0xe9, 0xaf, 0xdf, - 0xc8, 0xe9, 0x04, 0x5e, 0xe9, 0xf3, 0x3d, 0x68, 0xef, 0xa7, 0xc7, 0xfe, 0x0d, 0x15, 0xf2, 0xea, - 0xb5, 0x2c, 0x56, 0xaf, 0xe5, 0x53, 0x58, 0xce, 0x66, 0xe4, 0x19, 0xd3, 0xa4, 0x64, 0xfe, 0x14, - 0x20, 0x1b, 0xae, 0x8a, 0xcc, 0x52, 0xda, 0x6e, 0x65, 0x92, 0x23, 0xaf, 0x36, 0xeb, 0x66, 0x6b, - 0xb3, 0xce, 0x72, 0x60, 0xe5, 0x5c, 0xe0, 0xdf, 0xe6, 0x0f, 0xa8, 0x27, 0x91, 0x30, 0xef, 0xc0, - 0xbc, 0xea, 0xa3, 0x0c, 0xa8, 0xe9, 0xcc, 0x25, 0x02, 0x1f, 0x69, 0xe6, 0x2e, 0x1f, 0x69, 0x2c, - 0x72, 0xa9, 0x27, 0x3a, 0xb3, 0xdb, 0x8d, 0x9d, 0xa6, 0xb3, 0x1c, 0x97, 0xe6, 0x47, 0x9e, 0xb0, - 0x7e, 0x07, 0xed, 0x0a, 0xa0, 0xb9, 0x0c, 0xb3, 0x05, 0xd6, 0x2c, 0xf5, 0xcc, 0x87, 0xb0, 0x51, - 0x02, 0xd5, 0xa9, 0x38, 0x45, 0x6c, 0x39, 0x77, 0x0b, 0x85, 0x1a, 0x1b, 0x0b, 0xeb, 0x09, 0xac, - 0x1f, 0x95, 0x8d, 0x5f, 0x10, 0x7d, 0xed, 0x84, 0x46, 0x7d, 0x9a, 0x6f, 0x42, 0xab, 0xf8, 0x25, - 0xa2, 0x4f, 0xdf, 0x74, 0x4a, 0x81, 0x15, 0xc0, 0xea, 0xb9, 0xc0, 0xa7, 0x24, 0xf4, 0x4a, 0xb0, - 0x1b, 0x2e, 0xe0, 0x60, 0x12, 0x68, 0xea, 0x97, 0x6e, 0xe9, 0x8e, 0xc1, 0xc6, 0x39, 0xf2, 0xa9, - 0x87, 0x24, 0xe3, 0xa7, 0x44, 0xa6, 0x43, 0x38, 0x6f, 0x47, 0x07, 0x9a, 0x3e, 0x15, 0x32, 0xab, - 0xac, 0x0f, 0x6e, 0xac, 0xac, 0x64, 0xd7, 0xbe, 0x09, 0xe4, 0x10, 0x49, 0x94, 0xf5, 0xa2, 0xc6, - 0xb2, 0x7e, 0x0e, 0x6b, 0x9f, 0x21, 0x19, 0x73, 0xe2, 0xd5, 0x72, 0xbc, 0x0a, 0x0d, 0x95, 0x3f, - 0x43, 0xe7, 0x4f, 0x2d, 0xd5, 0x9b, 0xa0, 0xf3, 0xe8, 0x65, 0xc4, 0xb8, 0x24, 0xde, 0x95, 0x1b, - 0x79, 0xcd, 0xf5, 0x5e, 0xc0, 0x9a, 0xba, 0x2c, 0x41, 0x42, 0xcf, 0x2d, 0xce, 0x99, 0xe6, 0xb1, - 0xbd, 0xf7, 0xab, 0xa9, 0xba, 0x63, 0xd2, 0x5d, 0x76, 0x80, 0xdb, 0xc9, 0x84, 0x5c, 0x58, 0x7f, - 0x36, 0xa0, 0x73, 0x4c, 0xc6, 0xfb, 0x42, 0xd0, 0x61, 0x18, 0x90, 0x50, 0x2a, 0x1e, 0x44, 0x98, - 0xa8, 0xa5, 0xf9, 0x36, 0x2c, 0x15, 0x73, 0x57, 0x8f, 0x5b, 0x43, 0x8f, 0xdb, 0xc5, 0x5c, 0xa8, - 0x1a, 0xcc, 0x7c, 0x08, 0x10, 0x71, 0x92, 0xb8, 0xd8, 0xbd, 0x20, 0xe3, 0x2c, 0x8b, 0x9b, 0xd5, - 0x31, 0x9a, 0xfe, 0x4e, 0xb4, 0x4f, 0xe2, 0x81, 0x4f, 0xf1, 0x31, 0x19, 0x3b, 0x0b, 0x4a, 0xbf, - 0x7f, 0x4c, 0xc6, 0xea, 0x5d, 0x14, 0xb1, 0x17, 0x84, 0xeb, 0xd9, 0xd7, 0x70, 0xd2, 0x0f, 0xeb, - 0x2f, 0x06, 0xdc, 0x2d, 0xd2, 0x91, 0x97, 0xeb, 0x49, 0x3c, 0x50, 0x16, 0xaf, 0xb9, 0xb7, 0x2b, - 0xd1, 0xce, 0x5e, 0x13, 0xed, 0x47, 0xb0, 0x58, 0x34, 0x88, 0x8a, 0xb7, 0x31, 0x45, 0xbc, 0xed, - 0xdc, 0xe2, 0x98, 0x8c, 0xad, 0x3f, 0x56, 0x62, 0x3b, 0x18, 0x57, 0xb8, 0x8f, 0xff, 0x8f, 0xd8, - 0x0a, 0xb7, 0xd5, 0xd8, 0x70, 0xd5, 0xfe, 0xca, 0x01, 0x1a, 0x57, 0x0f, 0x60, 0xfd, 0xcd, 0x80, - 0xf5, 0xaa, 0x57, 0x71, 0xc6, 0x4e, 0x78, 0x1c, 0x92, 0xd7, 0x79, 0x2f, 0xdb, 0x6f, 0xb6, 0xda, - 0x7e, 0x4f, 0x61, 0xb9, 0x16, 0x94, 0xc8, 0x6e, 0xe3, 0x97, 0x53, 0xd5, 0x58, 0x85, 0x5d, 0x9d, - 0xa5, 0xea, 0x39, 0xc4, 0xc1, 0xd3, 0x6f, 0x2e, 0xbb, 0xc6, 0xb7, 0x97, 0x5d, 0xe3, 0x5f, 0x97, - 0x5d, 0xe3, 0xcb, 0x57, 0xdd, 0x99, 0x6f, 0x5f, 0x75, 0x67, 0xfe, 0xf9, 0xaa, 0x3b, 0xf3, 0xfb, - 0x0f, 0x87, 0x54, 0x8e, 0xe2, 0x81, 0x8d, 0x59, 0xd0, 0xcb, 0xfe, 0x04, 0x28, 0x7d, 0xbd, 0x5f, - 0xfc, 0x43, 0x92, 0x3c, 0xe8, 0xbd, 0xac, 0xff, 0xff, 0x22, 0xc7, 0x11, 0x11, 0x83, 0x79, 0xcd, - 0x0a, 0x0f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x81, 0x5a, 0x4e, 0xc6, 0xb0, 0x11, 0x00, 0x00, + 0xae, 0x9d, 0x92, 0x93, 0x5d, 0x70, 0x56, 0x46, 0x50, 0x76, 0xd5, 0xbb, 0x53, 0xb7, 0xb5, 0xfe, + 0x6e, 0xc0, 0x5d, 0x75, 0xcb, 0x43, 0xe2, 0x90, 0x17, 0x88, 0x7b, 0x87, 0x24, 0x64, 0x81, 0x78, + 0xe3, 0x18, 0x2d, 0x58, 0xf2, 0x34, 0x92, 0x2b, 0x99, 0x8b, 0x3c, 0x4f, 0xc7, 0xa8, 0x75, 0x94, + 0xf0, 0x8c, 0xed, 0x7b, 0x9e, 0xb9, 0x03, 0xab, 0xa5, 0x0e, 0x57, 0xb9, 0x54, 0x57, 0xac, 0xd4, + 0x96, 0x73, 0x35, 0x9d, 0x61, 0x62, 0xfd, 0xc7, 0x80, 0xd5, 0x4f, 0x7d, 0x36, 0x40, 0xfe, 0xa9, + 0x8f, 0xc4, 0x48, 0x55, 0xd8, 0x58, 0xa5, 0x86, 0x93, 0xac, 0xb5, 0x75, 0x78, 0x53, 0xa7, 0x46, + 0x99, 0x69, 0xb2, 0xf9, 0x18, 0x6e, 0x17, 0xcd, 0x56, 0x54, 0x80, 0x3e, 0xcd, 0xc1, 0xda, 0xe5, + 0xf7, 0x5b, 0x2b, 0x79, 0xa1, 0xf5, 0x75, 0x35, 0x1c, 0x3a, 0x2b, 0xb8, 0x26, 0xf0, 0xcc, 0x2e, + 0xb4, 0xe9, 0x00, 0xbb, 0x82, 0x3c, 0x77, 0xc3, 0x38, 0xd0, 0xc5, 0xd3, 0x74, 0x5a, 0x74, 0x80, + 0x4f, 0xc9, 0xf3, 0xcf, 0xe3, 0xc0, 0xbc, 0x0f, 0x6f, 0xe7, 0x43, 0xd5, 0x4d, 0x90, 0xef, 0x2a, + 0x7b, 0x75, 0x1d, 0x5c, 0xd7, 0xd2, 0xa2, 0xb3, 0x96, 0xef, 0x9e, 0x23, 0x5f, 0x39, 0xdb, 0xf7, + 0x3c, 0x6e, 0xfd, 0x73, 0x0e, 0xe6, 0x4f, 0x10, 0x47, 0x81, 0x30, 0xcf, 0x60, 0x45, 0x92, 0x20, + 0xf2, 0x91, 0x24, 0x6e, 0x4a, 0xe4, 0xd9, 0x49, 0xdf, 0xd7, 0x04, 0x5f, 0x1d, 0x80, 0x76, 0x65, + 0xe4, 0x25, 0xbb, 0x76, 0x5f, 0x4b, 0x4f, 0x25, 0x92, 0xc4, 0x59, 0xce, 0x31, 0x52, 0xa1, 0xf9, + 0x21, 0x74, 0x24, 0x8f, 0x85, 0x2c, 0x29, 0xb6, 0xe4, 0x96, 0x34, 0x97, 0x6f, 0xe7, 0xfb, 0x29, + 0x2b, 0x15, 0x9c, 0x72, 0x3d, 0x9b, 0x36, 0xde, 0x84, 0x4d, 0x4f, 0x61, 0x4d, 0x8d, 0xa2, 0x49, + 0xcc, 0xe6, 0xf4, 0x98, 0xb7, 0x95, 0x7d, 0x1d, 0xf4, 0x0b, 0x30, 0x13, 0x81, 0x27, 0x31, 0xe7, + 0x5e, 0x23, 0xce, 0x44, 0xe0, 0x3a, 0xa4, 0x07, 0x9b, 0x42, 0x15, 0x9f, 0x1b, 0x10, 0xa9, 0xb9, + 0x39, 0xf2, 0x49, 0x48, 0xc5, 0x28, 0x07, 0x9f, 0x9f, 0x1e, 0x7c, 0x43, 0x03, 0x7d, 0xa6, 0x70, + 0x9c, 0x1c, 0x26, 0xf3, 0xd2, 0x87, 0xee, 0xf5, 0x5e, 0x8a, 0x04, 0xdd, 0xd2, 0x09, 0xfa, 0xc9, + 0x35, 0x10, 0x45, 0x96, 0x04, 0xbc, 0x57, 0x99, 0x21, 0xaa, 0xab, 0x5d, 0xdd, 0x50, 0x2e, 0x27, + 0x43, 0x45, 0xb4, 0x28, 0x1d, 0x27, 0x84, 0x14, 0x73, 0x30, 0x63, 0x0e, 0xf5, 0xac, 0x29, 0x58, + 0xa3, 0xcf, 0x68, 0x98, 0x3d, 0x16, 0xac, 0x72, 0xd4, 0x14, 0x1c, 0xe1, 0x54, 0xb0, 0x3e, 0x21, + 0xe4, 0x71, 0x73, 0x61, 0x61, 0xb5, 0x65, 0xfd, 0x02, 0x5a, 0xba, 0x45, 0xf7, 0xf1, 0x85, 0x30, + 0x37, 0xa1, 0xa5, 0x6a, 0x9d, 0x08, 0x41, 0x44, 0xc7, 0xd0, 0x9d, 0x5d, 0x0a, 0x2c, 0x09, 0x1b, + 0x37, 0x3d, 0x95, 0x84, 0xf9, 0x14, 0x6e, 0x45, 0x44, 0xcf, 0x71, 0x6d, 0xd8, 0xde, 0xfb, 0xc8, + 0x9e, 0xe2, 0xd5, 0x6a, 0xdf, 0x04, 0xe8, 0xe4, 0x68, 0x16, 0x2f, 0x1f, 0x68, 0x13, 0xe3, 0x43, + 0x98, 0xe7, 0x93, 0x4e, 0x7f, 0xfd, 0x5a, 0x4e, 0x27, 0xf0, 0x4a, 0x9f, 0xef, 0x43, 0x7b, 0x3f, + 0x3d, 0xf6, 0x6f, 0xa8, 0x90, 0x57, 0xaf, 0x65, 0xb1, 0x7a, 0x2d, 0x8f, 0x61, 0x39, 0x9b, 0x7a, + 0x67, 0x4c, 0xd3, 0x8c, 0xf9, 0x53, 0x80, 0x6c, 0x5c, 0x2a, 0x7a, 0x4a, 0x89, 0xb8, 0x95, 0x49, + 0x8e, 0xbc, 0xda, 0xf4, 0x9a, 0xad, 0x4d, 0x2f, 0xcb, 0x81, 0x95, 0x73, 0x81, 0x7f, 0x9b, 0x3f, + 0x89, 0x9e, 0x44, 0xc2, 0x7c, 0x0b, 0xe6, 0x55, 0x67, 0x64, 0x40, 0x4d, 0x67, 0x2e, 0x11, 0xf8, + 0x48, 0x73, 0x71, 0xf9, 0xec, 0x62, 0x91, 0x4b, 0x3d, 0xd1, 0x99, 0xdd, 0x6e, 0xec, 0x34, 0x9d, + 0xe5, 0xb8, 0x34, 0x3f, 0xf2, 0x84, 0xf5, 0x3b, 0x68, 0x57, 0x00, 0xcd, 0x65, 0x98, 0x2d, 0xb0, + 0x66, 0xa9, 0x67, 0x3e, 0x80, 0x8d, 0x12, 0xa8, 0x4e, 0xae, 0x29, 0x62, 0xcb, 0xb9, 0x53, 0x28, + 0xd4, 0xf8, 0x55, 0x58, 0x4f, 0x60, 0xfd, 0xa8, 0x6c, 0xe5, 0x82, 0xba, 0x6b, 0x27, 0x34, 0xea, + 0xf3, 0x79, 0x13, 0x5a, 0xc5, 0x6f, 0x0b, 0x7d, 0xfa, 0xa6, 0x53, 0x0a, 0xac, 0x00, 0x56, 0xcf, + 0x05, 0x3e, 0x25, 0xa1, 0x57, 0x82, 0xdd, 0x70, 0x01, 0x07, 0x93, 0x40, 0x53, 0xbf, 0x5d, 0x4b, + 0x77, 0x0c, 0x36, 0xce, 0x91, 0x4f, 0x3d, 0x24, 0x19, 0x3f, 0x25, 0x32, 0x1d, 0xab, 0x27, 0x08, + 0x5f, 0x10, 0x29, 0x4c, 0x07, 0x9a, 0x3e, 0x15, 0x32, 0xab, 0xac, 0x0f, 0x6f, 0xac, 0xac, 0x64, + 0xd7, 0xbe, 0x09, 0xe4, 0x10, 0x49, 0x94, 0x75, 0xa4, 0xc6, 0xb2, 0x7e, 0x0e, 0x6b, 0x9f, 0x21, + 0x19, 0x73, 0xe2, 0xd5, 0x72, 0xbc, 0x0a, 0x0d, 0x95, 0x3f, 0x43, 0xe7, 0x4f, 0x2d, 0xd5, 0x94, + 0xef, 0x3c, 0xfc, 0x32, 0x62, 0x5c, 0x12, 0xef, 0xca, 0x8d, 0xbc, 0xe2, 0x7a, 0x2f, 0x60, 0x4d, + 0x5d, 0x96, 0x20, 0xa1, 0xe7, 0x16, 0xe7, 0x4c, 0xf3, 0xd8, 0xde, 0xfb, 0xd5, 0x54, 0xdd, 0x31, + 0xe9, 0x2e, 0x3b, 0xc0, 0xed, 0x64, 0x42, 0x2e, 0xac, 0x3f, 0x1b, 0xd0, 0x39, 0x26, 0xe3, 0x7d, + 0x21, 0xe8, 0x30, 0x0c, 0x48, 0x28, 0x15, 0xb3, 0x21, 0x4c, 0xd4, 0xd2, 0x7c, 0x07, 0x96, 0x8a, + 0x49, 0xaa, 0x07, 0xa8, 0xa1, 0x07, 0xe8, 0x62, 0x2e, 0x54, 0x0d, 0x66, 0x3e, 0x00, 0x88, 0x38, + 0x49, 0x5c, 0xec, 0x5e, 0x90, 0x71, 0x96, 0xc5, 0xcd, 0xea, 0x60, 0x4c, 0x7f, 0xf9, 0xd9, 0x27, + 0xf1, 0xc0, 0xa7, 0xf8, 0x98, 0x8c, 0x9d, 0x05, 0xa5, 0xdf, 0x3f, 0x26, 0x63, 0xf5, 0xd2, 0x89, + 0xd8, 0x0b, 0xc2, 0xf5, 0x34, 0x6b, 0x38, 0xe9, 0x87, 0xf5, 0x17, 0x03, 0xee, 0x14, 0xe9, 0xc8, + 0xcb, 0xf5, 0x24, 0x1e, 0x28, 0x8b, 0x57, 0xdc, 0xdb, 0x95, 0x68, 0x67, 0xaf, 0x89, 0xf6, 0x63, + 0x58, 0x2c, 0x1a, 0x44, 0xc5, 0xdb, 0x98, 0x22, 0xde, 0x76, 0x6e, 0x71, 0x4c, 0xc6, 0xd6, 0x1f, + 0x2b, 0xb1, 0x1d, 0x8c, 0x2b, 0xdc, 0xc7, 0xff, 0x47, 0x6c, 0x85, 0xdb, 0x6a, 0x6c, 0xb8, 0x6a, + 0x7f, 0xe5, 0x00, 0x8d, 0xab, 0x07, 0xb0, 0xfe, 0x66, 0xc0, 0x7a, 0xd5, 0xab, 0x38, 0x63, 0x27, + 0x3c, 0x0e, 0xc9, 0xab, 0xbc, 0x97, 0xed, 0x37, 0x5b, 0x6d, 0xbf, 0xa7, 0xb0, 0x5c, 0x0b, 0x4a, + 0x64, 0xb7, 0xf1, 0xcb, 0xa9, 0x6a, 0xac, 0xc2, 0xae, 0xce, 0x52, 0xf5, 0x1c, 0xe2, 0xe0, 0xe9, + 0xb7, 0x97, 0x5d, 0xe3, 0xbb, 0xcb, 0xae, 0xf1, 0xef, 0xcb, 0xae, 0xf1, 0xd5, 0xcb, 0xee, 0xcc, + 0x77, 0x2f, 0xbb, 0x33, 0xff, 0x7a, 0xd9, 0x9d, 0xf9, 0xfd, 0x47, 0x43, 0x2a, 0x47, 0xf1, 0xc0, + 0xc6, 0x2c, 0xe8, 0x65, 0x3f, 0xeb, 0x4b, 0x5f, 0x1f, 0x14, 0xff, 0x79, 0x24, 0xf7, 0x7b, 0x5f, + 0xd6, 0xff, 0x51, 0x91, 0xe3, 0x88, 0x88, 0xc1, 0xbc, 0x66, 0x85, 0xfb, 0xff, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x95, 0xc6, 0x06, 0x3d, 0x82, 0x11, 0x00, 0x00, } func (m *ConsumerAdditionProposal) Marshal() (dAtA []byte, err error) { @@ -1893,11 +1882,6 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x4a - if m.MaxThrottledPackets != 0 { - i = encodeVarintProvider(dAtA, i, uint64(m.MaxThrottledPackets)) - i-- - dAtA[i] = 0x40 - } if len(m.SlashMeterReplenishFraction) > 0 { i -= len(m.SlashMeterReplenishFraction) copy(dAtA[i:], m.SlashMeterReplenishFraction) @@ -2784,9 +2768,6 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovProvider(uint64(l)) } - if m.MaxThrottledPackets != 0 { - n += 1 + sovProvider(uint64(m.MaxThrottledPackets)) - } l = m.ConsumerRewardDenomRegistrationFee.Size() n += 1 + l + sovProvider(uint64(l)) return n @@ -4489,25 +4470,6 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.SlashMeterReplenishFraction = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxThrottledPackets", wireType) - } - m.MaxThrottledPackets = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProvider - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxThrottledPackets |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConsumerRewardDenomRegistrationFee", wireType) diff --git a/x/ccv/provider/types/query.pb.go b/x/ccv/provider/types/query.pb.go index eac75ded70..37ef05d20f 100644 --- a/x/ccv/provider/types/query.pb.go +++ b/x/ccv/provider/types/query.pb.go @@ -637,8 +637,6 @@ type QueryThrottleStateResponse struct { // next time the slash meter could potentially be replenished, iff it's not // full NextReplenishCandidate time.Time `protobuf:"bytes,3,opt,name=next_replenish_candidate,json=nextReplenishCandidate,proto3,stdtime" json:"next_replenish_candidate"` - // data relevant to currently throttled slash packets - Packets []*ThrottledSlashPacket `protobuf:"bytes,4,rep,name=packets,proto3" json:"packets,omitempty"` } func (m *QueryThrottleStateResponse) Reset() { *m = QueryThrottleStateResponse{} } @@ -695,262 +693,6 @@ func (m *QueryThrottleStateResponse) GetNextReplenishCandidate() time.Time { return time.Time{} } -func (m *QueryThrottleStateResponse) GetPackets() []*ThrottledSlashPacket { - if m != nil { - return m.Packets - } - return nil -} - -type QueryThrottledConsumerPacketDataRequest struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` -} - -func (m *QueryThrottledConsumerPacketDataRequest) Reset() { - *m = QueryThrottledConsumerPacketDataRequest{} -} -func (m *QueryThrottledConsumerPacketDataRequest) String() string { return proto.CompactTextString(m) } -func (*QueryThrottledConsumerPacketDataRequest) ProtoMessage() {} -func (*QueryThrottledConsumerPacketDataRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{15} -} -func (m *QueryThrottledConsumerPacketDataRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryThrottledConsumerPacketDataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryThrottledConsumerPacketDataRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryThrottledConsumerPacketDataRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryThrottledConsumerPacketDataRequest.Merge(m, src) -} -func (m *QueryThrottledConsumerPacketDataRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryThrottledConsumerPacketDataRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryThrottledConsumerPacketDataRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryThrottledConsumerPacketDataRequest proto.InternalMessageInfo - -func (m *QueryThrottledConsumerPacketDataRequest) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -type QueryThrottledConsumerPacketDataResponse struct { - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - Size_ uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` - PacketDataInstances []ThrottledPacketDataWrapper `protobuf:"bytes,3,rep,name=packetDataInstances,proto3" json:"packetDataInstances"` -} - -func (m *QueryThrottledConsumerPacketDataResponse) Reset() { - *m = QueryThrottledConsumerPacketDataResponse{} -} -func (m *QueryThrottledConsumerPacketDataResponse) String() string { return proto.CompactTextString(m) } -func (*QueryThrottledConsumerPacketDataResponse) ProtoMessage() {} -func (*QueryThrottledConsumerPacketDataResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{16} -} -func (m *QueryThrottledConsumerPacketDataResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryThrottledConsumerPacketDataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryThrottledConsumerPacketDataResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryThrottledConsumerPacketDataResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryThrottledConsumerPacketDataResponse.Merge(m, src) -} -func (m *QueryThrottledConsumerPacketDataResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryThrottledConsumerPacketDataResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryThrottledConsumerPacketDataResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryThrottledConsumerPacketDataResponse proto.InternalMessageInfo - -func (m *QueryThrottledConsumerPacketDataResponse) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - -func (m *QueryThrottledConsumerPacketDataResponse) GetSize_() uint64 { - if m != nil { - return m.Size_ - } - return 0 -} - -func (m *QueryThrottledConsumerPacketDataResponse) GetPacketDataInstances() []ThrottledPacketDataWrapper { - if m != nil { - return m.PacketDataInstances - } - return nil -} - -// A query wrapper type for the global entry and data relevant to a throttled -// slash packet. -type ThrottledSlashPacket struct { - GlobalEntry GlobalSlashEntry `protobuf:"bytes,1,opt,name=global_entry,json=globalEntry,proto3" json:"global_entry"` - Data types.SlashPacketData `protobuf:"bytes,2,opt,name=data,proto3" json:"data"` -} - -func (m *ThrottledSlashPacket) Reset() { *m = ThrottledSlashPacket{} } -func (m *ThrottledSlashPacket) String() string { return proto.CompactTextString(m) } -func (*ThrottledSlashPacket) ProtoMessage() {} -func (*ThrottledSlashPacket) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{17} -} -func (m *ThrottledSlashPacket) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ThrottledSlashPacket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ThrottledSlashPacket.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ThrottledSlashPacket) XXX_Merge(src proto.Message) { - xxx_messageInfo_ThrottledSlashPacket.Merge(m, src) -} -func (m *ThrottledSlashPacket) XXX_Size() int { - return m.Size() -} -func (m *ThrottledSlashPacket) XXX_DiscardUnknown() { - xxx_messageInfo_ThrottledSlashPacket.DiscardUnknown(m) -} - -var xxx_messageInfo_ThrottledSlashPacket proto.InternalMessageInfo - -func (m *ThrottledSlashPacket) GetGlobalEntry() GlobalSlashEntry { - if m != nil { - return m.GlobalEntry - } - return GlobalSlashEntry{} -} - -func (m *ThrottledSlashPacket) GetData() types.SlashPacketData { - if m != nil { - return m.Data - } - return types.SlashPacketData{} -} - -// ThrottledPacketDataWrapper contains either SlashPacketData or -// VSCMaturedPacketData -type ThrottledPacketDataWrapper struct { - // Types that are valid to be assigned to Data: - // *ThrottledPacketDataWrapper_SlashPacket - // *ThrottledPacketDataWrapper_VscMaturedPacket - Data isThrottledPacketDataWrapper_Data `protobuf_oneof:"data"` -} - -func (m *ThrottledPacketDataWrapper) Reset() { *m = ThrottledPacketDataWrapper{} } -func (m *ThrottledPacketDataWrapper) String() string { return proto.CompactTextString(m) } -func (*ThrottledPacketDataWrapper) ProtoMessage() {} -func (*ThrottledPacketDataWrapper) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{18} -} -func (m *ThrottledPacketDataWrapper) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ThrottledPacketDataWrapper) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ThrottledPacketDataWrapper.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ThrottledPacketDataWrapper) XXX_Merge(src proto.Message) { - xxx_messageInfo_ThrottledPacketDataWrapper.Merge(m, src) -} -func (m *ThrottledPacketDataWrapper) XXX_Size() int { - return m.Size() -} -func (m *ThrottledPacketDataWrapper) XXX_DiscardUnknown() { - xxx_messageInfo_ThrottledPacketDataWrapper.DiscardUnknown(m) -} - -var xxx_messageInfo_ThrottledPacketDataWrapper proto.InternalMessageInfo - -type isThrottledPacketDataWrapper_Data interface { - isThrottledPacketDataWrapper_Data() - MarshalTo([]byte) (int, error) - Size() int -} - -type ThrottledPacketDataWrapper_SlashPacket struct { - SlashPacket *types.SlashPacketData `protobuf:"bytes,1,opt,name=slash_packet,json=slashPacket,proto3,oneof" json:"slash_packet,omitempty"` -} -type ThrottledPacketDataWrapper_VscMaturedPacket struct { - VscMaturedPacket *types.VSCMaturedPacketData `protobuf:"bytes,2,opt,name=vsc_matured_packet,json=vscMaturedPacket,proto3,oneof" json:"vsc_matured_packet,omitempty"` -} - -func (*ThrottledPacketDataWrapper_SlashPacket) isThrottledPacketDataWrapper_Data() {} -func (*ThrottledPacketDataWrapper_VscMaturedPacket) isThrottledPacketDataWrapper_Data() {} - -func (m *ThrottledPacketDataWrapper) GetData() isThrottledPacketDataWrapper_Data { - if m != nil { - return m.Data - } - return nil -} - -func (m *ThrottledPacketDataWrapper) GetSlashPacket() *types.SlashPacketData { - if x, ok := m.GetData().(*ThrottledPacketDataWrapper_SlashPacket); ok { - return x.SlashPacket - } - return nil -} - -func (m *ThrottledPacketDataWrapper) GetVscMaturedPacket() *types.VSCMaturedPacketData { - if x, ok := m.GetData().(*ThrottledPacketDataWrapper_VscMaturedPacket); ok { - return x.VscMaturedPacket - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ThrottledPacketDataWrapper) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ThrottledPacketDataWrapper_SlashPacket)(nil), - (*ThrottledPacketDataWrapper_VscMaturedPacket)(nil), - } -} - type QueryRegisteredConsumerRewardDenomsRequest struct { } @@ -962,7 +704,7 @@ func (m *QueryRegisteredConsumerRewardDenomsRequest) String() string { } func (*QueryRegisteredConsumerRewardDenomsRequest) ProtoMessage() {} func (*QueryRegisteredConsumerRewardDenomsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{19} + return fileDescriptor_422512d7b7586cd7, []int{15} } func (m *QueryRegisteredConsumerRewardDenomsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1003,7 +745,7 @@ func (m *QueryRegisteredConsumerRewardDenomsResponse) String() string { } func (*QueryRegisteredConsumerRewardDenomsResponse) ProtoMessage() {} func (*QueryRegisteredConsumerRewardDenomsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_422512d7b7586cd7, []int{20} + return fileDescriptor_422512d7b7586cd7, []int{16} } func (m *QueryRegisteredConsumerRewardDenomsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1055,10 +797,6 @@ func init() { proto.RegisterType((*QueryValidatorProviderAddrResponse)(nil), "interchain_security.ccv.provider.v1.QueryValidatorProviderAddrResponse") proto.RegisterType((*QueryThrottleStateRequest)(nil), "interchain_security.ccv.provider.v1.QueryThrottleStateRequest") proto.RegisterType((*QueryThrottleStateResponse)(nil), "interchain_security.ccv.provider.v1.QueryThrottleStateResponse") - proto.RegisterType((*QueryThrottledConsumerPacketDataRequest)(nil), "interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataRequest") - proto.RegisterType((*QueryThrottledConsumerPacketDataResponse)(nil), "interchain_security.ccv.provider.v1.QueryThrottledConsumerPacketDataResponse") - proto.RegisterType((*ThrottledSlashPacket)(nil), "interchain_security.ccv.provider.v1.ThrottledSlashPacket") - proto.RegisterType((*ThrottledPacketDataWrapper)(nil), "interchain_security.ccv.provider.v1.ThrottledPacketDataWrapper") proto.RegisterType((*QueryRegisteredConsumerRewardDenomsRequest)(nil), "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsRequest") proto.RegisterType((*QueryRegisteredConsumerRewardDenomsResponse)(nil), "interchain_security.ccv.provider.v1.QueryRegisteredConsumerRewardDenomsResponse") } @@ -1068,90 +806,74 @@ func init() { } var fileDescriptor_422512d7b7586cd7 = []byte{ - // 1321 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x8f, 0x14, 0x45, - 0x18, 0x9d, 0x9e, 0x5d, 0x96, 0xdd, 0x5a, 0x14, 0x2c, 0x10, 0x87, 0x86, 0xcc, 0x60, 0x13, 0x75, - 0x01, 0xed, 0x66, 0x87, 0x98, 0x00, 0xba, 0x0c, 0x33, 0xcb, 0xba, 0x10, 0x20, 0xac, 0xbd, 0x04, - 0x12, 0x35, 0xb4, 0xb5, 0xdd, 0xe5, 0x4c, 0xc7, 0x9e, 0xae, 0xa6, 0xaa, 0x66, 0x96, 0x95, 0x78, - 0x50, 0x13, 0xe5, 0x48, 0x62, 0xbc, 0x79, 0xe0, 0xe4, 0x7f, 0xe1, 0x9d, 0x9b, 0x44, 0x2e, 0x9c, - 0xd0, 0x2c, 0x1e, 0x3c, 0x1a, 0xef, 0x26, 0xa6, 0xab, 0xab, 0x7b, 0x7e, 0xf5, 0xce, 0xf4, 0x0c, - 0xdc, 0x66, 0xaa, 0xeb, 0x7b, 0xdf, 0x7b, 0x6f, 0xbe, 0xaa, 0x7e, 0x03, 0x0c, 0xd7, 0xe7, 0x98, - 0xda, 0x0d, 0xe4, 0xfa, 0x16, 0xc3, 0x76, 0x8b, 0xba, 0x7c, 0xcb, 0xb0, 0xed, 0xb6, 0x11, 0x50, - 0xd2, 0x76, 0x1d, 0x4c, 0x8d, 0xf6, 0xa2, 0x71, 0xa7, 0x85, 0xe9, 0x96, 0x1e, 0x50, 0xc2, 0x09, - 0x3c, 0x96, 0x52, 0xa0, 0xdb, 0x76, 0x5b, 0x8f, 0x0b, 0xf4, 0xf6, 0xa2, 0x7a, 0xa4, 0x4e, 0x48, - 0xdd, 0xc3, 0x06, 0x0a, 0x5c, 0x03, 0xf9, 0x3e, 0xe1, 0x88, 0xbb, 0xc4, 0x67, 0x11, 0x84, 0x7a, - 0xa0, 0x4e, 0xea, 0x44, 0x7c, 0x34, 0xc2, 0x4f, 0x72, 0xb5, 0x24, 0x6b, 0xc4, 0xb7, 0x8d, 0xd6, - 0x17, 0x06, 0x77, 0x9b, 0x98, 0x71, 0xd4, 0x0c, 0xe4, 0x86, 0x72, 0x16, 0xaa, 0x09, 0x8b, 0xa8, - 0xe6, 0xd4, 0x4e, 0x35, 0xed, 0x45, 0x83, 0x35, 0x10, 0xc5, 0x8e, 0x65, 0x13, 0x9f, 0xb5, 0x9a, - 0x49, 0xc5, 0x5b, 0x43, 0x2a, 0x36, 0x5d, 0x8a, 0xa3, 0x6d, 0xda, 0x19, 0x70, 0xf8, 0xe3, 0xd0, - 0x95, 0x65, 0x59, 0xbd, 0x8a, 0x7d, 0xcc, 0x5c, 0x66, 0xe2, 0x3b, 0x2d, 0xcc, 0x38, 0x3c, 0x04, - 0x66, 0x23, 0x08, 0xd7, 0x29, 0x28, 0x47, 0x95, 0x85, 0x39, 0x73, 0xb7, 0xf8, 0x7e, 0xd9, 0xd1, - 0xee, 0x81, 0x23, 0xe9, 0x95, 0x2c, 0x20, 0x3e, 0xc3, 0xf0, 0x53, 0xf0, 0x4a, 0x3d, 0x5a, 0xb2, - 0x18, 0x47, 0x1c, 0x8b, 0xfa, 0xf9, 0xf2, 0x29, 0x7d, 0x27, 0xe3, 0xdb, 0x8b, 0x7a, 0x1f, 0xd6, - 0x7a, 0x58, 0x57, 0x9b, 0x7e, 0xf4, 0xac, 0x94, 0x33, 0xf7, 0xd4, 0xbb, 0xd6, 0xb4, 0x23, 0x40, - 0xed, 0x69, 0xbe, 0x1c, 0xc2, 0xc5, 0xac, 0x35, 0xd4, 0x27, 0x2a, 0x7e, 0x2a, 0x99, 0xd5, 0xc0, - 0x8c, 0x68, 0xcf, 0x0a, 0xca, 0xd1, 0xa9, 0x85, 0xf9, 0xf2, 0x09, 0x3d, 0xc3, 0x2c, 0xe8, 0x02, - 0xc4, 0x94, 0x95, 0xda, 0x71, 0xf0, 0xce, 0x60, 0x8b, 0x75, 0x8e, 0x28, 0x5f, 0xa3, 0x24, 0x20, - 0x0c, 0x79, 0x09, 0x9b, 0xfb, 0x0a, 0x58, 0x18, 0xbd, 0x57, 0x72, 0xfb, 0x0c, 0xcc, 0x05, 0xf1, - 0xa2, 0x74, 0xec, 0x7c, 0x36, 0x7a, 0x12, 0xbc, 0xea, 0x38, 0x6e, 0x38, 0xa4, 0x1d, 0xe8, 0x0e, - 0xa0, 0xb6, 0x00, 0xde, 0x4e, 0x63, 0x42, 0x82, 0x01, 0xd2, 0xdf, 0x2b, 0xe9, 0x02, 0x7b, 0xb6, - 0x26, 0xbf, 0xf4, 0x00, 0xe7, 0xa5, 0xb1, 0x38, 0x9b, 0xb8, 0x49, 0xda, 0xc8, 0x4b, 0xa5, 0x5c, - 0x01, 0xbb, 0x44, 0xeb, 0x21, 0xa3, 0x08, 0x0f, 0x83, 0x39, 0xdb, 0x73, 0xb1, 0xcf, 0xc3, 0x67, - 0x79, 0xf1, 0x6c, 0x36, 0x5a, 0xb8, 0xec, 0x68, 0x3f, 0x28, 0xe0, 0x4d, 0xa1, 0xe4, 0x26, 0xf2, - 0x5c, 0x07, 0x71, 0x42, 0xbb, 0xac, 0xa2, 0xa3, 0x07, 0x1d, 0x2e, 0x81, 0x7d, 0x31, 0x69, 0x0b, - 0x39, 0x0e, 0xc5, 0x8c, 0x45, 0x4d, 0x6a, 0xf0, 0xdf, 0x67, 0xa5, 0x57, 0xb7, 0x50, 0xd3, 0x3b, - 0xa7, 0xc9, 0x07, 0x9a, 0xb9, 0x37, 0xde, 0x5b, 0x8d, 0x56, 0xce, 0xcd, 0xde, 0x7f, 0x58, 0xca, - 0xfd, 0xfd, 0xb0, 0x94, 0xd3, 0xae, 0x03, 0x6d, 0x18, 0x11, 0xe9, 0xe6, 0x71, 0xb0, 0x2f, 0x3e, - 0xca, 0x49, 0xbb, 0x88, 0xd1, 0x5e, 0xbb, 0x6b, 0x7f, 0xd8, 0x6c, 0x50, 0xda, 0x5a, 0x57, 0xf3, - 0x6c, 0xd2, 0x06, 0x7a, 0x0d, 0x91, 0xd6, 0xd7, 0x7f, 0x98, 0xb4, 0x5e, 0x22, 0x1d, 0x69, 0x03, - 0x4e, 0x4a, 0x69, 0x7d, 0xae, 0x69, 0x87, 0xc1, 0x21, 0x01, 0x78, 0xa3, 0x41, 0x09, 0xe7, 0x1e, - 0x16, 0xc7, 0x3e, 0x1e, 0xce, 0x5f, 0xf2, 0xf2, 0xf8, 0xf7, 0x3d, 0x95, 0x6d, 0x4a, 0x60, 0x9e, - 0x79, 0x88, 0x35, 0xac, 0x26, 0xe6, 0x98, 0x8a, 0x0e, 0x53, 0x26, 0x10, 0x4b, 0xd7, 0xc2, 0x15, - 0x58, 0x06, 0xaf, 0x77, 0x6d, 0xb0, 0x90, 0xe7, 0x91, 0x4d, 0xe4, 0xdb, 0x58, 0x68, 0x9f, 0x32, - 0xf7, 0x77, 0xb6, 0x56, 0xe3, 0x47, 0xf0, 0x36, 0x28, 0xf8, 0xf8, 0x2e, 0xb7, 0x28, 0x0e, 0x3c, - 0xec, 0xbb, 0xac, 0x61, 0xd9, 0xc8, 0x77, 0x42, 0xb1, 0xb8, 0x30, 0x25, 0x66, 0x5e, 0xd5, 0xa3, - 0x9b, 0x5f, 0x8f, 0x6f, 0x7e, 0xfd, 0x46, 0x7c, 0xf3, 0xd7, 0x66, 0xc3, 0x3b, 0xec, 0xc1, 0x1f, - 0x25, 0xc5, 0x3c, 0x18, 0xa2, 0x98, 0x31, 0xc8, 0x72, 0x8c, 0x01, 0xd7, 0xc1, 0xee, 0x00, 0xd9, - 0x5f, 0x62, 0xce, 0x0a, 0xd3, 0xe2, 0x56, 0x3a, 0x9b, 0xe9, 0x08, 0xc5, 0x0e, 0x38, 0xeb, 0x21, - 0xe7, 0x35, 0x81, 0x60, 0xc6, 0x48, 0xda, 0x45, 0x79, 0x88, 0x93, 0x5d, 0xf1, 0xc4, 0x45, 0x1b, - 0x2f, 0x22, 0x8e, 0x32, 0xdc, 0xf4, 0xbf, 0xc7, 0x17, 0xd8, 0x50, 0x18, 0x69, 0xfe, 0x90, 0x69, - 0x83, 0x60, 0x9a, 0xb9, 0x5f, 0x45, 0x2e, 0x4f, 0x9b, 0xe2, 0x33, 0xdc, 0x04, 0xfb, 0x83, 0x04, - 0xe4, 0xb2, 0xcf, 0x78, 0x68, 0x36, 0x2b, 0x4c, 0x09, 0x0b, 0x2a, 0xe3, 0x59, 0xd0, 0x61, 0x73, - 0x8b, 0xa2, 0x20, 0xc0, 0x54, 0xbe, 0x3a, 0xd2, 0x3a, 0x68, 0xbf, 0x2a, 0xe0, 0x40, 0x9a, 0x79, - 0xf0, 0x36, 0xd8, 0x53, 0xf7, 0xc8, 0x06, 0xf2, 0x2c, 0xec, 0x73, 0xba, 0x25, 0x2f, 0xb4, 0xf7, - 0x33, 0x51, 0x59, 0x15, 0x85, 0x02, 0x6d, 0x25, 0x2c, 0x96, 0x04, 0xe6, 0x23, 0x40, 0xb1, 0x04, - 0x57, 0xc0, 0xb4, 0x83, 0x38, 0x12, 0x2e, 0xcc, 0x97, 0x4f, 0x0e, 0x7b, 0x1d, 0x76, 0xd1, 0x0a, - 0xc9, 0x4b, 0x34, 0x51, 0xae, 0x3d, 0x55, 0x80, 0xba, 0xb3, 0x72, 0xb8, 0x06, 0xf6, 0x44, 0x23, - 0x1e, 0x69, 0x97, 0x2a, 0xc6, 0xe9, 0x76, 0x29, 0x67, 0x46, 0xc7, 0x48, 0xfa, 0xf2, 0x39, 0x80, - 0x6d, 0x66, 0x5b, 0x4d, 0xc4, 0x5b, 0x61, 0xdc, 0x90, 0xb8, 0xf9, 0xd1, 0x2f, 0xf5, 0x9b, 0xeb, - 0xcb, 0xd7, 0xa2, 0xa2, 0x1e, 0xf0, 0x7d, 0x6d, 0x66, 0xf7, 0xac, 0xd7, 0x66, 0x22, 0x67, 0xb4, - 0x77, 0xc1, 0x09, 0x31, 0x6e, 0x26, 0xae, 0xbb, 0x8c, 0x63, 0xda, 0x99, 0x37, 0x13, 0x6f, 0x22, - 0xea, 0x5c, 0xc4, 0x3e, 0x69, 0x26, 0x6f, 0xaa, 0x15, 0x70, 0x32, 0xd3, 0x6e, 0x39, 0x9f, 0x07, - 0xc1, 0x8c, 0x23, 0x56, 0xc4, 0xcb, 0x7f, 0xce, 0x94, 0xdf, 0xca, 0x3f, 0xbf, 0x06, 0x76, 0x09, - 0x1c, 0xb8, 0xad, 0x80, 0x03, 0x69, 0xc9, 0x06, 0x5e, 0xc8, 0x34, 0x03, 0x43, 0xe2, 0x94, 0x5a, - 0x7d, 0x01, 0x84, 0x88, 0xbf, 0xb6, 0xf2, 0xed, 0x93, 0xbf, 0x7e, 0xcc, 0x57, 0xe0, 0xd2, 0xe8, - 0xc4, 0x9b, 0x5c, 0xed, 0x32, 0x3a, 0x19, 0xf7, 0xe2, 0x93, 0xf9, 0x35, 0x7c, 0xa2, 0x80, 0xfd, - 0x29, 0x19, 0x09, 0x56, 0xc6, 0x67, 0xd8, 0x93, 0xbd, 0xd4, 0x0b, 0x93, 0x03, 0x48, 0x85, 0x67, - 0x85, 0xc2, 0xd3, 0x70, 0x71, 0x0c, 0x85, 0x51, 0x2a, 0x83, 0xdf, 0xe4, 0x41, 0x61, 0x87, 0xa8, - 0xc5, 0xe0, 0xd5, 0x09, 0x99, 0xa5, 0xa6, 0x3a, 0xf5, 0xda, 0x4b, 0x42, 0x93, 0xa2, 0x2f, 0x09, - 0xd1, 0x35, 0x78, 0x61, 0x5c, 0xd1, 0x61, 0xb8, 0xa6, 0xdc, 0x4a, 0x02, 0x13, 0xfc, 0x4f, 0x01, - 0x6f, 0xa4, 0x27, 0x37, 0x06, 0xaf, 0x4c, 0x4c, 0x7a, 0x30, 0x22, 0xaa, 0x57, 0x5f, 0x0e, 0x98, - 0x34, 0x60, 0x55, 0x18, 0x50, 0x85, 0x95, 0x09, 0x0c, 0x20, 0x41, 0x97, 0xfe, 0x7f, 0x14, 0x19, - 0x0e, 0x52, 0x63, 0x16, 0xfc, 0x28, 0x3b, 0xeb, 0x61, 0x81, 0x51, 0x5d, 0x7d, 0x61, 0x1c, 0x29, - 0xbc, 0x2a, 0x84, 0x7f, 0x00, 0xcf, 0x66, 0xf8, 0x0b, 0x1b, 0x03, 0x59, 0x3d, 0xa9, 0x2d, 0x45, - 0x72, 0x77, 0xfc, 0x9a, 0x48, 0x72, 0x4a, 0x90, 0x9c, 0x48, 0x72, 0x5a, 0x0e, 0x9c, 0x4c, 0x72, - 0x4f, 0x72, 0x84, 0xbf, 0x29, 0x00, 0x0e, 0x46, 0x40, 0x78, 0x3e, 0x3b, 0xc5, 0xb4, 0x64, 0xa9, - 0x56, 0x26, 0xae, 0x97, 0xd2, 0xce, 0x08, 0x69, 0x65, 0x78, 0x6a, 0xb4, 0x34, 0x2e, 0x01, 0xa2, - 0xbf, 0xc7, 0xf0, 0xbb, 0x3c, 0x38, 0x3a, 0x2a, 0x65, 0x8d, 0x73, 0x87, 0x8d, 0xce, 0x7c, 0xe3, - 0xdc, 0x61, 0x19, 0xa2, 0x9f, 0x56, 0x13, 0xda, 0x3f, 0x84, 0xe7, 0x46, 0x6b, 0x0f, 0xb0, 0xef, - 0xb8, 0x7e, 0xbd, 0x33, 0xc7, 0x32, 0xb1, 0xc2, 0x9f, 0xf2, 0xe0, 0x58, 0x86, 0xd7, 0x39, 0xbc, - 0x9e, 0x9d, 0x7a, 0xa6, 0x18, 0xa1, 0xae, 0xbd, 0x3c, 0x40, 0x69, 0xc7, 0x15, 0x61, 0xc7, 0x0a, - 0x5c, 0x1e, 0x6d, 0x07, 0x4d, 0x10, 0x3b, 0x8e, 0x50, 0x81, 0x69, 0x45, 0xf1, 0xa4, 0x76, 0xeb, - 0xd1, 0x76, 0x51, 0x79, 0xbc, 0x5d, 0x54, 0xfe, 0xdc, 0x2e, 0x2a, 0x0f, 0x9e, 0x17, 0x73, 0x8f, - 0x9f, 0x17, 0x73, 0x4f, 0x9f, 0x17, 0x73, 0x9f, 0x2c, 0xd5, 0x5d, 0xde, 0x68, 0x6d, 0xe8, 0x36, - 0x69, 0x1a, 0x36, 0x61, 0x4d, 0xc2, 0xba, 0xfa, 0xbd, 0x97, 0xf4, 0x6b, 0x9f, 0x36, 0xee, 0xf6, - 0xcd, 0xdf, 0x56, 0x80, 0xd9, 0xc6, 0x8c, 0xf8, 0xb7, 0x72, 0xfa, 0xff, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x03, 0xbe, 0x75, 0x9c, 0x41, 0x13, 0x00, 0x00, + // 1060 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0xdc, 0x44, + 0x14, 0x5e, 0x27, 0x34, 0x24, 0x13, 0x20, 0xd5, 0xb4, 0x94, 0xad, 0x13, 0xed, 0x16, 0x57, 0x40, + 0x5a, 0xc0, 0xce, 0x6e, 0x2e, 0x6d, 0x51, 0xba, 0xd9, 0x0d, 0x21, 0x54, 0x6d, 0xd5, 0xe0, 0x56, + 0x20, 0x01, 0xc2, 0x9a, 0xd8, 0xc3, 0xae, 0x25, 0xaf, 0xc7, 0x9d, 0x99, 0x75, 0x1a, 0x55, 0x1c, + 0xe0, 0x00, 0x3d, 0x56, 0x42, 0x70, 0xee, 0x9f, 0xd3, 0x1b, 0x45, 0xbd, 0x70, 0x2a, 0x28, 0xe1, + 0xc0, 0x11, 0x71, 0x47, 0xaa, 0x3c, 0x1e, 0x7b, 0x7f, 0x39, 0xbb, 0xce, 0x26, 0x37, 0x7b, 0xe6, + 0xbd, 0xef, 0x7d, 0xdf, 0xdb, 0x37, 0xf3, 0x79, 0x81, 0xe1, 0xfa, 0x1c, 0x53, 0xbb, 0x85, 0x5c, + 0xdf, 0x62, 0xd8, 0xee, 0x50, 0x97, 0xef, 0x19, 0xb6, 0x1d, 0x1a, 0x01, 0x25, 0xa1, 0xeb, 0x60, + 0x6a, 0x84, 0x15, 0xe3, 0x7e, 0x07, 0xd3, 0x3d, 0x3d, 0xa0, 0x84, 0x13, 0x78, 0x31, 0x23, 0x41, + 0xb7, 0xed, 0x50, 0x4f, 0x12, 0xf4, 0xb0, 0xa2, 0x2e, 0x35, 0x09, 0x69, 0x7a, 0xd8, 0x40, 0x81, + 0x6b, 0x20, 0xdf, 0x27, 0x1c, 0x71, 0x97, 0xf8, 0x2c, 0x86, 0x50, 0xcf, 0x36, 0x49, 0x93, 0x88, + 0x47, 0x23, 0x7a, 0x92, 0xab, 0x65, 0x99, 0x23, 0xde, 0x76, 0x3a, 0xdf, 0x1a, 0xdc, 0x6d, 0x63, + 0xc6, 0x51, 0x3b, 0x90, 0x01, 0xd5, 0x3c, 0x54, 0x53, 0x16, 0x71, 0xce, 0xca, 0x61, 0x39, 0x61, + 0xc5, 0x60, 0x2d, 0x44, 0xb1, 0x63, 0xd9, 0xc4, 0x67, 0x9d, 0x76, 0x9a, 0xf1, 0xce, 0x88, 0x8c, + 0x5d, 0x97, 0xe2, 0x38, 0x4c, 0xbb, 0x02, 0x16, 0x3f, 0x8b, 0xba, 0xb2, 0x21, 0xb3, 0xb7, 0xb0, + 0x8f, 0x99, 0xcb, 0x4c, 0x7c, 0xbf, 0x83, 0x19, 0x87, 0xe7, 0xc1, 0x6c, 0x0c, 0xe1, 0x3a, 0x45, + 0xe5, 0x82, 0xb2, 0x3c, 0x67, 0xbe, 0x2a, 0xde, 0x6f, 0x38, 0xda, 0x43, 0xb0, 0x94, 0x9d, 0xc9, + 0x02, 0xe2, 0x33, 0x0c, 0xbf, 0x02, 0xaf, 0x37, 0xe3, 0x25, 0x8b, 0x71, 0xc4, 0xb1, 0xc8, 0x9f, + 0xaf, 0xae, 0xe8, 0x87, 0x35, 0x3e, 0xac, 0xe8, 0x03, 0x58, 0x77, 0xa3, 0xbc, 0xc6, 0x2b, 0x4f, + 0x5f, 0x94, 0x0b, 0xe6, 0x6b, 0xcd, 0x9e, 0x35, 0x6d, 0x09, 0xa8, 0x7d, 0xc5, 0x37, 0x22, 0xb8, + 0x84, 0xb5, 0x86, 0x06, 0x44, 0x25, 0xbb, 0x92, 0x59, 0x03, 0xcc, 0x88, 0xf2, 0xac, 0xa8, 0x5c, + 0x98, 0x5e, 0x9e, 0xaf, 0x5e, 0xd6, 0x73, 0xcc, 0x82, 0x2e, 0x40, 0x4c, 0x99, 0xa9, 0x5d, 0x02, + 0xef, 0x0d, 0x97, 0xb8, 0xcb, 0x11, 0xe5, 0xdb, 0x94, 0x04, 0x84, 0x21, 0x2f, 0x65, 0xf3, 0x48, + 0x01, 0xcb, 0xe3, 0x63, 0x25, 0xb7, 0xaf, 0xc1, 0x5c, 0x90, 0x2c, 0xca, 0x8e, 0x5d, 0xcf, 0x47, + 0x4f, 0x82, 0xd7, 0x1d, 0xc7, 0x8d, 0x86, 0xb4, 0x0b, 0xdd, 0x05, 0xd4, 0x96, 0xc1, 0xbb, 0x59, + 0x4c, 0x48, 0x30, 0x44, 0xfa, 0x47, 0x25, 0x5b, 0x60, 0x5f, 0x68, 0xfa, 0x4b, 0x0f, 0x71, 0x5e, + 0x3b, 0x12, 0x67, 0x13, 0xb7, 0x49, 0x88, 0xbc, 0x4c, 0xca, 0x35, 0x70, 0x4a, 0x94, 0x1e, 0x31, + 0x8a, 0x70, 0x11, 0xcc, 0xd9, 0x9e, 0x8b, 0x7d, 0x1e, 0xed, 0x4d, 0x89, 0xbd, 0xd9, 0x78, 0xe1, + 0x86, 0xa3, 0xfd, 0xa4, 0x80, 0xb7, 0x85, 0x92, 0xcf, 0x91, 0xe7, 0x3a, 0x88, 0x13, 0xda, 0xd3, + 0x2a, 0x3a, 0x7e, 0xd0, 0xe1, 0x1a, 0x38, 0x9d, 0x90, 0xb6, 0x90, 0xe3, 0x50, 0xcc, 0x58, 0x5c, + 0xa4, 0x01, 0xff, 0x7b, 0x51, 0x7e, 0x63, 0x0f, 0xb5, 0xbd, 0x6b, 0x9a, 0xdc, 0xd0, 0xcc, 0x85, + 0x24, 0xb6, 0x1e, 0xaf, 0x5c, 0x9b, 0x7d, 0xf4, 0xa4, 0x5c, 0xf8, 0xe7, 0x49, 0xb9, 0xa0, 0xdd, + 0x01, 0xda, 0x28, 0x22, 0xb2, 0x9b, 0x97, 0xc0, 0xe9, 0xe4, 0x28, 0xa7, 0xe5, 0x62, 0x46, 0x0b, + 0x76, 0x4f, 0x7c, 0x54, 0x6c, 0x58, 0xda, 0x76, 0x4f, 0xf1, 0x7c, 0xd2, 0x86, 0x6a, 0x8d, 0x90, + 0x36, 0x50, 0x7f, 0x94, 0xb4, 0x7e, 0x22, 0x5d, 0x69, 0x43, 0x9d, 0x94, 0xd2, 0x06, 0xba, 0xa6, + 0x2d, 0x82, 0xf3, 0x02, 0xf0, 0x5e, 0x8b, 0x12, 0xce, 0x3d, 0x2c, 0x8e, 0x7d, 0x32, 0x9c, 0xbf, + 0x2b, 0xf2, 0xf8, 0x0f, 0xec, 0xca, 0x32, 0x65, 0x30, 0xcf, 0x3c, 0xc4, 0x5a, 0x56, 0x1b, 0x73, + 0x4c, 0x45, 0x85, 0x69, 0x13, 0x88, 0xa5, 0xdb, 0xd1, 0x0a, 0xac, 0x82, 0x37, 0x7b, 0x02, 0x2c, + 0xe4, 0x79, 0x64, 0x17, 0xf9, 0x36, 0x16, 0xda, 0xa7, 0xcd, 0x33, 0xdd, 0xd0, 0x7a, 0xb2, 0x05, + 0xbf, 0x01, 0x45, 0x1f, 0x3f, 0xe0, 0x16, 0xc5, 0x81, 0x87, 0x7d, 0x97, 0xb5, 0x2c, 0x1b, 0xf9, + 0x4e, 0x24, 0x16, 0x17, 0xa7, 0xc5, 0xcc, 0xab, 0x7a, 0x7c, 0xf3, 0xeb, 0xc9, 0xcd, 0xaf, 0xdf, + 0x4b, 0x6e, 0xfe, 0xc6, 0x6c, 0x74, 0x87, 0x3d, 0xfe, 0xb3, 0xac, 0x98, 0xe7, 0x22, 0x14, 0x33, + 0x01, 0xd9, 0x48, 0x30, 0xb4, 0x0f, 0xc0, 0x65, 0x21, 0xc9, 0xc4, 0x4d, 0x97, 0x71, 0x4c, 0xb1, + 0xd3, 0x3d, 0x1d, 0xbb, 0x88, 0x3a, 0x1f, 0x63, 0x9f, 0xb4, 0xd3, 0xe3, 0xb9, 0x09, 0xde, 0xcf, + 0x15, 0x2d, 0x3b, 0x72, 0x0e, 0xcc, 0x38, 0x62, 0x45, 0xdc, 0x78, 0x73, 0xa6, 0x7c, 0xab, 0xfe, + 0xba, 0x00, 0x4e, 0x09, 0x1c, 0xb8, 0xaf, 0x80, 0xb3, 0x59, 0xd7, 0x39, 0x5c, 0xcf, 0x75, 0x92, + 0x47, 0x78, 0x88, 0x5a, 0x3f, 0x06, 0x42, 0xcc, 0x5f, 0xdb, 0xfc, 0xe1, 0xf9, 0xdf, 0x3f, 0x4f, + 0xd5, 0xe0, 0xda, 0x78, 0x9b, 0x4f, 0xe7, 0x59, 0xfa, 0x85, 0xf1, 0x30, 0x19, 0xfe, 0xef, 0xe0, + 0x73, 0x05, 0x9c, 0xc9, 0x30, 0x06, 0x58, 0x3b, 0x3a, 0xc3, 0x3e, 0xc3, 0x51, 0xd7, 0x27, 0x07, + 0x90, 0x0a, 0xaf, 0x0a, 0x85, 0xab, 0xb0, 0x72, 0x04, 0x85, 0xb1, 0x15, 0xc1, 0xef, 0xa7, 0x40, + 0xf1, 0x10, 0x7f, 0x61, 0xf0, 0xd6, 0x84, 0xcc, 0x32, 0xad, 0x4c, 0xbd, 0x7d, 0x42, 0x68, 0x52, + 0xf4, 0xa7, 0x42, 0x74, 0x03, 0xae, 0x1f, 0x55, 0x74, 0xf4, 0x45, 0x41, 0xb9, 0x95, 0xba, 0x04, + 0xfc, 0x5f, 0x01, 0x6f, 0x65, 0xdb, 0x15, 0x83, 0x37, 0x27, 0x26, 0x3d, 0xec, 0x8b, 0xea, 0xad, + 0x93, 0x01, 0x93, 0x0d, 0xd8, 0x12, 0x0d, 0xa8, 0xc3, 0xda, 0x04, 0x0d, 0x20, 0x41, 0x8f, 0xfe, + 0x7f, 0x93, 0x1b, 0x31, 0xd3, 0x5b, 0xe0, 0x27, 0xf9, 0x59, 0x8f, 0x72, 0x49, 0x75, 0xeb, 0xd8, + 0x38, 0x52, 0x78, 0x5d, 0x08, 0xff, 0x08, 0x5e, 0xcd, 0xf1, 0xdd, 0x9e, 0x00, 0x59, 0x7d, 0x56, + 0x95, 0x21, 0xb9, 0xd7, 0x73, 0x26, 0x92, 0x9c, 0xe1, 0x9e, 0x13, 0x49, 0xce, 0x32, 0xbf, 0xc9, + 0x24, 0xf7, 0xd9, 0x25, 0xfc, 0x4d, 0x01, 0x70, 0xd8, 0xf7, 0xe0, 0xf5, 0xfc, 0x14, 0xb3, 0xec, + 0x54, 0xad, 0x4d, 0x9c, 0x2f, 0xa5, 0x5d, 0x11, 0xd2, 0xaa, 0x70, 0x65, 0xbc, 0x34, 0x2e, 0x01, + 0xe2, 0xff, 0x04, 0xf0, 0x97, 0x29, 0x70, 0x31, 0x87, 0x91, 0xc1, 0x3b, 0xf9, 0x29, 0xe6, 0x32, + 0x50, 0x75, 0xfb, 0xe4, 0x00, 0x65, 0x13, 0x6e, 0x8a, 0x26, 0x6c, 0xc2, 0x8d, 0xf1, 0x4d, 0xa0, + 0x29, 0x62, 0x77, 0xa6, 0xa9, 0xc0, 0xb4, 0x62, 0x63, 0x6e, 0x7c, 0xf1, 0x74, 0xbf, 0xa4, 0x3c, + 0xdb, 0x2f, 0x29, 0x7f, 0xed, 0x97, 0x94, 0xc7, 0x07, 0xa5, 0xc2, 0xb3, 0x83, 0x52, 0xe1, 0x8f, + 0x83, 0x52, 0xe1, 0xcb, 0xb5, 0xa6, 0xcb, 0x5b, 0x9d, 0x1d, 0xdd, 0x26, 0x6d, 0xc3, 0x26, 0xac, + 0x4d, 0x58, 0x4f, 0xbd, 0x0f, 0xd3, 0x7a, 0xe1, 0xaa, 0xf1, 0x60, 0xa0, 0xf3, 0x7b, 0x01, 0x66, + 0x3b, 0x33, 0xe2, 0xe3, 0x64, 0xf5, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0xad, 0x57, 0x98, 0xb7, + 0x30, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1185,9 +907,6 @@ type QueryClient interface { // QueryThrottleState returns the main on-chain state relevant to currently // throttled slash packets QueryThrottleState(ctx context.Context, in *QueryThrottleStateRequest, opts ...grpc.CallOption) (*QueryThrottleStateResponse, error) - // QueryThrottledConsumerPacketData returns a list of pending packet data - // instances (slash packet and vsc matured) for a single consumer chain - QueryThrottledConsumerPacketData(ctx context.Context, in *QueryThrottledConsumerPacketDataRequest, opts ...grpc.CallOption) (*QueryThrottledConsumerPacketDataResponse, error) // QueryRegisteredConsumerRewardDenoms returns a list of consumer reward // denoms that are registered QueryRegisteredConsumerRewardDenoms(ctx context.Context, in *QueryRegisteredConsumerRewardDenomsRequest, opts ...grpc.CallOption) (*QueryRegisteredConsumerRewardDenomsResponse, error) @@ -1264,15 +983,6 @@ func (c *queryClient) QueryThrottleState(ctx context.Context, in *QueryThrottleS return out, nil } -func (c *queryClient) QueryThrottledConsumerPacketData(ctx context.Context, in *QueryThrottledConsumerPacketDataRequest, opts ...grpc.CallOption) (*QueryThrottledConsumerPacketDataResponse, error) { - out := new(QueryThrottledConsumerPacketDataResponse) - err := c.cc.Invoke(ctx, "/interchain_security.ccv.provider.v1.Query/QueryThrottledConsumerPacketData", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *queryClient) QueryRegisteredConsumerRewardDenoms(ctx context.Context, in *QueryRegisteredConsumerRewardDenomsRequest, opts ...grpc.CallOption) (*QueryRegisteredConsumerRewardDenomsResponse, error) { out := new(QueryRegisteredConsumerRewardDenomsResponse) err := c.cc.Invoke(ctx, "/interchain_security.ccv.provider.v1.Query/QueryRegisteredConsumerRewardDenoms", in, out, opts...) @@ -1303,9 +1013,6 @@ type QueryServer interface { // QueryThrottleState returns the main on-chain state relevant to currently // throttled slash packets QueryThrottleState(context.Context, *QueryThrottleStateRequest) (*QueryThrottleStateResponse, error) - // QueryThrottledConsumerPacketData returns a list of pending packet data - // instances (slash packet and vsc matured) for a single consumer chain - QueryThrottledConsumerPacketData(context.Context, *QueryThrottledConsumerPacketDataRequest) (*QueryThrottledConsumerPacketDataResponse, error) // QueryRegisteredConsumerRewardDenoms returns a list of consumer reward // denoms that are registered QueryRegisteredConsumerRewardDenoms(context.Context, *QueryRegisteredConsumerRewardDenomsRequest) (*QueryRegisteredConsumerRewardDenomsResponse, error) @@ -1336,9 +1043,6 @@ func (*UnimplementedQueryServer) QueryValidatorProviderAddr(ctx context.Context, func (*UnimplementedQueryServer) QueryThrottleState(ctx context.Context, req *QueryThrottleStateRequest) (*QueryThrottleStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryThrottleState not implemented") } -func (*UnimplementedQueryServer) QueryThrottledConsumerPacketData(ctx context.Context, req *QueryThrottledConsumerPacketDataRequest) (*QueryThrottledConsumerPacketDataResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryThrottledConsumerPacketData not implemented") -} func (*UnimplementedQueryServer) QueryRegisteredConsumerRewardDenoms(ctx context.Context, req *QueryRegisteredConsumerRewardDenomsRequest) (*QueryRegisteredConsumerRewardDenomsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryRegisteredConsumerRewardDenoms not implemented") } @@ -1473,24 +1177,6 @@ func _Query_QueryThrottleState_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Query_QueryThrottledConsumerPacketData_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryThrottledConsumerPacketDataRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).QueryThrottledConsumerPacketData(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/interchain_security.ccv.provider.v1.Query/QueryThrottledConsumerPacketData", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).QueryThrottledConsumerPacketData(ctx, req.(*QueryThrottledConsumerPacketDataRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Query_QueryRegisteredConsumerRewardDenoms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryRegisteredConsumerRewardDenomsRequest) if err := dec(in); err != nil { @@ -1541,10 +1227,6 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "QueryThrottleState", Handler: _Query_QueryThrottleState_Handler, }, - { - MethodName: "QueryThrottledConsumerPacketData", - Handler: _Query_QueryThrottledConsumerPacketData_Handler, - }, { MethodName: "QueryRegisteredConsumerRewardDenoms", Handler: _Query_QueryRegisteredConsumerRewardDenoms_Handler, @@ -2007,20 +1689,6 @@ func (m *QueryThrottleStateResponse) MarshalToSizedBuffer(dAtA []byte) (int, err _ = i var l int _ = l - if len(m.Packets) > 0 { - for iNdEx := len(m.Packets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Packets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } n4, err4 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.NextReplenishCandidate, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.NextReplenishCandidate):]) if err4 != nil { return 0, err4 @@ -2042,7 +1710,7 @@ func (m *QueryThrottleStateResponse) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *QueryThrottledConsumerPacketDataRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryRegisteredConsumerRewardDenomsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2052,27 +1720,20 @@ func (m *QueryThrottledConsumerPacketDataRequest) Marshal() (dAtA []byte, err er return dAtA[:n], nil } -func (m *QueryThrottledConsumerPacketDataRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryRegisteredConsumerRewardDenomsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryThrottledConsumerPacketDataRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryRegisteredConsumerRewardDenomsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *QueryThrottledConsumerPacketDataResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryRegisteredConsumerRewardDenomsResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2082,245 +1743,56 @@ func (m *QueryThrottledConsumerPacketDataResponse) Marshal() (dAtA []byte, err e return dAtA[:n], nil } -func (m *QueryThrottledConsumerPacketDataResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryRegisteredConsumerRewardDenomsResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryThrottledConsumerPacketDataResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryRegisteredConsumerRewardDenomsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.PacketDataInstances) > 0 { - for iNdEx := len(m.PacketDataInstances) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PacketDataInstances[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } + if len(m.Denoms) > 0 { + for iNdEx := len(m.Denoms) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Denoms[iNdEx]) + copy(dAtA[i:], m.Denoms[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Denoms[iNdEx]))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0xa } } - if m.Size_ != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.Size_)) - i-- - dAtA[i] = 0x10 - } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintQuery(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *ThrottledSlashPacket) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ } - return dAtA[:n], nil + dAtA[offset] = uint8(v) + return base } - -func (m *ThrottledSlashPacket) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (m *QueryConsumerGenesisRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n } -func (m *ThrottledSlashPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.GlobalEntry.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ThrottledPacketDataWrapper) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ThrottledPacketDataWrapper) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ThrottledPacketDataWrapper) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Data != nil { - { - size := m.Data.Size() - i -= size - if _, err := m.Data.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *ThrottledPacketDataWrapper_SlashPacket) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ThrottledPacketDataWrapper_SlashPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.SlashPacket != nil { - { - size, err := m.SlashPacket.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *ThrottledPacketDataWrapper_VscMaturedPacket) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ThrottledPacketDataWrapper_VscMaturedPacket) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.VscMaturedPacket != nil { - { - size, err := m.VscMaturedPacket.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *QueryRegisteredConsumerRewardDenomsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRegisteredConsumerRewardDenomsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRegisteredConsumerRewardDenomsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryRegisteredConsumerRewardDenomsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryRegisteredConsumerRewardDenomsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryRegisteredConsumerRewardDenomsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Denoms) > 0 { - for iNdEx := len(m.Denoms) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Denoms[iNdEx]) - copy(dAtA[i:], m.Denoms[iNdEx]) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Denoms[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryConsumerGenesisRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryConsumerGenesisResponse) Size() (n int) { - if m == nil { - return 0 - } +func (m *QueryConsumerGenesisResponse) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = m.GenesisState.Size() @@ -2496,99 +1968,9 @@ func (m *QueryThrottleStateResponse) Size() (n int) { } l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.NextReplenishCandidate) n += 1 + l + sovQuery(uint64(l)) - if len(m.Packets) > 0 { - for _, e := range m.Packets { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryThrottledConsumerPacketDataRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryThrottledConsumerPacketDataResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if m.Size_ != 0 { - n += 1 + sovQuery(uint64(m.Size_)) - } - if len(m.PacketDataInstances) > 0 { - for _, e := range m.PacketDataInstances { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *ThrottledSlashPacket) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.GlobalEntry.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.Data.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *ThrottledPacketDataWrapper) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Data != nil { - n += m.Data.Size() - } return n } -func (m *ThrottledPacketDataWrapper_SlashPacket) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SlashPacket != nil { - l = m.SlashPacket.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} -func (m *ThrottledPacketDataWrapper_VscMaturedPacket) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.VscMaturedPacket != nil { - l = m.VscMaturedPacket.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} func (m *QueryRegisteredConsumerRewardDenomsRequest) Size() (n int) { if m == nil { return 0 @@ -3846,493 +3228,6 @@ func (m *QueryThrottleStateResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Packets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Packets = append(m.Packets, &ThrottledSlashPacket{}) - if err := m.Packets[len(m.Packets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryThrottledConsumerPacketDataRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryThrottledConsumerPacketDataRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryThrottledConsumerPacketDataRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryThrottledConsumerPacketDataResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryThrottledConsumerPacketDataResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryThrottledConsumerPacketDataResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) - } - m.Size_ = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Size_ |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PacketDataInstances", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PacketDataInstances = append(m.PacketDataInstances, ThrottledPacketDataWrapper{}) - if err := m.PacketDataInstances[len(m.PacketDataInstances)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ThrottledSlashPacket) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ThrottledSlashPacket: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ThrottledSlashPacket: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalEntry", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.GlobalEntry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ThrottledPacketDataWrapper) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ThrottledPacketDataWrapper: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ThrottledPacketDataWrapper: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SlashPacket", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &types.SlashPacketData{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Data = &ThrottledPacketDataWrapper_SlashPacket{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VscMaturedPacket", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &types.VSCMaturedPacketData{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Data = &ThrottledPacketDataWrapper_VscMaturedPacket{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/x/ccv/provider/types/query.pb.gw.go b/x/ccv/provider/types/query.pb.gw.go index 6a249ca2a2..1a4b418158 100644 --- a/x/ccv/provider/types/query.pb.gw.go +++ b/x/ccv/provider/types/query.pb.gw.go @@ -231,42 +231,6 @@ func local_request_Query_QueryThrottleState_0(ctx context.Context, marshaler run } -var ( - filter_Query_QueryThrottledConsumerPacketData_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_QueryThrottledConsumerPacketData_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryThrottledConsumerPacketDataRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryThrottledConsumerPacketData_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.QueryThrottledConsumerPacketData(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_QueryThrottledConsumerPacketData_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryThrottledConsumerPacketDataRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryThrottledConsumerPacketData_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.QueryThrottledConsumerPacketData(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_QueryRegisteredConsumerRewardDenoms_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryRegisteredConsumerRewardDenomsRequest var metadata runtime.ServerMetadata @@ -452,29 +416,6 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("GET", pattern_Query_QueryThrottledConsumerPacketData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_QueryThrottledConsumerPacketData_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryThrottledConsumerPacketData_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_QueryRegisteredConsumerRewardDenoms_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -679,26 +620,6 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("GET", pattern_Query_QueryThrottledConsumerPacketData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_QueryThrottledConsumerPacketData_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryThrottledConsumerPacketData_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Query_QueryRegisteredConsumerRewardDenoms_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -737,8 +658,6 @@ var ( pattern_Query_QueryThrottleState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "provider", "throttle_state"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_QueryThrottledConsumerPacketData_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "provider", "pending_consumer_packets"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_QueryRegisteredConsumerRewardDenoms_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"interchain_security", "ccv", "provider", "registered_consumer_reward_denoms"}, "", runtime.AssumeColonVerbOpt(false))) ) @@ -757,7 +676,5 @@ var ( forward_Query_QueryThrottleState_0 = runtime.ForwardResponseMessage - forward_Query_QueryThrottledConsumerPacketData_0 = runtime.ForwardResponseMessage - forward_Query_QueryRegisteredConsumerRewardDenoms_0 = runtime.ForwardResponseMessage ) diff --git a/x/ccv/types/codec.go b/x/ccv/types/codec.go index d2815ae9b7..3db65608b2 100644 --- a/x/ccv/types/codec.go +++ b/x/ccv/types/codec.go @@ -5,31 +5,12 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" ) -// RegisterLegacyAminoCodec registers the necessary x/ibc transfer interfaces and concrete types -// on the provided LegacyAmino codec. These types are used for Amino JSON serialization. -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { -} - -// RegisterInterfaces register the ibc transfer module interfaces to protobuf -// Any. -func RegisterInterfaces(registry codectypes.InterfaceRegistry) { -} - -var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global x/ibc-transfer module codec. Note, the codec - // should ONLY be used in certain instances of tests and for JSON encoding. - // - // The actual codec used for serialization should be provided to x/ibc transfer and - // defined at the application level. - ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) - - // AminoCdc is a amino codec created to support amino json compatible msgs. - AminoCdc = codec.NewAminoCodec(amino) -) +// ModuleCdc references the global x/ibc-transfer module codec. Note, the codec +// should ONLY be used in certain instances of tests and for JSON encoding. +// +// The actual codec used for serialization should be provided to x/ibc transfer and +// defined at the application level. +var ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) func init() { - RegisterLegacyAminoCodec(amino) - amino.Seal() } diff --git a/x/ccv/types/errors.go b/x/ccv/types/errors.go index 79c0e1e31c..b719e60479 100644 --- a/x/ccv/types/errors.go +++ b/x/ccv/types/errors.go @@ -6,23 +6,14 @@ import ( // CCV sentinel errors var ( - ErrInvalidPacketData = errorsmod.Register(ModuleName, 2, "invalid CCV packet data") - ErrInvalidPacketTimeout = errorsmod.Register(ModuleName, 3, "invalid packet timeout") - ErrInvalidVersion = errorsmod.Register(ModuleName, 4, "invalid CCV version") - ErrInvalidChannelFlow = errorsmod.Register(ModuleName, 5, "invalid message sent to channel end") - ErrInvalidConsumerChain = errorsmod.Register(ModuleName, 6, "invalid consumer chain") - ErrInvalidProviderChain = errorsmod.Register(ModuleName, 7, "invalid provider chain") - ErrInvalidStatus = errorsmod.Register(ModuleName, 8, "invalid channel status") - ErrInvalidGenesis = errorsmod.Register(ModuleName, 9, "invalid genesis state") - ErrDuplicateChannel = errorsmod.Register(ModuleName, 10, "CCV channel already exists") - ErrInvalidVSCMaturedId = errorsmod.Register(ModuleName, 11, "invalid vscId for VSC packet") - ErrInvalidVSCMaturedTime = errorsmod.Register(ModuleName, 12, "invalid maturity time for VSC packet") - ErrInvalidConsumerState = errorsmod.Register(ModuleName, 13, "provider chain has invalid state for consumer chain") - ErrInvalidConsumerClient = errorsmod.Register(ModuleName, 14, "ccv channel is not built on correct client") - ErrInvalidProposal = errorsmod.Register(ModuleName, 15, "invalid proposal") - ErrInvalidHandshakeMetadata = errorsmod.Register(ModuleName, 16, "invalid provider handshake metadata") - ErrChannelNotFound = errorsmod.Register(ModuleName, 17, "channel not found") - ErrClientNotFound = errorsmod.Register(ModuleName, 18, "client not found") - ErrDuplicateConsumerChain = errorsmod.Register(ModuleName, 19, "consumer chain already exists") - ErrConsumerChainNotFound = errorsmod.Register(ModuleName, 20, "consumer chain not found") + ErrInvalidPacketData = errorsmod.Register(ModuleName, 1, "invalid CCV packet data") + ErrInvalidVersion = errorsmod.Register(ModuleName, 2, "invalid CCV version") + ErrInvalidChannelFlow = errorsmod.Register(ModuleName, 3, "invalid message sent to channel end") + ErrInvalidGenesis = errorsmod.Register(ModuleName, 4, "invalid genesis state") + ErrDuplicateChannel = errorsmod.Register(ModuleName, 5, "CCV channel already exists") + ErrInvalidVSCMaturedId = errorsmod.Register(ModuleName, 6, "invalid vscId for VSC packet") + ErrInvalidVSCMaturedTime = errorsmod.Register(ModuleName, 7, "invalid maturity time for VSC packet") + ErrInvalidHandshakeMetadata = errorsmod.Register(ModuleName, 8, "invalid provider handshake metadata") + ErrChannelNotFound = errorsmod.Register(ModuleName, 9, "channel not found") + ErrClientNotFound = errorsmod.Register(ModuleName, 10, "client not found") ) diff --git a/x/ccv/types/events.go b/x/ccv/types/events.go index 82462f6530..7c7343021e 100644 --- a/x/ccv/types/events.go +++ b/x/ccv/types/events.go @@ -2,45 +2,17 @@ package types // CCV events const ( - EventTypeTimeout = "timeout" - EventTypePacket = "ccv_packet" - EventTypeChannelEstablished = "channel_established" - EventTypeFeeTransferChannelOpened = "fee_transfer_channel_opened" - EventTypeConsumerClientCreated = "consumer_client_created" - EventTypeAssignConsumerKey = "assign_consumer_key" - EventTypeAddConsumerRewardDenom = "add_consumer_reward_denom" - EventTypeRemoveConsumerRewardDenom = "remove_consumer_reward_denom" - - EventTypeExecuteConsumerChainSlash = "execute_consumer_chain_slash" - EventTypeFeeDistribution = "fee_distribution" - EventTypeConsumerSlashRequest = "consumer_slash_request" - EventTypeVSCMatured = "vsc_matured" + EventTypeTimeout = "timeout" + EventTypePacket = "ccv_packet" + EventTypeChannelEstablished = "channel_established" AttributeKeyAckSuccess = "success" AttributeKeyAck = "acknowledgement" AttributeKeyAckError = "error" - AttributeChainID = "chain_id" - AttributeValidatorAddress = "validator_address" - AttributeValidatorConsumerAddress = "validator_consumer_address" - AttributeInfractionType = "infraction_type" - AttributeInfractionHeight = "infraction_height" - AttributeConsumerHeight = "consumer_height" - AttributeValSetUpdateID = "valset_update_id" - AttributeTimestamp = "timestamp" - AttributeInitialHeight = "initial_height" - AttributeInitializationTimeout = "initialization_timeout" - AttributeTrustingPeriod = "trusting_period" - AttributeUnbondingPeriod = "unbonding_period" - AttributeProviderValidatorAddress = "provider_validator_address" - AttributeConsumerConsensusPubKey = "consumer_consensus_pub_key" - - AttributeDistributionCurrentHeight = "current_distribution_height" - //#nosec G101 -- (false positive) this is not a hardcoded credential - AttributeDistributionNextHeight = "next_distribution_height" - AttributeDistributionFraction = "distribution_fraction" - AttributeDistributionTotal = "total" - AttributeDistributionToProvider = "provider_amount" + AttributeChainID = "chain_id" + AttributeValidatorAddress = "validator_address" + AttributeInfractionType = "infraction_type" - AttributeConsumerRewardDenom = "consumer_reward_denom" + AttributeValSetUpdateID = "valset_update_id" ) diff --git a/x/ccv/types/params.go b/x/ccv/types/params.go index 1e2d6d180a..c80e353d66 100644 --- a/x/ccv/types/params.go +++ b/x/ccv/types/params.go @@ -39,6 +39,9 @@ const ( // By default, the bottom 5% of the validator set can opt out of validating consumer chains DefaultSoftOptOutThreshold = "0.05" + + // Default retry delay period is 1 hour. + DefaultRetryDelayPeriod = time.Hour ) // Reflection based keys for params subspace @@ -54,6 +57,7 @@ var ( KeySoftOptOutThreshold = []byte("SoftOptOutThreshold") KeyRewardDenoms = []byte("RewardDenoms") KeyProviderRewardDenoms = []byte("ProviderRewardDenoms") + KeyRetryDelayPeriod = []byte("RetryDelayPeriod") ) // ParamKeyTable type declaration for parameters @@ -66,7 +70,8 @@ func NewParams(enabled bool, blocksPerDistributionTransmission int64, distributionTransmissionChannel, providerFeePoolAddrStr string, ccvTimeoutPeriod, transferTimeoutPeriod time.Duration, consumerRedistributionFraction string, historicalEntries int64, - consumerUnbondingPeriod time.Duration, softOptOutThreshold string, rewardDenoms, providerRewardDenoms []string, + consumerUnbondingPeriod time.Duration, softOptOutThreshold string, + rewardDenoms, providerRewardDenoms []string, retryDelayPeriod time.Duration, ) ConsumerParams { return ConsumerParams{ Enabled: enabled, @@ -81,6 +86,7 @@ func NewParams(enabled bool, blocksPerDistributionTransmission int64, SoftOptOutThreshold: softOptOutThreshold, RewardDenoms: rewardDenoms, ProviderRewardDenoms: providerRewardDenoms, + RetryDelayPeriod: retryDelayPeriod, } } @@ -101,6 +107,7 @@ func DefaultParams() ConsumerParams { DefaultSoftOptOutThreshold, rewardDenoms, provideRewardDenoms, + DefaultRetryDelayPeriod, ) } @@ -142,6 +149,9 @@ func (p ConsumerParams) Validate() error { if err := ValidateDenoms(p.ProviderRewardDenoms); err != nil { return err } + if err := ValidateDuration(p.RetryDelayPeriod); err != nil { + return err + } return nil } @@ -171,6 +181,8 @@ func (p *ConsumerParams) ParamSetPairs() paramtypes.ParamSetPairs { p.RewardDenoms, ValidateDenoms), paramtypes.NewParamSetPair(KeyProviderRewardDenoms, p.ProviderRewardDenoms, ValidateDenoms), + paramtypes.NewParamSetPair(KeyRetryDelayPeriod, + p.RetryDelayPeriod, ValidateDuration), } } diff --git a/x/ccv/types/shared_consumer.pb.go b/x/ccv/types/shared_consumer.pb.go index da1408373c..699f9ac52d 100644 --- a/x/ccv/types/shared_consumer.pb.go +++ b/x/ccv/types/shared_consumer.pb.go @@ -76,6 +76,8 @@ type ConsumerParams struct { // Provider-originated reward denoms. These are denoms coming from the // provider which are allowed to be used as rewards. e.g. "uatom" ProviderRewardDenoms []string `protobuf:"bytes,12,rep,name=provider_reward_denoms,json=providerRewardDenoms,proto3" json:"provider_reward_denoms,omitempty"` + // The period after which a consumer can retry sending a throttled packet. + RetryDelayPeriod time.Duration `protobuf:"bytes,13,opt,name=retry_delay_period,json=retryDelayPeriod,proto3,stdduration" json:"retry_delay_period"` } func (m *ConsumerParams) Reset() { *m = ConsumerParams{} } @@ -195,6 +197,13 @@ func (m *ConsumerParams) GetProviderRewardDenoms() []string { return nil } +func (m *ConsumerParams) GetRetryDelayPeriod() time.Duration { + if m != nil { + return m.RetryDelayPeriod + } + return 0 +} + // ConsumerGenesisState defines shared genesis information between provider and // consumer type ConsumerGenesisState struct { @@ -334,57 +343,58 @@ func init() { } var fileDescriptor_d0a8be0efc64dfbc = []byte{ - // 789 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0x41, 0x73, 0xdc, 0x34, - 0x14, 0x8e, 0xbb, 0x25, 0xdd, 0x68, 0xd3, 0xa6, 0x88, 0x50, 0x4c, 0x3a, 0xe3, 0xb8, 0x81, 0xc3, - 0x0e, 0x4c, 0x6d, 0x92, 0xf4, 0xc4, 0x8d, 0x24, 0x94, 0xd2, 0x43, 0xb2, 0x38, 0xa1, 0xcc, 0xc0, - 0x41, 0x23, 0x4b, 0x6f, 0xd7, 0x1a, 0x6c, 0xc9, 0x23, 0xc9, 0x0e, 0xfd, 0x05, 0x5c, 0x38, 0x70, - 0xe4, 0x27, 0x95, 0x5b, 0x8f, 0x9c, 0x80, 0x49, 0xfe, 0x08, 0x63, 0xd9, 0x4e, 0xbc, 0x0c, 0xa1, - 0xbd, 0xe9, 0xbd, 0xf7, 0x7d, 0x9f, 0xfd, 0x3d, 0xe9, 0x3d, 0xf4, 0x99, 0x90, 0x16, 0x34, 0xcb, - 0xa8, 0x90, 0xc4, 0x00, 0xab, 0xb4, 0xb0, 0x2f, 0x63, 0xc6, 0xea, 0xb8, 0xde, 0x8d, 0x4d, 0x46, - 0x35, 0x70, 0xc2, 0x94, 0x34, 0x55, 0x01, 0x3a, 0x2a, 0xb5, 0xb2, 0x0a, 0x6f, 0xfd, 0x07, 0x23, - 0x62, 0xac, 0x8e, 0xea, 0xdd, 0xad, 0x87, 0x16, 0x24, 0x07, 0x5d, 0x08, 0x69, 0x63, 0x9a, 0x32, - 0x11, 0xdb, 0x97, 0x25, 0x98, 0x96, 0xb8, 0x15, 0x8b, 0x94, 0xc5, 0xb9, 0x58, 0x64, 0x96, 0xe5, - 0x02, 0xa4, 0x35, 0xf1, 0x00, 0x5d, 0xef, 0x0e, 0xa2, 0x8e, 0x10, 0x2c, 0x94, 0x5a, 0xe4, 0x10, - 0xbb, 0x28, 0xad, 0xe6, 0x31, 0xaf, 0x34, 0xb5, 0x42, 0xc9, 0xae, 0xbe, 0xb9, 0x50, 0x0b, 0xe5, - 0x8e, 0x71, 0x73, 0x6a, 0xb3, 0x3b, 0xbf, 0xac, 0xa2, 0x7b, 0x87, 0xdd, 0x2f, 0xcf, 0xa8, 0xa6, - 0x85, 0xc1, 0x3e, 0xba, 0x03, 0x92, 0xa6, 0x39, 0x70, 0xdf, 0x0b, 0xbd, 0xe9, 0x38, 0xe9, 0x43, - 0x7c, 0x82, 0x3e, 0x4e, 0x73, 0xc5, 0x7e, 0x34, 0xa4, 0x04, 0x4d, 0xb8, 0x30, 0x56, 0x8b, 0xb4, - 0x6a, 0xbe, 0x41, 0xac, 0xa6, 0xd2, 0x14, 0xc2, 0x18, 0xa1, 0xa4, 0x7f, 0x2b, 0xf4, 0xa6, 0xa3, - 0xe4, 0x51, 0x8b, 0x9d, 0x81, 0x3e, 0x1a, 0x20, 0xcf, 0x06, 0x40, 0xfc, 0x1c, 0x3d, 0xba, 0x51, - 0x85, 0xb0, 0x8c, 0x4a, 0x09, 0xb9, 0x3f, 0x0a, 0xbd, 0xe9, 0x5a, 0xb2, 0xcd, 0x6f, 0x10, 0x39, - 0x6c, 0x61, 0xf8, 0x73, 0xb4, 0x55, 0x6a, 0x55, 0x0b, 0x0e, 0x9a, 0xcc, 0x01, 0x48, 0xa9, 0x54, - 0x4e, 0x28, 0xe7, 0x9a, 0x18, 0xab, 0xfd, 0xdb, 0x4e, 0xe4, 0x41, 0x8f, 0x78, 0x0a, 0x30, 0x53, - 0x2a, 0xff, 0x82, 0x73, 0x7d, 0x6a, 0x35, 0xfe, 0x06, 0x61, 0xc6, 0x6a, 0x62, 0x45, 0x01, 0xaa, - 0xb2, 0x8d, 0x3b, 0xa1, 0xb8, 0xff, 0x4e, 0xe8, 0x4d, 0x27, 0x7b, 0x1f, 0x46, 0x6d, 0x63, 0xa3, - 0xbe, 0xb1, 0xd1, 0x51, 0xd7, 0xd8, 0x83, 0xf1, 0xab, 0x3f, 0xb7, 0x57, 0x7e, 0xfb, 0x6b, 0xdb, - 0x4b, 0xee, 0x33, 0x56, 0x9f, 0xb5, 0xec, 0x99, 0x23, 0xe3, 0x1f, 0xd0, 0x07, 0xce, 0xcd, 0x1c, - 0xf4, 0xbf, 0x75, 0x57, 0xdf, 0x5e, 0xf7, 0xfd, 0x5e, 0x63, 0x59, 0xfc, 0x19, 0x0a, 0xfb, 0x77, - 0x46, 0x34, 0x2c, 0xb5, 0x70, 0xae, 0x29, 0x6b, 0x0e, 0xfe, 0x1d, 0xe7, 0x38, 0xe8, 0x71, 0xc9, - 0x12, 0xec, 0x69, 0x87, 0xc2, 0x8f, 0x11, 0xce, 0x84, 0xb1, 0x4a, 0x0b, 0x46, 0x73, 0x02, 0xd2, - 0x6a, 0x01, 0xc6, 0x1f, 0xbb, 0x0b, 0x7c, 0xf7, 0xba, 0xf2, 0x65, 0x5b, 0xc0, 0xc7, 0xe8, 0x7e, - 0x25, 0x53, 0x25, 0xb9, 0x90, 0x8b, 0xde, 0xce, 0xda, 0xdb, 0xdb, 0xd9, 0xb8, 0x22, 0x77, 0x46, - 0xf6, 0xd1, 0x03, 0xa3, 0xe6, 0x96, 0xa8, 0xd2, 0x92, 0xa6, 0x43, 0x36, 0xd3, 0x60, 0x32, 0x95, - 0x73, 0x1f, 0xb9, 0xdf, 0x7f, 0xaf, 0xa9, 0x9e, 0x94, 0xf6, 0xa4, 0xb2, 0x67, 0x7d, 0x09, 0x7f, - 0x84, 0xee, 0x6a, 0x38, 0xa7, 0x9a, 0x13, 0x0e, 0x52, 0x15, 0xc6, 0x9f, 0x84, 0xa3, 0xe9, 0x5a, - 0xb2, 0xde, 0x26, 0x8f, 0x5c, 0x0e, 0x3f, 0x41, 0x57, 0x97, 0x4d, 0x96, 0xd1, 0xeb, 0x0e, 0xbd, - 0xd9, 0x57, 0x93, 0x01, 0x6b, 0xe7, 0x77, 0x0f, 0x6d, 0xf6, 0xe3, 0xf0, 0x15, 0x48, 0x30, 0xc2, - 0x9c, 0x5a, 0x6a, 0x01, 0x3f, 0x43, 0xab, 0xa5, 0x1b, 0x0f, 0x37, 0x13, 0x93, 0xbd, 0x4f, 0xa2, - 0x9b, 0x07, 0x3b, 0x5a, 0x1e, 0xa8, 0x83, 0xdb, 0x8d, 0xff, 0xa4, 0xe3, 0xe3, 0xe7, 0x68, 0xdc, - 0x7f, 0xda, 0x0d, 0xca, 0x64, 0x6f, 0xfa, 0x7f, 0x5a, 0xb3, 0x0e, 0xfb, 0xb5, 0x9c, 0xab, 0x4e, - 0xe9, 0x8a, 0x8f, 0x1f, 0xa2, 0x35, 0x09, 0xe7, 0xc4, 0x31, 0xdd, 0x9c, 0x8c, 0x93, 0xb1, 0x84, - 0xf3, 0xc3, 0x26, 0xde, 0xf9, 0xf9, 0x16, 0x5a, 0x1f, 0xb2, 0xf1, 0x31, 0x5a, 0x6f, 0x77, 0x09, - 0x31, 0x8d, 0xa7, 0xce, 0xc9, 0xa7, 0x91, 0x48, 0x59, 0x34, 0xdc, 0x34, 0xd1, 0x60, 0xb7, 0x34, - 0x6e, 0x5c, 0xd6, 0xb5, 0x21, 0x99, 0xb0, 0xeb, 0x00, 0x7f, 0x87, 0x36, 0x9a, 0xd7, 0x05, 0xd2, - 0x54, 0xa6, 0x93, 0x6c, 0x0d, 0x45, 0x6f, 0x94, 0xec, 0x69, 0xad, 0xea, 0x3d, 0xb6, 0x14, 0xe3, - 0x63, 0xb4, 0x21, 0xa4, 0xb0, 0x82, 0xe6, 0xa4, 0xa6, 0x39, 0x31, 0x60, 0xfd, 0x51, 0x38, 0x9a, - 0x4e, 0xf6, 0xc2, 0xa1, 0x4e, 0xb3, 0x32, 0xa3, 0x17, 0x34, 0x17, 0x9c, 0x5a, 0xa5, 0xbf, 0x2d, - 0x39, 0xb5, 0xd0, 0x75, 0xe8, 0x6e, 0x47, 0x7f, 0x41, 0xf3, 0x53, 0xb0, 0x07, 0xc7, 0xaf, 0x2e, - 0x02, 0xef, 0xf5, 0x45, 0xe0, 0xfd, 0x7d, 0x11, 0x78, 0xbf, 0x5e, 0x06, 0x2b, 0xaf, 0x2f, 0x83, - 0x95, 0x3f, 0x2e, 0x83, 0x95, 0xef, 0x9f, 0x2c, 0x84, 0xcd, 0xaa, 0x34, 0x62, 0xaa, 0x88, 0x99, - 0x32, 0x85, 0x32, 0xf1, 0xf5, 0x5d, 0x3c, 0xbe, 0x5a, 0xf1, 0xf5, 0x7e, 0xfc, 0x93, 0xdb, 0xf3, - 0x6e, 0x43, 0xa7, 0xab, 0xee, 0x8d, 0xef, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x0b, 0x44, - 0x31, 0x0f, 0x06, 0x00, 0x00, + // 812 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x41, 0x73, 0xdc, 0x34, + 0x14, 0x8e, 0xbb, 0x25, 0xdd, 0x68, 0x93, 0xa6, 0x88, 0x50, 0x4c, 0x3a, 0xb3, 0x71, 0x03, 0x87, + 0x1d, 0x98, 0xda, 0x24, 0xe9, 0x89, 0x1b, 0x49, 0x28, 0xa5, 0x87, 0x64, 0xeb, 0x84, 0x32, 0x03, + 0x07, 0x8d, 0x2c, 0xbd, 0x5d, 0x6b, 0xb0, 0x25, 0x8f, 0x24, 0x3b, 0xe4, 0x17, 0x70, 0xe5, 0xc8, + 0x4f, 0x2a, 0xb7, 0x1e, 0x39, 0x51, 0x26, 0xf9, 0x23, 0x8c, 0x65, 0x3b, 0xf1, 0x32, 0x04, 0xd2, + 0x9b, 0x9e, 0xde, 0xf7, 0x7d, 0xf6, 0xf7, 0xa4, 0xf7, 0x84, 0xbe, 0x10, 0xd2, 0x82, 0x66, 0x29, + 0x15, 0x92, 0x18, 0x60, 0xa5, 0x16, 0xf6, 0x3c, 0x62, 0xac, 0x8a, 0xaa, 0x9d, 0xc8, 0xa4, 0x54, + 0x03, 0x27, 0x4c, 0x49, 0x53, 0xe6, 0xa0, 0xc3, 0x42, 0x2b, 0xab, 0xf0, 0xe6, 0xbf, 0x30, 0x42, + 0xc6, 0xaa, 0xb0, 0xda, 0xd9, 0x7c, 0x64, 0x41, 0x72, 0xd0, 0xb9, 0x90, 0x36, 0xa2, 0x09, 0x13, + 0x91, 0x3d, 0x2f, 0xc0, 0x34, 0xc4, 0xcd, 0x48, 0x24, 0x2c, 0xca, 0xc4, 0x3c, 0xb5, 0x2c, 0x13, + 0x20, 0xad, 0x89, 0x7a, 0xe8, 0x6a, 0xa7, 0x17, 0xb5, 0x84, 0xf1, 0x5c, 0xa9, 0x79, 0x06, 0x91, + 0x8b, 0x92, 0x72, 0x16, 0xf1, 0x52, 0x53, 0x2b, 0x94, 0x6c, 0xf3, 0x1b, 0x73, 0x35, 0x57, 0x6e, + 0x19, 0xd5, 0xab, 0x66, 0x77, 0xfb, 0xed, 0x32, 0xba, 0x7f, 0xd0, 0xfe, 0xf2, 0x94, 0x6a, 0x9a, + 0x1b, 0xec, 0xa3, 0x7b, 0x20, 0x69, 0x92, 0x01, 0xf7, 0xbd, 0xc0, 0x9b, 0x0c, 0xe3, 0x2e, 0xc4, + 0xc7, 0xe8, 0xd3, 0x24, 0x53, 0xec, 0x27, 0x43, 0x0a, 0xd0, 0x84, 0x0b, 0x63, 0xb5, 0x48, 0xca, + 0xfa, 0x1b, 0xc4, 0x6a, 0x2a, 0x4d, 0x2e, 0x8c, 0x11, 0x4a, 0xfa, 0x77, 0x02, 0x6f, 0x32, 0x88, + 0x1f, 0x37, 0xd8, 0x29, 0xe8, 0xc3, 0x1e, 0xf2, 0xb4, 0x07, 0xc4, 0x2f, 0xd0, 0xe3, 0x1b, 0x55, + 0x08, 0x4b, 0xa9, 0x94, 0x90, 0xf9, 0x83, 0xc0, 0x9b, 0xac, 0xc4, 0x5b, 0xfc, 0x06, 0x91, 0x83, + 0x06, 0x86, 0xbf, 0x44, 0x9b, 0x85, 0x56, 0x95, 0xe0, 0xa0, 0xc9, 0x0c, 0x80, 0x14, 0x4a, 0x65, + 0x84, 0x72, 0xae, 0x89, 0xb1, 0xda, 0xbf, 0xeb, 0x44, 0x1e, 0x76, 0x88, 0x67, 0x00, 0x53, 0xa5, + 0xb2, 0xaf, 0x38, 0xd7, 0x27, 0x56, 0xe3, 0x97, 0x08, 0x33, 0x56, 0x11, 0x2b, 0x72, 0x50, 0xa5, + 0xad, 0xdd, 0x09, 0xc5, 0xfd, 0xf7, 0x02, 0x6f, 0x32, 0xda, 0xfd, 0x38, 0x6c, 0x0a, 0x1b, 0x76, + 0x85, 0x0d, 0x0f, 0xdb, 0xc2, 0xee, 0x0f, 0x5f, 0xff, 0xb9, 0xb5, 0xf4, 0xdb, 0xdb, 0x2d, 0x2f, + 0x7e, 0xc0, 0x58, 0x75, 0xda, 0xb0, 0xa7, 0x8e, 0x8c, 0x7f, 0x44, 0x1f, 0x39, 0x37, 0x33, 0xd0, + 0xff, 0xd4, 0x5d, 0xbe, 0xbd, 0xee, 0x87, 0x9d, 0xc6, 0xa2, 0xf8, 0x73, 0x14, 0x74, 0xf7, 0x8c, + 0x68, 0x58, 0x28, 0xe1, 0x4c, 0x53, 0x56, 0x2f, 0xfc, 0x7b, 0xce, 0xf1, 0xb8, 0xc3, 0xc5, 0x0b, + 0xb0, 0x67, 0x2d, 0x0a, 0x3f, 0x41, 0x38, 0x15, 0xc6, 0x2a, 0x2d, 0x18, 0xcd, 0x08, 0x48, 0xab, + 0x05, 0x18, 0x7f, 0xe8, 0x0e, 0xf0, 0xfd, 0xeb, 0xcc, 0xd7, 0x4d, 0x02, 0x1f, 0xa1, 0x07, 0xa5, + 0x4c, 0x94, 0xe4, 0x42, 0xce, 0x3b, 0x3b, 0x2b, 0xb7, 0xb7, 0xb3, 0x7e, 0x45, 0x6e, 0x8d, 0xec, + 0xa1, 0x87, 0x46, 0xcd, 0x2c, 0x51, 0x85, 0x25, 0x75, 0x85, 0x6c, 0xaa, 0xc1, 0xa4, 0x2a, 0xe3, + 0x3e, 0x72, 0xbf, 0xff, 0x41, 0x9d, 0x3d, 0x2e, 0xec, 0x71, 0x69, 0x4f, 0xbb, 0x14, 0xfe, 0x04, + 0xad, 0x69, 0x38, 0xa3, 0x9a, 0x13, 0x0e, 0x52, 0xe5, 0xc6, 0x1f, 0x05, 0x83, 0xc9, 0x4a, 0xbc, + 0xda, 0x6c, 0x1e, 0xba, 0x3d, 0xfc, 0x14, 0x5d, 0x1d, 0x36, 0x59, 0x44, 0xaf, 0x3a, 0xf4, 0x46, + 0x97, 0x8d, 0xfb, 0xac, 0x97, 0x08, 0x6b, 0xb0, 0xfa, 0x9c, 0x70, 0xc8, 0xe8, 0x79, 0xe7, 0x70, + 0xed, 0x1d, 0x2e, 0x82, 0xa3, 0x1f, 0xd6, 0xec, 0xc6, 0xe2, 0xf6, 0xef, 0x1e, 0xda, 0xe8, 0x3a, + 0xec, 0x1b, 0x90, 0x60, 0x84, 0x39, 0xb1, 0xd4, 0x02, 0x7e, 0x8e, 0x96, 0x0b, 0xd7, 0x71, 0xae, + 0xcd, 0x46, 0xbb, 0x9f, 0x85, 0x37, 0xcf, 0x8a, 0x70, 0xb1, 0x47, 0xf7, 0xef, 0xd6, 0x1f, 0x8c, + 0x5b, 0x3e, 0x7e, 0x81, 0x86, 0x9d, 0x1b, 0xd7, 0x7b, 0xa3, 0xdd, 0xc9, 0x7f, 0x69, 0x4d, 0x5b, + 0xec, 0xb7, 0x72, 0xa6, 0x5a, 0xa5, 0x2b, 0x3e, 0x7e, 0x84, 0x56, 0x24, 0x9c, 0x11, 0xc7, 0x74, + 0xad, 0x37, 0x8c, 0x87, 0x12, 0xce, 0x0e, 0xea, 0x78, 0xfb, 0x97, 0x3b, 0x68, 0xb5, 0xcf, 0xc6, + 0x47, 0x68, 0xb5, 0x19, 0x4f, 0xc4, 0xd4, 0x9e, 0x5a, 0x27, 0x9f, 0x87, 0x22, 0x61, 0x61, 0x7f, + 0x78, 0x85, 0xbd, 0x71, 0x55, 0xbb, 0x71, 0xbb, 0xae, 0x0c, 0xf1, 0x88, 0x5d, 0x07, 0xf8, 0x7b, + 0xb4, 0x5e, 0x5f, 0x58, 0x90, 0xa6, 0x34, 0xad, 0x64, 0x63, 0x28, 0xfc, 0x5f, 0xc9, 0x8e, 0xd6, + 0xa8, 0xde, 0x67, 0x0b, 0x31, 0x3e, 0x42, 0xeb, 0x42, 0x0a, 0x2b, 0x68, 0x46, 0x2a, 0x9a, 0x11, + 0x03, 0xd6, 0x1f, 0x04, 0x83, 0xc9, 0x68, 0x37, 0xe8, 0xeb, 0xd4, 0x53, 0x38, 0x7c, 0x45, 0x33, + 0xc1, 0xa9, 0x55, 0xfa, 0xbb, 0x82, 0x53, 0x0b, 0x6d, 0x85, 0xd6, 0x5a, 0xfa, 0x2b, 0x9a, 0x9d, + 0x80, 0xdd, 0x3f, 0x7a, 0x7d, 0x31, 0xf6, 0xde, 0x5c, 0x8c, 0xbd, 0xbf, 0x2e, 0xc6, 0xde, 0xaf, + 0x97, 0xe3, 0xa5, 0x37, 0x97, 0xe3, 0xa5, 0x3f, 0x2e, 0xc7, 0x4b, 0x3f, 0x3c, 0x9d, 0x0b, 0x9b, + 0x96, 0x49, 0xc8, 0x54, 0x1e, 0x31, 0x65, 0x72, 0x65, 0xa2, 0xeb, 0xb3, 0x78, 0x72, 0xf5, 0x6a, + 0x54, 0x7b, 0xd1, 0xcf, 0xee, 0xe9, 0x70, 0x43, 0x3f, 0x59, 0x76, 0x97, 0x6a, 0xef, 0xef, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x5c, 0xb4, 0xca, 0xd3, 0x62, 0x06, 0x00, 0x00, } func (m *ConsumerParams) Marshal() (dAtA []byte, err error) { @@ -407,6 +417,14 @@ func (m *ConsumerParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n1, err1 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.RetryDelayPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.RetryDelayPeriod):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintSharedConsumer(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x6a if len(m.ProviderRewardDenoms) > 0 { for iNdEx := len(m.ProviderRewardDenoms) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ProviderRewardDenoms[iNdEx]) @@ -432,12 +450,12 @@ func (m *ConsumerParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x52 } - n1, err1 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingPeriod):]) - if err1 != nil { - return 0, err1 + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingPeriod):]) + if err2 != nil { + return 0, err2 } - i -= n1 - i = encodeVarintSharedConsumer(dAtA, i, uint64(n1)) + i -= n2 + i = encodeVarintSharedConsumer(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x4a if m.HistoricalEntries != 0 { @@ -452,21 +470,21 @@ func (m *ConsumerParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.TransferTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TransferTimeoutPeriod):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintSharedConsumer(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x32 - n3, err3 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.TransferTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TransferTimeoutPeriod):]) if err3 != nil { return 0, err3 } i -= n3 i = encodeVarintSharedConsumer(dAtA, i, uint64(n3)) i-- + dAtA[i] = 0x32 + n4, err4 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.CcvTimeoutPeriod, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.CcvTimeoutPeriod):]) + if err4 != nil { + return 0, err4 + } + i -= n4 + i = encodeVarintSharedConsumer(dAtA, i, uint64(n4)) + i-- dAtA[i] = 0x2a if len(m.ProviderFeePoolAddrStr) > 0 { i -= len(m.ProviderFeePoolAddrStr) @@ -674,6 +692,8 @@ func (m *ConsumerParams) Size() (n int) { n += 1 + l + sovSharedConsumer(uint64(l)) } } + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.RetryDelayPeriod) + n += 1 + l + sovSharedConsumer(uint64(l)) return n } @@ -1100,6 +1120,39 @@ func (m *ConsumerParams) Unmarshal(dAtA []byte) error { } m.ProviderRewardDenoms = append(m.ProviderRewardDenoms, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RetryDelayPeriod", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSharedConsumer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSharedConsumer + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSharedConsumer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.RetryDelayPeriod, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSharedConsumer(dAtA[iNdEx:])